diff --git a/.browserslistrc b/.browserslistrc index 3e5809a..c529e38 100644 --- a/.browserslistrc +++ b/.browserslistrc @@ -1,11 +1,12 @@ # This file is used by the build system to adjust CSS and JS output to support the specified browsers below. # For additional information regarding the format and rule options, please see: # https://github.com/browserslist/browserslist#queries + # You can see what browsers were selected by your queries by running: # npx browserslist last 1 Chrome version last 1 Firefox version -last 1 Edge major versions +last 2 Edge major versions last 2 Safari major versions last 2 iOS major versions diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..0792692 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 695c05d..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "root": true, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": "latest", - "sourceType": "module", - "ecmaFeatures": { - "jsx": true - } - }, - "settings": { - "react": { - "pragma": "React", - "version": "18.0.0" - } - }, - "env": { - "browser": true, - "es2021": true - }, - "extends": [ - "plugin:react/recommended", - "plugin:react/jsx-runtime", - "plugin:react-hooks/recommended" - ], - "plugins": [ - "@typescript-eslint", - "react" - ], - "rules": { - "linebreak-style": [ - "off" - ], - "quotes": [ - "error", - "single" - ], - "@typescript-eslint/indent": [ - "error", - 4, - { - "SwitchCase": 1 - } - ], - "array-bracket-spacing": [ - "error", - "always" - ], - "brace-style": [ - "error", - "allman" - ], - "template-curly-spacing": [ - "error", - "always" - ], - "no-multi-spaces": [ - "error" - ], - "@typescript-eslint/object-curly-spacing": [ - "error", - "always", - { - "arraysInObjects": true, - "objectsInObjects": false - } - ], - "@typescript-eslint/ban-types": [ - "error", - { - "types": { - "String": true, - "Boolean": true, - "Number": true, - "Symbol": true, - "{}": false, - "Object": false, - "object": false, - "Function": false - }, - "extendDefaults": true - } - ], - "no-switch-case-fall-through": [ - "off" - ], - "jsx-quotes": [ - "error" - ], - "react/prop-types": [ - "off" - ], - "react/jsx-curly-spacing": [ - "error", - { - "when": "always", - "children": true - } - ], - "react/jsx-equals-spacing": [ - "error" - ], - "react/jsx-newline": [ - "error", - { - "prevent": true - } - ] - } -} diff --git a/.gitignore b/.gitignore index 154341f..1413af9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,20 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output /dist /tmp /out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies /node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors /.idea .project .classpath @@ -9,23 +22,30 @@ *.launch .settings/ *.sublime-workspace + +# IDE - VSCode .vscode/* !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json .history/* + +# misc /.sass-cache /connect.lock /coverage -*.log +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings .git + +# System Files .DS_Store Thumbs.db -# Nitro -/build *.zip -.env -public/renderer-config* -public/ui-config* +*.as +*.bin diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md index 7b6ffc1..33c4b6b 100644 --- a/README.md +++ b/README.md @@ -1,50 +1,17 @@ -# Nitro React v2.1 +# Nitro Renderer -## Prerequisites - -- [Git](https://git-scm.com/) -- [NodeJS](https://nodejs.org/) >= 18 - - If using NodeJS < 18 remove `--openssl-legacy-provider` from the package.json scripts -- [Yarn](https://yarnpkg.com/) `npm i yarn -g` +nitro-renderer is a Javascript library for rendering Nitro in the browser using PixiJS ## Installation -- First you should open terminal and navigate to the folder where you want to clone Nitro -- Clone Nitro - - `git clone https://git.krews.org/nitro/nitro-react.git` -- Install the dependencies - - `yarn install` - - This may take some time, please be patient -- Rename a few files - - Rename `public/renderer-config.json.example` to `public/renderer-config.json` - - Rename `public/ui-config.json.example` to `public/ui-config.json` -- Set your links - - Open `public/renderer-config.json` - - Update `socket.url, asset.url, image.library.url, & hof.furni.url` - - Open `public/ui-config.json` - - Update `camera.url, thumbnails.url, url.prefix, habbopages.url` - - You can override any variable by passing it to `NitroConfig` in the index.html - -## Usage - -- To use Nitro you need `.nitro` assets generated, see [nitro-converter](https://git.krews.org/nitro/nitro-converter) for instructions -- See [Morningstar Websockets](https://git.krews.org/nitro/ms-websockets) for instructions on configuring websockets on your server - -### Development - -Run Nitro in development mode when you are editing the files, this way you can see the changes in your browser instantly +npm ``` -yarn start +npm install @nitrots/nitro-renderer ``` -### Production - -To build a production version of Nitro just run the following command +yarn ``` -yarn build:prod +yarn add @nitrots/nitro-renderer ``` - -- A `dist` folder will be generated, these are the files that must be uploaded to your webserver -- Consult your CMS documentation for compatibility with Nitro and how to add the production files diff --git a/index.html b/index.html deleted file mode 100644 index 18b1a79..0000000 --- a/index.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - Nitro - - - -
- - - - diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..8420b10 --- /dev/null +++ b/index.ts @@ -0,0 +1 @@ +export * from './src'; diff --git a/package.json b/package.json index 4910ee8..6a0b294 100644 --- a/package.json +++ b/package.json @@ -1,39 +1,45 @@ { - "name": "nitro-react", - "version": "2.2", - "homepage": ".", + "name": "@nitrots/nitro-renderer", + "description": "Javascript library for rendering Nitro in the browser using PixiJS", + "version": "2.0.0", "private": true, - "scripts": { - "start": "vite", - "build": "vite build", - "build:prod": "npx browserslist@latest --update-db && yarn build", - "eslint": "eslint src --ext .ts,.tsx" + "type": "module", + "workspaces": [ + "packages/*" + ], + "publishConfig": { + "access": "public" }, + "repository": { + "type": "git", + "url": "https://github.com/billsonnn/nitro-renderer.git" + }, + "license": "GPL-3.0", + "bugs": { + "url": "https://github.com/billsonnn/nitro-renderer/issues" + }, + "homepage": "https://github.com/billsonnn/nitro-renderer", + "scripts": { + "build": "vite build", + "compile": "tsc --project ./tsconfig.json --noEmit false", + "eslint": "eslint ./src --fix" + }, + "main": "./index", "dependencies": { - "@tanstack/react-virtual": "3.2.0", - "react": "^18.2.0", - "react-bootstrap": "^2.2.2", - "react-dom": "^18.2.0", - "react-icons": "^5.0.1", - "react-slider": "^2.0.6", - "react-youtube": "^7.13.1", - "use-between": "^1.3.5" + "howler": "^2.2.4", + "pako": "^2.1.0", + "pixi-filters": "^6.0.0", + "pixi.js": "~8.0.4" }, "devDependencies": { - "@types/node": "^20.11.30", - "@types/react": "^18.2.67", - "@types/react-dom": "^18.2.22", - "@types/react-slider": "^1.3.6", - "@typescript-eslint/eslint-plugin": "^7.3.1", - "@typescript-eslint/parser": "^7.3.1", - "@vitejs/plugin-react": "^4.2.1", + "@rollup/plugin-typescript": "^11.1.6", + "@types/howler": "^2.2.11", + "@types/pako": "^2.0.3", + "@typescript-eslint/eslint-plugin": "^7.1.1", + "@typescript-eslint/parser": "^7.1.1", "eslint": "^8.57.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsx-a11y": "^6.8.0", - "eslint-plugin-react": "^7.34.1", - "eslint-plugin-react-hooks": "^4.6.0", - "sass": "^1.72.0", - "typescript": "^5.4.2", - "vite": "^5.1.6" + "tslib": "^2.3.1", + "typescript": "~5.4.2", + "vite": "^5.1.3" } } diff --git a/packages/api/.gitignore b/packages/api/.gitignore new file mode 100644 index 0000000..1413af9 --- /dev/null +++ b/packages/api/.gitignore @@ -0,0 +1,51 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings +.git + +# System Files +.DS_Store +Thumbs.db + +*.zip +*.as +*.bin diff --git a/packages/api/index.ts b/packages/api/index.ts new file mode 100644 index 0000000..8420b10 --- /dev/null +++ b/packages/api/index.ts @@ -0,0 +1 @@ +export * from './src'; diff --git a/packages/api/package.json b/packages/api/package.json new file mode 100644 index 0000000..6539872 --- /dev/null +++ b/packages/api/package.json @@ -0,0 +1,22 @@ +{ + "name": "@nitrots/api", + "description": "Nitro api module", + "version": "1.0.0", + "type": "module", + "publishConfig": { + "access": "public" + }, + "license": "GPL-3.0", + "scripts": { + "build": "vite build", + "compile": "tsc --project ./tsconfig.json --noEmit false", + "eslint": "eslint ./src --fix" + }, + "main": "./index", + "dependencies": { + "pixi.js": "^8.0.4" + }, + "devDependencies": { + "typescript": "~5.4.2" + } +} diff --git a/packages/api/src/asset/IAsset.ts b/packages/api/src/asset/IAsset.ts new file mode 100644 index 0000000..f4e4fb4 --- /dev/null +++ b/packages/api/src/asset/IAsset.ts @@ -0,0 +1,9 @@ +export interface IAsset +{ + source?: string; + x?: number; + y?: number; + flipH?: boolean; + flipV?: boolean; + usesPalette?: boolean; +} diff --git a/packages/api/src/asset/IAssetAlias.ts b/packages/api/src/asset/IAssetAlias.ts new file mode 100644 index 0000000..5c14027 --- /dev/null +++ b/packages/api/src/asset/IAssetAlias.ts @@ -0,0 +1,6 @@ +export interface IAssetAlias +{ + link?: string; + flipH?: boolean; + flipV?: boolean; +} diff --git a/packages/api/src/asset/IAssetData.ts b/packages/api/src/asset/IAssetData.ts new file mode 100644 index 0000000..f12820f --- /dev/null +++ b/packages/api/src/asset/IAssetData.ts @@ -0,0 +1,23 @@ +import { IAssetAnimation } from './animation'; +import { IAsset } from './IAsset'; +import { IAssetAlias } from './IAssetAlias'; +import { IAssetPalette } from './IAssetPalette'; +import { IAssetLogicData } from './logic'; +import { IAssetRoomVisualizationData } from './room-visualization'; +import { ISpritesheetData } from './spritesheet'; +import { IAssetVisualizationData } from './visualization'; + +export interface IAssetData { + type?: string; + name?: string; + visualizationType?: string; + logicType?: string; + spritesheet?: ISpritesheetData; + logic?: IAssetLogicData; + assets?: { [index: string]: IAsset }; + aliases?: { [index: string]: IAssetAlias }; + animations?: { [index: string]: IAssetAnimation }; + palettes?: { [index: string]: IAssetPalette }; + visualizations?: IAssetVisualizationData[]; + roomVisualization?: IAssetRoomVisualizationData; +} diff --git a/packages/api/src/asset/IAssetManager.ts b/packages/api/src/asset/IAssetManager.ts new file mode 100644 index 0000000..6457e28 --- /dev/null +++ b/packages/api/src/asset/IAssetManager.ts @@ -0,0 +1,18 @@ + +import { Spritesheet, Texture } from 'pixi.js'; +import { IAssetData } from './IAssetData'; +import { IGraphicAsset } from './IGraphicAsset'; +import { IGraphicAssetCollection } from './IGraphicAssetCollection'; + +export interface IAssetManager +{ + getTexture(name: string): Texture; + setTexture(name: string, texture: Texture): void; + addAssetToCollection(collectionName: string, assetName: string, texture: Texture, override?: boolean): boolean; + getAsset(name: string): IGraphicAsset; + getCollection(name: string): IGraphicAssetCollection; + createCollection(data: IAssetData, spritesheet: Spritesheet): IGraphicAssetCollection; + downloadAssets(urls: string[]): Promise; + downloadAsset(url: string): Promise; + readonly collections: Map; +} diff --git a/packages/api/src/asset/IAssetPalette.ts b/packages/api/src/asset/IAssetPalette.ts new file mode 100644 index 0000000..9b0384b --- /dev/null +++ b/packages/api/src/asset/IAssetPalette.ts @@ -0,0 +1,12 @@ +export interface IAssetPalette +{ + id?: number; + source?: string; + master?: boolean; + tags?: string[]; + breed?: number; + colorTag?: number; + color1?: string; + color2?: string; + rgb?: [ number, number, number ][]; +} diff --git a/packages/api/src/asset/IGraphicAsset.ts b/packages/api/src/asset/IGraphicAsset.ts new file mode 100644 index 0000000..620a115 --- /dev/null +++ b/packages/api/src/asset/IGraphicAsset.ts @@ -0,0 +1,19 @@ +import { Rectangle, Texture } from 'pixi.js'; + +export interface IGraphicAsset +{ + recycle(): void; + readonly name: string; + readonly source: string; + readonly texture: Texture; + readonly usesPalette: boolean; + readonly x: number; + readonly y: number; + readonly width: number; + readonly height: number; + readonly offsetX: number; + readonly offsetY: number; + readonly flipH: boolean; + readonly flipV: boolean; + readonly rectangle: Rectangle; +} diff --git a/packages/api/src/asset/IGraphicAssetCollection.ts b/packages/api/src/asset/IGraphicAssetCollection.ts new file mode 100644 index 0000000..40a513b --- /dev/null +++ b/packages/api/src/asset/IGraphicAssetCollection.ts @@ -0,0 +1,24 @@ +import { Texture, TextureSource } from 'pixi.js'; +import { IAssetData } from './IAssetData'; +import { IGraphicAsset } from './IGraphicAsset'; +import { IGraphicAssetPalette } from './IGraphicAssetPalette'; + +export interface IGraphicAssetCollection +{ + dispose(): void; + addReference(): void; + removeReference(): void; + define(data: IAssetData): void; + getAsset(name: string): IGraphicAsset; + getAssetWithPalette(name: string, paletteName: string): IGraphicAsset; + getTexture(name: string): Texture; + getPaletteNames(): string[]; + getPaletteColors(paletteName: string): number[]; + getPalette(name: string): IGraphicAssetPalette; + addAsset(name: string, texture: Texture, override: boolean, x?: number, y?: number, flipH?: boolean, flipV?: boolean): boolean; + disposeAsset(name: string): void; + referenceCount: number; + name: string; + textureSource: TextureSource; + data: IAssetData; +} diff --git a/packages/api/src/asset/IGraphicAssetPalette.ts b/packages/api/src/asset/IGraphicAssetPalette.ts new file mode 100644 index 0000000..cf4a8f5 --- /dev/null +++ b/packages/api/src/asset/IGraphicAssetPalette.ts @@ -0,0 +1,8 @@ +import { Texture } from 'pixi.js'; + +export interface IGraphicAssetPalette +{ + applyPalette(texture: Texture): Texture; + primaryColor: number; + secondaryColor: number; +} diff --git a/packages/api/src/asset/animation/IAssetAnimation.ts b/packages/api/src/asset/animation/IAssetAnimation.ts new file mode 100644 index 0000000..b35e0eb --- /dev/null +++ b/packages/api/src/asset/animation/IAssetAnimation.ts @@ -0,0 +1,23 @@ +import { IAssetAnimationAdd } from './IAssetAnimationAdd'; +import { IAssetAnimationAvatar } from './IAssetAnimationAvatar'; +import { IAssetAnimationDirection } from './IAssetAnimationDirection'; +import { IAssetAnimationFrame } from './IAssetAnimationFrame'; +import { IAssetAnimationOverride } from './IAssetAnimationOverride'; +import { IAssetAnimationRemove } from './IAssetAnimationRemove'; +import { IAssetAnimationShadow } from './IAssetAnimationShadow'; +import { IAssetAnimationSprite } from './IAssetAnimationSprite'; + +export interface IAssetAnimation +{ + name?: string; + desc?: string; + resetOnToggle?: boolean; + directions?: IAssetAnimationDirection[]; + shadows?: IAssetAnimationShadow[]; + adds?: IAssetAnimationAdd[]; + removes?: IAssetAnimationRemove[]; + sprites?: IAssetAnimationSprite[]; + frames?: IAssetAnimationFrame[]; + avatars?: IAssetAnimationAvatar[]; + overrides?: IAssetAnimationOverride[]; +} diff --git a/packages/api/src/asset/animation/IAssetAnimationAdd.ts b/packages/api/src/asset/animation/IAssetAnimationAdd.ts new file mode 100644 index 0000000..3da37c6 --- /dev/null +++ b/packages/api/src/asset/animation/IAssetAnimationAdd.ts @@ -0,0 +1,8 @@ +export interface IAssetAnimationAdd +{ + id?: string; + align?: string; + blend?: string; + ink?: number; + base?: string; +} diff --git a/packages/api/src/asset/animation/IAssetAnimationAvatar.ts b/packages/api/src/asset/animation/IAssetAnimationAvatar.ts new file mode 100644 index 0000000..dcd030e --- /dev/null +++ b/packages/api/src/asset/animation/IAssetAnimationAvatar.ts @@ -0,0 +1,6 @@ +export interface IAssetAnimationAvatar +{ + ink?: number; + foreground?: string; + background?: string; +} diff --git a/packages/api/src/asset/animation/IAssetAnimationDirection.ts b/packages/api/src/asset/animation/IAssetAnimationDirection.ts new file mode 100644 index 0000000..0c18eae --- /dev/null +++ b/packages/api/src/asset/animation/IAssetAnimationDirection.ts @@ -0,0 +1,4 @@ +export interface IAssetAnimationDirection +{ + offset?: number; +} diff --git a/packages/api/src/asset/animation/IAssetAnimationFrame.ts b/packages/api/src/asset/animation/IAssetAnimationFrame.ts new file mode 100644 index 0000000..b8b88a0 --- /dev/null +++ b/packages/api/src/asset/animation/IAssetAnimationFrame.ts @@ -0,0 +1,8 @@ +import { IAssetAnimationFramePart } from './IAssetAnimationFramePart'; + +export interface IAssetAnimationFrame +{ + repeats?: number; + fxs?: IAssetAnimationFramePart[]; + bodyparts?: IAssetAnimationFramePart[]; +} diff --git a/packages/api/src/asset/animation/IAssetAnimationFramePart.ts b/packages/api/src/asset/animation/IAssetAnimationFramePart.ts new file mode 100644 index 0000000..ac8c093 --- /dev/null +++ b/packages/api/src/asset/animation/IAssetAnimationFramePart.ts @@ -0,0 +1,14 @@ +import { IAssetAnimationFramePartItem } from './IAssetAnimationFramePartItem'; + +export interface IAssetAnimationFramePart +{ + id?: string; + frame?: number; + base?: string; + action?: string; + dx?: number; + dy?: number; + dz?: number; + dd?: number; + items?: IAssetAnimationFramePartItem[]; +} diff --git a/packages/api/src/asset/animation/IAssetAnimationFramePartItem.ts b/packages/api/src/asset/animation/IAssetAnimationFramePartItem.ts new file mode 100644 index 0000000..45a7642 --- /dev/null +++ b/packages/api/src/asset/animation/IAssetAnimationFramePartItem.ts @@ -0,0 +1,5 @@ +export interface IAssetAnimationFramePartItem +{ + id?: string; + base?: string; +} diff --git a/packages/api/src/asset/animation/IAssetAnimationOverride.ts b/packages/api/src/asset/animation/IAssetAnimationOverride.ts new file mode 100644 index 0000000..3d56833 --- /dev/null +++ b/packages/api/src/asset/animation/IAssetAnimationOverride.ts @@ -0,0 +1,8 @@ +import { IAssetAnimationFrame } from './IAssetAnimationFrame'; + +export interface IAssetAnimationOverride +{ + name?: string; + override?: string; + frames?: IAssetAnimationFrame[]; +} diff --git a/packages/api/src/asset/animation/IAssetAnimationRemove.ts b/packages/api/src/asset/animation/IAssetAnimationRemove.ts new file mode 100644 index 0000000..ac65fb5 --- /dev/null +++ b/packages/api/src/asset/animation/IAssetAnimationRemove.ts @@ -0,0 +1,4 @@ +export interface IAssetAnimationRemove +{ + id?: string; +} diff --git a/packages/api/src/asset/animation/IAssetAnimationShadow.ts b/packages/api/src/asset/animation/IAssetAnimationShadow.ts new file mode 100644 index 0000000..dfe22a8 --- /dev/null +++ b/packages/api/src/asset/animation/IAssetAnimationShadow.ts @@ -0,0 +1,4 @@ +export interface IAssetAnimationShadow +{ + id?: string; +} diff --git a/packages/api/src/asset/animation/IAssetAnimationSprite.ts b/packages/api/src/asset/animation/IAssetAnimationSprite.ts new file mode 100644 index 0000000..afc7b05 --- /dev/null +++ b/packages/api/src/asset/animation/IAssetAnimationSprite.ts @@ -0,0 +1,11 @@ +import { IAssetAnimationSpriteDirection } from './IAssetAnimationSpriteDirection'; + +export interface IAssetAnimationSprite +{ + id?: string; + member?: string; + directions?: number; + staticY?: number; + ink?: number; + directionList?: IAssetAnimationSpriteDirection[]; +} diff --git a/packages/api/src/asset/animation/IAssetAnimationSpriteDirection.ts b/packages/api/src/asset/animation/IAssetAnimationSpriteDirection.ts new file mode 100644 index 0000000..746719d --- /dev/null +++ b/packages/api/src/asset/animation/IAssetAnimationSpriteDirection.ts @@ -0,0 +1,7 @@ +export interface IAssetAnimationSpriteDirection +{ + id?: number; + dx?: number; + dy?: number; + dz?: number; +} diff --git a/packages/api/src/asset/animation/index.ts b/packages/api/src/asset/animation/index.ts new file mode 100644 index 0000000..56543d0 --- /dev/null +++ b/packages/api/src/asset/animation/index.ts @@ -0,0 +1,12 @@ +export * from './IAssetAnimation'; +export * from './IAssetAnimationAdd'; +export * from './IAssetAnimationAvatar'; +export * from './IAssetAnimationDirection'; +export * from './IAssetAnimationFrame'; +export * from './IAssetAnimationFramePart'; +export * from './IAssetAnimationFramePartItem'; +export * from './IAssetAnimationOverride'; +export * from './IAssetAnimationRemove'; +export * from './IAssetAnimationShadow'; +export * from './IAssetAnimationSprite'; +export * from './IAssetAnimationSpriteDirection'; diff --git a/packages/api/src/asset/index.ts b/packages/api/src/asset/index.ts new file mode 100644 index 0000000..1211968 --- /dev/null +++ b/packages/api/src/asset/index.ts @@ -0,0 +1,19 @@ +export * from './IAsset'; +export * from './IAssetAlias'; +export * from './IAssetData'; +export * from './IAssetManager'; +export * from './IAssetPalette'; +export * from './IGraphicAsset'; +export * from './IGraphicAssetCollection'; +export * from './IGraphicAssetPalette'; +export * from './animation'; +export * from './logic'; +export * from './logic/model'; +export * from './logic/particlesystem'; +export * from './room-visualization'; +export * from './spritesheet'; +export * from './visualization'; +export * from './visualization/animation'; +export * from './visualization/color'; +export * from './visualization/gestures'; +export * from './visualization/postures'; diff --git a/packages/api/src/asset/logic/IAssetLogicCustomVars.ts b/packages/api/src/asset/logic/IAssetLogicCustomVars.ts new file mode 100644 index 0000000..1ebd4a8 --- /dev/null +++ b/packages/api/src/asset/logic/IAssetLogicCustomVars.ts @@ -0,0 +1,4 @@ +export interface ICustomVars +{ + variables?: string[]; +} diff --git a/packages/api/src/asset/logic/IAssetLogicData.ts b/packages/api/src/asset/logic/IAssetLogicData.ts new file mode 100644 index 0000000..acf484c --- /dev/null +++ b/packages/api/src/asset/logic/IAssetLogicData.ts @@ -0,0 +1,17 @@ +import { ICustomVars } from './IAssetLogicCustomVars'; +import { IAssetLogicPlanetSystem } from './IAssetLogicPlanetSystem'; +import { ISoundSample } from './ISoundSample'; +import { IAssetLogicModel } from './model/IAssetLogicModel'; +import { IParticleSystem } from './particlesystem'; + +export interface IAssetLogicData +{ + model?: IAssetLogicModel; + maskType?: string; + credits?: string; + soundSample?: ISoundSample; + action?: { link?: string, startState?: number }; + planetSystems?: IAssetLogicPlanetSystem[]; + particleSystems?: IParticleSystem[]; + customVars?: ICustomVars; +} diff --git a/packages/api/src/asset/logic/IAssetLogicPlanetSystem.ts b/packages/api/src/asset/logic/IAssetLogicPlanetSystem.ts new file mode 100644 index 0000000..47521bc --- /dev/null +++ b/packages/api/src/asset/logic/IAssetLogicPlanetSystem.ts @@ -0,0 +1,11 @@ +export interface IAssetLogicPlanetSystem +{ + id?: number; + name?: string; + parent?: string; + radius?: number; + arcSpeed?: number; + arcOffset?: number; + blend?: number; + height?: number; +} diff --git a/packages/api/src/asset/logic/ISoundSample.ts b/packages/api/src/asset/logic/ISoundSample.ts new file mode 100644 index 0000000..003f9f6 --- /dev/null +++ b/packages/api/src/asset/logic/ISoundSample.ts @@ -0,0 +1,5 @@ +export interface ISoundSample +{ + id?: number; + noPitch?: boolean; +} diff --git a/packages/api/src/asset/logic/index.ts b/packages/api/src/asset/logic/index.ts new file mode 100644 index 0000000..569907b --- /dev/null +++ b/packages/api/src/asset/logic/index.ts @@ -0,0 +1,6 @@ +export * from './IAssetLogicCustomVars'; +export * from './IAssetLogicData'; +export * from './IAssetLogicPlanetSystem'; +export * from './ISoundSample'; +export * from './model'; +export * from './particlesystem'; diff --git a/packages/api/src/asset/logic/model/IAssetDimension.ts b/packages/api/src/asset/logic/model/IAssetDimension.ts new file mode 100644 index 0000000..4a4629f --- /dev/null +++ b/packages/api/src/asset/logic/model/IAssetDimension.ts @@ -0,0 +1,6 @@ +export interface IAssetDimension +{ + x: number; + y: number; + z?: number; +} \ No newline at end of file diff --git a/packages/api/src/asset/logic/model/IAssetLogicModel.ts b/packages/api/src/asset/logic/model/IAssetLogicModel.ts new file mode 100644 index 0000000..eef3245 --- /dev/null +++ b/packages/api/src/asset/logic/model/IAssetLogicModel.ts @@ -0,0 +1,7 @@ +import { IAssetDimension } from './IAssetDimension'; + +export interface IAssetLogicModel +{ + dimensions?: IAssetDimension; + directions?: number[]; +} diff --git a/packages/api/src/asset/logic/model/index.ts b/packages/api/src/asset/logic/model/index.ts new file mode 100644 index 0000000..4d08a72 --- /dev/null +++ b/packages/api/src/asset/logic/model/index.ts @@ -0,0 +1,2 @@ +export * from './IAssetDimension'; +export * from './IAssetLogicModel'; diff --git a/packages/api/src/asset/logic/particlesystem/IParticleSystem.ts b/packages/api/src/asset/logic/particlesystem/IParticleSystem.ts new file mode 100644 index 0000000..871f5f3 --- /dev/null +++ b/packages/api/src/asset/logic/particlesystem/IParticleSystem.ts @@ -0,0 +1,11 @@ +import { IParticleSystemEmitter } from './IParticleSystemEmitter'; + +export interface IParticleSystem +{ + size?: number; + canvasId?: number; + offsetY?: number; + blend?: number; + bgColor?: string; + emitters?: IParticleSystemEmitter[]; +} diff --git a/packages/api/src/asset/logic/particlesystem/IParticleSystemEmitter.ts b/packages/api/src/asset/logic/particlesystem/IParticleSystemEmitter.ts new file mode 100644 index 0000000..fa175e2 --- /dev/null +++ b/packages/api/src/asset/logic/particlesystem/IParticleSystemEmitter.ts @@ -0,0 +1,15 @@ +import { IParticleSystemParticle } from './IParticleSystemParticle'; +import { IParticleSystemSimulation } from './IParticleSystemSimulation'; + +export interface IParticleSystemEmitter +{ + id?: number; + name?: string; + spriteId?: number; + maxNumParticles?: number; + particlesPerFrame?: number; + burstPulse?: number; + fuseTime?: number; + simulation?: IParticleSystemSimulation; + particles?: IParticleSystemParticle[]; +} diff --git a/packages/api/src/asset/logic/particlesystem/IParticleSystemParticle.ts b/packages/api/src/asset/logic/particlesystem/IParticleSystemParticle.ts new file mode 100644 index 0000000..99281fa --- /dev/null +++ b/packages/api/src/asset/logic/particlesystem/IParticleSystemParticle.ts @@ -0,0 +1,7 @@ +export interface IParticleSystemParticle +{ + isEmitter?: boolean; + lifeTime?: number; + fade?: boolean; + frames?: string[]; +} diff --git a/packages/api/src/asset/logic/particlesystem/IParticleSystemSimulation.ts b/packages/api/src/asset/logic/particlesystem/IParticleSystemSimulation.ts new file mode 100644 index 0000000..fef400c --- /dev/null +++ b/packages/api/src/asset/logic/particlesystem/IParticleSystemSimulation.ts @@ -0,0 +1,9 @@ +export interface IParticleSystemSimulation +{ + force?: number; + direction?: number; + gravity?: number; + airFriction?: number; + shape?: string; + energy?: number; +} diff --git a/packages/api/src/asset/logic/particlesystem/index.ts b/packages/api/src/asset/logic/particlesystem/index.ts new file mode 100644 index 0000000..428f6fc --- /dev/null +++ b/packages/api/src/asset/logic/particlesystem/index.ts @@ -0,0 +1,4 @@ +export * from './IParticleSystem'; +export * from './IParticleSystemEmitter'; +export * from './IParticleSystemParticle'; +export * from './IParticleSystemSimulation'; diff --git a/packages/api/src/asset/room-visualization/IAssetPlane.ts b/packages/api/src/asset/room-visualization/IAssetPlane.ts new file mode 100644 index 0000000..6007641 --- /dev/null +++ b/packages/api/src/asset/room-visualization/IAssetPlane.ts @@ -0,0 +1,8 @@ +import { IAssetPlaneVisualization } from './IAssetPlaneVisualization'; + +export interface IAssetPlane +{ + id?: string; + visualizations?: IAssetPlaneVisualization[]; + animatedVisualization?: IAssetPlaneVisualization[]; +} diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneMask.ts b/packages/api/src/asset/room-visualization/IAssetPlaneMask.ts new file mode 100644 index 0000000..0fd8465 --- /dev/null +++ b/packages/api/src/asset/room-visualization/IAssetPlaneMask.ts @@ -0,0 +1,7 @@ +import { IAssetPlaneMaskVisualization } from './IAssetPlaneMaskVisualization'; + +export interface IAssetPlaneMask +{ + id?: string; + visualizations?: IAssetPlaneMaskVisualization[]; +} diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneMaskData.ts b/packages/api/src/asset/room-visualization/IAssetPlaneMaskData.ts new file mode 100644 index 0000000..2767b59 --- /dev/null +++ b/packages/api/src/asset/room-visualization/IAssetPlaneMaskData.ts @@ -0,0 +1,6 @@ +import { IAssetPlaneMask } from './IAssetPlaneMask'; + +export interface IAssetPlaneMaskData +{ + masks?: IAssetPlaneMask[]; +} diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneMaskVisualization.ts b/packages/api/src/asset/room-visualization/IAssetPlaneMaskVisualization.ts new file mode 100644 index 0000000..66c5ae8 --- /dev/null +++ b/packages/api/src/asset/room-visualization/IAssetPlaneMaskVisualization.ts @@ -0,0 +1,7 @@ +import { IAssetPlaneTextureBitmap } from './IAssetPlaneTextureBitmap'; + +export interface IAssetPlaneMaskVisualization +{ + size?: number; + bitmaps?: IAssetPlaneTextureBitmap[]; +} diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneMaterial.ts b/packages/api/src/asset/room-visualization/IAssetPlaneMaterial.ts new file mode 100644 index 0000000..59ae007 --- /dev/null +++ b/packages/api/src/asset/room-visualization/IAssetPlaneMaterial.ts @@ -0,0 +1,7 @@ +import { IAssetPlaneMaterialCellMatrix } from './IAssetPlaneMaterialCellMatrix'; + +export interface IAssetPlaneMaterial +{ + id?: string; + matrices?: IAssetPlaneMaterialCellMatrix[]; +} diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCell.ts b/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCell.ts new file mode 100644 index 0000000..fafae27 --- /dev/null +++ b/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCell.ts @@ -0,0 +1,7 @@ +import { IAssetPlaneMaterialCellExtraItemData } from './IAssetPlaneMaterialCellExtraItemData'; + +export interface IAssetPlaneMaterialCell +{ + textureId?: string; + extraData?: IAssetPlaneMaterialCellExtraItemData; +} diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCellColumn.ts b/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCellColumn.ts new file mode 100644 index 0000000..d2b36d3 --- /dev/null +++ b/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCellColumn.ts @@ -0,0 +1,8 @@ +import { IAssetPlaneMaterialCell } from './IAssetPlaneMaterialCell'; + +export interface IAssetPlaneMaterialCellColumn +{ + repeatMode?: string; + width?: number; + cells?: IAssetPlaneMaterialCell[]; +} diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCellExtraItemData.ts b/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCellExtraItemData.ts new file mode 100644 index 0000000..a49833f --- /dev/null +++ b/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCellExtraItemData.ts @@ -0,0 +1,6 @@ +export interface IAssetPlaneMaterialCellExtraItemData +{ + limitMax?: number; + extraItemTypes?: string[]; + offsets?: [number, number][]; +} diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCellMatrix.ts b/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCellMatrix.ts new file mode 100644 index 0000000..526cde2 --- /dev/null +++ b/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCellMatrix.ts @@ -0,0 +1,12 @@ +import { IAssetPlaneMaterialCellColumn } from './IAssetPlaneMaterialCellColumn'; + +export interface IAssetPlaneMaterialCellMatrix +{ + repeatMode?: string; + align?: string; + normalMinX?: number; + normalMaxX?: number; + normalMinY?: number; + normalMaxY?: number; + columns?: IAssetPlaneMaterialCellColumn[]; +} diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneTexture.ts b/packages/api/src/asset/room-visualization/IAssetPlaneTexture.ts new file mode 100644 index 0000000..fff62fa --- /dev/null +++ b/packages/api/src/asset/room-visualization/IAssetPlaneTexture.ts @@ -0,0 +1,7 @@ +import { IAssetPlaneTextureBitmap } from './IAssetPlaneTextureBitmap'; + +export interface IAssetPlaneTexture +{ + id?: string; + bitmaps?: IAssetPlaneTextureBitmap[]; +} diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneTextureBitmap.ts b/packages/api/src/asset/room-visualization/IAssetPlaneTextureBitmap.ts new file mode 100644 index 0000000..e1af985 --- /dev/null +++ b/packages/api/src/asset/room-visualization/IAssetPlaneTextureBitmap.ts @@ -0,0 +1,8 @@ +export interface IAssetPlaneTextureBitmap +{ + assetName?: string; + normalMinX?: number; + normalMaxX?: number; + normalMinY?: number; + normalMaxY?: number; +} diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneVisualization.ts b/packages/api/src/asset/room-visualization/IAssetPlaneVisualization.ts new file mode 100644 index 0000000..db3b4de --- /dev/null +++ b/packages/api/src/asset/room-visualization/IAssetPlaneVisualization.ts @@ -0,0 +1,10 @@ +import { IAssetPlaneVisualizationAnimatedLayer } from './IAssetPlaneVisualizationAnimatedLayer'; +import { IAssetPlaneVisualizationLayer } from './IAssetPlaneVisualizationLayer'; + +export interface IAssetPlaneVisualization +{ + size?: number; + horizontalAngle?: number; + verticalAngle?: number; + allLayers?: (IAssetPlaneVisualizationLayer | IAssetPlaneVisualizationAnimatedLayer)[]; +} diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationAnimatedLayer.ts b/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationAnimatedLayer.ts new file mode 100644 index 0000000..4cd50c2 --- /dev/null +++ b/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationAnimatedLayer.ts @@ -0,0 +1,6 @@ +import { IAssetPlaneVisualizationAnimatedLayerItem } from './IAssetPlaneVisualizationAnimatedLayerItem'; + +export interface IAssetPlaneVisualizationAnimatedLayer +{ + items?: IAssetPlaneVisualizationAnimatedLayerItem[]; +} diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationAnimatedLayerItem.ts b/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationAnimatedLayerItem.ts new file mode 100644 index 0000000..9ee426e --- /dev/null +++ b/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationAnimatedLayerItem.ts @@ -0,0 +1,11 @@ +export interface IAssetPlaneVisualizationAnimatedLayerItem +{ + id?: number; + assetId?: string; + x?: string; + y?: string; + randomX?: string; + randomY?: string; + speedX?: number; + speedY?: number; +} diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationData.ts b/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationData.ts new file mode 100644 index 0000000..4e48d53 --- /dev/null +++ b/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationData.ts @@ -0,0 +1,10 @@ +import { IAssetPlane } from './IAssetPlane'; +import { IAssetPlaneMaterial } from './IAssetPlaneMaterial'; +import { IAssetPlaneTexture } from './IAssetPlaneTexture'; + +export interface IAssetPlaneVisualizationData +{ + planes?: IAssetPlane[]; + materials?: IAssetPlaneMaterial[]; + textures?: IAssetPlaneTexture[]; +} diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationLayer.ts b/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationLayer.ts new file mode 100644 index 0000000..e009893 --- /dev/null +++ b/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationLayer.ts @@ -0,0 +1,7 @@ +export interface IAssetPlaneVisualizationLayer +{ + materialId?: string; + color?: number; + offset?: number; + align?: string; +} diff --git a/packages/api/src/asset/room-visualization/IAssetRoomVisualizationData.ts b/packages/api/src/asset/room-visualization/IAssetRoomVisualizationData.ts new file mode 100644 index 0000000..e82ea8f --- /dev/null +++ b/packages/api/src/asset/room-visualization/IAssetRoomVisualizationData.ts @@ -0,0 +1,10 @@ +import { IAssetPlaneMaskData } from './IAssetPlaneMaskData'; +import { IAssetPlaneVisualizationData } from './IAssetPlaneVisualizationData'; + +export interface IAssetRoomVisualizationData +{ + floorData?: IAssetPlaneVisualizationData; + wallData?: IAssetPlaneVisualizationData; + landscapeData?: IAssetPlaneVisualizationData; + maskData?: IAssetPlaneMaskData; +} diff --git a/packages/api/src/asset/room-visualization/index.ts b/packages/api/src/asset/room-visualization/index.ts new file mode 100644 index 0000000..4d6face --- /dev/null +++ b/packages/api/src/asset/room-visualization/index.ts @@ -0,0 +1,17 @@ +export * from './IAssetPlane'; +export * from './IAssetPlaneMask'; +export * from './IAssetPlaneMaskData'; +export * from './IAssetPlaneMaskVisualization'; +export * from './IAssetPlaneMaterial'; +export * from './IAssetPlaneMaterialCell'; +export * from './IAssetPlaneMaterialCellColumn'; +export * from './IAssetPlaneMaterialCellExtraItemData'; +export * from './IAssetPlaneMaterialCellMatrix'; +export * from './IAssetPlaneTexture'; +export * from './IAssetPlaneTextureBitmap'; +export * from './IAssetPlaneVisualization'; +export * from './IAssetPlaneVisualizationAnimatedLayer'; +export * from './IAssetPlaneVisualizationAnimatedLayerItem'; +export * from './IAssetPlaneVisualizationData'; +export * from './IAssetPlaneVisualizationLayer'; +export * from './IAssetRoomVisualizationData'; diff --git a/packages/api/src/asset/spritesheet/ISpritesheetData.ts b/packages/api/src/asset/spritesheet/ISpritesheetData.ts new file mode 100644 index 0000000..3d96adc --- /dev/null +++ b/packages/api/src/asset/spritesheet/ISpritesheetData.ts @@ -0,0 +1,9 @@ +import { SpritesheetData } from 'pixi.js'; +import { ISpritesheetFrame } from './ISpritesheetFrame'; +import { ISpritesheetMeta } from './ISpritesheetMeta'; + +export interface ISpritesheetData extends SpritesheetData +{ + meta: ISpritesheetMeta; + frames: { [index: string]: ISpritesheetFrame }; +} diff --git a/packages/api/src/asset/spritesheet/ISpritesheetFrame.ts b/packages/api/src/asset/spritesheet/ISpritesheetFrame.ts new file mode 100644 index 0000000..0833b50 --- /dev/null +++ b/packages/api/src/asset/spritesheet/ISpritesheetFrame.ts @@ -0,0 +1,25 @@ +export interface ISpritesheetFrame +{ + frame: { + x: number; + y: number; + w: number; + h: number; + }; + rotated: boolean; + trimmed: boolean; + spriteSourceSize: { + x: number; + y: number; + w: number; + h: number; + }; + sourceSize: { + w: number; + h: number; + }; + pivot: { + x: number; + y: number; + }; +} diff --git a/packages/api/src/asset/spritesheet/ISpritesheetMeta.ts b/packages/api/src/asset/spritesheet/ISpritesheetMeta.ts new file mode 100644 index 0000000..3a74f7b --- /dev/null +++ b/packages/api/src/asset/spritesheet/ISpritesheetMeta.ts @@ -0,0 +1,12 @@ +export interface ISpritesheetMeta +{ + app: string; + version: string; + image: string; + format: string; + size: { + w: number; + h: number; + }; + scale: string; +} diff --git a/packages/api/src/asset/spritesheet/index.ts b/packages/api/src/asset/spritesheet/index.ts new file mode 100644 index 0000000..9c94e8b --- /dev/null +++ b/packages/api/src/asset/spritesheet/index.ts @@ -0,0 +1,3 @@ +export * from './ISpritesheetData'; +export * from './ISpritesheetFrame'; +export * from './ISpritesheetMeta'; diff --git a/packages/api/src/asset/visualization/IAssetVisualizationData.ts b/packages/api/src/asset/visualization/IAssetVisualizationData.ts new file mode 100644 index 0000000..e92f959 --- /dev/null +++ b/packages/api/src/asset/visualization/IAssetVisualizationData.ts @@ -0,0 +1,20 @@ +import { IAssetVisualAnimation } from './animation'; +import { IAssetColor } from './color'; +import { IAssetGesture } from './gestures'; +import { IAssetVisualizationDirection } from './IAssetVisualizationDirection'; +import { IAssetVisualizationLayer } from './IAssetVisualizationLayer'; +import { IAssetPosture } from './postures/IAssetPosture'; + +export interface IAssetVisualizationData +{ + size?: number; + layerCount?: number; + angle?: number; + layers?: { [index: string]: IAssetVisualizationLayer }; + colors?: { [index: string]: IAssetColor }; + directions?: { [index: string]: IAssetVisualizationDirection }; + animations?: { [index: string]: IAssetVisualAnimation }; + defaultPosture?: string; + postures?: { defaultPosture?: string, postures?: IAssetPosture[] }; + gestures?: IAssetGesture[]; +} diff --git a/packages/api/src/asset/visualization/IAssetVisualizationDirection.ts b/packages/api/src/asset/visualization/IAssetVisualizationDirection.ts new file mode 100644 index 0000000..cc628f1 --- /dev/null +++ b/packages/api/src/asset/visualization/IAssetVisualizationDirection.ts @@ -0,0 +1,6 @@ +import { IAssetVisualizationLayer } from './IAssetVisualizationLayer'; + +export interface IAssetVisualizationDirection +{ + layers?: { [index: string]: IAssetVisualizationLayer }; +} diff --git a/packages/api/src/asset/visualization/IAssetVisualizationLayer.ts b/packages/api/src/asset/visualization/IAssetVisualizationLayer.ts new file mode 100644 index 0000000..61fcf56 --- /dev/null +++ b/packages/api/src/asset/visualization/IAssetVisualizationLayer.ts @@ -0,0 +1,10 @@ +export interface IAssetVisualizationLayer +{ + x?: number; + y?: number; + z?: number; + alpha?: number; + ink?: string; + tag?: string; + ignoreMouse?: boolean; +} \ No newline at end of file diff --git a/packages/api/src/asset/visualization/animation/IAssetVisualAnimation.ts b/packages/api/src/asset/visualization/animation/IAssetVisualAnimation.ts new file mode 100644 index 0000000..4e71438 --- /dev/null +++ b/packages/api/src/asset/visualization/animation/IAssetVisualAnimation.ts @@ -0,0 +1,10 @@ +import { IAssetVisualAnimationLayer } from './IAssetVisualAnimationLayer'; + +export interface IAssetVisualAnimation +{ + transitionTo?: number; + transitionFrom?: number; + immediateChangeFrom?: string; + randomStart?: boolean; + layers?: { [index: string]: IAssetVisualAnimationLayer }; +} diff --git a/packages/api/src/asset/visualization/animation/IAssetVisualAnimationLayer.ts b/packages/api/src/asset/visualization/animation/IAssetVisualAnimationLayer.ts new file mode 100644 index 0000000..2a274ea --- /dev/null +++ b/packages/api/src/asset/visualization/animation/IAssetVisualAnimationLayer.ts @@ -0,0 +1,9 @@ +import { IAssetVisualAnimationSequence } from './IAssetVisualAnimationSequence'; + +export interface IAssetVisualAnimationLayer +{ + loopCount?: number; + frameRepeat?: number; + random?: number; + frameSequences?: { [index: string]: IAssetVisualAnimationSequence }; +} diff --git a/packages/api/src/asset/visualization/animation/IAssetVisualAnimationSequence.ts b/packages/api/src/asset/visualization/animation/IAssetVisualAnimationSequence.ts new file mode 100644 index 0000000..bb25104 --- /dev/null +++ b/packages/api/src/asset/visualization/animation/IAssetVisualAnimationSequence.ts @@ -0,0 +1,8 @@ +import { IAssetVisualAnimationSequenceFrame } from './IAssetVisualAnimationSequenceFrame'; + +export interface IAssetVisualAnimationSequence +{ + loopCount?: number; + random?: number; + frames?: { [index: string]: IAssetVisualAnimationSequenceFrame }; +} diff --git a/packages/api/src/asset/visualization/animation/IAssetVisualAnimationSequenceFrame.ts b/packages/api/src/asset/visualization/animation/IAssetVisualAnimationSequenceFrame.ts new file mode 100644 index 0000000..196631e --- /dev/null +++ b/packages/api/src/asset/visualization/animation/IAssetVisualAnimationSequenceFrame.ts @@ -0,0 +1,11 @@ +import { IAssetVisualAnimationSequenceFrameOffset } from './IAssetVisualAnimationSequenceFrameOffset'; + +export interface IAssetVisualAnimationSequenceFrame +{ + id?: number; + x?: number; + y?: number; + randomX?: number; + randomY?: number; + offsets?: { [index: string]: IAssetVisualAnimationSequenceFrameOffset }; +} diff --git a/packages/api/src/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts b/packages/api/src/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts new file mode 100644 index 0000000..bc85461 --- /dev/null +++ b/packages/api/src/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts @@ -0,0 +1,6 @@ +export interface IAssetVisualAnimationSequenceFrameOffset +{ + direction?: number; + x?: number; + y?: number; +} diff --git a/packages/api/src/asset/visualization/animation/index.ts b/packages/api/src/asset/visualization/animation/index.ts new file mode 100644 index 0000000..19b332c --- /dev/null +++ b/packages/api/src/asset/visualization/animation/index.ts @@ -0,0 +1,5 @@ +export * from './IAssetVisualAnimation'; +export * from './IAssetVisualAnimationLayer'; +export * from './IAssetVisualAnimationSequence'; +export * from './IAssetVisualAnimationSequenceFrame'; +export * from './IAssetVisualAnimationSequenceFrameOffset'; diff --git a/packages/api/src/asset/visualization/color/IAssetColor.ts b/packages/api/src/asset/visualization/color/IAssetColor.ts new file mode 100644 index 0000000..29ebc75 --- /dev/null +++ b/packages/api/src/asset/visualization/color/IAssetColor.ts @@ -0,0 +1,6 @@ +import { IAssetColorLayer } from './IAssetColorLayer'; + +export interface IAssetColor +{ + layers?: { [index: string]: IAssetColorLayer }; +} diff --git a/packages/api/src/asset/visualization/color/IAssetColorLayer.ts b/packages/api/src/asset/visualization/color/IAssetColorLayer.ts new file mode 100644 index 0000000..7a1372e --- /dev/null +++ b/packages/api/src/asset/visualization/color/IAssetColorLayer.ts @@ -0,0 +1,4 @@ +export interface IAssetColorLayer +{ + color?: number; +} diff --git a/packages/api/src/asset/visualization/color/index.ts b/packages/api/src/asset/visualization/color/index.ts new file mode 100644 index 0000000..00aff50 --- /dev/null +++ b/packages/api/src/asset/visualization/color/index.ts @@ -0,0 +1,2 @@ +export * from './IAssetColor'; +export * from './IAssetColorLayer'; diff --git a/packages/api/src/asset/visualization/gestures/IAssetGesture.ts b/packages/api/src/asset/visualization/gestures/IAssetGesture.ts new file mode 100644 index 0000000..ddf3752 --- /dev/null +++ b/packages/api/src/asset/visualization/gestures/IAssetGesture.ts @@ -0,0 +1,5 @@ +export interface IAssetGesture +{ + id?: string; + animationId?: number; +} diff --git a/packages/api/src/asset/visualization/gestures/index.ts b/packages/api/src/asset/visualization/gestures/index.ts new file mode 100644 index 0000000..2c6e978 --- /dev/null +++ b/packages/api/src/asset/visualization/gestures/index.ts @@ -0,0 +1 @@ +export * from './IAssetGesture'; diff --git a/packages/api/src/asset/visualization/index.ts b/packages/api/src/asset/visualization/index.ts new file mode 100644 index 0000000..ec77223 --- /dev/null +++ b/packages/api/src/asset/visualization/index.ts @@ -0,0 +1,7 @@ +export * from './IAssetVisualizationData'; +export * from './IAssetVisualizationDirection'; +export * from './IAssetVisualizationLayer'; +export * from './animation'; +export * from './color'; +export * from './gestures'; +export * from './postures'; diff --git a/packages/api/src/asset/visualization/postures/IAssetPosture.ts b/packages/api/src/asset/visualization/postures/IAssetPosture.ts new file mode 100644 index 0000000..3313851 --- /dev/null +++ b/packages/api/src/asset/visualization/postures/IAssetPosture.ts @@ -0,0 +1,5 @@ +export interface IAssetPosture +{ + id?: string; + animationId?: number; +} diff --git a/packages/api/src/asset/visualization/postures/index.ts b/packages/api/src/asset/visualization/postures/index.ts new file mode 100644 index 0000000..c24c1b9 --- /dev/null +++ b/packages/api/src/asset/visualization/postures/index.ts @@ -0,0 +1 @@ +export * from './IAssetPosture'; diff --git a/packages/api/src/common/IDisposable.ts b/packages/api/src/common/IDisposable.ts new file mode 100644 index 0000000..b9f6040 --- /dev/null +++ b/packages/api/src/common/IDisposable.ts @@ -0,0 +1,5 @@ +export interface IDisposable +{ + dispose(): void; + disposed: boolean; +} \ No newline at end of file diff --git a/packages/api/src/common/IEventDispatcher.ts b/packages/api/src/common/IEventDispatcher.ts new file mode 100644 index 0000000..2e4ebdb --- /dev/null +++ b/packages/api/src/common/IEventDispatcher.ts @@ -0,0 +1,10 @@ +import { INitroEvent } from './INitroEvent'; + +export interface IEventDispatcher +{ + dispose(): void; + addEventListener(type: string, callback: (event: T) => void): void; + removeEventListener(type: string, callback: Function): void; + removeAllListeners(): void; + dispatchEvent(event: T): boolean; +} diff --git a/packages/api/src/common/ILinkEventTracker.ts b/packages/api/src/common/ILinkEventTracker.ts new file mode 100644 index 0000000..311567d --- /dev/null +++ b/packages/api/src/common/ILinkEventTracker.ts @@ -0,0 +1,5 @@ +export interface ILinkEventTracker +{ + linkReceived(link: string): void; + eventUrlPrefix: string; +} \ No newline at end of file diff --git a/packages/api/src/common/INitroEvent.ts b/packages/api/src/common/INitroEvent.ts new file mode 100644 index 0000000..e063ad8 --- /dev/null +++ b/packages/api/src/common/INitroEvent.ts @@ -0,0 +1,4 @@ +export interface INitroEvent +{ + type: string; +} diff --git a/packages/api/src/common/INitroManager.ts b/packages/api/src/common/INitroManager.ts new file mode 100644 index 0000000..22ac5f8 --- /dev/null +++ b/packages/api/src/common/INitroManager.ts @@ -0,0 +1,10 @@ +import { IDisposable } from './IDisposable'; +import { IEventDispatcher } from './IEventDispatcher'; + +export interface INitroManager extends IDisposable +{ + init(): void; + events: IEventDispatcher; + isLoaded: boolean; + isLoading: boolean; +} diff --git a/packages/api/src/common/IUpdateReceiver.ts b/packages/api/src/common/IUpdateReceiver.ts new file mode 100644 index 0000000..9bc3b4e --- /dev/null +++ b/packages/api/src/common/IUpdateReceiver.ts @@ -0,0 +1,6 @@ +import { Ticker } from 'pixi.js'; + +export interface IUpdateReceiver +{ + update(ticker: Ticker): void; +} diff --git a/packages/api/src/common/index.ts b/packages/api/src/common/index.ts new file mode 100644 index 0000000..856b24c --- /dev/null +++ b/packages/api/src/common/index.ts @@ -0,0 +1,6 @@ +export * from './IDisposable'; +export * from './IEventDispatcher'; +export * from './ILinkEventTracker'; +export * from './INitroEvent'; +export * from './INitroManager'; +export * from './IUpdateReceiver'; diff --git a/packages/api/src/communication/ICodec.ts b/packages/api/src/communication/ICodec.ts new file mode 100644 index 0000000..39c4b29 --- /dev/null +++ b/packages/api/src/communication/ICodec.ts @@ -0,0 +1,9 @@ +import { IBinaryWriter } from '../utils'; +import { IConnection } from './IConnection'; +import { IMessageDataWrapper } from './IMessageDataWrapper'; + +export interface ICodec +{ + encode(header: number, messages: any[]): IBinaryWriter; + decode(connection: IConnection): IMessageDataWrapper[]; +} diff --git a/packages/api/src/communication/ICommunicationManager.ts b/packages/api/src/communication/ICommunicationManager.ts new file mode 100644 index 0000000..7c15877 --- /dev/null +++ b/packages/api/src/communication/ICommunicationManager.ts @@ -0,0 +1,10 @@ +import { IConnection } from './IConnection'; +import { IMessageEvent } from './IMessageEvent'; + +export interface ICommunicationManager +{ + init(): Promise; + registerMessageEvent(event: IMessageEvent): IMessageEvent; + removeMessageEvent(event: IMessageEvent): void; + connection: IConnection; +} diff --git a/packages/api/src/communication/IConnection.ts b/packages/api/src/communication/IConnection.ts new file mode 100644 index 0000000..3139c22 --- /dev/null +++ b/packages/api/src/communication/IConnection.ts @@ -0,0 +1,17 @@ +import { IMessageComposer } from './IMessageComposer'; +import { IMessageConfiguration } from './IMessageConfiguration'; +import { IMessageEvent } from './IMessageEvent'; + +export interface IConnection +{ + init(socketUrl: string): void; + ready(): void; + authenticated(): void; + send(...composers: IMessageComposer[]): void; + processReceivedData(): void; + registerMessages(configuration: IMessageConfiguration): void; + addMessageEvent(event: IMessageEvent): void; + removeMessageEvent(event: IMessageEvent): void; + isAuthenticated: boolean; + dataBuffer: ArrayBuffer; +} diff --git a/packages/api/src/communication/IConnectionStateListener.ts b/packages/api/src/communication/IConnectionStateListener.ts new file mode 100644 index 0000000..d140fd0 --- /dev/null +++ b/packages/api/src/communication/IConnectionStateListener.ts @@ -0,0 +1,4 @@ +export interface IConnectionStateListener +{ + connectionInit(socketUrl: string): void; +} \ No newline at end of file diff --git a/packages/api/src/communication/IMessageComposer.ts b/packages/api/src/communication/IMessageComposer.ts new file mode 100644 index 0000000..eb09bc8 --- /dev/null +++ b/packages/api/src/communication/IMessageComposer.ts @@ -0,0 +1,5 @@ +export interface IMessageComposer +{ + dispose(): void; + getMessageArray(): T; +} \ No newline at end of file diff --git a/packages/api/src/communication/IMessageConfiguration.ts b/packages/api/src/communication/IMessageConfiguration.ts new file mode 100644 index 0000000..03efd30 --- /dev/null +++ b/packages/api/src/communication/IMessageConfiguration.ts @@ -0,0 +1,5 @@ +export interface IMessageConfiguration +{ + events: Map; + composers: Map; +} \ No newline at end of file diff --git a/packages/api/src/communication/IMessageDataWrapper.ts b/packages/api/src/communication/IMessageDataWrapper.ts new file mode 100644 index 0000000..0f1c39f --- /dev/null +++ b/packages/api/src/communication/IMessageDataWrapper.ts @@ -0,0 +1,15 @@ +import { IBinaryReader } from '../utils'; + +export interface IMessageDataWrapper +{ + readByte(): number; + readBytes(length: number): IBinaryReader; + readBoolean(): boolean; + readShort(): number; + readInt(): number; + readFloat(): number; + readDouble(): number; + readString(): string; + header: number; + bytesAvailable: boolean; +} diff --git a/packages/api/src/communication/IMessageEvent.ts b/packages/api/src/communication/IMessageEvent.ts new file mode 100644 index 0000000..5949015 --- /dev/null +++ b/packages/api/src/communication/IMessageEvent.ts @@ -0,0 +1,11 @@ +import { IConnection } from './IConnection'; +import { IMessageParser } from './IMessageParser'; + +export interface IMessageEvent +{ + dispose(): void; + callBack: Function; + parserClass: Function; + parser: IMessageParser; + connection: IConnection; +} diff --git a/packages/api/src/communication/IMessageParser.ts b/packages/api/src/communication/IMessageParser.ts new file mode 100644 index 0000000..f10a50d --- /dev/null +++ b/packages/api/src/communication/IMessageParser.ts @@ -0,0 +1,7 @@ +import { IMessageDataWrapper } from './IMessageDataWrapper'; + +export interface IMessageParser +{ + flush(): boolean; + parse(wrapper: IMessageDataWrapper): boolean; +} \ No newline at end of file diff --git a/packages/api/src/communication/enums/ClientDeviceCategoryEnum.ts b/packages/api/src/communication/enums/ClientDeviceCategoryEnum.ts new file mode 100644 index 0000000..abd127f --- /dev/null +++ b/packages/api/src/communication/enums/ClientDeviceCategoryEnum.ts @@ -0,0 +1,5 @@ +export class ClientDeviceCategoryEnum +{ + public static UNKNOWN: number = 0; + public static BROWSER: number = 1; +} \ No newline at end of file diff --git a/packages/api/src/communication/enums/ClientPlatformEnum.ts b/packages/api/src/communication/enums/ClientPlatformEnum.ts new file mode 100644 index 0000000..417b811 --- /dev/null +++ b/packages/api/src/communication/enums/ClientPlatformEnum.ts @@ -0,0 +1,7 @@ +export class ClientPlatformEnum +{ + public static UNKNOWN: number = 0; + public static FLASH: number = 1; + public static HTML5: number = 2; + +} \ No newline at end of file diff --git a/packages/api/src/communication/enums/WebSocketEventEnum.ts b/packages/api/src/communication/enums/WebSocketEventEnum.ts new file mode 100644 index 0000000..303b79c --- /dev/null +++ b/packages/api/src/communication/enums/WebSocketEventEnum.ts @@ -0,0 +1,7 @@ +export class WebSocketEventEnum +{ + public static CONNECTION_OPENED = 'open'; + public static CONNECTION_CLOSED = 'close'; + public static CONNECTION_ERROR = 'error'; + public static CONNECTION_MESSAGE = 'message'; +} \ No newline at end of file diff --git a/packages/api/src/communication/enums/index.ts b/packages/api/src/communication/enums/index.ts new file mode 100644 index 0000000..42a2270 --- /dev/null +++ b/packages/api/src/communication/enums/index.ts @@ -0,0 +1,3 @@ +export * from './ClientDeviceCategoryEnum'; +export * from './ClientPlatformEnum'; +export * from './WebSocketEventEnum'; diff --git a/packages/api/src/communication/index.ts b/packages/api/src/communication/index.ts new file mode 100644 index 0000000..01b0ed3 --- /dev/null +++ b/packages/api/src/communication/index.ts @@ -0,0 +1,10 @@ +export * from './ICodec'; +export * from './ICommunicationManager'; +export * from './IConnection'; +export * from './IConnectionStateListener'; +export * from './IMessageComposer'; +export * from './IMessageConfiguration'; +export * from './IMessageDataWrapper'; +export * from './IMessageEvent'; +export * from './IMessageParser'; +export * from './enums'; diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts new file mode 100644 index 0000000..d545082 --- /dev/null +++ b/packages/api/src/index.ts @@ -0,0 +1,43 @@ +export * from './asset'; +export * from './asset/animation'; +export * from './asset/logic'; +export * from './asset/logic/model'; +export * from './asset/logic/particlesystem'; +export * from './asset/room-visualization'; +export * from './asset/spritesheet'; +export * from './asset/visualization'; +export * from './asset/visualization/animation'; +export * from './asset/visualization/color'; +export * from './asset/visualization/gestures'; +export * from './asset/visualization/postures'; +export * from './common'; +export * from './communication'; +export * from './communication/enums'; +export * from './nitro'; +export * from './nitro/avatar'; +export * from './nitro/avatar/actions'; +export * from './nitro/avatar/animation'; +export * from './nitro/avatar/enum'; +export * from './nitro/avatar/figuredata'; +export * from './nitro/avatar/structure'; +export * from './nitro/camera'; +export * from './nitro/enums'; +export * from './nitro/localization'; +export * from './nitro/room'; +export * from './nitro/room/enums'; +export * from './nitro/room/object'; +export * from './nitro/room/object/data'; +export * from './nitro/room/object/data/type'; +export * from './nitro/room/utils'; +export * from './nitro/session'; +export * from './nitro/session/enum'; +export * from './nitro/sound'; +export * from './room'; +export * from './room/object'; +export * from './room/object/enum'; +export * from './room/object/logic'; +export * from './room/object/visualization'; +export * from './room/renderer'; +export * from './ui'; +export * from './ui/enums'; +export * from './utils'; diff --git a/packages/api/src/nitro/avatar/IAvatarAssetDownloadLibrary.ts b/packages/api/src/nitro/avatar/IAvatarAssetDownloadLibrary.ts new file mode 100644 index 0000000..82e779a --- /dev/null +++ b/packages/api/src/nitro/avatar/IAvatarAssetDownloadLibrary.ts @@ -0,0 +1,6 @@ +export interface IAvatarAssetDownloadLibrary +{ + downloadAsset(): Promise; + readonly libraryName: string; + readonly isLoaded: boolean; +} diff --git a/packages/api/src/nitro/avatar/IAvatarEffectListener.ts b/packages/api/src/nitro/avatar/IAvatarEffectListener.ts new file mode 100644 index 0000000..a04ebc3 --- /dev/null +++ b/packages/api/src/nitro/avatar/IAvatarEffectListener.ts @@ -0,0 +1,4 @@ +export interface IAvatarEffectListener +{ + resetEffect(effect: number): void; +} diff --git a/packages/api/src/nitro/avatar/IAvatarFigureContainer.ts b/packages/api/src/nitro/avatar/IAvatarFigureContainer.ts new file mode 100644 index 0000000..6e11806 --- /dev/null +++ b/packages/api/src/nitro/avatar/IAvatarFigureContainer.ts @@ -0,0 +1,10 @@ +export interface IAvatarFigureContainer +{ + getPartTypeIds(): IterableIterator; + hasPartType(_arg_1: string): boolean; + getPartSetId(_arg_1: string): number; + getPartColorIds(_arg_1: string): number[]; + updatePart(_arg_1: string, _arg_2: number, _arg_3: number[]): void; + removePart(_arg_1: string): void; + getFigureString(): string; +} diff --git a/packages/api/src/nitro/avatar/IAvatarImage.ts b/packages/api/src/nitro/avatar/IAvatarImage.ts new file mode 100644 index 0000000..d8d5052 --- /dev/null +++ b/packages/api/src/nitro/avatar/IAvatarImage.ts @@ -0,0 +1,29 @@ +import { Container, Texture } from 'pixi.js'; +import { IAvatarFigureContainer } from './IAvatarFigureContainer'; +import { IAnimationLayerData, ISpriteDataContainer } from './animation'; +import { IPartColor } from './structure'; + +export interface IAvatarImage +{ + dispose(): void; + setDirection(_arg_1: string, _arg_2: number): void; + setDirectionAngle(_arg_1: string, _arg_2: number): void; + updateAnimationByFrames(_arg_1?: number): void; + getScale(): string; + getSprites(): ISpriteDataContainer[]; + getLayerData(_arg_1: ISpriteDataContainer): IAnimationLayerData; + processAsTexture(setType: string, hightlight: boolean, texture?: Texture): Texture; + processAsImageUrl(setType: string): string; + processAsContainer(setType: string): Container; + getDirection(): number; + getFigure(): IAvatarFigureContainer; + getPartColor(_arg_1: string): IPartColor; + isAnimating(): boolean; + getCanvasOffsets(): number[]; + initActionAppends(): void; + endActionAppends(): void; + appendAction(_arg_1: string, ..._args: any[]): boolean; + isPlaceholder(): boolean; + animationHasResetOnToggle: boolean; + resetAnimationFrameCounter(): void; +} diff --git a/packages/api/src/nitro/avatar/IAvatarImageListener.ts b/packages/api/src/nitro/avatar/IAvatarImageListener.ts new file mode 100644 index 0000000..cc68c92 --- /dev/null +++ b/packages/api/src/nitro/avatar/IAvatarImageListener.ts @@ -0,0 +1,6 @@ +import { IDisposable } from '../../common'; + +export interface IAvatarImageListener extends IDisposable +{ + resetFigure(figure: string): void; +} diff --git a/packages/api/src/nitro/avatar/IAvatarRenderManager.ts b/packages/api/src/nitro/avatar/IAvatarRenderManager.ts new file mode 100644 index 0000000..a0e80ed --- /dev/null +++ b/packages/api/src/nitro/avatar/IAvatarRenderManager.ts @@ -0,0 +1,22 @@ +import { IAssetManager, IGraphicAsset } from '../../asset'; +import { IAvatarEffectListener } from './IAvatarEffectListener'; +import { IAvatarFigureContainer } from './IAvatarFigureContainer'; +import { IAvatarImage } from './IAvatarImage'; +import { IAvatarImageListener } from './IAvatarImageListener'; +import { IStructureData } from './structure'; + +export interface IAvatarRenderManager +{ + init(): Promise; + createFigureContainer(figure: string): IAvatarFigureContainer; + isFigureContainerReady(container: IAvatarFigureContainer): boolean; + createAvatarImage(figure: string, size: string, gender: string, listener?: IAvatarImageListener, effectListener?: IAvatarEffectListener): IAvatarImage; + downloadAvatarFigure(container: IAvatarFigureContainer, listener: IAvatarImageListener): void; + getFigureClubLevel(container: IAvatarFigureContainer, gender: string, searchParts?: string[]): number; + isValidFigureSetForGender(setId: number, gender: string): boolean; + getFigureStringWithFigureIds(k: string, _arg_2: string, _arg_3: number[]): string; + getMandatoryAvatarPartSetIds(k: string, _arg_2: number): string[]; + getAssetByName(name: string): IGraphicAsset; + assets: IAssetManager; + structureData: IStructureData; +} diff --git a/packages/api/src/nitro/avatar/IEffectAssetDownloadLibrary.ts b/packages/api/src/nitro/avatar/IEffectAssetDownloadLibrary.ts new file mode 100644 index 0000000..b76a32e --- /dev/null +++ b/packages/api/src/nitro/avatar/IEffectAssetDownloadLibrary.ts @@ -0,0 +1,9 @@ +import { IAssetAnimation } from '../../asset'; + +export interface IEffectAssetDownloadLibrary +{ + downloadAsset(): void; + readonly libraryName: string; + readonly animation: { [index: string]: IAssetAnimation }; + readonly isLoaded: boolean; +} diff --git a/packages/api/src/nitro/avatar/IOutfit.ts b/packages/api/src/nitro/avatar/IOutfit.ts new file mode 100644 index 0000000..e797d6f --- /dev/null +++ b/packages/api/src/nitro/avatar/IOutfit.ts @@ -0,0 +1,5 @@ +export interface IOutfit +{ + figure: string; + gender: string; +} \ No newline at end of file diff --git a/packages/api/src/nitro/avatar/actions/IActionDefinition.ts b/packages/api/src/nitro/avatar/actions/IActionDefinition.ts new file mode 100644 index 0000000..9c0e5f1 --- /dev/null +++ b/packages/api/src/nitro/avatar/actions/IActionDefinition.ts @@ -0,0 +1,19 @@ +export interface IActionDefinition +{ + id: string; + state: string; + precedence: number; + activePartSet: string; + isMain: boolean; + isDefault: boolean; + assetPartDefinition: string; + lay: string; + geometryType: string; + isAnimation: boolean; + startFromFrameZero: boolean; + isAnimated(_arg_1: string): boolean; + getPrevents(_arg_1: string): string[]; + getPreventHeadTurn(_arg_1: string): boolean; + setOffsets(_arg_1: string, _arg_2: number, _arg_3: []): void; + getOffsets(_arg_1: string, _arg_2: number): number[]; +} diff --git a/packages/api/src/nitro/avatar/actions/IActiveActionData.ts b/packages/api/src/nitro/avatar/actions/IActiveActionData.ts new file mode 100644 index 0000000..214c64f --- /dev/null +++ b/packages/api/src/nitro/avatar/actions/IActiveActionData.ts @@ -0,0 +1,11 @@ +import { IActionDefinition } from './IActionDefinition'; + +export interface IActiveActionData +{ + id: string; + actionType: string; + actionParameter: string; + startFrame: number; + definition: IActionDefinition; + overridingAction: string; +} diff --git a/packages/api/src/nitro/avatar/actions/index.ts b/packages/api/src/nitro/avatar/actions/index.ts new file mode 100644 index 0000000..9e191b0 --- /dev/null +++ b/packages/api/src/nitro/avatar/actions/index.ts @@ -0,0 +1,2 @@ +export * from './IActionDefinition'; +export * from './IActiveActionData'; diff --git a/packages/api/src/nitro/avatar/animation/IAnimation.ts b/packages/api/src/nitro/avatar/animation/IAnimation.ts new file mode 100644 index 0000000..2f53b72 --- /dev/null +++ b/packages/api/src/nitro/avatar/animation/IAnimation.ts @@ -0,0 +1,11 @@ +export interface IAnimation +{ + hasAvatarData(): boolean; + hasDirectionData(): boolean; + hasAddData(): boolean; + id: string; + spriteData: any; + removeData: any; + addData: any; + resetOnToggle: boolean; +} diff --git a/packages/api/src/nitro/avatar/animation/IAnimationLayerData.ts b/packages/api/src/nitro/avatar/animation/IAnimationLayerData.ts new file mode 100644 index 0000000..8bf9e86 --- /dev/null +++ b/packages/api/src/nitro/avatar/animation/IAnimationLayerData.ts @@ -0,0 +1,12 @@ +import { IActiveActionData } from '../actions'; + +export interface IAnimationLayerData +{ + id: string; + action: IActiveActionData; + animationFrame: number; + dx: number; + dy: number; + dz: number; + dd: number; +} diff --git a/packages/api/src/nitro/avatar/animation/IAnimationManager.ts b/packages/api/src/nitro/avatar/animation/IAnimationManager.ts new file mode 100644 index 0000000..2fff676 --- /dev/null +++ b/packages/api/src/nitro/avatar/animation/IAnimationManager.ts @@ -0,0 +1,9 @@ +import { IAnimation } from './IAnimation'; +import { IAnimationLayerData } from './IAnimationLayerData'; + +export interface IAnimationManager +{ + animations: Map; + getAnimation(_arg_1: string): IAnimation; + getLayerData(_arg_1: string, _arg_2: number, _arg_3: string): IAnimationLayerData; +} diff --git a/packages/api/src/nitro/avatar/animation/IAvatarDataContainer.ts b/packages/api/src/nitro/avatar/animation/IAvatarDataContainer.ts new file mode 100644 index 0000000..485f23a --- /dev/null +++ b/packages/api/src/nitro/avatar/animation/IAvatarDataContainer.ts @@ -0,0 +1,12 @@ +import { Filter } from 'pixi.js'; + +export interface IAvatarDataContainer +{ + ink: number; + colorTransform: Filter; + paletteIsGrayscale: boolean; + reds: number[]; + greens: number[]; + blues: number[]; + alphas: number[]; +} diff --git a/packages/api/src/nitro/avatar/animation/ISpriteDataContainer.ts b/packages/api/src/nitro/avatar/animation/ISpriteDataContainer.ts new file mode 100644 index 0000000..97df715 --- /dev/null +++ b/packages/api/src/nitro/avatar/animation/ISpriteDataContainer.ts @@ -0,0 +1,14 @@ +import { IAnimation } from './IAnimation'; + +export interface ISpriteDataContainer +{ + animation: IAnimation; + id: string; + ink: number; + member: string; + hasDirections: boolean; + hasStaticY: boolean; + getDirectionOffsetX(_arg_1: number): number; + getDirectionOffsetY(_arg_1: number): number; + getDirectionOffsetZ(_arg_1: number): number; +} diff --git a/packages/api/src/nitro/avatar/animation/index.ts b/packages/api/src/nitro/avatar/animation/index.ts new file mode 100644 index 0000000..c6ce58c --- /dev/null +++ b/packages/api/src/nitro/avatar/animation/index.ts @@ -0,0 +1,5 @@ +export * from './IAnimation'; +export * from './IAnimationLayerData'; +export * from './IAnimationManager'; +export * from './IAvatarDataContainer'; +export * from './ISpriteDataContainer'; diff --git a/packages/api/src/nitro/avatar/enum/AvatarAction.ts b/packages/api/src/nitro/avatar/enum/AvatarAction.ts new file mode 100644 index 0000000..2d7ac10 --- /dev/null +++ b/packages/api/src/nitro/avatar/enum/AvatarAction.ts @@ -0,0 +1,127 @@ +export class AvatarAction +{ + public static CARRY_OBJECT = 'cri'; + public static DANCE = 'dance'; + public static EFFECT = 'fx'; + public static EXPRESSION = 'expression'; + public static EXPRESSION_BLOW_A_KISS = 'blow'; + public static EXPRESSION_CRY = 'cry'; + public static EXPRESSION_IDLE = 'idle'; + public static EXPRESSION_LAUGH = 'laugh'; + public static EXPRESSION_RESPECT = 'respect'; + public static EXPRESSION_RIDE_JUMP = 'ridejump'; + public static EXPRESSION_SNOWBOARD_OLLIE = 'sbollie'; + public static EXPRESSION_SNOWBORD_360 = 'sb360'; + public static EXPRESSION_WAVE = 'wave'; + public static GESTURE = 'gest'; + public static GESTURE_AGGRAVATED = 'agr'; + public static GESTURE_SAD = 'sad'; + public static GESTURE_SMILE = 'sml'; + public static GESTURE_SURPRISED = 'srp'; + public static GUIDE_STATUS = 'guide'; + public static MUTED = 'muted'; + public static PET_GESTURE_BLINK = 'eyb'; + public static PET_GESTURE_CRAZY = 'crz'; + public static PET_GESTURE_JOY = 'joy'; + public static PET_GESTURE_MISERABLE = 'mis'; + public static PET_GESTURE_PUZZLED = 'puz'; + public static PET_GESTURE_TONGUE = 'tng'; + public static PLAYING_GAME = 'playing_game'; + public static POSTURE = 'posture'; + public static POSTURE_FLOAT = 'float'; + public static POSTURE_LAY = 'lay'; + public static POSTURE_SIT = 'sit'; + public static POSTURE_STAND = 'std'; + public static POSTURE_SWIM = 'swim'; + public static POSTURE_WALK = 'mv'; + public static SIGN = 'sign'; + public static SLEEP = 'sleep'; + public static SNOWWAR_DIE_BACK = 'swdieback'; + public static SNOWWAR_DIE_FRONT = 'swdiefront'; + public static SNOWWAR_PICK = 'swpick'; + public static SNOWWAR_RUN = 'swrun'; + public static SNOWWAR_THROW = 'swthrow'; + public static TALK = 'talk'; + public static BLINK = 'blink'; + public static TYPING = 'typing'; + public static USE_OBJECT = 'usei'; + public static VOTE = 'vote'; + + public static GESTURE_MAP = [ '', AvatarAction.GESTURE_SMILE, AvatarAction.GESTURE_AGGRAVATED, AvatarAction.GESTURE_SURPRISED, AvatarAction.GESTURE_SAD, AvatarAction.PET_GESTURE_JOY, AvatarAction.PET_GESTURE_CRAZY, AvatarAction.PET_GESTURE_TONGUE, AvatarAction.PET_GESTURE_BLINK, AvatarAction.PET_GESTURE_MISERABLE, AvatarAction.PET_GESTURE_PUZZLED ]; + + public static EXPRESSION_MAP = [ '', AvatarAction.EXPRESSION_WAVE, AvatarAction.EXPRESSION_BLOW_A_KISS, AvatarAction.EXPRESSION_LAUGH, AvatarAction.EXPRESSION_CRY, AvatarAction.EXPRESSION_IDLE, AvatarAction.DANCE, AvatarAction.EXPRESSION_RESPECT, AvatarAction.EXPRESSION_SNOWBOARD_OLLIE, AvatarAction.EXPRESSION_SNOWBORD_360, AvatarAction.EXPRESSION_RIDE_JUMP ]; + + public static getExpressionTimeout(expressionId: number): number + { + expressionId = parseInt(expressionId as any); + + switch(expressionId) + { + case 1: + return 5000; + case 2: + return 1400; + case 3: + return 2000; + case 4: + return 2000; + case 5: + return 0; + case 6: + return 700; + case 7: + return 2000; + case 8: + return 1500; + case 9: + return 1500; + case 10: + return 1500; + default: + return 0; + } + } + + public static getExpressionId(expression: string): number + { + return AvatarAction.EXPRESSION_MAP.indexOf(expression); + } + + public static getExpression(expressionId: number): string + { + if(expressionId > AvatarAction.EXPRESSION_MAP.length) return null; + + return AvatarAction.EXPRESSION_MAP[expressionId]; + } + + public static getGestureId(gesture: string): number + { + return AvatarAction.GESTURE_MAP.indexOf(gesture); + } + + public static getGesture(gestureId: number): string + { + if(gestureId > AvatarAction.GESTURE_MAP.length) return null; + + return AvatarAction.GESTURE_MAP[gestureId]; + } + + public static idToAvatarActionState(id: string): string + { + if(id === 'Lay') return 'lay'; + if(id === 'Float') return 'float'; + if(id === 'Swim') return 'swim'; + if(id === 'Sit') return 'sit'; + if(id === 'Respect') return 'respect'; + if(id === 'Wave') return 'wave'; + if(id === 'Idle') return 'idle'; + if(id === 'Dance') return 'dance'; + if(id === 'UseItem') return 'usei'; + if(id === 'CarryItem') return 'cri'; + if(id === 'Talk') return 'talk'; + if(id === 'Sleep') return 'Sleep'; + if(id === 'Move') return 'mv'; + + return 'std'; + } +} diff --git a/packages/api/src/nitro/avatar/enum/AvatarDirectionAngle.ts b/packages/api/src/nitro/avatar/enum/AvatarDirectionAngle.ts new file mode 100644 index 0000000..83f9288 --- /dev/null +++ b/packages/api/src/nitro/avatar/enum/AvatarDirectionAngle.ts @@ -0,0 +1,7 @@ +export class AvatarDirectionAngle +{ + public static DIRECTION_TO_ANGLE: number[] = [45, 90, 135, 180, 225, 270, 315, 0]; + public static DIRECTION_IS_FLIPPED: boolean[] = [false, false, false, false, true, true, true, false]; + public static MIN_DIRECTION: number = 0; + public static MAX_DIRECTION: number = 7; +} diff --git a/packages/api/src/nitro/avatar/enum/AvatarEditorFigureCategory.ts b/packages/api/src/nitro/avatar/enum/AvatarEditorFigureCategory.ts new file mode 100644 index 0000000..02e1801 --- /dev/null +++ b/packages/api/src/nitro/avatar/enum/AvatarEditorFigureCategory.ts @@ -0,0 +1,10 @@ +export class AvatarEditorFigureCategory +{ + public static GENERIC: string = 'hd'; + public static HEAD: string = 'head'; + public static TORSO: string = 'torso'; + public static LEGS: string = 'legs'; + public static HOTLOOKS: string = 'hotlooks'; + public static WARDROBE: string = 'wardrobe'; + public static EFFECTS: string = 'effects'; +} \ No newline at end of file diff --git a/packages/api/src/nitro/avatar/enum/AvatarEditorInstanceId.ts b/packages/api/src/nitro/avatar/enum/AvatarEditorInstanceId.ts new file mode 100644 index 0000000..82cfaae --- /dev/null +++ b/packages/api/src/nitro/avatar/enum/AvatarEditorInstanceId.ts @@ -0,0 +1,7 @@ +export class AvatarEditorInstanceId +{ + public static OWN_AVATAR_EDITOR: number = 0; + public static FURNITURE_AVATAR_EDITOR: number = 1; + public static BOT_EDITOR: number = 2; + public static DEV_TOOL_EDITOR: number = 3; +} diff --git a/packages/api/src/nitro/avatar/enum/AvatarEditorSideCategory.ts b/packages/api/src/nitro/avatar/enum/AvatarEditorSideCategory.ts new file mode 100644 index 0000000..8dfd979 --- /dev/null +++ b/packages/api/src/nitro/avatar/enum/AvatarEditorSideCategory.ts @@ -0,0 +1,5 @@ +export class AvatarEditorSideCategory +{ + public static NOTHING: string = 'nothing'; + public static WARDROBE: string = 'wardrobe'; +} \ No newline at end of file diff --git a/packages/api/src/nitro/avatar/enum/AvatarFigurePartType.ts b/packages/api/src/nitro/avatar/enum/AvatarFigurePartType.ts new file mode 100644 index 0000000..30bc564 --- /dev/null +++ b/packages/api/src/nitro/avatar/enum/AvatarFigurePartType.ts @@ -0,0 +1,29 @@ +export class AvatarFigurePartType +{ + public static BODY: string = 'bd'; + public static SHOES: string = 'sh'; + public static LEGS: string = 'lg'; + public static CHEST: string = 'ch'; + public static WAIST_ACCESSORY: string = 'wa'; + public static CHEST_ACCESSORY: string = 'ca'; + public static HEAD: string = 'hd'; + public static HAIR: string = 'hr'; + public static FACE_ACCESSORY: string = 'fa'; + public static EYE_ACCESSORY: string = 'ea'; + public static HEAD_ACCESSORY: string = 'ha'; + public static HEAD_ACCESSORY_EXTRA: string = 'he'; + public static COAT_CHEST: string = 'cc'; + public static CHEST_PRINT: string = 'cp'; + public static LEFT_HAND_ITEM: string = 'li'; + public static LEFT_HAND: string = 'lh'; + public static LEFT_SLEEVE: string = 'ls'; + public static RIGHT_HAND: string = 'rh'; + public static RIGHT_SLEEVE: string = 'rs'; + public static FACE: string = 'fc'; + public static EYES: string = 'ey'; + public static HAIR_BIG: string = 'hrb'; + public static RIGHT_HAND_ITEM: string = 'ri'; + public static LEFT_COAT_SLEEVE: string = 'lc'; + public static RIGHT_COAT_SLEEVE: string = 'rc'; + public static FIGURE_SETS: string[] = [ AvatarFigurePartType.SHOES, AvatarFigurePartType.LEGS, AvatarFigurePartType.CHEST, AvatarFigurePartType.WAIST_ACCESSORY, AvatarFigurePartType.CHEST_ACCESSORY, AvatarFigurePartType.HEAD, AvatarFigurePartType.HAIR, AvatarFigurePartType.FACE_ACCESSORY, AvatarFigurePartType.EYE_ACCESSORY, AvatarFigurePartType.HEAD_ACCESSORY, AvatarFigurePartType.HEAD_ACCESSORY_EXTRA, AvatarFigurePartType.COAT_CHEST, AvatarFigurePartType.CHEST_PRINT ]; +} diff --git a/packages/api/src/nitro/avatar/enum/AvatarGuideStatus.ts b/packages/api/src/nitro/avatar/enum/AvatarGuideStatus.ts new file mode 100644 index 0000000..48a5b3c --- /dev/null +++ b/packages/api/src/nitro/avatar/enum/AvatarGuideStatus.ts @@ -0,0 +1,6 @@ +export class AvatarGuideStatus +{ + public static NONE: number = 0; + public static GUIDE: number = 1; + public static REQUESTER: number = 2; +} \ No newline at end of file diff --git a/packages/api/src/nitro/avatar/enum/AvatarScaleType.ts b/packages/api/src/nitro/avatar/enum/AvatarScaleType.ts new file mode 100644 index 0000000..5933495 --- /dev/null +++ b/packages/api/src/nitro/avatar/enum/AvatarScaleType.ts @@ -0,0 +1,5 @@ +export class AvatarScaleType +{ + public static LARGE: string = 'h'; + public static SMALL: string = 'sh'; +} \ No newline at end of file diff --git a/packages/api/src/nitro/avatar/enum/AvatarSetType.ts b/packages/api/src/nitro/avatar/enum/AvatarSetType.ts new file mode 100644 index 0000000..38df0af --- /dev/null +++ b/packages/api/src/nitro/avatar/enum/AvatarSetType.ts @@ -0,0 +1,6 @@ +export class AvatarSetType +{ + public static FULL: string = 'full'; + public static HEAD: string = 'head'; + public static BODY: string = 'body'; +} \ No newline at end of file diff --git a/packages/api/src/nitro/avatar/enum/GeometryType.ts b/packages/api/src/nitro/avatar/enum/GeometryType.ts new file mode 100644 index 0000000..402c05f --- /dev/null +++ b/packages/api/src/nitro/avatar/enum/GeometryType.ts @@ -0,0 +1,8 @@ +export class GeometryType +{ + public static VERTICAL: string = 'vertical'; + public static SITTING: string = 'sitting'; + public static HORIZONTAL: string = 'horizontal'; + public static SWIM: string = 'swim'; + public static SNOWWARS_HORIZONTAL: string = 'swhorizontal'; +} \ No newline at end of file diff --git a/packages/api/src/nitro/avatar/enum/RenderMode.ts b/packages/api/src/nitro/avatar/enum/RenderMode.ts new file mode 100644 index 0000000..ff9f877 --- /dev/null +++ b/packages/api/src/nitro/avatar/enum/RenderMode.ts @@ -0,0 +1,7 @@ +export class RenderMode +{ + public static TOOL: string = 'tool'; + public static COMPONENT: string = 'component'; + public static ONLINE_TOOL: string = 'online_tool'; + public static LOCAL_ONLY: string = 'local_only'; +} \ No newline at end of file diff --git a/packages/api/src/nitro/avatar/enum/index.ts b/packages/api/src/nitro/avatar/enum/index.ts new file mode 100644 index 0000000..8ea559f --- /dev/null +++ b/packages/api/src/nitro/avatar/enum/index.ts @@ -0,0 +1,11 @@ +export * from './AvatarAction'; +export * from './AvatarDirectionAngle'; +export * from './AvatarEditorFigureCategory'; +export * from './AvatarEditorInstanceId'; +export * from './AvatarEditorSideCategory'; +export * from './AvatarFigurePartType'; +export * from './AvatarGuideStatus'; +export * from './AvatarScaleType'; +export * from './AvatarSetType'; +export * from './GeometryType'; +export * from './RenderMode'; diff --git a/packages/api/src/nitro/avatar/figuredata/IFigureData.ts b/packages/api/src/nitro/avatar/figuredata/IFigureData.ts new file mode 100644 index 0000000..86e7901 --- /dev/null +++ b/packages/api/src/nitro/avatar/figuredata/IFigureData.ts @@ -0,0 +1,8 @@ +import { IFigureDataPalette } from './IFigureDataPalette'; +import { IFigureDataSetType } from './IFigureDataSetType'; + +export interface IFigureData +{ + palettes?: IFigureDataPalette[]; + setTypes?: IFigureDataSetType[]; +} diff --git a/packages/api/src/nitro/avatar/figuredata/IFigureDataColor.ts b/packages/api/src/nitro/avatar/figuredata/IFigureDataColor.ts new file mode 100644 index 0000000..535dead --- /dev/null +++ b/packages/api/src/nitro/avatar/figuredata/IFigureDataColor.ts @@ -0,0 +1,8 @@ +export interface IFigureDataColor +{ + id?: number; + index?: number; + club?: number; + selectable?: boolean; + hexCode?: string; +} diff --git a/packages/api/src/nitro/avatar/figuredata/IFigureDataHiddenLayer.ts b/packages/api/src/nitro/avatar/figuredata/IFigureDataHiddenLayer.ts new file mode 100644 index 0000000..80f42e6 --- /dev/null +++ b/packages/api/src/nitro/avatar/figuredata/IFigureDataHiddenLayer.ts @@ -0,0 +1,4 @@ +export interface IFigureDataHiddenLayer +{ + partType?: string; +} diff --git a/packages/api/src/nitro/avatar/figuredata/IFigureDataPalette.ts b/packages/api/src/nitro/avatar/figuredata/IFigureDataPalette.ts new file mode 100644 index 0000000..f83fa06 --- /dev/null +++ b/packages/api/src/nitro/avatar/figuredata/IFigureDataPalette.ts @@ -0,0 +1,7 @@ +import { IFigureDataColor } from './IFigureDataColor'; + +export interface IFigureDataPalette +{ + id?: number; + colors?: IFigureDataColor[]; +} diff --git a/packages/api/src/nitro/avatar/figuredata/IFigureDataPart.ts b/packages/api/src/nitro/avatar/figuredata/IFigureDataPart.ts new file mode 100644 index 0000000..e57ef47 --- /dev/null +++ b/packages/api/src/nitro/avatar/figuredata/IFigureDataPart.ts @@ -0,0 +1,8 @@ +export interface IFigureDataPart +{ + id?: number; + type?: string; + colorable?: boolean; + index?: number; + colorindex?: number; +} diff --git a/packages/api/src/nitro/avatar/figuredata/IFigureDataSet.ts b/packages/api/src/nitro/avatar/figuredata/IFigureDataSet.ts new file mode 100644 index 0000000..f3c89d9 --- /dev/null +++ b/packages/api/src/nitro/avatar/figuredata/IFigureDataSet.ts @@ -0,0 +1,15 @@ +import { IFigureDataHiddenLayer } from './IFigureDataHiddenLayer'; +import { IFigureDataPart } from './IFigureDataPart'; + +export interface IFigureDataSet +{ + id?: number; + gender?: string; + club?: number; + colorable?: boolean; + selectable?: boolean; + preselectable?: boolean; + sellable?: boolean; + parts?: IFigureDataPart[]; + hiddenLayers?: IFigureDataHiddenLayer[]; +} diff --git a/packages/api/src/nitro/avatar/figuredata/IFigureDataSetType.ts b/packages/api/src/nitro/avatar/figuredata/IFigureDataSetType.ts new file mode 100644 index 0000000..d9a2d97 --- /dev/null +++ b/packages/api/src/nitro/avatar/figuredata/IFigureDataSetType.ts @@ -0,0 +1,12 @@ +import { IFigureDataSet } from './IFigureDataSet'; + +export interface IFigureDataSetType +{ + type?: string; + paletteId?: number; + mandatory_m_0?: boolean; + mandatory_f_0?: boolean; + mandatory_m_1?: boolean; + mandatory_f_1?: boolean; + sets?: IFigureDataSet[]; +} diff --git a/packages/api/src/nitro/avatar/figuredata/index.ts b/packages/api/src/nitro/avatar/figuredata/index.ts new file mode 100644 index 0000000..579987b --- /dev/null +++ b/packages/api/src/nitro/avatar/figuredata/index.ts @@ -0,0 +1,7 @@ +export * from './IFigureData'; +export * from './IFigureDataColor'; +export * from './IFigureDataHiddenLayer'; +export * from './IFigureDataPalette'; +export * from './IFigureDataPart'; +export * from './IFigureDataSet'; +export * from './IFigureDataSetType'; diff --git a/packages/api/src/nitro/avatar/index.ts b/packages/api/src/nitro/avatar/index.ts new file mode 100644 index 0000000..5c3213c --- /dev/null +++ b/packages/api/src/nitro/avatar/index.ts @@ -0,0 +1,13 @@ +export * from './IAvatarAssetDownloadLibrary'; +export * from './IAvatarEffectListener'; +export * from './IAvatarFigureContainer'; +export * from './IAvatarImage'; +export * from './IAvatarImageListener'; +export * from './IAvatarRenderManager'; +export * from './IEffectAssetDownloadLibrary'; +export * from './IOutfit'; +export * from './actions'; +export * from './animation'; +export * from './enum'; +export * from './figuredata'; +export * from './structure'; diff --git a/packages/api/src/nitro/avatar/structure/IFigurePart.ts b/packages/api/src/nitro/avatar/structure/IFigurePart.ts new file mode 100644 index 0000000..578725b --- /dev/null +++ b/packages/api/src/nitro/avatar/structure/IFigurePart.ts @@ -0,0 +1,9 @@ +export interface IFigurePart +{ + id: number; + type: string; + breed: number; + index: number; + colorLayerIndex: number; + paletteMap: number; +} diff --git a/packages/api/src/nitro/avatar/structure/IFigurePartSet.ts b/packages/api/src/nitro/avatar/structure/IFigurePartSet.ts new file mode 100644 index 0000000..7e1653e --- /dev/null +++ b/packages/api/src/nitro/avatar/structure/IFigurePartSet.ts @@ -0,0 +1,16 @@ +import { IFigurePart } from './IFigurePart'; + +export interface IFigurePartSet +{ + getPart(_arg_1: string, _arg_2: number): IFigurePart; + id: number; + type: string; + gender: string; + clubLevel: number; + isColorable: boolean; + isSelectable: boolean; + parts: IFigurePart[]; + hiddenLayers: string[]; + isPreSelectable: boolean; + isSellable: boolean; +} diff --git a/packages/api/src/nitro/avatar/structure/IFigureSetData.ts b/packages/api/src/nitro/avatar/structure/IFigureSetData.ts new file mode 100644 index 0000000..5ea24a6 --- /dev/null +++ b/packages/api/src/nitro/avatar/structure/IFigureSetData.ts @@ -0,0 +1,7 @@ +import { IFigureData } from '../figuredata'; + +export interface IFigureSetData +{ + parse(data: any): boolean; + appendJSON(data: IFigureData): boolean; +} diff --git a/packages/api/src/nitro/avatar/structure/IPalette.ts b/packages/api/src/nitro/avatar/structure/IPalette.ts new file mode 100644 index 0000000..8c5c0e2 --- /dev/null +++ b/packages/api/src/nitro/avatar/structure/IPalette.ts @@ -0,0 +1,9 @@ +import { IAdvancedMap } from '../../../utils'; +import { IPartColor } from './IPartColor'; + +export interface IPalette +{ + getColor(id: number): IPartColor; + id: number; + colors: IAdvancedMap; +} diff --git a/packages/api/src/nitro/avatar/structure/IPartColor.ts b/packages/api/src/nitro/avatar/structure/IPartColor.ts new file mode 100644 index 0000000..6978528 --- /dev/null +++ b/packages/api/src/nitro/avatar/structure/IPartColor.ts @@ -0,0 +1,8 @@ +export interface IPartColor +{ + id: number; + index: number; + clubLevel: number; + isSelectable: boolean; + rgb: number; +} diff --git a/packages/api/src/nitro/avatar/structure/ISetType.ts b/packages/api/src/nitro/avatar/structure/ISetType.ts new file mode 100644 index 0000000..9277a47 --- /dev/null +++ b/packages/api/src/nitro/avatar/structure/ISetType.ts @@ -0,0 +1,12 @@ +import { IAdvancedMap } from '../../../utils'; +import { IFigurePartSet } from './IFigurePartSet'; + +export interface ISetType +{ + getPartSet(_arg_1: number): IFigurePartSet; + isMandatory(_arg_1: string, _arg_2: number): boolean; + optionalFromClubLevel(_arg_1: string): number; + type: string; + paletteID: number; + partSets: IAdvancedMap; +} diff --git a/packages/api/src/nitro/avatar/structure/IStructureData.ts b/packages/api/src/nitro/avatar/structure/IStructureData.ts new file mode 100644 index 0000000..392e885 --- /dev/null +++ b/packages/api/src/nitro/avatar/structure/IStructureData.ts @@ -0,0 +1,12 @@ +import { IFigurePartSet } from './IFigurePartSet'; +import { IPalette } from './IPalette'; +import { ISetType } from './ISetType'; + +export interface IStructureData +{ + parse(data: any): boolean; + appendJSON(k: any): boolean; + getSetType(_arg_1: string): ISetType; + getPalette(_arg_1: number): IPalette; + getFigurePartSet(_arg_1: number): IFigurePartSet; +} diff --git a/packages/api/src/nitro/avatar/structure/index.ts b/packages/api/src/nitro/avatar/structure/index.ts new file mode 100644 index 0000000..4c63b05 --- /dev/null +++ b/packages/api/src/nitro/avatar/structure/index.ts @@ -0,0 +1,7 @@ +export * from './IFigurePart'; +export * from './IFigurePartSet'; +export * from './IFigureSetData'; +export * from './IPalette'; +export * from './IPartColor'; +export * from './ISetType'; +export * from './IStructureData'; diff --git a/packages/api/src/nitro/camera/IRoomCameraWidgetEffect.ts b/packages/api/src/nitro/camera/IRoomCameraWidgetEffect.ts new file mode 100644 index 0000000..43f29ff --- /dev/null +++ b/packages/api/src/nitro/camera/IRoomCameraWidgetEffect.ts @@ -0,0 +1,10 @@ +import { BLEND_MODES, ColorMatrix, Texture } from 'pixi.js'; + +export interface IRoomCameraWidgetEffect +{ + name: string; + minLevel: number; + texture: Texture; + colorMatrix: ColorMatrix; + blendMode: BLEND_MODES; +} diff --git a/packages/api/src/nitro/camera/IRoomCameraWidgetManager.ts b/packages/api/src/nitro/camera/IRoomCameraWidgetManager.ts new file mode 100644 index 0000000..bf557c0 --- /dev/null +++ b/packages/api/src/nitro/camera/IRoomCameraWidgetManager.ts @@ -0,0 +1,11 @@ +import { Texture } from 'pixi.js'; +import { IRoomCameraWidgetEffect } from './IRoomCameraWidgetEffect'; +import { IRoomCameraWidgetSelectedEffect } from './IRoomCameraWidgetSelectedEffect'; + +export interface IRoomCameraWidgetManager +{ + init(): Promise; + applyEffects(texture: Texture, selectedEffects: IRoomCameraWidgetSelectedEffect[], isZoomed: boolean): Promise; + effects: Map; + isLoaded: boolean; +} diff --git a/packages/api/src/nitro/camera/IRoomCameraWidgetSelectedEffect.ts b/packages/api/src/nitro/camera/IRoomCameraWidgetSelectedEffect.ts new file mode 100644 index 0000000..3bb3b2c --- /dev/null +++ b/packages/api/src/nitro/camera/IRoomCameraWidgetSelectedEffect.ts @@ -0,0 +1,7 @@ +import { IRoomCameraWidgetEffect } from './IRoomCameraWidgetEffect'; + +export interface IRoomCameraWidgetSelectedEffect +{ + effect: IRoomCameraWidgetEffect; + alpha: number; +} diff --git a/packages/api/src/nitro/camera/index.ts b/packages/api/src/nitro/camera/index.ts new file mode 100644 index 0000000..7c7db03 --- /dev/null +++ b/packages/api/src/nitro/camera/index.ts @@ -0,0 +1,3 @@ +export * from './IRoomCameraWidgetEffect'; +export * from './IRoomCameraWidgetManager'; +export * from './IRoomCameraWidgetSelectedEffect'; diff --git a/packages/api/src/nitro/enums/RelationshipStatusEnum.ts b/packages/api/src/nitro/enums/RelationshipStatusEnum.ts new file mode 100644 index 0000000..b64873c --- /dev/null +++ b/packages/api/src/nitro/enums/RelationshipStatusEnum.ts @@ -0,0 +1,10 @@ +export class RelationshipStatusEnum +{ + public static NONE: number = 0; + public static HEART: number = 1; + public static SMILE: number = 2; + public static BOBBA: number = 3; + + public static RELATIONSHIP_TYPES = [ 0, 1, 2, 3 ]; + public static RELATIONSHIP_NAMES: string[] = ['None', 'Heart', 'Smile', 'Bobba']; +} \ No newline at end of file diff --git a/packages/api/src/nitro/enums/ToolbarIconEnum.ts b/packages/api/src/nitro/enums/ToolbarIconEnum.ts new file mode 100644 index 0000000..d389a95 --- /dev/null +++ b/packages/api/src/nitro/enums/ToolbarIconEnum.ts @@ -0,0 +1,10 @@ +export class ToolbarIconEnum +{ + public static HOTEL_VIEW: string = 'hotel_view'; + public static HOME_ROOM: string = 'home_room'; + public static NAVIGATOR: string = 'navigator'; + public static CATALOG: string = 'catalog'; + public static INVENTORY: string = 'inventory'; + public static ME_MENU: string = 'me_menu'; + public static FRIEND_LIST: string = 'friendlist'; +} \ No newline at end of file diff --git a/packages/api/src/nitro/enums/index.ts b/packages/api/src/nitro/enums/index.ts new file mode 100644 index 0000000..98a436c --- /dev/null +++ b/packages/api/src/nitro/enums/index.ts @@ -0,0 +1,2 @@ +export * from './RelationshipStatusEnum'; +export * from './ToolbarIconEnum'; diff --git a/packages/api/src/nitro/index.ts b/packages/api/src/nitro/index.ts new file mode 100644 index 0000000..dcbd7f6 --- /dev/null +++ b/packages/api/src/nitro/index.ts @@ -0,0 +1,18 @@ +export * from './avatar'; +export * from './avatar/actions'; +export * from './avatar/animation'; +export * from './avatar/enum'; +export * from './avatar/figuredata'; +export * from './avatar/structure'; +export * from './camera'; +export * from './enums'; +export * from './localization'; +export * from './room'; +export * from './room/enums'; +export * from './room/object'; +export * from './room/object/data'; +export * from './room/object/data/type'; +export * from './room/utils'; +export * from './session'; +export * from './session/enum'; +export * from './sound'; diff --git a/packages/api/src/nitro/localization/ILocalizationManager.ts b/packages/api/src/nitro/localization/ILocalizationManager.ts new file mode 100644 index 0000000..86070d0 --- /dev/null +++ b/packages/api/src/nitro/localization/ILocalizationManager.ts @@ -0,0 +1,16 @@ +export interface ILocalizationManager +{ + init(): Promise; + getRomanNumeral(number: number): string; + getPreviousLevelBadgeId(badgeName: string): string; + hasValue(key: string): boolean; + getValue(key: string, doParams?: boolean): string; + getValueWithParameter(key: string, parameter: string, replacement: string): string; + getValueWithParameters(key: string, parameters: string[], replacements: string[]): string; + setValue(key: string, value: string): void; + registerParameter(key: string, parameter: string, value: string): void; + getBadgeName(key: string): string; + getBadgeDesc(key: string): string; + getBadgePointLimit(badge: string): number; + setBadgePointLimit(badge: string, point: number): void; +} diff --git a/packages/api/src/nitro/localization/index.ts b/packages/api/src/nitro/localization/index.ts new file mode 100644 index 0000000..3aee8f5 --- /dev/null +++ b/packages/api/src/nitro/localization/index.ts @@ -0,0 +1 @@ +export * from './ILocalizationManager'; diff --git a/packages/api/src/nitro/room/IGetImageListener.ts b/packages/api/src/nitro/room/IGetImageListener.ts new file mode 100644 index 0000000..54b585f --- /dev/null +++ b/packages/api/src/nitro/room/IGetImageListener.ts @@ -0,0 +1,7 @@ +import { Texture } from 'pixi.js'; + +export interface IGetImageListener +{ + imageReady(id: number, texture: Texture, image?: HTMLImageElement): void; + imageFailed(id: number): void; +} diff --git a/packages/api/src/nitro/room/IImageResult.ts b/packages/api/src/nitro/room/IImageResult.ts new file mode 100644 index 0000000..2d991a0 --- /dev/null +++ b/packages/api/src/nitro/room/IImageResult.ts @@ -0,0 +1,9 @@ +import { Texture } from 'pixi.js'; + +export interface IImageResult +{ + id: number; + data: Texture; + image: HTMLImageElement; + getImage(): Promise; +} diff --git a/packages/api/src/nitro/room/IPetColorResult.ts b/packages/api/src/nitro/room/IPetColorResult.ts new file mode 100644 index 0000000..f66417d --- /dev/null +++ b/packages/api/src/nitro/room/IPetColorResult.ts @@ -0,0 +1,10 @@ +export interface IPetColorResult +{ + readonly primaryColor: number; + readonly secondaryColor: number; + readonly breed: number; + readonly tag: string; + readonly id: string; + readonly isMaster: boolean; + readonly layerTags: string[]; +} diff --git a/packages/api/src/nitro/room/IRoomContentListener.ts b/packages/api/src/nitro/room/IRoomContentListener.ts new file mode 100644 index 0000000..375b146 --- /dev/null +++ b/packages/api/src/nitro/room/IRoomContentListener.ts @@ -0,0 +1,4 @@ +export interface IRoomContentListener +{ + onRoomContentLoaded(id: number, assetName: string, sucess: boolean): void; +} \ No newline at end of file diff --git a/packages/api/src/nitro/room/IRoomContentLoader.ts b/packages/api/src/nitro/room/IRoomContentLoader.ts new file mode 100644 index 0000000..7e4c956 --- /dev/null +++ b/packages/api/src/nitro/room/IRoomContentLoader.ts @@ -0,0 +1,33 @@ +import { Texture } from 'pixi.js'; +import { IGraphicAssetCollection } from '../../asset'; +import { IEventDispatcher } from '../../common'; +import { IRoomObject } from '../../room'; +import { IFurnitureData } from '../session'; +import { IPetColorResult } from './IPetColorResult'; +import { IRoomContentListener } from './IRoomContentListener'; + +export interface IRoomContentLoader +{ + init(): Promise; + processFurnitureData(furnitureData: IFurnitureData[]): void; + downloadAsset(type: string): Promise; + isLoaderType(type: string): boolean; + getCollection(name: string): IGraphicAssetCollection; + getPlaceholderName(type: string): string; + getCategoryForType(type: string): number; + setRoomObjectRoomId(object: IRoomObject, roomId: string): void; + getFurnitureFloorNameForTypeId(typeId: number): string; + getFurnitureWallNameForTypeId(typeId: number, extra?: string): string; + getFurnitureFloorColorIndex(typeId: number): number; + getFurnitureWallColorIndex(typeId: number): number; + getImage(name: string): HTMLImageElement; + getAssetIconUrl(type: string, colorIndex: string): string; + addAssetToCollection(collectionName: string, assetName: string, texture: Texture, override?: boolean): boolean; + getPetNameForType(type: number): string; + downloadImage(id: number, type: string, param: string, events?: IEventDispatcher): boolean; + getRoomObjectAdUrl(type: string): string; + getPetColorResult(petIndex: number, paletteIndex: number): IPetColorResult; + getPetColorResultsForTag(petIndex: number, tagName: string): IPetColorResult[]; + setIconListener(listener: IRoomContentListener): void; + pets: { [index: string]: number }; +} diff --git a/packages/api/src/nitro/room/IRoomCreator.ts b/packages/api/src/nitro/room/IRoomCreator.ts new file mode 100644 index 0000000..e342bce --- /dev/null +++ b/packages/api/src/nitro/room/IRoomCreator.ts @@ -0,0 +1,51 @@ +import { IRoomInstance, IRoomObjectController } from '../../room'; +import { IVector3D } from '../../utils'; +import { IObjectData, IRoomMapData } from './object'; +import { IFurnitureStackingHeightMap, ILegacyWallGeometry } from './utils'; + +export interface IRoomCreator +{ + destroyRoom(id: number): void; + getRoomInstance(roomId: number): IRoomInstance; + updateRoomInstancePlaneVisibility(roomId: number, wallVisible: boolean, floorVisible?: boolean): boolean; + updateRoomInstancePlaneThickness(roomId: number, wallThickness: number, floorThickness: number): boolean; + updateRoomInstancePlaneType(roomId: number, floorType?: string, wallType?: string, landscapeType?: string, _arg_5?: boolean): boolean; + removeRoomInstance(roomId: number): void; + createRoomInstance(roomId: number, roomMap: IRoomMapData): void; + setRoomSessionOwnUser(roomId: number, objectId: number): void; + setRoomInstanceModelName(roomId: number, name: string): void; + getFurnitureStackingHeightMap(roomId: number): IFurnitureStackingHeightMap; + setFurnitureStackingHeightMap(roomId: number, heightMap: IFurnitureStackingHeightMap): void; + getLegacyWallGeometry(roomId: number): ILegacyWallGeometry; + getRoomObject(roomId: number, objectId: number, category: number): IRoomObjectController; + getRoomObjectByIndex(roomId: number, index: number, category: number): IRoomObjectController; + getRoomObjectCursor(roomId: number): IRoomObjectController; + getRoomObjectUser(roomId: number, objectId: number): IRoomObjectController; + removeRoomObjectUser(roomId: number, objectId: number): void; + getRoomObjectFloor(roomId: number, objectId: number): IRoomObjectController; + addFurnitureFloor(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number): boolean; + addFurnitureFloorByTypeName(roomId: number, id: number, typeName: string, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number): boolean; + addFurnitureWall(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, extra: string, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, realRoomObject?: boolean): boolean; + removeRoomObjectFloor(roomId: number, objectId: number, userId?: number, _arg_4?: boolean): void; + removeRoomObjectWall(roomId: number, objectId: number, userId?: number): void; + updateRoomObjectFloor(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, state: number, data: IObjectData, extra?: number): boolean; + updateRoomObjectWall(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, state: number, extra?: string): boolean; + updateRoomObjectWallItemData(roomId: number, objectId: number, data: string): boolean; + updateRoomObjectFloorHeight(roomId: number, objectId: number, height: number): boolean; + updateRoomObjectFloorExpiration(roomId: number, objectId: number, expires: number): boolean; + updateRoomObjectWallExpiration(roomId: number, objectId: number, expires: number): boolean; + rollRoomObjectFloor(roomId: number, objectId: number, location: IVector3D, targetLocation: IVector3D): void; + addRoomObjectUser(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, headDirection: number, type: number, figure: string): boolean; + updateRoomObjectUserLocation(roomId: number, objectId: number, location: IVector3D, targetLocation: IVector3D, canStandUp?: boolean, baseY?: number, direction?: IVector3D, headDirection?: number): boolean; + updateRoomObjectUserAction(roomId: number, objectId: number, action: string, value: number, parameter?: string): boolean; + updateRoomObjectUserFigure(roomId: number, objectId: number, figure: string, gender?: string, subType?: string, isRiding?: boolean): boolean; + updateRoomObjectUserFlatControl(roomId: number, objectId: number, level: string): boolean; + updateRoomObjectUserEffect(roomId: number, objectId: number, effectId: number, delay?: number): boolean; + updateRoomObjectUserGesture(roomId: number, objectId: number, gestureId: number): boolean; + updateRoomObjectUserPetGesture(roomId: number, objectId: number, gesture: string): boolean; + updateRoomObjectUserPosture(roomId: number, objectId: number, type: string, parameter?: string): boolean; + updateRoomObjectUserOwn(roomId: number, objectId: number): void; + getPetTypeId(figure: string): number; + refreshTileObjectMap(k: number, _arg_2: string): void; + setRoomEngineGameMode(roomId: number, isPlaying: boolean): void; +} diff --git a/packages/api/src/nitro/room/IRoomEngine.ts b/packages/api/src/nitro/room/IRoomEngine.ts new file mode 100644 index 0000000..3aa3df4 --- /dev/null +++ b/packages/api/src/nitro/room/IRoomEngine.ts @@ -0,0 +1,89 @@ +import { Container, Point, Rectangle, RenderTexture, Texture } from 'pixi.js'; +import { IRoomGeometry, IRoomManager, IRoomObject, IRoomObjectController, IRoomRenderingCanvas } from '../../room'; +import { IVector3D } from '../../utils'; +import { IPetCustomPart } from '../session'; +import { IGetImageListener } from './IGetImageListener'; +import { IImageResult } from './IImageResult'; +import { IPetColorResult } from './IPetColorResult'; +import { IRoomObjectEventManager } from './IRoomObjectEventManager'; +import { IObjectData, IRoomMapData } from './object'; + +export interface IRoomEngine +{ + init(): Promise; + setActiveRoomId(roomId: number): void; + createRoomInstance(roomId: number, roomMap: IRoomMapData): void; + getRoomInstanceDisplay(roomId: number, id: number, width: number, height: number, scale: number): Container; + setRoomInstanceRenderingCanvasScale(roomId: number, canvasId: number, scale: number, point?: Point, offsetPoint?: Point, override?: boolean, asDelta?: boolean): void; + setRoomInstanceRenderingCanvasMask(roomId: number, canvasId: number, flag: boolean): void; + getRoomInstanceRenderingCanvas(roomId: number, canvasId?: number): IRoomRenderingCanvas; + getRoomInstanceRenderingCanvasOffset(roomId: number, canvasId?: number): Point; + setRoomInstanceRenderingCanvasOffset(roomId: number, canvasId: number, point: Point): boolean; + getRoomInstanceRenderingCanvasScale(roomId?: number, canvasId?: number): number; + initializeRoomInstanceRenderingCanvas(roomId: number, canvasId: number, width: number, height: number): void; + updateRoomInstancePlaneVisibility(roomId: number, wallVisible: boolean, floorVisible?: boolean): boolean; + updateRoomInstancePlaneThickness(roomId: number, wallThickness: number, floorThickness: number): boolean; + updateRoomInstancePlaneType(roomId: number, floorType?: string, wallType?: string, landscapeType?: string, _arg_5?: boolean): boolean; + updateObjectRoomColor(k: number, _arg_2: number, _arg_3: number, _arg_4: boolean): boolean; + getRoomInstanceGeometry(roomId: number, canvasId?: number): IRoomGeometry; + getRoomInstanceVariable(roomId: number, key: string): T; + getTotalObjectsForManager(roomId: number, category: number): number; + getRoomObject(roomId: number, objectId: number, category: number): IRoomObjectController; + getRoomObjectByIndex(roomId: number, index: number, category: number): IRoomObjectController; + removeRoomObjectFloor(roomId: number, objectId: number, userId?: number, _arg_4?: boolean): void; + removeRoomObjectWall(roomId: number, objectId: number, userId?: number): void; + removeRoomObjectUser(roomId: number, objectId: number): void; + getRoomObjects(roomId: number, category: number): IRoomObject[]; + getRoomObjectCount(roomId: number, categoryId: number): number; + getRoomObjectBoundingRectangle(roomId: number, objectId: number, category: number, canvasId: number): Rectangle; + getRoomObjectScreenLocation(roomId: number, objectId: number, objectType: number, canvasId?: number): Point; + getGenericRoomObjectImage(type: string, value: string, direction: IVector3D, scale: number, listener: IGetImageListener, bgColor?: number, extras?: string, objectData?: IObjectData, state?: number, frameCount?: number, posture?: string, originalId?: number): IImageResult; + getFurnitureFloorIconUrl(typeId: number): string; + getFurnitureFloorIcon(typeId: number, listener: IGetImageListener, extras?: string, objectData?: IObjectData): IImageResult; + getFurnitureWallIconUrl(typeId: number, extra?: string): string; + getFurnitureWallIcon(typeId: number, listener: IGetImageListener, extras?: string): IImageResult; + updateRoomObjectWallLocation(roomId: number, objectId: number, location: IVector3D): boolean; + addRoomObjectUser(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, headDirection: number, type: number, figure: string): boolean; + updateRoomObjectUserLocation(roomId: number, objectId: number, location: IVector3D, targetLocation: IVector3D, canStandUp?: boolean, baseY?: number, direction?: IVector3D, headDirection?: number): boolean; + addFurnitureFloor(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number): boolean; + addFurnitureFloorByTypeName(roomId: number, id: number, typeName: string, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number): boolean; + addFurnitureWall(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, extra: string, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, realRoomObject?: boolean): boolean; + initalizeTemporaryObjectsByType(type: string, _arg_2: boolean): void; + updateRoomObjectFloor(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, state: number, data: IObjectData, extra?: number): boolean; + updateRoomObjectWall(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, state: number, extra?: string): boolean; + updateRoomObjectUserAction(roomId: number, objectId: number, action: string, value: number, parameter?: string): boolean; + updateRoomObjectUserFigure(roomId: number, objectId: number, figure: string, gender?: string, subType?: string, isRiding?: boolean): boolean; + updateRoomObjectUserEffect(roomId: number, objectId: number, effectId: number, delay?: number): boolean; + updateRoomObjectUserGesture(roomId: number, objectId: number, gestureId: number): boolean; + updateRoomObjectUserPosture(roomId: number, objectId: number, type: string, parameter?: string): boolean; + getFurnitureFloorImage(typeId: number, direction: IVector3D, scale: number, listener: IGetImageListener, bgColor?: number, extras?: string, state?: number, frameCount?: number, objectData?: IObjectData): IImageResult; + getFurnitureWallImage(typeId: number, direction: IVector3D, scale: number, listener: IGetImageListener, bgColor?: number, extras?: string, state?: number, frameCount?: number): IImageResult; + getRoomObjectImage(roomId: number, objectId: number, category: number, direction: IVector3D, scale: number, listener: IGetImageListener, bgColor?: number): IImageResult; + getRoomObjectPetImage(typeId: number, paletteId: number, color: number, direction: IVector3D, scale: number, listener: IGetImageListener, headOnly?: boolean, bgColor?: number, customParts?: IPetCustomPart[], posture?: string): IImageResult; + getFurnitureFloorName(typeId: number): string; + getFurnitureWallName(typeId: number, extra?: string): string; + selectRoomObject(roomId: number, objectId: number, objectCategory: number): void; + setSelectedAvatar(roomId: number, objectId: number): void; + cancelRoomObjectInsert(): void; + getPetColorResult(petIndex: number, paletteIndex: number): IPetColorResult; + getPetColorResultsForTag(petIndex: number, tagName: string): IPetColorResult[]; + cancelRoomObjectPlacement(): void; + useRoomObject(objectId: number, category: number): boolean; + objectInitialized(roomId: string, objectId: number, category: number): void; + changeObjectModelData(roomId: number, objectId: number, category: number, numberKey: string, numberValue: number): boolean; + changeObjectState(roomId: number, objectId: number, category: number): void; + processRoomObjectOperation(objectId: number, category: number, operation: string): boolean; + modifyRoomObjectDataWithMap(objectId: number, category: number, operation: string, data: Map): boolean + modifyRoomObjectData(objectId: number, category: number, colorHex: string, data: string): boolean + processRoomObjectPlacement(placementSource: string, id: number, category: number, typeId: number, legacyString?: string, stuffData?: IObjectData, state?: number, frameNumber?: number, posture?: string): boolean; + dispatchMouseEvent(canvasId: number, x: number, y: number, type: string, altKey: boolean, ctrlKey: boolean, shiftKey: boolean, buttonDown: boolean): void; + createTextureFromRoom(roomId: number, canvasId?: number, bounds?: Rectangle): Texture; + saveTextureAsScreenshot(texture: RenderTexture, saveAsThumbnail?: boolean): Promise; + saveBase64AsScreenshot(base64: string, saveAsThumbnail?: boolean): void; + deleteRoomObject(objectId: number, objectCategory: number): boolean; + roomManager: IRoomManager; + objectEventHandler: IRoomObjectEventManager; + activeRoomId: number; + selectedAvatarId: number; + isDecorating: boolean; +} diff --git a/packages/api/src/nitro/room/IRoomEngineServices.ts b/packages/api/src/nitro/room/IRoomEngineServices.ts new file mode 100644 index 0000000..563467e --- /dev/null +++ b/packages/api/src/nitro/room/IRoomEngineServices.ts @@ -0,0 +1,41 @@ +import { IRoomInstance, IRoomObjectController, IRoomRenderingCanvas } from '../../room'; +import { IVector3D } from '../../utils'; +import { ISelectedRoomObjectData } from './ISelectedRoomObjectData'; +import { IObjectData } from './object'; +import { IFurnitureStackingHeightMap, ILegacyWallGeometry, ITileObjectMap } from './utils'; + +export interface IRoomEngineServices +{ + getRoomInstance(roomId: number): IRoomInstance; + getActiveRoomInstanceRenderingCanvas(): IRoomRenderingCanvas; + addRoomInstanceFloorHole(roomId: number, objectId: number): void; + removeRoomInstanceFloorHole(roomId: number, objectId: number): void; + getSelectedRoomObjectData(roomId: number): ISelectedRoomObjectData; + setSelectedRoomObjectData(roomId: number, data: ISelectedRoomObjectData): void; + getPlacedRoomObjectData(roomId: number): ISelectedRoomObjectData; + setPlacedRoomObjectData(roomId: number, data: ISelectedRoomObjectData): void; + getLegacyWallGeometry(roomId: number): ILegacyWallGeometry; + getFurnitureStackingHeightMap(roomId: number): IFurnitureStackingHeightMap; + getRoomObject(roomId: number, objectId: number, category: number): IRoomObjectController; + getRoomObjectByIndex(roomId: number, index: number, category: number): IRoomObjectController; + getRoomObjectCategoryForType(type: string): number; + getRoomObjectCursor(roomId: number): IRoomObjectController; + getRoomObjectSelectionArrow(roomId: number): IRoomObjectController; + addRoomObjectUser(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, headDirection: number, type: number, figure: string): boolean; + addFurnitureFloor(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number): boolean; + addFurnitureFloorByTypeName(roomId: number, id: number, typeName: string, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number): boolean; + addFurnitureWall(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, extra: string, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, realRoomObject?: boolean): boolean; + removeRoomObjectFloor(roomId: number, objectId: number, userId?: number, _arg_4?: boolean): void; + removeRoomObjectWall(roomId: number, objectId: number, userId?: number): void; + removeRoomObjectUser(roomId: number, objectId: number): void; + loadRoomObjectBadgeImage(roomId: number, objectId: number, objectCategory: number, badgeId: string, groupBadge?: boolean): void; + updateRoomObjectMask(roomId: number, objectId: number, _arg_?: boolean): void; + setObjectMoverIconSprite(objectId: number, category: number, _arg_3: boolean, instanceData?: string, stuffData?: IObjectData, state?: number, frameNumber?: number, posture?: string): void; + setObjectMoverIconSpriteVisible(k: boolean): void; + updateMousePointer(type: string, objectId: number, objectType: string): void; + removeObjectMoverIconSprite(): void; + getRoomTileObjectMap(k: number): ITileObjectMap; + isPlayingGame(): boolean; + activeRoomId: number; + isDecorating: boolean; +} diff --git a/packages/api/src/nitro/room/IRoomObjectEventManager.ts b/packages/api/src/nitro/room/IRoomObjectEventManager.ts new file mode 100644 index 0000000..4f0cec3 --- /dev/null +++ b/packages/api/src/nitro/room/IRoomObjectEventManager.ts @@ -0,0 +1,6 @@ +import { IRoomObjectController } from '../../room'; + +export interface IRoomObjectEventManager +{ + getValidRoomObjectDirection(k: IRoomObjectController, _arg_2: boolean): number; +} diff --git a/packages/api/src/nitro/room/ISelectedRoomObjectData.ts b/packages/api/src/nitro/room/ISelectedRoomObjectData.ts new file mode 100644 index 0000000..bd46883 --- /dev/null +++ b/packages/api/src/nitro/room/ISelectedRoomObjectData.ts @@ -0,0 +1,18 @@ +import { IVector3D } from '../../utils'; +import { IObjectData } from './object'; + +export interface ISelectedRoomObjectData +{ + id: number; + category: number; + operation: string; + loc: IVector3D; + dir: IVector3D; + typeId: number; + instanceData: string; + stuffData: IObjectData; + state: number; + animFrame: number; + posture: string; + dispose: () => void; +} diff --git a/packages/api/src/nitro/room/enums/FriendFurniEngravingWidgetType.ts b/packages/api/src/nitro/room/enums/FriendFurniEngravingWidgetType.ts new file mode 100644 index 0000000..47a95f9 --- /dev/null +++ b/packages/api/src/nitro/room/enums/FriendFurniEngravingWidgetType.ts @@ -0,0 +1,8 @@ +export class FriendFurniEngravingWidgetType +{ + public static readonly LOVE_LOCK: number = 0; + public static readonly CARVE_A_TREE: number = 1; + public static readonly FRIENDS_PORTRAIT: number = 2; + public static readonly WILD_WEST_WANTED: number = 3; + public static readonly HABBOWEEN: number = 4; +} diff --git a/packages/api/src/nitro/room/enums/RoomObjectPlacementSource.ts b/packages/api/src/nitro/room/enums/RoomObjectPlacementSource.ts new file mode 100644 index 0000000..629bec4 --- /dev/null +++ b/packages/api/src/nitro/room/enums/RoomObjectPlacementSource.ts @@ -0,0 +1,5 @@ +export class RoomObjectPlacementSource +{ + public static CATALOG: string = 'catalog'; + public static INVENTORY: string = 'inventory'; +} diff --git a/packages/api/src/nitro/room/enums/index.ts b/packages/api/src/nitro/room/enums/index.ts new file mode 100644 index 0000000..0ea238d --- /dev/null +++ b/packages/api/src/nitro/room/enums/index.ts @@ -0,0 +1,2 @@ +export * from './FriendFurniEngravingWidgetType'; +export * from './RoomObjectPlacementSource'; diff --git a/packages/api/src/nitro/room/index.ts b/packages/api/src/nitro/room/index.ts new file mode 100644 index 0000000..e10262d --- /dev/null +++ b/packages/api/src/nitro/room/index.ts @@ -0,0 +1,15 @@ +export * from './enums'; +export * from './IGetImageListener'; +export * from './IImageResult'; +export * from './IPetColorResult'; +export * from './IRoomContentListener'; +export * from './IRoomContentLoader'; +export * from './IRoomCreator'; +export * from './IRoomEngine'; +export * from './IRoomEngineServices'; +export * from './IRoomObjectEventManager'; +export * from './ISelectedRoomObjectData'; +export * from './object'; +export * from './object/data'; +export * from './object/data/type'; +export * from './utils'; diff --git a/packages/api/src/nitro/room/object/IPetFigureData.ts b/packages/api/src/nitro/room/object/IPetFigureData.ts new file mode 100644 index 0000000..d10bb50 --- /dev/null +++ b/packages/api/src/nitro/room/object/IPetFigureData.ts @@ -0,0 +1,12 @@ +import { IPetCustomPart } from '../../session'; + +export interface IPetFigureData +{ + readonly typeId: number; + readonly paletteId: number; + readonly color: string; + readonly breedId: number; + readonly figuredata: string; + readonly customParts: IPetCustomPart[]; + readonly customPartCount: number; +} diff --git a/packages/api/src/nitro/room/object/IRoomMapData.ts b/packages/api/src/nitro/room/object/IRoomMapData.ts new file mode 100644 index 0000000..1ebf36c --- /dev/null +++ b/packages/api/src/nitro/room/object/IRoomMapData.ts @@ -0,0 +1,11 @@ +export interface IRoomMapData +{ + width: number; + height: number; + wallHeight: number; + fixedWallsHeight: number; + tileMap: { height: number }[][]; + holeMap: { id: number, x: number, y: number, width: number, height: number }[]; + doors: { x: number, y: number, z: number, dir: number }[]; + dimensions: { minX: number, maxX: number, minY: number, maxY: number }; +} diff --git a/packages/api/src/nitro/room/object/RoomObjectCategory.ts b/packages/api/src/nitro/room/object/RoomObjectCategory.ts new file mode 100644 index 0000000..6e93273 --- /dev/null +++ b/packages/api/src/nitro/room/object/RoomObjectCategory.ts @@ -0,0 +1,9 @@ +export class RoomObjectCategory +{ + public static MINIMUM: number = -2; + public static ROOM: number = 0; + public static FLOOR: number = 10; + public static WALL: number = 20; + public static UNIT: number = 100; + public static CURSOR: number = 200; +} \ No newline at end of file diff --git a/packages/api/src/nitro/room/object/RoomObjectLogicType.ts b/packages/api/src/nitro/room/object/RoomObjectLogicType.ts new file mode 100644 index 0000000..bb16bef --- /dev/null +++ b/packages/api/src/nitro/room/object/RoomObjectLogicType.ts @@ -0,0 +1,74 @@ +export class RoomObjectLogicType +{ + public static FURNITURE_BASIC = 'furniture_basic'; + public static FURNITURE_MULTISTATE = 'furniture_multistate'; + public static FURNITURE_MULTIHEIGHT = 'furniture_multiheight'; + public static FURNITURE_RANDOMSTATE = 'furniture_randomstate'; + public static FURNITURE_PLACEHOLDER = 'furniture_placeholder'; + public static FURNITURE_CREDIT = 'furniture_credit'; + public static FURNITURE_STICKIE = 'furniture_stickie'; + public static FURNITURE_PRESENT = 'furniture_present'; + public static FURNITURE_TROPHY = 'furniture_trophy'; + public static FURNITURE_ECOTRON_BOX = 'furniture_ecotron_box'; + public static FURNITURE_DICE = 'furniture_dice'; + public static FURNITURE_HOCKEY_SCORE = 'furniture_hockey_score'; + public static FURNITURE_HABBOWHEEL = 'furniture_habbowheel'; + public static FURNITURE_ONE_WAY_DOOR = 'furniture_one_way_door'; + public static FURNITURE_PLANET_SYSTEM = 'furniture_planet_system'; + public static FURNITURE_WINDOW = 'furniture_window'; + public static FURNITURE_EXTERNAL_IMAGE_WALLITEM = 'furniture_external_image_wallitem'; + public static FURNITURE_ROOMDIMMER = 'furniture_roomdimmer'; + public static FURNITURE_SOUND_MACHINE = 'furniture_sound_machine'; + public static FURNITURE_JUKEBOX = 'furniture_jukebox'; + public static FURNITURE_CRACKABLE = 'furniture_crackable'; + public static FURNITURE_PUSHABLE = 'furniture_pushable'; + public static FURNITURE_CLOTHING_CHANGE = 'furniture_clothing_change'; + public static FURNITURE_COUNTER_CLOCK = 'furniture_counter_clock'; + public static FURNITURE_SCORE = 'furniture_score'; + public static FURNITURE_ES = 'furniture_es'; + public static FURNITURE_FIREWORKS = 'furniture_fireworks'; + public static FURNITURE_SONG_DISK = 'furniture_song_disk'; + public static FURNITURE_BB = 'furniture_bb'; + public static FURNITURE_BG = 'furniture_bg'; + public static FURNITURE_WELCOME_GIFT = 'furniture_welcome_gift'; + public static FURNITURE_FLOOR_HOLE = 'furniture_floor_hole'; + public static FURNITURE_MANNEQUIN = 'furniture_mannequin'; + public static FURNITURE_GUILD_CUSTOMIZED = 'furniture_guild_customized'; + public static FURNITURE_GROUP_FORUM_TERMINAL = 'furniture_group_forum_terminal'; + public static FURNITURE_PET_CUSTOMIZATION = 'furniture_pet_customization'; + public static FURNITURE_CUCKOO_CLOCK = 'furniture_cuckoo_clock'; + public static FURNITURE_VOTE_COUNTER = 'furniture_vote_counter'; + public static FURNITURE_VOTE_MAJORITY = 'furniture_vote_majority'; + public static FURNITURE_SOUNDBLOCK = 'furniture_soundblock'; + public static FURNITURE_RANDOM_TELEPORT = 'furniture_random_teleport'; + public static FURNITURE_MONSTERPLANT_SEED = 'furniture_monsterplant_seed'; + public static FURNITURE_PURCHASABLE_CLOTHING = 'furniture_purchasable_clothing'; + public static FURNITURE_BACKGROUND_COLOR = 'furniture_background_color'; + public static FURNITURE_MYSTERYBOX = 'furniture_mysterybox'; + public static FURNITURE_EFFECTBOX = 'furniture_effectbox'; + public static FURNITURE_MYSTERYTROPHY = 'furniture_mysterytrophy'; + public static FURNITURE_ACHIEVEMENT_RESOLUTION = 'furniture_achievement_resolution'; + public static FURNITURE_LOVELOCK = 'furniture_lovelock'; + public static FURNITURE_WILDWEST_WANTED = 'furniture_wildwest_wanted'; + public static FURNITURE_HWEEN_LOVELOCK = 'furniture_hween_lovelock'; + public static FURNITURE_BADGE_DISPLAY = 'furniture_badge_display'; + public static FURNITURE_HIGH_SCORE = 'furniture_high_score'; + public static FURNITURE_INTERNAL_LINK = 'furniture_internal_link'; + public static FURNITURE_CUSTOM_STACK_HEIGHT = 'furniture_custom_stack_height'; + public static FURNITURE_YOUTUBE = 'furniture_youtube'; + public static FURNITURE_RENTABLE_SPACE = 'furniture_rentable_space'; + public static FURNITURE_CHANGE_STATE_WHEN_STEP_ON = 'furniture_change_state_when_step_on'; + public static FURNITURE_VIMEO = 'furniture_vimeo'; + public static FURNITURE_EDITABLE_INTERNAL_LINK = 'furniture_editable_internal_link'; + public static FURNITURE_EDITABLE_ROOM_LINK = 'furniture_editable_room_link'; + public static FURNITURE_CRAFTING_GIZMO = 'furniture_crafting_gizmo'; + public static ROOM = 'room'; + public static USER = 'user'; + public static BOT = 'bot'; + public static RENTABLE_BOT = 'rentable_bot'; + public static PET = 'pet'; + public static TILE_CURSOR = 'tile_cursor'; + public static SELECTION_ARROW = 'selection_arrow'; + public static GAME_SNOWBALL = 'game_snowball'; + public static GAME_SNOWSPLASH = 'game_snowsplash'; +} \ No newline at end of file diff --git a/packages/api/src/nitro/room/object/RoomObjectOperationType.ts b/packages/api/src/nitro/room/object/RoomObjectOperationType.ts new file mode 100644 index 0000000..61b8b83 --- /dev/null +++ b/packages/api/src/nitro/room/object/RoomObjectOperationType.ts @@ -0,0 +1,15 @@ +export class RoomObjectOperationType +{ + public static OBJECT_UNDEFINED: string = 'OBJECT_UNDEFINED'; + public static OBJECT_MOVE: string = 'OBJECT_MOVE'; + public static OBJECT_PLACE: string = 'OBJECT_PLACE'; + public static OBJECT_ROTATE_POSITIVE: string = 'OBJECT_ROTATE_POSITIVE'; + public static OBJECT_ROTATE_NEGATIVE: string = 'OBJECT_ROTATE_NEGATIVE'; + public static OBJECT_MOVE_TO: string = 'OBJECT_MOVE_TO'; + public static OBJECT_PLACE_TO: string = 'OBJECT_PLACE_TO'; + public static OBJECT_PICKUP: string = 'OBJECT_PICKUP'; + public static OBJECT_PICKUP_BOT: string = 'OBJECT_PICKUP_BOT'; + public static OBJECT_PICKUP_PET: string = 'OBJECT_PICKUP_PET'; + public static OBJECT_EJECT: string = 'OBJECT_EJECT'; + public static OBJECT_SAVE_STUFF_DATA: string = 'OBJECT_SAVE_STUFF_DATA'; +} \ No newline at end of file diff --git a/packages/api/src/nitro/room/object/RoomObjectType.ts b/packages/api/src/nitro/room/object/RoomObjectType.ts new file mode 100644 index 0000000..dbfc3c7 --- /dev/null +++ b/packages/api/src/nitro/room/object/RoomObjectType.ts @@ -0,0 +1,7 @@ +export class RoomObjectType +{ + public static USER: number = 1; + public static PET: number = 2; + public static BOT: number = 3; + public static RENTABLE_BOT: number = 4; +} \ No newline at end of file diff --git a/packages/api/src/nitro/room/object/RoomObjectUserType.ts b/packages/api/src/nitro/room/object/RoomObjectUserType.ts new file mode 100644 index 0000000..e476a24 --- /dev/null +++ b/packages/api/src/nitro/room/object/RoomObjectUserType.ts @@ -0,0 +1,40 @@ +export class RoomObjectUserType +{ + public static USER: string = 'user'; + public static PET: string = 'pet'; + public static BOT: string = 'bot'; + public static RENTABLE_BOT: string = 'rentable_bot'; + public static MONSTER_PLANT: string = 'monsterplant'; + public static AVATAR_TYPES: { [key: string]: number } = { 'user': 1, 'pet': 2, 'bot': 3, 'rentable_bot': 4 }; + + public static getTypeNumber(type: string): number + { + return RoomObjectUserType.AVATAR_TYPES[type]; + } + + public static getTypeString(type: number): string + { + for(const key in RoomObjectUserType.AVATAR_TYPES) + { + if(!key) continue; + + if(RoomObjectUserType.AVATAR_TYPES[key] !== type) continue; + + return key; + } + + return null; + } + + public static getRealType(type: string): string + { + switch(type) + { + case RoomObjectUserType.BOT: + case RoomObjectUserType.RENTABLE_BOT: + return RoomObjectUserType.USER; + default: + return type; + } + } +} \ No newline at end of file diff --git a/packages/api/src/nitro/room/object/RoomObjectVariable.ts b/packages/api/src/nitro/room/object/RoomObjectVariable.ts new file mode 100644 index 0000000..3819ca5 --- /dev/null +++ b/packages/api/src/nitro/room/object/RoomObjectVariable.ts @@ -0,0 +1,144 @@ +export class RoomObjectVariable +{ + public static OBJECT_ROOM_ID: string = 'object_room_id'; + public static OBJECT_ACCURATE_Z_VALUE: string = 'object_accurate_z_value'; + public static TILE_CURSOR_HEIGHT: string = 'tile_cursor_height'; + public static FIGURE: string = 'figure'; + public static GENDER: string = 'gender'; + public static OWN_USER: string = 'own_user'; + public static FIGURE_CAN_STAND_UP: string = 'figure_can_stand_up'; + public static FIGURE_VERTICAL_OFFSET: string = 'figure_vertical_offset'; + public static FIGURE_TALK: string = 'figure_talk'; + public static FIGURE_DANCE: string = 'figure_dance'; + public static FIGURE_SLEEP: string = 'figure_sleep'; + public static FIGURE_BLINK: string = 'figure_blink'; + public static FIGURE_EFFECT: string = 'figure_effect'; + public static FIGURE_CARRY_OBJECT: string = 'figure_carry_object'; + public static FIGURE_USE_OBJECT: string = 'figure_use_object'; + public static FIGURE_GESTURE: string = 'figure_gesture'; + public static FIGURE_POSTURE: string = 'figure_posture'; + public static FIGURE_POSTURE_PARAMETER: string = 'figure_posture_parameter'; + public static FIGURE_HIGHLIGHT_ENABLE: string = 'figure_highlight_enable'; + public static FIGURE_HIGHLIGHT: string = 'figure_highlight'; + public static FURNITURE_PURCHASER_NAME: string = 'furniture_purchaser_name'; + public static FURNITURE_PURCHASER_FIGURE: string = 'furniture_purchaser_figure'; + public static STD: string = 'std'; + public static FIGURE_SIGN: string = 'figure_sign'; + public static FIGURE_FLAT_CONTROL: string = 'figure_flat_control'; + public static FIGURE_IS_TYPING: string = 'figure_is_typing'; + public static FIGURE_IS_MUTED: string = 'figure_is_muted'; + public static FIGURE_GAINED_EXPERIENCE: string = 'figure_gained_experience'; + public static FIGURE_EXPERIENCE_TIMESTAMP: string = 'figure_experience_timestamp'; + public static FIGURE_NUMBER_VALUE: string = 'figure_number_value'; + public static FIGURE_IS_PLAYING_GAME: string = 'figure_is_playing_game'; + public static FIGURE_GUIDE_STATUS: string = 'figure_guide_status'; + public static FIGURE_EXPRESSION: string = 'figure_expression'; + public static HEAD_DIRECTION: string = 'head_direction'; + public static FURNITURE_CUSTOM_VARIABLES: string = 'furniture_custom_variables'; + public static FURNITURE_AUTOMATIC_STATE_INDEX: string = 'furniture_automatic_state_index'; + public static FURNITURE_ALWAYS_STACKABLE: string = 'furniture_always_stackable'; + public static FURNITURE_DISABLE_PICKING_ANIMATION: string = 'furniture_disable_picking_animation'; + public static FURNITURE_DATA_FORMAT: string = 'furniture_data_format'; + public static FURNITURE_UNIQUE_SERIAL_NUMBER: string = 'furniture_unique_serial_number'; + public static FURNITURE_UNIQUE_EDITION_SIZE: string = 'furniture_unique_edition_size'; + public static FURNITURE_CRACKABLE_STATE: string = 'furniture_crackable_state'; + public static FURNITURE_CRACKABLE_HITS: string = 'furniture_crackable_hits'; + public static FURNITURE_CRACKABLE_TARGET: string = 'furniture_crackable_target'; + public static FURNITURE_CREDIT_VALUE: string = 'furniture_credit_value'; + public static FURNITURE_DATA: string = 'furniture_data'; + public static FURNITURE_ITEMDATA: string = 'furniture_itemdata'; + public static FURNITURE_COLOR: string = 'furniture_color'; + public static FURNITURE_LIFT_AMOUNT: string = 'furniure_lift_amount'; + public static FURNITURE_GUILD_CUSTOMIZED_GUILD_ID: string = 'furniture_guild_customized_guild_id'; + public static FURNITURE_GUILD_CUSTOMIZED_ASSET_NAME: string = 'furniture_guild_customized_asset_name'; + public static FURNITURE_GUILD_CUSTOMIZED_COLOR_1: string = 'furniture_guild_customized_color_1'; + public static FURNITURE_GUILD_CUSTOMIZED_COLOR_2: string = 'furniture_guild_customized_color_2'; + public static FURNITURE_STATE_UPDATE_TIME: string = 'furniture_state_update_time'; + public static FURNITURE_SELECTION_DISABLED: string = 'furniture_selection_disabled'; + public static FURNITURE_SIZE_X: string = 'furniture_size_x'; + public static FURNITURE_SIZE_Y: string = 'furniture_size_y'; + public static FURNITURE_SIZE_Z: string = 'furniture_size_z'; + public static FURNITURE_CENTER_X: string = 'furniture_center_x'; + public static FURNITURE_CENTER_Y: string = 'furniture_center_y'; + public static FURNITURE_CENTER_Z: string = 'furniture_center_z'; + public static FURNITURE_ALLOWED_DIRECTIONS: string = 'furniture_allowed_directions'; + public static FURNITURE_AD_URL: string = 'furniture_ad_url'; + public static FURNITURE_TYPE_ID: string = 'furniture_type_id'; + public static FURNITURE_EXTRAS: string = 'furniture_extras'; + public static FURNITURE_EXPIRY_TIME: string = 'furniture_expiry_time'; + public static FURNITURE_EXPIRTY_TIMESTAMP: string = 'furniture_expiry_timestamp'; + public static FURNITURE_REAL_ROOM_OBJECT: string = 'furniture_real_room_object'; + public static FURNITURE_IS_STICKIE: string = 'furniture_is_stickie'; + public static FURNITURE_BRANDING_IMAGE_STATUS: string = 'furniture_branding_image_status'; + public static FURNITURE_BRANDING_IMAGE_URL: string = 'furniture_branding_image_url'; + public static FURNITURE_BRANDING_URL: string = 'furniture_branding_url'; + public static FURNITURE_BRANDING_OFFSET_X: string = 'furniture_branding_offset_x'; + public static FURNITURE_BRANDING_OFFSET_Y: string = 'furniture_branding_offset_y'; + public static FURNITURE_BRANDING_OFFSET_Z: string = 'furniture_branding_offset_z'; + public static FURNITURE_BADGE_IMAGE_STATUS: string = 'furniture_badge_image_status'; + public static FURNITURE_BADGE_ASSET_NAME: string = 'furniture_badge_asset_name'; + public static FURNITURE_BADGE_VISIBLE_IN_STATE: string = 'furniture_badge_visible_in_state'; + public static FURNITURE_ALPHA_MULTIPLIER: string = 'furniture_alpha_multiplier'; + public static FURNITURE_USAGE_POLICY: string = 'furniture_usage_policy'; + public static FURNITURE_OWNER_ID: string = 'furniture_owner_id'; + public static FURNITURE_OWNER_NAME: string = 'furniture_owner_name'; + public static FURNITURE_ROOM_BACKGROUND_COLOR_HUE: string = 'furniture_room_background_color_hue'; + public static FURNITURE_ROOM_BACKGROUND_COLOR_SATURATION: string = 'furniture_room_background_color_saturation'; + public static FURNITURE_ROOM_BACKGROUND_COLOR_LIGHTNESS: string = 'furniture_room_background_color_lightness'; + public static FURNITURE_USES_PLANE_MASK: string = 'furniture_uses_plane_mask'; + public static FURNITURE_PLANE_MASK_TYPE: string = 'furniture_plane_mask_type'; + public static FURNITURE_IS_VARIABLE_HEIGHT: string = 'furniture_is_variable_height'; + public static FURNITURE_VOTE_MAJORITY_RESULT: string = 'furniture_vote_majority_result'; + public static FURNITURE_VOTE_COUNTER_COUNT: string = 'furniture_vote_counter_count'; + public static FURNITURE_SOUNDBLOCK_RELATIVE_ANIMATION_SPEED: string = 'furniture_soundblock_relative_animation_speed'; + public static FURNITURE_MANNEQUIN_NAME: string = 'furniture_mannequin_name'; + public static FURNITURE_MANNEQUIN_GENDER: string = 'furniture_mannequin_gender'; + public static FURNITURE_MANNEQUIN_FIGURE: string = 'furniture_mannequin_figure'; + public static FURNITURE_HIGHSCORE_SCORE_TYPE: string = 'furniture_highscore_score_type'; + public static FURNITURE_HIGHSCORE_CLEAR_TYPE: string = 'furniture_highscore_clear_type'; + public static FURNITURE_HIGHSCORE_DATA_ENTRY_COUNT: string = 'furniture_highscore_data_entry_count'; + public static FURNITURE_HIGHSCORE_DATA_ENTRY_BASE_USERS_: string = 'furniture_highscore_data_entry_base_users_'; + public static FURNITURE_HIGHSCORE_DATA_ENTRY_BASE_SCORE_: string = 'furniture_highscore_data_entry_base_score_'; + public static FURNITURE_INTERNAL_LINK: string = 'furniture_internal_link'; + public static FURNITURE_CLOTHING_BOY: string = 'furniture_clothing_boy'; + public static FURNITURE_CLOTHING_GIRL: string = 'furniture_clothing_girl'; + public static FURNITURE_PLANETSYSTEM_DATA: string = 'furniture_planetsystem_data'; + public static FURNITURE_FIREWORKS_DATA: string = 'furniture_fireworks_data'; + public static PET_PALETTE_INDEX: string = 'pet_palette_index'; + public static PET_COLOR: string = 'pet_color'; + public static PET_HEAD_ONLY: string = 'pet_head_only'; + public static PET_CUSTOM_LAYER_IDS: string = 'pet_custom_layer_ids'; + public static PET_CUSTOM_PARTS_IDS: string = 'pet_custom_part_ids'; + public static PET_CUSTOM_PALETTE_IDS: string = 'pet_custom_palette_ids'; + public static PET_IS_RIDING: string = 'pet_is_riding'; + public static PET_TYPE: string = 'pet_type'; + public static PET_ALLOWED_DIRECTIONS: string = 'pet_allowed_directions'; + public static RACE: string = 'race'; + public static ROOM_MAP_DATA: string = 'room_map_data'; + public static ROOM_PLANE_MASK_XML: string = 'room_plane_mask_xml'; + public static ROOM_FLOOR_TYPE: string = 'room_floor_type'; + public static ROOM_WALL_TYPE: string = 'room_wall_type'; + public static ROOM_LANDSCAPE_TYPE: string = 'room_landscape_type'; + public static ROOM_WALL_THICKNESS: string = 'room_wall_thickness'; + public static ROOM_FLOOR_THICKNESS: string = 'room_floor_thickness'; + public static ROOM_FLOOR_HOLE_UPDATE_TIME: string = 'room_floor_hole_update_time'; + public static ROOM_FLOOR_VISIBILITY: string = 'room_floor_visibility'; + public static ROOM_WALL_VISIBILITY: string = 'room_wall_visibility'; + public static ROOM_LANDSCAPE_VISIBILITY: string = 'room_landscape_visibility'; + public static ROOM_DOOR_X: string = 'room_door_x'; + public static ROOM_DOOR_Y: string = 'room_door_y'; + public static ROOM_DOOR_Z: string = 'room_door_z'; + public static ROOM_DOOR_DIR: string = 'room_door_dir'; + public static ROOM_BACKGROUND_COLOR: string = 'room_background_color'; + public static ROOM_COLORIZE_BG_ONLY: string = 'room_colorize_bg_only'; + public static ROOM_RANDOM_SEED: string = 'room_random_seed'; + public static ROOM_WORLD_TYPE: string = 'room_world_type'; + public static ROOM_SELECTED_X: string = 'room_selected_x'; + public static ROOM_SELECTED_Y: string = 'room_selected_y'; + public static ROOM_SELECTED_Z: string = 'room_selected_z'; + public static ROOM_SELECTED_PLANE: string = 'room_selected_plane'; + public static IMAGE_QUERY_SCALE: string = 'image_query_scale'; + public static FURNITURE_FRIENDFURNI_ENGRAVING: string = 'furniture_friendfurni_engraving_type'; + public static SESSION_URL_PREFIX: string = 'session_url_prefix'; + public static SESSION_CURRENT_USER_ID: string = 'session_current_user_id'; +} diff --git a/packages/api/src/nitro/room/object/RoomObjectVisualizationType.ts b/packages/api/src/nitro/room/object/RoomObjectVisualizationType.ts new file mode 100644 index 0000000..0af0485 --- /dev/null +++ b/packages/api/src/nitro/room/object/RoomObjectVisualizationType.ts @@ -0,0 +1,40 @@ +export class RoomObjectVisualizationType +{ + public static FURNITURE_STATIC = 'furniture_static'; + public static FURNITURE_ANIMATED = 'furniture_animated'; + public static FURNITURE_RESETTING_ANIMATED = 'furniture_resetting_animated'; + public static FURNITURE_POSTER = 'furniture_poster'; + public static FURNITURE_EXTERNAL_IMAGE = 'furniture_external_image'; + public static FURNITURE_HABBOWHEEL = 'furniture_habbowheel'; + public static FURNITURE_VAL_RANDOMIZER = 'furniture_val_randomizer'; + public static FURNITURE_BOTTLE = 'furniture_bottle'; + public static FURNITURE_PLANET_SYSTEM = 'furniture_planet_system'; + public static FURNITURE_QUEUE_TILE = 'furniture_queue_tile'; + public static FURNITURE_PARTY_BEAMER = 'furniture_party_beamer'; + public static FURNITURE_CUBOID = 'furniture_cuboid'; + public static FURNITURE_GIFT_WRAPPED = 'furniture_gift_wrapped'; + public static FURNITURE_GIFT_WRAPPED_FIREWORKS = 'furniture_gift_wrapped_fireworks'; + public static FURNITURE_COUNTER_CLOCK = 'furniture_counter_clock'; + public static FURNITURE_WATER_AREA = 'furniture_water_area'; + public static FURNITURE_SCORE_BOARD = 'furniture_score_board'; + public static FURNITURE_FIREWORKS = 'furniture_fireworks'; + public static FURNITURE_BB = 'furniture_bb'; + public static FURNITURE_ISOMETRIC_BB = 'furniture_isometric_bb'; + public static FURNITURE_BG = 'furniture_bg'; + public static FURNITURE_STICKIE = 'furniture_stickie'; + public static FURNITURE_MANNEQUIN = 'furniture_mannequin'; + public static FURNITURE_GUILD_CUSTOMIZED = 'furniture_guild_customized'; + public static FURNITURE_GUILD_ISOMETRIC_BADGE = 'furniture_guild_isometric_badge'; + public static FURNITURE_VOTE_COUNTER = 'furniture_vote_counter'; + public static FURNITURE_VOTE_MAJORITY = 'furniture_vote_majority'; + public static FURNITURE_SOUNDBLOCK = 'furniture_soundblock'; + public static FURNITURE_BADGE_DISPLAY = 'furniture_badge_display'; + public static FURNITURE_YOUTUBE = 'furniture_youtube'; + public static FURNITURE_BUILDER_PLACEHOLDER = 'furniture_builder_placeholder'; + public static ROOM = 'room'; + public static USER = 'user'; + public static PET_ANIMATED = 'pet_animated'; + public static BOT = 'bot'; + public static RENTABLE_BOT = 'rentable_bot'; + public static TILE_CURSOR = 'tile_cursor'; +} diff --git a/packages/api/src/nitro/room/object/data/IObjectData.ts b/packages/api/src/nitro/room/object/data/IObjectData.ts new file mode 100644 index 0000000..be56f1c --- /dev/null +++ b/packages/api/src/nitro/room/object/data/IObjectData.ts @@ -0,0 +1,17 @@ +import { IMessageDataWrapper } from '../../../../communication'; +import { IRoomObjectModel } from '../../../../room'; + +export interface IObjectData +{ + state: number; + isUnique: boolean; + uniqueNumber: number; + uniqueSeries: number; + rarityLevel: number; + flags: number; + parseWrapper(wrapper: IMessageDataWrapper): void; + initializeFromRoomObjectModel(model: IRoomObjectModel): void; + writeRoomObjectModel(model: IRoomObjectModel): void; + getLegacyString(): string; + compare(data: IObjectData): boolean; +} diff --git a/packages/api/src/nitro/room/object/data/ObjectDataBase.ts b/packages/api/src/nitro/room/object/data/ObjectDataBase.ts new file mode 100644 index 0000000..25ddfcc --- /dev/null +++ b/packages/api/src/nitro/room/object/data/ObjectDataBase.ts @@ -0,0 +1,99 @@ +import { IMessageDataWrapper } from '../../../../communication'; +import { IRoomObjectModel } from '../../../../room'; +import { RoomObjectVariable } from '../RoomObjectVariable'; +import { IObjectData } from './IObjectData'; +import { ObjectDataFlags } from './ObjectDataFlags'; + +export class ObjectDataBase implements IObjectData +{ + private _flags: number; + private _uniqueNumber: number; + private _uniqueSeries: number; + + constructor() + { + this._flags = 0; + this._uniqueNumber = 0; + this._uniqueSeries = 0; + } + + public parseWrapper(wrapper: IMessageDataWrapper): void + { + if((this._flags & ObjectDataFlags.UNIQUE_SET) > 0) + { + this._uniqueNumber = wrapper.readInt(); + this._uniqueSeries = wrapper.readInt(); + } + } + + public initializeFromRoomObjectModel(model: IRoomObjectModel): void + { + this._uniqueNumber = model.getValue(RoomObjectVariable.FURNITURE_UNIQUE_SERIAL_NUMBER); + this._uniqueSeries = model.getValue(RoomObjectVariable.FURNITURE_UNIQUE_EDITION_SIZE); + } + + public writeRoomObjectModel(model: IRoomObjectModel): void + { + if(!model) return; + + model.setValue(RoomObjectVariable.FURNITURE_UNIQUE_SERIAL_NUMBER, this._uniqueNumber); + model.setValue(RoomObjectVariable.FURNITURE_UNIQUE_EDITION_SIZE, this._uniqueSeries); + } + + public getLegacyString(): string + { + return ''; + } + + public compare(data: IObjectData): boolean + { + return false; + } + + public get state(): number + { + const state = parseInt(this.getLegacyString()); + + return isNaN(state) ? 0 : state; + } + + public get isUnique(): boolean + { + return this._uniqueSeries > 0; + } + + public get uniqueNumber(): number + { + return this._uniqueNumber; + } + + public set uniqueNumber(number: number) + { + this._uniqueNumber = number; + } + + public get uniqueSeries(): number + { + return this._uniqueSeries; + } + + public set uniqueSeries(series: number) + { + this._uniqueSeries = series; + } + + public get rarityLevel(): number + { + return -1; + } + + public get flags(): number + { + return this._flags; + } + + public set flags(flags: number) + { + this._flags = flags; + } +} diff --git a/packages/api/src/nitro/room/object/data/ObjectDataFactory.ts b/packages/api/src/nitro/room/object/data/ObjectDataFactory.ts new file mode 100644 index 0000000..b6f3e5d --- /dev/null +++ b/packages/api/src/nitro/room/object/data/ObjectDataFactory.ts @@ -0,0 +1,44 @@ +import { IObjectData } from './IObjectData'; +import { CrackableDataType, EmptyDataType, HighScoreDataType, LegacyDataType, MapDataType, NumberDataType, StringDataType, VoteDataType } from './type'; + +export class ObjectDataFactory +{ + public static getData(flags: number): IObjectData + { + let objectData: IObjectData = null; + + switch(flags & 0xFF) + { + case CrackableDataType.FORMAT_KEY: + objectData = new CrackableDataType(); + break; + case EmptyDataType.FORMAT_KEY: + objectData = new EmptyDataType(); + break; + case HighScoreDataType.FORMAT_KEY: + objectData = new HighScoreDataType(); + break; + case LegacyDataType.FORMAT_KEY: + objectData = new LegacyDataType(); + break; + case MapDataType.FORMAT_KEY: + objectData = new MapDataType(); + break; + case NumberDataType.FORMAT_KEY: + objectData = new NumberDataType(); + break; + case StringDataType.FORMAT_KEY: + objectData = new StringDataType(); + break; + case VoteDataType.FORMAT_KEY: + objectData = new VoteDataType(); + break; + } + + if(!objectData) return null; + + objectData.flags = (flags & 0xFF00); + + return objectData; + } +} diff --git a/packages/api/src/nitro/room/object/data/ObjectDataFlags.ts b/packages/api/src/nitro/room/object/data/ObjectDataFlags.ts new file mode 100644 index 0000000..5d5a119 --- /dev/null +++ b/packages/api/src/nitro/room/object/data/ObjectDataFlags.ts @@ -0,0 +1,4 @@ +export class ObjectDataFlags +{ + public static UNIQUE_SET = 256; +} \ No newline at end of file diff --git a/packages/api/src/nitro/room/object/data/ObjectDataKey.ts b/packages/api/src/nitro/room/object/data/ObjectDataKey.ts new file mode 100644 index 0000000..eff1160 --- /dev/null +++ b/packages/api/src/nitro/room/object/data/ObjectDataKey.ts @@ -0,0 +1,11 @@ +export class ObjectDataKey +{ + public static LEGACY_KEY: number = 0; + public static MAP_KEY: number = 1; + public static STRING_KEY: number = 2; + public static VOTE_KEY: number = 3; + public static EMPTY_KEY: number = 4; + public static NUMBER_KEY: number = 5; + public static HIGHSCORE_KEY: number = 6; + public static CRACKABLE_KEY: number = 7; +} \ No newline at end of file diff --git a/packages/api/src/nitro/room/object/data/index.ts b/packages/api/src/nitro/room/object/data/index.ts new file mode 100644 index 0000000..64993e4 --- /dev/null +++ b/packages/api/src/nitro/room/object/data/index.ts @@ -0,0 +1,6 @@ +export * from './IObjectData'; +export * from './ObjectDataBase'; +export * from './ObjectDataFactory'; +export * from './ObjectDataFlags'; +export * from './ObjectDataKey'; +export * from './type'; diff --git a/packages/api/src/nitro/room/object/data/type/CrackableDataType.ts b/packages/api/src/nitro/room/object/data/type/CrackableDataType.ts new file mode 100644 index 0000000..8fd96fd --- /dev/null +++ b/packages/api/src/nitro/room/object/data/type/CrackableDataType.ts @@ -0,0 +1,74 @@ +import { IMessageDataWrapper } from '../../../../../communication'; +import { IRoomObjectModel } from '../../../../../room'; +import { RoomObjectVariable } from '../../RoomObjectVariable'; +import { IObjectData } from '../IObjectData'; +import { ObjectDataBase } from '../ObjectDataBase'; +import { ObjectDataKey } from '../ObjectDataKey'; + +export class CrackableDataType extends ObjectDataBase implements IObjectData +{ + public static FORMAT_KEY = ObjectDataKey.CRACKABLE_KEY; + + private _state: string; + private _hits: number; + private _target: number; + + constructor() + { + super(); + + this._state = ''; + this._hits = 0; + this._target = 0; + } + + public parseWrapper(wrapper: IMessageDataWrapper): void + { + if(!wrapper) return; + + this._state = wrapper.readString(); + this._hits = wrapper.readInt(); + this._target = wrapper.readInt(); + + super.parseWrapper(wrapper); + } + + public initializeFromRoomObjectModel(model: IRoomObjectModel): void + { + super.initializeFromRoomObjectModel(model); + + this._state = model.getValue(RoomObjectVariable.FURNITURE_CRACKABLE_STATE); + this._hits = model.getValue(RoomObjectVariable.FURNITURE_CRACKABLE_HITS); + this._target = model.getValue(RoomObjectVariable.FURNITURE_CRACKABLE_TARGET); + } + + public writeRoomObjectModel(model: IRoomObjectModel): void + { + super.writeRoomObjectModel(model); + + model.setValue(RoomObjectVariable.FURNITURE_DATA_FORMAT, CrackableDataType.FORMAT_KEY); + model.setValue(RoomObjectVariable.FURNITURE_CRACKABLE_STATE, this._state); + model.setValue(RoomObjectVariable.FURNITURE_CRACKABLE_HITS, this._hits); + model.setValue(RoomObjectVariable.FURNITURE_CRACKABLE_TARGET, this._target); + } + + public getLegacyString(): string + { + return this._state; + } + + public compare(data: IObjectData): boolean + { + return true; + } + + public get hits(): number + { + return this._hits; + } + + public get target(): number + { + return this._target; + } +} diff --git a/packages/api/src/nitro/room/object/data/type/EmptyDataType.ts b/packages/api/src/nitro/room/object/data/type/EmptyDataType.ts new file mode 100644 index 0000000..62d9d03 --- /dev/null +++ b/packages/api/src/nitro/room/object/data/type/EmptyDataType.ts @@ -0,0 +1,39 @@ +import { IMessageDataWrapper } from '../../../../../communication'; +import { IRoomObjectModel } from '../../../../../room'; +import { RoomObjectVariable } from '../../RoomObjectVariable'; +import { IObjectData } from '../IObjectData'; +import { ObjectDataBase } from '../ObjectDataBase'; +import { ObjectDataKey } from '../ObjectDataKey'; + +export class EmptyDataType extends ObjectDataBase implements IObjectData +{ + public static FORMAT_KEY = ObjectDataKey.EMPTY_KEY; + + private _state: string; + + public parseWrapper(wrapper: IMessageDataWrapper): void + { + if(!wrapper) return; + + this._state = ''; + + super.parseWrapper(wrapper); + } + + public writeRoomObjectModel(model: IRoomObjectModel): void + { + super.writeRoomObjectModel(model); + + model.setValue(RoomObjectVariable.FURNITURE_DATA_FORMAT, EmptyDataType.FORMAT_KEY); + } + + public getLegacyString(): string + { + return this._state; + } + + public compare(data: IObjectData): boolean + { + return super.compare(data); + } +} diff --git a/packages/api/src/nitro/room/object/data/type/HighScoreData.ts b/packages/api/src/nitro/room/object/data/type/HighScoreData.ts new file mode 100644 index 0000000..cb18b33 --- /dev/null +++ b/packages/api/src/nitro/room/object/data/type/HighScoreData.ts @@ -0,0 +1,36 @@ +export class HighScoreData +{ + private _score: number; + private _users: string[]; + + constructor() + { + this._score = -1; + this._users = []; + } + + public get score(): number + { + return this._score; + } + + public set score(k: number) + { + this._score = k; + } + + public get users(): string[] + { + return this._users; + } + + public set users(k: string[]) + { + this._users = k; + } + + public addUsername(k: string): void + { + this._users.push(k); + } +} \ No newline at end of file diff --git a/packages/api/src/nitro/room/object/data/type/HighScoreDataType.ts b/packages/api/src/nitro/room/object/data/type/HighScoreDataType.ts new file mode 100644 index 0000000..205c2e8 --- /dev/null +++ b/packages/api/src/nitro/room/object/data/type/HighScoreDataType.ts @@ -0,0 +1,131 @@ +import { IMessageDataWrapper } from '../../../../../communication'; +import { IRoomObjectModel } from '../../../../../room'; +import { RoomObjectVariable } from '../../RoomObjectVariable'; +import { IObjectData } from '../IObjectData'; +import { ObjectDataBase } from '../ObjectDataBase'; +import { ObjectDataKey } from '../ObjectDataKey'; +import { HighScoreData } from './HighScoreData'; + +export class HighScoreDataType extends ObjectDataBase implements IObjectData +{ + public static FORMAT_KEY = ObjectDataKey.HIGHSCORE_KEY; + + private _state: string; + private _scoreType: number; + private _clearType: number; + private _entries: HighScoreData[]; + + constructor() + { + super(); + + this._state = ''; + this._scoreType = -1; + this._clearType = -1; + this._entries = []; + } + + public parseWrapper(wrapper: IMessageDataWrapper): void + { + if(!wrapper) return; + + this._state = wrapper.readString(); + this._scoreType = wrapper.readInt(); + this._clearType = wrapper.readInt(); + + let totalScores = wrapper.readInt(); + + while(totalScores > 0) + { + const data = new HighScoreData(); + + data.score = wrapper.readInt(); + + let totalUsers = wrapper.readInt(); + + while(totalUsers > 0) + { + data.addUsername(wrapper.readString()); + + totalUsers--; + } + + this._entries.push(data); + + totalScores--; + } + + super.parseWrapper(wrapper); + } + + public initializeFromRoomObjectModel(model: IRoomObjectModel): void + { + this._scoreType = model.getValue(RoomObjectVariable.FURNITURE_HIGHSCORE_SCORE_TYPE); + this._clearType = model.getValue(RoomObjectVariable.FURNITURE_HIGHSCORE_CLEAR_TYPE); + this._entries = []; + + const totalEntries = model.getValue(RoomObjectVariable.FURNITURE_HIGHSCORE_DATA_ENTRY_COUNT); + + let i = 0; + + while(i < totalEntries) + { + const data = new HighScoreData(); + + data.score = model.getValue(RoomObjectVariable.FURNITURE_HIGHSCORE_DATA_ENTRY_BASE_SCORE_ + i); + data.users = model.getValue(RoomObjectVariable.FURNITURE_HIGHSCORE_DATA_ENTRY_BASE_USERS_ + i); + + this._entries.push(data); + + i++; + } + + super.initializeFromRoomObjectModel(model); + } + + public writeRoomObjectModel(model: IRoomObjectModel): void + { + super.writeRoomObjectModel(model); + + model.setValue(RoomObjectVariable.FURNITURE_DATA_FORMAT, HighScoreDataType.FORMAT_KEY); + model.setValue(RoomObjectVariable.FURNITURE_HIGHSCORE_SCORE_TYPE, this._scoreType); + model.setValue(RoomObjectVariable.FURNITURE_HIGHSCORE_CLEAR_TYPE, this._clearType); + + if(this._entries) + { + model.setValue(RoomObjectVariable.FURNITURE_HIGHSCORE_DATA_ENTRY_COUNT, this._entries.length); + + let i = 0; + + while(i < this._entries.length) + { + const entry = this._entries[i]; + + model.setValue((RoomObjectVariable.FURNITURE_HIGHSCORE_DATA_ENTRY_BASE_SCORE_ + i), entry.score); + model.setValue((RoomObjectVariable.FURNITURE_HIGHSCORE_DATA_ENTRY_BASE_USERS_ + i), entry.users); + + i++; + } + } + } + + public getLegacyString(): string + { + return this._state; + } + + public get entries(): HighScoreData[] + { + return this._entries; + } + + public get clearType(): number + { + return this._clearType; + } + + public get scoreType(): number + { + return this._scoreType; + } +} diff --git a/packages/api/src/nitro/room/object/data/type/LegacyDataType.ts b/packages/api/src/nitro/room/object/data/type/LegacyDataType.ts new file mode 100644 index 0000000..29eb592 --- /dev/null +++ b/packages/api/src/nitro/room/object/data/type/LegacyDataType.ts @@ -0,0 +1,59 @@ +import { IMessageDataWrapper } from '../../../../../communication'; +import { IRoomObjectModel } from '../../../../../room'; +import { RoomObjectVariable } from '../../RoomObjectVariable'; +import { IObjectData } from '../IObjectData'; +import { ObjectDataBase } from '../ObjectDataBase'; +import { ObjectDataKey } from '../ObjectDataKey'; + +export class LegacyDataType extends ObjectDataBase implements IObjectData +{ + public static FORMAT_KEY = ObjectDataKey.LEGACY_KEY; + + private _data: string; + + constructor() + { + super(); + + this._data = ''; + } + + public parseWrapper(wrapper: IMessageDataWrapper): void + { + if(!wrapper) return; + + this._data = wrapper.readString(); + + super.parseWrapper(wrapper); + } + + public initializeFromRoomObjectModel(model: IRoomObjectModel): void + { + super.initializeFromRoomObjectModel(model); + + this._data = model.getValue(RoomObjectVariable.FURNITURE_DATA); + } + + public writeRoomObjectModel(model: IRoomObjectModel): void + { + super.writeRoomObjectModel(model); + + model.setValue(RoomObjectVariable.FURNITURE_DATA_FORMAT, LegacyDataType.FORMAT_KEY); + model.setValue(RoomObjectVariable.FURNITURE_DATA, this._data); + } + + public getLegacyString(): string + { + return this._data; + } + + public compare(data: IObjectData): boolean + { + return (this._data === data.getLegacyString()); + } + + public setString(data: string): void + { + this._data = data; + } +} diff --git a/packages/api/src/nitro/room/object/data/type/MapDataType.ts b/packages/api/src/nitro/room/object/data/type/MapDataType.ts new file mode 100644 index 0000000..4d45794 --- /dev/null +++ b/packages/api/src/nitro/room/object/data/type/MapDataType.ts @@ -0,0 +1,90 @@ +import { IMessageDataWrapper } from '../../../../../communication'; +import { IRoomObjectModel } from '../../../../../room'; +import { RoomObjectVariable } from '../../RoomObjectVariable'; +import { IObjectData } from '../IObjectData'; +import { ObjectDataBase } from '../ObjectDataBase'; +import { ObjectDataKey } from '../ObjectDataKey'; + +export class MapDataType extends ObjectDataBase +{ + public static FORMAT_KEY = ObjectDataKey.MAP_KEY; + + private static STATE: string = 'state'; + private static RARITY: string = 'rarity'; + + private _data: { [index: string]: string }; + + constructor() + { + super(); + + this._data = {}; + } + + public parseWrapper(wrapper: IMessageDataWrapper): void + { + if(!wrapper) return; + + this._data = {}; + + const totalSets = wrapper.readInt(); + + if(totalSets) for(let i = 0; i < totalSets; i++) this._data[wrapper.readString()] = wrapper.readString(); + + super.parseWrapper(wrapper); + } + + public initializeFromRoomObjectModel(model: IRoomObjectModel): void + { + super.initializeFromRoomObjectModel(model); + + this._data = model.getValue<{ [index: string]: string }>(RoomObjectVariable.FURNITURE_DATA) || {}; + } + + public writeRoomObjectModel(model: IRoomObjectModel): void + { + super.writeRoomObjectModel(model); + + model.setValue(RoomObjectVariable.FURNITURE_DATA_FORMAT, MapDataType.FORMAT_KEY); + model.setValue(RoomObjectVariable.FURNITURE_DATA, this._data); + } + + public getLegacyString(): string + { + if(!this._data) return ''; + + const state = this._data[MapDataType.STATE]; + + if(state === undefined || state === null) return ''; + + return state; + } + + public compare(data: IObjectData): boolean + { + return false; + } + + public getValue(key: string): string + { + return this._data[key]; + } + + public get rarityLevel(): number + { + if(!this._data) return -1; + + const state = this._data[MapDataType.RARITY]; + + if(state === undefined || state === null) return -1; + + return parseInt(state); + } + + // TODO: How to get the keys? + public get data() + { + return this._data; + } + +} diff --git a/packages/api/src/nitro/room/object/data/type/NumberDataType.ts b/packages/api/src/nitro/room/object/data/type/NumberDataType.ts new file mode 100644 index 0000000..2790189 --- /dev/null +++ b/packages/api/src/nitro/room/object/data/type/NumberDataType.ts @@ -0,0 +1,91 @@ +import { IMessageDataWrapper } from '../../../../../communication'; +import { IRoomObjectModel } from '../../../../../room'; +import { RoomObjectVariable } from '../../RoomObjectVariable'; +import { IObjectData } from '../IObjectData'; +import { ObjectDataBase } from '../ObjectDataBase'; +import { ObjectDataKey } from '../ObjectDataKey'; + +export class NumberDataType extends ObjectDataBase +{ + public static FORMAT_KEY = ObjectDataKey.NUMBER_KEY; + + private static STATE: number = 0; + + private _data: number[]; + + constructor() + { + super(); + + this._data = []; + } + + public parseWrapper(wrapper: IMessageDataWrapper): void + { + if(!wrapper) return; + + this._data = []; + + const totalNumbers = wrapper.readInt(); + + if(totalNumbers) for(let i = 0; i < totalNumbers; i++) this._data.push(wrapper.readInt()); + + super.parseWrapper(wrapper); + } + + public initializeFromRoomObjectModel(model: IRoomObjectModel): void + { + super.initializeFromRoomObjectModel(model); + + this._data = model.getValue(RoomObjectVariable.FURNITURE_DATA); + } + + public writeRoomObjectModel(model: IRoomObjectModel): void + { + super.writeRoomObjectModel(model); + + model.setValue(RoomObjectVariable.FURNITURE_DATA_FORMAT, NumberDataType.FORMAT_KEY); + model.setValue(RoomObjectVariable.FURNITURE_DATA, this._data); + } + + public getLegacyString(): string + { + if(!this._data || !this._data.length) return ''; + + return this._data[NumberDataType.STATE].toString(); + } + + public compare(data: IObjectData): boolean + { + if(!(data instanceof NumberDataType)) return false; + + let i = 0; + + while(i < this._data.length) + { + if(i === 0) + { + // + } + else + { + if(this._data[i] !== data.getValue(i)) return false; + } + + i++; + } + + return true; + } + + public getValue(index: number): number + { + if(!this._data || !this._data.length) return -1; + + const value = this._data[index]; + + if(value === undefined || value === null) return -1; + + return value; + } +} diff --git a/packages/api/src/nitro/room/object/data/type/StringDataType.ts b/packages/api/src/nitro/room/object/data/type/StringDataType.ts new file mode 100644 index 0000000..7101854 --- /dev/null +++ b/packages/api/src/nitro/room/object/data/type/StringDataType.ts @@ -0,0 +1,90 @@ +import { IMessageDataWrapper } from '../../../../../communication'; +import { IRoomObjectModel } from '../../../../../room'; +import { RoomObjectVariable } from '../../RoomObjectVariable'; +import { IObjectData } from '../IObjectData'; +import { ObjectDataBase } from '../ObjectDataBase'; +import { ObjectDataKey } from '../ObjectDataKey'; + +export class StringDataType extends ObjectDataBase +{ + public static FORMAT_KEY = ObjectDataKey.STRING_KEY; + + private static STATE: number = 0; + + private _data: string[]; + + constructor() + { + super(); + + this._data = []; + } + + public parseWrapper(wrapper: IMessageDataWrapper): void + { + if(!wrapper) return; + + this._data = []; + + const totalStrings = wrapper.readInt(); + + if(totalStrings) for(let i = 0; i < totalStrings; i++) this._data.push(wrapper.readString()); + + super.parseWrapper(wrapper); + } + + public initializeFromRoomObjectModel(model: IRoomObjectModel): void + { + super.initializeFromRoomObjectModel(model); + + this._data = model.getValue(RoomObjectVariable.FURNITURE_DATA); + } + + public writeRoomObjectModel(model: IRoomObjectModel): void + { + super.writeRoomObjectModel(model); + + model.setValue(RoomObjectVariable.FURNITURE_DATA_FORMAT, StringDataType.FORMAT_KEY); + model.setValue(RoomObjectVariable.FURNITURE_DATA, this._data); + } + + public getLegacyString(): string + { + if(!this._data || !this._data.length) return ''; + + return this._data[StringDataType.STATE]; + } + + public compare(data: IObjectData): boolean + { + if(!(data instanceof StringDataType)) return false; + + let i = 0; + + while(i < this._data.length) + { + if(i === 0) + { + // + } + else + { + if(this._data[i] !== data.getValue(i)) return false; + } + + i++; + } + + return true; + } + + public getValue(index: number): string + { + return this._data[index] || ''; + } + + public setValue(data: string[]): void + { + this._data = data; + } +} diff --git a/packages/api/src/nitro/room/object/data/type/VoteDataType.ts b/packages/api/src/nitro/room/object/data/type/VoteDataType.ts new file mode 100644 index 0000000..5650361 --- /dev/null +++ b/packages/api/src/nitro/room/object/data/type/VoteDataType.ts @@ -0,0 +1,66 @@ +import { IMessageDataWrapper } from '../../../../../communication'; +import { IRoomObjectModel } from '../../../../../room'; +import { RoomObjectVariable } from '../../RoomObjectVariable'; +import { IObjectData } from '../IObjectData'; +import { ObjectDataBase } from '../ObjectDataBase'; +import { ObjectDataKey } from '../ObjectDataKey'; + +export class VoteDataType extends ObjectDataBase +{ + public static FORMAT_KEY = ObjectDataKey.VOTE_KEY; + + private _state: string; + private _result: number; + + constructor() + { + super(); + + this._state = ''; + this._result = 0; + } + + public parseWrapper(wrapper: IMessageDataWrapper): void + { + if(!wrapper) return; + + this._state = wrapper.readString(); + this._result = wrapper.readInt(); + + super.parseWrapper(wrapper); + } + + public writeRoomObjectModel(model: IRoomObjectModel): void + { + super.writeRoomObjectModel(model); + + model.setValue(RoomObjectVariable.FURNITURE_DATA_FORMAT, VoteDataType.FORMAT_KEY); + + const data: { [index: string]: string } = {}; + + data['S'] = this._state; + data['R'] = this._result.toString(); + + model.setValue(RoomObjectVariable.FURNITURE_DATA, data); + } + + public getLegacyString(): string + { + return this._state; + } + + public compare(data: IObjectData): boolean + { + return true; + } + + public setString(state: string): void + { + this._state = state; + } + + public get result(): number + { + return this._result; + } +} diff --git a/packages/api/src/nitro/room/object/data/type/index.ts b/packages/api/src/nitro/room/object/data/type/index.ts new file mode 100644 index 0000000..6f81bc5 --- /dev/null +++ b/packages/api/src/nitro/room/object/data/type/index.ts @@ -0,0 +1,9 @@ +export * from './CrackableDataType'; +export * from './EmptyDataType'; +export * from './HighScoreData'; +export * from './HighScoreDataType'; +export * from './LegacyDataType'; +export * from './MapDataType'; +export * from './NumberDataType'; +export * from './StringDataType'; +export * from './VoteDataType'; diff --git a/packages/api/src/nitro/room/object/index.ts b/packages/api/src/nitro/room/object/index.ts new file mode 100644 index 0000000..b2bff00 --- /dev/null +++ b/packages/api/src/nitro/room/object/index.ts @@ -0,0 +1,11 @@ +export * from './data'; +export * from './data/type'; +export * from './IPetFigureData'; +export * from './IRoomMapData'; +export * from './RoomObjectCategory'; +export * from './RoomObjectLogicType'; +export * from './RoomObjectOperationType'; +export * from './RoomObjectType'; +export * from './RoomObjectUserType'; +export * from './RoomObjectVariable'; +export * from './RoomObjectVisualizationType'; diff --git a/packages/api/src/nitro/room/utils/IFurnitureStackingHeightMap.ts b/packages/api/src/nitro/room/utils/IFurnitureStackingHeightMap.ts new file mode 100644 index 0000000..5427932 --- /dev/null +++ b/packages/api/src/nitro/room/utils/IFurnitureStackingHeightMap.ts @@ -0,0 +1,11 @@ +export interface IFurnitureStackingHeightMap +{ + dispose: () => void; + getTileHeight(x: number, y: number): number; + setTileHeight(x: number, y: number, height: number): void; + setStackingBlocked(x: number, y: number, isNotStackable: boolean): void; + setIsRoomTile(x: number, y: number, isRoomTile: boolean): void; + validateLocation(k: number, _arg_2: number, _arg_3: number, _arg_4: number, _arg_5: number, _arg_6: number, _arg_7: number, _arg_8: number, _arg_9: boolean, _arg_10?: number): boolean; + readonly width: number; + readonly height: number; +} diff --git a/packages/api/src/nitro/room/utils/ILegacyWallGeometry.ts b/packages/api/src/nitro/room/utils/ILegacyWallGeometry.ts new file mode 100644 index 0000000..e3aab44 --- /dev/null +++ b/packages/api/src/nitro/room/utils/ILegacyWallGeometry.ts @@ -0,0 +1,18 @@ +import { IVector3D } from '../../../utils'; + +export interface ILegacyWallGeometry +{ + dispose: () => void; + readonly disposed: boolean; + scale: number; + initialize(width: number, height: number, floorHeight: number): void; + setHeight(x: number, y: number, height: number): boolean; + getHeight(x: number, y: number): number; + getLocation(k: number, _arg_2: number, _arg_3: number, _arg_4: number, _arg_5: string): IVector3D; + getLocationOldFormat(k: number, _arg_2: number, _arg_3: string): IVector3D; + getOldLocation(k: IVector3D, _arg_2: number): [number, number, number, number, string]; + getOldLocationString(k: IVector3D, _arg_2: number): string; + getDirection(k: string): number; + getFloorAltitude(k: number, _arg_2: number): number; + isRoomTile(k: number, _arg_2: number): boolean; +} diff --git a/packages/api/src/nitro/room/utils/ITileObjectMap.ts b/packages/api/src/nitro/room/utils/ITileObjectMap.ts new file mode 100644 index 0000000..b7fda05 --- /dev/null +++ b/packages/api/src/nitro/room/utils/ITileObjectMap.ts @@ -0,0 +1,11 @@ +import { IRoomObject } from '../../../room'; + +export interface ITileObjectMap +{ + clear(): void; + populate(k: IRoomObject[]): void; + dispose(): void; + getObjectIntTile(k: number, _arg_2: number): IRoomObject; + setObjectInTile(k: number, _arg_2: number, _arg_3: IRoomObject): void; + addRoomObject(k: IRoomObject): void; +} diff --git a/packages/api/src/nitro/room/utils/ObjectRolling.ts b/packages/api/src/nitro/room/utils/ObjectRolling.ts new file mode 100644 index 0000000..93d2ca3 --- /dev/null +++ b/packages/api/src/nitro/room/utils/ObjectRolling.ts @@ -0,0 +1,40 @@ +import { IVector3D } from '../../../utils'; + +export class ObjectRolling +{ + public static MOVE: string = 'mv'; + public static SLIDE: string = 'sld'; + + private _id: number; + private _location: IVector3D; + private _targetLocation: IVector3D; + private _movementType: string; + + constructor(id: number, location: IVector3D, targetLocation: IVector3D, movementType: string = null) + { + this._id = id; + this._location = location; + this._targetLocation = targetLocation; + this._movementType = movementType; + } + + public get id(): number + { + return this._id; + } + + public get location(): IVector3D + { + return this._location; + } + + public get targetLocation(): IVector3D + { + return this._targetLocation; + } + + public get movementType(): string + { + return this._movementType; + } +} diff --git a/packages/api/src/nitro/room/utils/index.ts b/packages/api/src/nitro/room/utils/index.ts new file mode 100644 index 0000000..e8d1668 --- /dev/null +++ b/packages/api/src/nitro/room/utils/index.ts @@ -0,0 +1,4 @@ +export * from './IFurnitureStackingHeightMap'; +export * from './ILegacyWallGeometry'; +export * from './ITileObjectMap'; +export * from './ObjectRolling'; diff --git a/packages/api/src/nitro/session/BreedingPetInfo.ts b/packages/api/src/nitro/session/BreedingPetInfo.ts new file mode 100644 index 0000000..c3ff6c4 --- /dev/null +++ b/packages/api/src/nitro/session/BreedingPetInfo.ts @@ -0,0 +1,55 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class BreedingPetInfo +{ + private _webId: number; + private _name: string; + private _level: number; + private _figure: string; + private _owner: string; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this._webId = wrapper.readInt(); + this._name = wrapper.readString(); + this._level = wrapper.readInt(); + this._figure = wrapper.readString(); + this._owner = wrapper.readString(); + } + + public dispose(): void + { + this._webId = 0; + this._name = ''; + this._level = 0; + this._figure = ''; + this._owner = ''; + } + + public get webId(): number + { + return this._webId; + } + + public get name(): string + { + return this._name; + } + + public get level(): number + { + return this._level; + } + + public get figure(): string + { + return this._figure; + } + + public get owner(): string + { + return this._owner; + } +} diff --git a/packages/api/src/nitro/session/FurnitureType.ts b/packages/api/src/nitro/session/FurnitureType.ts new file mode 100644 index 0000000..7f8aff0 --- /dev/null +++ b/packages/api/src/nitro/session/FurnitureType.ts @@ -0,0 +1,10 @@ +export enum FurnitureType +{ + FLOOR = 'S', + WALL = 'I', + EFFECT = 'E', + BADGE = 'B', + ROBOT = 'R', + HABBO_CLUB = 'H', + PET = 'P' +} \ No newline at end of file diff --git a/packages/api/src/nitro/session/IFurnitureData.ts b/packages/api/src/nitro/session/IFurnitureData.ts new file mode 100644 index 0000000..0ebc9c7 --- /dev/null +++ b/packages/api/src/nitro/session/IFurnitureData.ts @@ -0,0 +1,33 @@ +export interface IFurnitureData +{ + type: string; + id: number; + className: string; + fullName: string; + category: string; + hasIndexedColor: boolean; + colorIndex: number; + revision: number; + tileSizeX: number; + tileSizeY: number; + tileSizeZ: number; + colors: number[]; + name: string; + description: string; + adUrl: string; + purchaseOfferId: number; + rentOfferId: number; + customParams: string; + specialType: number; + purchaseCouldBeUsedForBuyout: boolean; + rentCouldBeUsedForBuyout: boolean; + availableForBuildersClub: boolean; + canStandOn: boolean; + canSitOn: boolean; + canLayOn: boolean; + isExternalImage: boolean; + excludeDynamic: boolean; + furniLine: string; + environment: string; + rare: boolean; +} diff --git a/packages/api/src/nitro/session/IFurnitureDataListener.ts b/packages/api/src/nitro/session/IFurnitureDataListener.ts new file mode 100644 index 0000000..e94ec16 --- /dev/null +++ b/packages/api/src/nitro/session/IFurnitureDataListener.ts @@ -0,0 +1,4 @@ +export interface IFurnitureDataListener +{ + loadFurnitureData(): void; +} \ No newline at end of file diff --git a/packages/api/src/nitro/session/IGroupInformationManager.ts b/packages/api/src/nitro/session/IGroupInformationManager.ts new file mode 100644 index 0000000..4304483 --- /dev/null +++ b/packages/api/src/nitro/session/IGroupInformationManager.ts @@ -0,0 +1,5 @@ +export interface IGroupInformationManager +{ + init(): void; + getGroupBadge(groupId: number): string; +} diff --git a/packages/api/src/nitro/session/IIgnoredUsersManager.ts b/packages/api/src/nitro/session/IIgnoredUsersManager.ts new file mode 100644 index 0000000..aa065b3 --- /dev/null +++ b/packages/api/src/nitro/session/IIgnoredUsersManager.ts @@ -0,0 +1,9 @@ +export interface IIgnoredUsersManager +{ + init(): void; + requestIgnoredUsers(username: string): void; + ignoreUserId(id: number): void; + ignoreUser(name: string): void; + unignoreUser(name: string): void; + isIgnored(name: string): boolean; +} diff --git a/packages/api/src/nitro/session/IPetCustomPart.ts b/packages/api/src/nitro/session/IPetCustomPart.ts new file mode 100644 index 0000000..8d4f968 --- /dev/null +++ b/packages/api/src/nitro/session/IPetCustomPart.ts @@ -0,0 +1,6 @@ +export interface IPetCustomPart +{ + layerId: number; + partId: number; + paletteId: number; +} diff --git a/packages/api/src/nitro/session/IPollChoice.ts b/packages/api/src/nitro/session/IPollChoice.ts new file mode 100644 index 0000000..e645676 --- /dev/null +++ b/packages/api/src/nitro/session/IPollChoice.ts @@ -0,0 +1,6 @@ +export interface IPollChoice +{ + value: string; + choiceText: string; + choiceType: number; +} diff --git a/packages/api/src/nitro/session/IPollQuestion.ts b/packages/api/src/nitro/session/IPollQuestion.ts new file mode 100644 index 0000000..d85fd9f --- /dev/null +++ b/packages/api/src/nitro/session/IPollQuestion.ts @@ -0,0 +1,14 @@ +import { IPollChoice } from './IPollChoice'; + +export interface IPollQuestion +{ + questionId: number; + questionType: number; + sortOrder: number; + questionText: string; + questionCategory: number; + questionAnswerType: number; + questionAnswerCount: number; + children: IPollQuestion[]; + questionChoices: IPollChoice[]; +} diff --git a/packages/api/src/nitro/session/IProductData.ts b/packages/api/src/nitro/session/IProductData.ts new file mode 100644 index 0000000..95cf4d1 --- /dev/null +++ b/packages/api/src/nitro/session/IProductData.ts @@ -0,0 +1,6 @@ +export interface IProductData +{ + type: string; + name: string; + description: string; +} diff --git a/packages/api/src/nitro/session/IProductDataListener.ts b/packages/api/src/nitro/session/IProductDataListener.ts new file mode 100644 index 0000000..2d0c4eb --- /dev/null +++ b/packages/api/src/nitro/session/IProductDataListener.ts @@ -0,0 +1,6 @@ +import { IDisposable } from '../../common'; + +export interface IProductDataListener extends IDisposable +{ + loadProductData(): void; +} diff --git a/packages/api/src/nitro/session/IQuestion.ts b/packages/api/src/nitro/session/IQuestion.ts new file mode 100644 index 0000000..fdd1b3f --- /dev/null +++ b/packages/api/src/nitro/session/IQuestion.ts @@ -0,0 +1,12 @@ +export interface IQuestion +{ + id: number; + number: number; + type: number; + content: string; + selection_min?: number; + selections?: string[]; + selection_values?: string[]; + selection_count?: number; + selection_max?: number; +} diff --git a/packages/api/src/nitro/session/IRoomHandlerListener.ts b/packages/api/src/nitro/session/IRoomHandlerListener.ts new file mode 100644 index 0000000..affd923 --- /dev/null +++ b/packages/api/src/nitro/session/IRoomHandlerListener.ts @@ -0,0 +1,8 @@ +import { IRoomSession } from './IRoomSession'; + +export interface IRoomHandlerListener +{ + getSession(id: number): IRoomSession; + sessionUpdate(id: number, type: string): void; + sessionReinitialize(fromRoomId: number, toRoomId: number): void; +} diff --git a/packages/api/src/nitro/session/IRoomModerationSettings.ts b/packages/api/src/nitro/session/IRoomModerationSettings.ts new file mode 100644 index 0000000..bf9428c --- /dev/null +++ b/packages/api/src/nitro/session/IRoomModerationSettings.ts @@ -0,0 +1,6 @@ +export interface IRoomModerationSettings +{ + readonly allowMute: number; + readonly allowKick: number; + readonly allowBan: number; +} diff --git a/packages/api/src/nitro/session/IRoomPetData.ts b/packages/api/src/nitro/session/IRoomPetData.ts new file mode 100644 index 0000000..70dfbbc --- /dev/null +++ b/packages/api/src/nitro/session/IRoomPetData.ts @@ -0,0 +1,30 @@ +export interface IRoomPetData +{ + id: number; + level: number; + maximumLevel: number; + experience: number; + levelExperienceGoal: number; + energy: number; + maximumEnergy: number; + happyness: number; + maximumHappyness: number; + ownerId: number; + ownerName: string; + respect: number; + age: number; + unknownRarity: number; + saddle: boolean; + rider: boolean; + skillTresholds: number[]; + publiclyRideable: number; + breedable: boolean; + fullyGrown: boolean; + dead: boolean; + rarityLevel: number; + maximumTimeToLive: number; + remainingTimeToLive: number; + remainingGrowTime: number; + publiclyBreedable: boolean; + readonly adultLevel: number; +} diff --git a/packages/api/src/nitro/session/IRoomSession.ts b/packages/api/src/nitro/session/IRoomSession.ts new file mode 100644 index 0000000..371ac1e --- /dev/null +++ b/packages/api/src/nitro/session/IRoomSession.ts @@ -0,0 +1,64 @@ +import { IRoomModerationSettings } from './IRoomModerationSettings'; +import { IUserDataManager } from './IUserDataManager'; + +export interface IRoomSession +{ + openGift(objectId: number): void; + setControllerLevel(level: number): void; + setOwnRoomIndex(roomIndex: number): void; + setRoomOwner(): void; + start(): boolean; + reset(roomId: number): void; + sendChatMessage(text: string, styleId: number): void; + sendShoutMessage(text: string, styleId: number): void; + sendWhisperMessage(recipientName: string, text: string, styleId: number): void; + sendChatTypingMessage(isTyping: boolean): void; + sendMottoMessage(motto: string): void; + sendDanceMessage(danceId: number): void; + sendExpressionMessage(expression: number): void; + sendSignMessage(sign: number): void; + sendPostureMessage(posture: number): void; + sendDoorbellApprovalMessage(userName: string, flag: boolean): void; + sendAmbassadorAlertMessage(userId: number): void; + sendKickMessage(userId: number): void; + sendMuteMessage(userId: number, minutes: number): void; + sendBanMessage(userId: number, type: string): void; + sendGiveRightsMessage(userId: number): void; + sendTakeRightsMessage(userId: number): void; + sendPollStartMessage(pollId: number): void; + sendPollRejectMessage(pollId: number): void; + sendPollAnswerMessage(pollId: number, questionId: number, answers: string[]): void; + votePoll(counter: number): void; + sendPeerUsersClassificationMessage(userClassType: string): void; + sendRoomUsersClassificationMessage(userClassType: string): void; + updateMoodlightData(id: number, effectId: number, color: number, brightness: number, apply: boolean): void; + toggleMoodlightState(): void; + pickupPet(id: number): void; + pickupBot(id: number): void; + requestMoodlightSettings(): void; + mountPet(id: number): void; + dismountPet(id: number): void; + usePetProduct(itemId: number, petId: number): void; + removePetSaddle(id: number): void; + togglePetBreeding(id: number): void; + togglePetRiding(id: number): void; + useMultistateItem(id: number): void; + harvestPet(id: number): void; + compostPlant(id: number): void; + requestPetCommands(id: number): void; + sendScriptProceed(): void; + userDataManager: IUserDataManager; + roomId: number; + state: string; + tradeMode: number; + isPrivateRoom: boolean; + doorMode: number; + allowPets: boolean; + controllerLevel: number; + ownRoomIndex: number; + isGuildRoom: boolean; + isRoomOwner: boolean; + isDecorating: boolean; + isSpectator: boolean; + moderationSettings: IRoomModerationSettings; +} diff --git a/packages/api/src/nitro/session/IRoomSessionManager.ts b/packages/api/src/nitro/session/IRoomSessionManager.ts new file mode 100644 index 0000000..546df80 --- /dev/null +++ b/packages/api/src/nitro/session/IRoomSessionManager.ts @@ -0,0 +1,11 @@ +import { IRoomSession } from './IRoomSession'; + +export interface IRoomSessionManager +{ + init(): Promise; + getSession(id: number): IRoomSession; + createSession(roomId: number, password?: string): boolean; + startSession(session: IRoomSession): boolean; + removeSession(id: number, openLandingView?: boolean): void; + viewerSession: IRoomSession; +} diff --git a/packages/api/src/nitro/session/IRoomUserData.ts b/packages/api/src/nitro/session/IRoomUserData.ts new file mode 100644 index 0000000..09eaa57 --- /dev/null +++ b/packages/api/src/nitro/session/IRoomUserData.ts @@ -0,0 +1,26 @@ +export interface IRoomUserData +{ + readonly roomIndex: number; + activityPoints: number; + name: string; + type: number; + sex: string; + figure: string; + custom: string; + webID: number; + groupId: number; + groupName: string; + groupStatus: number; + ownerId: number; + ownerName: string; + rarityLevel: number; + hasSaddle: boolean; + isRiding: boolean; + canBreed: boolean; + canHarvest: boolean; + canRevive: boolean; + hasBreedingPermission: boolean; + petLevel: number; + botSkills: number[]; + isModerator: boolean; +} diff --git a/packages/api/src/nitro/session/ISessionDataManager.ts b/packages/api/src/nitro/session/ISessionDataManager.ts new file mode 100644 index 0000000..f9079c8 --- /dev/null +++ b/packages/api/src/nitro/session/ISessionDataManager.ts @@ -0,0 +1,56 @@ +import { Texture } from 'pixi.js'; +import { ICommunicationManager } from '../../communication'; +import { IFurnitureData } from './IFurnitureData'; +import { IGroupInformationManager } from './IGroupInformationManager'; +import { IIgnoredUsersManager } from './IIgnoredUsersManager'; +import { IProductData } from './IProductData'; + +export interface ISessionDataManager +{ + init(): Promise; + getAllFurnitureData(): IFurnitureData[]; + getFloorItemData(id: number): IFurnitureData; + getFloorItemDataByName(name: string): IFurnitureData; + getWallItemData(id: number): IFurnitureData; + getWallItemDataByName(name: string): IFurnitureData; + getProductData(type: string): IProductData; + getBadgeUrl(name: string): string; + getGroupBadgeUrl(name: string): string; + getBadgeImage(name: string): Texture; + getUserTags(roomUnitId: number): string[]; + loadBadgeImage(name: string): string; + getGroupBadgeImage(name: string): Texture; + loadGroupBadgeImage(name: string): string; + hasSecurity(level: number): boolean; + giveRespect(userId: number): void; + givePetRespect(petId: number): void; + sendSpecialCommandMessage(text: string, styleId?: number): void; + ignoreUser(name: string): void; + unignoreUser(name: string): void; + isUserIgnored(name: string): boolean; + getGroupBadge(groupId: number): string; + communication: ICommunicationManager; + userId: number; + userName: string; + figure: string; + gender: string; + realName: string; + ignoredUsersManager: IIgnoredUsersManager; + groupInformationManager: IGroupInformationManager; + respectsReceived: number; + respectsLeft: number; + respectsPetLeft: number; + canChangeName: boolean; + clubLevel: number; + securityLevel: number; + isAmbassador: boolean; + isNoob: boolean; + isRealNoob: boolean; + isSystemOpen: boolean; + isSystemShutdown: boolean; + isAuthenticHabbo: boolean; + isModerator: boolean; + isCameraFollowDisabled: boolean; + uiFlags: number; + tags: string[]; +} diff --git a/packages/api/src/nitro/session/IUserDataManager.ts b/packages/api/src/nitro/session/IUserDataManager.ts new file mode 100644 index 0000000..a16e793 --- /dev/null +++ b/packages/api/src/nitro/session/IUserDataManager.ts @@ -0,0 +1,23 @@ +import { IRoomUserData } from './IRoomUserData'; + +export interface IUserDataManager +{ + getUserData(webID: number): IRoomUserData; + getPetData(webID: number): IRoomUserData; + getBotData(webID: number): IRoomUserData; + getRentableBotData(webID: number): IRoomUserData; + getDataByType(webID: number, type: number): IRoomUserData; + getUserDataByIndex(roomIndex: number): IRoomUserData; + getUserDataByName(name: string): IRoomUserData; + updateUserData(data: IRoomUserData): void; + removeUserData(roomIndex: number): void; + getUserBadges(userId: number): string[]; + setUserBadges(userId: number, badges: string[]): void; + updateFigure(roomIndex: number, figure: string, sex: string, hasSaddle: boolean, isRiding: boolean): void; + updateName(roomIndex: number, name: string): void; + updateMotto(roomIndex: number, custom: string): void; + updateAchievementScore(roomIndex: number, score: number): void; + updatePetLevel(roomIndex: number, level: number): void; + updatePetBreedingStatus(roomIndex: number, canBreed: boolean, canHarvest: boolean, canRevive: boolean, hasBreedingPermission: boolean): void; + requestPetInfo(id: number): void; +} diff --git a/packages/api/src/nitro/session/PetBreedingResultData.ts b/packages/api/src/nitro/session/PetBreedingResultData.ts new file mode 100644 index 0000000..5b9514a --- /dev/null +++ b/packages/api/src/nitro/session/PetBreedingResultData.ts @@ -0,0 +1,58 @@ +import { IMessageDataWrapper, IPetBreedingResultData } from '@nitrots/api'; + +export class PetBreedingResultData implements IPetBreedingResultData +{ + private _stuffId: number; + private _classId: number; + private _productCode: string; + private _userId: number; + private _userName: string; + private _rarityLevel: number; + private _hasMutation: boolean; + + constructor(wrapper: IMessageDataWrapper) + { + this._stuffId = wrapper.readInt(); + this._classId = wrapper.readInt(); + this._productCode = wrapper.readString(); + this._userId = wrapper.readInt(); + this._userName = wrapper.readString(); + this._rarityLevel = wrapper.readInt(); + this._hasMutation = wrapper.readBoolean(); + } + + public get stuffId(): number + { + return this._stuffId; + } + + public get classId(): number + { + return this._classId; + } + + public get productCode(): string + { + return this._productCode; + } + + public get userId(): number + { + return this._userId; + } + + public get userName(): string + { + return this._userName; + } + + public get rarityLevel(): number + { + return this._rarityLevel; + } + + public get hasMutation(): boolean + { + return this._hasMutation; + } +} diff --git a/packages/api/src/nitro/session/PetCustomPart.ts b/packages/api/src/nitro/session/PetCustomPart.ts new file mode 100644 index 0000000..9498e12 --- /dev/null +++ b/packages/api/src/nitro/session/PetCustomPart.ts @@ -0,0 +1,45 @@ +import { IPetCustomPart } from './IPetCustomPart'; + +export class PetCustomPart implements IPetCustomPart +{ + private _layerId: number; + private _partId: number; + private _paletteId: number; + + constructor(layerId: number, partId: number, paletteId: number) + { + this._layerId = layerId; + this._partId = partId; + this._paletteId = paletteId; + } + + public get layerId(): number + { + return this._layerId; + } + + public set layerId(layerId: number) + { + this._layerId = layerId; + } + + public get partId(): number + { + return this._partId; + } + + public set partId(partId: number) + { + this._partId = partId; + } + + public get paletteId(): number + { + return this._paletteId; + } + + public set paletteId(paletteId: number) + { + this._paletteId = paletteId; + } +} diff --git a/packages/api/src/nitro/session/PetFigureData.ts b/packages/api/src/nitro/session/PetFigureData.ts new file mode 100644 index 0000000..ff586be --- /dev/null +++ b/packages/api/src/nitro/session/PetFigureData.ts @@ -0,0 +1,229 @@ +import { IPetCustomPart } from './IPetCustomPart'; +import { PetCustomPart } from './PetCustomPart'; + +export class PetFigureData +{ + private _typeId: number; + private _paletteId: number; + private _color: number; + private _headOnly: boolean; + + private _customParts: IPetCustomPart[]; + private _customLayerIds: number[]; + private _customPartIds: number[]; + private _customPaletteIds: number[]; + + constructor(k: string) + { + this._typeId = this.getTypeId(k); + this._paletteId = this.getPaletteId(k); + this._color = this.getColor(k); + this._headOnly = this.getHeadOnly(k); + + const _local_2 = this.getCustomData(k); + + this._customLayerIds = this.getCustomLayerIds(_local_2); + this._customPartIds = this.getCustomPartIds(_local_2); + this._customPaletteIds = this.getCustomPaletteIds(_local_2); + this._customParts = []; + + let i = 0; + + while(i < this._customLayerIds.length) + { + this._customParts.push(new PetCustomPart(this._customLayerIds[i], this._customPartIds[i], this._customPaletteIds[i])); + + i++; + } + } + + public get typeId(): number + { + return this._typeId; + } + + public get paletteId(): number + { + return this._paletteId; + } + + public get color(): number + { + return this._color; + } + + public get customLayerIds(): number[] + { + return this._customLayerIds; + } + + public get customPartIds(): number[] + { + return this._customPartIds; + } + + public get customPaletteIds(): number[] + { + return this._customPaletteIds; + } + + public get customParts(): IPetCustomPart[] + { + return this._customParts; + } + + public getCustomPart(k: number): IPetCustomPart + { + if(this._customParts) + { + for(const _local_2 of this._customParts) + { + if(_local_2.layerId === k) return _local_2; + } + } + + return null; + } + + public get hasCustomParts(): boolean + { + return (!(this._customLayerIds == null)) && (this._customLayerIds.length > 0); + } + + public get headOnly(): boolean + { + return this._headOnly; + } + + public get figureString(): string + { + let figure = ((((this.typeId + ' ') + this.paletteId) + ' ') + this.color.toString(16)); + + figure = (figure + (' ' + this.customParts.length)); + + for(const _local_2 of this.customParts) + { + figure = (figure + (((((' ' + _local_2.layerId) + ' ') + _local_2.partId) + ' ') + _local_2.paletteId)); + } + + return figure; + } + + private getCustomData(k: string): string[] + { + let _local_2: string[] = []; + + if(k) + { + const _local_3 = k.split(' '); + const _local_4 = ((this._headOnly) ? 1 : 0); + const _local_5 = (4 + _local_4); + + if(_local_3.length > _local_5) + { + const _local_6 = (3 + _local_4); + const _local_7 = parseInt(_local_3[_local_6]); + + _local_2 = _local_3.slice(_local_5, (_local_5 + (_local_7 * 3))); + } + } + + return _local_2; + } + + private getCustomLayerIds(data: string[]): number[] + { + const layerIds: number[] = []; + + let i = 0; + + while(i < data.length) + { + layerIds.push(parseInt(data[(i + 0)])); + + i = (i + 3); + } + + return layerIds; + } + + private getCustomPartIds(data: string[]): number[] + { + const partIds: number[] = []; + + let i = 0; + + while(i < data.length) + { + partIds.push(parseInt(data[(i + 1)])); + + i = (i + 3); + } + + return partIds; + } + + private getCustomPaletteIds(data: string[]): number[] + { + const paletteIds: number[] = []; + + let i = 0; + + while(i < data.length) + { + paletteIds.push(parseInt(data[(i + 2)])); + + i = (i + 3); + } + + return paletteIds; + } + + private getTypeId(data: string): number + { + if(data) + { + const parts = data.split(' '); + + if(parts.length >= 1) return parseInt(parts[0]); + } + + return 0; + } + + private getPaletteId(data: string): number + { + if(data) + { + const parts = data.split(' '); + + if(parts.length >= 2) return parseInt(parts[1]); + } + + return 0; + } + + private getColor(data: string): number + { + if(data) + { + const parts = data.split(' '); + + if(parts.length >= 3) return parseInt(parts[2], 16); + } + + return 0xFFFFFF; + } + + private getHeadOnly(data: string): boolean + { + if(data) + { + const parts = data.split(' '); + + if(parts.length >= 4) return parts[3] === 'head'; + } + + return false; + } +} diff --git a/packages/api/src/nitro/session/RarityCategoryData.ts b/packages/api/src/nitro/session/RarityCategoryData.ts new file mode 100644 index 0000000..f9eb994 --- /dev/null +++ b/packages/api/src/nitro/session/RarityCategoryData.ts @@ -0,0 +1,40 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class RarityCategoryData +{ + private _chance: number; + private _breeds: number[]; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this._chance = wrapper.readInt(); + this._breeds = []; + + let totalCount = wrapper.readInt(); + + while(totalCount > 0) + { + this._breeds.push(wrapper.readInt()); + + totalCount--; + } + } + + public dispose(): void + { + this._chance = -1; + this._breeds = []; + } + + public get chance(): number + { + return this._chance; + } + + public get breeds(): number[] + { + return this._breeds; + } +} diff --git a/packages/api/src/nitro/session/enum/GenericErrorEnum.ts b/packages/api/src/nitro/session/enum/GenericErrorEnum.ts new file mode 100644 index 0000000..611139b --- /dev/null +++ b/packages/api/src/nitro/session/enum/GenericErrorEnum.ts @@ -0,0 +1,5 @@ +export class GenericErrorEnum +{ + public static KICKED_OUT_OF_ROOM: number = 4008; + public static STRIP_LOCKED_FOR_TRADING: number = -13001; +} diff --git a/packages/api/src/nitro/session/enum/NoobnessLevelEnum.ts b/packages/api/src/nitro/session/enum/NoobnessLevelEnum.ts new file mode 100644 index 0000000..c9aecaf --- /dev/null +++ b/packages/api/src/nitro/session/enum/NoobnessLevelEnum.ts @@ -0,0 +1,6 @@ +export class NoobnessLevelEnum +{ + public static OLD_IDENTITY: number = 0; + public static NEW_IDENTITY: number = 1; + public static REAL_NOOB: number = 2; +} diff --git a/packages/api/src/nitro/session/enum/PetType.ts b/packages/api/src/nitro/session/enum/PetType.ts new file mode 100644 index 0000000..9058b7b --- /dev/null +++ b/packages/api/src/nitro/session/enum/PetType.ts @@ -0,0 +1,38 @@ +export class PetType +{ + public static DOG: number = 0; + public static CAT: number = 1; + public static CROCODILE: number = 2; + public static TERRIER: number = 3; + public static BEAR: number = 4; + public static PIG: number = 5; + public static LION: number = 6; + public static RHINO: number = 7; + public static SPIDER: number = 8; + public static TURTLE: number = 9; + public static CHICKEN: number = 10; + public static FROG: number = 11; + public static DRAGON: number = 12; + public static MONSTER: number = 13; + public static MONKEY: number = 14; + public static HORSE: number = 15; + public static MONSTERPLANT: number = 16; + public static BUNNY: number = 17; + public static BUNNYEVIL: number = 18; + public static BUNNYDEPRESSED: number = 19; + public static BUNNYLOVE: number = 20; + public static PIGEONGOOD: number = 21; + public static PIGEONEVIL: number = 22; + public static DEMONMONKEY: number = 23; + public static BABYBEAR: number = 24; + public static BABYTERRIER: number = 25; + public static GNOME: number = 26; + public static LEPRECHAUN: number = 27; + public static KITTENBABY: number = 28; + public static PUPPYBABY: number = 29; + public static PIGLETNBABY: number = 30; + public static HALOOMPA: number = 31; + public static FOOLS: number = 32; + public static PTEROSAUR: number = 33; + public static VELOCIRAPTOR: number = 34; +} \ No newline at end of file diff --git a/packages/api/src/nitro/session/enum/RoomControllerLevel.ts b/packages/api/src/nitro/session/enum/RoomControllerLevel.ts new file mode 100644 index 0000000..ecd6309 --- /dev/null +++ b/packages/api/src/nitro/session/enum/RoomControllerLevel.ts @@ -0,0 +1,9 @@ +export class RoomControllerLevel +{ + public static NONE: number = 0; + public static GUEST: number = 1; + public static GUILD_MEMBER: number = 2; + public static GUILD_ADMIN: number = 3; + public static ROOM_OWNER: number = 4; + public static MODERATOR: number = 5; +} \ No newline at end of file diff --git a/packages/api/src/nitro/session/enum/RoomTradingLevelEnum.ts b/packages/api/src/nitro/session/enum/RoomTradingLevelEnum.ts new file mode 100644 index 0000000..be0b1e4 --- /dev/null +++ b/packages/api/src/nitro/session/enum/RoomTradingLevelEnum.ts @@ -0,0 +1,22 @@ +export class RoomTradingLevelEnum +{ + public static NO_TRADING: number = 0; + public static ROOM_CONTROLLER_REQUIRED: number = 1; + public static FREE_TRADING: number = 2; + + + public static getLocalizationKey(k: number): string + { + switch(k) + { + case RoomTradingLevelEnum.FREE_TRADING: + return '${trading.mode.free}'; + case RoomTradingLevelEnum.ROOM_CONTROLLER_REQUIRED: + return '${trading.mode.controller}'; + case RoomTradingLevelEnum.NO_TRADING: + return '${trading.mode.not.allowed}'; + } + + return ''; + } +} diff --git a/packages/api/src/nitro/session/enum/SecurityLevel.ts b/packages/api/src/nitro/session/enum/SecurityLevel.ts new file mode 100644 index 0000000..9b3011e --- /dev/null +++ b/packages/api/src/nitro/session/enum/SecurityLevel.ts @@ -0,0 +1,13 @@ +export class SecurityLevel +{ + public static SUPER_USER: number = 9; + public static ADMINISTRATOR: number = 8; + public static COMMUNITY: number = 7; + public static PLAYER_SUPPORT: number = 6; + public static MODERATOR: number = 5; + public static EMPLOYEE: number = 4; + public static BUS_PARTNER: number = 3; + public static PARTNER: number = 2; + public static CELEBRITY: number = 1; + public static NONE: number = 0; +} \ No newline at end of file diff --git a/packages/api/src/nitro/session/enum/index.ts b/packages/api/src/nitro/session/enum/index.ts new file mode 100644 index 0000000..4d97ae9 --- /dev/null +++ b/packages/api/src/nitro/session/enum/index.ts @@ -0,0 +1,6 @@ +export * from './GenericErrorEnum'; +export * from './NoobnessLevelEnum'; +export * from './PetType'; +export * from './RoomControllerLevel'; +export * from './RoomTradingLevelEnum'; +export * from './SecurityLevel'; diff --git a/packages/api/src/nitro/session/index.ts b/packages/api/src/nitro/session/index.ts new file mode 100644 index 0000000..1fe774d --- /dev/null +++ b/packages/api/src/nitro/session/index.ts @@ -0,0 +1,25 @@ +export * from './BreedingPetInfo'; +export * from './FurnitureType'; +export * from './IFurnitureData'; +export * from './IFurnitureDataListener'; +export * from './IGroupInformationManager'; +export * from './IIgnoredUsersManager'; +export * from './IPetCustomPart'; +export * from './IPollChoice'; +export * from './IPollQuestion'; +export * from './IProductData'; +export * from './IProductDataListener'; +export * from './IQuestion'; +export * from './IRoomHandlerListener'; +export * from './IRoomModerationSettings'; +export * from './IRoomPetData'; +export * from './IRoomSession'; +export * from './IRoomSessionManager'; +export * from './IRoomUserData'; +export * from './ISessionDataManager'; +export * from './IUserDataManager'; +export * from './PetBreedingResultData'; +export * from './PetCustomPart'; +export * from './PetFigureData'; +export * from './RarityCategoryData'; +export * from './enum'; diff --git a/packages/api/src/nitro/sound/IMusicController.ts b/packages/api/src/nitro/sound/IMusicController.ts new file mode 100644 index 0000000..8166f15 --- /dev/null +++ b/packages/api/src/nitro/sound/IMusicController.ts @@ -0,0 +1,25 @@ +import { IAdvancedMap } from '../../utils'; +import { IPlaylistController } from './IPlaylistController'; +import { ISongInfo } from './ISongInfo'; + +export interface IMusicController +{ + getRoomItemPlaylist(_arg_1?: number): IPlaylistController; + getSongDiskInventorySize(): number; + getSongDiskInventoryDiskId(_arg_1: number): number; + getSongDiskInventorySongId(_arg_1: number): number; + getSongInfo(songId: number): ISongInfo; + getSongIdPlayingAtPriority(_arg_1: number): number; + playSong(songId: number, priority: number, startPos?: number, playLength?: number, fadeInSeconds?: number, fadeOutSeconds?: number): boolean; + stop(priority: number): void; + addSongInfoRequest(_arg_1: number): void; + requestSongInfoWithoutSamples(_arg_1: number): void; + requestUserSongDisks(): void; + onSongLoaded(_arg_1: number): void; + updateVolume(_arg_1: number): void; + samplesUnloaded(_arg_1: number[]): void; + get samplesIdsInUse(): number[]; + get songDiskInventory(): IAdvancedMap + init(): void; + dispose(): void; +} diff --git a/packages/api/src/nitro/sound/IPlaylistController.ts b/packages/api/src/nitro/sound/IPlaylistController.ts new file mode 100644 index 0000000..3466544 --- /dev/null +++ b/packages/api/src/nitro/sound/IPlaylistController.ts @@ -0,0 +1,16 @@ +import { ISongInfo } from './ISongInfo'; + +export interface IPlaylistController +{ + init(): void; + dispose(): void; + stopPlaying(): void; + getEntry(index: number): ISongInfo; + requestPlayList(): void; + get priority(): number; + get length(): number; + get playPosition(): number; + get currentSongId(): number; + get isPlaying(): boolean; + get entries(): ISongInfo[]; +} diff --git a/packages/api/src/nitro/sound/ISongInfo.ts b/packages/api/src/nitro/sound/ISongInfo.ts new file mode 100644 index 0000000..475b75d --- /dev/null +++ b/packages/api/src/nitro/sound/ISongInfo.ts @@ -0,0 +1,12 @@ +export interface ISongInfo +{ + //get loaded():boolean; + get id():number; + get diskId():number; + set diskId(id: number); + get length():number; + get name():string; + get creator():string; + get songData():string; + //get soundObject():IHabboSound; +} diff --git a/packages/api/src/nitro/sound/ISoundManager.ts b/packages/api/src/nitro/sound/ISoundManager.ts new file mode 100644 index 0000000..87714b5 --- /dev/null +++ b/packages/api/src/nitro/sound/ISoundManager.ts @@ -0,0 +1,8 @@ +import { IMusicController } from './IMusicController'; + +export interface ISoundManager +{ + init(): Promise; + musicController: IMusicController; + traxVolume: number; +} diff --git a/packages/api/src/nitro/sound/index.ts b/packages/api/src/nitro/sound/index.ts new file mode 100644 index 0000000..be4bfe4 --- /dev/null +++ b/packages/api/src/nitro/sound/index.ts @@ -0,0 +1,4 @@ +export * from './IMusicController'; +export * from './IPlaylistController'; +export * from './ISongInfo'; +export * from './ISoundManager'; diff --git a/packages/api/src/room/IPetBreedingResultData.ts b/packages/api/src/room/IPetBreedingResultData.ts new file mode 100644 index 0000000..b3f8985 --- /dev/null +++ b/packages/api/src/room/IPetBreedingResultData.ts @@ -0,0 +1,10 @@ +export interface IPetBreedingResultData +{ + readonly stuffId: number; + readonly classId: number; + readonly productCode: string; + readonly userId: number; + readonly userName: string; + readonly rarityLevel: number; + readonly hasMutation: boolean; +} diff --git a/packages/api/src/room/IRoomGeometry.ts b/packages/api/src/room/IRoomGeometry.ts new file mode 100644 index 0000000..c4e32c8 --- /dev/null +++ b/packages/api/src/room/IRoomGeometry.ts @@ -0,0 +1,21 @@ +import { Point } from 'pixi.js'; +import { IVector3D } from '../utils'; + +export interface IRoomGeometry +{ + getCoordinatePosition(_arg_1: IVector3D): IVector3D; + getScreenPoint(_arg_1: IVector3D): Point; + getScreenPosition(_arg_1: IVector3D): IVector3D; + getPlanePosition(_arg_1: Point, _arg_2: IVector3D, _arg_3: IVector3D, _arg_4: IVector3D): Point; + setDisplacement(_arg_1: IVector3D, _arg_2: IVector3D): void; + adjustLocation(_arg_1: IVector3D, _arg_2: number): void; + performZoom(): void; + performZoomOut(): void; + performZoomIn(): void; + isZoomedIn(): boolean; + updateId: number; + z_scale: number; + scale: number; + directionAxis: IVector3D; + direction: IVector3D; +} diff --git a/packages/api/src/room/IRoomInstance.ts b/packages/api/src/room/IRoomInstance.ts new file mode 100644 index 0000000..367ccef --- /dev/null +++ b/packages/api/src/room/IRoomInstance.ts @@ -0,0 +1,27 @@ +import { IRoomInstanceContainer } from './IRoomInstanceContainer'; +import { IRoomObjectManager } from './IRoomObjectManager'; +import { IRoomObject, IRoomObjectModel } from './object'; +import { IRoomRendererBase } from './renderer'; + +export interface IRoomInstance +{ + dispose(): void; + setRenderer(renderer: IRoomRendererBase): void; + getManager(category: number): IRoomObjectManager; + getTotalObjectsForManager(category: number): number; + getRoomObject(id: number, category: number): IRoomObject; + getRoomObjectsForCategory(category: number): IRoomObject[]; + getRoomObjectByIndex(index: number, category: number): IRoomObject; + createRoomObject(id: number, stateCount: number, type: string, category: number): IRoomObject; + createRoomObjectAndInitalize(objectId: number, type: string, category: number): IRoomObject; + removeRoomObject(id: number, category: number): void; + removeAllManagers(): void; + addUpdateCategory(category: number): void; + removeUpdateCategory(category: number): void; + update(time: number, update?: boolean): void; + id: string; + container: IRoomInstanceContainer; + renderer: IRoomRendererBase; + managers: Map; + model: IRoomObjectModel; +} diff --git a/packages/api/src/room/IRoomInstanceContainer.ts b/packages/api/src/room/IRoomInstanceContainer.ts new file mode 100644 index 0000000..efe5184 --- /dev/null +++ b/packages/api/src/room/IRoomInstanceContainer.ts @@ -0,0 +1,8 @@ +import { IRoomObjectManager } from './IRoomObjectManager'; +import { IRoomObject } from './object'; + +export interface IRoomInstanceContainer +{ + createRoomObjectAndInitalize(roomId: string, objectId: number, type: string, category: number): IRoomObject; + createRoomObjectManager(category: number): IRoomObjectManager; +} diff --git a/packages/api/src/room/IRoomManager.ts b/packages/api/src/room/IRoomManager.ts new file mode 100644 index 0000000..019a1a2 --- /dev/null +++ b/packages/api/src/room/IRoomManager.ts @@ -0,0 +1,16 @@ +import { IRoomInstance } from './IRoomInstance'; +import { IRoomManagerListener } from './IRoomManagerListener'; +import { IRoomObject } from './object'; + +export interface IRoomManager +{ + init(listener: IRoomManagerListener): Promise; + getRoomInstance(roomId: string): IRoomInstance; + createRoomInstance(roomId: string): IRoomInstance; + removeRoomInstance(roomId: string): boolean; + addUpdateCategory(category: number): void; + removeUpdateCategory(category: number): void; + createRoomObjectAndInitalize(roomId: string, objectId: number, type: string, category: number): IRoomObject; + update(time: number, update?: boolean): void; + rooms: Map; +} diff --git a/packages/api/src/room/IRoomManagerListener.ts b/packages/api/src/room/IRoomManagerListener.ts new file mode 100644 index 0000000..aa46e8d --- /dev/null +++ b/packages/api/src/room/IRoomManagerListener.ts @@ -0,0 +1,5 @@ +export interface IRoomManagerListener +{ + objectInitialized(roomId: string, objectId: number, category: number): void; + initalizeTemporaryObjectsByType(type: string, _arg_2: boolean): void; +} diff --git a/packages/api/src/room/IRoomObjectManager.ts b/packages/api/src/room/IRoomObjectManager.ts new file mode 100644 index 0000000..9e0ea3b --- /dev/null +++ b/packages/api/src/room/IRoomObjectManager.ts @@ -0,0 +1,14 @@ +import { IAdvancedMap } from '../utils'; +import { IRoomObjectController } from './object'; + +export interface IRoomObjectManager +{ + dispose(): void; + getObject(id: number): IRoomObjectController; + getObjectByIndex(index: number): IRoomObjectController; + createObject(id: number, stateCount: number, type: string): IRoomObjectController; + removeObject(id: number): void; + removeAllObjects(): void; + objects: IAdvancedMap; + totalObjects: number; +} diff --git a/packages/api/src/room/IRoomObjectUpdateMessage.ts b/packages/api/src/room/IRoomObjectUpdateMessage.ts new file mode 100644 index 0000000..2125e30 --- /dev/null +++ b/packages/api/src/room/IRoomObjectUpdateMessage.ts @@ -0,0 +1,7 @@ +import { IVector3D } from '../utils/IVector3D'; + +export interface IRoomObjectUpdateMessage +{ + readonly location: IVector3D; + readonly direction: IVector3D; +} diff --git a/packages/api/src/room/IRoomSpriteMouseEvent.ts b/packages/api/src/room/IRoomSpriteMouseEvent.ts new file mode 100644 index 0000000..c942d6c --- /dev/null +++ b/packages/api/src/room/IRoomSpriteMouseEvent.ts @@ -0,0 +1,17 @@ +export interface IRoomSpriteMouseEvent +{ + readonly type: string; + readonly eventId: string; + readonly canvasId: string; + readonly spriteTag: string; + readonly screenX: number; + readonly screenY: number; + readonly localX: number; + readonly localY: number; + readonly ctrlKey: boolean; + readonly altKey: boolean; + readonly shiftKey: boolean; + readonly buttonDown: boolean; + spriteOffsetX: number; + spriteOffsetY: number; +} diff --git a/packages/api/src/room/RoomObjectSpriteData.ts b/packages/api/src/room/RoomObjectSpriteData.ts new file mode 100644 index 0000000..768cae2 --- /dev/null +++ b/packages/api/src/room/RoomObjectSpriteData.ts @@ -0,0 +1,18 @@ +export class RoomObjectSpriteData +{ + public objectId: number; + public x: number; + public y: number; + public z: number; + public name: string; + public blendMode: string; + public flipH: boolean; + public skew: number; + public frame: boolean; + public color: string; + public alpha: number; + public width: number; + public height: number; + public type: string; + public posture: string; +} diff --git a/packages/api/src/room/index.ts b/packages/api/src/room/index.ts new file mode 100644 index 0000000..31d8d76 --- /dev/null +++ b/packages/api/src/room/index.ts @@ -0,0 +1,15 @@ +export * from './IPetBreedingResultData'; +export * from './IRoomGeometry'; +export * from './IRoomInstance'; +export * from './IRoomInstanceContainer'; +export * from './IRoomManager'; +export * from './IRoomManagerListener'; +export * from './IRoomObjectManager'; +export * from './IRoomObjectUpdateMessage'; +export * from './IRoomSpriteMouseEvent'; +export * from './RoomObjectSpriteData'; +export * from './object'; +export * from './object/enum'; +export * from './object/logic'; +export * from './object/visualization'; +export * from './renderer'; diff --git a/packages/api/src/room/object/IRoomObject.ts b/packages/api/src/room/object/IRoomObject.ts new file mode 100644 index 0000000..de5674d --- /dev/null +++ b/packages/api/src/room/object/IRoomObject.ts @@ -0,0 +1,22 @@ +import { IVector3D } from '../../utils'; +import { IRoomObjectModel } from './IRoomObjectModel'; +import { IRoomObjectMouseHandler } from './logic'; +import { IRoomObjectVisualization } from './visualization'; + +export interface IRoomObject +{ + dispose(): void; + getLocation(): IVector3D; + getDirection(): IVector3D; + getState(index?: number): number; + id: number; + instanceId: number; + type: string; + model: IRoomObjectModel; + visualization: IRoomObjectVisualization; + mouseHandler: IRoomObjectMouseHandler; + location: IVector3D; + direction: IVector3D; + updateCounter: number; + isReady: boolean; +} diff --git a/packages/api/src/room/object/IRoomObjectController.ts b/packages/api/src/room/object/IRoomObjectController.ts new file mode 100644 index 0000000..c522a26 --- /dev/null +++ b/packages/api/src/room/object/IRoomObjectController.ts @@ -0,0 +1,18 @@ +import { IVector3D } from '../../utils'; +import { IRoomObjectUpdateMessage } from '../IRoomObjectUpdateMessage'; +import { IRoomObject } from './IRoomObject'; +import { IRoomObjectEventHandler } from './logic'; +import { IRoomObjectGraphicVisualization } from './visualization'; + +export interface IRoomObjectController extends IRoomObject +{ + setLocation(vector: IVector3D): void; + setDirection(vector: IVector3D): void; + setState(state: number, index?: number): boolean; + setVisualization(visualization: IRoomObjectGraphicVisualization): void; + setLogic(logic: IRoomObjectEventHandler): void; + processUpdateMessage(message: IRoomObjectUpdateMessage): void; + tearDown(): void; + isReady: boolean; + logic: IRoomObjectEventHandler; +} diff --git a/packages/api/src/room/object/IRoomObjectModel.ts b/packages/api/src/room/object/IRoomObjectModel.ts new file mode 100644 index 0000000..64291ed --- /dev/null +++ b/packages/api/src/room/object/IRoomObjectModel.ts @@ -0,0 +1,8 @@ +export interface IRoomObjectModel +{ + dispose(): void; + getValue(key: string): T; + setValue(key: string, value: T): void; + removeKey(key: string): void; + updateCounter: number; +} \ No newline at end of file diff --git a/packages/api/src/room/object/IRoomObjectModelController.ts b/packages/api/src/room/object/IRoomObjectModelController.ts new file mode 100644 index 0000000..2dc6fbc --- /dev/null +++ b/packages/api/src/room/object/IRoomObjectModelController.ts @@ -0,0 +1,11 @@ +import { IAdvancedMap } from '../../utils'; +import { IRoomObjectModel } from './IRoomObjectModel'; + +export interface IRoomObjectModelController extends IRoomObjectModel +{ + setNumber(_arg_1: string, _arg_2: number, _arg_3: boolean): void; + setString(_arg_1: string, _arg_2: string, _arg_3: boolean): void; + setNumberArray(_arg_1: string, _arg_2: [], _arg_3: boolean): void; + setStringArray(_arg_1: string, _arg_2: [], _arg_3: boolean): void; + setStringToStringMap(_arg_1: string, _arg_2: IAdvancedMap, _arg_3: boolean): void; +} diff --git a/packages/api/src/room/object/enum/AlphaTolerance.ts b/packages/api/src/room/object/enum/AlphaTolerance.ts new file mode 100644 index 0000000..94b695e --- /dev/null +++ b/packages/api/src/room/object/enum/AlphaTolerance.ts @@ -0,0 +1,6 @@ +export class AlphaTolerance +{ + public static MATCH_ALL_PIXELS: number = -1; + public static MATCH_OPAQUE_PIXELS: number = 128; + public static MATCH_NOTHING: number = 256; +} diff --git a/packages/api/src/room/object/enum/RoomObjectSpriteType.ts b/packages/api/src/room/object/enum/RoomObjectSpriteType.ts new file mode 100644 index 0000000..ec4f953 --- /dev/null +++ b/packages/api/src/room/object/enum/RoomObjectSpriteType.ts @@ -0,0 +1,7 @@ +export class RoomObjectSpriteType +{ + public static DEFAULT: number = 1; + public static ROOM_PLANE: number = 2; + public static AVATAR: number = 3; + public static AVATAR_OWN: number = 4; +} diff --git a/packages/api/src/room/object/enum/index.ts b/packages/api/src/room/object/enum/index.ts new file mode 100644 index 0000000..b648257 --- /dev/null +++ b/packages/api/src/room/object/enum/index.ts @@ -0,0 +1,2 @@ +export * from './AlphaTolerance'; +export * from './RoomObjectSpriteType'; diff --git a/packages/api/src/room/object/index.ts b/packages/api/src/room/object/index.ts new file mode 100644 index 0000000..7d028eb --- /dev/null +++ b/packages/api/src/room/object/index.ts @@ -0,0 +1,7 @@ +export * from './enum'; +export * from './IRoomObject'; +export * from './IRoomObjectController'; +export * from './IRoomObjectModel'; +export * from './IRoomObjectModelController'; +export * from './logic'; +export * from './visualization'; diff --git a/packages/api/src/room/object/logic/IRoomObjectEventHandler.ts b/packages/api/src/room/object/logic/IRoomObjectEventHandler.ts new file mode 100644 index 0000000..8fab317 --- /dev/null +++ b/packages/api/src/room/object/logic/IRoomObjectEventHandler.ts @@ -0,0 +1,20 @@ +import { IEventDispatcher } from '../../../common'; +import { IRoomObjectUpdateMessage } from '../../IRoomObjectUpdateMessage'; +import { IRoomObjectController } from '../IRoomObjectController'; +import { IRoomObjectMouseHandler } from './IRoomObjectMouseHandler'; + +export interface IRoomObjectEventHandler extends IRoomObjectMouseHandler +{ + initialize(data: unknown): void; + dispose(): void; + update(totalTimeRunning: number): void; + processUpdateMessage(message: IRoomObjectUpdateMessage): void; + getEventTypes(): string[]; + useObject(): void; + setObject(object: IRoomObjectController): void; + tearDown(): void; + object: IRoomObjectController; + eventDispatcher: IEventDispatcher; + widget: string; + contextMenu: string; +} diff --git a/packages/api/src/room/object/logic/IRoomObjectLogicFactory.ts b/packages/api/src/room/object/logic/IRoomObjectLogicFactory.ts new file mode 100644 index 0000000..d65ed55 --- /dev/null +++ b/packages/api/src/room/object/logic/IRoomObjectLogicFactory.ts @@ -0,0 +1,10 @@ +import { IEventDispatcher, INitroEvent } from '../../../common'; +import { IRoomObjectEventHandler } from './IRoomObjectEventHandler'; + +export interface IRoomObjectLogicFactory +{ + getLogic(type: string): IRoomObjectEventHandler; + registerEventFunction(func: (event: INitroEvent) => void): void; + removeEventFunction(func: (event: INitroEvent) => void): void; + events: IEventDispatcher; +} diff --git a/packages/api/src/room/object/logic/IRoomObjectMouseHandler.ts b/packages/api/src/room/object/logic/IRoomObjectMouseHandler.ts new file mode 100644 index 0000000..4240c56 --- /dev/null +++ b/packages/api/src/room/object/logic/IRoomObjectMouseHandler.ts @@ -0,0 +1,7 @@ +import { IRoomGeometry } from '../../IRoomGeometry'; +import { IRoomSpriteMouseEvent } from '../../IRoomSpriteMouseEvent'; + +export interface IRoomObjectMouseHandler +{ + mouseEvent(event: IRoomSpriteMouseEvent, geometry: IRoomGeometry): void; +} diff --git a/packages/api/src/room/object/logic/index.ts b/packages/api/src/room/object/logic/index.ts new file mode 100644 index 0000000..5892efe --- /dev/null +++ b/packages/api/src/room/object/logic/index.ts @@ -0,0 +1,3 @@ +export * from './IRoomObjectEventHandler'; +export * from './IRoomObjectLogicFactory'; +export * from './IRoomObjectMouseHandler'; diff --git a/packages/api/src/room/object/visualization/IPlaneDrawingData.ts b/packages/api/src/room/object/visualization/IPlaneDrawingData.ts new file mode 100644 index 0000000..8a67219 --- /dev/null +++ b/packages/api/src/room/object/visualization/IPlaneDrawingData.ts @@ -0,0 +1,14 @@ +import { Point } from 'pixi.js'; + +export interface IPlaneDrawingData +{ + isBottomAligned(): boolean; + z: number; + cornerPoints: Point[]; + color: number; + maskAssetNames: string[]; + maskAssetLocations: Point[]; + maskAssetFlipHs: boolean[]; + maskAssetFlipVs: boolean[]; + assetNameColumns: string[][]; +} diff --git a/packages/api/src/room/object/visualization/IPlaneVisualization.ts b/packages/api/src/room/object/visualization/IPlaneVisualization.ts new file mode 100644 index 0000000..65b5de2 --- /dev/null +++ b/packages/api/src/room/object/visualization/IPlaneVisualization.ts @@ -0,0 +1,6 @@ +import { IRoomPlane } from './IRoomPlane'; + +export interface IPlaneVisualization +{ + planes: IRoomPlane[]; +} diff --git a/packages/api/src/room/object/visualization/IRoomObjectGraphicVisualization.ts b/packages/api/src/room/object/visualization/IRoomObjectGraphicVisualization.ts new file mode 100644 index 0000000..8fb20d2 --- /dev/null +++ b/packages/api/src/room/object/visualization/IRoomObjectGraphicVisualization.ts @@ -0,0 +1,7 @@ +import { IGraphicAssetCollection } from '../../../asset'; +import { IRoomObjectVisualization } from './IRoomObjectVisualization'; + +export interface IRoomObjectGraphicVisualization extends IRoomObjectVisualization +{ + asset: IGraphicAssetCollection; +} diff --git a/packages/api/src/room/object/visualization/IRoomObjectSprite.ts b/packages/api/src/room/object/visualization/IRoomObjectSprite.ts new file mode 100644 index 0000000..6490044 --- /dev/null +++ b/packages/api/src/room/object/visualization/IRoomObjectSprite.ts @@ -0,0 +1,32 @@ +import { BLEND_MODES, Filter, Texture } from 'pixi.js'; + +export interface IRoomObjectSprite +{ + dispose(): void; + increaseUpdateCounter(): void; + id: number; + name: string; + type: string; + spriteType: number; + texture: Texture; + width: number; + height: number; + offsetX: number; + offsetY: number; + flipH: boolean; + flipV: boolean; + direction: number; + alpha: number; + blendMode: BLEND_MODES; + color: number; + relativeDepth: number; + varyingDepth: boolean; + libraryAssetName: string; + clickHandling: boolean; + visible: boolean; + tag: string; + posture: string; + alphaTolerance: number; + filters: Filter[]; + updateCounter: number; +} diff --git a/packages/api/src/room/object/visualization/IRoomObjectSpriteVisualization.ts b/packages/api/src/room/object/visualization/IRoomObjectSpriteVisualization.ts new file mode 100644 index 0000000..e3dd4cd --- /dev/null +++ b/packages/api/src/room/object/visualization/IRoomObjectSpriteVisualization.ts @@ -0,0 +1,12 @@ +import { RoomObjectSpriteData } from '../../RoomObjectSpriteData'; +import { IRoomObjectGraphicVisualization } from './IRoomObjectGraphicVisualization'; +import { IRoomObjectSprite } from './IRoomObjectSprite'; + +export interface IRoomObjectSpriteVisualization extends IRoomObjectGraphicVisualization +{ + getSprite(index: number): IRoomObjectSprite; + getSpriteList(): RoomObjectSpriteData[]; + sprites: IRoomObjectSprite[]; + updateObjectCounter: number; + updateModelCounter: number; +} diff --git a/packages/api/src/room/object/visualization/IRoomObjectVisualization.ts b/packages/api/src/room/object/visualization/IRoomObjectVisualization.ts new file mode 100644 index 0000000..9ea0228 --- /dev/null +++ b/packages/api/src/room/object/visualization/IRoomObjectVisualization.ts @@ -0,0 +1,17 @@ +import { Rectangle, Texture } from 'pixi.js'; +import { IRoomGeometry } from '../../IRoomGeometry'; +import { IRoomObject } from '../IRoomObject'; +import { IObjectVisualizationData } from './IRoomObjectVisualizationData'; + +export interface IRoomObjectVisualization +{ + initialize(data: IObjectVisualizationData): boolean; + dispose(): void; + update(geometry: IRoomGeometry, time: number, update: boolean, skipUpdate: boolean): void; + getBoundingRectangle(): Rectangle; + getImage(): Texture; + instanceId: number; + object: IRoomObject; + image: Texture; + updateSpriteCounter: number; +} diff --git a/packages/api/src/room/object/visualization/IRoomObjectVisualizationData.ts b/packages/api/src/room/object/visualization/IRoomObjectVisualizationData.ts new file mode 100644 index 0000000..4337029 --- /dev/null +++ b/packages/api/src/room/object/visualization/IRoomObjectVisualizationData.ts @@ -0,0 +1,7 @@ +import { IAssetData } from '../../../asset'; + +export interface IObjectVisualizationData +{ + initialize(asset: IAssetData): boolean; + dispose(): void; +} diff --git a/packages/api/src/room/object/visualization/IRoomObjectVisualizationFactory.ts b/packages/api/src/room/object/visualization/IRoomObjectVisualizationFactory.ts new file mode 100644 index 0000000..a28adae --- /dev/null +++ b/packages/api/src/room/object/visualization/IRoomObjectVisualizationFactory.ts @@ -0,0 +1,9 @@ +import { IAssetData } from '../../../asset'; +import { IRoomObjectGraphicVisualization } from './IRoomObjectGraphicVisualization'; +import { IObjectVisualizationData } from './IRoomObjectVisualizationData'; + +export interface IRoomObjectVisualizationFactory +{ + getVisualization(type: string): IRoomObjectGraphicVisualization; + getVisualizationData(type: string, visualization: string, asset: IAssetData): IObjectVisualizationData; +} diff --git a/packages/api/src/room/object/visualization/IRoomPlane.ts b/packages/api/src/room/object/visualization/IRoomPlane.ts new file mode 100644 index 0000000..1cc6bc6 --- /dev/null +++ b/packages/api/src/room/object/visualization/IRoomPlane.ts @@ -0,0 +1,10 @@ +import { IVector3D } from '../../../utils'; + +export interface IRoomPlane +{ + uniqueId: number; + location: IVector3D; + leftSide: IVector3D; + rightSide: IVector3D; + color: number; +} diff --git a/packages/api/src/room/object/visualization/ISortableSprite.ts b/packages/api/src/room/object/visualization/ISortableSprite.ts new file mode 100644 index 0000000..b4c0e75 --- /dev/null +++ b/packages/api/src/room/object/visualization/ISortableSprite.ts @@ -0,0 +1,9 @@ +import { IRoomObjectSprite } from './IRoomObjectSprite'; + +export interface ISortableSprite +{ + x: number; + y: number; + z: number; + sprite: IRoomObjectSprite; +} \ No newline at end of file diff --git a/packages/api/src/room/object/visualization/index.ts b/packages/api/src/room/object/visualization/index.ts new file mode 100644 index 0000000..681f37e --- /dev/null +++ b/packages/api/src/room/object/visualization/index.ts @@ -0,0 +1,10 @@ +export * from './IPlaneDrawingData'; +export * from './IPlaneVisualization'; +export * from './IRoomObjectGraphicVisualization'; +export * from './IRoomObjectSprite'; +export * from './IRoomObjectSpriteVisualization'; +export * from './IRoomObjectVisualization'; +export * from './IRoomObjectVisualizationData'; +export * from './IRoomObjectVisualizationFactory'; +export * from './IRoomPlane'; +export * from './ISortableSprite'; diff --git a/packages/api/src/room/renderer/IRoomCanvasMouseListener.ts b/packages/api/src/room/renderer/IRoomCanvasMouseListener.ts new file mode 100644 index 0000000..bcd97ff --- /dev/null +++ b/packages/api/src/room/renderer/IRoomCanvasMouseListener.ts @@ -0,0 +1,8 @@ +import { IRoomGeometry } from '../IRoomGeometry'; +import { IRoomSpriteMouseEvent } from '../IRoomSpriteMouseEvent'; +import { IRoomObject } from '../object'; + +export interface IRoomCanvasMouseListener +{ + processRoomCanvasMouseEvent(event: IRoomSpriteMouseEvent, object: IRoomObject, geometry: IRoomGeometry): void +} diff --git a/packages/api/src/room/renderer/IRoomRenderer.ts b/packages/api/src/room/renderer/IRoomRenderer.ts new file mode 100644 index 0000000..4477917 --- /dev/null +++ b/packages/api/src/room/renderer/IRoomRenderer.ts @@ -0,0 +1,9 @@ +import { IRoomRendererBase } from './IRoomRendererBase'; +import { IRoomRenderingCanvas } from './IRoomRenderingCanvas'; + +export interface IRoomRenderer extends IRoomRendererBase +{ + getCanvas(id: number): IRoomRenderingCanvas; + createCanvas(id: number, width: number, height: number, scale: number): IRoomRenderingCanvas; + roomObjectVariableAccurateZ: string; +} \ No newline at end of file diff --git a/packages/api/src/room/renderer/IRoomRendererBase.ts b/packages/api/src/room/renderer/IRoomRendererBase.ts new file mode 100644 index 0000000..2c00706 --- /dev/null +++ b/packages/api/src/room/renderer/IRoomRendererBase.ts @@ -0,0 +1,10 @@ +import { IRoomObject } from '../object'; + +export interface IRoomRendererBase +{ + addObject(object: IRoomObject): void; + removeObject(object: IRoomObject): void; + dispose(): void; + reset(): void; + update(time: number, update?: boolean): void; +} diff --git a/packages/api/src/room/renderer/IRoomRenderingCanvas.ts b/packages/api/src/room/renderer/IRoomRenderingCanvas.ts new file mode 100644 index 0000000..65a24b6 --- /dev/null +++ b/packages/api/src/room/renderer/IRoomRenderingCanvas.ts @@ -0,0 +1,36 @@ +import { Container, Point, Texture } from 'pixi.js'; +import { IRoomGeometry } from '../IRoomGeometry'; +import { RoomObjectSpriteData } from '../RoomObjectSpriteData'; +import { ISortableSprite } from '../object'; +import { IRoomCanvasMouseListener } from './IRoomCanvasMouseListener'; + +export interface IRoomRenderingCanvas +{ + dispose(): void; + initialize(width: number, height: number): void; + setMask(flag: boolean): void; + setScale(scale: number, point?: Point, offsetPoint?: Point, override?: boolean, asDelta?: boolean): void; + render(time: number, update?: boolean): void; + update(): void; + setMouseListener(listener: IRoomCanvasMouseListener): void; + skipSpriteVisibilityChecking(): void; + resumeSpriteVisibilityChecking(): void; + getPlaneSortableSprites(): ISortableSprite[]; + handleMouseEvent(x: number, y: number, type: string, altKey: boolean, ctrlKey: boolean, shiftKey: boolean, buttonDown: boolean): boolean; + getSortableSpriteList(): RoomObjectSpriteData[]; + getDisplayAsTexture(): Texture; + moveLeft(): void; + moveRight(): void; + moveUp(): void; + moveDown(): void; + id: number; + geometry: IRoomGeometry; + master: Container; + display: Container; + screenOffsetX: number; + screenOffsetY: number; + scale: number; + width: number; + height: number; + canvasUpdated: boolean; +} diff --git a/packages/api/src/room/renderer/IRoomSpriteCanvasContainer.ts b/packages/api/src/room/renderer/IRoomSpriteCanvasContainer.ts new file mode 100644 index 0000000..be65859 --- /dev/null +++ b/packages/api/src/room/renderer/IRoomSpriteCanvasContainer.ts @@ -0,0 +1,8 @@ +import { IRoomObject } from '../object'; + +export interface IRoomSpriteCanvasContainer +{ + getRoomObject(instanceId: number): IRoomObject; + objects: Map; + roomObjectVariableAccurateZ: string; +} diff --git a/packages/api/src/room/renderer/index.ts b/packages/api/src/room/renderer/index.ts new file mode 100644 index 0000000..82ea268 --- /dev/null +++ b/packages/api/src/room/renderer/index.ts @@ -0,0 +1,5 @@ +export * from './IRoomCanvasMouseListener'; +export * from './IRoomRenderer'; +export * from './IRoomRendererBase'; +export * from './IRoomRenderingCanvas'; +export * from './IRoomSpriteCanvasContainer'; diff --git a/packages/api/src/ui/MouseEventType.ts b/packages/api/src/ui/MouseEventType.ts new file mode 100644 index 0000000..b5c5f84 --- /dev/null +++ b/packages/api/src/ui/MouseEventType.ts @@ -0,0 +1,12 @@ +export class MouseEventType +{ + public static MOUSE_CLICK: string = 'click'; + public static DOUBLE_CLICK: string = 'double_click'; + public static MOUSE_MOVE: string = 'mousemove'; + public static MOUSE_DOWN: string = 'mousedown'; + public static MOUSE_DOWN_LONG: string = 'mousedown_long'; + public static MOUSE_UP: string = 'mouseup'; + public static ROLL_OVER: string = 'mouseover'; + public static ROLL_OUT: string = 'mouseout'; + public static RIGHT_CLICK: string = 'contextmenu'; +} diff --git a/packages/api/src/ui/TouchEventType.ts b/packages/api/src/ui/TouchEventType.ts new file mode 100644 index 0000000..3f6eec9 --- /dev/null +++ b/packages/api/src/ui/TouchEventType.ts @@ -0,0 +1,8 @@ +export class TouchEventType +{ + public static TOUCH_START: string = 'touchstart'; + public static TOUCH_MOVE: string = 'touchmove'; + public static TOUCH_CANCEL: string = 'touchcancel'; + public static TOUCH_END: string = 'touchend'; + public static TOUCH_LONG: string = 'touchlong'; +} diff --git a/packages/api/src/ui/enums/AvatarExpressionEnum.ts b/packages/api/src/ui/enums/AvatarExpressionEnum.ts new file mode 100644 index 0000000..389f8d4 --- /dev/null +++ b/packages/api/src/ui/enums/AvatarExpressionEnum.ts @@ -0,0 +1,28 @@ +export class AvatarExpressionEnum +{ + public static NONE: AvatarExpressionEnum = new AvatarExpressionEnum(0); + public static WAVE: AvatarExpressionEnum = new AvatarExpressionEnum(1); + public static BLOW: AvatarExpressionEnum = new AvatarExpressionEnum(2); + public static LAUGH: AvatarExpressionEnum = new AvatarExpressionEnum(3); + public static CRY: AvatarExpressionEnum = new AvatarExpressionEnum(4); + public static IDLE: AvatarExpressionEnum = new AvatarExpressionEnum(5); + public static JUMP: AvatarExpressionEnum = new AvatarExpressionEnum(6); + public static RESPECT: AvatarExpressionEnum = new AvatarExpressionEnum(7); + + private _ordinal: number; + + constructor(k: number) + { + this._ordinal = k; + } + + public get ordinal(): number + { + return this._ordinal; + } + + public equals(k: AvatarExpressionEnum): boolean + { + return (k) && (k._ordinal == this._ordinal); + } +} diff --git a/packages/api/src/ui/enums/ContextMenuEnum.ts b/packages/api/src/ui/enums/ContextMenuEnum.ts new file mode 100644 index 0000000..7c53378 --- /dev/null +++ b/packages/api/src/ui/enums/ContextMenuEnum.ts @@ -0,0 +1,12 @@ +export class ContextMenuEnum +{ + public static DUMMY: string = 'DUMMY'; + public static FRIEND_FURNITURE: string = 'FRIEND_FURNITURE'; + public static MONSTERPLANT_SEED: string = 'MONSTERPLANT_SEED'; + public static MYSTERY_BOX: string = 'MYSTERY_BOX'; + public static EFFECT_BOX: string = 'EFFECT_BOX'; + public static MYSTERY_TROPHY: string = 'MYSTERY_TROPHY'; + public static RANDOM_TELEPORT: string = 'RANDOM_TELEPORT'; + public static PURCHASABLE_CLOTHING: string = 'PURCHASABLE_CLOTHING'; + public static GENERIC_USABLE: string = 'GENERIC_USABLE'; +} diff --git a/packages/api/src/ui/enums/FriendWidgetEngravingWidgetTypeEnum.ts b/packages/api/src/ui/enums/FriendWidgetEngravingWidgetTypeEnum.ts new file mode 100644 index 0000000..4417687 --- /dev/null +++ b/packages/api/src/ui/enums/FriendWidgetEngravingWidgetTypeEnum.ts @@ -0,0 +1,8 @@ +export class FriendWidgetEngravingWidgetTypeEnum +{ + public static LOVE_LOCK: number = 0; + public static CARVE_A_TREE: number = 1; + public static FRIENDS_PORTRAIT: number = 2; + public static WILD_WEST_WANTED: number = 3; + public static HABBOWEEN: number = 4; +} diff --git a/packages/api/src/ui/enums/RoomWidgetEnum.ts b/packages/api/src/ui/enums/RoomWidgetEnum.ts new file mode 100644 index 0000000..4b746b5 --- /dev/null +++ b/packages/api/src/ui/enums/RoomWidgetEnum.ts @@ -0,0 +1,57 @@ +export class RoomWidgetEnum +{ + public static CHAT_WIDGET: string = 'RWE_CHAT_WIDGET'; + public static INFOSTAND: string = 'RWE_INFOSTAND'; + public static ME_MENU: string = 'RWE_ME_MENU'; + public static CHAT_INPUT_WIDGET: string = 'RWE_CHAT_INPUT_WIDGET'; + public static FURNI_PLACEHOLDER: string = 'RWE_FURNI_PLACEHOLDER'; + public static FURNI_CREDIT_WIDGET: string = 'RWE_FURNI_CREDIT_WIDGET'; + public static FURNI_STICKIE_WIDGET: string = 'RWE_FURNI_STICKIE_WIDGET'; + public static FURNI_TROPHY_WIDGET: string = 'RWE_FURNI_TROPHY_WIDGET'; + public static FURNI_LOVELOCK_WIDGET: string = 'RWE_FURNI_LOVELOCK_WIDGET'; + public static FURNI_PRESENT_WIDGET: string = 'RWE_FURNI_PRESENT_WIDGET'; + public static FURNI_ECOTRONBOX_WIDGET: string = 'RWE_FURNI_ECOTRONBOX_WIDGET'; + public static FURNI_PET_PACKAGE_WIDGET: string = 'RWE_FURNI_PET_PACKAGE_WIDGET'; + public static PLAYLIST_EDITOR_WIDGET: string = 'RWE_PLAYLIST_EDITOR_WIDGET'; + public static DOORBELL: string = 'RWE_DOORBELL'; + public static LOADINGBAR: string = 'RWE_LOADINGBAR'; + public static ROOM_QUEUE: string = 'RWE_ROOM_QUEUE'; + public static ROOM_POLL: string = 'RWE_ROOM_POLL'; + public static ROOM_VOTE: string = 'RWE_ROOM_VOTE'; + public static USER_CHOOSER: string = 'RWE_USER_CHOOSER'; + public static FURNI_CHOOSER: string = 'RWE_FURNI_CHOOSER'; + public static ROOM_DIMMER: string = 'RWE_ROOM_DIMMER'; + public static FRIEND_REQUEST: string = 'RWE_FRIEND_REQUEST'; + public static CLOTHING_CHANGE: string = 'RWE_CLOTHING_CHANGE'; + public static CONVERSION_TRACKING: string = 'RWE_CONVERSION_TRACKING'; + public static USER_NOTIFICATION: string = 'RWE_USER_NOTIFICATION'; + public static FRIENDS_BAR: string = 'RWE_FRIENDS_BAR'; + public static PURSE_WIDGET: string = 'RWE_PURSE_WIDGET'; + public static AVATAR_INFO: string = 'RWE_AVATAR_INFO'; + public static WELCOME_GIFT: string = 'RWE_WELCOME_GIFT'; + public static SPAMWALL_POSTIT_WIDGET: string = 'RWE_SPAMWALL_POSTIT_WIDGET'; + public static EFFECTS: string = 'RWE_EFFECTS'; + public static MANNEQUIN: string = 'RWE_MANNEQUIN'; + public static FURNITURE_CONTEXT_MENU: string = 'RWE_FURNITURE_CONTEXT_MENU'; + public static LOCATION_WIDGET: string = 'RWE_LOCATION_WIDGET'; + public static CAMERA: string = 'RWE_CAMERA'; + public static ROOM_THUMBNAIL_CAMERA: string = 'RWE_ROOM_THUMBNAIL_CAMERA'; + public static ROOM_BACKGROUND_COLOR: string = 'RWE_ROOM_BACKGROUND_COLOR'; + public static CUSTOM_USER_NOTIFICATION: string = 'RWE_CUSTOM_USER_NOTIFICATION'; + public static FURNI_ACHIEVEMENT_RESOLUTION_ENGRAVING: string = 'RWE_FURNI_ACHIEVEMENT_RESOLUTION_ENGRAVING'; + public static FRIEND_FURNI_CONFIRM: string = 'RWE_FRIEND_FURNI_CONFIRM'; + public static FRIEND_FURNI_ENGRAVING: string = 'RWE_FRIEND_FURNI_ENGRAVING'; + public static HIGH_SCORE_DISPLAY: string = 'RWE_HIGH_SCORE_DISPLAY'; + public static INTERNAL_LINK: string = 'RWE_INTERNAL_LINK'; + public static CUSTOM_STACK_HEIGHT: string = 'RWE_CUSTOM_STACK_HEIGHT'; + public static YOUTUBE: string = 'RWE_YOUTUBE'; + public static RENTABLESPACE: string = 'RWE_RENTABLESPACE'; + public static VIMEO: string = 'RWE_VIMEO'; + public static ROOM_TOOLS: string = 'RWE_ROOM_TOOLS'; + public static EXTERNAL_IMAGE: string = 'RWE_EXTERNAL_IMAGE'; + public static WORD_QUIZZ: string = 'RWE_WORD_QUIZZ'; + public static UI_HELP_BUBBLE: string = 'RWE_UI_HELP_BUBBLE'; + public static ROOM_LINK: string = 'RWE_ROOM_LINK'; + public static CRAFTING: string = 'RWE_CRAFTING'; + public static ROOMGAME_CHECKERS: string = 'RWE_GAME_CHECKERS'; +} diff --git a/packages/api/src/ui/enums/RoomWidgetEnumItemExtradataParameter.ts b/packages/api/src/ui/enums/RoomWidgetEnumItemExtradataParameter.ts new file mode 100644 index 0000000..d252e69 --- /dev/null +++ b/packages/api/src/ui/enums/RoomWidgetEnumItemExtradataParameter.ts @@ -0,0 +1,10 @@ +export class RoomWidgetEnumItemExtradataParameter +{ + public static INFOSTAND_EXTRA_PARAM: string = 'RWEIEP_INFOSTAND_EXTRA_PARAM'; + public static JUKEBOX: string = 'RWEIEP_JUKEBOX'; + public static USABLE_PRODUCT: string = 'RWEIEP_USABLE_PRODUCT'; + public static SONGDISK: string = 'RWEIEP_SONGDISK'; + public static CRACKABLE_FURNI: string = 'RWEIEP_CRACKABLE_FURNI'; + public static BRANDING_OPTIONS: string = 'RWEIEP_BRANDING_OPTIONS'; + public static USABLE: string = 'RWEIEP_USABLE'; +} diff --git a/packages/api/src/ui/enums/RoomWidgetFurniInfoUsagePolicyEnum.ts b/packages/api/src/ui/enums/RoomWidgetFurniInfoUsagePolicyEnum.ts new file mode 100644 index 0000000..523205c --- /dev/null +++ b/packages/api/src/ui/enums/RoomWidgetFurniInfoUsagePolicyEnum.ts @@ -0,0 +1,6 @@ +export class RoomWidgetFurniInfoUsagePolicyEnum +{ + public static NOBODY: number = 0; + public static CONTROLLER: number = 1; + public static EVERYBODY: number = 2; +} diff --git a/packages/api/src/ui/enums/SystemChatStyleEnum.ts b/packages/api/src/ui/enums/SystemChatStyleEnum.ts new file mode 100644 index 0000000..15e3428 --- /dev/null +++ b/packages/api/src/ui/enums/SystemChatStyleEnum.ts @@ -0,0 +1,6 @@ +export class SystemChatStyleEnum +{ + public static NORMAL: number = 0; + public static GENERIC: number = 1; + public static BOT: number = 2; +} \ No newline at end of file diff --git a/packages/api/src/ui/enums/index.ts b/packages/api/src/ui/enums/index.ts new file mode 100644 index 0000000..48f242d --- /dev/null +++ b/packages/api/src/ui/enums/index.ts @@ -0,0 +1,7 @@ +export * from './AvatarExpressionEnum'; +export * from './ContextMenuEnum'; +export * from './FriendWidgetEngravingWidgetTypeEnum'; +export * from './RoomWidgetEnum'; +export * from './RoomWidgetEnumItemExtradataParameter'; +export * from './RoomWidgetFurniInfoUsagePolicyEnum'; +export * from './SystemChatStyleEnum'; diff --git a/packages/api/src/ui/index.ts b/packages/api/src/ui/index.ts new file mode 100644 index 0000000..d803ec8 --- /dev/null +++ b/packages/api/src/ui/index.ts @@ -0,0 +1,3 @@ +export * from './MouseEventType'; +export * from './TouchEventType'; +export * from './enums'; diff --git a/packages/api/src/utils/IAdvancedMap.ts b/packages/api/src/utils/IAdvancedMap.ts new file mode 100644 index 0000000..f10c570 --- /dev/null +++ b/packages/api/src/utils/IAdvancedMap.ts @@ -0,0 +1,22 @@ +import { IDisposable } from '../common'; + +export interface IAdvancedMap extends IDisposable +{ + dispose(): void; + reset(): void; + unshift(key: T, value: U): boolean; + add(key: T, value: U): boolean; + remove(key: T): U; + getWithIndex(index: number): U; + getKey(index: number): T; + getKeys(): T[]; + hasKey(key: T): boolean; + getValue(key: T): U; + getValues(): U[]; + hasValue(value: U): boolean; + indexOf(value: U): number; + concatenate(newValues: IAdvancedMap): void; + clone(): IAdvancedMap; + readonly length: number; + readonly disposed: boolean +} diff --git a/packages/api/src/utils/IBinaryReader.ts b/packages/api/src/utils/IBinaryReader.ts new file mode 100644 index 0000000..6ad2657 --- /dev/null +++ b/packages/api/src/utils/IBinaryReader.ts @@ -0,0 +1,12 @@ +export interface IBinaryReader +{ + readBytes(length: number): IBinaryReader; + readByte(): number; + readShort(): number; + readInt(): number; + readFloat(): number; + readDouble(): number; + remaining(): number; + toString(encoding?: string): string; + toArrayBuffer(): ArrayBuffer; +} diff --git a/packages/api/src/utils/IBinaryWriter.ts b/packages/api/src/utils/IBinaryWriter.ts new file mode 100644 index 0000000..f3135c0 --- /dev/null +++ b/packages/api/src/utils/IBinaryWriter.ts @@ -0,0 +1,11 @@ +export interface IBinaryWriter +{ + writeByte(byte: number): IBinaryWriter; + writeBytes(bytes: ArrayBuffer | number[]): IBinaryWriter; + writeShort(short: number): IBinaryWriter; + writeInt(integer: number): IBinaryWriter; + writeString(string: string, includeLength?: boolean): IBinaryWriter; + getBuffer(): ArrayBuffer; + position: number; + toString(encoding?: string): string; +} diff --git a/packages/api/src/utils/IVector3D.ts b/packages/api/src/utils/IVector3D.ts new file mode 100644 index 0000000..467e26e --- /dev/null +++ b/packages/api/src/utils/IVector3D.ts @@ -0,0 +1,16 @@ +export interface IVector3D +{ + assign(vector: IVector3D): void; + add(vector: IVector3D): void; + subtract(vector: IVector3D): void; + multiply(amount: number): void; + divide(amount: number): void; + negate(): void; + dotProduct(vector: IVector3D): number; + crossProduct(vector: IVector3D): IVector3D; + normalize(): void; + x: number; + y: number; + z: number; + length: number; +} diff --git a/packages/api/src/utils/index.ts b/packages/api/src/utils/index.ts new file mode 100644 index 0000000..15828e4 --- /dev/null +++ b/packages/api/src/utils/index.ts @@ -0,0 +1,4 @@ +export * from './IAdvancedMap'; +export * from './IBinaryReader'; +export * from './IBinaryWriter'; +export * from './IVector3D'; diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json new file mode 100644 index 0000000..5e8757d --- /dev/null +++ b/packages/api/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./src", + "outDir": "./dist", + "sourceMap": false, + "declaration": true, + "experimentalDecorators": true, + "moduleResolution": "Node", + "esModuleInterop": true, + "importHelpers": true, + "isolatedModules": true, + "resolveJsonModule": true, + "downlevelIteration": true, + "allowSyntheticDefaultImports": true, + "allowJs": true, + "skipLibCheck": true, + "noEmit": true, + "strict": false, + "strictNullChecks": false, + "target": "ES6", + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "module": "ES6" + }, + "include": [ + "src" ] +} diff --git a/packages/assets/.eslintrc.json b/packages/assets/.eslintrc.json new file mode 100644 index 0000000..ad92133 --- /dev/null +++ b/packages/assets/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": [ "@nitrots/eslint-config" ] +} diff --git a/packages/assets/.gitignore b/packages/assets/.gitignore new file mode 100644 index 0000000..1413af9 --- /dev/null +++ b/packages/assets/.gitignore @@ -0,0 +1,51 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings +.git + +# System Files +.DS_Store +Thumbs.db + +*.zip +*.as +*.bin diff --git a/packages/assets/index.ts b/packages/assets/index.ts new file mode 100644 index 0000000..8420b10 --- /dev/null +++ b/packages/assets/index.ts @@ -0,0 +1 @@ +export * from './src'; diff --git a/packages/assets/package.json b/packages/assets/package.json new file mode 100644 index 0000000..586612d --- /dev/null +++ b/packages/assets/package.json @@ -0,0 +1,25 @@ +{ + "name": "@nitrots/assets", + "description": "Nitro assets module", + "version": "1.0.0", + "type": "module", + "publishConfig": { + "access": "public" + }, + "license": "GPL-3.0", + "scripts": { + "compile": "tsc --project ./tsconfig.json --noEmit false", + "eslint": "eslint ./src --fix" + }, + "main": "./index", + "dependencies": { + "@nitrots/api": "1.0.0", + "@nitrots/eslint-config": "1.0.0", + "@nitrots/utils": "1.0.0", + "pixi.js": "^8.0.4", + "@pixi/gif": "^3.0.0" + }, + "devDependencies": { + "typescript": "~5.4.2" + } +} diff --git a/packages/assets/src/AssetManager.ts b/packages/assets/src/AssetManager.ts new file mode 100644 index 0000000..06953fe --- /dev/null +++ b/packages/assets/src/AssetManager.ts @@ -0,0 +1,151 @@ +import { IAssetData, IAssetManager, IGraphicAsset, IGraphicAssetCollection } from '@nitrots/api'; +import { NitroBundle, NitroLogger } from '@nitrots/utils'; +import '@pixi/gif'; +import { Assets, Spritesheet, SpritesheetData, Texture } from 'pixi.js'; +import { GraphicAssetCollection } from './GraphicAssetCollection'; + +export class AssetManager implements IAssetManager +{ + private _textures: Map = new Map(); + private _collections: Map = new Map(); + + public getTexture(name: string): Texture + { + if(!name) return null; + + return this._textures.get(name); + } + + public setTexture(name: string, texture: Texture): void + { + if(!name || !texture) return; + + texture.label = name; + + this._textures.set(name, texture); + } + + public getAsset(name: string): IGraphicAsset + { + if(!name) return null; + + for(const collection of this._collections.values()) + { + if(!collection) continue; + + const existing = collection.getAsset(name); + + if(!existing) continue; + + return existing; + } + + NitroLogger.warn(`AssetManager: Asset not found: ${name}`); + + return null; + } + + public addAssetToCollection(collectionName: string, assetName: string, texture: Texture, override: boolean = true): boolean + { + const collection = this.getCollection(collectionName); + + if(!collection) return false; + + return collection.addAsset(assetName, texture, override, 0, 0, false, false); + } + + public getCollection(name: string): IGraphicAssetCollection + { + if(!name) return null; + + return this._collections.get(name); + } + + public createCollection(data: IAssetData, spritesheet: Spritesheet): IGraphicAssetCollection + { + if(!data) return null; + + const collection = new GraphicAssetCollection(data, spritesheet); + + for(const [name, texture] of collection.textures.entries()) this.setTexture(name, texture); + + this._collections.set(collection.name, collection); + + return collection; + } + + public async downloadAssets(urls: string[]): Promise + { + if(!urls || !urls.length) return Promise.resolve(true); + + try + { + await Promise.all(urls.map(url => this.downloadAsset(url))); + + return true; + } + + catch (err) + { + NitroLogger.error(err); + } + + return false; + } + + public async downloadAsset(url: string): Promise + { + try + { + if(!url || !url.length) return false; + + if(url.endsWith('.png') || url.endsWith('.jpg') || url.endsWith('.jpeg') || url.endsWith('.gif')) + { + const texture = await Assets.load(url); + + this.setTexture(url, texture); + + return true; + } + + const response = await fetch(url); + + if(response.status !== 200 || !response.headers.has('Content-Type') || response.headers.get('Content-Type') !== 'application/octet-stream') return false; + + const buffer = await response.arrayBuffer(); + const nitroBundle = await NitroBundle.from(buffer); + + await this.processAsset(nitroBundle.texture, nitroBundle.jsonFile as IAssetData); + + return true; + } + + catch (err) + { + NitroLogger.error(err); + + return false; + } + } + + private async processAsset(texture: Texture, data: IAssetData): Promise + { + let spritesheet: Spritesheet = null; + + if(texture && data?.spritesheet && Object.keys(data.spritesheet).length) + { + spritesheet = new Spritesheet(texture, data.spritesheet); + + await spritesheet.parse(); + + spritesheet.textureSource.label = data.name ?? null; + } + + this.createCollection(data, spritesheet); + } + + public get collections(): Map + { + return this._collections; + } +} diff --git a/packages/assets/src/GetAssetManager.ts b/packages/assets/src/GetAssetManager.ts new file mode 100644 index 0000000..257ceea --- /dev/null +++ b/packages/assets/src/GetAssetManager.ts @@ -0,0 +1,5 @@ +import { AssetManager } from './AssetManager'; + +const assetManager = new AssetManager(); + +export const GetAssetManager = () => assetManager; diff --git a/packages/assets/src/GraphicAsset.ts b/packages/assets/src/GraphicAsset.ts new file mode 100644 index 0000000..1b6aa18 --- /dev/null +++ b/packages/assets/src/GraphicAsset.ts @@ -0,0 +1,140 @@ +import { Rectangle, Texture } from 'pixi.js'; +import { IGraphicAsset } from '../../api/src/asset/IGraphicAsset'; + +export class GraphicAsset implements IGraphicAsset +{ + private static GRAPHIC_POOL: GraphicAsset[] = []; + + private _name: string; + private _source: string; + private _texture: Texture; + private _usesPalette: boolean; + private _x: number; + private _y: number; + private _width: number; + private _height: number; + private _flipH: boolean; + private _flipV: boolean; + private _rectangle: Rectangle; + private _initialized: boolean; + + public static createAsset(name: string, source: string, texture: Texture, x: number, y: number, flipH: boolean = false, flipV: boolean = false, usesPalette: boolean = false): GraphicAsset + { + const graphicAsset = (GraphicAsset.GRAPHIC_POOL.length ? GraphicAsset.GRAPHIC_POOL.pop() : new GraphicAsset()); + + graphicAsset._name = name; + graphicAsset._source = source || null; + + if(texture) + { + graphicAsset._texture = texture; + graphicAsset._initialized = false; + } + else + { + graphicAsset._texture = null; + graphicAsset._initialized = true; + } + + graphicAsset._usesPalette = usesPalette; + graphicAsset._x = x; + graphicAsset._y = y; + graphicAsset._flipH = flipH; + graphicAsset._flipV = flipV; + graphicAsset._rectangle = null; + + return graphicAsset; + } + + public recycle(): void + { + this._texture = null; + + GraphicAsset.GRAPHIC_POOL.push(this); + } + + private initialize(): void + { + if(this._initialized || !this._texture) return; + + this._width = this._texture.width; + this._height = this._texture.height; + + this._initialized = true; + } + + public get name(): string + { + return this._name; + } + + public get source(): string + { + return this._source; + } + + public get texture(): Texture + { + return this._texture; + } + + public get usesPalette(): boolean + { + return this._usesPalette; + } + + public get x(): number + { + return this._x; + } + + public get y(): number + { + return this._y; + } + + public get width(): number + { + this.initialize(); + + return this._width; + } + + public get height(): number + { + this.initialize(); + + return this._height; + } + + public get offsetX(): number + { + if(!this._flipH) return this._x; + + return (-(this._x)); + } + + public get offsetY(): number + { + if(!this._flipV) return this._y; + + return (-(this._y)); + } + + public get flipH(): boolean + { + return this._flipH; + } + + public get flipV(): boolean + { + return this._flipV; + } + + public get rectangle(): Rectangle + { + if(!this._rectangle) this._rectangle = new Rectangle(0, 0, this.width, this.height); + + return this._rectangle; + } +} diff --git a/packages/assets/src/GraphicAssetCollection.ts b/packages/assets/src/GraphicAssetCollection.ts new file mode 100644 index 0000000..e38dc97 --- /dev/null +++ b/packages/assets/src/GraphicAssetCollection.ts @@ -0,0 +1,372 @@ +import { IAsset, IAssetData, IAssetPalette, IGraphicAsset, IGraphicAssetCollection, IGraphicAssetPalette } from '@nitrots/api'; +import { Dict, Spritesheet, Texture, TextureSource } from 'pixi.js'; +import { GraphicAsset } from './GraphicAsset'; +import { GraphicAssetPalette } from './GraphicAssetPalette'; + +export class GraphicAssetCollection implements IGraphicAssetCollection +{ + private static PALETTE_ASSET_DISPOSE_THRESHOLD: number = 10; + + private _referenceCount: number; + + private _name: string; + private _textureSource: TextureSource; + private _data: IAssetData; + private _textures: Map; + private _assets: Map; + private _palettes: Map; + private _paletteAssetNames: string[]; + + constructor(data: IAssetData, spritesheet: Spritesheet) + { + if(!data) throw new Error('invalid_collection'); + + this._name = data.name; + this._textureSource = ((spritesheet && spritesheet.textureSource) || null); + this._data = data; + this._textures = new Map(); + this._assets = new Map(); + this._palettes = new Map(); + this._paletteAssetNames = []; + + if(spritesheet) this.addLibraryAsset(spritesheet.textures); + + this.define(data); + } + + public static removeFileExtension(name: string): string + { + return (name.substring(0, name.lastIndexOf('.')) || name); + } + + public dispose(): void + { + if(this._palettes) this._palettes.clear(); + + if(this._paletteAssetNames) + { + this.disposePaletteAssets(); + + this._paletteAssetNames = null; + } + + if(this._assets) + { + for(const asset of this._assets.values()) asset.recycle(); + + this._assets.clear(); + } + } + + public addReference(): void + { + this._referenceCount++; + } + + public removeReference(): void + { + this._referenceCount--; + + if(this._referenceCount <= 0) + { + this._referenceCount = 0; + + this.disposePaletteAssets(false); + } + } + + public define(data: IAssetData): void + { + const assets = data.assets; + const palettes = data.palettes; + + if(assets) this.defineAssets(assets); + + if(palettes) this.definePalettes(palettes); + } + + private defineAssets(assets: { [index: string]: IAsset }): void + { + if(!assets) return; + + for(const name in assets) + { + const asset = assets[name]; + + if(!asset) continue; + + const x = (-(asset.x) || 0); + const y = (-(asset.y) || 0); + let flipH = false; + const flipV = false; + const usesPalette = (asset.usesPalette || false); + let source = (asset.source || ''); + + if(asset.flipH && source.length) flipH = true; + + // if(asset.flipV && source.length) flipV = true; + + if(!source.length) source = name; + + const texture = this.getLibraryAsset(source); + + if(!texture) continue; + + let didAddAsset = this.createAsset(name, source, texture, flipH, flipV, x, y, usesPalette); + + if(!didAddAsset) + { + const existingAsset = this.getAsset(name); + + if(existingAsset && (existingAsset.name !== existingAsset.source)) + { + didAddAsset = this.replaceAsset(name, source, texture, flipH, flipV, x, y, usesPalette); + } + } + } + } + + private definePalettes(palettes: { [index: string]: IAssetPalette }): void + { + if(!palettes) return; + + for(const name in palettes) + { + const palette = palettes[name]; + + if(!palette) continue; + + const id = palette.id.toString(); + + if(this._palettes.get(id)) continue; + + let colorOne = 0xFFFFFF; + let colorTwo = 0xFFFFFF; + + let color = palette.color1; + + if(color && color.length > 0) colorOne = parseInt(color, 16); + + color = palette.color2; + + if(color && color.length > 0) colorTwo = parseInt(color, 16); + + this._palettes.set(id, new GraphicAssetPalette(palette.rgb, colorOne, colorTwo)); + } + } + + private createAsset(name: string, source: string, texture: Texture, flipH: boolean, flipV: boolean, x: number, y: number, usesPalette: boolean): boolean + { + if(this._assets.get(name)) return false; + + const graphicAsset = GraphicAsset.createAsset(name, source, texture, x, y, flipH, flipV, usesPalette); + + this._assets.set(name, graphicAsset); + + return true; + } + + private replaceAsset(name: string, source: string, texture: Texture, flipH: boolean, flipV: boolean, x: number, y: number, usesPalette: boolean): boolean + { + const existing = this._assets.get(name); + + if(existing) + { + this._assets.delete(name); + + existing.recycle(); + } + + return this.createAsset(name, source, texture, flipH, flipV, x, y, usesPalette); + } + + public getAsset(name: string): IGraphicAsset + { + if(!name) return null; + + const existing = this._assets.get(name); + + if(!existing) return null; + + return existing; + } + + public getAssetWithPalette(name: string, paletteName: string): IGraphicAsset + { + const saveName = (name + '@' + paletteName); + + let asset = this.getAsset(saveName); + + if(!asset) + { + asset = this.getAsset(name); + + if(!asset || !asset.usesPalette) return asset; + + const palette = this.getPalette(paletteName); + + if(palette) + { + const texture = palette.applyPalette(asset.texture); + + if(texture) + { + this._paletteAssetNames.push(saveName); + + this.createAsset(saveName, (asset.source + '@' + paletteName), texture, asset.flipH, asset.flipV, asset.x, asset.y, false); + + asset = this.getAsset(saveName); + } + } + } + + return asset; + } + + public getTexture(name: string): Texture + { + return this._textures.get(name); + } + + public getPaletteNames(): string[] + { + return Array.from(this._palettes.keys()); + } + + public getPaletteColors(paletteName: string): number[] + { + const palette = this.getPalette(paletteName); + + if(palette) return [palette.primaryColor, palette.secondaryColor]; + + return null; + } + + public getPalette(name: string): IGraphicAssetPalette + { + if(!name) return null; + + return this._palettes.get(name); + } + + public addAsset(name: string, texture: Texture, override: boolean, x: number = 0, y: number = 0, flipH: boolean = false, flipV: boolean = false): boolean + { + if(!name || !texture) return false; + + const existingTexture = this.getLibraryAsset(name); + + if(!existingTexture) + { + this._textures.set(name, texture); + + return this.createAsset(name, name, texture, flipH, flipV, x, y, false); + } + + if(override) + { + existingTexture.source = texture.source; + + //@ts-ignore + existingTexture.frame = texture.frame; + + //@ts-ignore + existingTexture.trim = texture.trim; + + existingTexture.updateUvs(); + + return true; + } + + return false; + } + + public disposeAsset(name: string): void + { + const existing = this._assets.get(name); + + if(!existing) return; + + this._assets.delete(name); + + const texture = this.getLibraryAsset(existing.source); + + if(texture) + { + this._textures.delete(existing.source); + + texture.destroy(true); + } + + existing.recycle(); + } + + public getLibraryAsset(name: string): Texture + { + if(!name) return null; + + name = this._name + '_' + name; + + const texture = this._textures.get(name); + + if(!texture) return null; + + return texture; + } + + private addLibraryAsset(textures: Dict): void + { + if(!textures) return; + + for(const name in textures) + { + const texture = textures[name]; + + if(!texture) continue; + + this._textures.set(GraphicAssetCollection.removeFileExtension(name), texture); + } + } + + private disposePaletteAssets(disposeAll: boolean = true): void + { + if(this._paletteAssetNames) + { + if(disposeAll || (this._paletteAssetNames.length > GraphicAssetCollection.PALETTE_ASSET_DISPOSE_THRESHOLD)) + { + for(const name of this._paletteAssetNames) this.disposeAsset(name); + + this._paletteAssetNames = []; + } + } + } + + public get referenceCount(): number + { + return this._referenceCount; + } + + public get name(): string + { + return this._name; + } + + public get textureSource(): TextureSource + { + return this._textureSource; + } + + public get data(): IAssetData + { + return this._data; + } + + public get textures(): Map + { + return this._textures; + } + + public get assets(): Map + { + return this._assets; + } +} diff --git a/packages/assets/src/GraphicAssetPalette.ts b/packages/assets/src/GraphicAssetPalette.ts new file mode 100644 index 0000000..57652fd --- /dev/null +++ b/packages/assets/src/GraphicAssetPalette.ts @@ -0,0 +1,57 @@ +import { IGraphicAssetPalette } from '@nitrots/api'; +import { GetRenderer } from '@nitrots/utils'; +import { Texture } from 'pixi.js'; + +export class GraphicAssetPalette implements IGraphicAssetPalette +{ + private _palette: [number, number, number][]; + private _primaryColor: number; + private _secondaryColor: number; + + constructor(palette: [number, number, number][], primaryColor: number, secondaryColor: number) + { + this._palette = palette; + + while(this._palette.length < 256) this._palette.push([0, 0, 0]); + + this._primaryColor = primaryColor; + this._secondaryColor = secondaryColor; + } + + public applyPalette(texture: Texture): Texture + { + const canvas = GetRenderer().texture.generateCanvas(texture); + const ctx = canvas.getContext('2d'); + const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + + for(let i = 0; i < imageData.data.length; i += 4) + { + let paletteColor = this._palette[imageData.data[i + 1]]; + + if(paletteColor === undefined) paletteColor = [0, 0, 0]; + + imageData.data[i] = paletteColor[0]; + imageData.data[i + 1] = paletteColor[1]; + imageData.data[i + 2] = paletteColor[2]; + } + + ctx.putImageData(imageData, 0, 0); + + const newTexture = Texture.from(canvas); + + //@ts-ignore + newTexture.source.hitMap = imageData.data; + + return newTexture; + } + + public get primaryColor(): number + { + return this._primaryColor; + } + + public get secondaryColor(): number + { + return this._secondaryColor; + } +} diff --git a/packages/assets/src/index.ts b/packages/assets/src/index.ts new file mode 100644 index 0000000..a21d9b4 --- /dev/null +++ b/packages/assets/src/index.ts @@ -0,0 +1,5 @@ +export * from './AssetManager'; +export * from './GetAssetManager'; +export * from './GraphicAsset'; +export * from './GraphicAssetCollection'; +export * from './GraphicAssetPalette'; diff --git a/packages/assets/tsconfig.json b/packages/assets/tsconfig.json new file mode 100644 index 0000000..5e8757d --- /dev/null +++ b/packages/assets/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./src", + "outDir": "./dist", + "sourceMap": false, + "declaration": true, + "experimentalDecorators": true, + "moduleResolution": "Node", + "esModuleInterop": true, + "importHelpers": true, + "isolatedModules": true, + "resolveJsonModule": true, + "downlevelIteration": true, + "allowSyntheticDefaultImports": true, + "allowJs": true, + "skipLibCheck": true, + "noEmit": true, + "strict": false, + "strictNullChecks": false, + "target": "ES6", + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "module": "ES6" + }, + "include": [ + "src" ] +} diff --git a/packages/avatar/.eslintrc.json b/packages/avatar/.eslintrc.json new file mode 100644 index 0000000..ad92133 --- /dev/null +++ b/packages/avatar/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": [ "@nitrots/eslint-config" ] +} diff --git a/packages/avatar/.gitignore b/packages/avatar/.gitignore new file mode 100644 index 0000000..1413af9 --- /dev/null +++ b/packages/avatar/.gitignore @@ -0,0 +1,51 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings +.git + +# System Files +.DS_Store +Thumbs.db + +*.zip +*.as +*.bin diff --git a/packages/avatar/index.ts b/packages/avatar/index.ts new file mode 100644 index 0000000..8420b10 --- /dev/null +++ b/packages/avatar/index.ts @@ -0,0 +1 @@ +export * from './src'; diff --git a/packages/avatar/package.json b/packages/avatar/package.json new file mode 100644 index 0000000..63549d6 --- /dev/null +++ b/packages/avatar/package.json @@ -0,0 +1,22 @@ +{ + "name": "@nitrots/avatar", + "description": "Nitro communication module", + "version": "1.0.0", + "type": "module", + "license": "GPL-3.0", + "scripts": { + "compile": "tsc --project ./tsconfig.json --noEmit false", + "eslint": "eslint ./src --fix" + }, + "main": "./index", + "dependencies": { + "@nitrots/api": "1.0.0", + "@nitrots/assets": "1.0.0", + "@nitrots/eslint-config": "1.0.0", + "@nitrots/events": "1.0.0", + "@nitrots/utils": "1.0.0" + }, + "devDependencies": { + "typescript": "~5.4.2" + } +} diff --git a/packages/avatar/src/AvatarAssetDownloadLibrary.ts b/packages/avatar/src/AvatarAssetDownloadLibrary.ts new file mode 100644 index 0000000..504b59b --- /dev/null +++ b/packages/avatar/src/AvatarAssetDownloadLibrary.ts @@ -0,0 +1,65 @@ +import { IAssetManager, IAvatarAssetDownloadLibrary } from '@nitrots/api'; +import { AvatarRenderLibraryEvent, GetEventDispatcher, NitroEventType } from '@nitrots/events'; + +export class AvatarAssetDownloadLibrary implements IAvatarAssetDownloadLibrary +{ + private static NOT_LOADED: number = 0; + private static LOADING: number = 1; + private static LOADED: number = 2; + + private _state: number = AvatarAssetDownloadLibrary.NOT_LOADED; + private _libraryName: string; + private _revision: string; + private _downloadUrl: string; + private _assetManager: IAssetManager; + + constructor(libraryName: string, revision: string, downloadUrl: string, assetManager: IAssetManager) + { + this._libraryName = libraryName; + this._revision = revision; + this._downloadUrl = downloadUrl; + this._assetManager = assetManager; + + this._downloadUrl = this._downloadUrl.replace(/%libname%/gi, this._libraryName); + this._downloadUrl = this._downloadUrl.replace(/%revision%/gi, this._revision); + + this.checkIsLoaded(); + } + + public async downloadAsset(): Promise + { + if(!this._assetManager || (this._state === AvatarAssetDownloadLibrary.LOADING) || (this._state === AvatarAssetDownloadLibrary.LOADED)) return; + + if(!this.checkIsLoaded()) + { + this._state = AvatarAssetDownloadLibrary.LOADING; + + const status = await this._assetManager.downloadAsset(this._downloadUrl); + + if(!status) throw new Error('Could not download asset'); + } + + if(this.checkIsLoaded()) GetEventDispatcher().dispatchEvent(new AvatarRenderLibraryEvent(NitroEventType.AVATAR_ASSET_DOWNLOADED, this)); + } + + private checkIsLoaded(): boolean + { + const asset = this._assetManager.getCollection(this._libraryName); + + if(!asset) return false; + + this._state = AvatarAssetDownloadLibrary.LOADED; + + return true; + } + + public get libraryName(): string + { + return this._libraryName; + } + + public get isLoaded(): boolean + { + return (this._state === AvatarAssetDownloadLibrary.LOADED); + } +} diff --git a/packages/avatar/src/AvatarAssetDownloadManager.ts b/packages/avatar/src/AvatarAssetDownloadManager.ts new file mode 100644 index 0000000..a11f073 --- /dev/null +++ b/packages/avatar/src/AvatarAssetDownloadManager.ts @@ -0,0 +1,246 @@ +import { IAssetManager, IAvatarFigureContainer, IAvatarImageListener } from '@nitrots/api'; +import { GetConfiguration } from '@nitrots/configuration'; +import { AvatarRenderLibraryEvent, GetEventDispatcher, NitroEvent, NitroEventType } from '@nitrots/events'; +import { AvatarAssetDownloadLibrary } from './AvatarAssetDownloadLibrary'; +import { AvatarStructure } from './AvatarStructure'; + +export class AvatarAssetDownloadManager +{ + private _assets: IAssetManager; + private _structure: AvatarStructure; + + private _missingMandatoryLibs: string[] = []; + private _figureMap: Map = new Map(); + private _figureListeners: Map = new Map(); + private _incompleteFigures: Map = new Map(); + private _currentDownloads: AvatarAssetDownloadLibrary[] = []; + private _libraryNames: string[] = []; + + constructor(assets: IAssetManager, structure: AvatarStructure) + { + this._assets = assets; + this._structure = structure; + } + + public async init(): Promise + { + this._missingMandatoryLibs = GetConfiguration().getValue('avatar.mandatory.libraries'); + + const url = GetConfiguration().getValue('avatar.figuremap.url'); + + if(!url || !url.length) throw new Error('Invalid figure map url'); + + const response = await fetch(url); + + if(response.status !== 200) throw new Error('Invalid figure map file'); + + const responseData = await response.json(); + + this.processFigureMap(responseData.libraries); + + GetEventDispatcher().addEventListener(NitroEventType.AVATAR_ASSET_DOWNLOADED, (event: AvatarRenderLibraryEvent) => this.onLibraryLoaded(event)); + + await this.processMissingLibraries(); + } + + private processFigureMap(data: any): void + { + if(!data) return; + + const downloadUrl = GetConfiguration().getValue('avatar.asset.url'); + + for(const library of data) + { + if(!library) continue; + + const libraryName = (library.id as string); + const revision = (library.revision || ''); + + if(this._libraryNames.indexOf(libraryName) >= 0) continue; + + this._libraryNames.push(libraryName); + + const downloadLibrary = new AvatarAssetDownloadLibrary(libraryName, revision, downloadUrl, this._assets); + + for(const part of library.parts) + { + const id = (part.id as string); + const type = (part.type as string); + const partString = (type + ':' + id); + + let existing = this._figureMap.get(partString); + + if(!existing) existing = []; + + existing.push(downloadLibrary); + + this._figureMap.set(partString, existing); + } + } + } + + private async processMissingLibraries(): Promise + { + const promises: Promise[] = []; + + this._missingMandatoryLibs.forEach(value => + { + const libraries = this._figureMap.get(value); + + if(libraries) for(const library of libraries) promises.push(library.downloadAsset()); + }); + + this._missingMandatoryLibs = []; + + await Promise.all(promises); + } + + private onLibraryLoaded(event: AvatarRenderLibraryEvent): void + { + if(!event || !event.library) return; + + const loadedFigures: string[] = []; + + for(const [figure, libraries] of this._incompleteFigures.entries()) + { + let isReady = true; + + for(const library of libraries) + { + if(!library || library.isLoaded) continue; + + isReady = false; + + break; + } + + if(isReady) + { + loadedFigures.push(figure); + + const listeners = this._figureListeners.get(figure); + + if(listeners) + { + for(const listener of listeners) + { + if(!listener || listener.disposed) continue; + + listener.resetFigure(figure); + } + } + + this._figureListeners.delete(figure); + + GetEventDispatcher().dispatchEvent(new NitroEvent(NitroEventType.AVATAR_ASSET_LOADED)); + } + } + + for(const figure of loadedFigures) + { + if(!figure) continue; + + this._incompleteFigures.delete(figure); + } + + let index = 0; + + while(index < this._currentDownloads.length) + { + const download = this._currentDownloads[index]; + + if(download) + { + if(download.libraryName === event.library.libraryName) this._currentDownloads.splice(index, 1); + } + + index++; + } + } + + public isAvatarFigureContainerReady(container: IAvatarFigureContainer): boolean + { + return !this.getAvatarFigurePendingLibraries(container).length; + } + + private getAvatarFigurePendingLibraries(container: IAvatarFigureContainer): AvatarAssetDownloadLibrary[] + { + const pendingLibraries: AvatarAssetDownloadLibrary[] = []; + + if(!container || !this._structure) return pendingLibraries; + + const figureData = this._structure.figureData; + + if(!figureData) return pendingLibraries; + + const setKeys = container.getPartTypeIds(); + + for(const key of setKeys) + { + const set = figureData.getSetType(key); + + if(!set) continue; + + const figurePartSet = set.getPartSet(container.getPartSetId(key)); + + if(!figurePartSet) continue; + + for(const part of figurePartSet.parts) + { + if(!part) continue; + + const name = (part.type + ':' + part.id); + const existing = this._figureMap.get(name); + + if(existing === undefined) continue; + + for(const library of existing) + { + if(!library || library.isLoaded) continue; + + if(pendingLibraries.indexOf(library) >= 0) continue; + + pendingLibraries.push(library); + } + } + } + + return pendingLibraries; + } + + public downloadAvatarFigure(container: IAvatarFigureContainer, listener: IAvatarImageListener): void + { + const figure = container.getFigureString(); + const pendingLibraries = this.getAvatarFigurePendingLibraries(container); + + if(pendingLibraries && pendingLibraries.length) + { + if(listener && !listener.disposed) + { + let listeners = this._figureListeners.get(figure); + + if(!listeners) + { + listeners = []; + + this._figureListeners.set(figure, listeners); + } + + listeners.push(listener); + } + + this._incompleteFigures.set(figure, pendingLibraries); + + for(const library of pendingLibraries) + { + if(!library) continue; + + library.downloadAsset(); + } + } + else + { + if(listener && !listener.disposed) listener.resetFigure(figure); + } + } +} diff --git a/packages/avatar/src/AvatarFigureContainer.ts b/packages/avatar/src/AvatarFigureContainer.ts new file mode 100644 index 0000000..7bfa63b --- /dev/null +++ b/packages/avatar/src/AvatarFigureContainer.ts @@ -0,0 +1,116 @@ +import { IAvatarFigureContainer } from '@nitrots/api'; + +export class AvatarFigureContainer implements IAvatarFigureContainer +{ + private _parts: Map>; + + constructor(figure: string) + { + this._parts = new Map(); + + this.parseFigure(figure); + } + + public getPartTypeIds(): IterableIterator + { + return this.partSets().keys(); + } + + public hasPartType(k: string): boolean + { + return !!this.partSets().get(k); + } + + public getPartSetId(k: string): number + { + const existing = this.partSets().get(k); + + if(!existing) return 0; + + return existing.get('setid'); + } + + public getPartColorIds(k: string): number[] + { + const existing = this.partSets().get(k); + + if(!existing) return null; + + return existing.get('colorids'); + } + + public updatePart(setType: string, partSetId: number, colorIds: number[]): void + { + const set: Map = new Map(); + + set.set('type', setType); + set.set('setid', partSetId); + set.set('colorids', colorIds); + + const existingSets = this.partSets(); + + existingSets.delete(setType); + existingSets.set(setType, set); + } + + public removePart(k: string): void + { + this.partSets().delete(k); + } + + public getFigureString(): string + { + const parts: string[] = []; + + for(const key of this.partSets().keys()) + { + if(!key) continue; + + let setParts = []; + + setParts.push(key); + setParts.push(this.getPartSetId(key)); + + setParts = setParts.concat(this.getPartColorIds(key)); + + parts.push(setParts.join('-')); + } + + return parts.join('.'); + } + + private partSets(): Map> + { + if(!this._parts) this._parts = new Map(); + + return this._parts; + } + + private parseFigure(figure: string): void + { + if(!figure) figure = ''; + + for(const part of figure.split('.')) + { + const pieces = part.split('-'); + + if(pieces.length >= 2) + { + const type = pieces[0]; + const setId = parseInt(pieces[1]); + const colors = []; + + let index = 2; + + while(index < pieces.length) + { + colors.push(parseInt(pieces[index])); + + index++; + } + + this.updatePart(type, setId, colors); + } + } + } +} diff --git a/packages/avatar/src/AvatarImage.ts b/packages/avatar/src/AvatarImage.ts new file mode 100644 index 0000000..f23bfd7 --- /dev/null +++ b/packages/avatar/src/AvatarImage.ts @@ -0,0 +1,764 @@ +import { AvatarAction, AvatarDirectionAngle, AvatarScaleType, AvatarSetType, IActiveActionData, IAnimationLayerData, IAvatarDataContainer, IAvatarEffectListener, IAvatarFigureContainer, IAvatarImage, IPartColor, ISpriteDataContainer } from '@nitrots/api'; +import { GetRenderer, GetTexturePool, GetTickerTime, PaletteMapFilter, TextureUtils } from '@nitrots/utils'; +import { ColorMatrixFilter, Container, RenderTexture, Sprite, Texture } from 'pixi.js'; +import { AvatarFigureContainer } from './AvatarFigureContainer'; +import { AvatarStructure } from './AvatarStructure'; +import { EffectAssetDownloadManager } from './EffectAssetDownloadManager'; +import { ActiveActionData } from './actions'; +import { AssetAliasCollection } from './alias'; +import { AvatarImageCache } from './cache'; +import { AvatarCanvas } from './structure'; + +export class AvatarImage implements IAvatarImage, IAvatarEffectListener +{ + private static CHANNELS_EQUAL: string = 'CHANNELS_EQUAL'; + private static CHANNELS_UNIQUE: string = 'CHANNELS_UNIQUE'; + private static CHANNELS_RED: string = 'CHANNELS_RED'; + private static CHANNELS_GREEN: string = 'CHANNELS_GREEN'; + private static CHANNELS_BLUE: string = 'CHANNELS_BLUE'; + private static CHANNELS_DESATURATED: string = 'CHANNELS_DESATURATED'; + private static DEFAULT_ACTION: string = 'Default'; + private static DEFAULT_DIRECTION: number = 2; + private static DEFAULT_AVATAR_SET: string = AvatarSetType.FULL; + + protected _mainDirection: number; + protected _headDirection: number; + protected _mainAction: IActiveActionData; + protected _disposed: boolean = false; + protected _canvasOffsets: number[] = []; + protected _cache: AvatarImageCache; + protected _avatarSpriteData: IAvatarDataContainer; + protected _actions: ActiveActionData[] = []; + protected _activeTexture: Texture = null; + + private _defaultAction: IActiveActionData = null; + private _frameCounter: number = 0; + private _directionOffset: number = 0; + private _changes: boolean = true; + private _sprites: ISpriteDataContainer[]; + private _isAnimating: boolean = false; + private _animationHasResetOnToggle: boolean = false; + private _actionsSorted: boolean = false; + private _sortedActions: IActiveActionData[]; + private _lastActionsString: string = null; + private _currentActionsString: string = null; + private _effectIdInUse: number = -1; + private _animationFrameCount: number = -1; + private _cachedBodyParts: string[] = []; + private _cachedBodyPartsDirection: number = -1; + private _cachedBodyPartsGeometryType: string = null; + private _cachedBodyPartsAvatarSet: string = null; + + constructor( + private _structure: AvatarStructure, + private _assets: AssetAliasCollection, + private _figure: AvatarFigureContainer, + private _scale: string, + private _effectManager: EffectAssetDownloadManager, + private _effectListener: IAvatarEffectListener = null) + { + if(!this._figure) this._figure = new AvatarFigureContainer('hr-893-45.hd-180-2.ch-210-66.lg-270-82.sh-300-91.wa-2007-.ri-1-'); + if(!this._scale) this._scale = AvatarScaleType.LARGE; + + this._cache = new AvatarImageCache(this._structure, this, this._assets, this._scale); + this.setDirection(AvatarImage.DEFAULT_AVATAR_SET, AvatarImage.DEFAULT_DIRECTION); + this._defaultAction = new ActiveActionData(AvatarAction.POSTURE_STAND); + this._defaultAction.definition = this._structure.getActionDefinition(AvatarImage.DEFAULT_ACTION); + this.resetActions(); + this._animationFrameCount = 0; + } + + public dispose(): void + { + if(this._disposed) return; + + this._structure = null; + this._assets = null; + this._mainAction = null; + this._figure = null; + this._avatarSpriteData = null; + this._actions = null; + + if(this._activeTexture) + { + GetTexturePool().putTexture(this._activeTexture); + + this._activeTexture = null; + } + + if(this._cache) + { + this._cache.dispose(); + this._cache = null; + } + + this._canvasOffsets = null; + this._disposed = true; + } + + public get disposed(): boolean + { + return this._disposed; + } + + public getFigure(): IAvatarFigureContainer + { + return this._figure; + } + + public getScale(): string + { + return this._scale; + } + + public getPartColor(k: string): IPartColor + { + return this._structure.getPartColor(this._figure, k); + } + + public setDirection(avatarPart: string, direction: number): void + { + direction += this._directionOffset; + + if(direction < AvatarDirectionAngle.MIN_DIRECTION) + { + direction = AvatarDirectionAngle.MAX_DIRECTION + (direction + 1); + } + else if(direction > AvatarDirectionAngle.MAX_DIRECTION) + { + direction -= (AvatarDirectionAngle.MAX_DIRECTION + 1); + } + + if(this._structure.isMainAvatarSet(avatarPart)) this._mainDirection = direction; + + // Special handling for head direction, including prevention checks for turning + if(avatarPart === AvatarSetType.HEAD || avatarPart === AvatarSetType.FULL) + { + if(avatarPart === AvatarSetType.HEAD && this.isHeadTurnPreventedByAction()) direction = this._mainDirection; + + this._headDirection = direction; + } + + this._cache.setDirection(avatarPart, direction); + this._changes = true; + } + + public setDirectionAngle(k: string, _arg_2: number): void + { + this.setDirection(k, Math.floor(_arg_2 / 45)); + } + + public getSprites(): ISpriteDataContainer[] + { + return this._sprites; + } + + public getCanvasOffsets(): number[] + { + return this._canvasOffsets; + } + + public getLayerData(k: ISpriteDataContainer): IAnimationLayerData + { + return this._structure.getBodyPartData(k.animation.id, this._frameCounter, k.id); + } + + public updateAnimationByFrames(k: number = 1): void + { + this._frameCounter += k; + this._changes = true; + } + + public resetAnimationFrameCounter(): void + { + this._frameCounter = 0; + this._changes = true; + } + + private getBodyParts(avatarSet: string, geometryType: string, direction: number): string[] + { + const shouldUpdateCache = direction !== this._cachedBodyPartsDirection || geometryType !== this._cachedBodyPartsGeometryType || avatarSet !== this._cachedBodyPartsAvatarSet; + + if(shouldUpdateCache) + { + this._cachedBodyPartsDirection = direction; + this._cachedBodyPartsGeometryType = geometryType; + this._cachedBodyPartsAvatarSet = avatarSet; + + this._cachedBodyParts = this._structure.getBodyParts(avatarSet, geometryType, direction); + } + + return this._cachedBodyParts; + } + + private buildAvatarContainer(avatarCanvas: AvatarCanvas, setType: string): Container + { + const bodyParts = this.getBodyParts(setType, this._mainAction.definition.geometryType, this._mainDirection); + const container = new Container(); + + let partCount = (bodyParts.length - 1); + + while(partCount >= 0) + { + const set = bodyParts[partCount]; + const part = this._cache.getImageContainer(set, this._frameCounter); + + if(part) + { + const partCacheContainer = part.image; + + if(partCacheContainer) + { + const partContainer = new Container(); + + partContainer.addChild(partCacheContainer); + + const point = part.regPoint.clone(); + + point.x += avatarCanvas.offset.x; + point.y += avatarCanvas.offset.y; + + point.x += avatarCanvas.regPoint.x; + point.y += avatarCanvas.regPoint.y; + + partContainer.position.set(point.x, point.y); + + container.addChild(partContainer); + } + } + + partCount--; + } + + container.filters = []; + + if(this._avatarSpriteData) + { + if(this._avatarSpriteData.colorTransform) + { + if(container.filters === undefined || container.filters === null) container.filters = [ this._avatarSpriteData.colorTransform ]; + else if(Array.isArray(container.filters)) container.filters = [ ...container.filters, this._avatarSpriteData.colorTransform ]; + else container.filters = [ container.filters, this._avatarSpriteData.colorTransform ]; + } + + if(this._avatarSpriteData.paletteIsGrayscale) + { + this.convertToGrayscale(container); + + const paletteMapFilter = new PaletteMapFilter({ + palette: this._avatarSpriteData.reds, + channel: PaletteMapFilter.CHANNEL_RED + }); + + if(container.filters === undefined || container.filters === null) container.filters = [ paletteMapFilter ]; + else if(Array.isArray(container.filters)) container.filters = [ ...container.filters, paletteMapFilter ]; + else container.filters = [ container.filters, paletteMapFilter ]; + } + } + + return container; + } + + public processAsTexture(setType: string, hightlight: boolean): Texture + { + if(!this._changes) return this._activeTexture; + + if(!this._mainAction) return null; + + if(!this._actionsSorted) this.endActionAppends(); + + const avatarCanvas = this._structure.getCanvas(this._scale, this._mainAction.definition.geometryType); + + if(!avatarCanvas) return null; + + const container = this.buildAvatarContainer(avatarCanvas, setType); + + if(this._activeTexture && ((this._activeTexture.width !== avatarCanvas.width) || (this._activeTexture.height !== avatarCanvas.height))) + { + GetTexturePool().putTexture(this._activeTexture); + + this._activeTexture = null; + } + + if(!this._activeTexture) this._activeTexture = GetTexturePool().getTexture(avatarCanvas.width, avatarCanvas.height); + + if(!this._activeTexture) return null; + + GetRenderer().render({ + target: this._activeTexture, + container: container, + clear: true + }); + + container.destroy(); + + //@ts-ignore + this._activeTexture.source.hitMap = null; + + this._changes = false; + + return this._activeTexture; + } + + public processAsImageUrl(setType: string, scale: number = 1): string + { + const texture = this.processAsTexture(setType, false); + const canvas = GetRenderer().texture.generateCanvas(texture); + + const url = canvas.toDataURL('image/png'); + + return url; + } + + public processAsContainer(setType: string): Container + { + if(!this._mainAction) return null; + + if(!this._actionsSorted) this.endActionAppends(); + + const avatarCanvas = this._structure.getCanvas(this._scale, this._mainAction.definition.geometryType); + + if(!avatarCanvas) return null; + + return this.buildAvatarContainer(avatarCanvas, setType); + } + + public applyPalette(texture: RenderTexture, reds: number[] = [], greens: number[] = [], blues: number[] = []): RenderTexture + { + const textureCanvas = TextureUtils.generateCanvas(texture); + const textureCtx = textureCanvas.getContext('2d'); + const textureImageData = textureCtx.getImageData(0, 0, textureCanvas.width, textureCanvas.height); + const data = textureImageData.data; + + for(let i = 0; i < data.length; i += 4) + { + if(reds.length == 256) + { + let paletteColor = reds[data[i]]; + if(paletteColor === undefined) paletteColor = 0; + + data[i] = ((paletteColor >> 16) & 0xFF); + data[i + 1] = ((paletteColor >> 8) & 0xFF); + data[i + 2] = (paletteColor & 0xFF); + } + + if(greens.length == 256) + { + let paletteColor = greens[data[i + 1]]; + if(paletteColor === undefined) paletteColor = 0; + + data[i] = ((paletteColor >> 16) & 0xFF); + data[i + 1] = ((paletteColor >> 8) & 0xFF); + data[i + 2] = (paletteColor & 0xFF); + } + if(blues.length == 256) + { + let paletteColor = greens[data[i + 2]]; + if(paletteColor === undefined) paletteColor = 0; + + data[i] = ((paletteColor >> 16) & 0xFF); + data[i + 1] = ((paletteColor >> 8) & 0xFF); + data[i + 2] = (paletteColor & 0xFF); + } + } + + textureCtx.putImageData(textureImageData, 0, 0); + + const newTexture = new Sprite(Texture.from(textureCanvas)); + + TextureUtils.writeToTexture(newTexture, texture, true); + + return texture; + } + + public getDirection(): number + { + return this._mainDirection; + } + + public initActionAppends(): void + { + this._actions = []; + this._actionsSorted = false; + this._currentActionsString = ''; + } + + public endActionAppends(): void + { + if(!this.sortActions()) return; + + for(const k of this._sortedActions) + { + if(k.actionType === AvatarAction.EFFECT) + { + if(!this._effectManager.isAvatarEffectReady(parseInt(k.actionParameter))) this._effectManager.downloadAvatarEffect(parseInt(k.actionParameter), this); + } + } + + this.resetActions(); + this.setActionsToParts(); + } + + public appendAction(k: string, ..._args: any[]): boolean + { + let _local_3 = ''; + + this._actionsSorted = false; + + if(_args && (_args.length > 0)) _local_3 = _args[0]; + + if((_local_3 !== undefined) && (_local_3 !== null)) _local_3 = _local_3.toString(); + + switch(k) + { + case AvatarAction.POSTURE: + switch(_local_3) + { + case AvatarAction.POSTURE_LAY: + case AvatarAction.POSTURE_WALK: + case AvatarAction.POSTURE_STAND: + case AvatarAction.POSTURE_SWIM: + case AvatarAction.POSTURE_FLOAT: + case AvatarAction.POSTURE_SIT: + case AvatarAction.SNOWWAR_RUN: + case AvatarAction.SNOWWAR_DIE_FRONT: + case AvatarAction.SNOWWAR_DIE_BACK: + case AvatarAction.SNOWWAR_PICK: + case AvatarAction.SNOWWAR_THROW: + if((_local_3 === AvatarAction.POSTURE_LAY) || (_local_3 === AvatarAction.POSTURE_LAY) || (_local_3 === AvatarAction.POSTURE_LAY)) + { + if(_local_3 === AvatarAction.POSTURE_LAY) + { + if(this._mainDirection == 0) + { + this.setDirection(AvatarSetType.FULL, 4); + } + else + { + this.setDirection(AvatarSetType.FULL, 2); + } + } + } + + this.addActionData(_local_3); + break; + } + break; + case AvatarAction.GESTURE: + switch(_local_3) + { + case AvatarAction.GESTURE_AGGRAVATED: + case AvatarAction.GESTURE_SAD: + case AvatarAction.GESTURE_SMILE: + case AvatarAction.GESTURE_SURPRISED: + this.addActionData(_local_3); + break; + } + break; + case AvatarAction.EFFECT: + case AvatarAction.DANCE: + case AvatarAction.TALK: + case AvatarAction.EXPRESSION_WAVE: + case AvatarAction.SLEEP: + case AvatarAction.SIGN: + case AvatarAction.EXPRESSION_RESPECT: + case AvatarAction.EXPRESSION_BLOW_A_KISS: + case AvatarAction.EXPRESSION_LAUGH: + case AvatarAction.EXPRESSION_CRY: + case AvatarAction.EXPRESSION_IDLE: + case AvatarAction.EXPRESSION_SNOWBOARD_OLLIE: + case AvatarAction.EXPRESSION_SNOWBORD_360: + case AvatarAction.EXPRESSION_RIDE_JUMP: + if(_local_3 === AvatarAction.EFFECT) + { + if((((((_local_3 === '33') || (_local_3 === '34')) || (_local_3 === '35')) || (_local_3 === '36')) || (_local_3 === '38')) || (_local_3 === '39')) + { + // + } + } + + this.addActionData(k, _local_3); + break; + case AvatarAction.CARRY_OBJECT: + case AvatarAction.USE_OBJECT: { + const _local_4 = this._structure.getActionDefinitionWithState(k); + if(_local_4) _local_3 = _local_4.getParameterValue(_local_3); + this.addActionData(k, _local_3); + break; + } + } + + return true; + } + + protected addActionData(actionType: string, actionParameter: string = ''): void + { + if(!this._actions) this._actions = []; + + const actionExists = this._actions.some(action => + action.actionType === actionType && action.actionParameter === actionParameter + ); + + if(!actionExists) this._actions.push(new ActiveActionData(actionType, actionParameter, this._frameCounter)); + } + + public isAnimating(): boolean + { + return (this._isAnimating) || (this._animationFrameCount > 1); + } + + private resetActions(): boolean + { + this._animationHasResetOnToggle = false; + this._isAnimating = false; + this._sprites = []; + this._avatarSpriteData = null; + this._directionOffset = 0; + this._structure.removeDynamicItems(this); + this._mainAction = this._defaultAction; + this._mainAction.definition = this._defaultAction.definition; + this.resetBodyPartCache(this._defaultAction); + return true; + } + + private isHeadTurnPreventedByAction(): boolean + { + if(!this._sortedActions) return false; + + for(const action of this._sortedActions) + { + const actionDefinition = this._structure.getActionDefinitionWithState(action.actionType); + + if(actionDefinition != null && actionDefinition.getPreventHeadTurn(action.actionParameter)) return true; + } + + return false; + } + + private sortActions(): boolean + { + let hasChanges = false; + let hasEffectAction = false; + let effectChanged = false; + + this._currentActionsString = ''; + this._sortedActions = this._structure.sortActions(this._actions); + this._animationFrameCount = this._structure.maxFrames(this._sortedActions); + + if(!this._sortedActions) + { + this._canvasOffsets = [0, 0, 0]; + + if(this._lastActionsString !== '') + { + hasChanges = true; + + this._lastActionsString = ''; + } + } + else + { + this._canvasOffsets = this._structure.getCanvasOffsets(this._sortedActions, this._scale, this._mainDirection); + + for(const action of this._sortedActions) + { + this._currentActionsString += action.actionType + action.actionParameter; + + if(action.actionType === AvatarAction.EFFECT) + { + const effectId = parseInt(action.actionParameter); + + if(this._effectIdInUse !== effectId) effectChanged = true; + + this._effectIdInUse = effectId; + + hasEffectAction = true; + } + } + + if(!hasEffectAction) + { + if(this._effectIdInUse > -1) effectChanged = true; + + this._effectIdInUse = -1; + } + + if(effectChanged) this._cache.disposeInactiveActions(); + + if(this._lastActionsString != this._currentActionsString) + { + hasChanges = true; + + this._lastActionsString = this._currentActionsString; + } + } + + this._actionsSorted = true; + + return hasChanges; + } + + private setActionsToParts(): void + { + if(!this._sortedActions) return; + + const currentTime = GetTickerTime(); + const actionTypes: string[] = []; + + for(const action of this._sortedActions) actionTypes.push(action.actionType); + + for(const action of this._sortedActions) + { + if(action && action.definition && action.definition.isAnimation) + { + const animation = this._structure.getAnimation(`${action.definition.state}.${action.actionParameter}`); + + if(animation && animation.hasOverriddenActions()) + { + const overriddenActionNames = animation.overriddenActionNames(); + + if(overriddenActionNames) + { + for(const overriddenActionName of overriddenActionNames) + { + if(actionTypes.includes(overriddenActionName)) action.overridingAction = animation.overridingAction(overriddenActionName); + } + } + } + + if(animation && animation.resetOnToggle) this._animationHasResetOnToggle = true; + } + } + + for(const action of this._sortedActions) + { + if(action && action.definition) + { + if(action.definition.isAnimation && action.actionParameter === '') action.actionParameter = '1'; + + this.setActionToParts(action, currentTime); + + if(action.definition.isAnimation) + { + this._isAnimating = action.definition.isAnimated(action.actionParameter); + + const animation = this._structure.getAnimation(`${action.definition.state}.${action.actionParameter}`); + + if(animation) + { + this._sprites = [...this._sprites, ...animation.spriteData]; + + if(animation.hasDirectionData()) this._directionOffset = animation.directionData.offset; + + if(animation.hasAvatarData()) this._avatarSpriteData = animation.avatarData; + } + } + } + } + } + + private setActionToParts(action: IActiveActionData, currentTime: number): void + { + if(!action || !action.definition || action.definition.assetPartDefinition === '') return; + + if(action.definition.isMain) + { + this._mainAction = action; + this._cache.setGeometryType(action.definition.geometryType); + } + + this._cache.setAction(action, currentTime); + + this._changes = true; + } + + private resetBodyPartCache(action: IActiveActionData): void + { + if(!action || action.definition.assetPartDefinition === '') return; + + if(action.definition.isMain) + { + this._mainAction = action; + this._cache.setGeometryType(action.definition.geometryType); + } + + this._cache.resetBodyPartCache(action); + + this._changes = true; + } + + private convertToGrayscale(container: Container, channel: string = 'CHANNELS_EQUAL'): Container + { + let redWeight = 0.33; + let greenWeight = 0.33; + let blueWeight = 0.33; + + switch(channel) + { + case AvatarImage.CHANNELS_UNIQUE: + redWeight = 0.3; + greenWeight = 0.59; + blueWeight = 0.11; + break; + case AvatarImage.CHANNELS_RED: + redWeight = 1; + greenWeight = 0; + blueWeight = 0; + break; + case AvatarImage.CHANNELS_GREEN: + redWeight = 0; + greenWeight = 1; + blueWeight = 0; + break; + case AvatarImage.CHANNELS_BLUE: + redWeight = 0; + greenWeight = 0; + blueWeight = 1; + break; + case AvatarImage.CHANNELS_DESATURATED: + redWeight = 0.3086; + greenWeight = 0.6094; + blueWeight = 0.082; + break; + } + + const filter = new ColorMatrixFilter(); + + filter.matrix = [ + redWeight, greenWeight, blueWeight, 0, 0, // Red channel + redWeight, greenWeight, blueWeight, 0, 0, // Green channel + redWeight, greenWeight, blueWeight, 0, 0, // Blue channel + 0, 0, 0, 1, 0 // Alpha channel + ]; + + if(container.filters === undefined || container.filters === null) container.filters = [ filter ]; + else if(Array.isArray(container.filters)) container.filters = [ ...container.filters, filter ]; + else container.filters = [ container.filters, filter ]; + + return container; + } + + public isPlaceholder(): boolean + { + return false; + } + + public get animationHasResetOnToggle(): boolean + { + return this._animationHasResetOnToggle; + } + + public resetEffect(effect: number): void + { + if(effect === this._effectIdInUse) + { + this.resetActions(); + this.setActionsToParts(); + + this._animationHasResetOnToggle = true; + this._changes = true; + + if(this._effectListener) this._effectListener.resetEffect(effect); + } + } +} diff --git a/packages/avatar/src/AvatarImageBodyPartContainer.ts b/packages/avatar/src/AvatarImageBodyPartContainer.ts new file mode 100644 index 0000000..605ac12 --- /dev/null +++ b/packages/avatar/src/AvatarImageBodyPartContainer.ts @@ -0,0 +1,88 @@ +import { Container, Point } from 'pixi.js'; + +export class AvatarImageBodyPartContainer +{ + private _image: Container; + private _regPoint: Point; + private _offset: Point; + private _isCacheable: boolean; + + constructor(k: Container, _arg_2: Point, _arg_3: boolean) + { + this._image = k; + this._regPoint = _arg_2; + this._offset = new Point(0, 0); + this._regPoint = _arg_2; + this._isCacheable = _arg_3; + + this.cleanPoints(); + } + + public dispose(): void + { + if(this._image) + { + this._image.destroy({ + children: true + }); + } + + this._image = null; + this._regPoint = null; + this._offset = null; + } + + private cleanPoints(): void + { + // this._regPoint.x = this._regPoint.x; + // this._regPoint.y = this._regPoint.y; + // this._offset.x = this._offset.x; + // this._offset.y = this._offset.y; + } + + public setRegPoint(k: Point): void + { + this._regPoint = k; + + this.cleanPoints(); + } + + public get image(): Container + { + return this._image; + } + + public set image(k: Container) + { + if(this._image && (this._image !== k)) + { + this._image.destroy({ + children: true + }); + } + + this._image = k; + } + + public get regPoint(): Point + { + const clone = this._regPoint.clone(); + + clone.x += this._offset.x; + clone.y += this._offset.y; + + return clone; + } + + public set offset(k: Point) + { + this._offset = k; + + this.cleanPoints(); + } + + public get isCacheable(): boolean + { + return this._isCacheable; + } +} diff --git a/packages/avatar/src/AvatarImagePartContainer.ts b/packages/avatar/src/AvatarImagePartContainer.ts new file mode 100644 index 0000000..d891543 --- /dev/null +++ b/packages/avatar/src/AvatarImagePartContainer.ts @@ -0,0 +1,133 @@ +import { IActionDefinition, IPartColor } from '@nitrots/api'; +import { AvatarAnimationFrame } from './structure'; + +export class AvatarImagePartContainer +{ + private _bodyPartId: string; + private _partType: string; + private _flippedPartType: string; + private _partId: string; + private _color: IPartColor; + private _frames: AvatarAnimationFrame[]; + private _action: IActionDefinition; + private _isColorable: boolean; + private _isBlendable: boolean; + private _paletteMapId: number; + + constructor(bodyPartId: string, partType: string, partId: string, partColor: IPartColor, frames: AvatarAnimationFrame[], action: IActionDefinition, isColorable: boolean, paletteMapId: number, flippedPartType: string = '', isBlendable: boolean = false, _arg_11: number = 1) + { + this._bodyPartId = bodyPartId; + this._partType = partType; + this._partId = partId; + this._color = partColor; + this._frames = frames; + this._action = action; + this._isColorable = isColorable; + this._paletteMapId = paletteMapId; + this._flippedPartType = flippedPartType; + this._isBlendable = isBlendable; + + if(this._partType === 'ey') this._isColorable = false; + } + + public getFrameIndex(k: number): number + { + if(!this._frames || !this._frames.length) return 0; + + const frameNumber = (k % this._frames.length); + + if(this._frames[frameNumber] instanceof AvatarAnimationFrame) + { + return this._frames[frameNumber].number; + } + + return frameNumber; + } + + public getFrameDefinition(k: number): AvatarAnimationFrame + { + const frameNumber = (k % this._frames.length); + + if(this._frames && (this._frames.length > frameNumber)) + { + if(this._frames[frameNumber] instanceof AvatarAnimationFrame) + { + return this._frames[frameNumber]; + } + } + + return null; + } + + public getCacheableKey(k: number): string + { + const frameNumber = (k % this._frames.length); + + if(this._frames && (this._frames.length > frameNumber)) + { + if(this._frames[frameNumber] instanceof AvatarAnimationFrame) + { + const frame = this._frames[frameNumber]; + + return (this.partId + ':' + frame.assetPartDefinition + ':' + frame.number); + } + } + + return (this.partId + ':' + frameNumber); + } + + public get bodyPartId(): string + { + return this._bodyPartId; + } + + public get partType(): string + { + return this._partType; + } + + public get partId(): string + { + return this._partId; + } + + public get color(): IPartColor + { + return this._color; + } + + public get action(): IActionDefinition + { + return this._action; + } + + public get isColorable(): boolean + { + return this._isColorable; + } + + public set isColorable(k: boolean) + { + this._isColorable = k; + } + + public get paletteMapId(): number + { + return this._paletteMapId; + } + + public get flippedPartType(): string + { + return this._flippedPartType; + } + + public get isBlendable(): boolean + { + return this._isBlendable; + } + + public toString(): string + { + return [this._bodyPartId, this._partType, this._partId].join(':'); + } +} diff --git a/packages/avatar/src/AvatarRenderManager.ts b/packages/avatar/src/AvatarRenderManager.ts new file mode 100644 index 0000000..8c3d9e7 --- /dev/null +++ b/packages/avatar/src/AvatarRenderManager.ts @@ -0,0 +1,292 @@ +import { AvatarSetType, IAssetManager, IAvatarEffectListener, IAvatarFigureContainer, IAvatarImage, IAvatarImageListener, IAvatarRenderManager, IFigureData, IFigurePartSet, IGraphicAsset, IStructureData } from '@nitrots/api'; +import { GetAssetManager } from '@nitrots/assets'; +import { GetConfiguration } from '@nitrots/configuration'; +import { GetEventDispatcher, NitroEventType } from '@nitrots/events'; +import { AvatarAssetDownloadManager } from './AvatarAssetDownloadManager'; +import { AvatarFigureContainer } from './AvatarFigureContainer'; +import { AvatarImage } from './AvatarImage'; +import { AvatarStructure } from './AvatarStructure'; +import { EffectAssetDownloadManager } from './EffectAssetDownloadManager'; +import { FigureDataContainer } from './FigureDataContainer'; +import { PlaceHolderAvatarImage } from './PlaceHolderAvatarImage'; +import { AssetAliasCollection } from './alias'; +import { HabboAvatarAnimations } from './data/HabboAvatarAnimations'; +import { HabboAvatarGeometry } from './data/HabboAvatarGeometry'; +import { HabboAvatarPartSets } from './data/HabboAvatarPartSets'; + +export class AvatarRenderManager implements IAvatarRenderManager +{ + private static DEFAULT_FIGURE: string = 'hd-99999-99999'; + + private _structure: AvatarStructure = new AvatarStructure(this); + private _aliasCollection: AssetAliasCollection = new AssetAliasCollection(this, GetAssetManager()); + private _avatarAssetDownloadManager: AvatarAssetDownloadManager = new AvatarAssetDownloadManager(GetAssetManager(), this._structure); + private _effectAssetDownloadManager: EffectAssetDownloadManager = new EffectAssetDownloadManager(GetAssetManager(), this._structure); + + private _placeHolderFigure: AvatarFigureContainer = new AvatarFigureContainer(AvatarRenderManager.DEFAULT_FIGURE); + + public async init(): Promise + { + this._structure?.initGeometry(HabboAvatarGeometry.geometry); + this._structure?.initPartSets(HabboAvatarPartSets.partSets); + + await this.loadActions(); + + this._structure?.initAnimation(HabboAvatarAnimations.animations); + await this.loadFigureData(); + + this._aliasCollection.init(); + + GetEventDispatcher().addEventListener(NitroEventType.AVATAR_ASSET_LOADED, () => this._aliasCollection.reset()); + GetEventDispatcher().addEventListener(NitroEventType.AVATAR_EFFECT_LOADED, () => this._aliasCollection.reset()); + + await this._avatarAssetDownloadManager.init(); + await this._effectAssetDownloadManager.init(); + } + + private async loadActions(): Promise + { + const defaultActions = GetConfiguration().getValue('avatar.default.actions'); + + if(defaultActions) this._structure.initActions(GetAssetManager(), defaultActions); + + const url = GetConfiguration().getValue('avatar.actions.url'); + + if(!url || !url.length) throw new Error('Invalid avatar action url'); + + const response = await fetch(url); + + if(response.status !== 200) throw new Error('Invalid avatar action file'); + + this._structure.updateActions(await response.json()); + } + + private async loadFigureData(): Promise + { + const defaultFigureData = GetConfiguration().getValue('avatar.default.figuredata'); + + if(defaultFigureData) this._structure?.initFigureData(defaultFigureData); + + const url = GetConfiguration().getValue('avatar.figuredata.url'); + + if(!url || !url.length) throw new Error('Invalid figure data url'); + + const response = await fetch(url); + + if(response.status !== 200) throw new Error('Invalid figure data file'); + + this._structure.figureData.appendJSON(await response.json()); + + this._structure.init(); + } + + public createFigureContainer(figure: string): IAvatarFigureContainer + { + return new AvatarFigureContainer(figure); + } + + public isFigureContainerReady(container: IAvatarFigureContainer): boolean + { + if(!this._avatarAssetDownloadManager) return false; + + return this._avatarAssetDownloadManager.isAvatarFigureContainerReady(container); + } + + public createAvatarImage(figure: string, size: string, gender: string, listener: IAvatarImageListener = null, effectListener: IAvatarEffectListener = null): IAvatarImage + { + if(!this._structure || !this._avatarAssetDownloadManager) return null; + + const figureContainer = new AvatarFigureContainer(figure); + + if(gender) this.validateAvatarFigure(figureContainer, gender); + + if(this._avatarAssetDownloadManager.isAvatarFigureContainerReady(figureContainer)) + { + return new AvatarImage(this._structure, this._aliasCollection, figureContainer, size, this._effectAssetDownloadManager, effectListener); + } + + this._avatarAssetDownloadManager.downloadAvatarFigure(figureContainer, listener); + + return new PlaceHolderAvatarImage(this._structure, this._aliasCollection, this._placeHolderFigure, size, this._effectAssetDownloadManager); + } + + public downloadAvatarFigure(container: IAvatarFigureContainer, listener: IAvatarImageListener): void + { + if(!this._avatarAssetDownloadManager) return; + + this._avatarAssetDownloadManager.downloadAvatarFigure(container, listener); + } + + private validateAvatarFigure(container: AvatarFigureContainer, gender: string): boolean + { + let isValid = false; + + const typeIds = this._structure.getMandatorySetTypeIds(gender, 2); + + if(typeIds) + { + const figureData = this._structure.figureData; + + for(const id of typeIds) + { + if(!container.hasPartType(id)) + { + const figurePartSet = this._structure.getDefaultPartSet(id, gender); + + if(figurePartSet) + { + container.updatePart(id, figurePartSet.id, [0]); + + isValid = true; + } + } + else + { + const setType = figureData.getSetType(id); + + if(setType) + { + const figurePartSet = setType.getPartSet(container.getPartSetId(id)); + + if(!figurePartSet) + { + const partSet = this._structure.getDefaultPartSet(id, gender); + + if(partSet) + { + container.updatePart(id, partSet.id, [0]); + + isValid = true; + } + } + } + } + } + } + + return !(isValid); + } + + public getFigureClubLevel(container: IAvatarFigureContainer, gender: string, searchParts: string[] = null): number + { + if(!this._structure) return 0; + + const figureData = this._structure.figureData; + const parts = Array.from(container.getPartTypeIds()); + + let clubLevel = 0; + + for(const part of parts) + { + const set = figureData.getSetType(part); + + if(!set) continue; + + const setId = container.getPartSetId(part); + const partSet = set.getPartSet(setId); + + if(partSet) + { + clubLevel = Math.max(partSet.clubLevel, clubLevel); + + const palette = figureData.getPalette(set.paletteID); + const colors = container.getPartColorIds(part); + + for(const colorId of colors) + { + const color = palette.getColor(colorId); + + if(!color) continue; + + clubLevel = Math.max(color.clubLevel, clubLevel); + } + } + } + + if(!searchParts) searchParts = this._structure.getBodyPartsUnordered(AvatarSetType.FULL); + + for(const part of searchParts) + { + const set = figureData.getSetType(part); + + if(!set) continue; + + if(parts.indexOf(part) === -1) clubLevel = Math.max(set.optionalFromClubLevel(gender), clubLevel); + } + + return clubLevel; + } + + public isValidFigureSetForGender(setId: number, gender: string): boolean + { + const structure = this.structureData; + const partSet = structure.getFigurePartSet(setId); + + return !!(partSet && ((partSet.gender.toUpperCase() === 'U') || (partSet.gender.toUpperCase() === gender.toUpperCase()))); + } + + public getFigureStringWithFigureIds(figure: string, gender: string, _arg_3: number[]): string + { + const container = new FigureDataContainer(); + + container.loadAvatarData(figure, gender); + + const partSets: IFigurePartSet[] = this.resolveFigureSets(_arg_3); + + for(const partSet of partSets) + { + container.savePartData(partSet.type, partSet.id, container.getColourIds(partSet.type)); + } + + return container.getFigureString(); + } + + private resolveFigureSets(setIds: number[]): IFigurePartSet[] + { + const structure = this.structureData; + const partSets: IFigurePartSet[] = []; + + for(const setId of setIds) + { + const partSet = structure.getFigurePartSet(setId); + + if(partSet) partSets.push(partSet); + } + + return partSets; + } + + public getMandatoryAvatarPartSetIds(k: string, _arg_2: number): string[] + { + if(!this._structure) return null; + + return this._structure.getMandatorySetTypeIds(k, _arg_2); + } + + public getAssetByName(name: string): IGraphicAsset + { + return this._aliasCollection.getAsset(name); + } + + public get assets(): IAssetManager + { + return GetAssetManager(); + } + + public get structure(): AvatarStructure + { + return this._structure; + } + + public get structureData(): IStructureData + { + if(this._structure) return this._structure.figureData; + + return null; + } + + public get downloadManager(): AvatarAssetDownloadManager + { + return this._avatarAssetDownloadManager; + } +} diff --git a/packages/avatar/src/AvatarStructure.ts b/packages/avatar/src/AvatarStructure.ts new file mode 100644 index 0000000..4d841d4 --- /dev/null +++ b/packages/avatar/src/AvatarStructure.ts @@ -0,0 +1,619 @@ +import { AvatarDirectionAngle, IActionDefinition, IActiveActionData, IAssetAnimation, IAssetManager, IAvatarFigureContainer, IAvatarImage, IAvatarRenderManager, IFigureData, IFigurePartSet, IPartColor, IStructureData } from '@nitrots/api'; +import { Point } from 'pixi.js'; +import { AvatarImagePartContainer } from './AvatarImagePartContainer'; +import { AvatarRenderManager } from './AvatarRenderManager'; +import { ActionDefinition, AvatarActionManager } from './actions'; +import { Animation, AnimationManager, AvatarAnimationLayerData } from './animation'; +import { AvatarModelGeometry } from './geometry'; +import { AnimationAction, AvatarAnimationData, AvatarAnimationFrame, AvatarCanvas, FigureSetData, PartSetsData } from './structure'; + +export class AvatarStructure +{ + private _renderManager: AvatarRenderManager; + private _geometry: AvatarModelGeometry; + private _figureData: FigureSetData; + private _partSetsData: PartSetsData; + private _animationData: AvatarAnimationData; + private _animationManager: AnimationManager; + private _mandatorySetTypeIds: { [index: string]: { [index: number]: string[] } }; + private _actionManager: AvatarActionManager; + private _defaultAction: IActionDefinition; + + constructor(renderManager: AvatarRenderManager) + { + this._renderManager = renderManager; + this._geometry = null; + this._figureData = new FigureSetData(); + this._partSetsData = new PartSetsData(); + this._animationData = new AvatarAnimationData(); + this._animationManager = new AnimationManager(); + this._mandatorySetTypeIds = {}; + this._actionManager = null; + this._defaultAction = null; + } + + public init(): void + { + + } + + public initGeometry(k: any): void + { + if(!k) return; + + this._geometry = new AvatarModelGeometry(k); + } + + public initActions(k: IAssetManager, _arg_2: any): void + { + if(!_arg_2) return; + + this._actionManager = new AvatarActionManager(k, _arg_2); + this._defaultAction = this._actionManager.getDefaultAction(); + } + + public updateActions(data: any): void + { + this._actionManager.updateActions(data); + + this._defaultAction = this._actionManager.getDefaultAction(); + } + + public initPartSets(k: any): boolean + { + if(!k) return false; + + if(this._partSetsData.parse(k)) + { + this._partSetsData.getPartDefinition('ri').appendToFigure = true; + this._partSetsData.getPartDefinition('li').appendToFigure = true; + + return true; + } + + return false; + } + + public initAnimation(k: any): boolean + { + if(!k) return false; + + return this._animationData.parse(k); + } + + public initFigureData(k: IFigureData): boolean + { + if(!k) return false; + + return this._figureData.parse(k); + } + + public injectFigureData(data: IFigureData): void + { + this._figureData.injectJSON(data); + } + + public registerAnimations(k: IAssetManager, _arg_2: string = 'fx', _arg_3: number = 200): void + { + let index = 0; + + while(index < _arg_3) + { + const collection = k.getCollection((_arg_2 + index)); + + if(collection) + { + const animationData = collection.data; + + this._animationManager.registerAnimation(this, animationData.animations); + } + + index++; + } + } + + public registerAnimation(data: { [index: string]: IAssetAnimation }): void + { + this._animationManager.registerAnimation(this, data); + } + + public getPartColor(k: IAvatarFigureContainer, _arg_2: string, _arg_3: number = 0): IPartColor + { + const _local_4 = k.getPartColorIds(_arg_2); + + if((!(_local_4)) || (_local_4.length < _arg_3)) return null; + + const _local_5 = this._figureData.getSetType(_arg_2); + + if(_local_5 == null) return null; + + const _local_6 = this._figureData.getPalette(_local_5.paletteID); + + if(!_local_6) return null; + + return _local_6.getColor(_local_4[_arg_3]); + } + + public getBodyPartData(animation: string, frameCount: number, spriteId: string): AvatarAnimationLayerData + { + return this._animationManager.getLayerData(animation, frameCount, spriteId) as AvatarAnimationLayerData; + } + + public getAnimation(k: string): Animation + { + return this._animationManager.getAnimation(k) as Animation; + } + + public getActionDefinition(k: string): ActionDefinition + { + return this._actionManager.getActionDefinition(k); + } + + public getActionDefinitionWithState(k: string): ActionDefinition + { + return this._actionManager.getActionDefinitionWithState(k); + } + + public isMainAvatarSet(k: string): boolean + { + return this._geometry.isMainAvatarSet(k); + } + + public sortActions(k: IActiveActionData[]): IActiveActionData[] + { + return this._actionManager.sortActions(k); + } + + public maxFrames(k: IActiveActionData[]): number + { + let _local_2 = 0; + + for(const _local_3 of k) + { + _local_2 = Math.max(_local_2, this._animationData.getFrameCount(_local_3.definition)); + } + return _local_2; + } + + public getMandatorySetTypeIds(k: string, _arg_2: number): string[] + { + if(!this._mandatorySetTypeIds[k]) + { + this._mandatorySetTypeIds[k] = []; + } + + if(this._mandatorySetTypeIds[k][_arg_2]) + { + return this._mandatorySetTypeIds[k][_arg_2]; + } + + this._mandatorySetTypeIds[k][_arg_2] = this._figureData.getMandatorySetTypeIds(k, _arg_2); + + return this._mandatorySetTypeIds[k][_arg_2]; + } + + public getDefaultPartSet(k: string, _arg_2: string): IFigurePartSet + { + return this._figureData.getDefaultPartSet(k, _arg_2); + } + + public getCanvasOffsets(k: IActiveActionData[], _arg_2: string, _arg_3: number): number[] + { + return this._actionManager.getCanvasOffsets(k, _arg_2, _arg_3); + } + + public getCanvas(k: string, _arg_2: string): AvatarCanvas + { + return this._geometry.getCanvas(k, _arg_2); + } + + public removeDynamicItems(k: IAvatarImage): void + { + this._geometry.removeDynamicItems(k); + } + + public getActiveBodyPartIds(k: IActiveActionData, _arg_2: IAvatarImage): string[] + { + let _local_3: string[] = []; + + const _local_4: string[] = []; + const _local_5 = k.definition.geometryType; + + if(k.definition.isAnimation) + { + const _local_7 = ((k.definition.state + '.') + k.actionParameter); + const _local_8 = this._animationManager.getAnimation(_local_7); + + if(_local_8) + { + _local_3 = _local_8.getAnimatedBodyPartIds(0, k.overridingAction); + + if(_local_8.hasAddData()) + { + const _local_11 = { + id: '', + x: 0, + y: 0, + z: 0, + radius: 0.01, + nx: 0, + ny: 0, + nz: -1, + double: 1 + }; + + const _local_12 = { + setType: '' + }; + + for(const _local_13 of _local_8.addData) + { + const _local_6 = this._geometry.getBodyPart(_local_5, _local_13.align); + + if(_local_6) + { + _local_11.id = _local_13.id; + _local_6.addPart(_local_11, _arg_2); + + _local_12.setType = _local_13.id; + + const _local_10 = this._partSetsData.addPartDefinition(_local_12); + _local_10.appendToFigure = true; + + if(_local_13.base === '') _local_10.staticId = 1; + + if(_local_4.indexOf(_local_6.id) === -1) _local_4.push(_local_6.id); + } + } + } + } + + for(const _local_9 of _local_3) + { + const _local_6 = this._geometry.getBodyPart(_local_5, _local_9); + + if(_local_6 && (_local_4.indexOf(_local_6.id) === -1)) _local_4.push(_local_6.id); + } + } + else + { + _local_3 = this._partSetsData.getActiveParts(k.definition); + + for(const _local_14 of _local_3) + { + const _local_6 = this._geometry.getBodyPartOfItem(_local_5, _local_14, _arg_2); + + if(_local_6 && (_local_4.indexOf(_local_6.id) === -1)) _local_4.push(_local_6.id); + } + } + + return _local_4; + } + + public getBodyPartsUnordered(k: string): string[] + { + return this._geometry.getBodyPartIdsInAvatarSet(k); + } + + public getBodyParts(k: string, _arg_2: string, _arg_3: number): string[] + { + const _local_4 = AvatarDirectionAngle.DIRECTION_TO_ANGLE[_arg_3]; + + return this._geometry.getBodyPartsAtAngle(k, _local_4, _arg_2); + } + + public getFrameBodyPartOffset(k: IActiveActionData, _arg_2: number, _arg_3: number, _arg_4: string): Point + { + const _local_5 = this._animationData.getAction(k.definition); + + if(_local_5) return _local_5.getFrameBodyPartOffset(_arg_2, _arg_3, _arg_4); + + return AnimationAction.DEFAULT_OFFSET; + } + + public getParts(k: string, _arg_2: IAvatarFigureContainer, _arg_3: IActiveActionData, _arg_4: string, _arg_5: number, removes: string[], _arg_7: IAvatarImage, _arg_8: Map = null): AvatarImagePartContainer[] + { + const _local_10: Animation = null; + let _local_34: IActionDefinition = null; + + let _local_20: AvatarAnimationFrame[] = []; + let _local_36: IPartColor = null; + + if(!_arg_3 == null) return []; + + const _local_9 = this._partSetsData.getActiveParts(_arg_3.definition); + const _local_11: AvatarImagePartContainer[] = []; + let _local_14: any[] = [0]; + const _local_15 = this._animationData.getAction(_arg_3.definition); + + if(_arg_3.definition.isAnimation) + { + const _local_24 = ((_arg_3.definition.state + '.') + _arg_3.actionParameter); + const _local_10 = this._animationManager.getAnimation(_local_24); + + if(_local_10) + { + _local_14 = this.getPopulatedArray(_local_10.frameCount(_arg_3.overridingAction)); + + for(const _local_25 of _local_10.getAnimatedBodyPartIds(0, _arg_3.overridingAction)) + { + if(_local_25 === k) + { + const _local_26 = this._geometry.getBodyPart(_arg_4, _local_25); + + if(_local_26) + { + for(const _local_27 of _local_26.getDynamicParts(_arg_7)) + { + _local_9.push(_local_27.id); + } + } + } + } + } + } + + const _local_16 = this._geometry.getParts(_arg_4, k, _arg_5, _local_9, _arg_7); + const _local_21 = _arg_2.getPartTypeIds(); + + for(const _local_17 of _local_21) + { + if(_arg_8) + { + if(_arg_8.get(_local_17)) continue; + } + + const _local_28 = _arg_2.getPartSetId(_local_17); + const _local_29 = _arg_2.getPartColorIds(_local_17); + const _local_30 = this._figureData.getSetType(_local_17); + + + + if(_local_30) + { + const _local_31 = this._figureData.getPalette(_local_30.paletteID); + + if(_local_31) + { + const _local_32 = _local_30.getPartSet(_local_28); + + if(_local_32) + { + removes = removes.concat(_local_32.hiddenLayers); + + for(const _local_33 of _local_32.parts) + { + if(_local_16.indexOf(_local_33.type) > -1) + { + if(_local_15) + { + const _local_19 = _local_15.getPart(_local_33.type); + + if(_local_19) + { + _local_20 = _local_19.frames; + } + else + { + _local_20 = _local_14; + } + } + else + { + _local_20 = _local_14; + } + + _local_34 = _arg_3.definition; + + if(_local_9.indexOf(_local_33.type) === -1) _local_34 = this._defaultAction; + + const _local_13 = this._partSetsData.getPartDefinition(_local_33.type); + + let _local_35 = (!_local_13) ? _local_33.type : _local_13.flippedSetType; + + if(!_local_35 || (_local_35 === '')) _local_35 = _local_33.type; + + if(_local_29 && (_local_29.length > (_local_33.colorLayerIndex - 1))) + { + _local_36 = _local_31.getColor(_local_29[(_local_33.colorLayerIndex - 1)]); + } + + const _local_37 = (_local_33.colorLayerIndex > 0); + const _local_18 = new AvatarImagePartContainer(k, _local_33.type, _local_33.id.toString(), _local_36, _local_20, _local_34, _local_37, _local_33.paletteMap, _local_35); + + _local_11.push(_local_18); + } + } + } + } + } + } + + const _local_22: AvatarImagePartContainer[] = []; + + for(const _local_12 of _local_16) + { + let _local_39: IPartColor = null; + let _local_38 = false; + + const _local_40 = ((_arg_8) && (_arg_8.get(_local_12))); + + for(const _local_23 of _local_11) + { + if(_local_23.partType === _local_12) + { + if(_local_40) + { + _local_39 = _local_23.color; + } + else + { + _local_38 = true; + + if(removes.indexOf(_local_12) === -1) _local_22.push(_local_23); + } + } + } + + if(!_local_38) + { + if(_local_40) + { + const _local_41 = _arg_8.get(_local_12); + + let _local_42 = 0; + let _local_43 = 0; + + while(_local_43 < _local_41.length) + { + _local_42 = (_local_42 + _local_41.charCodeAt(_local_43)); + _local_43++; + } + + if(_local_15) + { + const _local_19 = _local_15.getPart(_local_12); + + if(_local_19) + { + _local_20 = _local_19.frames; + } + else + { + _local_20 = _local_14; + } + } + else + { + _local_20 = _local_14; + } + + const _local_18 = new AvatarImagePartContainer(k, _local_12, _local_41, _local_39, _local_20, _arg_3.definition, (!(_local_39 == null)), -1, _local_12, false, 1); + + _local_22.push(_local_18); + } + else + { + if(_local_9.indexOf(_local_12) > -1) + { + const _local_44 = this._geometry.getBodyPartOfItem(_arg_4, _local_12, _arg_7); + + if(k !== _local_44.id) + { + // + } + else + { + const _local_13 = this._partSetsData.getPartDefinition(_local_12); + + let _local_45 = false; + let _local_46 = 1; + + if(_local_13.appendToFigure) + { + let _local_47 = '1'; + + if(_arg_3.actionParameter !== '') + { + _local_47 = _arg_3.actionParameter; + } + + if(_local_13.hasStaticId()) + { + _local_47 = _local_13.staticId.toString(); + } + + if(_local_10 != null) + { + const _local_48 = _local_10.getAddData(_local_12); + + if(_local_48) + { + _local_45 = _local_48.isBlended; + _local_46 = _local_48.blend; + } + } + + if(_local_15) + { + const _local_19 = _local_15.getPart(_local_12); + + if(_local_19) + { + _local_20 = _local_19.frames; + } + else + { + _local_20 = _local_14; + } + } + else + { + _local_20 = _local_14; + } + + const _local_18 = new AvatarImagePartContainer(k, _local_12, _local_47, null, _local_20, _arg_3.definition, false, -1, _local_12, _local_45, _local_46); + + _local_22.push(_local_18); + } + } + } + } + } + } + + return _local_22; + } + + private getPopulatedArray(k: number): number[] + { + const _local_2: number[] = []; + + let index = 0; + + while(index < k) + { + _local_2.push(index); + + index++; + } + + return _local_2; + } + + public getItemIds(): string[] + { + if(this._actionManager) + { + const k = this._actionManager.getActionDefinition('CarryItem').params; + + const _local_2 = []; + + for(const _local_3 of k.values()) _local_2.push(_local_3); + + return _local_2; + } + + return []; + } + + public get renderManager(): IAvatarRenderManager + { + return this._renderManager; + } + + public get figureData(): IStructureData + { + return this._figureData; + } + + public get partData(): PartSetsData + { + return this._partSetsData; + } + + public get animationManager(): AnimationManager + { + return this._animationManager; + } +} diff --git a/packages/avatar/src/EffectAssetDownloadLibrary.ts b/packages/avatar/src/EffectAssetDownloadLibrary.ts new file mode 100644 index 0000000..26adf0a --- /dev/null +++ b/packages/avatar/src/EffectAssetDownloadLibrary.ts @@ -0,0 +1,75 @@ +import { IAssetAnimation, IAssetManager, IEffectAssetDownloadLibrary } from '@nitrots/api'; +import { AvatarRenderEffectLibraryEvent, GetEventDispatcher, NitroEventType } from '@nitrots/events'; + +export class EffectAssetDownloadLibrary implements IEffectAssetDownloadLibrary +{ + public static DOWNLOAD_COMPLETE: string = 'EADL_DOWNLOAD_COMPLETE'; + + private static NOT_LOADED: number = 0; + private static LOADING: number = 1; + private static LOADED: number = 2; + + private _state: number = EffectAssetDownloadLibrary.NOT_LOADED; + private _libraryName: string; + private _revision: string; + private _downloadUrl: string; + private _assetManager: IAssetManager; + private _animation: { [index: string]: IAssetAnimation } = null; + + constructor(libraryName: string, revision: string, downloadUrl: string, assetManager: IAssetManager) + { + this._libraryName = libraryName; + this._revision = revision; + this._downloadUrl = downloadUrl; + this._assetManager = assetManager; + + this._downloadUrl = this._downloadUrl.replace(/%libname%/gi, this._libraryName); + this._downloadUrl = this._downloadUrl.replace(/%revision%/gi, this._revision); + + this.checkIsLoaded(); + } + + public async downloadAsset(): Promise + { + if(!this._assetManager || (this._state === EffectAssetDownloadLibrary.LOADING) || (this._state === EffectAssetDownloadLibrary.LOADED)) return; + + if(!this.checkIsLoaded()) + { + this._state = EffectAssetDownloadLibrary.LOADING; + + const status = await this._assetManager.downloadAsset(this._downloadUrl); + + if(!status) throw new Error('Could not download asset'); + } + + if(this.checkIsLoaded()) GetEventDispatcher().dispatchEvent(new AvatarRenderEffectLibraryEvent(NitroEventType.AVATAR_EFFECT_DOWNLOADED, this)); + } + + private checkIsLoaded(): boolean + { + const asset = this._assetManager.getCollection(this._libraryName); + + if(!asset) return false; + + this._state = EffectAssetDownloadLibrary.LOADED; + + this._animation = asset.data.animations; + + return true; + } + + public get libraryName(): string + { + return this._libraryName; + } + + public get animation(): { [index: string]: IAssetAnimation } + { + return this._animation; + } + + public get isLoaded(): boolean + { + return (this._state === EffectAssetDownloadLibrary.LOADED); + } +} diff --git a/packages/avatar/src/EffectAssetDownloadManager.ts b/packages/avatar/src/EffectAssetDownloadManager.ts new file mode 100644 index 0000000..33e8afd --- /dev/null +++ b/packages/avatar/src/EffectAssetDownloadManager.ts @@ -0,0 +1,206 @@ +import { IAssetManager, IAvatarEffectListener } from '@nitrots/api'; +import { GetConfiguration } from '@nitrots/configuration'; +import { AvatarRenderEffectLibraryEvent, GetEventDispatcher, NitroEvent, NitroEventType } from '@nitrots/events'; +import { AvatarStructure } from './AvatarStructure'; +import { EffectAssetDownloadLibrary } from './EffectAssetDownloadLibrary'; + +export class EffectAssetDownloadManager +{ + private _assets: IAssetManager; + private _structure: AvatarStructure; + + private _missingMandatoryLibs: string[] = []; + private _effectMap: Map = new Map(); + private _effectListeners: Map = new Map(); + private _incompleteEffects: Map = new Map(); + private _currentDownloads: EffectAssetDownloadLibrary[] = []; + private _libraryNames: string[] = []; + + constructor(assets: IAssetManager, structure: AvatarStructure) + { + this._assets = assets; + this._structure = structure; + } + + public async init(): Promise + { + this._missingMandatoryLibs = GetConfiguration().getValue('avatar.mandatory.effect.libraries'); + + const url = GetConfiguration().getValue('avatar.effectmap.url'); + + if(!url || !url.length) throw new Error('Invalid effect map url'); + + const response = await fetch(url); + + if(response.status !== 200) throw new Error('Invalid effect map file'); + + const responseData = await response.json(); + + this.processEffectMap(responseData.effects); + + GetEventDispatcher().addEventListener(NitroEventType.AVATAR_EFFECT_DOWNLOADED, (event: AvatarRenderEffectLibraryEvent) => this.onLibraryLoaded(event)); + + await this.processMissingLibraries(); + } + + private processEffectMap(data: any): void + { + if(!data) return; + + const downloadUrl = GetConfiguration().getValue('avatar.asset.effect.url'); + + for(const effect of data) + { + if(!effect) continue; + + const id = (effect.id as string); + const libraryName = (effect.lib as string); + const revision = (effect.revision || ''); + + if(this._libraryNames.indexOf(libraryName) >= 0) continue; + + this._libraryNames.push(libraryName); + + const downloadLibrary = new EffectAssetDownloadLibrary(libraryName, revision, downloadUrl, this._assets); + + let existing = this._effectMap.get(id); + + if(!existing) existing = []; + + existing.push(downloadLibrary); + + this._effectMap.set(id, existing); + } + } + + private async processMissingLibraries(): Promise + { + const promises: Promise[] = []; + + this._missingMandatoryLibs.forEach(value => + { + const libraries = this._effectMap.get(value); + + if(libraries) for(const library of libraries) promises.push(library.downloadAsset()); + }); + + this._missingMandatoryLibs = []; + + await Promise.all(promises); + } + + private onLibraryLoaded(event: AvatarRenderEffectLibraryEvent): void + { + if(!event || !event.library) return; + + const loadedEffects: string[] = []; + + this._structure.registerAnimation(event.library.animation); + + for(const [id, libraries] of this._incompleteEffects.entries()) + { + let isReady = true; + + for(const library of libraries) + { + if(!library || library.isLoaded) continue; + + isReady = false; + + break; + } + + if(isReady) + { + loadedEffects.push(id); + + const listeners = this._effectListeners.get(id); + + for(const listener of listeners) + { + if(!listener || listener.disposed) continue; + + listener.resetEffect(parseInt(id)); + } + + this._effectListeners.delete(id); + + GetEventDispatcher().dispatchEvent(new NitroEvent(NitroEventType.AVATAR_EFFECT_LOADED)); + } + } + + for(const id of loadedEffects) this._incompleteEffects.delete(id); + + let index = 0; + + while(index < this._currentDownloads.length) + { + const download = this._currentDownloads[index]; + + if(download) + { + if(download.libraryName === event.library.libraryName) this._currentDownloads.splice(index, 1); + } + + index++; + } + } + + public isAvatarEffectReady(effect: number): boolean + { + return !this.getAvatarEffectPendingLibraries(effect).length; + } + + private getAvatarEffectPendingLibraries(id: number): EffectAssetDownloadLibrary[] + { + const pendingLibraries: EffectAssetDownloadLibrary[] = []; + + if(!this._structure) return pendingLibraries; + + const libraries = this._effectMap.get(id.toString()); + + if(libraries) + { + for(const library of libraries) + { + if(!library || library.isLoaded) continue; + + if(pendingLibraries.indexOf(library) === -1) pendingLibraries.push(library); + } + } + + return pendingLibraries; + } + + public downloadAvatarEffect(id: number, listener: IAvatarEffectListener): void + { + const pendingLibraries = this.getAvatarEffectPendingLibraries(id); + + if(pendingLibraries && pendingLibraries.length) + { + if(listener && !listener.disposed) + { + let listeners = this._effectListeners.get(id.toString()); + + if(!listeners) listeners = []; + + listeners.push(listener); + + this._effectListeners.set(id.toString(), listeners); + } + + this._incompleteEffects.set(id.toString(), pendingLibraries); + + for(const library of pendingLibraries) + { + if(!library) continue; + + library.downloadAsset(); + } + } + else + { + if(listener && !listener.disposed) listener.resetEffect(id); + } + } +} diff --git a/packages/avatar/src/FigureDataContainer.ts b/packages/avatar/src/FigureDataContainer.ts new file mode 100644 index 0000000..71dd487 --- /dev/null +++ b/packages/avatar/src/FigureDataContainer.ts @@ -0,0 +1,241 @@ +export class FigureDataContainer +{ + private static MALE: string = 'M'; + private static FEMALE: string = 'F'; + private static UNISEX: string = 'U'; + private static SCALE: string = 'h'; + private static STD: string = 'std'; + private static DEFAULT_FRAME: string = '0'; + private static HD: string = 'hd'; + private static HAIR: string = 'hr'; + private static HAT: string = 'ha'; + private static HEAD_ACCESSORIES: string = 'he'; + private static EYE_ACCESSORIES: string = 'ea'; + private static FACE_ACCESSORIES: string = 'fa'; + private static JACKET: string = 'cc'; + private static SHIRT: string = 'ch'; + private static CHEST_ACCESSORIES: string = 'ca'; + private static CHEST_PRINTS: string = 'cp'; + private static TROUSERS: string = 'lg'; + private static SHOES: string = 'sh'; + private static TROUSER_ACCESSORIES: string = 'wa'; + private static BLOCKED_FX_TYPES: number[] = [28, 29, 30, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 68]; + + private _data: Map; + private _colors: Map; + private _gender: string = 'M'; + private _isDisposed: boolean; + private _avatarEffectType: number = -1; + + public loadAvatarData(figure: string, gender: string): void + { + this._data = new Map(); + this._colors = new Map(); + this._gender = gender; + + this.parseFigureString(figure); + } + + public dispose(): void + { + this._data = null; + this._colors = null; + this._isDisposed = true; + } + + public get disposed(): boolean + { + return this._isDisposed; + } + + private parseFigureString(k: string): void + { + if(!k) return; + + for(const set of k.split('.')) + { + const _local_3 = set.split('-'); + + if(_local_3.length > 0) + { + const part = _local_3[0]; + const setId = parseInt(_local_3[1]); + const colors: number[] = []; + + let i = 2; + + while(i < _local_3.length) + { + colors.push(parseInt(_local_3[i])); + + i++; + } + + if(!colors.length) colors.push(0); + + this.savePartSetId(part, setId, false); + this.savePartSetColourId(part, colors, false); + } + } + } + + public hasSetType(k: string): boolean + { + return !!this._data.get(k); + } + + public getPartSetId(k: string): number + { + if(this.hasSetType(k)) return this._data.get(k); + + return -1; + } + + public getColourIds(k: string): number[] + { + if(this._colors.get(k)) return this._colors.get(k); + + return []; + } + + public getFigureString(): string + { + let figure = ''; + + const sets: string[] = []; + + for(const [key, value] of this._data.entries()) + { + let set = ((key + '-') + value); + + const colors = this._colors.get(key); + + if(colors) for(const color of colors) set = (set + ('-' + color)); + + sets.push(set); + } + + let i = 0; + + while(i < sets.length) + { + figure = (figure + sets[i]); + + if(i < (sets.length - 1)) figure = (figure + '.'); + + i++; + } + + return figure; + } + + public savePartData(k: string, _arg_2: number, _arg_3: number[], _arg_4: boolean = false): void + { + this.savePartSetId(k, _arg_2, _arg_4); + this.savePartSetColourId(k, _arg_3, _arg_4); + } + + private savePartSetId(k: string, _arg_2: number, _arg_3: boolean = true): void + { + switch(k) + { + case FigureDataContainer.HD: + case FigureDataContainer.HAIR: + case FigureDataContainer.HAT: + case FigureDataContainer.HEAD_ACCESSORIES: + case FigureDataContainer.EYE_ACCESSORIES: + case FigureDataContainer.FACE_ACCESSORIES: + case FigureDataContainer.SHIRT: + case FigureDataContainer.JACKET: + case FigureDataContainer.CHEST_ACCESSORIES: + case FigureDataContainer.CHEST_PRINTS: + case FigureDataContainer.TROUSERS: + case FigureDataContainer.SHOES: + case FigureDataContainer.TROUSER_ACCESSORIES: + if(_arg_2 >= 0) + { + this._data.set(k, _arg_2); + } + else + { + this._data.delete(k); + } + } + } + + public savePartSetColourId(k: string, _arg_2: number[], _arg_3: boolean = true): void + { + switch(k) + { + case FigureDataContainer.HD: + case FigureDataContainer.HAIR: + case FigureDataContainer.HAT: + case FigureDataContainer.HEAD_ACCESSORIES: + case FigureDataContainer.EYE_ACCESSORIES: + case FigureDataContainer.FACE_ACCESSORIES: + case FigureDataContainer.SHIRT: + case FigureDataContainer.JACKET: + case FigureDataContainer.CHEST_ACCESSORIES: + case FigureDataContainer.CHEST_PRINTS: + case FigureDataContainer.TROUSERS: + case FigureDataContainer.SHOES: + case FigureDataContainer.TROUSER_ACCESSORIES: + this._colors.set(k, _arg_2); + return; + } + } + + public getFigureStringWithFace(k: number): string + { + const partSets: string[] = [FigureDataContainer.HD]; + + let figure = ''; + const sets: string[] = []; + + for(const part of partSets) + { + const colors = this._colors.get(part); + + if(colors) + { + let setId = this._data.get(part); + + if(part === FigureDataContainer.HD) setId = k; + + let set = ((part + '-') + setId); + + if(setId >= 0) + { + let i = 0; + + while(i < colors.length) + { + set = (set + ('-' + colors[i])); + + i++; + } + } + + sets.push(set); + } + } + + let i = 0; + + while(i < sets.length) + { + figure = (figure + sets[i]); + + if(i < (sets.length - 1)) figure = (figure + '.'); + + i++; + } + + return figure; + } + + public get gender(): string + { + return this._gender; + } +} diff --git a/packages/avatar/src/GetAvatarRenderManager.ts b/packages/avatar/src/GetAvatarRenderManager.ts new file mode 100644 index 0000000..c6cef25 --- /dev/null +++ b/packages/avatar/src/GetAvatarRenderManager.ts @@ -0,0 +1,5 @@ +import { AvatarRenderManager } from './AvatarRenderManager'; + +const avatarRenderManager = new AvatarRenderManager(); + +export const GetAvatarRenderManager = () => avatarRenderManager; diff --git a/packages/avatar/src/PlaceHolderAvatarImage.ts b/packages/avatar/src/PlaceHolderAvatarImage.ts new file mode 100644 index 0000000..1a56373 --- /dev/null +++ b/packages/avatar/src/PlaceHolderAvatarImage.ts @@ -0,0 +1,18 @@ +import { AssetAliasCollection } from './alias'; +import { AvatarFigureContainer } from './AvatarFigureContainer'; +import { AvatarImage } from './AvatarImage'; +import { AvatarStructure } from './AvatarStructure'; +import { EffectAssetDownloadManager } from './EffectAssetDownloadManager'; + +export class PlaceHolderAvatarImage extends AvatarImage +{ + constructor(k: AvatarStructure, _arg_2: AssetAliasCollection, _arg_3: AvatarFigureContainer, _arg_4: string, _arg_5: EffectAssetDownloadManager) + { + super(k, _arg_2, _arg_3, _arg_4, _arg_5, null); + } + + public isPlaceholder(): boolean + { + return true; + } +} diff --git a/packages/avatar/src/actions/ActionDefinition.ts b/packages/avatar/src/actions/ActionDefinition.ts new file mode 100644 index 0000000..0f16d70 --- /dev/null +++ b/packages/avatar/src/actions/ActionDefinition.ts @@ -0,0 +1,220 @@ +import { IActionDefinition } from '@nitrots/api'; +import { ActionType } from './ActionType'; + +export class ActionDefinition implements IActionDefinition +{ + private _id: string; + private _state: string; + private _precedence: number; + private _activePartSet: string; + private _assetPartDefinition: string; + private _lay: string; + private _geometryType: string; + private _isMain: boolean; + private _isDefault: boolean; + private _isAnimation: boolean; + private _startFromFrameZero: boolean; + private _prevents: string[]; + private _preventHeadTurn: boolean; + private _types: Map = new Map(); + private _params: Map = new Map(); + private _defaultParameterValue: string = ''; + private _canvasOffsets: Map> = new Map(); + + constructor(data: any) + { + this._id = data.id; + this._state = data.state; + this._precedence = data.precedence; + this._activePartSet = data.activePartSet; + this._assetPartDefinition = data.assetPartDefinition; + this._lay = data.lay; + this._geometryType = data.geometryType; + this._isMain = data.main || false; + this._isDefault = data.isDefault || false; + this._isAnimation = data.animation || false; + this._startFromFrameZero = data.startFromFrameZero || false; + this._prevents = data.prevents || []; + this._preventHeadTurn = data.preventHeadTurn || false; + + if(data.params && (data.params.length > 0)) + { + for(const param of data.params) + { + if(!param) continue; + + if(param.id === 'default') this._defaultParameterValue = param.value; + else this._params.set(param.id, param.value); + } + } + + if(data.types && (data.types.length > 0)) + { + for(const type of data.types) + { + if(!type) continue; + + const action = new ActionType(type); + + this._types.set(action.id, action); + } + } + } + + public setOffsets(k: string, _arg_2: number, _arg_3: number[]): void + { + if(!this._canvasOffsets) this._canvasOffsets = new Map(); + + let existing = this._canvasOffsets.get(k); + + if(!existing) + { + existing = new Map(); + + this._canvasOffsets.set(k, existing); + } + + existing.set(_arg_2, _arg_3); + } + + public getOffsets(k: string, _arg_2: number): number[] + { + if(!this._canvasOffsets) return null; + + const existing = this._canvasOffsets.get(k); + + if(!existing) return null; + + return existing.get(_arg_2); + } + + public getType(id: string): ActionType + { + if(!id) return null; + + const existing = this._types.get(parseInt(id)); + + if(!existing) return null; + + return existing; + } + + public getParameterValue(id: string): string + { + if(!id) return ''; + + const existing = this._params.get(id); + + if(!existing) return this._defaultParameterValue; + + return existing; + } + + public getPrevents(type: string): string[] + { + return this._prevents.concat(this.getTypePrevents(type)); + } + + private getTypePrevents(type: string): string[] + { + if(!type) return []; + + const existing = this._types.get(parseInt(type)); + + if(!existing) return []; + + return existing.prevents; + } + + public getPreventHeadTurn(k: string): boolean + { + if(!k) return this._preventHeadTurn; + + const type = this.getType(k); + + if(!type) return this._preventHeadTurn; + + return type.preventHeadTurn; + } + + public isAnimated(k: string): boolean + { + if(!k) return true; + + const type = this.getType(k); + + if(!type) return true; + + return type.isAnimated; + } + + public get id(): string + { + return this._id; + } + + public get state(): string + { + return this._state; + } + + public get precedence(): number + { + return this._precedence; + } + + public get activePartSet(): string + { + return this._activePartSet; + } + + public get assetPartDefinition(): string + { + return this._assetPartDefinition; + } + + public get lay(): string + { + return this._lay; + } + + public get geometryType(): string + { + return this._geometryType; + } + + public get isMain(): boolean + { + return this._isMain; + } + + public get isDefault(): boolean + { + return this._isDefault; + } + + public get isAnimation(): boolean + { + return this._isAnimation; + } + + public get startFromFrameZero(): boolean + { + return this._startFromFrameZero; + } + + public get prevents(): string[] + { + return this._prevents; + } + + public get preventHeadTurn(): boolean + { + return this._preventHeadTurn; + } + + public get params(): Map + { + return this._params; + } +} diff --git a/packages/avatar/src/actions/ActionType.ts b/packages/avatar/src/actions/ActionType.ts new file mode 100644 index 0000000..d6d0312 --- /dev/null +++ b/packages/avatar/src/actions/ActionType.ts @@ -0,0 +1,44 @@ +export class ActionType +{ + private _id: number; + private _value: number; + private _prevents: string[]; + private _preventHeadTurn: boolean; + private _isAnimated: boolean; + + constructor(data: any) + { + this._id = parseInt(data.id); + this._value = parseInt(data.id); + this._prevents = data.prevents || []; + this._preventHeadTurn = data.preventHeadTurn || false; + this._isAnimated = true; + + if((data.animated !== undefined) && (data.animated === false)) this._isAnimated = false; + } + + public get id(): number + { + return this._id; + } + + public get value(): number + { + return this._value; + } + + public get prevents(): string[] + { + return this._prevents; + } + + public get preventHeadTurn(): boolean + { + return this._preventHeadTurn; + } + + public get isAnimated(): boolean + { + return this._isAnimated; + } +} diff --git a/packages/avatar/src/actions/ActiveActionData.ts b/packages/avatar/src/actions/ActiveActionData.ts new file mode 100644 index 0000000..7578e20 --- /dev/null +++ b/packages/avatar/src/actions/ActiveActionData.ts @@ -0,0 +1,73 @@ +import { IActionDefinition, IActiveActionData } from '@nitrots/api'; + +export class ActiveActionData implements IActiveActionData +{ + private _actionType: string; + private _actionParameter: string; + private _definition: IActionDefinition; + private _startFrame: number; + private _overridingAction: string; + + constructor(action: string, parameter: string = '', startFrame: number = 0) + { + this._actionType = action || ''; + this._actionParameter = parameter || ''; + this._definition = null; + this._startFrame = startFrame || 0; + this._overridingAction = null; + } + + public dispose(): void + { + this._actionType = null; + this._actionParameter = null; + this._definition = null; + } + + public get id(): string + { + if(!this._definition) return ''; + + return this._definition.id + '_' + this._actionParameter; + } + + public get actionType(): string + { + return this._actionType; + } + + public get actionParameter(): string + { + return this._actionParameter; + } + + public set actionParameter(parameter: string) + { + this._actionParameter = parameter; + } + + public get definition(): IActionDefinition + { + return this._definition; + } + + public set definition(definition: IActionDefinition) + { + this._definition = definition; + } + + public get startFrame(): number + { + return this._startFrame; + } + + public get overridingAction(): string + { + return this._overridingAction; + } + + public set overridingAction(action: string) + { + this._overridingAction = action; + } +} diff --git a/packages/avatar/src/actions/AvatarActionManager.ts b/packages/avatar/src/actions/AvatarActionManager.ts new file mode 100644 index 0000000..eee1eef --- /dev/null +++ b/packages/avatar/src/actions/AvatarActionManager.ts @@ -0,0 +1,186 @@ +import { IActiveActionData, IAssetManager } from '@nitrots/api'; +import { ActionDefinition } from './ActionDefinition'; + +export class AvatarActionManager +{ + private _assets: IAssetManager; + private _actions: Map; + private _defaultAction: ActionDefinition; + + constructor(k: IAssetManager, data: any) + { + this._assets = k; + this._actions = new Map(); + this._defaultAction = null; + + this.updateActions(data); + } + + public updateActions(data: any): void + { + if(!data) return; + + for(const action of data.actions) + { + if(!action || !action.state) continue; + + const definition = new ActionDefinition(action); + + this._actions.set(definition.state, definition); + } + + if(data.actionOffsets) this.parseActionOffsets(data.actionOffsets); + } + + private parseActionOffsets(offsets: any): void + { + if(!offsets || !offsets.length) return; + + for(const offset of offsets) + { + const action = this._actions.get(offset.action); + + if(!action) continue; + + for(const canvasOffset of offset.offsets) + { + const size = (canvasOffset.size || ''); + const direction = canvasOffset.direction; + + if((size === '') || (direction === undefined)) continue; + + const x = (canvasOffset.x || 0); + const y = (canvasOffset.y || 0); + const z = (canvasOffset.z || 0); + + action.setOffsets(size, direction, [x, y, z]); + } + } + } + + public getActionDefinition(id: string): ActionDefinition + { + if(!id) return null; + + for(const action of this._actions.values()) + { + if(!action || (action.id !== id)) continue; + + return action; + } + + return null; + } + + public getActionDefinitionWithState(state: string): ActionDefinition + { + const existing = this._actions.get(state); + + if(!existing) return null; + + return existing; + } + + public getDefaultAction(): ActionDefinition + { + if(this._defaultAction) return this._defaultAction; + + for(const action of this._actions.values()) + { + if(!action || !action.isDefault) continue; + + this._defaultAction = action; + + return action; + } + + return null; + } + + public getCanvasOffsets(k: IActiveActionData[], _arg_2: string, _arg_3: number): number[] + { + let canvasOffsets: number[] = []; + + for(const activeAction of k) + { + if(!activeAction) continue; + + const action = this._actions.get(activeAction.actionType); + const offsets = action && action.getOffsets(_arg_2, _arg_3); + + if(offsets) canvasOffsets = offsets; + } + + return canvasOffsets; + } + + public sortActions(actions: IActiveActionData[]): IActiveActionData[] + { + if(!actions) return null; + + actions = this.filterActions(actions); + + const validatedActions: IActiveActionData[] = []; + + for(const action of actions) + { + if(!action) continue; + + const definition = this._actions.get(action.actionType); + + if(!definition) continue; + + action.definition = definition; + + validatedActions.push(action); + } + + validatedActions.sort(this.sortByPrecedence); + + return validatedActions; + } + + private filterActions(actions: IActiveActionData[]): IActiveActionData[] + { + let preventions: string[] = []; + const activeActions: IActiveActionData[] = []; + + for(const action of actions) + { + if(!action) continue; + + const localAction = this._actions.get(action.actionType); + + if(localAction) preventions = preventions.concat(localAction.getPrevents(action.actionParameter)); + } + + for(const action of actions) + { + if(!action) continue; + + let actionType = action.actionType; + + if(action.actionType === 'fx') actionType = (actionType + ('.' + action.actionParameter)); + + if(preventions.indexOf(actionType) >= 0) continue; + + activeActions.push(action); + } + + return activeActions; + } + + private sortByPrecedence(actionOne: IActiveActionData, actionTwo: IActiveActionData): number + { + if(!actionOne || !actionTwo) return 0; + + const precedenceOne = actionOne.definition.precedence; + const precedenceTwo = actionTwo.definition.precedence; + + if(precedenceOne < precedenceTwo) return 1; + + if(precedenceOne > precedenceTwo) return -1; + + return 0; + } +} diff --git a/packages/avatar/src/actions/index.ts b/packages/avatar/src/actions/index.ts new file mode 100644 index 0000000..a849536 --- /dev/null +++ b/packages/avatar/src/actions/index.ts @@ -0,0 +1,4 @@ +export * from './ActionDefinition'; +export * from './ActionType'; +export * from './ActiveActionData'; +export * from './AvatarActionManager'; diff --git a/packages/avatar/src/alias/AssetAlias.ts b/packages/avatar/src/alias/AssetAlias.ts new file mode 100644 index 0000000..fd07c13 --- /dev/null +++ b/packages/avatar/src/alias/AssetAlias.ts @@ -0,0 +1,37 @@ +import { IAssetAlias } from '@nitrots/api'; + +export class AssetAlias +{ + private _name: string; + private _link: string; + private _flipH: boolean; + private _flipV: boolean; + + constructor(name: string, alias: IAssetAlias) + { + this._name = name; + this._link = alias.link; + this._flipH = alias.flipH; + this._flipV = alias.flipV; + } + + public get name(): string + { + return this._name; + } + + public get link(): string + { + return this._link; + } + + public get flipH(): boolean + { + return this._flipH; + } + + public get flipV(): boolean + { + return this._flipV; + } +} diff --git a/packages/avatar/src/alias/AssetAliasCollection.ts b/packages/avatar/src/alias/AssetAliasCollection.ts new file mode 100644 index 0000000..e4aec28 --- /dev/null +++ b/packages/avatar/src/alias/AssetAliasCollection.ts @@ -0,0 +1,89 @@ +import { IAssetManager, IGraphicAsset } from '@nitrots/api'; +import { AvatarRenderManager } from '../AvatarRenderManager'; +import { AssetAlias } from './AssetAlias'; + +export class AssetAliasCollection +{ + private _assets: IAssetManager; + private _aliases: Map; + private _avatarRenderManager: AvatarRenderManager; + private _missingAssetNames: string[]; + + constructor(k: AvatarRenderManager, _arg_2: IAssetManager) + { + this._avatarRenderManager = k; + this._aliases = new Map(); + this._assets = _arg_2; + this._missingAssetNames = []; + } + + public dispose(): void + { + this._assets = null; + this._aliases = null; + } + + public reset(): void + { + this.init(); + } + + public init(): void + { + for(const collection of this._assets.collections.values()) + { + if(!collection) continue; + + const aliases = collection.data && collection.data.aliases; + + if(!aliases) continue; + + for(const name in aliases) + { + const alias = aliases[name]; + + if(!alias) continue; + + this._aliases.set(name, new AssetAlias(name, alias)); + } + } + } + + public hasAlias(k: string): boolean + { + const alias = this._aliases.get(k); + + if(alias) return true; + + return false; + } + + public getAssetName(k: string): string + { + let _local_2 = k; + let _local_3 = 5; + + while(this.hasAlias(_local_2) && (_local_3 >= 0)) + { + const _local_4 = this._aliases.get(_local_2); + + _local_2 = _local_4.link; + _local_3--; + } + + return _local_2; + } + + public getAsset(name: string): IGraphicAsset + { + if(!this._assets) return null; + + name = this.getAssetName(name); + + const asset = this._assets.getAsset(name); + + if(!asset) return null; + + return asset; + } +} diff --git a/packages/avatar/src/alias/index.ts b/packages/avatar/src/alias/index.ts new file mode 100644 index 0000000..7d9524c --- /dev/null +++ b/packages/avatar/src/alias/index.ts @@ -0,0 +1,2 @@ +export * from './AssetAlias'; +export * from './AssetAliasCollection'; diff --git a/packages/avatar/src/animation/AddDataContainer.ts b/packages/avatar/src/animation/AddDataContainer.ts new file mode 100644 index 0000000..d0ede74 --- /dev/null +++ b/packages/avatar/src/animation/AddDataContainer.ts @@ -0,0 +1,61 @@ +import { IAssetAnimationAdd } from '@nitrots/api'; + +export class AddDataContainer +{ + private _id: string; + private _align: string; + private _base: string; + private _ink: number; + private _blend: number; + + constructor(k: IAssetAnimationAdd) + { + this._id = k.id || ''; + this._align = k.align || ''; + this._base = k.base || ''; + this._ink = k.ink || 0; + this._blend = 0; + + const _local_2 = k.blend; + + if(_local_2) + { + if(_local_2.length > 0) + { + this._blend = parseInt(_local_2); + + if(this._blend > 1) this._blend = (this._blend / 100); + } + } + } + + public get id(): string + { + return this._id; + } + + public get align(): string + { + return this._align; + } + + public get base(): string + { + return this._base; + } + + public get ink(): number + { + return this._ink; + } + + public get blend(): number + { + return this._blend; + } + + public get isBlended(): boolean + { + return this._blend !== 1; + } +} diff --git a/packages/avatar/src/animation/Animation.ts b/packages/avatar/src/animation/Animation.ts new file mode 100644 index 0000000..b6defc0 --- /dev/null +++ b/packages/avatar/src/animation/Animation.ts @@ -0,0 +1,311 @@ +import { IAnimation, IAssetAnimation, IAssetAnimationFrame } from '@nitrots/api'; +import { AvatarStructure } from '../AvatarStructure'; +import { AddDataContainer } from './AddDataContainer'; +import { AvatarAnimationLayerData } from './AvatarAnimationLayerData'; +import { AvatarDataContainer } from './AvatarDataContainer'; +import { DirectionDataContainer } from './DirectionDataContainer'; +import { SpriteDataContainer } from './SpriteDataContainer'; + +export class Animation implements IAnimation +{ + private static EMPTY_ARRAY: any[] = []; + + private _id: string; + private _description: string; + private _frames: AvatarAnimationLayerData[][]; + private _spriteData: SpriteDataContainer[]; + private _avatarData: AvatarDataContainer; + private _directionData: DirectionDataContainer; + private _removeData: string[]; + private _addData: AddDataContainer[]; + private _overriddenActions: Map; + private _overrideFrames: Map; + private _resetOnToggle: boolean; + + constructor(k: AvatarStructure, _arg_2: IAssetAnimation) + { + this._id = _arg_2.name; + this._description = this._id; + this._frames = []; + this._spriteData = null; + this._avatarData = null; + this._directionData = null; + this._removeData = null; + this._addData = null; + this._overriddenActions = null; + this._overrideFrames = null; + this._resetOnToggle = (_arg_2.resetOnToggle || false); + + if(_arg_2.sprites && _arg_2.sprites.length) + { + this._spriteData = []; + + for(const sprite of _arg_2.sprites) this._spriteData.push(new SpriteDataContainer(this, sprite)); + } + + if(_arg_2.avatars && _arg_2.avatars.length) this._avatarData = new AvatarDataContainer(_arg_2.avatars[0]); + + if(_arg_2.directions && _arg_2.directions.length) this._directionData = new DirectionDataContainer(_arg_2.directions[0]); + + if(_arg_2.removes && _arg_2.removes.length) + { + this._removeData = []; + + for(const remove of _arg_2.removes) this._removeData.push(remove.id); + } + + if(_arg_2.adds && _arg_2.adds.length) + { + this._addData = []; + + for(const add of _arg_2.adds) this._addData.push(new AddDataContainer(add)); + } + + if(_arg_2.overrides && _arg_2.overrides.length) + { + this._overrideFrames = new Map(); + this._overriddenActions = new Map(); + + for(const override of _arg_2.overrides) + { + const name = override.name; + const value = override.override; + + this._overriddenActions.set(value, name); + + const frames: AvatarAnimationLayerData[][] = []; + + this.parseFrames(frames, override.frames, k); + + this._overrideFrames.set(name, frames); + } + } + + this.parseFrames(this._frames, _arg_2.frames, k); + } + + private parseFrames(frames: AvatarAnimationLayerData[][], _arg_2: IAssetAnimationFrame[], _arg_3: AvatarStructure): void + { + if(!_arg_2 || !_arg_2.length) return; + + for(const frame of _arg_2) + { + let repeats = 1; + + if(frame.repeats && (frame.repeats > 1)) repeats = frame.repeats; + + let index = 0; + + while(index < repeats) + { + const layers: AvatarAnimationLayerData[] = []; + + if(frame.bodyparts && frame.bodyparts.length) + { + for(const bodyPart of frame.bodyparts) + { + const definition = _arg_3.getActionDefinition(bodyPart.action); + const layer = new AvatarAnimationLayerData(bodyPart, AvatarAnimationLayerData.BODYPART, definition); + + layers.push(layer); + } + } + + if(frame.fxs && frame.fxs.length) + { + for(const fx of frame.fxs) + { + const definition = _arg_3.getActionDefinition(fx.action); + const layer = new AvatarAnimationLayerData(fx, AvatarAnimationLayerData.FX, definition); + + layers.push(layer); + } + } + + frames.push(layers); + + index++; + } + } + } + + public frameCount(k: string = null): number + { + if(!k) return this._frames.length; + + if(this._overrideFrames) + { + const _local_2 = this._overrideFrames.get(k); + + if(_local_2) return _local_2.length; + } + + return 0; + } + + public hasOverriddenActions(): boolean + { + if(!this._overriddenActions) return false; + + return (this._overriddenActions.size > 0); + } + + public overriddenActionNames(): string[] + { + if(!this._overriddenActions) return null; + + const keys: string[] = []; + + for(const key of this._overriddenActions.keys()) keys.push(key); + + return keys; + } + + public overridingAction(k: string): string + { + if(!this._overriddenActions) return null; + + return this._overriddenActions.get(k); + } + + private getFrame(frameCount: number, _arg_2: string = null): AvatarAnimationLayerData[] + { + if(frameCount < 0) frameCount = 0; + + let layers: AvatarAnimationLayerData[] = []; + + if(!_arg_2) + { + if(this._frames.length > 0) + { + layers = this._frames[(frameCount % this._frames.length)]; + } + } + else + { + const overrideLayers = this._overrideFrames.get(_arg_2); + + if(overrideLayers && (overrideLayers.length > 0)) + { + layers = overrideLayers[(frameCount % overrideLayers.length)]; + } + } + + return layers; + } + + public getAnimatedBodyPartIds(k: number, _arg_2: string = null): string[] + { + const _local_3: string[] = []; + + for(const layer of this.getFrame(k, _arg_2)) + { + if(layer.type === AvatarAnimationLayerData.BODYPART) + { + _local_3.push(layer.id); + } + + else if(layer.type === AvatarAnimationLayerData.FX) + { + if(this._addData && this._addData.length) + { + for(const _local_5 of this._addData) + { + if(_local_5.id === layer.id) _local_3.push(_local_5.align); + } + } + } + } + + return _local_3; + } + + public getLayerData(frameCount: number, spriteId: string, _arg_3: string = null): AvatarAnimationLayerData + { + for(const layer of this.getFrame(frameCount, _arg_3)) + { + if(layer.id === spriteId) return layer; + + if(layer.type === AvatarAnimationLayerData.FX) + { + if(this._addData && this._addData.length) + { + for(const addData of this._addData) + { + if(((addData.align === spriteId) && (addData.id === layer.id))) return layer; + } + } + } + } + + return null; + } + + public hasAvatarData(): boolean + { + return this._avatarData !== null; + } + + public hasDirectionData(): boolean + { + return this._directionData !== null; + } + + public hasAddData(): boolean + { + return this._addData !== null; + } + + public getAddData(k: string): AddDataContainer + { + if(this._addData) + { + for(const _local_2 of this._addData) + { + if(_local_2.id === k) return _local_2; + } + } + + return null; + } + + public get id(): string + { + return this._id; + } + + public get spriteData(): SpriteDataContainer[] + { + return this._spriteData || Animation.EMPTY_ARRAY; + } + + public get avatarData(): AvatarDataContainer + { + return this._avatarData; + } + + public get directionData(): DirectionDataContainer + { + return this._directionData; + } + + public get removeData(): string[] + { + return this._removeData || Animation.EMPTY_ARRAY; + } + + public get addData(): AddDataContainer[] + { + return this._addData || Animation.EMPTY_ARRAY; + } + + public toString(): string + { + return this._description; + } + + public get resetOnToggle(): boolean + { + return this._resetOnToggle; + } +} diff --git a/packages/avatar/src/animation/AnimationManager.ts b/packages/avatar/src/animation/AnimationManager.ts new file mode 100644 index 0000000..daa7e6b --- /dev/null +++ b/packages/avatar/src/animation/AnimationManager.ts @@ -0,0 +1,49 @@ +import { IAnimation, IAnimationLayerData, IAnimationManager, IAssetAnimation } from '@nitrots/api'; +import { AvatarStructure } from '../AvatarStructure'; +import { Animation } from './Animation'; + +export class AnimationManager implements IAnimationManager +{ + private _animations: Map; + + constructor() + { + this._animations = new Map(); + } + + public registerAnimation(structure: AvatarStructure, _arg_2: { [index: string]: IAssetAnimation }): boolean + { + if(!_arg_2) return false; + + const animationData = _arg_2[Object.keys(_arg_2)[0]]; + + const animation = new Animation(structure, animationData); + + this._animations.set(animationData.name, animation); + + return true; + } + + public getAnimation(animation: string): Animation + { + const existing = this._animations.get(animation); + + if(!existing) return null; + + return existing; + } + + public getLayerData(animation: string, frameCount: number, spriteId: string): IAnimationLayerData + { + const existing = this.getAnimation(animation); + + if(!existing) return null; + + return existing.getLayerData(frameCount, spriteId); + } + + public get animations(): Map + { + return this._animations; + } +} diff --git a/packages/avatar/src/animation/AvatarAnimationLayerData.ts b/packages/avatar/src/animation/AvatarAnimationLayerData.ts new file mode 100644 index 0000000..9e4714b --- /dev/null +++ b/packages/avatar/src/animation/AvatarAnimationLayerData.ts @@ -0,0 +1,109 @@ +import { IActionDefinition, IActiveActionData, IAnimationLayerData, IAssetAnimationFramePart } from '@nitrots/api'; +import { ActiveActionData } from '../actions'; + +export class AvatarAnimationLayerData implements IAnimationLayerData +{ + public static BODYPART: string = 'bodypart'; + public static FX: string = 'fx'; + + private _id: string; + private _action: IActiveActionData; + private _animationFrame: number; + private _dx: number; + private _dy: number; + private _dz: number; + private _directionOffset: number; + private _type: string; + private _base: string; + private _items: Map; + + constructor(k: IAssetAnimationFramePart, _arg_2: string, _arg_3: IActionDefinition) + { + this._id = k.id; + this._animationFrame = (k.frame || 0); + this._dx = (k.dx || 0); + this._dy = (k.dy || 0); + this._dz = (k.dz || 0); + this._directionOffset = (k.dd || 0); + this._type = _arg_2; + this._base = (k.base || ''); + this._items = new Map(); + + if(k.items) for(const _local_4 of k.items) this._items.set(_local_4.id, _local_4.base); + + let _local_5 = ''; + + if(this._base !== '') _local_5 = this.baseAsInt().toString(); + + if(_arg_3) + { + this._action = new ActiveActionData(_arg_3.state, this.base); + this._action.definition = _arg_3; + } + } + + public get items(): Map + { + return this._items; + } + + private baseAsInt(): number + { + let k = 0; + let index = 0; + + while(index < this._base.length) + { + k = (k + this._base.charCodeAt(index)); + + index++; + } + + return k; + } + + public get id(): string + { + return this._id; + } + + public get animationFrame(): number + { + return this._animationFrame; + } + + public get dx(): number + { + return this._dx; + } + + public get dy(): number + { + return this._dy; + } + + public get dz(): number + { + return this._dz; + } + + public get dd(): number + { + return this._directionOffset; + } + + public get type(): string + { + return this._type; + } + + public get base(): string + { + return this._base; + } + + public get action(): IActiveActionData + { + return this._action; + } +} diff --git a/packages/avatar/src/animation/AvatarDataContainer.ts b/packages/avatar/src/animation/AvatarDataContainer.ts new file mode 100644 index 0000000..399cc68 --- /dev/null +++ b/packages/avatar/src/animation/AvatarDataContainer.ts @@ -0,0 +1,136 @@ +import { IAssetAnimationAvatar, IAvatarDataContainer } from '@nitrots/api'; +import { AdjustmentFilter } from 'pixi-filters'; + +export class AvatarDataContainer implements IAvatarDataContainer +{ + private _ink: number; + private _foreGround: number; + private _backGround: number; + private _colorTransform: AdjustmentFilter; + private _rgb: number; + private _r: number; + private _g: number; + private _b: number; + private _redMultiplier: number; + private _greenMultiplier: number; + private _blueMultiplier: number; + private _alphaMultiplier: number; + private _colorMap: Map; + private _paletteIsGrayscale: boolean; + + constructor(k: IAssetAnimationAvatar) + { + this._ink = k.ink; + + let foreground = k.foreground; + let background = k.background; + + foreground = foreground.replace('#', ''); + background = background.replace('#', ''); + + this._foreGround = parseInt(foreground, 16); + this._backGround = parseInt(background, 16); + this._colorTransform = null; + this._rgb = parseInt(foreground, 16); + this._r = ((this._rgb >> 16) & 0xFF); + this._g = ((this._rgb >> 8) & 0xFF); + this._b = ((this._rgb >> 0) & 0xFF); + this._redMultiplier = ((this._r / 0xFF) * 1); + this._greenMultiplier = ((this._g / 0xFF) * 1); + this._blueMultiplier = ((this._b / 0xFF) * 1); + this._alphaMultiplier = 1; + this._paletteIsGrayscale = true; + + if(this._ink === 37) + { + this._alphaMultiplier = 0.5; + this._paletteIsGrayscale = false; + } + + this._colorTransform = new AdjustmentFilter({ red: (this._r / 255), green: (this._g / 255), blue: (this._b / 255), alpha: this._alphaMultiplier }); + this._colorMap = this.generatePaletteMapForGrayscale(this._backGround, this._foreGround); + } + + public get ink(): number + { + return this._ink; + } + + public get colorTransform(): AdjustmentFilter + { + return this._colorTransform; + } + + public get reds(): number[] + { + return this._colorMap.get('reds'); + } + + public get greens(): number[] + { + return this._colorMap.get('greens'); + } + + public get blues(): number[] + { + return this._colorMap.get('blues'); + } + + public get alphas(): number[] + { + return this._colorMap.get('alphas'); + } + + public get paletteIsGrayscale(): boolean + { + return this._paletteIsGrayscale; + } + + private generatePaletteMapForGrayscale(background: number, foreground: number): Map + { + const alphaBackground = ((background >> 24) & 0xFF); + const redBackground = ((background >> 16) & 0xFF); + const greenBackground = ((background >> 8) & 0xFF); + const blueBackground = ((background >> 0) & 0xFF); + const alphaForeground = ((foreground >> 24) & 0xFF); + const redForeground = ((foreground >> 16) & 0xFF); + const greenForeground = ((foreground >> 8) & 0xFF); + const blueForeground = ((foreground >> 0) & 0xFF); + const alphaDifference = ((alphaForeground - alphaBackground) / 0xFF); + const redDifference = ((redForeground - redBackground) / 0xFF); + const greenDifference = ((greenForeground - greenBackground) / 0xFF); + const blueDifference = ((blueForeground - blueBackground) / 0xFF); + const _local_15: Map = new Map(); + const _local_16: number[] = []; + const _local_17: number[] = []; + const _local_18: number[] = []; + const _local_19: number[] = []; + let _local_20 = alphaBackground; + let _local_21 = redBackground; + let _local_22 = greenBackground; + let _local_23 = blueBackground; + + for(let i = 0; i < 256; i++) + { + if((((_local_21 == redBackground) && (_local_22 == greenBackground)) && (_local_23 == blueBackground))) + { + _local_20 = 0; + } + _local_20 = (_local_20 + alphaDifference); + _local_21 = (_local_21 + redDifference); + _local_22 = (_local_22 + greenDifference); + _local_23 = (_local_23 + blueDifference); + _local_19.push((_local_20 << 24)); + _local_16.push(((((_local_20 << 24) | (_local_21 << 16)) | (_local_22 << 8)) | _local_23)); + _local_17.push(((((_local_20 << 24) | (_local_21 << 16)) | (_local_22 << 8)) | _local_23)); + _local_18.push(((((_local_20 << 24) | (_local_21 << 16)) | (_local_22 << 8)) | _local_23)); + } + + _local_15.set('alphas', _local_16); + _local_15.set('reds', _local_16); + _local_15.set('greens', _local_17); + _local_15.set('blues', _local_18); + + return _local_15; + } +} diff --git a/packages/avatar/src/animation/DirectionDataContainer.ts b/packages/avatar/src/animation/DirectionDataContainer.ts new file mode 100644 index 0000000..e90f453 --- /dev/null +++ b/packages/avatar/src/animation/DirectionDataContainer.ts @@ -0,0 +1,16 @@ +import { IAssetAnimationDirection } from '@nitrots/api'; + +export class DirectionDataContainer +{ + private _offset: number; + + constructor(k: IAssetAnimationDirection) + { + this._offset = k.offset; + } + + public get offset(): number + { + return this._offset; + } +} diff --git a/packages/avatar/src/animation/SpriteDataContainer.ts b/packages/avatar/src/animation/SpriteDataContainer.ts new file mode 100644 index 0000000..6755240 --- /dev/null +++ b/packages/avatar/src/animation/SpriteDataContainer.ts @@ -0,0 +1,94 @@ +import { IAnimation, IAssetAnimationSprite, ISpriteDataContainer } from '@nitrots/api'; + +export class SpriteDataContainer implements ISpriteDataContainer +{ + private _animation: IAnimation; + private _id: string; + private _ink: number; + private _member: string; + private _hasDirections: boolean; + private _hasStaticY: boolean; + private _dx: number[]; + private _dy: number[]; + private _dz: number[]; + + constructor(k: IAnimation, _arg_2: IAssetAnimationSprite) + { + this._animation = k; + this._id = _arg_2.id; + this._ink = _arg_2.ink; + this._member = _arg_2.member; + this._hasStaticY = _arg_2.staticY ? true : false; + this._hasDirections = _arg_2.directions ? true : false; + this._dx = []; + this._dy = []; + this._dz = []; + + const directions = _arg_2.directionList; + + if(directions && directions.length) + { + for(const direction of directions) + { + const id = direction.id; + + if(id === undefined) continue; + + this._dx[id] = (direction.dx || 0); + this._dy[id] = (direction.dy || 0); + this._dz[id] = (direction.dz || 0); + } + } + } + + public getDirectionOffsetX(k: number): number + { + if(k < this._dx.length) return this._dx[k]; + + return 0; + } + + public getDirectionOffsetY(k: number): number + { + if(k < this._dy.length) return this._dy[k]; + + return 0; + } + + public getDirectionOffsetZ(k: number): number + { + if(k < this._dz.length) return this._dz[k]; + + return 0; + } + + public get animation(): IAnimation + { + return this._animation; + } + + public get id(): string + { + return this._id; + } + + public get ink(): number + { + return this._ink; + } + + public get member(): string + { + return this._member; + } + + public get hasDirections(): boolean + { + return this._hasDirections; + } + + public get hasStaticY(): boolean + { + return this._hasStaticY; + } +} diff --git a/packages/avatar/src/animation/index.ts b/packages/avatar/src/animation/index.ts new file mode 100644 index 0000000..f2e83c4 --- /dev/null +++ b/packages/avatar/src/animation/index.ts @@ -0,0 +1,7 @@ +export * from './AddDataContainer'; +export * from './Animation'; +export * from './AnimationManager'; +export * from './AvatarAnimationLayerData'; +export * from './AvatarDataContainer'; +export * from './DirectionDataContainer'; +export * from './SpriteDataContainer'; diff --git a/packages/avatar/src/cache/AvatarImageActionCache.ts b/packages/avatar/src/cache/AvatarImageActionCache.ts new file mode 100644 index 0000000..0b65729 --- /dev/null +++ b/packages/avatar/src/cache/AvatarImageActionCache.ts @@ -0,0 +1,57 @@ +import { GetTickerTime } from '@nitrots/utils'; +import { AvatarImageDirectionCache } from './AvatarImageDirectionCache'; + +export class AvatarImageActionCache +{ + private _cache: Map; + private _lastAccessTime: number; + + constructor() + { + this._cache = new Map(); + + this.setLastAccessTime(GetTickerTime()); + } + + public dispose(): void + { + this.debugInfo('[dispose]'); + + if(!this._cache) return; + + for(const direction of this._cache.values()) + { + if(direction) direction.dispose(); + } + + this._cache.clear(); + } + + public getDirectionCache(k: number): AvatarImageDirectionCache + { + const existing = this._cache.get(k.toString()); + + if(!existing) return null; + + return existing; + } + + public updateDirectionCache(k: number, _arg_2: AvatarImageDirectionCache): void + { + this._cache.set(k.toString(), _arg_2); + } + + public setLastAccessTime(k: number): void + { + this._lastAccessTime = k; + } + + public getLastAccessTime(): number + { + return this._lastAccessTime; + } + + private debugInfo(k: string): void + { + } +} diff --git a/packages/avatar/src/cache/AvatarImageBodyPartCache.ts b/packages/avatar/src/cache/AvatarImageBodyPartCache.ts new file mode 100644 index 0000000..cb7d5ce --- /dev/null +++ b/packages/avatar/src/cache/AvatarImageBodyPartCache.ts @@ -0,0 +1,96 @@ +import { IActiveActionData } from '@nitrots/api'; +import { AvatarImageActionCache } from './AvatarImageActionCache'; + +export class AvatarImageBodyPartCache +{ + private _cache: Map; + private _currentAction: IActiveActionData; + private _currentDirection: number; + private _disposed: boolean; + + constructor() + { + this._cache = new Map(); + } + + public setAction(k: IActiveActionData, _arg_2: number): void + { + if(!this._currentAction) this._currentAction = k; + + const _local_3 = this.getActionCache(this._currentAction); + + if(_local_3) _local_3.setLastAccessTime(_arg_2); + + this._currentAction = k; + } + + public dispose(): void + { + if(!this._disposed) + { + if(!this._cache) return; + + this.disposeActions(0, 2147483647); + + this._cache.clear(); + + this._cache = null; + this._disposed = true; + } + } + + public disposeActions(k: number, _arg_2: number): void + { + if(!this._cache || this._disposed) return; + + for(const [key, cache] of this._cache.entries()) + { + if(!cache) continue; + + const _local_3 = cache.getLastAccessTime(); + + if((_arg_2 - _local_3) >= k) + { + cache.dispose(); + + this._cache.delete(key); + } + } + } + + public getAction(): IActiveActionData + { + return this._currentAction; + } + + public setDirection(k: number): void + { + this._currentDirection = k; + } + + public getDirection(): number + { + return this._currentDirection; + } + + public getActionCache(k: IActiveActionData = null): AvatarImageActionCache + { + if(!this._currentAction) return null; + + if(!k) k = this._currentAction; + + if(k.overridingAction) return this._cache.get(k.overridingAction); + + return this._cache.get(k.id); + } + + public updateActionCache(k: IActiveActionData, _arg_2: AvatarImageActionCache): void + { + if(k.overridingAction) this._cache.set(k.overridingAction, _arg_2); + else this._cache.set(k.id, _arg_2); + } + + private debugInfo(k: string): void + { + } +} diff --git a/packages/avatar/src/cache/AvatarImageCache.ts b/packages/avatar/src/cache/AvatarImageCache.ts new file mode 100644 index 0000000..6c8381e --- /dev/null +++ b/packages/avatar/src/cache/AvatarImageCache.ts @@ -0,0 +1,444 @@ +import { AvatarDirectionAngle, AvatarFigurePartType, AvatarScaleType, GeometryType, IActiveActionData, IAvatarImage } from '@nitrots/api'; +import { GetTickerTime } from '@nitrots/utils'; +import { Container, Matrix, Point, Rectangle, Sprite, Texture } from 'pixi.js'; +import { AvatarImageBodyPartContainer } from '../AvatarImageBodyPartContainer'; +import { AvatarImagePartContainer } from '../AvatarImagePartContainer'; +import { AvatarStructure } from '../AvatarStructure'; +import { AssetAliasCollection } from '../alias'; +import { AvatarAnimationLayerData } from '../animation'; +import { AvatarCanvas } from '../structure'; +import { AvatarImageActionCache } from './AvatarImageActionCache'; +import { AvatarImageBodyPartCache } from './AvatarImageBodyPartCache'; +import { AvatarImageDirectionCache } from './AvatarImageDirectionCache'; +import { ImageData } from './ImageData'; + +export class AvatarImageCache +{ + private static DEFAULT_MAX_CACHE_STORAGE_TIME_MS: number = 60000; + + private _structure: AvatarStructure; + private _avatar: IAvatarImage; + private _assets: AssetAliasCollection; + private _scale: string; + private _cache: Map; + private _canvas: AvatarCanvas; + private _disposed: boolean; + private _geometryType: string; + private _unionImages: ImageData[]; + private _matrix: Matrix; + + constructor(k: AvatarStructure, _arg_2: IAvatarImage, _arg_3: AssetAliasCollection, _arg_4: string) + { + this._structure = k; + this._avatar = _arg_2; + this._assets = _arg_3; + this._scale = _arg_4; + this._cache = new Map(); + this._canvas = null; + this._disposed = false; + this._unionImages = []; + this._matrix = new Matrix(); + } + + public dispose(): void + { + if(this._disposed) return; + + this._structure = null; + this._avatar = null; + this._assets = null; + this._canvas = null; + this._disposed = true; + + if(this._cache) + { + for(const cache of this._cache.values()) + { + if(!cache) continue; + + cache.dispose(); + } + + this._cache = null; + } + + if(this._unionImages) + { + for(const image of this._unionImages) + { + if(!image) continue; + + image.dispose(); + } + + this._unionImages = []; + } + } + + public disposeInactiveActions(k: number = 60000): void + { + const time = GetTickerTime(); + + if(this._cache) + { + for(const cache of this._cache.values()) + { + if(!cache) continue; + + cache.disposeActions(k, time); + } + } + } + + public resetBodyPartCache(k: IActiveActionData): void + { + if(this._cache) + { + for(const cache of this._cache.values()) + { + if(!cache) continue; + + cache.setAction(k, 0); + } + } + } + + public setDirection(k: string, _arg_2: number): void + { + const parts = this._structure.getBodyPartsUnordered(k); + + if(parts) + { + for(const part of parts) + { + const actionCache = this.getBodyPartCache(part); + + if(!actionCache) continue; + + actionCache.setDirection(_arg_2); + } + } + } + + public setAction(k: IActiveActionData, _arg_2: number): void + { + const _local_3 = this._structure.getActiveBodyPartIds(k, this._avatar); + + for(const _local_4 of _local_3) + { + const _local_5 = this.getBodyPartCache(_local_4); + + if(_local_5) _local_5.setAction(k, _arg_2); + } + } + + public setGeometryType(k: string): void + { + if(this._geometryType === k) return; + + if((((this._geometryType === GeometryType.SITTING) && (k === GeometryType.VERTICAL)) || ((this._geometryType === GeometryType.VERTICAL) && (k === GeometryType.SITTING)) || ((this._geometryType === GeometryType.SNOWWARS_HORIZONTAL) && (k = GeometryType.SNOWWARS_HORIZONTAL)))) + { + this._geometryType = k; + this._canvas = null; + + return; + } + + this.disposeInactiveActions(0); + + this._geometryType = k; + this._canvas = null; + } + + public getImageContainer(key: string, frameNumber: number, forceRefresh: boolean = false): AvatarImageBodyPartContainer + { + const bodyPartCache = this.getBodyPartCache(key) || new AvatarImageBodyPartCache(); + + this._cache.set(key, bodyPartCache); + + let direction = bodyPartCache.getDirection(); + let action = bodyPartCache.getAction(); + let adjustedFrameCount = frameNumber; + + if(action.definition.startFromFrameZero) adjustedFrameCount -= action.startFrame; + + let adjustedAction = action; + let removeData: string[] = []; + let items: Map = new Map(); + + const positionOffset = new Point(); + + if(action.definition.isAnimation) + { + let adjustedDirection = direction; + + const animation = this._structure.getAnimation(((action.definition.state + '.') + action.actionParameter)); + const animationFrameOffset = (frameNumber - action.startFrame); + + if(animation) + { + const layerData = animation.getLayerData(animationFrameOffset, key, action.overridingAction); + + if(layerData) + { + adjustedDirection = (direction + layerData.dd + 8) % 8; + + positionOffset.x = this._scale === AvatarScaleType.LARGE ? layerData.dx : layerData.dx / 2; + positionOffset.y = this._scale === AvatarScaleType.LARGE ? layerData.dy : layerData.dy / 2; + + adjustedFrameCount = layerData.animationFrame; + + if(layerData.action) action = layerData.action; + + if(layerData.type === AvatarAnimationLayerData.BODYPART) + { + if(layerData.action) adjustedAction = layerData.action; + + direction = adjustedDirection; + } + else if(layerData.type === AvatarAnimationLayerData.FX) direction = adjustedDirection; + + items = layerData.items; + } + + removeData = animation.removeData; + } + } + + let actionCache = bodyPartCache.getActionCache(adjustedAction); + + if(!actionCache || forceRefresh) + { + actionCache = new AvatarImageActionCache(); + bodyPartCache.updateActionCache(adjustedAction, actionCache); + } + + let directionCache = actionCache.getDirectionCache(direction); + + if(!directionCache || forceRefresh) + { + const partList = this._structure.getParts(key, this._avatar.getFigure(), adjustedAction, this._geometryType, direction, removeData, this._avatar, items); + + directionCache = new AvatarImageDirectionCache(partList); + + actionCache.updateDirectionCache(direction, directionCache); + } + + let imageContainer = directionCache.getImageContainer(adjustedFrameCount); + + if(!imageContainer || forceRefresh) + { + const partList = directionCache.getPartList(); + + imageContainer = this.renderBodyPart(direction, partList, adjustedFrameCount, action); + + if(imageContainer && !forceRefresh) + { + if(imageContainer.isCacheable) directionCache.updateImageContainer(imageContainer, adjustedFrameCount); + } + else + { + return null; + } + } + + const offset = this._structure.getFrameBodyPartOffset(adjustedAction, direction, adjustedFrameCount, key); + + positionOffset.x += offset.x; + positionOffset.y += offset.y; + + imageContainer.offset = positionOffset; + + return imageContainer; + } + + public getBodyPartCache(k: string): AvatarImageBodyPartCache + { + let existing = this._cache.get(k); + + if(!existing) + { + existing = new AvatarImageBodyPartCache(); + + this._cache.set(k, existing); + } + + return existing; + } + + private renderBodyPart(direction: number, containers: AvatarImagePartContainer[], frameCount: number, action: IActiveActionData): AvatarImageBodyPartContainer + { + if(!containers || !containers.length) return null; + + if(!this._canvas) + { + this._canvas = this._structure.getCanvas(this._scale, this._geometryType); + + if(!this._canvas) return null; + } + + const isFlipped = AvatarDirectionAngle.DIRECTION_IS_FLIPPED[direction] || false; + let assetPartDefinition = action.definition.assetPartDefinition; + let isCacheable = true; + let containerIndex = (containers.length - 1); + + while(containerIndex >= 0) + { + const container = containers[containerIndex]; + + let color = 16777215; + + if(!((direction == 7) && ((container.partType === 'fc') || (container.partType === 'ey')))) + { + if(!((container.partType === 'ri') && !container.partId)) + { + const partId = container.partId; + const animationFrame = container.getFrameDefinition(frameCount); + + let partType = container.partType; + let frameNumber = 0; + + if(animationFrame) + { + frameNumber = animationFrame.number; + + if((animationFrame.assetPartDefinition) && (animationFrame.assetPartDefinition !== '')) assetPartDefinition = animationFrame.assetPartDefinition; + } + else frameNumber = container.getFrameIndex(frameCount); + + let assetDirection = direction; + let flipH = false; + + if(isFlipped) + { + if(((assetPartDefinition === 'wav') && (((partType === AvatarFigurePartType.LEFT_HAND) || (partType === AvatarFigurePartType.LEFT_SLEEVE)) || (partType === AvatarFigurePartType.LEFT_COAT_SLEEVE))) || ((assetPartDefinition === 'drk') && (((partType === AvatarFigurePartType.RIGHT_HAND) || (partType === AvatarFigurePartType.RIGHT_SLEEVE)) || (partType === AvatarFigurePartType.RIGHT_COAT_SLEEVE))) || ((assetPartDefinition === 'blw') && (partType === AvatarFigurePartType.RIGHT_HAND)) || ((assetPartDefinition === 'sig') && (partType === AvatarFigurePartType.LEFT_HAND)) || ((assetPartDefinition === 'respect') && (partType === AvatarFigurePartType.LEFT_HAND)) || (partType === AvatarFigurePartType.RIGHT_HAND_ITEM) || (partType === AvatarFigurePartType.LEFT_HAND_ITEM) || (partType === AvatarFigurePartType.CHEST_PRINT)) + { + flipH = true; + } + else + { + if(direction === 4) assetDirection = 2; + else if(direction === 5) assetDirection = 1; + else if(direction === 6) assetDirection = 0; + + if(container.flippedPartType !== partType) partType = container.flippedPartType; + } + } + + let assetName = (this._scale + '_' + assetPartDefinition + '_' + partType + '_' + partId + '_' + assetDirection + '_' + frameNumber); + let asset = this._assets.getAsset(assetName); + + if(!asset) + { + assetName = (this._scale + '_std_' + partType + '_' + partId + '_' + assetDirection + '_0'); + asset = this._assets.getAsset(assetName); + } + + if(asset) + { + const texture = asset.texture; + + if(!texture || !texture.source) + { + isCacheable = false; + } + else + { + if(container.isColorable && container.color) color = container.color.rgb; + + const offset = new Point(-(asset.x), -(asset.y)); + + if(flipH) offset.x = (offset.x + ((this._scale === AvatarScaleType.LARGE) ? 65 : 31)); + + this._unionImages.push(new ImageData(texture, asset.rectangle, offset, flipH, color)); + } + } + } + } + + containerIndex--; + } + + if(!this._unionImages.length) return null; + + const imageData = this.createUnionImage(this._unionImages, isFlipped); + const canvasOffset = ((this._scale === AvatarScaleType.LARGE) ? (this._canvas.height - 16) : (this._canvas.height - 8)); + const offset = new Point(-(imageData.regPoint.x), (canvasOffset - imageData.regPoint.y)); + + if(isFlipped && (assetPartDefinition !== 'lay')) offset.x = (offset.x + ((this._scale === AvatarScaleType.LARGE) ? 67 : 31)); + + let imageIndex = (this._unionImages.length - 1); + + while(imageIndex >= 0) + { + const _local_17 = this._unionImages.pop(); + + if(_local_17) _local_17.dispose(); + + imageIndex--; + } + + return new AvatarImageBodyPartContainer(imageData.container, offset, isCacheable); + } + + private convertColorToHex(k: number): string + { + let _local_2: string = (k * 0xFF).toString(16); + if(_local_2.length < 2) + { + _local_2 = ('0' + _local_2); + } + return _local_2; + } + + private createUnionImage(k: ImageData[], isFlipped: boolean): ImageData + { + const bounds = new Rectangle(); + + for(const data of k) data && bounds.enlarge(data.offsetRect); + + const point = new Point(-(bounds.x), -(bounds.y)); + const container = new Container(); + + const sprite = new Sprite(Texture.EMPTY); + + sprite.width = bounds.width; + sprite.height = bounds.height; + + container.addChild(sprite); + + for(const data of k) + { + if(!data) continue; + + const regPoint = point.clone(); + + regPoint.x -= data.regPoint.x; + regPoint.y -= data.regPoint.y; + + if(isFlipped) regPoint.x = (container.width - (regPoint.x + data.rect.width)); + + if(isFlipped != data.flipH) + { + this._matrix.a = -1; + this._matrix.tx = ((data.rect.x + data.rect.width) + regPoint.x); + this._matrix.ty = (regPoint.y - data.rect.y); + } + else + { + this._matrix.a = 1; + this._matrix.tx = (regPoint.x - data.rect.x); + this._matrix.ty = (regPoint.y - data.rect.y); + } + + const sprite = new Sprite(data.texture); + + sprite.tint = data.colorTransform; + sprite.setFromMatrix(this._matrix); + + container.addChild(sprite); + } + + return new ImageData(null, container.getLocalBounds().rectangle, point, isFlipped, null, container); + } +} diff --git a/packages/avatar/src/cache/AvatarImageDirectionCache.ts b/packages/avatar/src/cache/AvatarImageDirectionCache.ts new file mode 100644 index 0000000..da3a75e --- /dev/null +++ b/packages/avatar/src/cache/AvatarImageDirectionCache.ts @@ -0,0 +1,59 @@ +import { AvatarImageBodyPartContainer } from '../AvatarImageBodyPartContainer'; +import { AvatarImagePartContainer } from '../AvatarImagePartContainer'; + +export class AvatarImageDirectionCache +{ + private _partList: AvatarImagePartContainer[]; + private _images: Map; + + constructor(k: AvatarImagePartContainer[]) + { + this._partList = k; + this._images = new Map(); + } + + public dispose(): void + { + for(const image of this._images.values()) image && image.dispose(); + + this._images = null; + } + + public getPartList(): AvatarImagePartContainer[] + { + return this._partList; + } + + public getImageContainer(k: number): AvatarImageBodyPartContainer + { + const existing = this._images.get(this.getCacheKey(k)); + + if(!existing) return null; + + return existing; + } + + public updateImageContainer(k: AvatarImageBodyPartContainer, _arg_2: number): void + { + const name = this.getCacheKey(_arg_2); + + const existing = this._images.get(name); + + if(existing) existing.dispose(); + + this._images.set(name, k); + } + + private getCacheKey(k: number): string + { + let name = ''; + + for(const part of this._partList) name += (part.getCacheableKey(k) + '/'); + + return name; + } + + private debugInfo(k: string): void + { + } +} diff --git a/packages/avatar/src/cache/ImageData.ts b/packages/avatar/src/cache/ImageData.ts new file mode 100644 index 0000000..c43c2c2 --- /dev/null +++ b/packages/avatar/src/cache/ImageData.ts @@ -0,0 +1,65 @@ +import { Container, Point, Rectangle, Texture } from 'pixi.js'; + +export class ImageData +{ + private _texture: Texture; + private _container: Container; + private _rect: Rectangle; + private _regPoint: Point; + private _flipH: boolean; + private _colorTransform: number; + + constructor(texture: Texture, rectangle: Rectangle, _arg_3: Point, flipH: boolean, color: number, container: Container = null) + { + this._texture = texture; + this._container = container; + this._rect = rectangle; + this._regPoint = _arg_3; + this._flipH = flipH; + this._colorTransform = color; + + if(flipH) this._regPoint.x = (-(this._regPoint.x) + rectangle.width); + } + + public dispose(): void + { + this._texture = null; + this._regPoint = null; + this._colorTransform = null; + } + + public get texture(): Texture + { + return this._texture; + } + + public get container(): Container + { + return this._container; + } + + public get rect(): Rectangle + { + return this._rect; + } + + public get regPoint(): Point + { + return this._regPoint; + } + + public get flipH(): boolean + { + return this._flipH; + } + + public get colorTransform(): number + { + return this._colorTransform; + } + + public get offsetRect(): Rectangle + { + return new Rectangle(-(this._regPoint.x), -(this._regPoint.y), this._rect.width, this._rect.height); + } +} diff --git a/packages/avatar/src/cache/index.ts b/packages/avatar/src/cache/index.ts new file mode 100644 index 0000000..d8d2e53 --- /dev/null +++ b/packages/avatar/src/cache/index.ts @@ -0,0 +1,5 @@ +export * from './AvatarImageActionCache'; +export * from './AvatarImageBodyPartCache'; +export * from './AvatarImageCache'; +export * from './AvatarImageDirectionCache'; +export * from './ImageData'; diff --git a/packages/avatar/src/data/HabboAvatarAnimations.ts b/packages/avatar/src/data/HabboAvatarAnimations.ts new file mode 100644 index 0000000..f1fc2cc --- /dev/null +++ b/packages/avatar/src/data/HabboAvatarAnimations.ts @@ -0,0 +1,827 @@ +export const HabboAvatarAnimations = { + 'animations': [ + { + 'id': 'Move', + 'parts': [ + { + 'setType': 'bd', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 1, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 2, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 3, + 'assetPartDefinition': 'wlk' + } + ] + }, + { + 'setType': 'bds', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 1, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 2, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 3, + 'assetPartDefinition': 'wlk' + } + ] + }, + { + 'setType': 'ss', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 1, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 2, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 3, + 'assetPartDefinition': 'wlk' + } + ] + }, + { + 'setType': 'lg', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 1, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 2, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 3, + 'assetPartDefinition': 'wlk' + } + ] + }, + { + 'setType': 'sh', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 1, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 2, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 3, + 'assetPartDefinition': 'wlk' + } + ] + }, + { + 'setType': 'lh', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 1, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 2, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 3, + 'assetPartDefinition': 'wlk' + } + ] + }, + { + 'setType': 'lhs', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 1, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 2, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 3, + 'assetPartDefinition': 'wlk' + } + ] + }, + { + 'setType': 'ls', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 1, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 2, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 3, + 'assetPartDefinition': 'wlk' + } + ] + }, + { + 'setType': 'lc', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 1, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 2, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 3, + 'assetPartDefinition': 'wlk' + } + ] + }, + { + 'setType': 'rh', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 1, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 2, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 3, + 'assetPartDefinition': 'wlk' + } + ] + }, + { + 'setType': 'rhs', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 1, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 2, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 3, + 'assetPartDefinition': 'wlk' + } + ] + }, + { + 'setType': 'rs', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 1, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 2, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 3, + 'assetPartDefinition': 'wlk' + } + ] + }, + { + 'setType': 'rc', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 1, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 2, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 3, + 'assetPartDefinition': 'wlk' + } + ] + }, + { + 'setType': 'ch', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 1, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 2, + 'assetPartDefinition': 'wlk' + }, + { + 'number': 3, + 'assetPartDefinition': 'wlk' + } + ] + } + ] + }, + { + 'id': 'Wave', + 'parts': [ + { + 'setType': 'lh', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wav' + }, + { + 'number': 1, + 'assetPartDefinition': 'wav' + } + ] + }, + { + 'setType': 'lhs', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wav' + }, + { + 'number': 1, + 'assetPartDefinition': 'wav' + } + ] + }, + { + 'setType': 'ls', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wav' + }, + { + 'number': 1, + 'assetPartDefinition': 'wav' + } + ] + }, + { + 'setType': 'lc', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wav' + }, + { + 'number': 1, + 'assetPartDefinition': 'wav' + } + ] + }, + { + 'setType': 'ch', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wav' + }, + { + 'number': 1, + 'assetPartDefinition': 'wav' + }, + { + 'number': 2, + 'assetPartDefinition': 'wav' + }, + { + 'number': 3, + 'assetPartDefinition': 'wav' + } + ] + } + ] + }, + { + 'id': 'Talk', + 'parts': [ + { + 'setType': 'hd', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'spk' + }, + { + 'number': 1, + 'assetPartDefinition': 'spk' + } + ] + }, + { + 'setType': 'fc', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'spk' + }, + { + 'number': 1, + 'assetPartDefinition': 'spk' + } + ] + }, + { + 'setType': 'fa', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'spk' + }, + { + 'number': 1, + 'assetPartDefinition': 'spk' + } + ] + } + ] + }, + { + 'id': 'Sign', + 'parts': [ + { + 'setType': 'lh', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'sig' + } + ] + }, + { + 'setType': 'li', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'sig' + } + ] + }, + { + 'setType': 'ls', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wav' + } + ] + }, + { + 'setType': 'lc', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wav' + } + ] + } + ] + }, + { + 'id': 'Respect', + 'parts': [ + { + 'setType': 'lh', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'respect', + 'repeats': 15 + }, + { + 'number': 1, + 'assetPartDefinition': 'respect', + 'repeats': 15 + } + ] + }, + { + 'setType': 'ls', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wav', + 'repeats': 15 + }, + { + 'number': 1, + 'assetPartDefinition': 'wav', + 'repeats': 15 + } + ] + }, + { + 'setType': 'lc', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'wav', + 'repeats': 15 + }, + { + 'number': 1, + 'assetPartDefinition': 'wav', + 'repeats': 15 + } + ] + } + ] + }, + { + 'id': 'Blow', + 'parts': [ + { + 'setType': 'rh', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'blw', + 'repeats': 10 + }, + { + 'number': 1, + 'assetPartDefinition': 'blw', + 'repeats': 10 + } + ] + }, + { + 'setType': 'rs', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'drk' + } + ] + }, + { + 'setType': 'rc', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'drk' + } + ] + }, + { + 'setType': 'ri', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': '' + } + ] + }, + { + 'setType': 'ey', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'std', + 'repeats': 10 + }, + { + 'number': 0, + 'assetPartDefinition': 'eyb', + 'repeats': 10 + } + ] + }, + { + 'setType': 'fc', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'std', + 'repeats': 10 + }, + { + 'number': 0, + 'assetPartDefinition': 'blw', + 'repeats': 10 + } + ] + } + ] + }, + { + 'id': 'Laugh', + 'parts': [ + { + 'setType': 'rh', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'blw' + } + ] + }, + { + 'setType': 'rs', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'drk' + } + ] + }, + { + 'setType': 'rc', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'drk' + } + ] + }, + { + 'setType': 'ri', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': '' + } + ] + }, + { + 'setType': 'ey', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'std', + 'repeats': 2 + } + ] + }, + { + 'setType': 'fc', + 'frames': [ + { + 'number': 0, + 'assetPartDefinition': 'sml' + } + ] + } + ], + 'offsets': { + 'frames': [ + { + 'id': 0, + 'directions': [ + { + 'id': 0, + 'bodyParts': [ + { + 'id': 'head', + 'dx': 0, + 'dy': 1 + } + ] + }, + { + 'id': 1, + 'bodyParts': [ + { + 'id': 'head', + 'dx': 0, + 'dy': 1 + } + ] + }, + { + 'id': 2, + 'bodyParts': [ + { + 'id': 'head', + 'dx': 0, + 'dy': 1 + } + ] + }, + { + 'id': 3, + 'bodyParts': [ + { + 'id': 'head', + 'dx': 0, + 'dy': 1 + } + ] + }, + { + 'id': 4, + 'bodyParts': [ + { + 'id': 'head', + 'dx': 0, + 'dy': 1 + } + ] + }, + { + 'id': 5, + 'bodyParts': [ + { + 'id': 'head', + 'dx': 0, + 'dy': 1 + } + ] + }, + { + 'id': 6, + 'bodyParts': [ + { + 'id': 'head', + 'dx': 0, + 'dy': 1 + } + ] + }, + { + 'id': 7, + 'bodyParts': [ + { + 'id': 'head', + 'dx': 0, + 'dy': 1 + } + ] + } + ] + }, + { + 'id': 1, + 'directions': [ + { + 'id': 0, + 'bodyParts': [ + { + 'id': 'head', + 'dx': 0, + 'dy': 0 + } + ] + }, + { + 'id': 1, + 'bodyParts': [ + { + 'id': 'head', + 'dx': 0, + 'dy': 0 + } + ] + }, + { + 'id': 2, + 'bodyParts': [ + { + 'id': 'head', + 'dx': 0, + 'dy': 0 + } + ] + }, + { + 'id': 3, + 'bodyParts': [ + { + 'id': 'head', + 'dx': 0, + 'dy': 0 + } + ] + }, + { + 'id': 4, + 'bodyParts': [ + { + 'id': 'head', + 'dx': 0, + 'dy': 0 + } + ] + }, + { + 'id': 5, + 'bodyParts': [ + { + 'id': 'head', + 'dx': 0, + 'dy': 0 + } + ] + }, + { + 'id': 6, + 'bodyParts': [ + { + 'id': 'head', + 'dx': 0, + 'dy': 0 + } + ] + }, + { + 'id': 7, + 'bodyParts': [ + { + 'id': 'head', + 'dx': 0, + 'dy': 0 + } + ] + } + ] + } + ] + } + } + ] +}; diff --git a/packages/avatar/src/data/HabboAvatarGeometry.ts b/packages/avatar/src/data/HabboAvatarGeometry.ts new file mode 100644 index 0000000..e6b9db0 --- /dev/null +++ b/packages/avatar/src/data/HabboAvatarGeometry.ts @@ -0,0 +1,1830 @@ +export const HabboAvatarGeometry = { + 'geometry': { + 'direction': 0, + 'camera': { + 'x': 0, + 'y': 0, + 'z': 10 + }, + 'canvases': [ + { + 'scale': 'h', + 'geometries': [ + { + 'id': 'vertical', + 'width': 90, + 'height': 130, + 'dx': 0, + 'dy': 0 + }, + { + 'id': 'sitting', + 'width': 90, + 'height': 130, + 'dx': 0, + 'dy': 0 + }, + { + 'id': 'horizontal', + 'width': 128, + 'height': 80, + 'dx': 30, + 'dy': 0 + }, + { + 'id': 'swhorizontal', + 'width': 192, + 'height': 120, + 'dx': 0, + 'dy': -40 + } + ] + }, + { + 'scale': 'sh', + 'geometries': [ + { + 'id': 'vertical', + 'width': 45, + 'height': 72, + 'dx': 0, + 'dy': 0 + }, + { + 'id': 'sitting', + 'width': 45, + 'height': 72, + 'dx': 0, + 'dy': 0 + }, + { + 'id': 'horizontal', + 'width': 64, + 'height': 50, + 'dx': 15, + 'dy': -10 + }, + { + 'id': 'swhorizontal', + 'width': 96, + 'height': 70, + 'dx': 0, + 'dy': -20 + }, + { + 'id': 'swim', + 'width': 64, + 'height': 70, + 'dx': 25, + 'dy': 10 + } + ] + } + ], + 'avatarSets': [ + { + 'id': 'full', + 'avatarSets': [ + { + 'id': 'body', + 'main': true, + 'bodyParts': [ + { + 'id': 'top' + }, + { + 'id': 'bottom' + }, + { + 'id': 'behind' + }, + { + 'id': 'torso' + }, + { + 'id': 'leftitem' + }, + { + 'id': 'rightitem' + }, + { + 'id': 'leftarm' + }, + { + 'id': 'rightarm' + } + ] + }, + { + 'id': 'head', + 'bodyParts': [ + { + 'id': 'head' + } + ] + } + ] + } + ], + 'types': [ + { + 'id': 'vertical', + 'bodyParts': [ + { + 'id': 'top', + 'x': 0, + 'y': 0, + 'z': 0.0, + 'radius': 2.0 + }, + { + 'id': 'bottom', + 'x': 0, + 'y': 0, + 'z': 0.0, + 'radius': 0.001 + }, + { + 'id': 'behind', + 'x': 0, + 'y': 0, + 'z': 0.2, + 'radius': 0.3 + }, + { + 'id': 'torso', + 'x': 0, + 'y': 0, + 'z': 0.0, + 'radius': 0.4, + 'items': [ + { + 'id': 'bd', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'bds', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'ch', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.04, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'sh', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.02, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'lg', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.03, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ss', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.04, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'cp', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.045, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'wa', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.05, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'cc', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.06, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ca', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.07, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'leftitem', + 'x': 0, + 'y': 0, + 'z': -0.29, + 'radius': 0.3, + 'items': [ + { + 'id': 'li', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'rightitem', + 'x': 0, + 'y': 0, + 'z': -0.29, + 'radius': 0.3, + 'items': [ + { + 'id': 'ri', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'leftarm', + 'x': -1, + 'y': 0, + 'z': -0.51, + 'radius': 0.5, + 'items': [ + { + 'id': 'lh', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'lhs', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ls', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.02, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'lc', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.025, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'rightarm', + 'x': 1, + 'y': 0, + 'z': -0.51, + 'radius': 0.5, + 'items': [ + { + 'id': 'rh', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'rhs', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'rs', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.02, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'rc', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.025, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'head', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.5, + 'items': [ + { + 'id': 'hd', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'fc', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.02, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ey', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.03, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'hr', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.04, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'hrb', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.05, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'fa', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.06, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ea', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.07, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ha', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.08, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'he', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.09, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + } + ] + }, + { + 'id': 'sitting', + 'bodyParts': [ + { + 'id': 'top', + 'x': 0, + 'y': 0, + 'z': 0.0, + 'radius': 2.0 + }, + { + 'id': 'bottom', + 'x': 0, + 'y': 0, + 'z': 0.0, + 'radius': 0.001 + }, + { + 'id': 'behind', + 'x': 0, + 'y': 0, + 'z': 0.2, + 'radius': 0.3 + }, + { + 'id': 'torso', + 'x': 0, + 'y': 0, + 'z': 0.0, + 'radius': 0.4, + 'items': [ + { + 'id': 'bd', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'bds', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'ch', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.03, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'sh', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.04, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'lg', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.02, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ss', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.04, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'cp', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.045, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'wa', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.05, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'cc', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.06, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ca', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.07, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'leftitem', + 'x': 0, + 'y': 0, + 'z': -0.29, + 'radius': 0.3, + 'items': [ + { + 'id': 'li', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'rightitem', + 'x': 0, + 'y': 0, + 'z': -0.29, + 'radius': 0.3, + 'items': [ + { + 'id': 'ri', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'leftarm', + 'x': -1, + 'y': 0, + 'z': -0.51, + 'radius': 0.5, + 'items': [ + { + 'id': 'lh', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'lhs', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ls', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.02, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'lc', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.025, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'rightarm', + 'x': 1, + 'y': 0, + 'z': -0.51, + 'radius': 0.5, + 'items': [ + { + 'id': 'rh', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'rhs', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'rs', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.02, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'rc', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.025, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'head', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.5, + 'items': [ + { + 'id': 'hd', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'fc', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.02, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ey', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.03, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'hr', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.04, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'hrb', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.05, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'fa', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.06, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ea', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.07, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ha', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.08, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'he', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.09, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + } + ] + }, + { + 'id': 'horizontal', + 'bodyParts': [ + { + 'id': 'torso', + 'x': 0, + 'y': 0, + 'z': 0.0, + 'radius': 0.4, + 'items': [ + { + 'id': 'bd', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'bds', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'ch', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.02, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'cp', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.025, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'sh', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.04, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'lg', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.03, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ss', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.03, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'wa', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.05, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'cc', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.06, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ca', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.07, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'leftitem', + 'x': 0, + 'y': 0, + 'z': -0.29, + 'radius': 0.3, + 'items': [ + { + 'id': 'li', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'rightitem', + 'x': 0, + 'y': 0, + 'z': -0.29, + 'radius': 0.3, + 'items': [ + { + 'id': 'ri', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'leftarm', + 'x': -1, + 'y': 0, + 'z': -0.51, + 'radius': 0.6, + 'items': [ + { + 'id': 'lh', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'lhs', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ls', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.02, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'lc', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.025, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'rightarm', + 'x': 1, + 'y': 0, + 'z': -0.51, + 'radius': 0.6, + 'items': [ + { + 'id': 'rh', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'rhs', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'rs', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.02, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'rc', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.025, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'head', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.5, + 'items': [ + { + 'id': 'hd', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'fc', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.02, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ey', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.03, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'hr', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.04, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'hrb', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.05, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'fa', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.06, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ea', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.07, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ha', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.08, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'he', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.09, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + } + ] + }, + { + 'id': 'swhorizontal', + 'bodyParts': [ + { + 'id': 'torso', + 'x': 0, + 'y': 0, + 'z': 0.0, + 'radius': 0.4, + 'items': [ + { + 'id': 'bd', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'bds', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'ch', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.02, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'cp', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.025, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'sh', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.04, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'lg', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.03, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ss', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.03, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'wa', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.05, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'cc', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.06, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ca', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.07, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'leftitem', + 'x': 0, + 'y': 0, + 'z': -0.29, + 'radius': 0.3, + 'items': [ + { + 'id': 'li', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'rightitem', + 'x': 0, + 'y': 0, + 'z': -0.29, + 'radius': 0.3, + 'items': [ + { + 'id': 'ri', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'leftarm', + 'x': -1, + 'y': 0, + 'z': -0.51, + 'radius': 0.6, + 'items': [ + { + 'id': 'lh', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'lhs', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ls', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.02, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'lc', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.025, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'rightarm', + 'x': 1, + 'y': 0, + 'z': -0.51, + 'radius': 0.6, + 'items': [ + { + 'id': 'rh', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'rhs', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'rs', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.02, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'rc', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.025, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'head', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.5, + 'items': [ + { + 'id': 'hd', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'fc', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.02, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ey', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.03, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'hr', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.04, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'hrb', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.05, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'fa', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.06, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ea', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.07, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ha', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.08, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'he', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.09, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + } + ] + }, + { + 'id': 'swim', + 'bodyParts': [ + { + 'id': 'torso', + 'x': 0, + 'y': 0, + 'z': 0.0, + 'radius': 0.4, + 'items': [ + { + 'id': 'bds', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'ss', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.03, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + }, + { + 'id': 'head', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.5, + 'items': [ + { + 'id': 'hd', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.01, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'fc', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.02, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ey', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.03, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'hr', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.04, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'hrb', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.05, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': true + }, + { + 'id': 'fa', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.06, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ea', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.07, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'ha', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.08, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + }, + { + 'id': 'he', + 'x': 0, + 'y': 0, + 'z': 0, + 'radius': 0.09, + 'nx': 0, + 'ny': 0, + 'nz': -1, + 'double': false + } + ] + } + ] + } + ] + } +}; diff --git a/packages/avatar/src/data/HabboAvatarPartSets.ts b/packages/avatar/src/data/HabboAvatarPartSets.ts new file mode 100644 index 0000000..1bd4750 --- /dev/null +++ b/packages/avatar/src/data/HabboAvatarPartSets.ts @@ -0,0 +1,418 @@ +export const HabboAvatarPartSets = { + 'partSets': { + 'partSet': [ + { + 'setType': 'ri', + 'flippedSetType': 'ri' + }, + { + 'setType': 'ri', + 'flippedSetType': 'ri' + }, + { + 'setType': 'rh', + 'flippedSetType': 'lh' + }, + { + 'setType': 'rhs', + 'flippedSetType': 'lhs' + }, + { + 'setType': 'rs', + 'swim': '0', + 'flippedSetType': 'ls' + }, + { + 'setType': 'rc', + 'flippedSetType': 'lc' + }, + { + 'setType': 'bd' + }, + { + 'setType': 'bds' + }, + { + 'setType': 'ss' + }, + { + 'setType': 'sh' + }, + { + 'setType': 'lg' + }, + { + 'setType': 'ch' + }, + { + 'setType': 'cp' + }, + { + 'setType': 'cc' + }, + { + 'setType': 'hd' + }, + { + 'setType': 'fc' + }, + { + 'setType': 'ey' + }, + { + 'setType': 'hr' + }, + { + 'setType': 'hrb', + 'removeSetType': 'hr' + }, + { + 'setType': 'li', + 'flippedSetType': 'li' + }, + { + 'setType': 'lh', + 'flippedSetType': 'rh' + }, + { + 'setType': 'lhs', + 'flippedSetType': 'rhs' + }, + { + 'setType': 'ls', + 'flippedSetType': 'rs' + }, + { + 'setType': 'lc', + 'flippedSetType': 'rc' + }, + { + 'setType': 'wa' + }, + { + 'setType': 'ea' + }, + { + 'setType': 'ca' + }, + { + 'setType': 'fa' + }, + { + 'setType': 'ha' + }, + { + 'setType': 'he' + } + ], + 'activePartSets': [ + { + 'id': 'figure', + 'activeParts': [ + { + 'setType': 'rh' + }, + { + 'setType': 'rh' + }, + { + 'setType': 'rhs' + }, + { + 'setType': 'rs' + }, + { + 'setType': 'rc' + }, + { + 'setType': 'bd' + }, + { + 'setType': 'bds' + }, + { + 'setType': 'ss' + }, + { + 'setType': 'sh' + }, + { + 'setType': 'lg' + }, + { + 'setType': 'ch' + }, + { + 'setType': 'cp' + }, + { + 'setType': 'cc' + }, + { + 'setType': 'wa' + }, + { + 'setType': 'hd' + }, + { + 'setType': 'fc' + }, + { + 'setType': 'ey' + }, + { + 'setType': 'hr' + }, + { + 'setType': 'hrb' + }, + { + 'setType': 'lh' + }, + { + 'setType': 'lhs' + }, + { + 'setType': 'ls' + }, + { + 'setType': 'lc' + }, + { + 'setType': 'ea' + }, + { + 'setType': 'ca' + }, + { + 'setType': 'fa' + }, + { + 'setType': 'ha' + }, + { + 'setType': 'he' + } + ] + }, + { + 'id': 'head', + 'activeParts': [ + { + 'setType': 'hd' + }, + { + 'setType': 'fc' + }, + { + 'setType': 'ey' + }, + { + 'setType': 'hr' + }, + { + 'setType': 'hrb' + }, + { + 'setType': 'ea' + }, + { + 'setType': 'fa' + }, + { + 'setType': 'ha' + }, + { + 'setType': 'he' + } + ] + }, + { + 'id': 'speak', + 'activeParts': [ + { + 'setType': 'hd' + }, + { + 'setType': 'hr' + }, + { + 'setType': 'hrb' + }, + { + 'setType': 'fc' + }, + { + 'setType': 'fa' + }, + { + 'setType': 'ha' + } + ] + }, + { + 'id': 'gesture', + 'activeParts': [ + { + 'setType': 'ey' + }, + { + 'setType': 'fc' + } + ] + }, + { + 'id': 'eye', + 'activeParts': [ + { + 'setType': 'ey' + } + ] + }, + { + 'id': 'handRight', + 'activeParts': [ + { + 'setType': 'rh' + }, + { + 'setType': 'rhs' + }, + { + 'setType': 'rs' + }, + { + 'setType': 'rc' + }, + { + 'setType': 'ri' + } + ] + }, + { + 'id': 'handRightAndHead', + 'activeParts': [ + { + 'setType': 'rh' + }, + { + 'setType': 'rhs' + }, + { + 'setType': 'rs' + }, + { + 'setType': 'rc' + }, + { + 'setType': 'ri' + }, + { + 'setType': 'ey' + }, + { + 'setType': 'fc' + }, + { + 'setType': 'hd' + } + ] + }, + { + 'id': 'handLeft', + 'activeParts': [ + { + 'setType': 'lh' + }, + { + 'setType': 'lhs' + }, + { + 'setType': 'ls' + }, + { + 'setType': 'lc' + }, + { + 'setType': 'li' + } + ] + }, + { + 'id': 'walk', + 'activeParts': [ + { + 'setType': 'bd' + }, + { + 'setType': 'bds' + }, + { + 'setType': 'ss' + }, + { + 'setType': 'lg' + }, + { + 'setType': 'lh' + }, + { + 'setType': 'lhs' + }, + { + 'setType': 'rh' + }, + { + 'setType': 'rhs' + }, + { + 'setType': 'ls' + }, + { + 'setType': 'lc' + }, + { + 'setType': 'rs' + }, + { + 'setType': 'rc' + }, + { + 'setType': 'sh' + } + ] + }, + { + 'id': 'sit', + 'activeParts': [ + { + 'setType': 'bd' + }, + { + 'setType': 'bds' + }, + { + 'setType': 'ss' + }, + { + 'setType': 'lg' + }, + { + 'setType': 'sh' + }, + { + 'setType': 'cc' + } + ] + }, + { + 'id': 'itemRight', + 'activeParts': [ + { + 'setType': 'ri' + } + ] + } + ] + } +}; diff --git a/packages/avatar/src/geometry/AvatarModelGeometry.ts b/packages/avatar/src/geometry/AvatarModelGeometry.ts new file mode 100644 index 0000000..821e7f7 --- /dev/null +++ b/packages/avatar/src/geometry/AvatarModelGeometry.ts @@ -0,0 +1,287 @@ +import { IAvatarImage } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; +import { Matrix4x4 } from '@nitrots/utils/src/Matrix4x4'; +import { AvatarCanvas } from '../structure'; +import { AvatarSet } from './AvatarSet'; +import { GeometryBodyPart } from './GeometryBodyPart'; + +export class AvatarModelGeometry +{ + private _camera: Vector3d; + private _avatarSet: AvatarSet; + private _geometryTypes: Map>; + private _itemIdToBodyPartMap: Map>; + private _transformation: Matrix4x4; + private _canvases: Map>; + + constructor(k: any) + { + this._camera = new Vector3d(0, 0, 10); + this._avatarSet = new AvatarSet(k.avatarSets[0]); + this._geometryTypes = new Map(); + this._itemIdToBodyPartMap = new Map(); + this._transformation = new Matrix4x4(); + this._canvases = new Map(); + + const camera = k.camera; + + if(camera) + { + this._camera.x = parseFloat(camera.x); + this._camera.y = parseFloat(camera.y); + this._camera.z = parseFloat(camera.z); + } + + if(k.canvases && (k.canvases.length > 0)) + { + for(const canvas of k.canvases) + { + if(!canvas) continue; + + const scale = canvas.scale; + const geometries = new Map(); + + if(canvas.geometries && (canvas.geometries.length > 0)) + { + for(const geometry of canvas.geometries) + { + if(!geometry) continue; + + const avatarCanvas = new AvatarCanvas(geometry, scale); + + geometries.set(avatarCanvas.id, avatarCanvas); + } + } + + this._canvases.set(scale, geometries); + } + } + + if(k.types && (k.types.length > 0)) + { + for(const type of k.types) + { + if(!type) continue; + + const bodyParts: Map = new Map(); + const itemIds: Map = new Map(); + + if(type.bodyParts && (type.bodyParts.length > 0)) + { + for(const bodyPart of type.bodyParts) + { + if(!bodyPart) continue; + + const geometryBodyPart = new GeometryBodyPart(bodyPart); + + bodyParts.set(geometryBodyPart.id, geometryBodyPart); + + for(const part of geometryBodyPart.getPartIds(null)) + { + itemIds.set(part, geometryBodyPart); + } + } + } + + this._geometryTypes.set(type.id, bodyParts); + this._itemIdToBodyPartMap.set(type.id, itemIds); + } + } + } + + public removeDynamicItems(k: IAvatarImage): void + { + for(const geometry of this._geometryTypes.values()) + { + if(!geometry) continue; + + for(const part of geometry.values()) + { + if(!part) continue; + + part.removeDynamicParts(k); + } + } + } + + public getBodyPartIdsInAvatarSet(k: string): string[] + { + const avatarSet = this._avatarSet.findAvatarSet(k); + + if(!avatarSet) return []; + + return avatarSet.getBodyParts(); + } + + public isMainAvatarSet(k: string): boolean + { + const avatarSet = this._avatarSet.findAvatarSet(k); + + if(!avatarSet) return false; + + return avatarSet.isMain; + } + + public getCanvas(k: string, _arg_2: string): AvatarCanvas + { + const canvas = this._canvases.get(k); + + if(!canvas) return null; + + return (canvas.get(_arg_2) || null); + } + + private typeExists(k: string): boolean + { + const existing = this._geometryTypes.get(k); + + if(existing) return true; + + return false; + } + + private hasBodyPart(k: string, _arg_2: string): boolean + { + if(this.typeExists(k)) + { + const existing = this._geometryTypes.get(k); + + if(existing && existing.get(_arg_2)) return true; + } + + return false; + } + + private getBodyPartIDs(k: string): string[] + { + const parts = this.getBodyPartsOfType(k); + + const types = []; + + if(parts) + { + for(const part of parts.values()) + { + if(!part) continue; + + types.push(part.id); + } + } + + return types; + } + + private getBodyPartsOfType(k: string): Map + { + if(this.typeExists(k)) return this._geometryTypes.get(k); + + return new Map(); + } + + public getBodyPart(k: string, _arg_2: string): GeometryBodyPart + { + return (this.getBodyPartsOfType(k).get(_arg_2) || null); + } + + public getBodyPartOfItem(k: string, _arg_2: string, _arg_3: IAvatarImage): GeometryBodyPart + { + const itemIds = this._itemIdToBodyPartMap.get(k); + + if(itemIds) + { + const part = itemIds.get(_arg_2); + + if(part) return part; + + const parts = this.getBodyPartsOfType(k); + + if(parts) + { + for(const part of parts.values()) + { + if(!part) continue; + + if(part.hasPart(_arg_2, _arg_3)) return part; + } + } + } + + return null; + } + + private getBodyPartsInAvatarSet(k: Map, _arg_2: string): GeometryBodyPart[] + { + const parts = this.getBodyPartIdsInAvatarSet(_arg_2); + const geometryParts = []; + + for(const part of parts) + { + if(!part) continue; + + const bodyPart = k.get(part); + + if(bodyPart) + { + geometryParts.push(bodyPart); + } + } + + return geometryParts; + } + + public getBodyPartsAtAngle(k: string, _arg_2: number, _arg_3: string): string[] + { + if(!_arg_3) return []; + + const geometryParts = this.getBodyPartsOfType(_arg_3); + const parts = this.getBodyPartsInAvatarSet(geometryParts, k); + const sets: [number, GeometryBodyPart][] = []; + const ids: string[] = []; + + this._transformation = Matrix4x4.getYRotationMatrix(_arg_2); + + for(const part of parts.values()) + { + if(!part) continue; + + part.applyTransform(this._transformation); + + sets.push([part.getDistance(this._camera), part]); + } + + sets.sort((a, b) => + { + const partA = a[0]; + const partB = b[0]; + + if(partA < partB) return -1; + + if(partA > partB) return 1; + + return 0; + }); + + for(const set of sets) + { + if(!set) continue; + + ids.push(set[1].id); + } + + return ids; + } + + public getParts(k: string, _arg_2: string, _arg_3: number, _arg_4: any[], _arg_5: IAvatarImage): string[] + { + if(this.hasBodyPart(k, _arg_2)) + { + const part = this.getBodyPartsOfType(k).get(_arg_2); + + this._transformation = Matrix4x4.getYRotationMatrix(_arg_3); + + return part.getParts(this._transformation, this._camera, _arg_4, _arg_5); + } + + return []; + } +} diff --git a/packages/avatar/src/geometry/AvatarSet.ts b/packages/avatar/src/geometry/AvatarSet.ts new file mode 100644 index 0000000..2dee804 --- /dev/null +++ b/packages/avatar/src/geometry/AvatarSet.ts @@ -0,0 +1,92 @@ +export class AvatarSet +{ + private _id: string; + private _isMain: boolean; + private _avatarSets: Map; + private _bodyParts: string[]; + private _allBodyParts: string[]; + + constructor(k: any) + { + this._id = k.id; + this._isMain = k.main || false; + this._avatarSets = new Map(); + this._bodyParts = []; + this._allBodyParts = []; + + if(k.avatarSets && (k.avatarSets.length > 0)) + { + for(const avatarSet of k.avatarSets) + { + if(!avatarSet) continue; + + const set = new AvatarSet(avatarSet); + + this._avatarSets.set(set.id, set); + } + } + + if(k.bodyParts && (k.bodyParts.length > 0)) + { + for(const bodyPart of k.bodyParts) + { + if(!bodyPart) continue; + + this._bodyParts.push(bodyPart.id); + } + } + + let bodyParts = this._bodyParts.concat(); + + for(const avatarSet of this._avatarSets.values()) + { + if(!avatarSet) continue; + + bodyParts = bodyParts.concat(avatarSet.getBodyParts()); + } + + this._allBodyParts = bodyParts; + } + + public findAvatarSet(k: string): AvatarSet + { + if(k === this._id) return this; + + for(const avatarSet of this._avatarSets.values()) + { + if(!avatarSet) continue; + + if(!avatarSet.findAvatarSet(k)) continue; + + return avatarSet; + } + + return null; + } + + public getBodyParts(): string[] + { + return this._allBodyParts.concat(); + } + + public get id(): string + { + return this._id; + } + + public get isMain(): boolean + { + if(this._isMain) return true; + + for(const avatarSet of this._avatarSets.values()) + { + if(!avatarSet) continue; + + if(!avatarSet.isMain) continue; + + return true; + } + + return false; + } +} diff --git a/packages/avatar/src/geometry/GeometryBodyPart.ts b/packages/avatar/src/geometry/GeometryBodyPart.ts new file mode 100644 index 0000000..4d61c93 --- /dev/null +++ b/packages/avatar/src/geometry/GeometryBodyPart.ts @@ -0,0 +1,192 @@ +import { IAvatarImage } from '@nitrots/api'; +import { Matrix4x4, Node3D, Vector3d } from '@nitrots/utils'; +import { GeometryItem } from './GeometryItem'; + +export class GeometryBodyPart extends Node3D +{ + private _id: string; + private _radius: number; + private _parts: Map; + private _dynamicParts: Map; + + constructor(k: any) + { + super(parseFloat(k.x), parseFloat(k.y), parseFloat(k.z)); + + this._id = k.id; + this._radius = parseFloat(k.radius); + this._parts = new Map(); + this._dynamicParts = new Map(); + + if(k.items && (k.items.length > 0)) + { + for(const item of k.items) + { + if(!item) continue; + + const geometryItem = new GeometryItem(item); + + this._parts.set(geometryItem.id, geometryItem); + } + } + } + + public getDynamicParts(k: IAvatarImage): GeometryItem[] + { + const existing = this._dynamicParts.get(k); + const parts: GeometryItem[] = []; + + if(existing) + { + for(const index in existing) + { + const item = existing[index]; + + if(!item) continue; + + parts.push(item); + } + } + + return parts; + } + + public getPartIds(k: IAvatarImage): string[] + { + const ids: string[] = []; + + for(const part of this._parts.values()) + { + if(!part) continue; + + ids.push(part.id); + } + + if(k) + { + const existing = this._dynamicParts.get(k); + + if(existing) + { + for(const index in existing) + { + const part = existing[index]; + + if(!part) continue; + + ids.push(part.id); + } + } + } + + return ids; + } + + public removeDynamicParts(k: IAvatarImage): boolean + { + this._dynamicParts.delete(k); + + return true; + } + + public addPart(k: any, _arg_2: IAvatarImage): boolean + { + if(this.hasPart(k.id, _arg_2)) return false; + + let existing = this._dynamicParts.get(_arg_2); + + if(!existing) + { + existing = {}; + + this._dynamicParts.set(_arg_2, existing); + } + + existing[k.id] = new GeometryItem(k, true); + + return true; + } + + public hasPart(k: string, _arg_2: IAvatarImage): boolean + { + let existingPart = (this._parts.get(k) || null); + + if(!existingPart && (this._dynamicParts.get(_arg_2) !== undefined)) + { + existingPart = (this._dynamicParts.get(_arg_2)[k] || null); + } + + return (existingPart !== null); + } + + public getParts(k: Matrix4x4, _arg_2: Vector3d, _arg_3: any[], _arg_4: IAvatarImage): string[] + { + const parts: [number, GeometryItem][] = []; + + for(const part of this._parts.values()) + { + if(!part) continue; + + part.applyTransform(k); + + parts.push([part.getDistance(_arg_2), part]); + } + + const existingDynamic = this._dynamicParts.get(_arg_4); + + if(existingDynamic) + { + for(const index in existingDynamic) + { + const part = existingDynamic[index]; + + if(!part) continue; + + part.applyTransform(k); + + parts.push([part.getDistance(_arg_2), part]); + } + } + + parts.sort((a, b) => + { + const partA = a[0]; + const partB = b[0]; + + if(partA < partB) return -1; + + if(partA > partB) return 1; + + return 0; + }); + + const partIds: string[] = []; + + for(const part of parts) + { + if(!part) continue; + + partIds.push(part[1].id); + } + + return partIds; + } + + public getDistance(k: Vector3d): number + { + const _local_2 = Math.abs(((k.z - this.transformedLocation.z) - this._radius)); + const _local_3 = Math.abs(((k.z - this.transformedLocation.z) + this._radius)); + + return Math.min(_local_2, _local_3); + } + + public get id(): string + { + return this._id; + } + + public get radius(): number + { + return this._radius; + } +} diff --git a/packages/avatar/src/geometry/GeometryItem.ts b/packages/avatar/src/geometry/GeometryItem.ts new file mode 100644 index 0000000..3aea172 --- /dev/null +++ b/packages/avatar/src/geometry/GeometryItem.ts @@ -0,0 +1,54 @@ +import { Node3D, Vector3d } from '@nitrots/utils'; + +export class GeometryItem extends Node3D +{ + private _id: string; + private _radius: number; + private _normal: Vector3d; + private _isDoubleSided: boolean; + private _isDynamic: boolean; + + constructor(k: any, _arg_2: boolean = false) + { + super(parseFloat(k.x), parseFloat(k.y), parseFloat(k.z)); + + this._id = k.id; + this._radius = parseFloat(k.radius); + this._normal = new Vector3d(parseFloat(k.nx), parseFloat(k.ny), parseFloat(k.nz)); + this._isDoubleSided = k.double || false; + this._isDynamic = _arg_2; + } + + public getDistance(k: Vector3d): number + { + const _local_2 = Math.abs(((k.z - this.transformedLocation.z) - this._radius)); + const _local_3 = Math.abs(((k.z - this.transformedLocation.z) + this._radius)); + + return Math.min(_local_2, _local_3); + } + + public get id(): string + { + return this._id; + } + + public get normal(): Vector3d + { + return this._normal; + } + + public get isDoubleSided(): boolean + { + return this._isDoubleSided; + } + + public toString(): string + { + return ((((this._id + ': ') + this.location) + ' - ') + this.transformedLocation); + } + + public get isDynamic(): boolean + { + return this._isDynamic; + } +} diff --git a/packages/avatar/src/geometry/index.ts b/packages/avatar/src/geometry/index.ts new file mode 100644 index 0000000..0eb1361 --- /dev/null +++ b/packages/avatar/src/geometry/index.ts @@ -0,0 +1,4 @@ +export * from './AvatarModelGeometry'; +export * from './AvatarSet'; +export * from './GeometryBodyPart'; +export * from './GeometryItem'; diff --git a/packages/avatar/src/index.ts b/packages/avatar/src/index.ts new file mode 100644 index 0000000..8a429ea --- /dev/null +++ b/packages/avatar/src/index.ts @@ -0,0 +1,25 @@ +export * from './AvatarAssetDownloadLibrary'; +export * from './AvatarAssetDownloadManager'; +export * from './AvatarFigureContainer'; +export * from './AvatarImage'; +export * from './AvatarImageBodyPartContainer'; +export * from './AvatarImagePartContainer'; +export * from './AvatarRenderManager'; +export * from './AvatarStructure'; +export * from './EffectAssetDownloadLibrary'; +export * from './EffectAssetDownloadManager'; +export * from './FigureDataContainer'; +export * from './GetAvatarRenderManager'; +export * from './PlaceHolderAvatarImage'; +export * from './actions'; +export * from './alias'; +export * from './animation'; +export * from './cache'; +export * from './data/HabboAvatarAnimations'; +export * from './data/HabboAvatarGeometry'; +export * from './data/HabboAvatarPartSets'; +export * from './geometry'; +export * from './structure'; +export * from './structure/animation'; +export * from './structure/figure'; +export * from './structure/parts'; diff --git a/packages/avatar/src/structure/AvatarAnimationData.ts b/packages/avatar/src/structure/AvatarAnimationData.ts new file mode 100644 index 0000000..fd78ccc --- /dev/null +++ b/packages/avatar/src/structure/AvatarAnimationData.ts @@ -0,0 +1,57 @@ +import { IActionDefinition, IFigureSetData } from '@nitrots/api'; +import { AnimationAction } from './animation'; + +export class AvatarAnimationData implements IFigureSetData +{ + private _actions: Map; + + constructor() + { + this._actions = new Map(); + } + + public parse(data: any): boolean + { + if(data && (data.length > 0)) + { + for(const animation of data) + { + if(!animation) continue; + + const newAnimation = new AnimationAction(animation); + + this._actions.set(newAnimation.id, newAnimation); + } + } + + return true; + } + + public appendJSON(k: any): boolean + { + for(const _local_2 of k.action) + { + this._actions.set(_local_2.id, new AnimationAction(_local_2)); + } + + return true; + } + + public getAction(action: IActionDefinition): AnimationAction + { + const existing = this._actions.get(action.id); + + if(!existing) return null; + + return existing; + } + + public getFrameCount(k: IActionDefinition): number + { + const animationAction = this.getAction(k); + + if(!animationAction) return 0; + + return animationAction.frameCount; + } +} diff --git a/packages/avatar/src/structure/AvatarCanvas.ts b/packages/avatar/src/structure/AvatarCanvas.ts new file mode 100644 index 0000000..69a01a6 --- /dev/null +++ b/packages/avatar/src/structure/AvatarCanvas.ts @@ -0,0 +1,47 @@ +import { AvatarScaleType } from '@nitrots/api'; +import { Point } from 'pixi.js'; + +export class AvatarCanvas +{ + private _id: string; + private _width: number; + private _height: number; + private _offset: Point; + private _regPoint: Point; + + constructor(k: any, _arg_2: string) + { + this._id = k.id; + this._width = k.width; + this._height = k.height; + this._offset = new Point(k.dx, k.dy); + + if(_arg_2 == AvatarScaleType.LARGE) this._regPoint = new Point(((this._width - 64) / 2), 0); + else this._regPoint = new Point(((this._width - 32) / 2), 0); + } + + public get width(): number + { + return this._width; + } + + public get height(): number + { + return this._height; + } + + public get offset(): Point + { + return this._offset; + } + + public get id(): string + { + return this._id; + } + + public get regPoint(): Point + { + return this._regPoint; + } +} diff --git a/packages/avatar/src/structure/FigureSetData.ts b/packages/avatar/src/structure/FigureSetData.ts new file mode 100644 index 0000000..ff7d218 --- /dev/null +++ b/packages/avatar/src/structure/FigureSetData.ts @@ -0,0 +1,129 @@ +import { IFigureData, IFigurePartSet, IFigureSetData, IPalette, ISetType, IStructureData } from '@nitrots/api'; +import { Palette, SetType } from './figure'; + +export class FigureSetData implements IFigureSetData, IStructureData +{ + private _palettes: Map; + private _setTypes: Map; + + constructor() + { + this._palettes = new Map(); + this._setTypes = new Map(); + } + + public dispose(): void + { + + } + + public parse(data: IFigureData): boolean + { + if(!data) return false; + + for(const palette of data.palettes) + { + const newPalette = new Palette(palette); + + if(!newPalette) continue; + + this._palettes.set(newPalette.id.toString(), newPalette); + } + + for(const set of data.setTypes) + { + const newSet = new SetType(set); + + if(!newSet) continue; + + this._setTypes.set(newSet.type, newSet); + } + + return true; + } + + public injectJSON(data: IFigureData): void + { + for(const setType of data.setTypes) + { + const existingSetType = this._setTypes.get(setType.type); + + if(existingSetType) existingSetType.cleanUp(setType); + else this._setTypes.set(setType.type, new SetType(setType)); + } + + this.appendJSON(data); + } + + public appendJSON(data: IFigureData): boolean + { + if(!data) return false; + + for(const palette of data.palettes) + { + const id = palette.id.toString(); + const existingPalette = this._palettes.get(id); + + if(!existingPalette) this._palettes.set(id, new Palette(palette)); + else existingPalette.append(palette); + } + + for(const setType of data.setTypes) + { + const type = setType.type; + const existingSetType = this._setTypes.get(type); + + if(!existingSetType) this._setTypes.set(type, new SetType(setType)); + else existingSetType.append(setType); + } + + return false; + } + + public getMandatorySetTypeIds(k: string, _arg_2: number): string[] + { + const types: string[] = []; + + for(const set of this._setTypes.values()) + { + if(!set || !set.isMandatory(k, _arg_2)) continue; + + types.push(set.type); + } + + return types; + } + + public getDefaultPartSet(type: string, gender: string): IFigurePartSet + { + const setType = this._setTypes.get(type); + + if(!setType) return null; + + return setType.getDefaultPartSet(gender); + } + + public getSetType(k: string): ISetType + { + return (this._setTypes.get(k) || null); + } + + public getPalette(k: number): IPalette + { + return (this._palettes.get(k.toString()) || null); + } + + public getFigurePartSet(k: number): IFigurePartSet + { + for(const set of this._setTypes.values()) + { + const partSet = set.getPartSet(k); + + if(!partSet) continue; + + return partSet; + } + + return null; + } +} diff --git a/packages/avatar/src/structure/PartSetsData.ts b/packages/avatar/src/structure/PartSetsData.ts new file mode 100644 index 0000000..6e80742 --- /dev/null +++ b/packages/avatar/src/structure/PartSetsData.ts @@ -0,0 +1,118 @@ +import { IActionDefinition, IFigureSetData } from '@nitrots/api'; +import { ActionDefinition } from '../actions'; +import { ActivePartSet, PartDefinition } from './parts'; + +export class PartSetsData implements IFigureSetData +{ + private _parts: Map; + private _activePartSets: Map; + + constructor() + { + this._parts = new Map(); + this._activePartSets = new Map(); + } + + public parse(data: any): boolean + { + if(data.partSet && (data.partSet.length > 0)) + { + for(const part of data.partSet) + { + if(!part) continue; + + this._parts.set(part.setType, new PartDefinition(part)); + } + } + + if(data.activePartSets && (data.activePartSets.length > 0)) + { + for(const activePart of data.activePartSets) + { + if(!activePart) continue; + + this._activePartSets.set(activePart.id, new ActivePartSet(activePart)); + } + } + + return true; + } + + public appendJSON(data: any): boolean + { + if(data.partSet && (data.partSet.length > 0)) + { + for(const part of data.partSet) + { + if(!part) continue; + + this._parts.set(part.setType, new PartDefinition(part)); + } + } + + if(data.activePartSets && (data.activePartSets.length > 0)) + { + for(const activePart of data.activePartSets) + { + if(!activePart) continue; + + this._activePartSets.set(activePart.id, new ActivePartSet(activePart)); + } + } + + return false; + } + + public getActiveParts(k: IActionDefinition): string[] + { + const activePartSet = this._activePartSets.get(k.activePartSet); + + if(!activePartSet) return []; + + return activePartSet.parts; + } + + public getPartDefinition(part: string): PartDefinition + { + const existing = this._parts.get(part); + + if(!existing) return null; + + return existing; + } + + public addPartDefinition(k: any): PartDefinition + { + const _local_2 = k.setType as string; + + let existing = this._parts.get(_local_2); + + if(!existing) + { + existing = new PartDefinition(k); + + this._parts.set(_local_2, existing); + } + + return existing; + } + + public getActivePartSet(k: ActionDefinition): ActivePartSet + { + const existing = this._activePartSets.get(k.activePartSet); + + if(!existing) return null; + + return existing; + } + + public get parts(): Map + { + return this._parts; + } + + public get activePartSets(): Map + { + return this._activePartSets; + } +} diff --git a/packages/avatar/src/structure/animation/AnimationAction.ts b/packages/avatar/src/structure/animation/AnimationAction.ts new file mode 100644 index 0000000..9e38ac1 --- /dev/null +++ b/packages/avatar/src/structure/animation/AnimationAction.ts @@ -0,0 +1,138 @@ +import { Point } from 'pixi.js'; +import { AnimationActionPart } from './AnimationActionPart'; + +export class AnimationAction +{ + public static DEFAULT_OFFSET: Point = new Point(0, 0); + + private _id: string; + private _actionParts: Map; + private _bodyPartOffsets: Map>>; + private _frameCount: number; + private _frameIndexes: number[]; + + constructor(data: any) + { + this._id = data.id; + this._actionParts = new Map(); + this._bodyPartOffsets = new Map(); + this._frameCount = 0; + this._frameIndexes = []; + + if(data.parts && (data.parts.length > 0)) + { + for(const part of data.parts) + { + if(!part) continue; + + const newPart = new AnimationActionPart(part); + + this._actionParts.set(part.setType, newPart); + + this._frameCount = Math.max(this._frameCount, newPart.frames.length); + } + } + + if(data.offsets && data.offsets.frames && (data.offsets.frames.length > 0)) + { + for(const frame of data.offsets.frames) + { + if(!frame) continue; + + const frameId = frame.id; + + this._frameCount = Math.max(this._frameCount, frameId); + + const directions: Map> = new Map(); + + this._bodyPartOffsets.set(frameId, directions); + + if(frame.directions && (frame.directions.length > 0)) + { + for(const direction of frame.directions) + { + if(!direction) continue; + + const directionId = direction.id; + + const offsets: Map = new Map(); + + directions.set(directionId, offsets); + + if(direction.bodyParts && (direction.bodyParts.length > 0)) + { + for(const part of direction.bodyParts) + { + if(!part) continue; + + const partId = part.id; + + let dx = 0; + let dy = 0; + + if(part.dx !== undefined) dx = part.dx; + if(part.dy !== undefined) dy = part.dy; + + offsets.set(partId, new Point(dx, dy)); + } + } + } + } + + this._frameIndexes.push(frameId); + + if(frame.repeats !== undefined) + { + let repeats = frame.repeats || 0; + + if(repeats > 1) while(--repeats > 0) this._frameIndexes.push(frameId); + } + } + } + } + + public getPart(type: string): AnimationActionPart + { + if(!type) return null; + + const existing = this._actionParts.get(type); + + if(!existing) return null; + + return existing; + } + + public getFrameBodyPartOffset(frameId: number, frameCount: number, partId: string): Point + { + const frameIndex = (frameCount % this._frameIndexes.length); + const frameNumber = this._frameIndexes[frameIndex]; + const offsets = this._bodyPartOffsets.get(frameNumber); + + if(!offsets) return AnimationAction.DEFAULT_OFFSET; + + const frameOffset = offsets.get(frameId); + + if(!frameOffset) return AnimationAction.DEFAULT_OFFSET; + + const offset = frameOffset.get(partId); + + if(!offset) return AnimationAction.DEFAULT_OFFSET; + + return offset; + } + + public get id(): string + { + return this._id; + } + + public get parts(): Map + { + return this._actionParts; + } + + public get frameCount(): number + { + return this._frameCount; + } +} diff --git a/packages/avatar/src/structure/animation/AnimationActionPart.ts b/packages/avatar/src/structure/animation/AnimationActionPart.ts new file mode 100644 index 0000000..ea16687 --- /dev/null +++ b/packages/avatar/src/structure/animation/AnimationActionPart.ts @@ -0,0 +1,30 @@ +import { AvatarAnimationFrame } from './AvatarAnimationFrame'; + +export class AnimationActionPart +{ + private _frames: AvatarAnimationFrame[]; + + constructor(data: any) + { + this._frames = []; + + if(data.frames && (data.frames.length > 0)) + { + for(const frame of data.frames) + { + if(!frame) continue; + + this._frames.push(new AvatarAnimationFrame(frame)); + + let repeats = frame.repeats || 0; + + if(repeats > 1) while(--repeats > 0) this._frames.push(this._frames[(this._frames.length - 1)]); + } + } + } + + public get frames(): AvatarAnimationFrame[] + { + return this._frames; + } +} diff --git a/packages/avatar/src/structure/animation/AvatarAnimationFrame.ts b/packages/avatar/src/structure/animation/AvatarAnimationFrame.ts new file mode 100644 index 0000000..3b9ec35 --- /dev/null +++ b/packages/avatar/src/structure/animation/AvatarAnimationFrame.ts @@ -0,0 +1,21 @@ +export class AvatarAnimationFrame +{ + private _number: number; + private _assetPartDefinition: string; + + constructor(data: any) + { + this._number = data.number; + this._assetPartDefinition = data.assetPartDefinition || null; + } + + public get number(): number + { + return this._number; + } + + public get assetPartDefinition(): string + { + return this._assetPartDefinition; + } +} diff --git a/packages/avatar/src/structure/animation/index.ts b/packages/avatar/src/structure/animation/index.ts new file mode 100644 index 0000000..98af842 --- /dev/null +++ b/packages/avatar/src/structure/animation/index.ts @@ -0,0 +1,3 @@ +export * from './AnimationAction'; +export * from './AnimationActionPart'; +export * from './AvatarAnimationFrame'; diff --git a/packages/avatar/src/structure/figure/FigurePart.ts b/packages/avatar/src/structure/figure/FigurePart.ts new file mode 100644 index 0000000..09c0a1c --- /dev/null +++ b/packages/avatar/src/structure/figure/FigurePart.ts @@ -0,0 +1,53 @@ +import { IFigureDataPart, IFigurePart } from '@nitrots/api'; + +export class FigurePart implements IFigurePart +{ + private _id: number; + private _type: string; + private _breed: number; + private _index: number; + private _colorLayerIndex: number; + private _paletteMapId: number; + + constructor(data: IFigureDataPart) + { + if(!data) throw new Error('invalid_data'); + + this._id = data.id; + this._type = data.type; + this._index = data.index; + this._colorLayerIndex = data.colorindex; + this._paletteMapId = -1; + this._breed = -1; + } + + public get id(): number + { + return this._id; + } + + public get type(): string + { + return this._type; + } + + public get breed(): number + { + return this._breed; + } + + public get index(): number + { + return this._index; + } + + public get colorLayerIndex(): number + { + return this._colorLayerIndex; + } + + public get paletteMap(): number + { + return this._paletteMapId; + } +} diff --git a/packages/avatar/src/structure/figure/FigurePartSet.ts b/packages/avatar/src/structure/figure/FigurePartSet.ts new file mode 100644 index 0000000..5cb2f79 --- /dev/null +++ b/packages/avatar/src/structure/figure/FigurePartSet.ts @@ -0,0 +1,134 @@ +import { IFigureDataSet, IFigurePart, IFigurePartSet } from '@nitrots/api'; +import { FigurePart } from './FigurePart'; + +export class FigurePartSet implements IFigurePartSet +{ + private _id: number; + private _type: string; + private _gender: string; + private _clubLevel: number; + private _isColorable: boolean; + private _isSelectable: boolean; + private _parts: IFigurePart[]; + private _hiddenLayers: string[]; + private _isPreSelectable: boolean; + private _isSellable: boolean; + + constructor(type: string, data: IFigureDataSet) + { + if(!type || !data) throw new Error('invalid_data'); + + this._id = data.id; + this._type = type; + this._gender = data.gender; + this._clubLevel = data.club; + this._isColorable = data.colorable; + this._isSelectable = data.selectable; + this._parts = []; + this._hiddenLayers = []; + this._isPreSelectable = data.preselectable; + this._isSellable = data.sellable; + + for(const part of data.parts) + { + const newPart = new FigurePart(part); + const partIndex = this.getPartIndex(newPart); + + if(partIndex !== -1) this._parts.splice(partIndex, 0, newPart); + else this._parts.push(newPart); + } + + if(data.hiddenLayers) + { + for(const hiddenLayer of data.hiddenLayers) this._hiddenLayers.push(hiddenLayer.partType); + } + } + + public dispose(): void + { + this._parts = null; + this._hiddenLayers = null; + } + + private getPartIndex(part: FigurePart): number + { + const totalParts = this._parts.length; + + if(!totalParts) return -1; + + for(let i = 0; i < totalParts; i++) + { + const existingPart = this._parts[i]; + + if(!existingPart) continue; + + if(existingPart.type !== part.type || existingPart.index > part.index) continue; + + return i; + } + + return -1; + } + + public getPart(k: string, _arg_2: number): IFigurePart + { + for(const part of this._parts) + { + if((part.type !== k) || (part.id !== _arg_2)) continue; + + return part; + } + + return null; + } + + public get id(): number + { + return this._id; + } + + public get type(): string + { + return this._type; + } + + public get gender(): string + { + return this._gender; + } + + public get clubLevel(): number + { + return this._clubLevel; + } + + public get isColorable(): boolean + { + return this._isColorable; + } + + public get isSelectable(): boolean + { + return this._isSelectable; + } + + public get parts(): IFigurePart[] + { + return this._parts; + } + + public get hiddenLayers(): string[] + { + return this._hiddenLayers; + } + + public get isPreSelectable(): boolean + { + return this._isPreSelectable; + } + + public get isSellable(): boolean + { + return this._isSellable; + } +} diff --git a/packages/avatar/src/structure/figure/Palette.ts b/packages/avatar/src/structure/figure/Palette.ts new file mode 100644 index 0000000..33fed5e --- /dev/null +++ b/packages/avatar/src/structure/figure/Palette.ts @@ -0,0 +1,46 @@ +import { IAdvancedMap, IFigureDataPalette, IPalette, IPartColor } from '@nitrots/api'; +import { AdvancedMap } from '@nitrots/utils'; +import { PartColor } from './PartColor'; + +export class Palette implements IPalette +{ + private _id: number; + private _colors: IAdvancedMap; + + constructor(data: IFigureDataPalette) + { + if(!data) throw new Error('invalid_data'); + + this._id = data.id; + this._colors = new AdvancedMap(); + + this.append(data); + } + + public append(data: IFigureDataPalette): void + { + for(const color of data.colors) + { + const newColor = new PartColor(color); + + this._colors.add(color.id.toString(), newColor); + } + } + + public getColor(id: number): IPartColor + { + if((id === undefined) || id < 0) return null; + + return (this._colors.getValue(id.toString()) || null); + } + + public get id(): number + { + return this._id; + } + + public get colors(): IAdvancedMap + { + return this._colors; + } +} diff --git a/packages/avatar/src/structure/figure/PartColor.ts b/packages/avatar/src/structure/figure/PartColor.ts new file mode 100644 index 0000000..af96476 --- /dev/null +++ b/packages/avatar/src/structure/figure/PartColor.ts @@ -0,0 +1,46 @@ +import { IFigureDataColor, IPartColor } from '@nitrots/api'; + +export class PartColor implements IPartColor +{ + private _id: number; + private _index: number; + private _clubLevel: number; + private _isSelectable: boolean; + private _rgb: number; + + constructor(data: IFigureDataColor) + { + if(!data) throw new Error('invalid_data'); + + this._id = data.id; + this._index = data.index; + this._clubLevel = (data.club || 0); + this._isSelectable = data.selectable; + this._rgb = parseInt('0x' + data.hexCode, 16); + } + + public get id(): number + { + return this._id; + } + + public get index(): number + { + return this._index; + } + + public get clubLevel(): number + { + return this._clubLevel; + } + + public get isSelectable(): boolean + { + return this._isSelectable; + } + + public get rgb(): number + { + return this._rgb; + } +} diff --git a/packages/avatar/src/structure/figure/SetType.ts b/packages/avatar/src/structure/figure/SetType.ts new file mode 100644 index 0000000..e24dfad --- /dev/null +++ b/packages/avatar/src/structure/figure/SetType.ts @@ -0,0 +1,104 @@ +import { IAdvancedMap, IFigureDataSetType, IFigurePartSet, ISetType } from '@nitrots/api'; +import { AdvancedMap } from '@nitrots/utils'; +import { FigurePartSet } from './FigurePartSet'; + +export class SetType implements ISetType +{ + private _type: string; + private _paletteId: number; + private _isMandatory: { [index: string]: boolean[] }; + private _partSets: IAdvancedMap; + + constructor(data: IFigureDataSetType) + { + if(!data) throw new Error('invalid_data'); + + this._type = data.type; + this._paletteId = data.paletteId; + this._isMandatory = {}; + this._isMandatory['F'] = [data.mandatory_f_0, data.mandatory_f_1]; + this._isMandatory['M'] = [data.mandatory_m_0, data.mandatory_m_1]; + this._partSets = new AdvancedMap(); + + this.append(data); + } + + public dispose(): void + { + for(const set of this._partSets.getValues()) + { + const partSet = set as FigurePartSet; + + partSet.dispose(); + } + + this._partSets = null; + } + + public cleanUp(data: IFigureDataSetType): void + { + for(const set of data.sets) + { + const setId = set.id.toString(); + const partSet = (this._partSets.getValue(setId) as FigurePartSet); + + if(partSet) + { + partSet.dispose(); + + this._partSets.remove(setId); + } + } + } + + public append(setType: IFigureDataSetType): void + { + if(!setType || !setType.sets) return; + + for(const set of setType.sets) this._partSets.add(set.id.toString(), new FigurePartSet(this._type, set)); + } + + public getDefaultPartSet(gender: string): IFigurePartSet + { + for(const set of this._partSets.getValues()) + { + if(!set) continue; + + if((set.clubLevel === 0) && ((set.gender === gender) || (set.gender === 'U'))) return set; + } + + return null; + } + + public getPartSet(k: number): IFigurePartSet + { + return this._partSets.getValue(k.toString()); + } + + public get type(): string + { + return this._type; + } + + public get paletteID(): number + { + return this._paletteId; + } + + public isMandatory(k: string, _arg_2: number): boolean + { + return this._isMandatory[k.toUpperCase()][Math.min(_arg_2, 1)]; + } + + public optionalFromClubLevel(k: string): number + { + const _local_2 = this._isMandatory[k.toUpperCase()]; + + return _local_2.indexOf(false); + } + + public get partSets(): IAdvancedMap + { + return this._partSets; + } +} diff --git a/packages/avatar/src/structure/figure/index.ts b/packages/avatar/src/structure/figure/index.ts new file mode 100644 index 0000000..1b9ebc3 --- /dev/null +++ b/packages/avatar/src/structure/figure/index.ts @@ -0,0 +1,5 @@ +export * from './FigurePart'; +export * from './FigurePartSet'; +export * from './Palette'; +export * from './PartColor'; +export * from './SetType'; diff --git a/packages/avatar/src/structure/index.ts b/packages/avatar/src/structure/index.ts new file mode 100644 index 0000000..9d2754f --- /dev/null +++ b/packages/avatar/src/structure/index.ts @@ -0,0 +1,7 @@ +export * from './AvatarAnimationData'; +export * from './AvatarCanvas'; +export * from './FigureSetData'; +export * from './PartSetsData'; +export * from './animation'; +export * from './figure'; +export * from './parts'; diff --git a/packages/avatar/src/structure/parts/ActivePartSet.ts b/packages/avatar/src/structure/parts/ActivePartSet.ts new file mode 100644 index 0000000..4244308 --- /dev/null +++ b/packages/avatar/src/structure/parts/ActivePartSet.ts @@ -0,0 +1,26 @@ +export class ActivePartSet +{ + private _id: string; + private _parts: string[]; + + constructor(data: any) + { + this._id = data.id; + this._parts = []; + + if(data.activeParts && (data.activeParts.length > 0)) + { + for(const part of data.activeParts) + { + if(!part) continue; + + this._parts.push(part.setType); + } + } + } + + public get parts(): string[] + { + return this._parts; + } +} diff --git a/packages/avatar/src/structure/parts/PartDefinition.ts b/packages/avatar/src/structure/parts/PartDefinition.ts new file mode 100644 index 0000000..19caa8c --- /dev/null +++ b/packages/avatar/src/structure/parts/PartDefinition.ts @@ -0,0 +1,64 @@ +export class PartDefinition +{ + private _setType: string; + private _flippedSetType: string; + private _removeSetType: string; + private _appendToFigure: boolean; + private _staticId: number; + + constructor(data: any) + { + if(!data) throw new Error('invalid_data'); + + this._setType = data.setType; + this._flippedSetType = data.flippedSetType || null; + this._removeSetType = data.removeSetType || null; + this._appendToFigure = false; + this._staticId = -1; + } + + public hasStaticId(): boolean + { + return this._staticId >= 0; + } + + public get staticId(): number + { + return this._staticId; + } + + public set staticId(k: number) + { + this._staticId = k; + } + + public get setType(): string + { + return this._setType; + } + + public get flippedSetType(): string + { + return this._flippedSetType; + } + + public set flippedSetType(type: string) + { + this._flippedSetType = type; + } + + public get removeSetType(): string + { + return this._removeSetType; + } + + public get appendToFigure(): boolean + { + return this._appendToFigure; + } + + public set appendToFigure(flag: boolean) + { + this._appendToFigure = flag; + } +} diff --git a/packages/avatar/src/structure/parts/index.ts b/packages/avatar/src/structure/parts/index.ts new file mode 100644 index 0000000..31faf62 --- /dev/null +++ b/packages/avatar/src/structure/parts/index.ts @@ -0,0 +1,2 @@ +export * from './ActivePartSet'; +export * from './PartDefinition'; diff --git a/packages/avatar/tsconfig.json b/packages/avatar/tsconfig.json new file mode 100644 index 0000000..5e8757d --- /dev/null +++ b/packages/avatar/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./src", + "outDir": "./dist", + "sourceMap": false, + "declaration": true, + "experimentalDecorators": true, + "moduleResolution": "Node", + "esModuleInterop": true, + "importHelpers": true, + "isolatedModules": true, + "resolveJsonModule": true, + "downlevelIteration": true, + "allowSyntheticDefaultImports": true, + "allowJs": true, + "skipLibCheck": true, + "noEmit": true, + "strict": false, + "strictNullChecks": false, + "target": "ES6", + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "module": "ES6" + }, + "include": [ + "src" ] +} diff --git a/packages/camera/.eslintrc.json b/packages/camera/.eslintrc.json new file mode 100644 index 0000000..ad92133 --- /dev/null +++ b/packages/camera/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": [ "@nitrots/eslint-config" ] +} diff --git a/packages/camera/.gitignore b/packages/camera/.gitignore new file mode 100644 index 0000000..1413af9 --- /dev/null +++ b/packages/camera/.gitignore @@ -0,0 +1,51 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings +.git + +# System Files +.DS_Store +Thumbs.db + +*.zip +*.as +*.bin diff --git a/packages/camera/index.ts b/packages/camera/index.ts new file mode 100644 index 0000000..8420b10 --- /dev/null +++ b/packages/camera/index.ts @@ -0,0 +1 @@ +export * from './src'; diff --git a/packages/camera/package.json b/packages/camera/package.json new file mode 100644 index 0000000..1172279 --- /dev/null +++ b/packages/camera/package.json @@ -0,0 +1,23 @@ +{ + "name": "@nitrots/camera", + "description": "Nitro camera module", + "version": "1.0.0", + "type": "module", + "license": "GPL-3.0", + "scripts": { + "compile": "tsc --project ./tsconfig.json --noEmit false", + "eslint": "eslint ./src --fix" + }, + "main": "./index", + "dependencies": { + "@nitrots/api": "1.0.0", + "@nitrots/configuration": "1.0.0", + "@nitrots/eslint-config": "1.0.0", + "@nitrots/events": "1.0.0", + "@nitrots/utils": "1.0.0", + "pixi.js": "^8.0.4" + }, + "devDependencies": { + "typescript": "~5.4.2" + } +} diff --git a/packages/camera/src/GetRoomCameraWidgetManager.ts b/packages/camera/src/GetRoomCameraWidgetManager.ts new file mode 100644 index 0000000..0f6f44f --- /dev/null +++ b/packages/camera/src/GetRoomCameraWidgetManager.ts @@ -0,0 +1,5 @@ +import { RoomCameraWidgetManager } from './RoomCameraWidgetManager'; + +const roomCameraWidgetManager = new RoomCameraWidgetManager(); + +export const GetRoomCameraWidgetManager = () => roomCameraWidgetManager; diff --git a/packages/camera/src/RoomCameraWidgetEffect.ts b/packages/camera/src/RoomCameraWidgetEffect.ts new file mode 100644 index 0000000..f33e61b --- /dev/null +++ b/packages/camera/src/RoomCameraWidgetEffect.ts @@ -0,0 +1,60 @@ +import { IRoomCameraWidgetEffect } from '@nitrots/api'; +import { BLEND_MODES, ColorMatrix, Texture } from 'pixi.js'; + +export class RoomCameraWidgetEffect implements IRoomCameraWidgetEffect +{ + private _name: string; + private _minLevel: number = -1; + private _texture: Texture = null; + private _colorMatrix: ColorMatrix = null; + private _blendMode: BLEND_MODES = null; + + constructor(name: string, minLevel: number = -1, texture: Texture = null, colorMatrix: ColorMatrix = null, blendMode: BLEND_MODES = null) + { + this._name = name; + this._minLevel = minLevel; + this._texture = texture; + this._colorMatrix = colorMatrix; + this._blendMode = blendMode; + } + + public get name(): string + { + return this._name; + } + + public get texture(): Texture + { + return this._texture; + } + + public set texture(texture: Texture) + { + this._texture = texture; + } + + public get colorMatrix(): ColorMatrix + { + return this._colorMatrix; + } + + public set colorMatrix(colorMatrix: ColorMatrix) + { + this._colorMatrix = colorMatrix; + } + + public get blendMode(): BLEND_MODES + { + return this._blendMode; + } + + public set blendMode(blendMode: BLEND_MODES) + { + this._blendMode = blendMode; + } + + public get minLevel(): number + { + return this._minLevel; + } +} diff --git a/packages/camera/src/RoomCameraWidgetManager.ts b/packages/camera/src/RoomCameraWidgetManager.ts new file mode 100644 index 0000000..34ed50e --- /dev/null +++ b/packages/camera/src/RoomCameraWidgetManager.ts @@ -0,0 +1,103 @@ +import { IRoomCameraWidgetEffect, IRoomCameraWidgetManager, IRoomCameraWidgetSelectedEffect } from '@nitrots/api'; +import { GetAssetManager } from '@nitrots/assets'; +import { GetConfiguration } from '@nitrots/configuration'; +import { GetEventDispatcher, RoomCameraWidgetManagerEvent } from '@nitrots/events'; +import { TextureUtils } from '@nitrots/utils'; +import { BLEND_MODES, ColorMatrix, ColorMatrixFilter, Container, Sprite, Texture } from 'pixi.js'; +import { RoomCameraWidgetEffect } from './RoomCameraWidgetEffect'; + +export class RoomCameraWidgetManager implements IRoomCameraWidgetManager +{ + private _effects: Map; + private _isLoaded: boolean; + + constructor() + { + this._effects = new Map(); + this._isLoaded = false; + } + + public async init(): Promise + { + if(this._isLoaded) return; + + this._isLoaded = true; + + const imagesUrl = GetConfiguration().getValue('image.library.url') + 'Habbo-Stories/'; + const effects = GetConfiguration().getValue<{ name: string, colorMatrix?: ColorMatrix, minLevel: number, blendMode?: BLEND_MODES, enabled: boolean }[]>('camera.available.effects'); + + for(const effect of effects) + { + if(!effect.enabled) continue; + + const cameraEffect = new RoomCameraWidgetEffect(effect.name, effect.minLevel); + + if(effect.colorMatrix.length) + { + cameraEffect.colorMatrix = effect.colorMatrix; + } + else + { + const url = `${ imagesUrl }${ effect.name }.png`; + + await GetAssetManager().downloadAsset(url); + + cameraEffect.texture = GetAssetManager().getTexture(url); + cameraEffect.blendMode = effect.blendMode; + } + + this._effects.set(cameraEffect.name, cameraEffect); + } + + GetEventDispatcher().dispatchEvent(new RoomCameraWidgetManagerEvent(RoomCameraWidgetManagerEvent.INITIALIZED)); + } + + public async applyEffects(texture: Texture, selectedEffects: IRoomCameraWidgetSelectedEffect[], isZoomed: boolean): Promise + { + const container = new Container(); + const sprite = new Sprite(texture); + + container.addChild(sprite); + + if(isZoomed) sprite.scale.set(2); + + for(const selectedEffect of selectedEffects) + { + const effect = selectedEffect.effect; + + if(!effect) continue; + + if(effect.colorMatrix) + { + const filter = new ColorMatrixFilter(); + + filter.matrix = effect.colorMatrix; + filter.alpha = selectedEffect.alpha; + + if(!Array.isArray(sprite.filters)) sprite.filters = []; + + sprite.filters.push(filter); + } + else + { + const effectSprite = new Sprite(effect.texture); + effectSprite.alpha = selectedEffect.alpha; + effectSprite.blendMode = effect.blendMode; + + container.addChild(effectSprite); + } + } + + return await TextureUtils.generateImage(container); + } + + public get effects(): Map + { + return this._effects; + } + + public get isLoaded(): boolean + { + return this._isLoaded; + } +} diff --git a/packages/camera/src/RoomCameraWidgetSelectedEffect.ts b/packages/camera/src/RoomCameraWidgetSelectedEffect.ts new file mode 100644 index 0000000..c76ddeb --- /dev/null +++ b/packages/camera/src/RoomCameraWidgetSelectedEffect.ts @@ -0,0 +1,23 @@ +import { IRoomCameraWidgetEffect } from '@nitrots/api'; + +export class RoomCameraWidgetSelectedEffect +{ + private _effect: IRoomCameraWidgetEffect; + private _alpha: number; + + constructor(effect: IRoomCameraWidgetEffect, alpha: number) + { + this._effect = effect; + this._alpha = alpha; + } + + public get effect(): IRoomCameraWidgetEffect + { + return this._effect; + } + + public get alpha(): number + { + return this._alpha; + } +} diff --git a/packages/camera/src/index.ts b/packages/camera/src/index.ts new file mode 100644 index 0000000..a2f3069 --- /dev/null +++ b/packages/camera/src/index.ts @@ -0,0 +1,4 @@ +export * from './GetRoomCameraWidgetManager'; +export * from './RoomCameraWidgetEffect'; +export * from './RoomCameraWidgetManager'; +export * from './RoomCameraWidgetSelectedEffect'; diff --git a/packages/camera/tsconfig.json b/packages/camera/tsconfig.json new file mode 100644 index 0000000..5e8757d --- /dev/null +++ b/packages/camera/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./src", + "outDir": "./dist", + "sourceMap": false, + "declaration": true, + "experimentalDecorators": true, + "moduleResolution": "Node", + "esModuleInterop": true, + "importHelpers": true, + "isolatedModules": true, + "resolveJsonModule": true, + "downlevelIteration": true, + "allowSyntheticDefaultImports": true, + "allowJs": true, + "skipLibCheck": true, + "noEmit": true, + "strict": false, + "strictNullChecks": false, + "target": "ES6", + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "module": "ES6" + }, + "include": [ + "src" ] +} diff --git a/packages/communication/.eslintrc.json b/packages/communication/.eslintrc.json new file mode 100644 index 0000000..ad92133 --- /dev/null +++ b/packages/communication/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": [ "@nitrots/eslint-config" ] +} diff --git a/packages/communication/.gitignore b/packages/communication/.gitignore new file mode 100644 index 0000000..1413af9 --- /dev/null +++ b/packages/communication/.gitignore @@ -0,0 +1,51 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings +.git + +# System Files +.DS_Store +Thumbs.db + +*.zip +*.as +*.bin diff --git a/packages/communication/index.ts b/packages/communication/index.ts new file mode 100644 index 0000000..8420b10 --- /dev/null +++ b/packages/communication/index.ts @@ -0,0 +1 @@ +export * from './src'; diff --git a/packages/communication/package.json b/packages/communication/package.json new file mode 100644 index 0000000..a4de308 --- /dev/null +++ b/packages/communication/package.json @@ -0,0 +1,21 @@ +{ + "name": "@nitrots/communication", + "description": "Nitro communication module", + "version": "1.0.0", + "type": "module", + "license": "GPL-3.0", + "scripts": { + "compile": "tsc --project ./tsconfig.json --noEmit false", + "eslint": "eslint ./src --fix" + }, + "main": "./index", + "dependencies": { + "@nitrots/api": "1.0.0", + "@nitrots/eslint-config": "1.0.0", + "@nitrots/events": "1.0.0", + "@nitrots/utils": "1.0.0" + }, + "devDependencies": { + "typescript": "~5.4.2" + } +} diff --git a/packages/communication/src/CommunicationManager.ts b/packages/communication/src/CommunicationManager.ts new file mode 100644 index 0000000..2389d76 --- /dev/null +++ b/packages/communication/src/CommunicationManager.ts @@ -0,0 +1,97 @@ +import { ICommunicationManager, IConnection, IMessageConfiguration, IMessageEvent } from '@nitrots/api'; +import { GetConfiguration } from '@nitrots/configuration'; +import { GetEventDispatcher, NitroEventType } from '@nitrots/events'; +import { GetTickerTime } from '@nitrots/utils'; +import { NitroMessages } from './NitroMessages'; +import { SocketConnection } from './SocketConnection'; +import { AuthenticatedEvent, ClientHelloMessageComposer, ClientPingEvent, InfoRetrieveMessageComposer, PongMessageComposer, SSOTicketMessageComposer } from './messages'; + +export class CommunicationManager implements ICommunicationManager +{ + private _connection: IConnection = new SocketConnection(); + private _messages: IMessageConfiguration = new NitroMessages(); + + private _pongInterval: any = null; + + constructor() + { + this._connection.registerMessages(this._messages); + } + + public async init(): Promise + { + GetEventDispatcher().addEventListener(NitroEventType.SOCKET_CLOSED, () => + { + this.stopPong(); + }); + + return new Promise((resolve, reject) => + { + GetEventDispatcher().addEventListener(NitroEventType.SOCKET_OPENED, () => + { + if(GetConfiguration().getValue('system.pong.manually', false)) this.startPong(); + + this._connection.send(new ClientHelloMessageComposer(null, null, null, null)); + this._connection.send(new SSOTicketMessageComposer(GetConfiguration().getValue('sso.ticket', null), GetTickerTime())); + }); + + GetEventDispatcher().addEventListener(NitroEventType.SOCKET_ERROR, () => + { + reject(); + }); + + this._connection.addMessageEvent(new ClientPingEvent((event: ClientPingEvent) => this.sendPong())); + + this._connection.addMessageEvent(new AuthenticatedEvent((event: AuthenticatedEvent) => + { + this._connection.authenticated(); + + resolve(); + + event.connection.send(new InfoRetrieveMessageComposer()); + })); + + this._connection.init(GetConfiguration().getValue('socket.url')); + }); + } + + protected startPong(): void + { + if(this._pongInterval) this.stopPong(); + + this._pongInterval = setInterval(() => this.sendPong(), GetConfiguration().getValue('system.pong.interval.ms', 20000)); + } + + protected stopPong(): void + { + if(!this._pongInterval) return; + + clearInterval(this._pongInterval); + + this._pongInterval = null; + } + + protected sendPong(): void + { + this._connection?.send(new PongMessageComposer()); + } + + public registerMessageEvent(event: IMessageEvent): IMessageEvent + { + if(this._connection) this._connection.addMessageEvent(event); + + return event; + } + + public removeMessageEvent(event: IMessageEvent): void + { + if(!this._connection) return; + + this._connection.removeMessageEvent(event); + } + + public get connection(): IConnection + { + return this._connection; + } +} diff --git a/packages/communication/src/GetCommunication.ts b/packages/communication/src/GetCommunication.ts new file mode 100644 index 0000000..e6a2eed --- /dev/null +++ b/packages/communication/src/GetCommunication.ts @@ -0,0 +1,5 @@ +import { CommunicationManager } from './CommunicationManager'; + +const communication = new CommunicationManager(); + +export const GetCommunication = () => communication; diff --git a/packages/communication/src/NitroMessages.ts b/packages/communication/src/NitroMessages.ts new file mode 100644 index 0000000..7b40517 --- /dev/null +++ b/packages/communication/src/NitroMessages.ts @@ -0,0 +1,1179 @@ +import { IMessageConfiguration } from '@nitrots/api'; +import { AcceptFriendMessageComposer, AcceptFriendResultEvent, AcceptGameInviteMessageComposer, AcceptQuestMessageComposer, AccountSafetyLockStatusChangeMessageEvent, AchievementEvent, AchievementNotificationMessageEvent, AchievementResolutionCompletedMessageEvent, AchievementResolutionProgressMessageEvent, AchievementResolutionsMessageEvent, AchievementsEvent, AchievementsScoreEvent, ActivateQuestMessageComposer, ActivityPointNotificationMessageEvent, AddFavouriteRoomMessageComposer, AddJukeboxDiskComposer, AddSpamWallPostItMessageComposer, ApplySnapshotMessageComposer, ApplyTonerComposer, ApproveAllMembershipRequestsMessageComposer, ApproveNameMessageComposer, ApproveNameMessageEvent, AuthenticatedEvent, AuthenticationMessageComposer, AvailabilityStatusMessageEvent, AvailabilityTimeMessageEvent, AvatarEffectActivatedComposer, AvatarEffectActivatedEvent, AvatarEffectAddedEvent, AvatarEffectExpiredEvent, AvatarEffectSelectedComposer, AvatarEffectSelectedEvent, AvatarEffectsEvent, BadgePointLimitsEvent, BadgeReceivedEvent, BadgesEvent, BannedUsersFromRoomEvent, BonusRareInfoMessageEvent, BotAddedToInventoryEvent, BotCommandConfigurationEvent, BotErrorEvent, BotForceOpenContextMenuEvent, BotInventoryMessageEvent, BotPlaceComposer, BotReceivedMessageEvent, BotRemoveComposer, BotRemovedFromInventoryEvent, BotSkillListUpdateEvent, BotSkillSaveComposer, BreedPetsMessageComposer, BuildersClubFurniCountMessageEvent, BuildersClubPlaceRoomItemMessageComposer, BuildersClubPlaceWallItemMessageComposer, BuildersClubQueryFurniCountMessageComposer, BuildersClubSubscriptionStatusMessageEvent, BundleDiscountRulesetMessageEvent, BuyMarketplaceOfferMessageComposer, BuyMarketplaceTokensMessageComposer, CallForHelpDisabledNotifyMessageEvent, CallForHelpFromForumMessageMessageComposer, CallForHelpFromForumThreadMessageComposer, CallForHelpFromIMMessageComposer, CallForHelpFromPhotoMessageComposer, CallForHelpFromSelfieMessageComposer, CallForHelpMessageComposer, CallForHelpPendingCallsDeletedMessageEvent, CallForHelpPendingCallsMessageEvent, CallForHelpReplyMessageEvent, CallForHelpResultMessageEvent, CameraPublishStatusMessageEvent, CameraPurchaseOKMessageEvent, CameraSnapshotMessageEvent, CameraStorageUrlMessageEvent, CampaignCalendarDataMessageEvent, CampaignCalendarDoorOpenedMessageEvent, CanCreateRoomEvent, CanCreateRoomEventEvent, CanCreateRoomMessageComposer, CancelEventMessageComposer, CancelMarketplaceOfferMessageComposer, CancelMysteryBoxWaitMessageEvent, CancelPetBreedingComposer, CancelQuestMessageComposer, CatalogGroupsComposer, CatalogPageExpirationEvent, CatalogPageMessageEvent, CatalogPageWithEarliestExpiryMessageEvent, CatalogPagesListEvent, CatalogPublishedMessageEvent, CategoriesWithVisitorCountEvent, CfhChatlogEvent, CfhSanctionMessageEvent, CfhTopicsInitEvent, ChangeEmailComposer, ChangeEmailResultEvent, ChangeQueueMessageComposer, ChangeUserNameMessageComposer, ChangeUserNameResultMessageEvent, ChatReviewGuideDecidesOnOfferMessageComposer, ChatReviewGuideDetachedMessageComposer, ChatReviewGuideVoteMessageComposer, ChatReviewSessionCreateMessageComposer, ChatReviewSessionDetachedMessageEvent, ChatReviewSessionOfferedToGuideMessageEvent, ChatReviewSessionResultsMessageEvent, ChatReviewSessionStartedMessageEvent, ChatReviewSessionVotingStatusMessageEvent, CheckUserNameMessageComposer, CheckUserNameResultMessageEvent, ClientHelloMessageComposer, ClientPingEvent, CloseIssueDefaultActionMessageComposer, CloseIssuesMessageComposer, ClubGiftInfoEvent, ClubGiftNotificationEvent, ClubGiftSelectedEvent, CommunityGoalEarnedPrizesMessageEvent, CommunityGoalHallOfFameMessageEvent, CommunityGoalProgressMessageEvent, CommunityGoalVoteMessageComposer, CommunityGoalVoteMessageEvent, CompetitionEntrySubmitResultEvent, CompetitionRoomsDataMessageEvent, CompetitionRoomsSearchMessageComposer, CompetitionStatusMessageEvent, CompetitionVotingInfoMessageEvent, CompleteDiffieHandshakeEvent, CompleteDiffieHandshakeMessageComposer, CompostPlantMessageComposer, ConcurrentUsersGoalProgressMessageEvent, ConfirmPetBreedingComposer, ConnectionErrorEvent, ControlYoutubeDisplayPlaybackMessageComposer, ConvertGlobalRoomIdMessageComposer, ConvertedRoomIdEvent, CraftComposer, CraftSecretComposer, CraftableProductsEvent, CraftingRecipeEvent, CraftingRecipesAvailableEvent, CraftingResultEvent, CreateFlatMessageComposer, CurrentTimingCodeMessageEvent, CustomUserNotificationMessageEvent, DeclineFriendMessageComposer, DefaultSanctionMessageComposer, DeleteFavouriteRoomMessageComposer, DeletePendingCallsForHelpMessageComposer, DesktopViewComposer, DesktopViewEvent, DiceValueMessageEvent, DirectSMSClubBuyAvailableMessageEvent, DisconnectMessageComposer, DisconnectReasonEvent, DoorbellMessageEvent, EditEventMessageComposer, ElementPointerMessageEvent, EmailStatusResultEvent, EpicPopupMessageEvent, ExtendRentOrBuyoutFurniMessageComposer, ExtendRentOrBuyoutStripItemMessageComposer, ExtendedProfileChangedMessageEvent, FavoriteMembershipUpdateMessageEvent, FavouriteChangedEvent, FavouritesEvent, FigureSetIdsMessageEvent, FigureUpdateEvent, FindFriendsProcessResultEvent, FindNewFriendsMessageComposer, FireworkChargeDataEvent, FlatAccessDeniedMessageEvent, FlatControllerAddedEvent, FlatControllerRemovedEvent, FlatControllersEvent, FlatCreatedEvent, FloodControlEvent, FloorHeightMapEvent, FollowFriendFailedEvent, FollowFriendMessageComposer, ForumDataMessageEvent, ForumsListMessageEvent, ForwardToACompetitionRoomMessageComposer, ForwardToARandomPromotedRoomMessageComposer, ForwardToASubmittableRoomMessageComposer, ForwardToRandomCompetitionRoomMessageComposer, ForwardToSomeRoomMessageComposer, FriendFurniConfirmLockMessageComposer, FriendListFragmentEvent, FriendListUpdateComposer, FriendListUpdateEvent, FriendNotificationEvent, FriendRequestQuestCompleteMessageComposer, FriendRequestsEvent, FurniRentOrBuyoutOfferMessageEvent, FurnitureAliasesComposer, FurnitureAliasesEvent, FurnitureColorWheelComposer, FurnitureDataEvent, FurnitureDiceActivateComposer, FurnitureDiceDeactivateComposer, FurnitureExchangeComposer, FurnitureFloorAddEvent, FurnitureFloorEvent, FurnitureFloorRemoveEvent, FurnitureFloorUpdateComposer, FurnitureFloorUpdateEvent, FurnitureGroupInfoComposer, FurnitureListAddOrUpdateEvent, FurnitureListComposer, FurnitureListEvent, FurnitureListInvalidateEvent, FurnitureListRemovedEvent, FurnitureMannequinSaveLookComposer, FurnitureMannequinSaveNameComposer, FurnitureMultiStateComposer, FurnitureOneWayDoorComposer, FurniturePickupComposer, FurniturePlaceComposer, FurniturePlacePaintComposer, FurniturePostItPlaceComposer, FurniturePostItPlacedEvent, FurnitureRandomStateComposer, FurnitureStackHeightComposer, FurnitureStackHeightEvent, FurnitureWallAddEvent, FurnitureWallEvent, FurnitureWallMultiStateComposer, FurnitureWallRemoveEvent, FurnitureWallUpdateComposer, FurnitureWallUpdateEvent, Game2AccountGameStatusMessageEvent, Game2CheckGameDirectoryStatusMessageComposer, Game2ExitGameMessageComposer, Game2GameChatMessageComposer, Game2GameDirectoryStatusMessageEvent, Game2GetAccountGameStatusMessageComposer, Game2GetWeeklyFriendsLeaderboardComposer, Game2GetWeeklyLeaderboardComposer, Game2InArenaQueueMessageEvent, Game2JoiningGameFailedMessageEvent, Game2LoadStageReadyMessageComposer, Game2PlayAgainMessageComposer, Game2RequestFullStatusUpdateMessageComposer, Game2StartingGameFailedMessageEvent, Game2StopCounterMessageEvent, Game2UserLeftGameMessageEvent, Game2WeeklyFriendsLeaderboardEvent, Game2WeeklyLeaderboardEvent, GameAchievementsMessageEvent, GameInviteMessageEvent, GameListMessageEvent, GameStatusMessageEvent, GameUnloadedMessageComposer, GenericErrorEvent, GetBadgePointLimitsComposer, GetBonusRareInfoMessageComposer, GetBotInventoryComposer, GetBundleDiscountRulesetComposer, GetCatalogIndexComposer, GetCatalogPageComposer, GetCatalogPageExpirationComposer, GetCatalogPageWithEarliestExpiryComposer, GetCategoriesWithUserCountMessageComposer, GetCfhChatlogMessageComposer, GetCfhStatusMessageComposer, GetClubGiftInfo, GetClubOffersMessageComposer, GetCommunityGoalEarnedPrizesMessageComposer, GetCommunityGoalHallOfFameMessageComposer, GetCommunityGoalProgressMessageComposer, GetConcurrentUsersGoalProgressMessageComposer, GetConcurrentUsersRewardMessageComposer, GetCraftableProductsComposer, GetCraftingRecipeComposer, GetCraftingRecipesAvailableComposer, GetCurrentTimingCodeMessageComposer, GetCustomRoomFilterMessageComposer, GetDailyQuestMessageComposer, GetDirectClubBuyAvailableComposer, GetEmailStatusComposer, GetExtendedProfileByNameMessageComposer, GetFaqCategoryMessageComposer, GetFaqTextMessageComposer, GetForumStatsMessageComposer, GetForumsListMessageComposer, GetFriendRequestsComposer, GetGameAchievementsMessageComposer, GetGameListMessageComposer, GetGameStatusMessageComposer, GetGiftMessageComposer, GetGiftWrappingConfigurationComposer, GetGuestRoomMessageComposer, GetGuestRoomResultEvent, GetGuideReportingStatusMessageComposer, GetHabboBasicMembershipExtendOfferComposer, GetHabboClubExtendOfferMessageComposer, GetHabboGroupBadgesMessageComposer, GetIgnoredUsersComposer, GetInterstitialMessageComposer, GetIsBadgeRequestFulfilledComposer, GetIsOfferGiftableComposer, GetIsUserPartOfCompetitionMessageComposer, GetItemDataComposer, GetJukeboxPlayListMessageComposer, GetLimitedOfferAppearingNextComposer, GetMarketplaceCanMakeOfferComposer, GetMarketplaceConfigurationMessageComposer, GetMarketplaceItemStatsComposer, GetMarketplaceOffersMessageComposer, GetMarketplaceOwnOffersMessageComposer, GetMessagesMessageComposer, GetModeratorRoomInfoMessageComposer, GetModeratorUserInfoMessageComposer, GetNextTargetedOfferComposer, GetNowPlayingMessageComposer, GetOccupiedTilesMessageComposer, GetOfficialRoomsMessageComposer, GetOfficialSongIdMessageComposer, GetPendingCallsForHelpMessageComposer, GetPetCommandsComposer, GetPopularRoomTagsMessageComposer, GetProductOfferComposer, GetPromoArticlesComposer, GetQuestsMessageComposer, GetQuizQuestionsComposer, GetRecyclerStatusMessageComposer, GetRentOrBuyoutOfferMessageComposer, GetResolutionAchievementsMessageComposer, GetRoomAdPurchaseInfoComposer, GetRoomChatlogMessageComposer, GetRoomEntryDataMessageComposer, GetRoomEntryTileMessageComposer, GetRoomVisitsMessageComposer, GetSeasonalCalendarDailyOfferComposer, GetSeasonalQuestsOnlyMessageComposer, GetSecondsUntilMessageComposer, GetSellablePetPalettesComposer, GetSongInfoMessageComposer, GetSoundMachinePlayListMessageComposer, GetSoundSettingsComposer, GetTalentTrackLevelMessageComposer, GetTargetedOfferComposer, GetThreadMessageComposer, GetThreadsMessageComposer, GetUnreadForumsCountMessageComposer, GetUserChatlogMessageComposer, GetUserEventCatsMessageComposer, GetUserFlatCatsMessageComposer, GetUserGameAchievementsMessageComposer, GetUserSongDisksMessageComposer, GetUserTagsComposer, GetWardrobeMessageComposer, GetWeeklyGameRewardComposer, GetWeeklyGameRewardWinnersComposer, GetYoutubeDisplayStatusMessageComposer, GiftReceiverNotFoundEvent, GiftWrappingConfigurationEvent, GoToFlatMessageComposer, GotMysteryBoxPrizeMessageEvent, GroupAdminGiveComposer, GroupAdminTakeComposer, GroupBadgePartsComposer, GroupBadgePartsEvent, GroupBuyComposer, GroupBuyDataComposer, GroupBuyDataEvent, GroupConfirmMemberRemoveEvent, GroupConfirmRemoveMemberComposer, GroupDeleteComposer, GroupDetailsChangedMessageEvent, GroupFavoriteComposer, GroupFurniContextMenuInfoMessageEvent, GroupInformationComposer, GroupInformationEvent, GroupJoinComposer, GroupMembersComposer, GroupMembersEvent, GroupMembershipAcceptComposer, GroupMembershipDeclineComposer, GroupMembershipRequestedMessageEvent, GroupPurchasedEvent, GroupRemoveMemberComposer, GroupSaveBadgeComposer, GroupSaveColorsComposer, GroupSaveInformationComposer, GroupSavePreferencesComposer, GroupSettingsComposer, GroupSettingsEvent, GroupUnfavoriteComposer, GuestRoomSearchResultEvent, GuideOnDutyStatusMessageEvent, GuideReportingStatusMessageEvent, GuideSessionAttachedMessageEvent, GuideSessionCreateMessageComposer, GuideSessionDetachedMessageEvent, GuideSessionEndedMessageEvent, GuideSessionErrorMessageEvent, GuideSessionFeedbackMessageComposer, GuideSessionGetRequesterRoomMessageComposer, GuideSessionGuideDecidesMessageComposer, GuideSessionInviteRequesterMessageComposer, GuideSessionInvitedToGuideRoomMessageEvent, GuideSessionIsTypingMessageComposer, GuideSessionMessageMessageComposer, GuideSessionMessageMessageEvent, GuideSessionOnDutyUpdateMessageComposer, GuideSessionPartnerIsTypingMessageEvent, GuideSessionReportMessageComposer, GuideSessionRequesterCancelsMessageComposer, GuideSessionRequesterRoomMessageEvent, GuideSessionResolvedMessageComposer, GuideSessionStartedMessageEvent, GuideTicketCreationResultMessageEvent, GuideTicketResolutionMessageEvent, GuildBaseSearchMessageComposer, GuildEditFailedMessageEvent, GuildForumThreadsEvent, GuildMemberMgmtFailedMessageEvent, GuildMembershipsMessageEvent, HabboBroadcastMessageEvent, HabboClubExtendOfferMessageEvent, HabboClubOffersMessageEvent, HabboGroupBadgesMessageEvent, HabboGroupDeactivatedMessageEvent, HabboGroupJoinFailedMessageEvent, HabboSearchComposer, HabboSearchResultEvent, HarvestPetMessageComposer, HotelClosedAndOpensEvent, HotelClosesAndWillOpenAtEvent, HotelMergeNameChangeEvent, HotelWillCloseInMinutesEvent, IdentityAccountsEvent, IgnoreResultEvent, IgnoreUserComposer, IgnoreUserIdComposer, IgnoredUsersEvent, InClientLinkEvent, IncomingHeader, InfoFeedEnableMessageEvent, InfoRetrieveMessageComposer, InitCameraMessageEvent, InitDiffieHandshakeEvent, InitDiffieHandshakeMessageComposer, InstantMessageErrorEvent, InterstitialMessageEvent, InterstitialShownMessageComposer, IsBadgeRequestFulfilledEvent, IsOfferGiftableMessageEvent, IsUserPartOfCompetitionMessageEvent, IssueCloseNotificationMessageEvent, IssueDeletedMessageEvent, IssueInfoMessageEvent, IssuePickFailedMessageEvent, ItemDataUpdateMessageEvent, JoinQueueMessageComposer, JoinedQueueMessageEvent, JoiningQueueFailedMessageEvent, JukeboxPlayListFullMessageEvent, JukeboxSongDisksMessageEvent, LagWarningReportMessageComposer, LeaveQueueMessageComposer, LeftQueueMessageEvent, LimitedEditionSoldOutEvent, LimitedOfferAppearingNextMessageEvent, LoadGameMessageEvent, LoadGameUrlEvent, LoveLockFurniFinishedEvent, LoveLockFurniFriendConfirmedEvent, LoveLockFurniStartEvent, MOTDNotificationEvent, MaintenanceStatusMessageEvent, MakeOfferMessageComposer, MarkCatalogNewAdditionsPageOpenedComposer, MarketPlaceOffersEvent, MarketplaceBuyOfferResultEvent, MarketplaceCanMakeOfferResult, MarketplaceCancelOfferResultEvent, MarketplaceConfigurationEvent, MarketplaceItemStatsEvent, MarketplaceMakeOfferResult, MarketplaceOwnOffersEvent, MessageErrorEvent, MessengerInitComposer, MessengerInitEvent, MiniMailNewMessageEvent, MiniMailUnreadCountEvent, ModAlertMessageComposer, ModBanMessageComposer, ModKickMessageComposer, ModMessageMessageComposer, ModMuteMessageComposer, ModToolPreferencesComposer, ModToolSanctionComposer, ModTradingLockMessageComposer, ModerateMessageMessageComposer, ModerateRoomMessageComposer, ModerateThreadMessageComposer, ModeratorActionMessageComposer, ModeratorActionResultMessageEvent, ModeratorCautionEvent, ModeratorInitMessageEvent, ModeratorMessageEvent, ModeratorRoomInfoEvent, ModeratorToolPreferencesEvent, ModeratorUserInfoEvent, MoodlightSettingsComposer, MoodlightSettingsSaveComposer, MoodlightTogggleStateComposer, MuteAllInRoomEvent, MyFavouriteRoomsSearchMessageComposer, MyFrequentRoomHistorySearchMessageComposer, MyFriendsRoomsSearchMessageComposer, MyGuildBasesSearchMessageComposer, MyRecommendedRoomsMessageComposer, MyRoomHistorySearchMessageComposer, MyRoomRightsSearchMessageComposer, MyRoomsSearchMessageComposer, MysteryBoxKeysEvent, MysteryBoxWaitingCanceledMessageComposer, NavigatorCategoryListModeComposer, NavigatorCollapsedEvent, NavigatorDeleteSavedSearchComposer, NavigatorHomeRoomEvent, NavigatorInitComposer, NavigatorLiftedEvent, NavigatorMetadataEvent, NavigatorOpenRoomCreatorEvent, NavigatorSearchCloseComposer, NavigatorSearchComposer, NavigatorSearchEvent, NavigatorSearchOpenComposer, NavigatorSearchSaveComposer, NavigatorSearchesEvent, NavigatorSettingsEvent, NavigatorSettingsSaveComposer, NewConsoleMessageEvent, NewFriendRequestEvent, NewUserExperienceGetGiftsComposer, NewUserExperienceGiftOfferMessageEvent, NewUserExperienceNotCompleteEvent, NewUserExperienceScriptProceedComposer, NoOwnedRoomsAlertMessageEvent, NoSuchFlatEvent, NoobnessLevelMessageEvent, NotEnoughBalanceMessageEvent, NotificationDialogMessageEvent, NowPlayingMessageEvent, ObjectsDataUpdateEvent, ObjectsRollingEvent, OfferRewardDeliveredMessageEvent, OfficialSongIdMessageEvent, OneWayDoorStatusMessageEvent, OpenCampaignCalendarDoorAsStaffComposer, OpenCampaignCalendarDoorComposer, OpenMessageComposer, OpenMysteryTrophyMessageComposer, OpenPetPackageMessageComposer, OpenPetPackageRequestedMessageEvent, OpenPetPackageResultMessageEvent, OpenPresentComposer, OpenQuestTrackerMessageComposer, OpenWelcomeGiftComposer, OutgoingHeader, PeerUsersClassificationMessageComposer, PerformanceLogMessageComposer, PerkAllowancesMessageEvent, PetAddedToInventoryEvent, PetBreedingResultEvent, PetExperienceEvent, PetFigureUpdateEvent, PetInfoEvent, PetInventoryEvent, PetLevelNotificationEvent, PetLevelUpdateMessageEvent, PetMountComposer, PetMoveComposer, PetPlaceComposer, PetPlacingErrorEvent, PetReceivedMessageEvent, PetRemoveComposer, PetRemovedFromInventory, PetRespectComposer, PetRespectNoficationEvent, PetScratchFailedMessageEvent, PetSelectedMessageComposer, PetStatusUpdateEvent, PetSupplementComposer, PetSupplementedNotificationEvent, PetTrainingPanelMessageEvent, PhoneCollectionStateMessageEvent, PhotoCompetitionMessageComposer, PickIssuesMessageComposer, PlayListMessageEvent, PlayListSongAddedMessageEvent, PollAnswerComposer, PollContentsEvent, PollErrorEvent, PollOfferEvent, PollRejectComposer, PollStartComposer, PongMessageComposer, PopularRoomTagsResultEvent, PopularRoomsSearchMessageComposer, PostMessageMessageComposer, PostMessageMessageEvent, PostQuizAnswersComposer, PostThreadMessageEvent, PresentOpenedMessageEvent, ProductOfferEvent, PromoArticlesMessageEvent, PublishPhotoMessageComposer, PurchaseBasicMembershipExtensionComposer, PurchaseErrorMessageEvent, PurchaseFromCatalogAsGiftComposer, PurchaseFromCatalogComposer, PurchaseNotAllowedMessageEvent, PurchaseOKMessageEvent, PurchasePhotoMessageComposer, PurchaseRoomAdMessageComposer, PurchaseTargetedOfferComposer, PurchaseVipMembershipExtensionComposer, QuestCancelledMessageEvent, QuestCompletedMessageEvent, QuestDailyMessageEvent, QuestMessageEvent, QuestionAnsweredEvent, QuestionEvent, QuestionFinishedEvent, QuestsMessageEvent, QuizDataMessageEvent, QuizResultsMessageEvent, RateFlatMessageComposer, RecycleItemsMessageComposer, RecyclerFinishedMessageEvent, RecyclerStatusMessageEvent, RedeemCommunityGoalPrizeMessageComposer, RedeemItemClothingComposer, RedeemMarketplaceOfferCreditsMessageComposer, RedeemVoucherMessageComposer, RejectQuestMessageComposer, RelationshipStatusInfoEvent, ReleaseIssuesMessageComposer, RemainingMuteEvent, RemoveAllRightsMessageComposer, RemoveFriendComposer, RemoveJukeboxDiskComposer, RemoveOwnRoomRightsRoomMessageComposer, RemovePetSaddleComposer, RemoveWallItemComposer, RenderRoomMessageComposer, RenderRoomThumbnailMessageComposer, RentableSpaceCancelRentMessageComposer, RentableSpaceRentFailedMessageEvent, RentableSpaceRentMessageComposer, RentableSpaceRentOkMessageEvent, RentableSpaceStatusMessageComposer, RentableSpaceStatusMessageEvent, RequestABadgeComposer, RequestAchievementsMessageComposer, RequestBadgesComposer, RequestBotCommandConfigurationComposer, RequestCameraConfigurationComposer, RequestFriendComposer, RequestFurniInventoryWhenNotInRoomComposer, RequestPetInfoComposer, RequestPetsComposer, RequestSpamWallPostItMessageEvent, ResetPhoneNumberStateMessageComposer, ResetResolutionAchievementMessageComposer, RespectReceivedEvent, RestoreClientMessageEvent, RoomAdErrorEvent, RoomAdEventTabAdClickedComposer, RoomAdEventTabViewedComposer, RoomAdPurchaseInfoEvent, RoomAdPurchaseInitiatedComposer, RoomAdSearchMessageComposer, RoomAmbassadorAlertComposer, RoomBanUserComposer, RoomBannedUsersComposer, RoomChatSettingsEvent, RoomChatlogEvent, RoomCompetitionInitMessageComposer, RoomDeleteComposer, RoomDimmerPresetsEvent, RoomDoorbellAcceptedEvent, RoomDoorbellAccessComposer, RoomEnterComposer, RoomEnterErrorEvent, RoomEnterEvent, RoomEntryInfoMessageEvent, RoomEntryTileMessageEvent, RoomEventCancelEvent, RoomEventEvent, RoomFilterSettingsMessageEvent, RoomForwardEvent, RoomGiveRightsComposer, RoomHeightMapEvent, RoomHeightMapUpdateEvent, RoomInviteErrorEvent, RoomInviteEvent, RoomKickUserComposer, RoomMessageNotificationMessageEvent, RoomMuteComposer, RoomMuteUserComposer, RoomNetworkOpenConnectionMessageComposer, RoomOccupiedTilesMessageEvent, RoomPaintEvent, RoomPollResultEvent, RoomReadyMessageEvent, RoomRightsClearEvent, RoomRightsEvent, RoomRightsOwnerEvent, RoomScoreEvent, RoomSettingsComposer, RoomSettingsDataEvent, RoomSettingsErrorEvent, RoomSettingsSaveErrorEvent, RoomSettingsSavedEvent, RoomSettingsUpdatedEvent, RoomTakeRightsComposer, RoomTextSearchMessageComposer, RoomThumbnailUpdateResultEvent, RoomUnbanUserComposer, RoomUnitActionComposer, RoomUnitChatComposer, RoomUnitChatEvent, RoomUnitChatShoutComposer, RoomUnitChatShoutEvent, RoomUnitChatStyleComposer, RoomUnitChatWhisperComposer, RoomUnitChatWhisperEvent, RoomUnitDanceComposer, RoomUnitDanceEvent, RoomUnitDropHandItemComposer, RoomUnitEffectEvent, RoomUnitEvent, RoomUnitExpressionEvent, RoomUnitGiveHandItemComposer, RoomUnitGiveHandItemPetComposer, RoomUnitHandItemEvent, RoomUnitHandItemReceivedEvent, RoomUnitIdleEvent, RoomUnitInfoEvent, RoomUnitLookComposer, RoomUnitNumberEvent, RoomUnitPostureComposer, RoomUnitRemoveEvent, RoomUnitSignComposer, RoomUnitStatusEvent, RoomUnitTypingEvent, RoomUnitTypingStartComposer, RoomUnitTypingStopComposer, RoomUnitWalkComposer, RoomUsersClassificationMessageComposer, RoomUsersWithRightsComposer, RoomVisitsEvent, RoomVisualizationSettingsEvent, RoomsWhereMyFriendsAreSearchMessageComposer, RoomsWithHighestScoreSearchMessageComposer, SSOTicketMessageComposer, SanctionStatusEvent, SaveRoomSettingsComposer, SaveWardrobeOutfitMessageComposer, ScrGetKickbackInfoMessageComposer, ScrSendKickbackInfoMessageEvent, SearchFaqsMessageComposer, SeasonalCalendarDailyOfferMessageEvent, SeasonalQuestsMessageEvent, SecondsUntilMessageEvent, SelectClubGiftComposer, SellablePetPalettesMessageEvent, SendMessageComposer, SendRoomInviteComposer, SetActivatedBadgesComposer, SetClothingChangeDataMessageComposer, SetItemDataMessageComposer, SetObjectDataMessageComposer, SetPhoneNumberVerificationStatusMessageComposer, SetRelationshipStatusComposer, SetRoomSessionTagsMessageComposer, SetTargetedOfferStateComposer, SetYoutubeDisplayPlaylistMessageComposer, ShopTargetedOfferViewedComposer, ShowEnforceRoomCategoryDialogEvent, ShowMysteryBoxWaitMessageEvent, SimpleAlertMessageEvent, StartCampaignMessageComposer, StartRoomPollEvent, SubmitRoomToCompetitionMessageComposer, TalentLevelUpEvent, TalentTrackComposer, TalentTrackLevelMessageEvent, TalentTrackMessageEvent, TargetedOfferEvent, TargetedOfferNotFoundEvent, ThreadMessagesMessageEvent, ThumbnailStatusMessageEvent, TogglePetBreedingComposer, TogglePetRidingComposer, ToggleStaffPickMessageComposer, TradingAcceptComposer, TradingAcceptEvent, TradingCancelComposer, TradingCloseComposer, TradingCloseEvent, TradingCompletedEvent, TradingConfirmationComposer, TradingConfirmationEvent, TradingListAddItemComposer, TradingListAddItemsComposer, TradingListItemEvent, TradingListItemRemoveComposer, TradingNoSuchItemEvent, TradingNotOpenEvent, TradingOpenComposer, TradingOpenEvent, TradingOpenFailedEvent, TradingOtherNotAllowedEvent, TradingUnacceptComposer, TradingYouAreNotAllowedEvent, TraxSongInfoMessageEvent, TryPhoneNumberMessageComposer, TryPhoneNumberResultMessageEvent, TryVerificationCodeResultMessageEvent, UnblockGroupMemberMessageComposer, UnignoreUserComposer, UniqueIDMessageComposer, UnloadGameMessageEvent, UnreadForumsCountMessageEvent, UnseenItemsEvent, UnseenResetCategoryComposer, UnseenResetItemsComposer, UpdateActionMessageComposer, UpdateConditionMessageComposer, UpdateFloorPropertiesMessageComposer, UpdateForumReadMarkerMessageComposer, UpdateForumSettingsMessageComposer, UpdateHomeRoomMessageComposer, UpdateMessageMessageEvent, UpdateRoomCategoryAndTradeSettingsComposer, UpdateRoomFilterMessageComposer, UpdateRoomThumbnailMessageComposer, UpdateThreadMessageComposer, UpdateThreadMessageEvent, UpdateTriggerMessageComposer, UsePetProductComposer, UserBannedMessageEvent, UserChatlogEvent, UserClassificationMessageEvent, UserCreditsEvent, UserCurrencyComposer, UserCurrencyEvent, UserCurrentBadgesComposer, UserCurrentBadgesEvent, UserEventCatsEvent, UserFigureComposer, UserFlatCatsEvent, UserGameAchievementsMessageEvent, UserInfoEvent, UserMottoComposer, UserNameChangeMessageEvent, UserPermissionsEvent, UserProfileComposer, UserProfileEvent, UserRelationshipsComposer, UserRespectComposer, UserSettingsCameraFollowComposer, UserSettingsEvent, UserSettingsOldChatComposer, UserSettingsRoomInvitesComposer, UserSettingsSoundComposer, UserSongDisksInventoryMessageEvent, UserSubscriptionComposer, UserSubscriptionEvent, UserTagsMessageEvent, UserUnbannedFromRoomEvent, UserWardrobePageEvent, VerifyCodeMessageComposer, VersionCheckMessageComposer, VisitUserComposer, VoteForRoomMessageComposer, VotePollCounterMessageComposer, VoucherRedeemErrorMessageEvent, VoucherRedeemOkMessageEvent, WardrobeMessageEvent, WeeklyCompetitiveFriendsLeaderboardEvent, WeeklyCompetitiveLeaderboardEvent, WeeklyGameRewardEvent, WeeklyGameRewardWinnersEvent, WelcomeGiftChangeEmailComposer, WelcomeGiftChangeEmailResultEvent, WelcomeGiftStatusEvent, WiredFurniActionEvent, WiredFurniConditionEvent, WiredFurniTriggerEvent, WiredOpenEvent, WiredRewardResultMessageEvent, WiredSaveSuccessEvent, WiredValidationErrorEvent, YouArePlayingGameEvent, YouAreSpectatorMessageEvent, YoutubeControlVideoMessageEvent, YoutubeDisplayPlaylistsEvent, YoutubeDisplayVideoMessageEvent } from './messages'; + +export class NitroMessages implements IMessageConfiguration +{ + private _events: Map; + private _composers: Map; + + constructor() + { + this._events = new Map(); + this._composers = new Map(); + + this.registerEvents(); + this.registerComposers(); + } + + private registerEvents(): void + { + // ADVERTISEMENT + this._events.set(IncomingHeader.INTERSTITIAL_MESSAGE, InterstitialMessageEvent); + this._events.set(IncomingHeader.ROOM_AD_ERROR, RoomAdErrorEvent); + + // AVAILABILITY + this._events.set(IncomingHeader.AVAILABILITY_STATUS, AvailabilityStatusMessageEvent); + this._events.set(IncomingHeader.AVAILABILITY_TIME, AvailabilityTimeMessageEvent); + this._events.set(IncomingHeader.HOTEL_CLOSED_AND_OPENS, HotelClosedAndOpensEvent); + this._events.set(IncomingHeader.HOTEL_CLOSES_AND_OPENS_AT, HotelClosesAndWillOpenAtEvent); + this._events.set(IncomingHeader.HOTEL_WILL_CLOSE_MINUTES, HotelWillCloseInMinutesEvent); + this._events.set(IncomingHeader.HOTEL_MAINTENANCE, MaintenanceStatusMessageEvent); + + // AVATAR + this._events.set(IncomingHeader.USER_CHANGE_NAME, ChangeUserNameResultMessageEvent); + this._events.set(IncomingHeader.CHECK_USER_NAME, CheckUserNameResultMessageEvent); + this._events.set(IncomingHeader.USER_FIGURE, FigureUpdateEvent); + this._events.set(IncomingHeader.USER_OUTFITS, WardrobeMessageEvent); + + // BOTS + this._events.set(IncomingHeader.ADD_BOT_TO_INVENTORY, BotAddedToInventoryEvent); + this._events.set(IncomingHeader.USER_BOTS, BotInventoryMessageEvent); + this._events.set(IncomingHeader.BOT_RECEIVED, BotReceivedMessageEvent); + this._events.set(IncomingHeader.REMOVE_BOT_FROM_INVENTORY, BotRemovedFromInventoryEvent); + + // CALL FOR HELP + this._events.set(IncomingHeader.CFH_SANCTION, CfhSanctionMessageEvent); + this._events.set(IncomingHeader.CFH_TOPICS, CfhTopicsInitEvent); + this._events.set(IncomingHeader.CFH_SANCTION_STATUS, SanctionStatusEvent); + + // CAMERA + this._events.set(IncomingHeader.CAMERA_PUBLISH_STATUS, CameraPublishStatusMessageEvent); + this._events.set(IncomingHeader.CAMERA_PURCHASE_OK, CameraPurchaseOKMessageEvent); + this._events.set(IncomingHeader.CAMERA_STORAGE_URL, CameraStorageUrlMessageEvent); + this._events.set(IncomingHeader.COMPETITION_STATUS, CompetitionStatusMessageEvent); + this._events.set(IncomingHeader.INIT_CAMERA, InitCameraMessageEvent); + this._events.set(IncomingHeader.THUMBNAIL_STATUS, ThumbnailStatusMessageEvent); + this._events.set(IncomingHeader.CAMERA_SNAPSHOT, CameraSnapshotMessageEvent); + + // CAMPAIGN + this._events.set(IncomingHeader.CAMPAIGN_CALENDAR_DATA, CampaignCalendarDataMessageEvent); + this._events.set(IncomingHeader.CAMPAIGN_CALENDAR_DOOR_OPENED, CampaignCalendarDoorOpenedMessageEvent); + + // CATALOG + this._events.set(IncomingHeader.BONUS_RARE_INFO, BonusRareInfoMessageEvent); + this._events.set(IncomingHeader.BUILDERS_CLUB_FURNI_COUNT, BuildersClubFurniCountMessageEvent); + this._events.set(IncomingHeader.BUILDERS_CLUB_SUBSCRIPTION, BuildersClubSubscriptionStatusMessageEvent); + this._events.set(IncomingHeader.BUNDLE_DISCOUNT_RULESET, BundleDiscountRulesetMessageEvent); + this._events.set(IncomingHeader.CATALOG_PAGE_EXPIRATION, CatalogPageExpirationEvent); + this._events.set(IncomingHeader.CATALOG_PAGE, CatalogPageMessageEvent); + this._events.set(IncomingHeader.CATALOG_PAGE_LIST, CatalogPagesListEvent); + this._events.set(IncomingHeader.CATALOG_EARLIEST_EXPIRY, CatalogPageWithEarliestExpiryMessageEvent); + this._events.set(IncomingHeader.CATALOG_PUBLISHED, CatalogPublishedMessageEvent); + this._events.set(IncomingHeader.CLUB_GIFT_INFO, ClubGiftInfoEvent); + this._events.set(IncomingHeader.CLUB_GIFT_SELECTED, ClubGiftSelectedEvent); + this._events.set(IncomingHeader.DIRECT_SMS_CLUB_BUY, DirectSMSClubBuyAvailableMessageEvent); + this._events.set(IncomingHeader.GIFT_RECEIVER_NOT_FOUND, GiftReceiverNotFoundEvent); + this._events.set(IncomingHeader.GIFT_WRAPPER_CONFIG, GiftWrappingConfigurationEvent); + this._events.set(IncomingHeader.CLUB_EXTENDED_OFFER, HabboClubExtendOfferMessageEvent); + this._events.set(IncomingHeader.CLUB_OFFERS, HabboClubOffersMessageEvent); + this._events.set(IncomingHeader.IS_OFFER_GIFTABLE, IsOfferGiftableMessageEvent); + this._events.set(IncomingHeader.LIMITED_SOLD_OUT, LimitedEditionSoldOutEvent); + this._events.set(IncomingHeader.LIMITED_OFFER_APPEARING_NEXT, LimitedOfferAppearingNextMessageEvent); + this._events.set(IncomingHeader.NOT_ENOUGH_BALANCE, NotEnoughBalanceMessageEvent); + this._events.set(IncomingHeader.PRODUCT_OFFER, ProductOfferEvent); + this._events.set(IncomingHeader.CATALOG_PURCHASE_ERROR, PurchaseErrorMessageEvent); + this._events.set(IncomingHeader.CATALOG_PURCHASE_NOT_ALLOWED, PurchaseNotAllowedMessageEvent); + this._events.set(IncomingHeader.CATALOG_PURCHASE_OK, PurchaseOKMessageEvent); + this._events.set(IncomingHeader.ROOM_AD_PURCHASE, RoomAdPurchaseInfoEvent); + this._events.set(IncomingHeader.SEASONAL_CALENDAR_OFFER, SeasonalCalendarDailyOfferMessageEvent); + this._events.set(IncomingHeader.CATALOG_RECEIVE_PET_BREEDS, SellablePetPalettesMessageEvent); + this._events.set(IncomingHeader.TARGET_OFFER, TargetedOfferEvent); + this._events.set(IncomingHeader.TARGET_OFFER_NOT_FOUND, TargetedOfferNotFoundEvent); + this._events.set(IncomingHeader.REDEEM_VOUCHER_ERROR, VoucherRedeemErrorMessageEvent); + this._events.set(IncomingHeader.REDEEM_VOUCHER_OK, VoucherRedeemOkMessageEvent); + + // CLIENT + this._events.set(IncomingHeader.CLIENT_PING, ClientPingEvent); + + // COMPETITION + this._events.set(IncomingHeader.COMPETITION_ENTRY_SUBMIT, CompetitionEntrySubmitResultEvent); + this._events.set(IncomingHeader.COMPETITION_VOTING_INFO, CompetitionVotingInfoMessageEvent); + this._events.set(IncomingHeader.COMPETITION_TIMING_CODE, CurrentTimingCodeMessageEvent); + this._events.set(IncomingHeader.COMPETITION_USER_PART_OF, IsUserPartOfCompetitionMessageEvent); + this._events.set(IncomingHeader.COMPETITION_NO_OWNED_ROOMS, NoOwnedRoomsAlertMessageEvent); + this._events.set(IncomingHeader.COMPETITION_SECONDS_UNTIL, SecondsUntilMessageEvent); + + // CRAFTING + this._events.set(IncomingHeader.CRAFTABLE_PRODUCTS, CraftableProductsEvent); + this._events.set(IncomingHeader.CRAFTING_RECIPE, CraftingRecipeEvent); + this._events.set(IncomingHeader.CRAFTING_RECIPES_AVAILABLE, CraftingRecipesAvailableEvent); + this._events.set(IncomingHeader.CRAFTING_RESULT, CraftingResultEvent); + + // DESKTOP + this._events.set(IncomingHeader.DESKTOP_VIEW, DesktopViewEvent); + + // FRIENDLIST + this._events.set(IncomingHeader.MESSENGER_ACCEPT_FRIENDS, AcceptFriendResultEvent); + this._events.set(IncomingHeader.MESSENGER_FIND_FRIENDS, FindFriendsProcessResultEvent); + this._events.set(IncomingHeader.MESSENGER_FOLLOW_FAILED, FollowFriendFailedEvent); + this._events.set(IncomingHeader.MESSENGER_FRIENDS, FriendListFragmentEvent); + this._events.set(IncomingHeader.MESSENGER_UPDATE, FriendListUpdateEvent); + this._events.set(IncomingHeader.MESSENGER_FRIEND_NOTIFICATION, FriendNotificationEvent); + this._events.set(IncomingHeader.MESSENGER_REQUESTS, FriendRequestsEvent); + this._events.set(IncomingHeader.MESSENGER_SEARCH, HabboSearchResultEvent); + this._events.set(IncomingHeader.MESSENGER_INSTANCE_MESSAGE_ERROR, InstantMessageErrorEvent); + this._events.set(IncomingHeader.MESSENGER_MESSAGE_ERROR, MessageErrorEvent); + this._events.set(IncomingHeader.MESSENGER_INIT, MessengerInitEvent); + this._events.set(IncomingHeader.MESSENGER_MINIMAIL_NEW, MiniMailNewMessageEvent); + this._events.set(IncomingHeader.MESSENGER_MINIMAIL_COUNT, MiniMailUnreadCountEvent); + this._events.set(IncomingHeader.MESSENGER_CHAT, NewConsoleMessageEvent); + this._events.set(IncomingHeader.MESSENGER_REQUEST, NewFriendRequestEvent); + this._events.set(IncomingHeader.MESSENGER_INVITE_ERROR, RoomInviteErrorEvent); + this._events.set(IncomingHeader.MESSENGER_INVITE, RoomInviteEvent); + + // GAMES + this._events.set(IncomingHeader.ACHIEVEMENTRESOLUTIONCOMPLETED, AchievementResolutionCompletedMessageEvent); + this._events.set(IncomingHeader.ACHIEVEMENTRESOLUTIONPROGRESS, AchievementResolutionProgressMessageEvent); + this._events.set(IncomingHeader.ACHIEVEMENTRESOLUTIONS, AchievementResolutionsMessageEvent); + this._events.set(IncomingHeader.LOAD_GAME_URL, LoadGameUrlEvent); + this._events.set(IncomingHeader.LOADGAME, LoadGameMessageEvent); + this._events.set(IncomingHeader.UNLOADGAME, UnloadGameMessageEvent); + this._events.set(IncomingHeader.GAME_CENTER_GAME_LIST, GameListMessageEvent); + this._events.set(IncomingHeader.GAMESTATUSMESSAGE, GameStatusMessageEvent); + this._events.set(IncomingHeader.GAME_CENTER_ACHIEVEMENTS, UserGameAchievementsMessageEvent); + this._events.set(IncomingHeader.GAME_CENTER_STATUS, Game2AccountGameStatusMessageEvent); + this._events.set(IncomingHeader.GAME_CENTER_IN_ARENA_QUEUE, Game2InArenaQueueMessageEvent); + this._events.set(IncomingHeader.GAME_CENTER_STOP_COUNTER, Game2StopCounterMessageEvent); + this._events.set(IncomingHeader.GAME_CENTER_USER_LEFT_GAME, Game2UserLeftGameMessageEvent); + this._events.set(IncomingHeader.GAME_CENTER_DIRECTORY_STATUS, Game2GameDirectoryStatusMessageEvent); + this._events.set(IncomingHeader.GAME_CENTER_STARTING_GAME_FAILED, Game2StartingGameFailedMessageEvent); + this._events.set(IncomingHeader.GAME_CENTER_JOINING_FAILED, Game2JoiningGameFailedMessageEvent); + this._events.set(IncomingHeader.GAMEACHIEVEMENTS, GameAchievementsMessageEvent); + this._events.set(IncomingHeader.GAMEINVITE, GameInviteMessageEvent); + this._events.set(IncomingHeader.JOINEDQUEUEMESSAGE, JoinedQueueMessageEvent); + this._events.set(IncomingHeader.JOININGQUEUEFAILED, JoiningQueueFailedMessageEvent); + this._events.set(IncomingHeader.LEFTQUEUE, LeftQueueMessageEvent); + this._events.set(IncomingHeader.WEEKLY_GAME_REWARD, WeeklyGameRewardEvent); + this._events.set(IncomingHeader.WEEKLY_GAME_REWARD_WINNERS, WeeklyGameRewardWinnersEvent); + this._events.set(IncomingHeader.WEEKLY_COMPETITIVE_LEADERBOARD, WeeklyCompetitiveLeaderboardEvent); + this._events.set(IncomingHeader.WEEKLY_COMPETITIVE_FRIENDS_LEADERBOARD, WeeklyCompetitiveFriendsLeaderboardEvent); + this._events.set(IncomingHeader.WEEKLY_GAME2_FRIENDS_LEADERBOARD, Game2WeeklyFriendsLeaderboardEvent); + this._events.set(IncomingHeader.WEEKLY_GAME2_LEADERBOARD, Game2WeeklyLeaderboardEvent); + + // GROUP + this._events.set(IncomingHeader.GROUP_INFO, GroupInformationEvent); + this._events.set(IncomingHeader.GROUP_MEMBER_REMOVE_CONFIRM, GroupConfirmMemberRemoveEvent); + this._events.set(IncomingHeader.GROUP_MEMBERS, GroupMembersEvent); + this._events.set(IncomingHeader.GROUP_CREATE_OPTIONS, GroupBuyDataEvent); + this._events.set(IncomingHeader.GROUP_BADGE_PARTS, GroupBadgePartsEvent); + this._events.set(IncomingHeader.GROUP_SETTINGS, GroupSettingsEvent); + this._events.set(IncomingHeader.GROUP_PURCHASED, GroupPurchasedEvent); + this._events.set(IncomingHeader.GROUP_BADGES, HabboGroupBadgesMessageEvent); + this._events.set(IncomingHeader.GROUP_DEACTIVATE, HabboGroupDeactivatedMessageEvent); + this._events.set(IncomingHeader.GROUP_MEMBERSHIP_REQUESTED, GroupMembershipRequestedMessageEvent); + this._events.set(IncomingHeader.GROUP_DETAILS_CHANGED, GroupDetailsChangedMessageEvent); + this._events.set(IncomingHeader.GROUP_HABBO_JOIN_FAILED, HabboGroupJoinFailedMessageEvent); + + // GROUP FORUMS + this._events.set(IncomingHeader.GROUP_FORUM_DATA, ForumDataMessageEvent); + this._events.set(IncomingHeader.GROUP_FORUM_LIST, ForumsListMessageEvent); + this._events.set(IncomingHeader.GROUP_FORUM_THREADS, GuildForumThreadsEvent); + this._events.set(IncomingHeader.GROUP_FORUM_POST, PostMessageMessageEvent); + this._events.set(IncomingHeader.GROUP_FORUM_POST_THREAD, PostThreadMessageEvent); + this._events.set(IncomingHeader.GROUP_FORUM_THREAD_MESSAGES, ThreadMessagesMessageEvent); + this._events.set(IncomingHeader.GROUP_FORUM_UNREAD_COUNT, UnreadForumsCountMessageEvent); + this._events.set(IncomingHeader.GROUP_FORUM_UPDATE_MESSAGE, UpdateMessageMessageEvent); + this._events.set(IncomingHeader.GROUP_FORUM_UPDATE_THREAD, UpdateThreadMessageEvent); + + // HELP + this._events.set(IncomingHeader.CFH_DISABLED_NOTIFY, CallForHelpDisabledNotifyMessageEvent); + this._events.set(IncomingHeader.CFH_PENDING_CALLS_DELETED, CallForHelpPendingCallsDeletedMessageEvent); + this._events.set(IncomingHeader.CFH_PENDING_CALLS, CallForHelpPendingCallsMessageEvent); + this._events.set(IncomingHeader.CFH_REPLY, CallForHelpReplyMessageEvent); + this._events.set(IncomingHeader.CFH_RESULT_MESSAGE, CallForHelpResultMessageEvent); + this._events.set(IncomingHeader.GUIDE_ON_DUTY_STATUS, GuideOnDutyStatusMessageEvent); + this._events.set(IncomingHeader.GUIDE_SESSION_ATTACHED, GuideSessionAttachedMessageEvent); + this._events.set(IncomingHeader.GUIDE_SESSION_DETACHED, GuideSessionDetachedMessageEvent); + this._events.set(IncomingHeader.GUIDE_SESSION_ENDED, GuideSessionEndedMessageEvent); + this._events.set(IncomingHeader.GUIDE_SESSION_ERROR, GuideSessionErrorMessageEvent); + this._events.set(IncomingHeader.GUIDE_SESSION_INVITED_TO_GUIDE_ROOM, GuideSessionInvitedToGuideRoomMessageEvent); + this._events.set(IncomingHeader.GUIDE_SESSION_MESSAGE, GuideSessionMessageMessageEvent); + this._events.set(IncomingHeader.GUIDE_SESSION_PARTNER_IS_TYPING, GuideSessionPartnerIsTypingMessageEvent); + this._events.set(IncomingHeader.GUIDE_SESSION_REQUESTER_ROOM, GuideSessionRequesterRoomMessageEvent); + this._events.set(IncomingHeader.GUIDE_SESSION_STARTED, GuideSessionStartedMessageEvent); + this._events.set(IncomingHeader.GUIDE_TICKET_CREATION_RESULT, GuideTicketCreationResultMessageEvent); + this._events.set(IncomingHeader.GUIDE_TICKET_RESOLUTION, GuideTicketResolutionMessageEvent); + this._events.set(IncomingHeader.GUIDE_REPORTING_STATUS, GuideReportingStatusMessageEvent); + this._events.set(IncomingHeader.HOTEL_MERGE_NAME_CHANGE, HotelMergeNameChangeEvent); + this._events.set(IncomingHeader.ISSUE_CLOSE_NOTIFICATION, IssueCloseNotificationMessageEvent); + this._events.set(IncomingHeader.QUIZ_DATA, QuizDataMessageEvent); + this._events.set(IncomingHeader.QUIZ_RESULTS, QuizResultsMessageEvent); + this._events.set(IncomingHeader.CHAT_REVIEW_SESSION_DETACHED, ChatReviewSessionDetachedMessageEvent); + this._events.set(IncomingHeader.CHAT_REVIEW_SESSION_OFFERED_TO_GUIDE, ChatReviewSessionOfferedToGuideMessageEvent); + this._events.set(IncomingHeader.CHAT_REVIEW_SESSION_RESULTS, ChatReviewSessionResultsMessageEvent); + this._events.set(IncomingHeader.CHAT_REVIEW_SESSION_STARTED, ChatReviewSessionStartedMessageEvent); + this._events.set(IncomingHeader.CHAT_REVIEW_SESSION_VOTING_STATUS, ChatReviewSessionVotingStatusMessageEvent); + + // INVENTORY + this._events.set(IncomingHeader.ACHIEVEMENT_PROGRESSED, AchievementEvent); + this._events.set(IncomingHeader.ACHIEVEMENT_LIST, AchievementsEvent); + this._events.set(IncomingHeader.USER_ACHIEVEMENT_SCORE, AchievementsScoreEvent); + this._events.set(IncomingHeader.USER_EFFECT_ACTIVATE, AvatarEffectActivatedEvent); + this._events.set(IncomingHeader.USER_EFFECT_LIST_ADD, AvatarEffectAddedEvent); + this._events.set(IncomingHeader.USER_EFFECT_LIST_REMOVE, AvatarEffectExpiredEvent); + this._events.set(IncomingHeader.USER_EFFECT_LIST, AvatarEffectsEvent); + this._events.set(IncomingHeader.AVATAR_EFFECT_SELECTED, AvatarEffectSelectedEvent); + this._events.set(IncomingHeader.USER_BADGES, BadgesEvent); + this._events.set(IncomingHeader.USER_BADGES_ADD, BadgeReceivedEvent); + this._events.set(IncomingHeader.BADGE_POINT_LIMITS, BadgePointLimitsEvent); + this._events.set(IncomingHeader.BADGE_REQUEST_FULFILLED, IsBadgeRequestFulfilledEvent); + this._events.set(IncomingHeader.USER_CLOTHING, FigureSetIdsMessageEvent); + this._events.set(IncomingHeader.USER_FURNITURE_ADD, FurnitureListAddOrUpdateEvent); + this._events.set(IncomingHeader.USER_FURNITURE, FurnitureListEvent); + this._events.set(IncomingHeader.USER_FURNITURE_REFRESH, FurnitureListInvalidateEvent); + this._events.set(IncomingHeader.USER_FURNITURE_REMOVE, FurnitureListRemovedEvent); + this._events.set(IncomingHeader.USER_FURNITURE_POSTIT_PLACED, FurniturePostItPlacedEvent); + this._events.set(IncomingHeader.USER_PETS, PetInventoryEvent); + this._events.set(IncomingHeader.USER_PET_REMOVE, PetRemovedFromInventory); + this._events.set(IncomingHeader.USER_PET_ADD, PetAddedToInventoryEvent); + this._events.set(IncomingHeader.PET_RECEIVED, PetReceivedMessageEvent); + this._events.set(IncomingHeader.PET_PLACING_ERROR, PetPlacingErrorEvent); + this._events.set(IncomingHeader.YOUTUBE_CONTROL_VIDEO, YoutubeControlVideoMessageEvent); + this._events.set(IncomingHeader.YOUTUBE_DISPLAY_PLAYLISTS, YoutubeDisplayPlaylistsEvent); + this._events.set(IncomingHeader.YOUTUBE_DISPLAY_VIDEO, YoutubeDisplayVideoMessageEvent); + + // TRADING + this._events.set(IncomingHeader.TRADE_ACCEPTED, TradingAcceptEvent); + this._events.set(IncomingHeader.TRADE_CLOSED, TradingCloseEvent); + this._events.set(IncomingHeader.TRADE_COMPLETED, TradingCompletedEvent); + this._events.set(IncomingHeader.TRADE_CONFIRMATION, TradingConfirmationEvent); + this._events.set(IncomingHeader.TRADE_LIST_ITEM, TradingListItemEvent); + this._events.set(IncomingHeader.TRADE_NOT_OPEN, TradingNotOpenEvent); + this._events.set(IncomingHeader.TRADE_OPEN_FAILED, TradingOpenFailedEvent); + this._events.set(IncomingHeader.TRADE_OPEN, TradingOpenEvent); + this._events.set(IncomingHeader.TRADE_OTHER_NOT_ALLOWED, TradingOtherNotAllowedEvent); + this._events.set(IncomingHeader.TRADE_YOU_NOT_ALLOWED, TradingYouAreNotAllowedEvent); + this._events.set(IncomingHeader.TRADE_NO_SUCH_ITEM, TradingNoSuchItemEvent); + + // LANDING VIEW + this._events.set(IncomingHeader.COMMUNITY_GOAL_VOTE_EVENT, CommunityGoalVoteMessageEvent); + this._events.set(IncomingHeader.PROMO_ARTICLES, PromoArticlesMessageEvent); + + // MARKETPLACE + this._events.set(IncomingHeader.MARKETPLACE_AFTER_ORDER_STATUS, MarketplaceBuyOfferResultEvent); + this._events.set(IncomingHeader.MARKETPLACE_CANCEL_SALE, MarketplaceCancelOfferResultEvent); + this._events.set(IncomingHeader.MARKETPLACE_SELL_ITEM, MarketplaceCanMakeOfferResult); + this._events.set(IncomingHeader.MARKETPLACE_CONFIG, MarketplaceConfigurationEvent); + this._events.set(IncomingHeader.MARKETPLACE_ITEM_STATS, MarketplaceItemStatsEvent); + this._events.set(IncomingHeader.MARKETPLACE_ITEM_POSTED, MarketplaceMakeOfferResult); + this._events.set(IncomingHeader.MARKETPLACE_ITEMS_SEARCHED, MarketPlaceOffersEvent); + this._events.set(IncomingHeader.MARKETPLACE_OWN_ITEMS, MarketplaceOwnOffersEvent); + + // MODERATION + this._events.set(IncomingHeader.USER_BANNED, UserBannedMessageEvent); + this._events.set(IncomingHeader.MODERATION_CAUTION, ModeratorCautionEvent); + this._events.set(IncomingHeader.MODTOOL_ROOM_INFO, ModeratorRoomInfoEvent); + this._events.set(IncomingHeader.MODTOOL_USER_CHATLOG, UserChatlogEvent); + this._events.set(IncomingHeader.MODTOOL_ROOM_CHATLOG, RoomChatlogEvent); + this._events.set(IncomingHeader.MODERATION_USER_INFO, ModeratorUserInfoEvent); + this._events.set(IncomingHeader.MODERATION_TOOL, ModeratorInitMessageEvent); + this._events.set(IncomingHeader.MODTOOL_VISITED_ROOMS_USER, RoomVisitsEvent); + this._events.set(IncomingHeader.CFH_CHATLOG, CfhChatlogEvent); + this._events.set(IncomingHeader.ISSUE_DELETED, IssueDeletedMessageEvent); + this._events.set(IncomingHeader.ISSUE_INFO, IssueInfoMessageEvent); + this._events.set(IncomingHeader.ISSUE_PICK_FAILED, IssuePickFailedMessageEvent); + this._events.set(IncomingHeader.MODERATOR_ACTION_RESULT, ModeratorActionResultMessageEvent); + this._events.set(IncomingHeader.MODERATOR_MESSAGE, ModeratorMessageEvent); + this._events.set(IncomingHeader.MODERATOR_TOOL_PREFERENCES, ModeratorToolPreferencesEvent); + + // MYSTERY BOX + this._events.set(IncomingHeader.MYSTERY_BOX_KEYS, MysteryBoxKeysEvent); + this._events.set(IncomingHeader.GOTMYSTERYBOXPRIZEMESSAGE, GotMysteryBoxPrizeMessageEvent); + this._events.set(IncomingHeader.CANCELMYSTERYBOXWAITMESSAGE, CancelMysteryBoxWaitMessageEvent); + this._events.set(IncomingHeader.SHOWMYSTERYBOXWAITMESSAGE, ShowMysteryBoxWaitMessageEvent); + + // NAVIGATOR + this._events.set(IncomingHeader.CAN_CREATE_ROOM, CanCreateRoomEvent); + this._events.set(IncomingHeader.CAN_CREATE_ROOM_EVENT, CanCreateRoomEventEvent); + this._events.set(IncomingHeader.CATEGORIES_WITH_VISITOR_COUNT, CategoriesWithVisitorCountEvent); + this._events.set(IncomingHeader.COMPETITION_ROOMS_DATA, CompetitionRoomsDataMessageEvent); + this._events.set(IncomingHeader.CONVERTED_ROOM_ID, ConvertedRoomIdEvent); + this._events.set(IncomingHeader.ROOM_DOORBELL, DoorbellMessageEvent); + this._events.set(IncomingHeader.USER_FAVORITE_ROOM, FavouriteChangedEvent); + this._events.set(IncomingHeader.USER_FAVORITE_ROOM_COUNT, FavouritesEvent); + this._events.set(IncomingHeader.ROOM_DOORBELL_REJECTED, FlatAccessDeniedMessageEvent); + this._events.set(IncomingHeader.ROOM_CREATED, FlatCreatedEvent); + this._events.set(IncomingHeader.ROOM_INFO, GetGuestRoomResultEvent); + this._events.set(IncomingHeader.GUEST_ROOM_SEARCH_RESULT, GuestRoomSearchResultEvent); + this._events.set(IncomingHeader.USER_HOME_ROOM, NavigatorHomeRoomEvent); + this._events.set(IncomingHeader.ROOM_EVENT_CANCEL, RoomEventCancelEvent); + this._events.set(IncomingHeader.ROOM_EVENT, RoomEventEvent); + this._events.set(IncomingHeader.ROOM_INFO_UPDATED, RoomSettingsUpdatedEvent); + this._events.set(IncomingHeader.THUMBNAIL_UPDATE_RESULT, RoomThumbnailUpdateResultEvent); + this._events.set(IncomingHeader.NAVIGATOR_EVENT_CATEGORIES, UserEventCatsEvent); + this._events.set(IncomingHeader.NAVIGATOR_CATEGORIES, UserFlatCatsEvent); + + this._events.set(IncomingHeader.NAVIGATOR_COLLAPSED, NavigatorCollapsedEvent); + this._events.set(IncomingHeader.NAVIGATOR_LIFTED, NavigatorLiftedEvent); + this._events.set(IncomingHeader.NAVIGATOR_METADATA, NavigatorMetadataEvent); + this._events.set(IncomingHeader.NAVIGATOR_OPEN_ROOM_CREATOR, NavigatorOpenRoomCreatorEvent); + this._events.set(IncomingHeader.NAVIGATOR_SEARCHES, NavigatorSearchesEvent); + this._events.set(IncomingHeader.NAVIGATOR_SEARCH, NavigatorSearchEvent); + this._events.set(IncomingHeader.NAVIGATOR_SETTINGS, NavigatorSettingsEvent); + + // NOTIFICATIONS + this._events.set(IncomingHeader.GENERIC_ALERT, HabboBroadcastMessageEvent); + this._events.set(IncomingHeader.MOTD_MESSAGES, MOTDNotificationEvent); + this._events.set(IncomingHeader.NOTIFICATION_LIST, NotificationDialogMessageEvent); + this._events.set(IncomingHeader.UNSEEN_ITEMS, UnseenItemsEvent); + this._events.set(IncomingHeader.ACHIEVEMENT_NOTIFICATION, AchievementNotificationMessageEvent); + this._events.set(IncomingHeader.INFO_FEED_ENABLE, InfoFeedEnableMessageEvent); + this._events.set(IncomingHeader.CLUB_GIFT_NOTIFICATION, ClubGiftNotificationEvent); + this._events.set(IncomingHeader.ACTIVITY_POINT_NOTIFICATION, ActivityPointNotificationMessageEvent); + this._events.set(IncomingHeader.BOT_ERROR, BotErrorEvent); + this._events.set(IncomingHeader.PET_LEVEL_NOTIFICATION, PetLevelNotificationEvent); + this._events.set(IncomingHeader.NOTIFICATION_OFFER_REWARD_DELIVERED, OfferRewardDeliveredMessageEvent); + this._events.set(IncomingHeader.NOTIFICATION_SIMPLE_ALERT, SimpleAlertMessageEvent); + this._events.set(IncomingHeader.NOTIFICATION_ELEMENT_POINTER, ElementPointerMessageEvent); + + // PERK + this._events.set(IncomingHeader.USER_PERKS, PerkAllowancesMessageEvent); + + // PETS + this._events.set(IncomingHeader.PET_TRAINING_PANEL, PetTrainingPanelMessageEvent); + this._events.set(IncomingHeader.PET_LEVEL_UPDATE, PetLevelUpdateMessageEvent); + this._events.set(IncomingHeader.PET_SCRATCH_FAILED, PetScratchFailedMessageEvent); + this._events.set(IncomingHeader.PET_OPEN_PACKAGE_REQUESTED, OpenPetPackageRequestedMessageEvent); + this._events.set(IncomingHeader.PET_OPEN_PACKAGE_RESULT, OpenPetPackageResultMessageEvent); + this._events.set(IncomingHeader.PET_BREEDING_RESULT, PetBreedingResultEvent); + + // POLL + this._events.set(IncomingHeader.QUESTION, QuestionEvent); + this._events.set(IncomingHeader.POLL_CONTENTS, PollContentsEvent); + this._events.set(IncomingHeader.POLL_ERROR, PollErrorEvent); + this._events.set(IncomingHeader.POLL_OFFER, PollOfferEvent); + this._events.set(IncomingHeader.POLL_START_ROOM, StartRoomPollEvent); + this._events.set(IncomingHeader.QUESTION_ANSWERED, QuestionAnsweredEvent); + this._events.set(IncomingHeader.QUESTION_FINISHED, QuestionFinishedEvent); + this._events.set(IncomingHeader.POLL_ROOM_RESULT, RoomPollResultEvent); + + // QUEST + this._events.set(IncomingHeader.COMMUNITY_GOAL_EARNED_PRIZES, CommunityGoalEarnedPrizesMessageEvent); + this._events.set(IncomingHeader.COMMUNITY_GOAL_PROGRESS, CommunityGoalProgressMessageEvent); + this._events.set(IncomingHeader.CONCURRENT_USERS_GOAL_PROGRESS, ConcurrentUsersGoalProgressMessageEvent); + this._events.set(IncomingHeader.QUEST_DAILY, QuestDailyMessageEvent); + this._events.set(IncomingHeader.QUEST_CANCELLED, QuestCancelledMessageEvent); + this._events.set(IncomingHeader.QUEST_COMPLETED, QuestCompletedMessageEvent); + this._events.set(IncomingHeader.COMMUNITY_GOAL_HALL_OF_FAME, CommunityGoalHallOfFameMessageEvent); + this._events.set(IncomingHeader.EPIC_POPUP, EpicPopupMessageEvent); + this._events.set(IncomingHeader.SEASONAL_QUESTS, SeasonalQuestsMessageEvent); + this._events.set(IncomingHeader.QUESTS, QuestsMessageEvent); + this._events.set(IncomingHeader.QUEST, QuestMessageEvent); + + // ROOM + this._events.set(IncomingHeader.ROOM_ENTER_ERROR, RoomEnterErrorEvent); + this._events.set(IncomingHeader.ROOM_ENTER, RoomEnterEvent); + this._events.set(IncomingHeader.ROOM_FORWARD, RoomForwardEvent); + this._events.set(IncomingHeader.ROOM_DOORBELL_ACCEPTED, RoomDoorbellAcceptedEvent); + this._events.set(IncomingHeader.ROOM_RIGHTS_CLEAR, RoomRightsClearEvent); + this._events.set(IncomingHeader.ROOM_RIGHTS_OWNER, RoomRightsOwnerEvent); + this._events.set(IncomingHeader.ROOM_RIGHTS, RoomRightsEvent); + this._events.set(IncomingHeader.BOT_COMMAND_CONFIGURATION, BotCommandConfigurationEvent); + this._events.set(IncomingHeader.BOT_SKILL_LIST_UPDATE, BotSkillListUpdateEvent); + this._events.set(IncomingHeader.BOT_FORCE_OPEN_CONTEXT_MENU, BotForceOpenContextMenuEvent); + this._events.set(IncomingHeader.ROOM_SETTINGS_CHAT, RoomChatSettingsEvent); + this._events.set(IncomingHeader.ROOM_INFO_OWNER, RoomEntryInfoMessageEvent); + this._events.set(IncomingHeader.ROOM_SCORE, RoomScoreEvent); + this._events.set(IncomingHeader.ROOM_ROLLING, ObjectsRollingEvent); + this._events.set(IncomingHeader.FURNITURE_FLOOR_ADD, FurnitureFloorAddEvent); + this._events.set(IncomingHeader.FURNITURE_FLOOR, FurnitureFloorEvent); + this._events.set(IncomingHeader.FURNITURE_FLOOR_REMOVE, FurnitureFloorRemoveEvent); + this._events.set(IncomingHeader.FURNITURE_FLOOR_UPDATE, FurnitureFloorUpdateEvent); + this._events.set(IncomingHeader.ITEM_WALL_ADD, FurnitureWallAddEvent); + this._events.set(IncomingHeader.ITEM_WALL, FurnitureWallEvent); + this._events.set(IncomingHeader.ITEM_WALL_REMOVE, FurnitureWallRemoveEvent); + this._events.set(IncomingHeader.ITEM_WALL_UPDATE, FurnitureWallUpdateEvent); + this._events.set(IncomingHeader.FURNITURE_ALIASES, FurnitureAliasesEvent); + this._events.set(IncomingHeader.FURNITURE_DATA, FurnitureDataEvent); + this._events.set(IncomingHeader.FURNITURE_ITEMDATA, ItemDataUpdateMessageEvent); + this._events.set(IncomingHeader.ITEM_STACK_HELPER, FurnitureStackHeightEvent); + this._events.set(IncomingHeader.FURNITURE_STATE, OneWayDoorStatusMessageEvent); + this._events.set(IncomingHeader.ITEM_DIMMER_SETTINGS, RoomDimmerPresetsEvent); + this._events.set(IncomingHeader.FURNITURE_STATE_2, DiceValueMessageEvent); + this._events.set(IncomingHeader.LOVELOCK_FURNI_FINISHED, LoveLockFurniFinishedEvent); + this._events.set(IncomingHeader.LOVELOCK_FURNI_FRIEND_COMFIRMED, LoveLockFurniFriendConfirmedEvent); + this._events.set(IncomingHeader.LOVELOCK_FURNI_START, LoveLockFurniStartEvent); + this._events.set(IncomingHeader.OBJECTS_DATA_UPDATE, ObjectsDataUpdateEvent); + this._events.set(IncomingHeader.FURNITURE_GROUP_CONTEXT_MENU_INFO, GroupFurniContextMenuInfoMessageEvent); + this._events.set(IncomingHeader.FURNITURE_POSTIT_STICKY_POLE_OPEN, RequestSpamWallPostItMessageEvent); + this._events.set(IncomingHeader.ROOM_SPECTATOR, YouAreSpectatorMessageEvent); + this._events.set(IncomingHeader.CUSTOM_USER_NOTIFICATION, CustomUserNotificationMessageEvent); + this._events.set(IncomingHeader.ROOM_MESSAGE_NOTIFICATION, RoomMessageNotificationMessageEvent); + this._events.set(IncomingHeader.ROOM_POPULAR_TAGS_RESULT, PopularRoomTagsResultEvent); + + // ROOM SETTINGS + this._events.set(IncomingHeader.ROOM_RIGHTS_LIST, FlatControllersEvent); + this._events.set(IncomingHeader.ROOM_RIGHTS_LIST_ADD, FlatControllerAddedEvent); + this._events.set(IncomingHeader.ROOM_RIGHTS_LIST_REMOVE, FlatControllerRemovedEvent); + this._events.set(IncomingHeader.ROOM_BAN_LIST, BannedUsersFromRoomEvent); + + this._events.set(IncomingHeader.ROOM_SETTINGS_SAVE_ERROR, RoomSettingsSaveErrorEvent); + this._events.set(IncomingHeader.ROOM_SETTINGS, RoomSettingsDataEvent); + this._events.set(IncomingHeader.ROOM_SETTINGS_SAVE, RoomSettingsSavedEvent); + this._events.set(IncomingHeader.ROOM_SETTINGS_ERROR, RoomSettingsErrorEvent); + this._events.set(IncomingHeader.SHOW_ENFORCE_ROOM_CATEGORY, ShowEnforceRoomCategoryDialogEvent); + this._events.set(IncomingHeader.ROOM_BAN_REMOVE, UserUnbannedFromRoomEvent); + + this._events.set(IncomingHeader.ROOM_MUTED, MuteAllInRoomEvent); + this._events.set(IncomingHeader.NO_SUCH_FLAT, NoSuchFlatEvent); + + this._events.set(IncomingHeader.FAVORITE_GROUP_UDPATE, FavoriteMembershipUpdateMessageEvent); + + // MAPPING + this._events.set(IncomingHeader.ROOM_MODEL_DOOR, RoomEntryTileMessageEvent); + this._events.set(IncomingHeader.ROOM_HEIGHT_MAP, RoomHeightMapEvent); + this._events.set(IncomingHeader.ROOM_HEIGHT_MAP_UPDATE, RoomHeightMapUpdateEvent); + this._events.set(IncomingHeader.ROOM_MODEL, FloorHeightMapEvent); + this._events.set(IncomingHeader.ROOM_MODEL_NAME, RoomReadyMessageEvent); + this._events.set(IncomingHeader.ROOM_PAINT, RoomPaintEvent); + this._events.set(IncomingHeader.ROOM_THICKNESS, RoomVisualizationSettingsEvent); + this._events.set(IncomingHeader.ROOM_GET_FILTER_WORDS, RoomFilterSettingsMessageEvent); + this._events.set(IncomingHeader.ROOM_MODEL_BLOCKED_TILES, RoomOccupiedTilesMessageEvent); + this._events.set(IncomingHeader.PET_FIGURE_UPDATE, PetFigureUpdateEvent); + this._events.set(IncomingHeader.PET_INFO, PetInfoEvent); + this._events.set(IncomingHeader.PET_STATUS, PetStatusUpdateEvent); + this._events.set(IncomingHeader.PET_EXPERIENCE, PetExperienceEvent); + this._events.set(IncomingHeader.PLAYING_GAME, YouArePlayingGameEvent); + this._events.set(IncomingHeader.UNIT_DANCE, RoomUnitDanceEvent); + this._events.set(IncomingHeader.UNIT_EFFECT, RoomUnitEffectEvent); + this._events.set(IncomingHeader.UNIT, RoomUnitEvent); + this._events.set(IncomingHeader.UNIT_EXPRESSION, RoomUnitExpressionEvent); + this._events.set(IncomingHeader.UNIT_HAND_ITEM, RoomUnitHandItemEvent); + this._events.set(IncomingHeader.UNIT_IDLE, RoomUnitIdleEvent); + this._events.set(IncomingHeader.UNIT_INFO, RoomUnitInfoEvent); + this._events.set(IncomingHeader.UNIT_NUMBER, RoomUnitNumberEvent); + this._events.set(IncomingHeader.UNIT_REMOVE, RoomUnitRemoveEvent); + this._events.set(IncomingHeader.UNIT_STATUS, RoomUnitStatusEvent); + this._events.set(IncomingHeader.HAND_ITEM_RECEIVED, RoomUnitHandItemReceivedEvent); + this._events.set(IncomingHeader.FLOOD_CONTROL, FloodControlEvent); + this._events.set(IncomingHeader.REMAINING_MUTE, RemainingMuteEvent); + this._events.set(IncomingHeader.UNIT_CHAT, RoomUnitChatEvent); + this._events.set(IncomingHeader.UNIT_CHAT_SHOUT, RoomUnitChatShoutEvent); + this._events.set(IncomingHeader.UNIT_CHAT_WHISPER, RoomUnitChatWhisperEvent); + this._events.set(IncomingHeader.UNIT_TYPING, RoomUnitTypingEvent); + + // ROOM EVENTS + this._events.set(IncomingHeader.WIRED_ACTION, WiredFurniActionEvent); + this._events.set(IncomingHeader.WIRED_CONDITION, WiredFurniConditionEvent); + this._events.set(IncomingHeader.WIRED_TRIGGER, WiredFurniTriggerEvent); + this._events.set(IncomingHeader.WIRED_OPEN, WiredOpenEvent); + this._events.set(IncomingHeader.WIRED_REWARD, WiredRewardResultMessageEvent); + this._events.set(IncomingHeader.WIRED_SAVE, WiredSaveSuccessEvent); + this._events.set(IncomingHeader.WIRED_ERROR, WiredValidationErrorEvent); + + // SECURITY + this._events.set(IncomingHeader.AUTHENTICATED, AuthenticatedEvent); + + // SOUNDS + this._events.set(IncomingHeader.JUKEBOX_PLAYLIST_FULL, JukeboxPlayListFullMessageEvent); + this._events.set(IncomingHeader.JUKEBOX_SONG_DISKS, JukeboxSongDisksMessageEvent); + this._events.set(IncomingHeader.NOW_PLAYING, NowPlayingMessageEvent); + this._events.set(IncomingHeader.OFFICIAL_SONG_ID, OfficialSongIdMessageEvent); + this._events.set(IncomingHeader.PLAYLIST, PlayListMessageEvent); + this._events.set(IncomingHeader.PLAYLIST_SONG_ADDED, PlayListSongAddedMessageEvent); + this._events.set(IncomingHeader.TRAX_SONG_INFO, TraxSongInfoMessageEvent); + this._events.set(IncomingHeader.USER_SONG_DISKS_INVENTORY, UserSongDisksInventoryMessageEvent); + + // TALENT + this._events.set(IncomingHeader.HELPER_TALENT_TRACK, TalentTrackMessageEvent); + this._events.set(IncomingHeader.TALENT_TRACK_LEVEL, TalentTrackLevelMessageEvent); + this._events.set(IncomingHeader.TALENT_TRACK_LEVEL_UP, TalentLevelUpEvent); + + // USER + this._events.set(IncomingHeader.IN_CLIENT_LINK, InClientLinkEvent); + this._events.set(IncomingHeader.USER_IGNORED, IgnoredUsersEvent); + this._events.set(IncomingHeader.USER_IGNORED_RESULT, IgnoreResultEvent); + this._events.set(IncomingHeader.USER_RESPECT, RespectReceivedEvent); + this._events.set(IncomingHeader.USER_PERMISSIONS, UserPermissionsEvent); + this._events.set(IncomingHeader.USER_BADGES_CURRENT, UserCurrentBadgesEvent); + this._events.set(IncomingHeader.USER_INFO, UserInfoEvent); + this._events.set(IncomingHeader.UNIT_CHANGE_NAME, UserNameChangeMessageEvent); + this._events.set(IncomingHeader.USER_SETTINGS, UserSettingsEvent); + this._events.set(IncomingHeader.USER_PROFILE, UserProfileEvent); + this._events.set(IncomingHeader.MESSENGER_RELATIONSHIPS, RelationshipStatusInfoEvent); + this._events.set(IncomingHeader.GIFT_OPENED, PresentOpenedMessageEvent); + this._events.set(IncomingHeader.USER_CREDITS, UserCreditsEvent); + this._events.set(IncomingHeader.USER_CURRENCY, UserCurrencyEvent); + this._events.set(IncomingHeader.USER_SUBSCRIPTION, UserSubscriptionEvent); + this._events.set(IncomingHeader.USER_WARDROBE_PAGE, UserWardrobePageEvent); + this._events.set(IncomingHeader.USER_CLASSIFICATION, UserClassificationMessageEvent); + this._events.set(IncomingHeader.GET_USER_TAGS, UserTagsMessageEvent); + this._events.set(IncomingHeader.SCR_SEND_KICKBACK_INFO, ScrSendKickbackInfoMessageEvent); + this._events.set(IncomingHeader.PET_RESPECTED, PetRespectNoficationEvent); + this._events.set(IncomingHeader.PET_SUPPLEMENT, PetSupplementedNotificationEvent); + this._events.set(IncomingHeader.ACCOUNT_SAFETY_LOCK_STATUS_CHANGE, AccountSafetyLockStatusChangeMessageEvent); + + this._events.set(IncomingHeader.GENERIC_ERROR, GenericErrorEvent); + this._events.set(IncomingHeader.GROUP_LIST, GuildMembershipsMessageEvent); + this._events.set(IncomingHeader.CATALOG_APPROVE_NAME_RESULT, ApproveNameMessageEvent); + this._events.set(IncomingHeader.CONNECTION_ERROR, ConnectionErrorEvent); + + // GUILD + this._events.set(IncomingHeader.GUILD_EDIT_FAILED, GuildEditFailedMessageEvent); + this._events.set(IncomingHeader.GUILD_MEMBER_MGMT_FAILED, GuildMemberMgmtFailedMessageEvent); + this._events.set(IncomingHeader.EXTENDED_PROFILE_CHANGED, ExtendedProfileChangedMessageEvent); + + // HANDSHAKE + this._events.set(IncomingHeader.NOOBNESS_LEVEL, NoobnessLevelMessageEvent); + this._events.set(IncomingHeader.DISCONNECT_REASON, DisconnectReasonEvent); + this._events.set(IncomingHeader.HANDSHAKE_INIT_DIFFIE, InitDiffieHandshakeEvent); + this._events.set(IncomingHeader.HANDSHAKE_COMPLETE_DIFFIE, CompleteDiffieHandshakeEvent); + this._events.set(IncomingHeader.HANDSHAKE_IDENTITY_ACCOUNT, IdentityAccountsEvent); + + // NUX + this._events.set(IncomingHeader.NEW_USER_EXPERIENCE_GIFT_OFFER, NewUserExperienceGiftOfferMessageEvent); + this._events.set(IncomingHeader.NEW_USER_EXPERIENCE_NOT_COMPLETE, NewUserExperienceNotCompleteEvent); + + // RESTORE CLIENT + this._events.set(IncomingHeader.RESTORE_CLIENT, RestoreClientMessageEvent); + + // FIREWORK + this._events.set(IncomingHeader.FIREWORK_CHARGE_DATA, FireworkChargeDataEvent); + + // PHONE + this._events.set(IncomingHeader.PHONE_COLLECTION_STATE, PhoneCollectionStateMessageEvent); + this._events.set(IncomingHeader.PHONE_TRY_NUMBER_RESULT, TryPhoneNumberResultMessageEvent); + this._events.set(IncomingHeader.PHONE_TRY_VERIFICATION_CODE_RESULT, TryVerificationCodeResultMessageEvent); + + // WELCOME + this._events.set(IncomingHeader.WELCOME_GIFT_CHANGE_EMAIL_RESULT, WelcomeGiftChangeEmailResultEvent); + this._events.set(IncomingHeader.WELCOME_GIFT_STATUS, WelcomeGiftStatusEvent); + // RENTABLE SPACE + this._events.set(IncomingHeader.RENTABLE_SPACE_RENT_OK, RentableSpaceRentOkMessageEvent); + this._events.set(IncomingHeader.RENTABLE_SPACE_STATUS, RentableSpaceStatusMessageEvent); + this._events.set(IncomingHeader.RENTABLE_SPACE_RENT_FAILED, RentableSpaceRentFailedMessageEvent); + // RECYCLER + this._events.set(IncomingHeader.RECYCLER_STATUS, RecyclerStatusMessageEvent); + this._events.set(IncomingHeader.RECYCLER_FINISHED, RecyclerFinishedMessageEvent); + // EMAIL + this._events.set(IncomingHeader.EMAIL_STATUS, EmailStatusResultEvent); + this._events.set(IncomingHeader.CHANGE_EMAIL_RESULT, ChangeEmailResultEvent); + + // RENTABLE FURNI + this._events.set(IncomingHeader.RENTABLE_FURNI_RENT_OR_BUYOUT_OFFER, FurniRentOrBuyoutOfferMessageEvent); + } + + private registerComposers(): void + { + // AUTHENTICATION + this._composers.set(OutgoingHeader.AUTHENTICATION, AuthenticationMessageComposer); + + // ADVERTISEMENT + this._composers.set(OutgoingHeader.INTERSTITIAL_SHOWN, InterstitialShownMessageComposer); + this._composers.set(OutgoingHeader.GET_INTERSTITIAL, GetInterstitialMessageComposer); + + // AVATAR + this._composers.set(OutgoingHeader.GET_WARDROBE, GetWardrobeMessageComposer); + this._composers.set(OutgoingHeader.SAVE_WARDROBE_OUTFIT, SaveWardrobeOutfitMessageComposer); + this._composers.set(OutgoingHeader.CHANGE_USERNAME, ChangeUserNameMessageComposer); + this._composers.set(OutgoingHeader.CHECK_USERNAME, CheckUserNameMessageComposer); + + // CAMERA + this._composers.set(OutgoingHeader.REQUEST_CAMERA_CONFIGURATION, RequestCameraConfigurationComposer); + this._composers.set(OutgoingHeader.RENDER_ROOM, RenderRoomMessageComposer); + this._composers.set(OutgoingHeader.RENDER_ROOM_THUMBNAIL, RenderRoomThumbnailMessageComposer); + this._composers.set(OutgoingHeader.PURCHASE_PHOTO, PurchasePhotoMessageComposer); + this._composers.set(OutgoingHeader.PUBLISH_PHOTO, PublishPhotoMessageComposer); + this._composers.set(OutgoingHeader.PHOTO_COMPETITION, PhotoCompetitionMessageComposer); + + // CAMPAIGN + this._composers.set(OutgoingHeader.OPEN_CAMPAIGN_CALENDAR_DOOR, OpenCampaignCalendarDoorComposer); + this._composers.set(OutgoingHeader.OPEN_CAMPAIGN_CALENDAR_DOOR_STAFF, OpenCampaignCalendarDoorAsStaffComposer); + + // CATALOG + this._composers.set(OutgoingHeader.BUILDERS_CLUB_PLACE_ROOM_ITEM, BuildersClubPlaceRoomItemMessageComposer); + this._composers.set(OutgoingHeader.BUILDERS_CLUB_PLACE_WALL_ITEM, BuildersClubPlaceWallItemMessageComposer); + this._composers.set(OutgoingHeader.BUILDERS_CLUB_QUERY_FURNI_COUNT, BuildersClubQueryFurniCountMessageComposer); + this._composers.set(OutgoingHeader.GET_CATALOG_INDEX, GetCatalogIndexComposer); + this._composers.set(OutgoingHeader.GET_CATALOG_PAGE, GetCatalogPageComposer); + this._composers.set(OutgoingHeader.CATALOG_PURCHASE, PurchaseFromCatalogComposer); + this._composers.set(OutgoingHeader.CATALOG_PURCHASE_GIFT, PurchaseFromCatalogAsGiftComposer); + this._composers.set(OutgoingHeader.GET_PRODUCT_OFFER, GetProductOfferComposer); + this._composers.set(OutgoingHeader.GET_CLUB_OFFERS, GetClubOffersMessageComposer); + this._composers.set(OutgoingHeader.GET_CLUB_GIFT_INFO, GetClubGiftInfo); + this._composers.set(OutgoingHeader.CATALOG_REDEEM_VOUCHER, RedeemVoucherMessageComposer); + this._composers.set(OutgoingHeader.GROUP_MEMBERSHIPS, CatalogGroupsComposer); + this._composers.set(OutgoingHeader.GET_GIFT_WRAPPING_CONFIG, GetGiftWrappingConfigurationComposer); + this._composers.set(OutgoingHeader.CATALOG_SELECT_VIP_GIFT, SelectClubGiftComposer); + this._composers.set(OutgoingHeader.CATALOG_REQUESET_PET_BREEDS, GetSellablePetPalettesComposer); + this._composers.set(OutgoingHeader.GET_BONUS_RARE_INFO, GetBonusRareInfoMessageComposer); + this._composers.set(OutgoingHeader.GET_BUNDLE_DISCOUNT_RULESET, GetBundleDiscountRulesetComposer); + this._composers.set(OutgoingHeader.GET_CATALOG_PAGE_EXPIRATION, GetCatalogPageExpirationComposer); + this._composers.set(OutgoingHeader.GET_CATALOG_PAGE_WITH_EARLIEST_EXP, GetCatalogPageWithEarliestExpiryComposer); + this._composers.set(OutgoingHeader.GET_DIRECT_CLUB_BUY_AVAILABLE, GetDirectClubBuyAvailableComposer); + this._composers.set(OutgoingHeader.GET_HABBO_BASIC_MEMBERSHIP_EXTEND_OFFER, GetHabboBasicMembershipExtendOfferComposer); + this._composers.set(OutgoingHeader.GET_HABBO_CLUB_EXTEND_OFFER, GetHabboClubExtendOfferMessageComposer); + this._composers.set(OutgoingHeader.GET_IS_OFFER_GIFTABLE, GetIsOfferGiftableComposer); + this._composers.set(OutgoingHeader.GET_LIMITED_OFFER_APPEARING_NEXT, GetLimitedOfferAppearingNextComposer); + this._composers.set(OutgoingHeader.GET_NEXT_TARGETED_OFFER, GetNextTargetedOfferComposer); + this._composers.set(OutgoingHeader.GET_ROOM_AD_PURCHASE_INFO, GetRoomAdPurchaseInfoComposer); + this._composers.set(OutgoingHeader.GET_SEASONAL_CALENDAR_DAILY_OFFER, GetSeasonalCalendarDailyOfferComposer); + this._composers.set(OutgoingHeader.GET_TARGETED_OFFER, GetTargetedOfferComposer); + this._composers.set(OutgoingHeader.MARK_CATALOG_NEW_ADDITIONS_PAGE_OPENED, MarkCatalogNewAdditionsPageOpenedComposer); + this._composers.set(OutgoingHeader.PURCHASE_BASIC_MEMBERSHIP_EXTENSION, PurchaseBasicMembershipExtensionComposer); + this._composers.set(OutgoingHeader.PURCHASE_ROOM_AD, PurchaseRoomAdMessageComposer); + this._composers.set(OutgoingHeader.PURCHASE_TARGETED_OFFER, PurchaseTargetedOfferComposer); + this._composers.set(OutgoingHeader.PURCHASE_VIP_MEMBERSHIP_EXTENSION, PurchaseVipMembershipExtensionComposer); + this._composers.set(OutgoingHeader.ROOM_AD_PURCHASE_INITIATED, RoomAdPurchaseInitiatedComposer); + this._composers.set(OutgoingHeader.SET_TARGETTED_OFFER_STATE, SetTargetedOfferStateComposer); + this._composers.set(OutgoingHeader.SHOP_TARGETED_OFFER_VIEWED, ShopTargetedOfferViewedComposer); + + // COMPETITION + this._composers.set(OutgoingHeader.FORWARD_TO_A_COMPETITION_ROOM, ForwardToACompetitionRoomMessageComposer); + this._composers.set(OutgoingHeader.FORWARD_TO_A_SUBMITTABLE_ROOM, ForwardToASubmittableRoomMessageComposer); + this._composers.set(OutgoingHeader.FORWARD_TO_RANDOM_COMPETITION_ROOM, ForwardToRandomCompetitionRoomMessageComposer); + this._composers.set(OutgoingHeader.GET_CURRENT_TIMING_CODE, GetCurrentTimingCodeMessageComposer); + this._composers.set(OutgoingHeader.GET_IS_USER_PART_OF_COMPETITION, GetIsUserPartOfCompetitionMessageComposer); + this._composers.set(OutgoingHeader.GET_SECONDS_UNTIL, GetSecondsUntilMessageComposer); + this._composers.set(OutgoingHeader.ROOM_COMPETITION_INIT, RoomCompetitionInitMessageComposer); + this._composers.set(OutgoingHeader.SUBMIT_ROOM_TO_COMPETITION, SubmitRoomToCompetitionMessageComposer); + this._composers.set(OutgoingHeader.VOTE_FOR_ROOM, VoteForRoomMessageComposer); + + // CRAFTING + this._composers.set(OutgoingHeader.CRAFT, CraftComposer); + this._composers.set(OutgoingHeader.CRAFT_SECRET, CraftSecretComposer); + this._composers.set(OutgoingHeader.GET_CRAFTABLE_PRODUCTS, GetCraftingRecipeComposer); + this._composers.set(OutgoingHeader.GET_CRAFTING_RECIPE, GetCraftableProductsComposer); + this._composers.set(OutgoingHeader.GET_CRAFTING_RECIPES_AVAILABLE, GetCraftingRecipesAvailableComposer); + + // FRIENDFURNI + this._composers.set(OutgoingHeader.FRIEND_FURNI_CONFIRM_LOCK, FriendFurniConfirmLockMessageComposer); + + // FRIENDLIST + this._composers.set(OutgoingHeader.ACCEPT_FRIEND, AcceptFriendMessageComposer); + this._composers.set(OutgoingHeader.DECLINE_FRIEND, DeclineFriendMessageComposer); + this._composers.set(OutgoingHeader.FIND_NEW_FRIENDS, FindNewFriendsMessageComposer); + this._composers.set(OutgoingHeader.FOLLOW_FRIEND, FollowFriendMessageComposer); + this._composers.set(OutgoingHeader.FRIEND_LIST_UPDATE, FriendListUpdateComposer); + this._composers.set(OutgoingHeader.GET_FRIEND_REQUESTS, GetFriendRequestsComposer); + this._composers.set(OutgoingHeader.HABBO_SEARCH, HabboSearchComposer); + this._composers.set(OutgoingHeader.MESSENGER_INIT, MessengerInitComposer); + this._composers.set(OutgoingHeader.REMOVE_FRIEND, RemoveFriendComposer); + this._composers.set(OutgoingHeader.REQUEST_FRIEND, RequestFriendComposer); + this._composers.set(OutgoingHeader.MESSENGER_CHAT, SendMessageComposer); + this._composers.set(OutgoingHeader.SEND_ROOM_INVITE, SendRoomInviteComposer); + this._composers.set(OutgoingHeader.SET_RELATIONSHIP_STATUS, SetRelationshipStatusComposer); + this._composers.set(OutgoingHeader.VISIT_USER, VisitUserComposer); + + // GAME + this._composers.set(OutgoingHeader.ACHIEVEMENT_RESOLUTION_OPEN, GetResolutionAchievementsMessageComposer); + this._composers.set(OutgoingHeader.ACCEPTGAMEINVITE, AcceptGameInviteMessageComposer); + this._composers.set(OutgoingHeader.GAMEUNLOADEDMESSAGE, GameUnloadedMessageComposer); + this._composers.set(OutgoingHeader.GETGAMEACHIEVEMENTSMESSAGE, GetGameAchievementsMessageComposer); + this._composers.set(OutgoingHeader.GAMES_LIST, GetGameListMessageComposer); + this._composers.set(OutgoingHeader.GETGAMESTATUSMESSAGE, GetGameStatusMessageComposer); + this._composers.set(OutgoingHeader.GETUSERGAMEACHIEVEMENTSMESSAGE, GetUserGameAchievementsMessageComposer); + this._composers.set(OutgoingHeader.JOINQUEUEMESSAGE, JoinQueueMessageComposer); + this._composers.set(OutgoingHeader.LEAVEQUEUEMESSAGE, LeaveQueueMessageComposer); + this._composers.set(OutgoingHeader.RESETRESOLUTIONACHIEVEMENTMESSAGE, ResetResolutionAchievementMessageComposer); + this._composers.set(OutgoingHeader.GAMES_INIT, GetWeeklyGameRewardComposer); + this._composers.set(OutgoingHeader.GETWEEKLYGAMEREWARDWINNERS, GetWeeklyGameRewardWinnersComposer); + this._composers.set(OutgoingHeader.GAME2GETACCOUNTGAMESTATUSMESSAGE, Game2GetAccountGameStatusMessageComposer); + this._composers.set(OutgoingHeader.GAME2CHECKGAMEDIRECTORYSTATUSMESSAGE, Game2CheckGameDirectoryStatusMessageComposer); + this._composers.set(OutgoingHeader.GAME2EXITGAMEMESSAGE, Game2ExitGameMessageComposer); + this._composers.set(OutgoingHeader.GAME2GAMECHATMESSAGE, Game2GameChatMessageComposer); + this._composers.set(OutgoingHeader.GAME2LOADSTAGEREADYMESSAGE, Game2LoadStageReadyMessageComposer); + this._composers.set(OutgoingHeader.GAME2PLAYAGAINMESSAGE, Game2PlayAgainMessageComposer); + this._composers.set(OutgoingHeader.GAME2REQUESTFULLSTATUSUPDATEMESSAGE, Game2RequestFullStatusUpdateMessageComposer); + this._composers.set(OutgoingHeader.GAME2GETWEEKLYFRIENDSLEADERBOARD, Game2GetWeeklyFriendsLeaderboardComposer); + this._composers.set(OutgoingHeader.GAME2GETWEEKLYLEADERBOARD, Game2GetWeeklyLeaderboardComposer); + + // GIFTS + this._composers.set(OutgoingHeader.GET_GIFT, GetGiftMessageComposer); + this._composers.set(OutgoingHeader.RESET_PHONE_NUMBER_STATE, ResetPhoneNumberStateMessageComposer); + this._composers.set(OutgoingHeader.SET_PHONE_NUMBER_VERIFICATION_STATUS, SetPhoneNumberVerificationStatusMessageComposer); + this._composers.set(OutgoingHeader.TRY_PHONE_NUMBER, TryPhoneNumberMessageComposer); + this._composers.set(OutgoingHeader.VERIFY_CODE, VerifyCodeMessageComposer); + + // GROUPFORUMS + this._composers.set(OutgoingHeader.GET_FORUM_STATS, GetForumStatsMessageComposer); + this._composers.set(OutgoingHeader.GET_FORUMS_LIST, GetForumsListMessageComposer); + this._composers.set(OutgoingHeader.GET_FORUM_MESSAGES, GetMessagesMessageComposer); + this._composers.set(OutgoingHeader.GET_FORUM_THREAD, GetThreadMessageComposer); + this._composers.set(OutgoingHeader.GET_FORUM_THREADS, GetThreadsMessageComposer); + this._composers.set(OutgoingHeader.GET_UNREAD_FORUMS_COUNT, GetUnreadForumsCountMessageComposer); + this._composers.set(OutgoingHeader.FORUM_MODERATE_MESSAGE, ModerateMessageMessageComposer); + this._composers.set(OutgoingHeader.FORUM_MODERATE_THREAD, ModerateThreadMessageComposer); + this._composers.set(OutgoingHeader.FORUM_POST_MESSAGE, PostMessageMessageComposer); + this._composers.set(OutgoingHeader.UPDATE_FORUM_READ_MARKER, UpdateForumReadMarkerMessageComposer); + this._composers.set(OutgoingHeader.UPDATE_FORUM_SETTINGS, UpdateForumSettingsMessageComposer); + this._composers.set(OutgoingHeader.FORUM_UPDATE_THREAD, UpdateThreadMessageComposer); + + // HANDSHAKE + this._composers.set(OutgoingHeader.CLIENT_PONG, PongMessageComposer); + this._composers.set(OutgoingHeader.RELEASE_VERSION, ClientHelloMessageComposer); + this._composers.set(OutgoingHeader.SECURITY_TICKET, SSOTicketMessageComposer); + this._composers.set(OutgoingHeader.USER_INFO, InfoRetrieveMessageComposer); + this._composers.set(OutgoingHeader.DISCONNECT, DisconnectMessageComposer); + this._composers.set(OutgoingHeader.SECURITY_MACHINE, UniqueIDMessageComposer); + this._composers.set(OutgoingHeader.CLIENT_VARIABLES, VersionCheckMessageComposer); + this._composers.set(OutgoingHeader.HANDSHAKE_INIT_DIFFIE, InitDiffieHandshakeMessageComposer); + this._composers.set(OutgoingHeader.HANDSHAKE_COMPLETE_DIFFIE, CompleteDiffieHandshakeMessageComposer); + + // HELP + this._composers.set(OutgoingHeader.CALL_FOR_HELP_FROM_FORUM_MESSAGE, CallForHelpFromForumMessageMessageComposer); + this._composers.set(OutgoingHeader.CALL_FOR_HELP_FROM_FORUM_THREAD, CallForHelpFromForumThreadMessageComposer); + this._composers.set(OutgoingHeader.CALL_FOR_HELP_FROM_IM, CallForHelpFromIMMessageComposer); + this._composers.set(OutgoingHeader.CALL_FOR_HELP_FROM_PHOTO, CallForHelpFromPhotoMessageComposer); + this._composers.set(OutgoingHeader.CALL_FOR_HELP_FROM_SELFIE, CallForHelpFromSelfieMessageComposer); + this._composers.set(OutgoingHeader.CALL_FOR_HELP, CallForHelpMessageComposer); + this._composers.set(OutgoingHeader.CHAT_REVIEW_GUIDE_DECIDES, ChatReviewGuideDecidesOnOfferMessageComposer); + this._composers.set(OutgoingHeader.CHAT_REVIEW_GUIDE_DETACHED, ChatReviewGuideDetachedMessageComposer); + this._composers.set(OutgoingHeader.CHAT_REVIEW_GUIDE_VOTE, ChatReviewGuideVoteMessageComposer); + this._composers.set(OutgoingHeader.CHAT_REVIEW_SESSION_CREATE, ChatReviewSessionCreateMessageComposer); + this._composers.set(OutgoingHeader.DELETE_PENDING_CALLS_FOR_HELP, DeletePendingCallsForHelpMessageComposer); + this._composers.set(OutgoingHeader.GET_CFH_STATUS, GetCfhStatusMessageComposer); + this._composers.set(OutgoingHeader.GET_FAQ_CATEGORY, GetFaqCategoryMessageComposer); + this._composers.set(OutgoingHeader.GET_FAQ_TEXT, GetFaqTextMessageComposer); + this._composers.set(OutgoingHeader.GET_GUIDE_REPORTING_STATUS, GetGuideReportingStatusMessageComposer); + this._composers.set(OutgoingHeader.GET_PENDING_CALLS_FOR_HELP, GetPendingCallsForHelpMessageComposer); + this._composers.set(OutgoingHeader.GET_QUIZ_QUESTIONS, GetQuizQuestionsComposer); + this._composers.set(OutgoingHeader.GUIDE_SESSION_CREATE, GuideSessionCreateMessageComposer); + this._composers.set(OutgoingHeader.GUIDE_SESSION_FEEDBACK, GuideSessionFeedbackMessageComposer); + this._composers.set(OutgoingHeader.GUIDE_SESSION_GET_REQUESTER_ROOM, GuideSessionGetRequesterRoomMessageComposer); + this._composers.set(OutgoingHeader.GUIDE_SESSION_GUIDE_DECIDES, GuideSessionGuideDecidesMessageComposer); + this._composers.set(OutgoingHeader.GUIDE_SESSION_INVITE_REQUESTER, GuideSessionInviteRequesterMessageComposer); + this._composers.set(OutgoingHeader.GUIDE_SESSION_IS_TYPING, GuideSessionIsTypingMessageComposer); + this._composers.set(OutgoingHeader.GUIDE_SESSION_MESSAGE, GuideSessionMessageMessageComposer); + this._composers.set(OutgoingHeader.GUIDE_SESSION_ON_DUTY_UPDATE, GuideSessionOnDutyUpdateMessageComposer); + this._composers.set(OutgoingHeader.GUIDE_SESSION_REPORT, GuideSessionReportMessageComposer); + this._composers.set(OutgoingHeader.GUIDE_SESSION_REQUESTER_CANCELS, GuideSessionRequesterCancelsMessageComposer); + this._composers.set(OutgoingHeader.GUIDE_SESSION_RESOLVED, GuideSessionResolvedMessageComposer); + this._composers.set(OutgoingHeader.POST_QUIZ_ANSWERS, PostQuizAnswersComposer); + this._composers.set(OutgoingHeader.SEARCH_FAQS, SearchFaqsMessageComposer); + + // DESKTOP + this._composers.set(OutgoingHeader.DESKTOP_VIEW, DesktopViewComposer); + + // GROUP + this._composers.set(OutgoingHeader.GROUP_INFO, GroupInformationComposer); + this._composers.set(OutgoingHeader.GROUP_REQUEST, GroupJoinComposer); + this._composers.set(OutgoingHeader.GROUP_MEMBER_REMOVE_CONFIRM, GroupConfirmRemoveMemberComposer); + this._composers.set(OutgoingHeader.GROUP_MEMBER_REMOVE, GroupRemoveMemberComposer); + this._composers.set(OutgoingHeader.GROUP_MEMBERS, GroupMembersComposer); + this._composers.set(OutgoingHeader.GROUP_ADMIN_ADD, GroupAdminGiveComposer); + this._composers.set(OutgoingHeader.GROUP_ADMIN_REMOVE, GroupAdminTakeComposer); + this._composers.set(OutgoingHeader.GROUP_REQUEST_ACCEPT, GroupMembershipAcceptComposer); + this._composers.set(OutgoingHeader.GROUP_REQUEST_DECLINE, GroupMembershipDeclineComposer); + this._composers.set(OutgoingHeader.GROUP_DELETE, GroupDeleteComposer); + this._composers.set(OutgoingHeader.GROUP_CREATE_OPTIONS, GroupBuyDataComposer); + this._composers.set(OutgoingHeader.GROUP_PARTS, GroupBadgePartsComposer); + this._composers.set(OutgoingHeader.GROUP_BUY, GroupBuyComposer); + this._composers.set(OutgoingHeader.GROUP_SETTINGS, GroupSettingsComposer); + this._composers.set(OutgoingHeader.GROUP_SAVE_BADGE, GroupSaveBadgeComposer); + this._composers.set(OutgoingHeader.GROUP_SAVE_COLORS, GroupSaveColorsComposer); + this._composers.set(OutgoingHeader.GROUP_SAVE_INFORMATION, GroupSaveInformationComposer); + this._composers.set(OutgoingHeader.GROUP_SAVE_PREFERENCES, GroupSavePreferencesComposer); + this._composers.set(OutgoingHeader.GROUP_FAVORITE, GroupFavoriteComposer); + this._composers.set(OutgoingHeader.GROUP_UNFAVORITE, GroupUnfavoriteComposer); + this._composers.set(OutgoingHeader.GROUP_BADGES, GetHabboGroupBadgesMessageComposer); + this._composers.set(OutgoingHeader.APPROVE_ALL_MEMBERSHIP_REQUESTS, ApproveAllMembershipRequestsMessageComposer); + this._composers.set(OutgoingHeader.GROUP_UNBLOCK_MEMBER, UnblockGroupMemberMessageComposer); + + // NAVIGATOR + this._composers.set(OutgoingHeader.ROOM_FAVORITE, AddFavouriteRoomMessageComposer); + this._composers.set(OutgoingHeader.CAN_CREATE_ROOM, CanCreateRoomMessageComposer); + this._composers.set(OutgoingHeader.CANCEL_ROOM_EVENT, CancelEventMessageComposer); + this._composers.set(OutgoingHeader.CONVERT_GLOBAL_ROOM_ID, ConvertGlobalRoomIdMessageComposer); + this._composers.set(OutgoingHeader.COMPETITION_ROOM_SEARCH, CompetitionRoomsSearchMessageComposer); + this._composers.set(OutgoingHeader.ROOM_CREATE, CreateFlatMessageComposer); + this._composers.set(OutgoingHeader.GET_USER_FLAT_CATS, GetUserFlatCatsMessageComposer); + this._composers.set(OutgoingHeader.GET_USER_EVENT_CATS, GetUserEventCatsMessageComposer); + this._composers.set(OutgoingHeader.ROOM_FAVORITE_REMOVE, DeleteFavouriteRoomMessageComposer); + this._composers.set(OutgoingHeader.EDIT_ROOM_EVENT, EditEventMessageComposer); + this._composers.set(OutgoingHeader.FORWARD_TO_RANDOM_PROMOTED_ROOM, ForwardToARandomPromotedRoomMessageComposer); + this._composers.set(OutgoingHeader.FORWARD_TO_SOME_ROOM, ForwardToSomeRoomMessageComposer); + this._composers.set(OutgoingHeader.GET_CATEGORIES_WITH_USER_COUNT, GetCategoriesWithUserCountMessageComposer); + this._composers.set(OutgoingHeader.GET_GUEST_ROOM, GetGuestRoomMessageComposer); + this._composers.set(OutgoingHeader.GET_OFFICIAL_ROOMS, GetOfficialRoomsMessageComposer); + this._composers.set(OutgoingHeader.GET_POPULAR_ROOM_TAGS, GetPopularRoomTagsMessageComposer); + this._composers.set(OutgoingHeader.GUILD_BASE_SEARCH, GuildBaseSearchMessageComposer); + this._composers.set(OutgoingHeader.MY_FAVOURITE_ROOMS_SEARCH, MyFavouriteRoomsSearchMessageComposer); + this._composers.set(OutgoingHeader.MY_FREQUENT_ROOM_HISTORY_SEARCH, MyFrequentRoomHistorySearchMessageComposer); + this._composers.set(OutgoingHeader.MY_FRIENDS_ROOM_SEARCH, MyFriendsRoomsSearchMessageComposer); + this._composers.set(OutgoingHeader.MY_GUILD_BASES_SEARCH, MyGuildBasesSearchMessageComposer); + this._composers.set(OutgoingHeader.MY_RECOMMENDED_ROOMS, MyRecommendedRoomsMessageComposer); + this._composers.set(OutgoingHeader.MY_ROOM_HISTORY_SEARCH, MyRoomHistorySearchMessageComposer); + this._composers.set(OutgoingHeader.MY_ROOM_RIGHTS_SEARCH, MyRoomRightsSearchMessageComposer); + this._composers.set(OutgoingHeader.MY_ROOMS_SEARCH, MyRoomsSearchMessageComposer); + this._composers.set(OutgoingHeader.POPULAR_ROOMS_SEARCH, PopularRoomsSearchMessageComposer); + this._composers.set(OutgoingHeader.ROOM_LIKE, RateFlatMessageComposer); + this._composers.set(OutgoingHeader.ROOM_RIGHTS_REMOVE_OWN, RemoveOwnRoomRightsRoomMessageComposer); + this._composers.set(OutgoingHeader.ROOM_AD_EVENT_TAB_CLICKED, RoomAdEventTabAdClickedComposer); + this._composers.set(OutgoingHeader.ROOM_AD_EVENT_TAB_VIEWED, RoomAdEventTabViewedComposer); + this._composers.set(OutgoingHeader.ROOM_AD_SEARCH, RoomAdSearchMessageComposer); + this._composers.set(OutgoingHeader.ROOM_TEXT_SEARCH, RoomTextSearchMessageComposer); + this._composers.set(OutgoingHeader.ROOMS_WHERE_MY_FRIENDS_ARE, RoomsWhereMyFriendsAreSearchMessageComposer); + this._composers.set(OutgoingHeader.ROOMS_WITH_HIGHEST_SCORE_SEARCH, RoomsWithHighestScoreSearchMessageComposer); + this._composers.set(OutgoingHeader.SET_ROOM_SESSION_TAGS, SetRoomSessionTagsMessageComposer); + this._composers.set(OutgoingHeader.ROOM_STAFF_PICK, ToggleStaffPickMessageComposer); + this._composers.set(OutgoingHeader.ROOM_FILTER_WORDS, GetCustomRoomFilterMessageComposer); + this._composers.set(OutgoingHeader.ROOM_FILTER_WORDS_MODIFY, UpdateRoomFilterMessageComposer); + this._composers.set(OutgoingHeader.USER_HOME_ROOM, UpdateHomeRoomMessageComposer); + this._composers.set(OutgoingHeader.UPDATE_ROOM_THUMBNAIL, UpdateRoomThumbnailMessageComposer); + // NEW NAVIGATOR + this._composers.set(OutgoingHeader.NAVIGATOR_INIT, NavigatorInitComposer); + this._composers.set(OutgoingHeader.NAVIGATOR_SEARCH_CLOSE, NavigatorSearchCloseComposer); + this._composers.set(OutgoingHeader.NAVIGATOR_SEARCH, NavigatorSearchComposer); + this._composers.set(OutgoingHeader.NAVIGATOR_SEARCH_OPEN, NavigatorSearchOpenComposer); + this._composers.set(OutgoingHeader.NAVIGATOR_SEARCH_SAVE, NavigatorSearchSaveComposer); + this._composers.set(OutgoingHeader.NAVIGATOR_SETTINGS_SAVE, NavigatorSettingsSaveComposer); + this._composers.set(OutgoingHeader.NAVIGATOR_CATEGORY_LIST_MODE, NavigatorCategoryListModeComposer); + this._composers.set(OutgoingHeader.NAVIGATOR_DELETE_SAVED_SEARCH, NavigatorDeleteSavedSearchComposer); + + // POLL + this._composers.set(OutgoingHeader.POLL_ANSWER, PollAnswerComposer); + this._composers.set(OutgoingHeader.POLL_REJECT, PollRejectComposer); + this._composers.set(OutgoingHeader.POLL_START, PollStartComposer); + this._composers.set(OutgoingHeader.POLL_VOTE_COUNTER, VotePollCounterMessageComposer); + + // INVENTORY + + // EFFECTS + this._composers.set(OutgoingHeader.USER_EFFECT_ACTIVATE, AvatarEffectActivatedComposer); + this._composers.set(OutgoingHeader.USER_EFFECT_ENABLE, AvatarEffectSelectedComposer); + + // BADGES + this._composers.set(OutgoingHeader.USER_BADGES, RequestBadgesComposer); + this._composers.set(OutgoingHeader.USER_BADGES_CURRENT_UPDATE, SetActivatedBadgesComposer); + this._composers.set(OutgoingHeader.GET_BADGE_POINTS_LIMITS, GetBadgePointLimitsComposer); + this._composers.set(OutgoingHeader.REQUESTABADGE, RequestABadgeComposer); + this._composers.set(OutgoingHeader.GETISBADGEREQUESTFULFILLED, GetIsBadgeRequestFulfilledComposer); + + // BOTS + this._composers.set(OutgoingHeader.USER_BOTS, GetBotInventoryComposer); + + // FURNI + this._composers.set(OutgoingHeader.USER_FURNITURE, FurnitureListComposer); + this._composers.set(OutgoingHeader.REQUESTFURNIINVENTORYWHENNOTINROOM, RequestFurniInventoryWhenNotInRoomComposer); + + // PETS + this._composers.set(OutgoingHeader.USER_PETS, RequestPetsComposer); + + // TRADING + this._composers.set(OutgoingHeader.TRADE_ACCEPT, TradingAcceptComposer); + this._composers.set(OutgoingHeader.TRADE_CANCEL, TradingCancelComposer); + this._composers.set(OutgoingHeader.TRADE_CLOSE, TradingCloseComposer); + this._composers.set(OutgoingHeader.TRADE_CONFIRM, TradingConfirmationComposer); + this._composers.set(OutgoingHeader.TRADE_ITEM, TradingListAddItemComposer); + this._composers.set(OutgoingHeader.TRADE_ITEMS, TradingListAddItemsComposer); + this._composers.set(OutgoingHeader.TRADE_ITEM_REMOVE, TradingListItemRemoveComposer); + this._composers.set(OutgoingHeader.TRADE, TradingOpenComposer); + this._composers.set(OutgoingHeader.TRADE_UNACCEPT, TradingUnacceptComposer); + + // UNSEEN + this._composers.set(OutgoingHeader.UNSEEN_RESET_CATEGORY, UnseenResetCategoryComposer); + this._composers.set(OutgoingHeader.UNSEEN_RESET_ITEMS, UnseenResetItemsComposer); + + // ACHIVEMENTS + this._composers.set(OutgoingHeader.ACHIEVEMENT_LIST, RequestAchievementsMessageComposer); + + // PET + this._composers.set(OutgoingHeader.PET_MOUNT, PetMountComposer); + this._composers.set(OutgoingHeader.PET_RESPECT, PetRespectComposer); + this._composers.set(OutgoingHeader.PET_SUPPLEMENT, PetSupplementComposer); + this._composers.set(OutgoingHeader.REMOVE_PET_SADDLE, RemovePetSaddleComposer); + this._composers.set(OutgoingHeader.PET_INFO, RequestPetInfoComposer); + this._composers.set(OutgoingHeader.TOGGLE_PET_BREEDING, TogglePetBreedingComposer); + this._composers.set(OutgoingHeader.TOGGLE_PET_RIDING, TogglePetRidingComposer); + this._composers.set(OutgoingHeader.USE_PET_PRODUCT, UsePetProductComposer); + this._composers.set(OutgoingHeader.GET_PET_TRAINING_PANEL, GetPetCommandsComposer); + this._composers.set(OutgoingHeader.PET_OPEN_PACKAGE, OpenPetPackageMessageComposer); + this._composers.set(OutgoingHeader.PET_SELECTED, PetSelectedMessageComposer); + this._composers.set(OutgoingHeader.PETS_BREED, BreedPetsMessageComposer); + this._composers.set(OutgoingHeader.PET_CANCEL_BREEDING, CancelPetBreedingComposer); + this._composers.set(OutgoingHeader.PET_CONFIRM_BREEDING, ConfirmPetBreedingComposer); + + // ROOM + + // ACCESS + this._composers.set(OutgoingHeader.ROOM_ENTER, RoomEnterComposer); + this._composers.set(OutgoingHeader.ROOM_DOORBELL, RoomDoorbellAccessComposer); + this._composers.set(OutgoingHeader.GO_TO_FLAT, GoToFlatMessageComposer); + this._composers.set(OutgoingHeader.CHANGE_QUEUE, ChangeQueueMessageComposer); + + // ACTION + this._composers.set(OutgoingHeader.ROOM_AMBASSADOR_ALERT, RoomAmbassadorAlertComposer); + this._composers.set(OutgoingHeader.ROOM_BAN_GIVE, RoomBanUserComposer); + this._composers.set(OutgoingHeader.ROOM_BAN_REMOVE, RoomUnbanUserComposer); + this._composers.set(OutgoingHeader.ROOM_RIGHTS_GIVE, RoomGiveRightsComposer); + this._composers.set(OutgoingHeader.ROOM_KICK, RoomKickUserComposer); + this._composers.set(OutgoingHeader.ROOM_MUTE_USER, RoomMuteUserComposer); + this._composers.set(OutgoingHeader.ROOM_RIGHTS_REMOVE, RoomTakeRightsComposer); + this._composers.set(OutgoingHeader.ROOM_RIGHTS_REMOVE_ALL, RemoveAllRightsMessageComposer); + + this._composers.set(OutgoingHeader.ROOM_DELETE, RoomDeleteComposer); + + // DATA + this._composers.set(OutgoingHeader.ROOM_SETTINGS, RoomSettingsComposer); + this._composers.set(OutgoingHeader.ROOM_SETTINGS_SAVE, SaveRoomSettingsComposer); + this._composers.set(OutgoingHeader.ROOM_RIGHTS_LIST, RoomUsersWithRightsComposer); + this._composers.set(OutgoingHeader.ROOM_BAN_LIST, RoomBannedUsersComposer); + this._composers.set(OutgoingHeader.ROOM_SETTINGS_UPDATE_ROOM_CATEGORY_AND_TRADE, UpdateRoomCategoryAndTradeSettingsComposer); + + // BOTS + this._composers.set(OutgoingHeader.BOT_CONFIGURATION, RequestBotCommandConfigurationComposer); + + // ENGINE + this._composers.set(OutgoingHeader.GET_ITEM_DATA, GetItemDataComposer); + this._composers.set(OutgoingHeader.REMOVE_WALL_ITEM, RemoveWallItemComposer); + this._composers.set(OutgoingHeader.BOT_PLACE, BotPlaceComposer); + this._composers.set(OutgoingHeader.BOT_PICKUP, BotRemoveComposer); + this._composers.set(OutgoingHeader.BOT_SKILL_SAVE, BotSkillSaveComposer); + this._composers.set(OutgoingHeader.PET_PLACE, PetPlaceComposer); + this._composers.set(OutgoingHeader.PET_MOVE, PetMoveComposer); + this._composers.set(OutgoingHeader.PET_PICKUP, PetRemoveComposer); + this._composers.set(OutgoingHeader.SET_ITEM_DATA, SetItemDataMessageComposer); + this._composers.set(OutgoingHeader.SET_OBJECT_DATA, SetObjectDataMessageComposer); + this._composers.set(OutgoingHeader.COMPOST_PLANT, CompostPlantMessageComposer); + this._composers.set(OutgoingHeader.HARVEST_PET, HarvestPetMessageComposer); + this._composers.set(OutgoingHeader.SET_CLOTHING_CHANGE_DATA, SetClothingChangeDataMessageComposer); + + // FURNITURE + this._composers.set(OutgoingHeader.FURNITURE_ALIASES, FurnitureAliasesComposer); + this._composers.set(OutgoingHeader.FURNITURE_GROUP_INFO, FurnitureGroupInfoComposer); + this._composers.set(OutgoingHeader.FURNITURE_PICKUP, FurniturePickupComposer); + this._composers.set(OutgoingHeader.FURNITURE_PLACE, FurniturePlaceComposer); + this._composers.set(OutgoingHeader.ITEM_PAINT, FurniturePlacePaintComposer); + this._composers.set(OutgoingHeader.FURNITURE_POSTIT_PLACE, FurniturePostItPlaceComposer); + this._composers.set(OutgoingHeader.FURNITURE_POSTIT_SAVE_STICKY_POLE, AddSpamWallPostItMessageComposer); + this._composers.set(OutgoingHeader.CONTROL_YOUTUBE_DISPLAY_PLAYBACK, ControlYoutubeDisplayPlaybackMessageComposer); + this._composers.set(OutgoingHeader.GET_YOUTUBE_DISPLAY_STATUS, GetYoutubeDisplayStatusMessageComposer); + this._composers.set(OutgoingHeader.SET_YOUTUBE_DISPLAY_PLAYLIST, SetYoutubeDisplayPlaylistMessageComposer); + + // FLOOR + this._composers.set(OutgoingHeader.FURNITURE_FLOOR_UPDATE, FurnitureFloorUpdateComposer); + + // WALL + this._composers.set(OutgoingHeader.FURNITURE_WALL_UPDATE, FurnitureWallUpdateComposer); + + // Dimmers + this._composers.set(OutgoingHeader.ITEM_DIMMER_SETTINGS, MoodlightSettingsComposer); + this._composers.set(OutgoingHeader.ITEM_DIMMER_SAVE, MoodlightSettingsSaveComposer); + this._composers.set(OutgoingHeader.ITEM_DIMMER_TOGGLE, MoodlightTogggleStateComposer); + + // Toners + this._composers.set(OutgoingHeader.ROOM_TONER_APPLY, ApplyTonerComposer); + + // LOGIC + this._composers.set(OutgoingHeader.ITEM_COLOR_WHEEL_CLICK, FurnitureColorWheelComposer); + this._composers.set(OutgoingHeader.ITEM_DICE_CLICK, FurnitureDiceActivateComposer); + this._composers.set(OutgoingHeader.ITEM_DICE_CLOSE, FurnitureDiceDeactivateComposer); + this._composers.set(OutgoingHeader.FURNITURE_MULTISTATE, FurnitureMultiStateComposer); + this._composers.set(OutgoingHeader.FURNITURE_RANDOMSTATE, FurnitureRandomStateComposer); + this._composers.set(OutgoingHeader.ITEM_STACK_HELPER, FurnitureStackHeightComposer); + this._composers.set(OutgoingHeader.FURNITURE_WALL_MULTISTATE, FurnitureWallMultiStateComposer); + this._composers.set(OutgoingHeader.ONE_WAY_DOOR_CLICK, FurnitureOneWayDoorComposer); + this._composers.set(OutgoingHeader.ITEM_EXCHANGE_REDEEM, FurnitureExchangeComposer); + this._composers.set(OutgoingHeader.ITEM_CLOTHING_REDEEM, RedeemItemClothingComposer); + + // LAYOUT + this._composers.set(OutgoingHeader.ROOM_MODEL, GetRoomEntryDataMessageComposer); + this._composers.set(OutgoingHeader.GET_OCCUPIED_TILES, GetOccupiedTilesMessageComposer); + this._composers.set(OutgoingHeader.GET_ROOM_ENTRY_TILE, GetRoomEntryTileMessageComposer); + this._composers.set(OutgoingHeader.ROOM_MODEL_SAVE, UpdateFloorPropertiesMessageComposer); + + // UNIT + this._composers.set(OutgoingHeader.UNIT_ACTION, RoomUnitActionComposer); + this._composers.set(OutgoingHeader.UNIT_DANCE, RoomUnitDanceComposer); + this._composers.set(OutgoingHeader.UNIT_DROP_HAND_ITEM, RoomUnitDropHandItemComposer); + this._composers.set(OutgoingHeader.UNIT_GIVE_HANDITEM, RoomUnitGiveHandItemComposer); + this._composers.set(OutgoingHeader.UNIT_GIVE_HANDITEM_PET, RoomUnitGiveHandItemPetComposer); + this._composers.set(OutgoingHeader.UNIT_LOOK, RoomUnitLookComposer); + this._composers.set(OutgoingHeader.UNIT_SIGN, RoomUnitSignComposer); + this._composers.set(OutgoingHeader.UNIT_POSTURE, RoomUnitPostureComposer); + this._composers.set(OutgoingHeader.UNIT_WALK, RoomUnitWalkComposer); + + // CHAT + this._composers.set(OutgoingHeader.UNIT_CHAT, RoomUnitChatComposer); + this._composers.set(OutgoingHeader.UNIT_CHAT_SHOUT, RoomUnitChatShoutComposer); + this._composers.set(OutgoingHeader.USER_SETTINGS_CHAT_STYLE, RoomUnitChatStyleComposer); + this._composers.set(OutgoingHeader.UNIT_CHAT_WHISPER, RoomUnitChatWhisperComposer); + this._composers.set(OutgoingHeader.UNIT_TYPING, RoomUnitTypingStartComposer); + this._composers.set(OutgoingHeader.UNIT_TYPING_STOP, RoomUnitTypingStopComposer); + + // ROOM EVENTS + this._composers.set(OutgoingHeader.WIRED_APPLY_SNAPSHOT, ApplySnapshotMessageComposer); + this._composers.set(OutgoingHeader.WIRED_OPEN, OpenMessageComposer); + this._composers.set(OutgoingHeader.WIRED_ACTION_SAVE, UpdateActionMessageComposer); + this._composers.set(OutgoingHeader.WIRED_CONDITION_SAVE, UpdateConditionMessageComposer); + this._composers.set(OutgoingHeader.WIRED_TRIGGER_SAVE, UpdateTriggerMessageComposer); + this._composers.set(OutgoingHeader.ROOM_MUTE, RoomMuteComposer); + + // USER + this._composers.set(OutgoingHeader.APPROVE_NAME, ApproveNameMessageComposer); + this._composers.set(OutgoingHeader.USER_RESPECT, UserRespectComposer); + this._composers.set(OutgoingHeader.SCR_GET_KICKBACK_INFO, ScrGetKickbackInfoMessageComposer); + + // USER CLASSIFICATION + this._composers.set(OutgoingHeader.PEER_USERS_CLASSIFICATION, PeerUsersClassificationMessageComposer); + this._composers.set(OutgoingHeader.USER_CLASSIFICATION, RoomUsersClassificationMessageComposer); + + // DATA + this._composers.set(OutgoingHeader.USER_IGNORED, GetIgnoredUsersComposer); + this._composers.set(OutgoingHeader.USER_IGNORE, IgnoreUserComposer); + this._composers.set(OutgoingHeader.USER_IGNORE_ID, IgnoreUserIdComposer); + this._composers.set(OutgoingHeader.USER_UNIGNORE, UnignoreUserComposer); + this._composers.set(OutgoingHeader.USER_BADGES_CURRENT, UserCurrentBadgesComposer); + this._composers.set(OutgoingHeader.USER_FIGURE, UserFigureComposer); + this._composers.set(OutgoingHeader.USER_MOTTO, UserMottoComposer); + this._composers.set(OutgoingHeader.USER_PROFILE, UserProfileComposer); + this._composers.set(OutgoingHeader.USER_PROFILE_BY_NAME, GetExtendedProfileByNameMessageComposer); + this._composers.set(OutgoingHeader.USER_TAGS, GetUserTagsComposer); + this._composers.set(OutgoingHeader.MESSENGER_RELATIONSHIPS, UserRelationshipsComposer); + + // MANNEQUIN + this._composers.set(OutgoingHeader.MANNEQUIN_SAVE_NAME, FurnitureMannequinSaveNameComposer); + this._composers.set(OutgoingHeader.MANNEQUIN_SAVE_LOOK, FurnitureMannequinSaveLookComposer); + + // GIFTS + this._composers.set(OutgoingHeader.PRESENT_OPEN_PRESENT, OpenPresentComposer); + + // INVENTORY + + // MARKETPLACE + this._composers.set(OutgoingHeader.MARKETPLACE_CONFIG, GetMarketplaceConfigurationMessageComposer); + this._composers.set(OutgoingHeader.MARKETPLACE_SELL_ITEM, MakeOfferMessageComposer); + this._composers.set(OutgoingHeader.MARKETPLACE_REQUEST_OWN_ITEMS, GetMarketplaceOwnOffersMessageComposer); + this._composers.set(OutgoingHeader.MARKETPLACE_TAKE_BACK_ITEM, CancelMarketplaceOfferMessageComposer); + this._composers.set(OutgoingHeader.MARKETPLACE_REQUEST_OFFERS, GetMarketplaceOffersMessageComposer); + this._composers.set(OutgoingHeader.MARKETPLACE_BUY_OFFER, BuyMarketplaceOfferMessageComposer); + this._composers.set(OutgoingHeader.MARKETPLACE_REDEEM_CREDITS, RedeemMarketplaceOfferCreditsMessageComposer); + this._composers.set(OutgoingHeader.MARKETPLACE_BUY_TOKENS, BuyMarketplaceTokensMessageComposer); + this._composers.set(OutgoingHeader.REQUEST_SELL_ITEM, GetMarketplaceCanMakeOfferComposer); + this._composers.set(OutgoingHeader.REQUEST_MARKETPLACE_ITEM_STATS, GetMarketplaceItemStatsComposer); + + // BOTS + this._composers.set(OutgoingHeader.USER_BOTS, GetBotInventoryComposer); + + // PETS + this._composers.set(OutgoingHeader.USER_PETS, RequestPetsComposer); + + // CURRENCY + this._composers.set(OutgoingHeader.USER_CURRENCY, UserCurrencyComposer); + + // SUBSCRIPTION + this._composers.set(OutgoingHeader.USER_SUBSCRIPTION, UserSubscriptionComposer); + + // MODERATION + this._composers.set(OutgoingHeader.MODTOOL_REQUEST_ROOM_INFO, GetModeratorRoomInfoMessageComposer); + this._composers.set(OutgoingHeader.MODTOOL_CHANGE_ROOM_SETTINGS, ModerateRoomMessageComposer); + this._composers.set(OutgoingHeader.MODTOOL_REQUEST_USER_CHATLOG, GetUserChatlogMessageComposer); + this._composers.set(OutgoingHeader.MODTOOL_REQUEST_ROOM_CHATLOG, GetRoomChatlogMessageComposer); + this._composers.set(OutgoingHeader.MOD_TOOL_USER_INFO, GetModeratorUserInfoMessageComposer); + this._composers.set(OutgoingHeader.MODTOOL_SANCTION_ALERT, ModAlertMessageComposer); + this._composers.set(OutgoingHeader.MODTOOL_SANCTION_BAN, ModBanMessageComposer); + this._composers.set(OutgoingHeader.MODTOOL_SANCTION_KICK, ModKickMessageComposer); + this._composers.set(OutgoingHeader.MODTOOL_SANCTION_TRADELOCK, ModTradingLockMessageComposer); + this._composers.set(OutgoingHeader.MODTOOL_ALERTEVENT, ModMessageMessageComposer); + this._composers.set(OutgoingHeader.MODTOOL_SANCTION_MUTE, ModMuteMessageComposer); + this._composers.set(OutgoingHeader.MODTOOL_REQUEST_USER_ROOMS, GetRoomVisitsMessageComposer); + this._composers.set(OutgoingHeader.MODTOOL_ROOM_ALERT, ModeratorActionMessageComposer); + this._composers.set(OutgoingHeader.CLOSE_ISSUE_DEFAULT_ACTION, CloseIssueDefaultActionMessageComposer); + this._composers.set(OutgoingHeader.CLOSE_ISSUES, CloseIssuesMessageComposer); + this._composers.set(OutgoingHeader.DEFAULT_SANCTION, DefaultSanctionMessageComposer); + this._composers.set(OutgoingHeader.GET_CFH_CHATLOG, GetCfhChatlogMessageComposer); + this._composers.set(OutgoingHeader.MODTOOL_PREFERENCES, ModToolPreferencesComposer); + this._composers.set(OutgoingHeader.MODTOOL_SANCTION, ModToolSanctionComposer); + this._composers.set(OutgoingHeader.PICK_ISSUES, PickIssuesMessageComposer); + this._composers.set(OutgoingHeader.RELEASE_ISSUES, ReleaseIssuesMessageComposer); + + // MYSTERYBOX + this._composers.set(OutgoingHeader.MYSTERYBOXWAITINGCANCELEDMESSAGE, MysteryBoxWaitingCanceledMessageComposer); + this._composers.set(OutgoingHeader.MYSTERYBOX_OPEN_TROPHY, OpenMysteryTrophyMessageComposer); + + // SETTINGS + this._composers.set(OutgoingHeader.USER_SETTINGS_CAMERA, UserSettingsCameraFollowComposer); + this._composers.set(OutgoingHeader.USER_SETTINGS_OLD_CHAT, UserSettingsOldChatComposer); + this._composers.set(OutgoingHeader.USER_SETTINGS_INVITES, UserSettingsRoomInvitesComposer); + this._composers.set(OutgoingHeader.USER_SETTINGS_VOLUME, UserSettingsSoundComposer); + + // LANDING VIEW + this._composers.set(OutgoingHeader.COMMUNITY_GOAL_VOTE_COMPOSER, CommunityGoalVoteMessageComposer); + this._composers.set(OutgoingHeader.GET_PROMO_ARTICLES, GetPromoArticlesComposer); + + // QUEST + this._composers.set(OutgoingHeader.ACCEPT_QUEST, AcceptQuestMessageComposer); + this._composers.set(OutgoingHeader.ACTIVATE_QUEST, ActivateQuestMessageComposer); + this._composers.set(OutgoingHeader.CANCEL_QUEST, CancelQuestMessageComposer); + this._composers.set(OutgoingHeader.FRIEND_REQUEST_QUEST_COMPLETE, FriendRequestQuestCompleteMessageComposer); + this._composers.set(OutgoingHeader.GET_COMMUNITY_GOAL_EARNED_PRIZES, GetCommunityGoalEarnedPrizesMessageComposer); + this._composers.set(OutgoingHeader.GET_COMMUNITY_GOAL_HALL_OF_FAME, GetCommunityGoalHallOfFameMessageComposer); + this._composers.set(OutgoingHeader.GET_COMMUNITY_GOAL_PROGRESS, GetCommunityGoalProgressMessageComposer); + this._composers.set(OutgoingHeader.GET_CONCURRENT_USERS_GOAL_PROGRESS, GetConcurrentUsersGoalProgressMessageComposer); + this._composers.set(OutgoingHeader.GET_CONCURRENT_USERS_REWARD, GetConcurrentUsersRewardMessageComposer); + this._composers.set(OutgoingHeader.GET_DAILY_QUEST, GetDailyQuestMessageComposer); + this._composers.set(OutgoingHeader.GET_QUESTS, GetQuestsMessageComposer); + this._composers.set(OutgoingHeader.GET_SEASONAL_QUESTS_ONLY, GetSeasonalQuestsOnlyMessageComposer); + this._composers.set(OutgoingHeader.OPEN_QUEST_TRACKER, OpenQuestTrackerMessageComposer); + this._composers.set(OutgoingHeader.REDEEM_COMMUNITY_GOAL_PRIZE, RedeemCommunityGoalPrizeMessageComposer); + this._composers.set(OutgoingHeader.REJECT_QUEST, RejectQuestMessageComposer); + this._composers.set(OutgoingHeader.START_CAMPAIGN, StartCampaignMessageComposer); + + // SOUNDS + this._composers.set(OutgoingHeader.GET_SOUND_SETTINGS, GetSoundSettingsComposer); + this._composers.set(OutgoingHeader.ADD_JUKEBOX_DISK, AddJukeboxDiskComposer); + this._composers.set(OutgoingHeader.GET_JUKEBOX_PLAYLIST, GetJukeboxPlayListMessageComposer); + this._composers.set(OutgoingHeader.GET_NOW_PLAYING, GetNowPlayingMessageComposer); + this._composers.set(OutgoingHeader.GET_OFFICIAL_SONG_ID, GetOfficialSongIdMessageComposer); + this._composers.set(OutgoingHeader.GET_SONG_INFO, GetSongInfoMessageComposer); + this._composers.set(OutgoingHeader.GET_SOUND_MACHINE_PLAYLIST, GetSoundMachinePlayListMessageComposer); + this._composers.set(OutgoingHeader.GET_USER_SONG_DISKS, GetUserSongDisksMessageComposer); + this._composers.set(OutgoingHeader.REMOVE_JUKEBOX_DISK, RemoveJukeboxDiskComposer); + + // TALENT + this._composers.set(OutgoingHeader.HELPER_TALENT_TRACK, TalentTrackComposer); + this._composers.set(OutgoingHeader.TALENT_TRACK_GET_LEVEL, GetTalentTrackLevelMessageComposer); + + //NUX + this._composers.set(OutgoingHeader.NEW_USER_EXPERIENCE_GET_GIFTS, NewUserExperienceGetGiftsComposer); + this._composers.set(OutgoingHeader.NEW_USER_EXPERIENCE_SCRIPT_PROCEED, NewUserExperienceScriptProceedComposer); + + // WELCOME + this._composers.set(OutgoingHeader.WELCOME_OPEN_GIFT, OpenWelcomeGiftComposer); + this._composers.set(OutgoingHeader.WELCOME_GIFT_CHANGE_EMAIL, WelcomeGiftChangeEmailComposer); + + // EMAIL + this._composers.set(OutgoingHeader.EMAIL_GET_STATUS, GetEmailStatusComposer); + this._composers.set(OutgoingHeader.EMAIL_CHANGE, ChangeEmailComposer); + // RENTABLE + this._composers.set(OutgoingHeader.RENTABLE_SPACE_CANCEL_RENT, RentableSpaceCancelRentMessageComposer); + this._composers.set(OutgoingHeader.RENTABLE_SPACE_RENT, RentableSpaceRentMessageComposer); + this._composers.set(OutgoingHeader.RENTABLE_SPACE_STATUS, RentableSpaceStatusMessageComposer); + // RECYCLER + this._composers.set(OutgoingHeader.RECYCLER_STATUS, GetRecyclerStatusMessageComposer); + this._composers.set(OutgoingHeader.RECYCLER_ITEMS, RecycleItemsMessageComposer); + + // TRACKING + this._composers.set(OutgoingHeader.TRACKING_PERFORMANCE_LOG, PerformanceLogMessageComposer); + this._composers.set(OutgoingHeader.TRACKING_LAG_WARNING_REPORT, LagWarningReportMessageComposer); + + // ROOM DIRECTORY + this._composers.set(OutgoingHeader.ROOM_DIRECTORY_ROOM_NETWORK_OPEN_CONNECTION, RoomNetworkOpenConnectionMessageComposer); + + // RENTABLE + this._composers.set(OutgoingHeader.RENTABLE_EXTEND_RENT_OR_BUYOUT_STRIP_ITEM, ExtendRentOrBuyoutStripItemMessageComposer); + this._composers.set(OutgoingHeader.RENTABLE_EXTEND_RENT_OR_BUYOUT_FURNI, ExtendRentOrBuyoutFurniMessageComposer); + this._composers.set(OutgoingHeader.RENTABLE_GET_RENT_OR_BUYOUT_OFFER, GetRentOrBuyoutOfferMessageComposer); + } + + public get events(): Map + { + return this._events; + } + + public get composers(): Map + { + return this._composers; + } +} diff --git a/packages/communication/src/SocketConnection.ts b/packages/communication/src/SocketConnection.ts new file mode 100644 index 0000000..5055295 --- /dev/null +++ b/packages/communication/src/SocketConnection.ts @@ -0,0 +1,261 @@ +import { ICodec, IConnection, IMessageComposer, IMessageConfiguration, IMessageDataWrapper, IMessageEvent, WebSocketEventEnum } from '@nitrots/api'; +import { GetEventDispatcher, NitroEvent, NitroEventType } from '@nitrots/events'; +import { NitroLogger } from '@nitrots/utils'; +import { EvaWireFormat } from './codec'; +import { MessageClassManager } from './messages'; + +export class SocketConnection implements IConnection +{ + private _socket: WebSocket = null; + private _messages: MessageClassManager = new MessageClassManager(); + private _codec: ICodec = new EvaWireFormat(); + private _dataBuffer: ArrayBuffer = null; + private _isReady: boolean = false; + + private _pendingClientMessages: IMessageComposer[] = []; + private _pendingServerMessages: IMessageDataWrapper[] = []; + + private _isAuthenticated: boolean = false; + + public init(socketUrl: string): void + { + if(!socketUrl || !socketUrl.length) return; + + this._dataBuffer = new ArrayBuffer(0); + + this._socket = new WebSocket(socketUrl); + this._socket.binaryType = 'arraybuffer'; + + this._socket.addEventListener(WebSocketEventEnum.CONNECTION_OPENED, event => GetEventDispatcher().dispatchEvent(new NitroEvent(NitroEventType.SOCKET_OPENED))); + + this._socket.addEventListener(WebSocketEventEnum.CONNECTION_CLOSED, event => GetEventDispatcher().dispatchEvent(new NitroEvent(NitroEventType.SOCKET_CLOSED))); + + this._socket.addEventListener(WebSocketEventEnum.CONNECTION_ERROR, event => GetEventDispatcher().dispatchEvent(new NitroEvent(NitroEventType.SOCKET_ERROR))); + + this._socket.addEventListener(WebSocketEventEnum.CONNECTION_MESSAGE, (event: MessageEvent) => + { + this._dataBuffer = this.concatArrayBuffers(this._dataBuffer, event.data); + + this.processReceivedData(); + }); + } + + public ready(): void + { + if(this._isReady) return; + + this._isReady = true; + + if(this._pendingServerMessages && this._pendingServerMessages.length) this.processWrappers(...this._pendingServerMessages); + + if(this._pendingClientMessages && this._pendingClientMessages.length) this.send(...this._pendingClientMessages); + + this._pendingServerMessages = []; + this._pendingClientMessages = []; + } + + public authenticated(): void + { + this._isAuthenticated = true; + } + + public send(...composers: IMessageComposer[]): boolean + { + if(!composers) return false; + + composers = [...composers]; + + if(this._isAuthenticated && !this._isReady) + { + this._pendingClientMessages.push(...composers); + + return false; + } + + for(const composer of composers) + { + if(!composer) continue; + + const header = this._messages.getComposerId(composer); + + if(header === -1) + { + NitroLogger.packets('Unknown Composer', composer.constructor.name); + + continue; + } + + const message = composer.getMessageArray(); + const encoded = this._codec.encode(header, message); + + if(!encoded) + { + NitroLogger.packets('Encoding Failed', composer.constructor.name); + + continue; + } + + NitroLogger.packets('OutgoingComposer', header, composer.constructor.name, message); + + this.write(encoded.getBuffer()); + } + + return true; + } + + private write(buffer: ArrayBuffer): void + { + if(this._socket.readyState !== WebSocket.OPEN) return; + + this._socket.send(buffer); + } + + public processReceivedData(): void + { + try + { + this.processData(); + } + + catch (err) + { + NitroLogger.error(err); + } + } + + private processData(): void + { + const wrappers = this.splitReceivedMessages(); + + if(!wrappers || !wrappers.length) return; + + if(this._isAuthenticated && !this._isReady) + { + if(!this._pendingServerMessages) this._pendingServerMessages = []; + + this._pendingServerMessages.push(...wrappers); + + return; + } + + this.processWrappers(...wrappers); + } + + private processWrappers(...wrappers: IMessageDataWrapper[]): void + { + if(!wrappers || !wrappers.length) return; + + for(const wrapper of wrappers) + { + if(!wrapper) continue; + + const messages = this.getMessagesForWrapper(wrapper); + + if(!messages || !messages.length) continue; + + NitroLogger.packets('IncomingMessage', wrapper.header, messages[0].constructor.name, messages[0].parser); + + this.handleMessages(...messages); + } + } + + private splitReceivedMessages(): IMessageDataWrapper[] + { + if(!this._dataBuffer || !this._dataBuffer.byteLength) return null; + + return this._codec.decode(this); + } + + private concatArrayBuffers(buffer1: ArrayBuffer, buffer2: ArrayBuffer): ArrayBuffer + { + const array = new Uint8Array(buffer1.byteLength + buffer2.byteLength); + + array.set(new Uint8Array(buffer1), 0); + array.set(new Uint8Array(buffer2), buffer1.byteLength); + + return array.buffer; + } + + private getMessagesForWrapper(wrapper: IMessageDataWrapper): IMessageEvent[] + { + if(!wrapper) return null; + + const events = this._messages.getEvents(wrapper.header); + + if(!events || !events.length) + { + NitroLogger.packets('IncomingMessage', wrapper.header, 'UNREGISTERED', wrapper); + + return null; + } + + try + { + //@ts-ignore + const parser = new events[0].parserClass(); + + if(!parser || !parser.flush() || !parser.parse(wrapper)) return null; + + for(const event of events) (event.parser = parser); + } + + catch (e) + { + NitroLogger.error('Error parsing message', e, events[0].constructor.name); + + return null; + } + + return events; + } + + private handleMessages(...messages: IMessageEvent[]): void + { + messages = [...messages]; + + for(const message of messages) + { + if(!message) continue; + + message.connection = this; + + if(message.callBack) message.callBack(message); + } + } + + public registerMessages(configuration: IMessageConfiguration): void + { + if(!configuration) return; + + this._messages.registerMessages(configuration); + } + + public addMessageEvent(event: IMessageEvent): void + { + if(!event || !this._messages) return; + + this._messages.registerMessageEvent(event); + } + + public removeMessageEvent(event: IMessageEvent): void + { + if(!event || !this._messages) return; + + this._messages.removeMessageEvent(event); + } + + public get isAuthenticated(): boolean + { + return this._isAuthenticated; + } + + public get dataBuffer(): ArrayBuffer + { + return this._dataBuffer; + } + + public set dataBuffer(buffer: ArrayBuffer) + { + this._dataBuffer = buffer; + } +} diff --git a/packages/communication/src/codec/Byte.ts b/packages/communication/src/codec/Byte.ts new file mode 100644 index 0000000..dbcb29c --- /dev/null +++ b/packages/communication/src/codec/Byte.ts @@ -0,0 +1,14 @@ +export class Byte +{ + private _value: number; + + constructor(value: number) + { + this._value = value; + } + + public get value(): number + { + return this._value; + } +} \ No newline at end of file diff --git a/packages/communication/src/codec/Short.ts b/packages/communication/src/codec/Short.ts new file mode 100644 index 0000000..f23125e --- /dev/null +++ b/packages/communication/src/codec/Short.ts @@ -0,0 +1,14 @@ +export class Short +{ + private _value: number; + + constructor(value: number) + { + this._value = value; + } + + public get value(): number + { + return this._value; + } +} \ No newline at end of file diff --git a/packages/communication/src/codec/evawire/EvaWireDataWrapper.ts b/packages/communication/src/codec/evawire/EvaWireDataWrapper.ts new file mode 100644 index 0000000..06888c7 --- /dev/null +++ b/packages/communication/src/codec/evawire/EvaWireDataWrapper.ts @@ -0,0 +1,78 @@ +import { IBinaryReader, IMessageDataWrapper } from '@nitrots/api'; + +export class EvaWireDataWrapper implements IMessageDataWrapper +{ + private _header: number; + private _buffer: IBinaryReader; + + constructor(header: number, buffer: IBinaryReader) + { + this._header = header; + this._buffer = buffer; + } + + public readBytes(length: number): IBinaryReader + { + if(!this._buffer) return null; + + return this._buffer.readBytes(length); + } + + public readByte(): number + { + if(!this._buffer) return -1; + + return this._buffer.readByte(); + } + + public readBoolean(): boolean + { + return (this.readByte() === 1); + } + + public readShort(): number + { + if(!this._buffer) return -1; + + return this._buffer.readShort(); + } + + public readInt(): number + { + if(!this._buffer) return -1; + + return this._buffer.readInt(); + } + + public readFloat(): number + { + if(!this._buffer) return -1; + + return this._buffer.readFloat(); + } + + public readDouble(): number + { + if(!this._buffer) return -1; + + return this._buffer.readDouble(); + } + + public readString(): string + { + const length = this.readShort(); + const buffer = this._buffer.readBytes(length); + + return buffer.toString('utf8'); + } + + public get header(): number + { + return this._header; + } + + public get bytesAvailable(): boolean + { + return (this._buffer && (this._buffer.remaining() > 0)); + } +} diff --git a/packages/communication/src/codec/evawire/EvaWireFormat.ts b/packages/communication/src/codec/evawire/EvaWireFormat.ts new file mode 100644 index 0000000..1d3a72b --- /dev/null +++ b/packages/communication/src/codec/evawire/EvaWireFormat.ts @@ -0,0 +1,89 @@ +import { IBinaryWriter, ICodec, IConnection, IMessageDataWrapper } from '@nitrots/api'; +import { BinaryReader, BinaryWriter } from '@nitrots/utils'; +import { Byte } from '../Byte'; +import { Short } from '../Short'; +import { EvaWireDataWrapper } from './EvaWireDataWrapper'; + +export class EvaWireFormat implements ICodec +{ + public encode(header: number, messages: any[]): IBinaryWriter + { + const writer = new BinaryWriter(); + + writer.writeShort(header); + + for(const value of messages) + { + let type: string = typeof value; + + if(type === 'object') + { + if(value === null) type = 'null'; + else if(value instanceof Byte) type = 'byte'; + else if(value instanceof Short) type = 'short'; + else if(value instanceof ArrayBuffer) type = 'arraybuffer'; + } + + switch(type) + { + case 'undefined': + case 'null': + writer.writeShort(0); + break; + case 'byte': + writer.writeByte(value.value); + break; + case 'short': + writer.writeShort(value.value); + break; + case 'number': + writer.writeInt(value); + break; + case 'boolean': + writer.writeByte(value ? 1 : 0); + break; + case 'string': + if(!value) writer.writeShort(0); + else + { + writer.writeString(value, true); + } + break; + case 'arraybuffer': + writer.writeBytes(value); + break; + } + } + + const buffer = writer.getBuffer(); + + if(!buffer) return null; + + return new BinaryWriter().writeInt(buffer.byteLength).writeBytes(buffer); + } + + public decode(connection: IConnection): IMessageDataWrapper[] + { + if(!connection || !connection.dataBuffer || !connection.dataBuffer.byteLength) return null; + + const wrappers: IMessageDataWrapper[] = []; + + while(connection.dataBuffer.byteLength) + { + if(connection.dataBuffer.byteLength < 4) break; + + const container = new BinaryReader(connection.dataBuffer); + const length = container.readInt(); + + if(length > (connection.dataBuffer.byteLength - 4)) break; + + const extracted = container.readBytes(length); + + wrappers.push(new EvaWireDataWrapper(extracted.readShort(), extracted)); + + connection.dataBuffer = connection.dataBuffer.slice(length + 4); + } + + return wrappers; + } +} diff --git a/packages/communication/src/codec/evawire/index.ts b/packages/communication/src/codec/evawire/index.ts new file mode 100644 index 0000000..6b63cda --- /dev/null +++ b/packages/communication/src/codec/evawire/index.ts @@ -0,0 +1,2 @@ +export * from './EvaWireDataWrapper'; +export * from './EvaWireFormat'; diff --git a/packages/communication/src/codec/index.ts b/packages/communication/src/codec/index.ts new file mode 100644 index 0000000..cb49e18 --- /dev/null +++ b/packages/communication/src/codec/index.ts @@ -0,0 +1,3 @@ +export * from './Byte'; +export * from './evawire'; +export * from './Short'; diff --git a/packages/communication/src/index.ts b/packages/communication/src/index.ts new file mode 100644 index 0000000..7fa2659 --- /dev/null +++ b/packages/communication/src/index.ts @@ -0,0 +1,235 @@ +export * from './CommunicationManager'; +export * from './GetCommunication'; +export * from './NitroMessages'; +export * from './SocketConnection'; +export * from './codec'; +export * from './codec/evawire'; +export * from './messages'; +export * from './messages/incoming'; +export * from './messages/incoming/advertisement'; +export * from './messages/incoming/availability'; +export * from './messages/incoming/avatar'; +export * from './messages/incoming/bots'; +export * from './messages/incoming/callforhelp'; +export * from './messages/incoming/camera'; +export * from './messages/incoming/campaign'; +export * from './messages/incoming/catalog'; +export * from './messages/incoming/client'; +export * from './messages/incoming/competition'; +export * from './messages/incoming/crafting'; +export * from './messages/incoming/desktop'; +export * from './messages/incoming/friendlist'; +export * from './messages/incoming/game'; +export * from './messages/incoming/game/directory'; +export * from './messages/incoming/game/lobby'; +export * from './messages/incoming/game/score'; +export * from './messages/incoming/generic'; +export * from './messages/incoming/gifts'; +export * from './messages/incoming/group'; +export * from './messages/incoming/groupforums'; +export * from './messages/incoming/handshake'; +export * from './messages/incoming/help'; +export * from './messages/incoming/inventory'; +export * from './messages/incoming/inventory/achievements'; +export * from './messages/incoming/inventory/avatareffect'; +export * from './messages/incoming/inventory/badges'; +export * from './messages/incoming/inventory/clothes'; +export * from './messages/incoming/inventory/furni'; +export * from './messages/incoming/inventory/furni/gifts'; +export * from './messages/incoming/inventory/pets'; +export * from './messages/incoming/inventory/trading'; +export * from './messages/incoming/landingview'; +export * from './messages/incoming/landingview/votes'; +export * from './messages/incoming/marketplace'; +export * from './messages/incoming/moderation'; +export * from './messages/incoming/mysterybox'; +export * from './messages/incoming/navigator'; +export * from './messages/incoming/notifications'; +export * from './messages/incoming/nux'; +export * from './messages/incoming/perk'; +export * from './messages/incoming/pet'; +export * from './messages/incoming/pet/breeding'; +export * from './messages/incoming/poll'; +export * from './messages/incoming/quest'; +export * from './messages/incoming/recycler'; +export * from './messages/incoming/room'; +export * from './messages/incoming/room/access'; +export * from './messages/incoming/room/access/doorbell'; +export * from './messages/incoming/room/access/rights'; +export * from './messages/incoming/room/bots'; +export * from './messages/incoming/room/data'; +export * from './messages/incoming/room/engine'; +export * from './messages/incoming/room/furniture'; +export * from './messages/incoming/room/furniture/floor'; +export * from './messages/incoming/room/furniture/wall'; +export * from './messages/incoming/room/furniture/youtube'; +export * from './messages/incoming/room/mapping'; +export * from './messages/incoming/room/pet'; +export * from './messages/incoming/room/session'; +export * from './messages/incoming/room/unit'; +export * from './messages/incoming/room/unit/chat'; +export * from './messages/incoming/roomevents'; +export * from './messages/incoming/roomsettings'; +export * from './messages/incoming/security'; +export * from './messages/incoming/sound'; +export * from './messages/incoming/talent'; +export * from './messages/incoming/user'; +export * from './messages/incoming/user/access'; +export * from './messages/incoming/user/data'; +export * from './messages/incoming/user/inventory'; +export * from './messages/incoming/user/inventory/currency'; +export * from './messages/incoming/user/inventory/subscription'; +export * from './messages/incoming/user/wardrobe'; +export * from './messages/incoming/userclassification'; +export * from './messages/outgoing'; +export * from './messages/outgoing/advertisement'; +export * from './messages/outgoing/avatar'; +export * from './messages/outgoing/camera'; +export * from './messages/outgoing/campaign'; +export * from './messages/outgoing/catalog'; +export * from './messages/outgoing/competition'; +export * from './messages/outgoing/crafting'; +export * from './messages/outgoing/desktop'; +export * from './messages/outgoing/friendfurni'; +export * from './messages/outgoing/friendlist'; +export * from './messages/outgoing/game'; +export * from './messages/outgoing/game/arena'; +export * from './messages/outgoing/game/directory'; +export * from './messages/outgoing/game/ingame'; +export * from './messages/outgoing/game/lobby'; +export * from './messages/outgoing/game/score'; +export * from './messages/outgoing/gifts'; +export * from './messages/outgoing/group'; +export * from './messages/outgoing/groupforums'; +export * from './messages/outgoing/handshake'; +export * from './messages/outgoing/help'; +export * from './messages/outgoing/inventory'; +export * from './messages/outgoing/inventory/avatareffect'; +export * from './messages/outgoing/inventory/badges'; +export * from './messages/outgoing/inventory/bots'; +export * from './messages/outgoing/inventory/furni'; +export * from './messages/outgoing/inventory/pets'; +export * from './messages/outgoing/inventory/trading'; +export * from './messages/outgoing/inventory/unseen'; +export * from './messages/outgoing/landingview'; +export * from './messages/outgoing/landingview/votes'; +export * from './messages/outgoing/marketplace'; +export * from './messages/outgoing/moderation'; +export * from './messages/outgoing/mysterybox'; +export * from './messages/outgoing/navigator'; +export * from './messages/outgoing/nux'; +export * from './messages/outgoing/pet'; +export * from './messages/outgoing/poll'; +export * from './messages/outgoing/quest'; +export * from './messages/outgoing/recycler'; +export * from './messages/outgoing/room'; +export * from './messages/outgoing/room/access'; +export * from './messages/outgoing/room/action'; +export * from './messages/outgoing/room/bots'; +export * from './messages/outgoing/room/data'; +export * from './messages/outgoing/room/engine'; +export * from './messages/outgoing/room/furniture'; +export * from './messages/outgoing/room/furniture/dimmer'; +export * from './messages/outgoing/room/furniture/floor'; +export * from './messages/outgoing/room/furniture/logic'; +export * from './messages/outgoing/room/furniture/mannequin'; +export * from './messages/outgoing/room/furniture/presents'; +export * from './messages/outgoing/room/furniture/toner'; +export * from './messages/outgoing/room/furniture/wall'; +export * from './messages/outgoing/room/furniture/youtube'; +export * from './messages/outgoing/room/layout'; +export * from './messages/outgoing/room/pets'; +export * from './messages/outgoing/room/session'; +export * from './messages/outgoing/room/unit'; +export * from './messages/outgoing/room/unit/chat'; +export * from './messages/outgoing/roomdirectory'; +export * from './messages/outgoing/roomevents'; +export * from './messages/outgoing/roomsettings'; +export * from './messages/outgoing/sound'; +export * from './messages/outgoing/talent'; +export * from './messages/outgoing/tracking'; +export * from './messages/outgoing/user'; +export * from './messages/outgoing/user/data'; +export * from './messages/outgoing/user/inventory'; +export * from './messages/outgoing/user/inventory/currency'; +export * from './messages/outgoing/user/inventory/subscription'; +export * from './messages/outgoing/user/settings'; +export * from './messages/outgoing/userclassification'; +export * from './messages/parser'; +export * from './messages/parser/advertisement'; +export * from './messages/parser/availability'; +export * from './messages/parser/avatar'; +export * from './messages/parser/bots'; +export * from './messages/parser/callforhelp'; +export * from './messages/parser/camera'; +export * from './messages/parser/campaign'; +export * from './messages/parser/catalog'; +export * from './messages/parser/client'; +export * from './messages/parser/competition'; +export * from './messages/parser/crafting'; +export * from './messages/parser/desktop'; +export * from './messages/parser/friendlist'; +export * from './messages/parser/game'; +export * from './messages/parser/game/directory'; +export * from './messages/parser/game/lobby'; +export * from './messages/parser/game/score'; +export * from './messages/parser/generic'; +export * from './messages/parser/gifts'; +export * from './messages/parser/group'; +export * from './messages/parser/group/utils'; +export * from './messages/parser/groupforums'; +export * from './messages/parser/handshake'; +export * from './messages/parser/help'; +export * from './messages/parser/inventory'; +export * from './messages/parser/inventory/achievements'; +export * from './messages/parser/inventory/avatareffect'; +export * from './messages/parser/inventory/badges'; +export * from './messages/parser/inventory/clothing'; +export * from './messages/parser/inventory/furniture'; +export * from './messages/parser/inventory/pets'; +export * from './messages/parser/inventory/purse'; +export * from './messages/parser/inventory/trading'; +export * from './messages/parser/landingview'; +export * from './messages/parser/landingview/votes'; +export * from './messages/parser/marketplace'; +export * from './messages/parser/moderation'; +export * from './messages/parser/mysterybox'; +export * from './messages/parser/navigator'; +export * from './messages/parser/navigator/utils'; +export * from './messages/parser/notifications'; +export * from './messages/parser/nux'; +export * from './messages/parser/perk'; +export * from './messages/parser/perk/common'; +export * from './messages/parser/pet'; +export * from './messages/parser/poll'; +export * from './messages/parser/quest'; +export * from './messages/parser/recycler'; +export * from './messages/parser/room'; +export * from './messages/parser/room/access'; +export * from './messages/parser/room/access/doorbell'; +export * from './messages/parser/room/access/rights'; +export * from './messages/parser/room/bots'; +export * from './messages/parser/room/data'; +export * from './messages/parser/room/engine'; +export * from './messages/parser/room/furniture'; +export * from './messages/parser/room/furniture/floor'; +export * from './messages/parser/room/furniture/wall'; +export * from './messages/parser/room/furniture/youtube'; +export * from './messages/parser/room/mapping'; +export * from './messages/parser/room/pet'; +export * from './messages/parser/room/session'; +export * from './messages/parser/room/unit'; +export * from './messages/parser/room/unit/chat'; +export * from './messages/parser/roomevents'; +export * from './messages/parser/roomsettings'; +export * from './messages/parser/security'; +export * from './messages/parser/sound'; +export * from './messages/parser/talent'; +export * from './messages/parser/user'; +export * from './messages/parser/user/access'; +export * from './messages/parser/user/data'; +export * from './messages/parser/user/inventory'; +export * from './messages/parser/user/inventory/currency'; +export * from './messages/parser/user/inventory/subscription'; +export * from './messages/parser/user/wardrobe'; +export * from './messages/parser/userclassification'; diff --git a/packages/communication/src/messages/MessageClassManager.ts b/packages/communication/src/messages/MessageClassManager.ts new file mode 100644 index 0000000..3de5e77 --- /dev/null +++ b/packages/communication/src/messages/MessageClassManager.ts @@ -0,0 +1,128 @@ +import { IMessageComposer, IMessageConfiguration, IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; + +export class MessageClassManager +{ + private _messageIdByEvent: Map; + private _messageIdByComposer: Map; + private _messageInstancesById: Map; + + constructor() + { + this._messageIdByEvent = new Map(); + this._messageIdByComposer = new Map(); + this._messageInstancesById = new Map(); + } + + public dispose(): void + { + this._messageIdByEvent.clear(); + this._messageIdByComposer.clear(); + this._messageInstancesById.clear(); + } + + public registerMessages(configuration: IMessageConfiguration): void + { + for(const [header, handler] of configuration.events) this.registerMessageEventClass(header, handler); + + for(const [header, handler] of configuration.composers) this.registerMessageComposerClass(header, handler); + } + + private registerMessageEventClass(header: number, handler: Function): void + { + if(!header || !handler) return; + + this._messageIdByEvent.set(handler, header); + } + + private registerMessageComposerClass(header: number, handler: Function): void + { + if(!header || !handler) return; + + this._messageIdByComposer.set(handler, header); + } + + public registerMessageEvent(event: IMessageEvent): void + { + if(!event) return; + + const header = this.getEventId(event); + + if(!header) return; + + let existing = this._messageInstancesById.get(header); + + if(!existing || !existing.length) + { + existing = []; + + this._messageInstancesById.set(header, existing); + } + + existing.push(event); + } + + public removeMessageEvent(event: IMessageEvent): void + { + if(!event) return; + + const header = this.getEventId(event); + + if(!header) return; + + const existing = this._messageInstancesById.get(header); + + if(!existing) return; + + for(const [index, message] of existing.entries()) + { + if(!message) continue; + + if(message !== event) continue; + + existing.splice(index, 1); + + if(existing.length === 0) this._messageInstancesById.delete(header); + + message.dispose(); + + return; + } + } + + public getEvents(header: number): IMessageEvent[] + { + if(!header) return; + + const existing = this._messageInstancesById.get(header); + + if(!existing) return; + + return existing; + } + + public getEventId(event: IMessageEvent): number + { + if(!event) return -1; + + //@ts-ignore + const name = (event instanceof MessageEvent ? event.constructor : event) as Function; + + const existing = this._messageIdByEvent.get(name); + + if(!existing) return -1; + + return existing; + } + + public getComposerId(composer: IMessageComposer): number + { + if(!composer) return -1; + + const existing = this._messageIdByComposer.get(composer.constructor); + + if(!existing) return -1; + + return existing; + } +} diff --git a/packages/communication/src/messages/incoming/IncomingHeader.ts b/packages/communication/src/messages/incoming/IncomingHeader.ts new file mode 100644 index 0000000..f7ae0fd --- /dev/null +++ b/packages/communication/src/messages/incoming/IncomingHeader.ts @@ -0,0 +1,473 @@ +export class IncomingHeader +{ + public static ACHIEVEMENT_LIST = 305; + public static AUTHENTICATED = 2491; + public static AUTHENTICATION = -1; + public static AVAILABILITY_STATUS = 2033; + public static BUILDERS_CLUB_EXPIRED = 1452; + public static CLUB_OFFERS = 2405; + public static CATALOG_PAGE = 804; + public static CATALOG_PAGE_LIST = 1032; + public static CATALOG_PURCHASE_OK = 869; + public static CATALOG_PURCHASE_ERROR = 1404; + public static CATALOG_PURCHASE_NOT_ALLOWED = 3770; + public static PRODUCT_OFFER = 3388; + public static LIMITED_SOLD_OUT = 377; + public static CATALOG_PUBLISHED = 1866; + public static CFH_RESULT_MESSAGE = 3635; + public static CLIENT_LATENCY = 10; + public static CLIENT_PING = 3928; + public static DESKTOP_CAMPAIGN = 1745; + public static DESKTOP_NEWS = 286; + public static DESKTOP_VIEW = 122; + public static BUNDLE_DISCOUNT_RULESET = 2347; + public static FIRST_LOGIN_OF_DAY = 793; + public static FURNITURE_ALIASES = 1723; + public static FURNITURE_DATA = 2547; + public static FURNITURE_FLOOR = 1778; + public static FURNITURE_FLOOR_ADD = 1534; + public static FURNITURE_FLOOR_REMOVE = 2703; + public static FURNITURE_FLOOR_UPDATE = 3776; + public static FURNITURE_ITEMDATA = 2202; + public static FURNITURE_STATE = 2376; + public static FURNITURE_GROUP_CONTEXT_MENU_INFO = 3293; + public static FURNITURE_POSTIT_STICKY_POLE_OPEN = 2366; + public static GAME_CENTER_ACHIEVEMENTS = 2265; + public static GAME_CENTER_GAME_LIST = 222; + public static GAME_CENTER_STATUS = 2893; + public static GAME_CENTER_IN_ARENA_QUEUE = 872; + public static GAME_CENTER_STOP_COUNTER = 3191; + public static GAME_CENTER_USER_LEFT_GAME = 3138; + public static GAME_CENTER_DIRECTORY_STATUS = 2246; + public static GAME_CENTER_STARTING_GAME_FAILED = 2142; + public static GAME_CENTER_JOINING_FAILED = 1730; + public static GAMESTATUSMESSAGE = 3805; + public static GAMEACHIEVEMENTS = 1689; + public static GAMEINVITE = 904; + public static JOININGQUEUEFAILED = 3035; + public static JOINEDQUEUEMESSAGE = 2260; + public static LEFTQUEUE = 1477; + public static LOAD_GAME_URL = 2624; + public static LOADGAME = 3654; + public static UNLOADGAME = 1715; + public static ACHIEVEMENTRESOLUTIONCOMPLETED = 740; + public static ACHIEVEMENTRESOLUTIONPROGRESS = 3370; + public static ACHIEVEMENTRESOLUTIONS = 66; + public static GENERIC_ALERT = 3801; + public static MODERATOR_MESSAGE = 2030; + public static GENERIC_ERROR = 1600; + public static GIFT_WRAPPER_CONFIG = 2234; + public static GROUP_BADGES = 2402; + public static GROUP_CREATE_OPTIONS = 2159; + public static GROUP_FORUM_DATA = 3011; + public static GROUP_FORUM_LIST = 3001; + public static GROUP_FORUM_THREADS = 1073; + public static GROUP_FORUM_POST = 2049; + public static GROUP_FORUM_POST_THREAD = 1862; + public static GROUP_FORUM_THREAD_MESSAGES = 509; + public static GROUP_FORUM_UNREAD_COUNT = 2379; + public static GROUP_FORUM_UPDATE_MESSAGE = 324; + public static GROUP_FORUM_UPDATE_THREAD = 2528; + public static GROUP_INFO = 1702; + public static GROUP_LIST = 420; + public static GROUP_MEMBER = 265; + public static GROUP_MEMBERS = 1200; + public static GROUP_MEMBERS_REFRESH = 2445; + public static GROUP_MEMBER_REMOVE_CONFIRM = 1876; + public static GROUP_PURCHASED = 2808; + public static GROUP_SETTINGS = 3965; + public static GROUP_BADGE_PARTS = 2238; + public static GROUP_MEMBERSHIP_REQUESTED = 1180; + public static GROUP_DETAILS_CHANGED = 1459; + public static GROUP_HABBO_JOIN_FAILED = 762; + public static GUILD_EDIT_FAILED = 3988; + public static GUILD_MEMBER_MGMT_FAILED = 818; + public static ITEM_DIMMER_SETTINGS = 2710; + public static ITEM_STACK_HELPER = 2816; + public static ITEM_WALL = 1369; + public static ITEM_WALL_ADD = 2187; + public static ITEM_WALL_REMOVE = 3208; + public static ITEM_WALL_UPDATE = 2009; + public static MARKETPLACE_CONFIG = 1823; + public static MESSENGER_ACCEPT_FRIENDS = 896; + public static MESSENGER_CHAT = 1587; + public static MESSENGER_FIND_FRIENDS = 1210; + public static MESSENGER_FOLLOW_FAILED = 3048; + public static MESSENGER_FRIEND_NOTIFICATION = 3082; + public static MESSENGER_FRIENDS = 3130; + public static MESSENGER_INIT = 1605; + public static MESSENGER_INSTANCE_MESSAGE_ERROR = 3359; + public static MESSENGER_INVITE = 3870; + public static MESSENGER_INVITE_ERROR = 462; + public static MESSENGER_MESSAGE_ERROR = 892; + public static MESSENGER_MINIMAIL_COUNT = 2803; + public static MESSENGER_MINIMAIL_NEW = 1911; + public static MESSENGER_RELATIONSHIPS = 2016; + public static MESSENGER_REQUEST = 2219; + public static MESSENGER_REQUEST_ERROR = 892; + public static MESSENGER_REQUESTS = 280; + public static MESSENGER_SEARCH = 973; + public static MESSENGER_UPDATE = 2800; + public static MODERATION_REPORT_DISABLED = 1651; + public static MODERATION_TOOL = 2696; + public static MODERATION_USER_INFO = 2866; + public static MOTD_MESSAGES = 2035; + public static NAVIGATOR_CATEGORIES = 1562; + public static NAVIGATOR_COLLAPSED = 1543; + public static NAVIGATOR_EVENT_CATEGORIES = 3244; + public static NAVIGATOR_LIFTED = 3104; + public static NAVIGATOR_METADATA = 3052; + public static NAVIGATOR_OPEN_ROOM_CREATOR = 2064; + public static NAVIGATOR_SEARCH = 2690; + public static NAVIGATOR_SEARCHES = 3984; + public static NAVIGATOR_SETTINGS = 518; + public static THUMBNAIL_UPDATE_RESULT = 1927; + public static CAN_CREATE_ROOM = 378; + public static CATEGORIES_WITH_VISITOR_COUNT = 1455; + public static COMPETITION_ROOMS_DATA = 3954; + public static CONVERTED_ROOM_ID = 1331; + public static GUEST_ROOM_SEARCH_RESULT = 52; + public static NOTIFICATION_LIST = 1992; + public static NOTIFICATION_OFFER_REWARD_DELIVERED = 2125; + public static NOTIFICATION_SIMPLE_ALERT = 5100; + public static NOTIFICATION_ELEMENT_POINTER = 1787; + public static PET_FIGURE_UPDATE = 1924; + public static PET_INFO = 2901; + public static PET_TRAINING_PANEL = 1164; + public static PET_LEVEL_UPDATE = 2824; + public static PET_SCRATCH_FAILED = 1130; + public static PET_OPEN_PACKAGE_REQUESTED = 2380; + public static PET_OPEN_PACKAGE_RESULT = 546; + public static PET_BREEDING = 1746; + public static PET_CONFIRM_BREEDING_RESULT = 1625; + public static PET_GO_TO_BREEDING_NEST_FAILURE = 2621; + public static PET_NEST_BREEDING_SUCCESS = 2527; + public static PET_CONFIRM_BREEDING_REQUEST = 634; + public static PET_BREEDING_RESULT = 1553; + public static RECYCLER_PRIZES = 3164; + public static RECYCLER_STATUS = 3433; + public static RECYCLER_FINISHED = 468; + public static ROOM_BAN_LIST = 1869; + public static ROOM_BAN_REMOVE = 3429; + public static ROOM_CREATED = 1304; + public static ROOM_DOORBELL = 2309; + public static ROOM_DOORBELL_ACCEPTED = 3783; + public static ROOM_DOORBELL_REJECTED = 878; + public static ROOM_ENTER = 758; + public static ROOM_ENTER_ERROR = 899; + public static ROOM_FORWARD = 160; + public static ROOM_HEIGHT_MAP = 2753; + public static ROOM_HEIGHT_MAP_UPDATE = 558; + public static ROOM_INFO = 687; + public static ROOM_INFO_OWNER = 749; + public static ROOM_MODEL = 1301; + public static ROOM_MODEL_BLOCKED_TILES = 3990; + public static ROOM_MODEL_DOOR = 1664; + public static ROOM_MODEL_NAME = 2031; + public static ROOM_MUTED = 2533; + public static ROOM_MUTE_USER = 826; + public static ROOM_PAINT = 2454; + public static ROOM_PROMOTION = 2274; + public static ROOM_QUEUE_STATUS = 2208; + public static ROOM_RIGHTS = 780; + public static ROOM_RIGHTS_CLEAR = 2392; + public static ROOM_RIGHTS_LIST = 1284; + public static ROOM_RIGHTS_LIST_ADD = 2088; + public static ROOM_RIGHTS_LIST_REMOVE = 1327; + public static ROOM_RIGHTS_OWNER = 339; + public static ROOM_ROLLING = 3207; + public static ROOM_SCORE = 482; + public static ROOM_SETTINGS = 1498; + public static ROOM_SETTINGS_CHAT = 1191; + public static ROOM_SETTINGS_SAVE = 948; + public static ROOM_SETTINGS_SAVE_ERROR = 1555; + public static ROOM_INFO_UPDATED = 3297; + public static ROOM_SPECTATOR = 1033; + public static ROOM_THICKNESS = 3547; + public static ROOM_GET_FILTER_WORDS = 2937; + public static ROOM_MESSAGE_NOTIFICATION = 1634; + public static ROOM_POPULAR_TAGS_RESULT = 2012; + public static INFO_FEED_ENABLE = 3284; + public static SECURITY_MACHINE = 1488; + public static MYSTERY_BOX_KEYS = 2833; + public static GOTMYSTERYBOXPRIZEMESSAGE = 3712; + public static CANCELMYSTERYBOXWAITMESSAGE = 596; + public static SHOWMYSTERYBOXWAITMESSAGE = 3201; + public static TRADE_ACCEPTED = 2568; + public static TRADE_CLOSED = 1373; + public static TRADE_COMPLETED = 1001; + public static TRADE_CONFIRMATION = 2720; + public static TRADE_LIST_ITEM = 2024; + public static TRADE_NOT_OPEN = 3128; + public static TRADE_OPEN = 2505; + public static TRADE_OPEN_FAILED = 217; + public static TRADE_OTHER_NOT_ALLOWED = 1254; + public static TRADE_YOU_NOT_ALLOWED = 3058; + public static TRADE_NO_SUCH_ITEM = 2873; + public static UNIT = 374; + public static UNIT_CHANGE_NAME = 2182; + public static UNIT_CHAT = 1446; + public static UNIT_CHAT_SHOUT = 1036; + public static UNIT_CHAT_WHISPER = 2704; + public static UNIT_DANCE = 2233; + public static UNIT_EFFECT = 1167; + public static UNIT_EXPRESSION = 1631; + public static UNIT_HAND_ITEM = 1474; + public static UNIT_IDLE = 1797; + public static UNIT_INFO = 3920; + public static UNIT_NUMBER = 2324; + public static UNIT_REMOVE = 2661; + public static UNIT_STATUS = 1640; + public static UNIT_TYPING = 1717; + public static UNSEEN_ITEMS = 2103; + public static USER_ACHIEVEMENT_SCORE = 1968; + public static USER_BADGES = 717; + public static USER_BADGES_ADD = 2493; + public static USER_BADGES_CURRENT = 1087; + public static USER_BOT_REMOVE = 233; + public static USER_BOTS = 3086; + public static USER_CHANGE_NAME = 118; + public static USER_CLOTHING = 1450; + public static USER_CREDITS = 3475; + public static USER_CURRENCY = 2018; + public static ACTIVITY_POINT_NOTIFICATION = 2275; + public static USER_EFFECTS = 340; + public static USER_FAVORITE_ROOM = 2524; + public static USER_FAVORITE_ROOM_COUNT = 151; + public static USER_FIGURE = 2429; + public static USER_FURNITURE = 994; + public static USER_FURNITURE_ADD = 104; + public static USER_FURNITURE_POSTIT_PLACED = 1501; + public static USER_FURNITURE_REFRESH = 3151; + public static USER_FURNITURE_REMOVE = 159; + public static USER_HOME_ROOM = 2875; + public static ROOM_EVENT_CANCEL = 3479; + public static ROOM_EVENT = 1840; + public static USER_IGNORED = 126; + public static USER_IGNORED_RESULT = 207; + public static USER_INFO = 2725; + public static USER_OUTFITS = 3315; + public static USER_PERKS = 2586; + public static USER_PERMISSIONS = 411; + public static USER_PET_ADD = 2101; + public static USER_PET_REMOVE = 3253; + public static USER_PETS = 3522; + public static USER_PROFILE = 3898; + public static USER_RESPECT = 2815; + public static USER_SANCTION_STATUS = 3679; + public static USER_SETTINGS = 513; + public static USER_SUBSCRIPTION = 954; + public static USER_WARDROBE_PAGE = 3315; + public static USER_CLASSIFICATION = 966; + public static GET_USER_TAGS = 1255; + public static WIRED_ACTION = 1434; + public static WIRED_CONDITION = 1108; + public static WIRED_ERROR = 156; + public static WIRED_OPEN = 1830; + public static WIRED_REWARD = 178; + public static WIRED_SAVE = 1155; + public static WIRED_TRIGGER = 383; + public static PLAYING_GAME = 448; + public static FURNITURE_STATE_2 = 3431; + public static REMOVE_BOT_FROM_INVENTORY = 233; + public static ADD_BOT_TO_INVENTORY = 1352; + public static ACHIEVEMENT_PROGRESSED = 2107; + public static MODTOOL_ROOM_INFO = 1333; + public static MODTOOL_USER_CHATLOG = 3377; + public static MODTOOL_ROOM_CHATLOG = 3434; + public static MODTOOL_VISITED_ROOMS_USER = 1752; + public static MODERATOR_ACTION_RESULT = 2335; + public static ISSUE_DELETED = 3192; + public static ISSUE_INFO = 3609; + public static ISSUE_PICK_FAILED = 3150; + public static CFH_CHATLOG = 607; + public static MODERATOR_TOOL_PREFERENCES = 1576; + public static LOVELOCK_FURNI_START = 3753; + public static LOVELOCK_FURNI_FRIEND_COMFIRMED = 382; + public static LOVELOCK_FURNI_FINISHED = 770; + public static GIFT_RECEIVER_NOT_FOUND = 1517; + public static GIFT_OPENED = 56; + public static FLOOD_CONTROL = 566; + public static REMAINING_MUTE = 826; + public static USER_EFFECT_LIST = 340; + public static USER_EFFECT_LIST_ADD = 2867; + public static USER_EFFECT_LIST_REMOVE = 2228; + public static USER_EFFECT_ACTIVATE = 1959; + public static AVATAR_EFFECT_SELECTED = 3473; + public static CLUB_GIFT_INFO = 619; + public static REDEEM_VOUCHER_ERROR = 714; + public static REDEEM_VOUCHER_OK = 3336; + public static IN_CLIENT_LINK = 2023; + public static BOT_COMMAND_CONFIGURATION = 1618; + public static BOT_SKILL_LIST_UPDATE = 69; + public static BOT_FORCE_OPEN_CONTEXT_MENU = 296; + public static HAND_ITEM_RECEIVED = 354; + public static PET_PLACING_ERROR = 2913; + public static BOT_ERROR = 639; + public static MARKETPLACE_SELL_ITEM = 54; + public static MARKETPLACE_ITEM_STATS = 725; + public static MARKETPLACE_OWN_ITEMS = 3884; + public static MARKETPLACE_CANCEL_SALE = 3264; + public static MARKETPLACE_ITEM_POSTED = 1359; + public static MARKETPLACE_ITEMS_SEARCHED = 680; + public static MARKETPLACE_AFTER_ORDER_STATUS = 2032; + public static CATALOG_RECEIVE_PET_BREEDS = 3331; + public static CATALOG_APPROVE_NAME_RESULT = 1503; + public static OBJECTS_DATA_UPDATE = 1453; + public static PET_EXPERIENCE = 2156; + public static COMMUNITY_GOAL_VOTE_EVENT = 1435; + public static PROMO_ARTICLES = 286; + public static COMMUNITY_GOAL_EARNED_PRIZES = 3319; + public static COMMUNITY_GOAL_PROGRESS = 2525; + public static CONCURRENT_USERS_GOAL_PROGRESS = 2737; + public static QUEST_DAILY = 1878; + public static QUEST_CANCELLED = 3027; + public static QUEST_COMPLETED = 949; + public static COMMUNITY_GOAL_HALL_OF_FAME = 3005; + public static EPIC_POPUP = 3945; + public static SEASONAL_QUESTS = 1122; + public static QUESTS = 3625; + public static QUEST = 230; + public static BONUS_RARE_INFO = 1533; + public static CRAFTABLE_PRODUCTS = 1000; + public static CRAFTING_RECIPE = 2774; + public static CRAFTING_RECIPES_AVAILABLE = 2124; + public static CRAFTING_RESULT = 618; + public static CAMERA_PUBLISH_STATUS = 2057; + public static CAMERA_PURCHASE_OK = 2783; + public static CAMERA_STORAGE_URL = 3696; + public static CAMERA_SNAPSHOT = 463; + public static COMPETITION_STATUS = 133; + public static INIT_CAMERA = 3878; + public static THUMBNAIL_STATUS = 3595; + public static ACHIEVEMENT_NOTIFICATION = 806; + public static CLUB_GIFT_NOTIFICATION = 2188; + public static INTERSTITIAL_MESSAGE = 1808; + public static ROOM_AD_ERROR = 1759; + public static AVAILABILITY_TIME = 600; + public static HOTEL_CLOSED_AND_OPENS = 3728; + public static HOTEL_CLOSES_AND_OPENS_AT = 2771; + public static HOTEL_WILL_CLOSE_MINUTES = 1050; + public static HOTEL_MAINTENANCE = 1350; + public static JUKEBOX_PLAYLIST_FULL = 105; + public static JUKEBOX_SONG_DISKS = 34; + public static NOW_PLAYING = 469; + public static OFFICIAL_SONG_ID = 1381; + public static PLAYLIST = 1748; + public static PLAYLIST_SONG_ADDED = 1140; + public static TRAX_SONG_INFO = 3365; + public static USER_SONG_DISKS_INVENTORY = 2602; + public static CHECK_USER_NAME = 563; + public static CFH_SANCTION = 2782; + public static CFH_TOPICS = 325; + public static CFH_SANCTION_STATUS = 2221; + public static CAMPAIGN_CALENDAR_DATA = 2531; + public static CAMPAIGN_CALENDAR_DOOR_OPENED = 2551; + public static BUILDERS_CLUB_FURNI_COUNT = 3828; + public static BUILDERS_CLUB_SUBSCRIPTION = 1452; + public static CATALOG_PAGE_EXPIRATION = 2668; + public static CATALOG_EARLIEST_EXPIRY = 2515; + public static CLUB_GIFT_SELECTED = 659; + public static TARGET_OFFER_NOT_FOUND = 1237; + public static TARGET_OFFER = 119; + public static DIRECT_SMS_CLUB_BUY = 195; + public static ROOM_AD_PURCHASE = 2468; + public static NOT_ENOUGH_BALANCE = 3914; + public static LIMITED_OFFER_APPEARING_NEXT = 44; + public static IS_OFFER_GIFTABLE = 761; + public static CLUB_EXTENDED_OFFER = 3964; + public static SEASONAL_CALENDAR_OFFER = 1889; + public static COMPETITION_ENTRY_SUBMIT = 1177; + public static COMPETITION_VOTING_INFO = 3506; + public static COMPETITION_TIMING_CODE = 1745; + public static COMPETITION_USER_PART_OF = 3841; + public static COMPETITION_NO_OWNED_ROOMS = 2064; + public static COMPETITION_SECONDS_UNTIL = 3926; + public static BADGE_POINT_LIMITS = 2501; + public static BADGE_REQUEST_FULFILLED = 2998; + public static HELPER_TALENT_TRACK = 3406; + public static TALENT_TRACK_LEVEL = 1203; + public static TALENT_TRACK_LEVEL_UP = 638; + public static USER_BANNED = 1683; + public static BOT_RECEIVED = 3684; + public static PET_LEVEL_NOTIFICATION = 859; + public static PET_RECEIVED = 1111; + public static MODERATION_CAUTION = 1890; + public static YOUTUBE_CONTROL_VIDEO = 1554; + public static YOUTUBE_DISPLAY_PLAYLISTS = 1112; + public static YOUTUBE_DISPLAY_VIDEO = 1411; + public static CFH_DISABLED_NOTIFY = 1651; + public static QUESTION = 2665; + public static POLL_CONTENTS = 2997; + public static POLL_ERROR = 662; + public static POLL_OFFER = 3785; + public static POLL_ROOM_RESULT = 5201; + public static POLL_START_ROOM = 5200; + public static QUESTION_ANSWERED = 2589; + public static QUESTION_FINISHED = 1066; + public static CFH_PENDING_CALLS = 1121; + public static GUIDE_ON_DUTY_STATUS = 1548; + public static GUIDE_SESSION_ATTACHED = 1591; + public static GUIDE_SESSION_DETACHED = 138; + public static GUIDE_SESSION_ENDED = 1456; + public static GUIDE_SESSION_ERROR = 673; + public static GUIDE_SESSION_INVITED_TO_GUIDE_ROOM = 219; + public static GUIDE_SESSION_MESSAGE = 841; + public static GUIDE_SESSION_PARTNER_IS_TYPING = 1016; + public static GUIDE_SESSION_REQUESTER_ROOM = 1847; + public static GUIDE_SESSION_STARTED = 3209; + public static GUIDE_TICKET_CREATION_RESULT = 3285; + public static GUIDE_TICKET_RESOLUTION = 2674; + public static GUIDE_REPORTING_STATUS = 3463; + public static HOTEL_MERGE_NAME_CHANGE = 1663; + public static ISSUE_CLOSE_NOTIFICATION = 934; + public static QUIZ_DATA = 2927; + public static QUIZ_RESULTS = 2772; + public static CFH_PENDING_CALLS_DELETED = 77; + public static CFH_REPLY = 3796; + public static CHAT_REVIEW_SESSION_DETACHED = 30; + public static CHAT_REVIEW_SESSION_OFFERED_TO_GUIDE = 735; + public static CHAT_REVIEW_SESSION_RESULTS = 3276; + public static CHAT_REVIEW_SESSION_STARTED = 143; + public static CHAT_REVIEW_SESSION_VOTING_STATUS = 1829; + public static SCR_SEND_KICKBACK_INFO = 3277; + public static PET_STATUS = 1907; + public static GROUP_DEACTIVATE = 3129; + public static PET_RESPECTED = 2788; + public static PET_SUPPLEMENT = 3441; + public static NOOBNESS_LEVEL = 3738; + public static DISCONNECT_REASON = 4000; + public static CAN_CREATE_ROOM_EVENT = 2599; + public static FAVORITE_GROUP_UDPATE = 3403; + public static NO_SUCH_FLAT = 84; + public static ROOM_SETTINGS_ERROR = 2897; + public static SHOW_ENFORCE_ROOM_CATEGORY = 3896; + public static CUSTOM_USER_NOTIFICATION = 909; + public static NEW_USER_EXPERIENCE_GIFT_OFFER = 3575; + public static RESTORE_CLIENT = 426; + public static FIREWORK_CHARGE_DATA = 5210; + public static NEW_USER_EXPERIENCE_NOT_COMPLETE = 3639; + public static CONNECTION_ERROR = 1004; + public static ACCOUNT_SAFETY_LOCK_STATUS_CHANGE = 1243; + public static PHONE_COLLECTION_STATE = 2890; + public static PHONE_TRY_NUMBER_RESULT = 800; + public static PHONE_TRY_VERIFICATION_CODE_RESULT = 91; + public static EXTENDED_PROFILE_CHANGED = 876; + public static WELCOME_GIFT_CHANGE_EMAIL_RESULT = 2293; + public static WELCOME_GIFT_STATUS = 2707; + public static HANDSHAKE_INIT_DIFFIE = 1347; + public static HANDSHAKE_COMPLETE_DIFFIE = 3885; + public static RENTABLE_SPACE_RENT_OK = 2046; + public static RENTABLE_SPACE_STATUS = 3559; + public static RENTABLE_SPACE_RENT_FAILED = 1868; + public static EMAIL_STATUS = 612; + public static CHANGE_EMAIL_RESULT = 1815; + public static WEEKLY_GAME_REWARD = 2641; + public static WEEKLY_GAME_REWARD_WINNERS = 3097; + public static WEEKLY_COMPETITIVE_LEADERBOARD = 3512; + public static WEEKLY_COMPETITIVE_FRIENDS_LEADERBOARD = 3560; + public static WEEKLY_GAME2_FRIENDS_LEADERBOARD = 2270; + public static WEEKLY_GAME2_LEADERBOARD = 2196; + public static RENTABLE_FURNI_RENT_OR_BUYOUT_OFFER = 35; + public static HANDSHAKE_IDENTITY_ACCOUNT = 3523; +} diff --git a/packages/communication/src/messages/incoming/advertisement/InterstitialMessageEvent.ts b/packages/communication/src/messages/incoming/advertisement/InterstitialMessageEvent.ts new file mode 100644 index 0000000..7fd5f29 --- /dev/null +++ b/packages/communication/src/messages/incoming/advertisement/InterstitialMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { InterstitialMessageParser } from '../../parser'; + +export class InterstitialMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, InterstitialMessageParser); + } + + public getParser(): InterstitialMessageParser + { + return this.parser as InterstitialMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/advertisement/RoomAdErrorEvent.ts b/packages/communication/src/messages/incoming/advertisement/RoomAdErrorEvent.ts new file mode 100644 index 0000000..1bee1d4 --- /dev/null +++ b/packages/communication/src/messages/incoming/advertisement/RoomAdErrorEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomAdErrorMessageParser } from '../../parser'; + +export class RoomAdErrorEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomAdErrorMessageParser); + } + + public getParser(): RoomAdErrorMessageParser + { + return this.parser as RoomAdErrorMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/advertisement/index.ts b/packages/communication/src/messages/incoming/advertisement/index.ts new file mode 100644 index 0000000..7727ffc --- /dev/null +++ b/packages/communication/src/messages/incoming/advertisement/index.ts @@ -0,0 +1,2 @@ +export * from './InterstitialMessageEvent'; +export * from './RoomAdErrorEvent'; diff --git a/packages/communication/src/messages/incoming/availability/AvailabilityStatusMessageEvent.ts b/packages/communication/src/messages/incoming/availability/AvailabilityStatusMessageEvent.ts new file mode 100644 index 0000000..3cd147d --- /dev/null +++ b/packages/communication/src/messages/incoming/availability/AvailabilityStatusMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { AvailabilityStatusMessageParser } from '../../parser'; + +export class AvailabilityStatusMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, AvailabilityStatusMessageParser); + } + + public getParser(): AvailabilityStatusMessageParser + { + return this.parser as AvailabilityStatusMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/availability/AvailabilityTimeMessageEvent.ts b/packages/communication/src/messages/incoming/availability/AvailabilityTimeMessageEvent.ts new file mode 100644 index 0000000..06ea6f8 --- /dev/null +++ b/packages/communication/src/messages/incoming/availability/AvailabilityTimeMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { AvailabilityTimeMessageParser } from '../../parser'; + +export class AvailabilityTimeMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, AvailabilityTimeMessageParser); + } + + public getParser(): AvailabilityTimeMessageParser + { + return this.parser as AvailabilityTimeMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/availability/HotelClosedAndOpensEvent.ts b/packages/communication/src/messages/incoming/availability/HotelClosedAndOpensEvent.ts new file mode 100644 index 0000000..ab8e15b --- /dev/null +++ b/packages/communication/src/messages/incoming/availability/HotelClosedAndOpensEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { HotelClosedAndOpensMessageParser } from '../../parser'; + +export class HotelClosedAndOpensEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, HotelClosedAndOpensMessageParser); + } + + public getParser(): HotelClosedAndOpensMessageParser + { + return this.parser as HotelClosedAndOpensMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/availability/HotelClosesAndWillOpenAtEvent.ts b/packages/communication/src/messages/incoming/availability/HotelClosesAndWillOpenAtEvent.ts new file mode 100644 index 0000000..615f631 --- /dev/null +++ b/packages/communication/src/messages/incoming/availability/HotelClosesAndWillOpenAtEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { HotelClosesAndWillOpenAtMessageParser } from '../../parser'; + +export class HotelClosesAndWillOpenAtEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, HotelClosesAndWillOpenAtMessageParser); + } + + public getParser(): HotelClosesAndWillOpenAtMessageParser + { + return this.parser as HotelClosesAndWillOpenAtMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/availability/HotelWillCloseInMinutesEvent.ts b/packages/communication/src/messages/incoming/availability/HotelWillCloseInMinutesEvent.ts new file mode 100644 index 0000000..c79dde8 --- /dev/null +++ b/packages/communication/src/messages/incoming/availability/HotelWillCloseInMinutesEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { HotelWillCloseInMinutesMessageParser } from '../../parser'; + +export class HotelWillCloseInMinutesEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, HotelWillCloseInMinutesMessageParser); + } + + public getParser(): HotelWillCloseInMinutesMessageParser + { + return this.parser as HotelWillCloseInMinutesMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/availability/MaintenanceStatusMessageEvent.ts b/packages/communication/src/messages/incoming/availability/MaintenanceStatusMessageEvent.ts new file mode 100644 index 0000000..dbfdf32 --- /dev/null +++ b/packages/communication/src/messages/incoming/availability/MaintenanceStatusMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { MaintenanceStatusMessageParser } from '../../parser'; + +export class MaintenanceStatusMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, MaintenanceStatusMessageParser); + } + + public getParser(): MaintenanceStatusMessageParser + { + return this.parser as MaintenanceStatusMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/availability/index.ts b/packages/communication/src/messages/incoming/availability/index.ts new file mode 100644 index 0000000..8d657b5 --- /dev/null +++ b/packages/communication/src/messages/incoming/availability/index.ts @@ -0,0 +1,6 @@ +export * from './AvailabilityStatusMessageEvent'; +export * from './AvailabilityTimeMessageEvent'; +export * from './HotelClosedAndOpensEvent'; +export * from './HotelClosesAndWillOpenAtEvent'; +export * from './HotelWillCloseInMinutesEvent'; +export * from './MaintenanceStatusMessageEvent'; diff --git a/packages/communication/src/messages/incoming/avatar/ChangeUserNameResultMessageEvent.ts b/packages/communication/src/messages/incoming/avatar/ChangeUserNameResultMessageEvent.ts new file mode 100644 index 0000000..f913b81 --- /dev/null +++ b/packages/communication/src/messages/incoming/avatar/ChangeUserNameResultMessageEvent.ts @@ -0,0 +1,25 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ChangeUserNameResultMessageParser } from '../../parser'; + +export class ChangeUserNameResultMessageEvent extends MessageEvent implements IMessageEvent +{ + public static NAME_OK: number = 0; + public static ERROR_NAME_REQUIRED: number = 1; + public static ERROR_NAME_TOO_SHORT: number = 2; + public static ERROR_NAME_TOO_LONG: number = 3; + public static ERROR_NAME_NOT_VALID: number = 4; + public static ERROR_NAME_IN_USE: number = 5; + public static ERROR_NAME_CHANGE_NOT_ALLOWED: number = 6; + public static ERROR_MERGE_HOTEL_DOWN: number = 7; + + constructor(callBack: Function) + { + super(callBack, ChangeUserNameResultMessageParser); + } + + public getParser(): ChangeUserNameResultMessageParser + { + return this.parser as ChangeUserNameResultMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/avatar/CheckUserNameResultMessageEvent.ts b/packages/communication/src/messages/incoming/avatar/CheckUserNameResultMessageEvent.ts new file mode 100644 index 0000000..8227c67 --- /dev/null +++ b/packages/communication/src/messages/incoming/avatar/CheckUserNameResultMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CheckUserNameResultMessageParser } from '../../parser'; + +export class CheckUserNameResultMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CheckUserNameResultMessageParser); + } + + public getParser(): CheckUserNameResultMessageParser + { + return this.parser as CheckUserNameResultMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/avatar/FigureUpdateEvent.ts b/packages/communication/src/messages/incoming/avatar/FigureUpdateEvent.ts new file mode 100644 index 0000000..fe5fa9f --- /dev/null +++ b/packages/communication/src/messages/incoming/avatar/FigureUpdateEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FigureUpdateParser } from '../../parser'; + +export class FigureUpdateEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FigureUpdateParser); + } + + public getParser(): FigureUpdateParser + { + return this.parser as FigureUpdateParser; + } +} diff --git a/packages/communication/src/messages/incoming/avatar/WardrobeMessageEvent.ts b/packages/communication/src/messages/incoming/avatar/WardrobeMessageEvent.ts new file mode 100644 index 0000000..c814a7c --- /dev/null +++ b/packages/communication/src/messages/incoming/avatar/WardrobeMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { WardrobeMessageParser } from '../../parser'; + +export class WardrobeMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, WardrobeMessageParser); + } + + public getParser(): WardrobeMessageParser + { + return this.parser as WardrobeMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/avatar/index.ts b/packages/communication/src/messages/incoming/avatar/index.ts new file mode 100644 index 0000000..45a727e --- /dev/null +++ b/packages/communication/src/messages/incoming/avatar/index.ts @@ -0,0 +1,4 @@ +export * from './ChangeUserNameResultMessageEvent'; +export * from './CheckUserNameResultMessageEvent'; +export * from './FigureUpdateEvent'; +export * from './WardrobeMessageEvent'; diff --git a/packages/communication/src/messages/incoming/bots/BotAddedToInventoryEvent.ts b/packages/communication/src/messages/incoming/bots/BotAddedToInventoryEvent.ts new file mode 100644 index 0000000..29c2055 --- /dev/null +++ b/packages/communication/src/messages/incoming/bots/BotAddedToInventoryEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { BotAddedToInventoryParser } from '../../parser'; + +export class BotAddedToInventoryEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, BotAddedToInventoryParser); + } + + public getParser(): BotAddedToInventoryParser + { + return this.parser as BotAddedToInventoryParser; + } +} diff --git a/packages/communication/src/messages/incoming/bots/BotInventoryMessageEvent.ts b/packages/communication/src/messages/incoming/bots/BotInventoryMessageEvent.ts new file mode 100644 index 0000000..70dd754 --- /dev/null +++ b/packages/communication/src/messages/incoming/bots/BotInventoryMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { BotInventoryMessageParser } from '../../parser'; + +export class BotInventoryMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, BotInventoryMessageParser); + } + + public getParser(): BotInventoryMessageParser + { + return this.parser as BotInventoryMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/bots/BotReceivedMessageEvent.ts b/packages/communication/src/messages/incoming/bots/BotReceivedMessageEvent.ts new file mode 100644 index 0000000..533e81c --- /dev/null +++ b/packages/communication/src/messages/incoming/bots/BotReceivedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { BotReceivedMessageParser } from '../../parser'; + +export class BotReceivedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, BotReceivedMessageParser); + } + + public getParser(): BotReceivedMessageParser + { + return this.parser as BotReceivedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/bots/BotRemovedFromInventoryEvent.ts b/packages/communication/src/messages/incoming/bots/BotRemovedFromInventoryEvent.ts new file mode 100644 index 0000000..dbbf6f5 --- /dev/null +++ b/packages/communication/src/messages/incoming/bots/BotRemovedFromInventoryEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { BotRemovedFromInventoryParser } from '../../parser'; + +export class BotRemovedFromInventoryEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, BotRemovedFromInventoryParser); + } + + public getParser(): BotRemovedFromInventoryParser + { + return this.parser as BotRemovedFromInventoryParser; + } +} diff --git a/packages/communication/src/messages/incoming/bots/index.ts b/packages/communication/src/messages/incoming/bots/index.ts new file mode 100644 index 0000000..dde10bf --- /dev/null +++ b/packages/communication/src/messages/incoming/bots/index.ts @@ -0,0 +1,4 @@ +export * from './BotAddedToInventoryEvent'; +export * from './BotInventoryMessageEvent'; +export * from './BotReceivedMessageEvent'; +export * from './BotRemovedFromInventoryEvent'; diff --git a/packages/communication/src/messages/incoming/callforhelp/CfhSanctionMessageEvent.ts b/packages/communication/src/messages/incoming/callforhelp/CfhSanctionMessageEvent.ts new file mode 100644 index 0000000..9f15e10 --- /dev/null +++ b/packages/communication/src/messages/incoming/callforhelp/CfhSanctionMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CfhSanctionMessageParser } from '../../parser'; + +export class CfhSanctionMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CfhSanctionMessageParser); + } + + public getParser(): CfhSanctionMessageParser + { + return this.parser as CfhSanctionMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/callforhelp/CfhTopicsInitEvent.ts b/packages/communication/src/messages/incoming/callforhelp/CfhTopicsInitEvent.ts new file mode 100644 index 0000000..29aa4e2 --- /dev/null +++ b/packages/communication/src/messages/incoming/callforhelp/CfhTopicsInitEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CfhTopicsInitMessageParser } from '../../parser'; + +export class CfhTopicsInitEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CfhTopicsInitMessageParser); + } + + public getParser(): CfhTopicsInitMessageParser + { + return this.parser as CfhTopicsInitMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/callforhelp/SanctionStatusEvent.ts b/packages/communication/src/messages/incoming/callforhelp/SanctionStatusEvent.ts new file mode 100644 index 0000000..d3e7116 --- /dev/null +++ b/packages/communication/src/messages/incoming/callforhelp/SanctionStatusEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { SanctionStatusMessageParser } from '../../parser'; + +export class SanctionStatusEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, SanctionStatusMessageParser); + } + + public getParser(): SanctionStatusMessageParser + { + return this.parser as SanctionStatusMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/callforhelp/index.ts b/packages/communication/src/messages/incoming/callforhelp/index.ts new file mode 100644 index 0000000..9b60cfb --- /dev/null +++ b/packages/communication/src/messages/incoming/callforhelp/index.ts @@ -0,0 +1,3 @@ +export * from './CfhSanctionMessageEvent'; +export * from './CfhTopicsInitEvent'; +export * from './SanctionStatusEvent'; diff --git a/packages/communication/src/messages/incoming/camera/CameraPublishStatusMessageEvent.ts b/packages/communication/src/messages/incoming/camera/CameraPublishStatusMessageEvent.ts new file mode 100644 index 0000000..21a95a4 --- /dev/null +++ b/packages/communication/src/messages/incoming/camera/CameraPublishStatusMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CameraPublishStatusMessageParser } from '../../parser'; + +export class CameraPublishStatusMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CameraPublishStatusMessageParser); + } + + public getParser(): CameraPublishStatusMessageParser + { + return this.parser as CameraPublishStatusMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/camera/CameraPurchaseOKMessageEvent.ts b/packages/communication/src/messages/incoming/camera/CameraPurchaseOKMessageEvent.ts new file mode 100644 index 0000000..22efe88 --- /dev/null +++ b/packages/communication/src/messages/incoming/camera/CameraPurchaseOKMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CameraPurchaseOKMessageParser } from '../../parser'; + +export class CameraPurchaseOKMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CameraPurchaseOKMessageParser); + } + + public getParser(): CameraPurchaseOKMessageParser + { + return this.parser as CameraPurchaseOKMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/camera/CameraSnapshotMessageEvent.ts b/packages/communication/src/messages/incoming/camera/CameraSnapshotMessageEvent.ts new file mode 100644 index 0000000..921bbe8 --- /dev/null +++ b/packages/communication/src/messages/incoming/camera/CameraSnapshotMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CameraSnapshotMessageParser } from '../../parser'; + +export class CameraSnapshotMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CameraSnapshotMessageParser); + } + + public getParser(): CameraSnapshotMessageParser + { + return this.parser as CameraSnapshotMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/camera/CameraStorageUrlMessageEvent.ts b/packages/communication/src/messages/incoming/camera/CameraStorageUrlMessageEvent.ts new file mode 100644 index 0000000..d123d6e --- /dev/null +++ b/packages/communication/src/messages/incoming/camera/CameraStorageUrlMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CameraStorageUrlMessageParser } from '../../parser'; + +export class CameraStorageUrlMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CameraStorageUrlMessageParser); + } + + public getParser(): CameraStorageUrlMessageParser + { + return this.parser as CameraStorageUrlMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/camera/CompetitionStatusMessageEvent.ts b/packages/communication/src/messages/incoming/camera/CompetitionStatusMessageEvent.ts new file mode 100644 index 0000000..21fc635 --- /dev/null +++ b/packages/communication/src/messages/incoming/camera/CompetitionStatusMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CompetitionStatusMessageParser } from '../../parser'; + +export class CompetitionStatusMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CompetitionStatusMessageParser); + } + + public getParser(): CompetitionStatusMessageParser + { + return this.parser as CompetitionStatusMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/camera/InitCameraMessageEvent.ts b/packages/communication/src/messages/incoming/camera/InitCameraMessageEvent.ts new file mode 100644 index 0000000..6fbe482 --- /dev/null +++ b/packages/communication/src/messages/incoming/camera/InitCameraMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { InitCameraMessageParser } from '../../parser'; + +export class InitCameraMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, InitCameraMessageParser); + } + + public getParser(): InitCameraMessageParser + { + return this.parser as InitCameraMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/camera/ThumbnailStatusMessageEvent.ts b/packages/communication/src/messages/incoming/camera/ThumbnailStatusMessageEvent.ts new file mode 100644 index 0000000..7adb729 --- /dev/null +++ b/packages/communication/src/messages/incoming/camera/ThumbnailStatusMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ThumbnailStatusMessageParser } from '../../parser'; + +export class ThumbnailStatusMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ThumbnailStatusMessageParser); + } + + public getParser(): ThumbnailStatusMessageParser + { + return this.parser as ThumbnailStatusMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/camera/index.ts b/packages/communication/src/messages/incoming/camera/index.ts new file mode 100644 index 0000000..03df06b --- /dev/null +++ b/packages/communication/src/messages/incoming/camera/index.ts @@ -0,0 +1,7 @@ +export * from './CameraPublishStatusMessageEvent'; +export * from './CameraPurchaseOKMessageEvent'; +export * from './CameraSnapshotMessageEvent'; +export * from './CameraStorageUrlMessageEvent'; +export * from './CompetitionStatusMessageEvent'; +export * from './InitCameraMessageEvent'; +export * from './ThumbnailStatusMessageEvent'; diff --git a/packages/communication/src/messages/incoming/campaign/CampaignCalendarDataMessageEvent.ts b/packages/communication/src/messages/incoming/campaign/CampaignCalendarDataMessageEvent.ts new file mode 100644 index 0000000..4f1da37 --- /dev/null +++ b/packages/communication/src/messages/incoming/campaign/CampaignCalendarDataMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CampaignCalendarDataMessageParser } from '../../parser'; + +export class CampaignCalendarDataMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CampaignCalendarDataMessageParser); + } + + public getParser(): CampaignCalendarDataMessageParser + { + return this.parser as CampaignCalendarDataMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/campaign/CampaignCalendarDoorOpenedMessageEvent.ts b/packages/communication/src/messages/incoming/campaign/CampaignCalendarDoorOpenedMessageEvent.ts new file mode 100644 index 0000000..70d660d --- /dev/null +++ b/packages/communication/src/messages/incoming/campaign/CampaignCalendarDoorOpenedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CampaignCalendarDoorOpenedMessageParser } from '../../parser'; + +export class CampaignCalendarDoorOpenedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CampaignCalendarDoorOpenedMessageParser); + } + + public getParser(): CampaignCalendarDoorOpenedMessageParser + { + return this.parser as CampaignCalendarDoorOpenedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/campaign/index.ts b/packages/communication/src/messages/incoming/campaign/index.ts new file mode 100644 index 0000000..a6263ae --- /dev/null +++ b/packages/communication/src/messages/incoming/campaign/index.ts @@ -0,0 +1,2 @@ +export * from './CampaignCalendarDataMessageEvent'; +export * from './CampaignCalendarDoorOpenedMessageEvent'; diff --git a/packages/communication/src/messages/incoming/catalog/BonusRareInfoMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/BonusRareInfoMessageEvent.ts new file mode 100644 index 0000000..efc19c3 --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/BonusRareInfoMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { BonusRareInfoMessageParser } from '../../parser'; + +export class BonusRareInfoMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, BonusRareInfoMessageParser); + } + + public getParser(): BonusRareInfoMessageParser + { + return this.parser as BonusRareInfoMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/BuildersClubFurniCountMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/BuildersClubFurniCountMessageEvent.ts new file mode 100644 index 0000000..33c7c6e --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/BuildersClubFurniCountMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { BuildersClubFurniCountMessageParser } from '../../parser'; + +export class BuildersClubFurniCountMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, BuildersClubFurniCountMessageParser); + } + + public getParser(): BuildersClubFurniCountMessageParser + { + return this.parser as BuildersClubFurniCountMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/BuildersClubSubscriptionStatusMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/BuildersClubSubscriptionStatusMessageEvent.ts new file mode 100644 index 0000000..0de5ba0 --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/BuildersClubSubscriptionStatusMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { BuildersClubSubscriptionStatusMessageParser } from '../../parser'; + +export class BuildersClubSubscriptionStatusMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, BuildersClubSubscriptionStatusMessageParser); + } + + public getParser(): BuildersClubSubscriptionStatusMessageParser + { + return this.parser as BuildersClubSubscriptionStatusMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/BundleDiscountRulesetMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/BundleDiscountRulesetMessageEvent.ts new file mode 100644 index 0000000..cf70c1c --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/BundleDiscountRulesetMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { BundleDiscountRulesetMessageParser } from '../../parser'; + +export class BundleDiscountRulesetMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, BundleDiscountRulesetMessageParser); + } + + public getParser(): BundleDiscountRulesetMessageParser + { + return this.parser as BundleDiscountRulesetMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/CatalogPageExpirationEvent.ts b/packages/communication/src/messages/incoming/catalog/CatalogPageExpirationEvent.ts new file mode 100644 index 0000000..1093a3c --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/CatalogPageExpirationEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CatalogPageExpirationParser } from '../../parser'; + +export class CatalogPageExpirationEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CatalogPageExpirationParser); + } + + public getParser(): CatalogPageExpirationParser + { + return this.parser as CatalogPageExpirationParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/CatalogPageMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/CatalogPageMessageEvent.ts new file mode 100644 index 0000000..437fb8f --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/CatalogPageMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CatalogPageMessageParser } from '../../parser'; + +export class CatalogPageMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CatalogPageMessageParser); + } + + public getParser(): CatalogPageMessageParser + { + return this.parser as CatalogPageMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/CatalogPageWithEarliestExpiryMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/CatalogPageWithEarliestExpiryMessageEvent.ts new file mode 100644 index 0000000..4868360 --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/CatalogPageWithEarliestExpiryMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CatalogPageWithEarliestExpiryMessageParser } from '../../parser'; + +export class CatalogPageWithEarliestExpiryMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CatalogPageWithEarliestExpiryMessageParser); + } + + public getParser(): CatalogPageWithEarliestExpiryMessageParser + { + return this.parser as CatalogPageWithEarliestExpiryMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/CatalogPagesListEvent.ts b/packages/communication/src/messages/incoming/catalog/CatalogPagesListEvent.ts new file mode 100644 index 0000000..4baad7a --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/CatalogPagesListEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CatalogIndexMessageParser } from '../../parser'; + +export class CatalogPagesListEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CatalogIndexMessageParser); + } + + public getParser(): CatalogIndexMessageParser + { + return this.parser as CatalogIndexMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/CatalogPublishedMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/CatalogPublishedMessageEvent.ts new file mode 100644 index 0000000..5b8cdab --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/CatalogPublishedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CatalogPublishedMessageParser } from '../../parser'; + +export class CatalogPublishedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CatalogPublishedMessageParser); + } + + public getParser(): CatalogPublishedMessageParser + { + return this.parser as CatalogPublishedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/ClubGiftInfoEvent.ts b/packages/communication/src/messages/incoming/catalog/ClubGiftInfoEvent.ts new file mode 100644 index 0000000..d604afd --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/ClubGiftInfoEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ClubGiftInfoParser } from '../../parser'; + +export class ClubGiftInfoEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ClubGiftInfoParser); + } + + public getParser(): ClubGiftInfoParser + { + return this.parser as ClubGiftInfoParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/ClubGiftSelectedEvent.ts b/packages/communication/src/messages/incoming/catalog/ClubGiftSelectedEvent.ts new file mode 100644 index 0000000..08afb29 --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/ClubGiftSelectedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ClubGiftSelectedParser } from '../../parser'; + +export class ClubGiftSelectedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ClubGiftSelectedParser); + } + + public getParser(): ClubGiftSelectedParser + { + return this.parser as ClubGiftSelectedParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/DirectSMSClubBuyAvailableMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/DirectSMSClubBuyAvailableMessageEvent.ts new file mode 100644 index 0000000..8e073bd --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/DirectSMSClubBuyAvailableMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { DirectSMSClubBuyAvailableMessageParser } from '../../parser'; + +export class DirectSMSClubBuyAvailableMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, DirectSMSClubBuyAvailableMessageParser); + } + + public getParser(): DirectSMSClubBuyAvailableMessageParser + { + return this.parser as DirectSMSClubBuyAvailableMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/FireworkChargeDataEvent.ts b/packages/communication/src/messages/incoming/catalog/FireworkChargeDataEvent.ts new file mode 100644 index 0000000..a79da5d --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/FireworkChargeDataEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FireworkChargeDataParser } from '../../parser'; + +export class FireworkChargeDataEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FireworkChargeDataParser); + } + + public getParser(): FireworkChargeDataParser + { + return this.parser as FireworkChargeDataParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/GiftReceiverNotFoundEvent.ts b/packages/communication/src/messages/incoming/catalog/GiftReceiverNotFoundEvent.ts new file mode 100644 index 0000000..cb3d7dc --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/GiftReceiverNotFoundEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GiftReceiverNotFoundParser } from '../../parser'; + +export class GiftReceiverNotFoundEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GiftReceiverNotFoundParser); + } + + public getParser(): GiftReceiverNotFoundParser + { + return this.parser as GiftReceiverNotFoundParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/GiftWrappingConfigurationEvent.ts b/packages/communication/src/messages/incoming/catalog/GiftWrappingConfigurationEvent.ts new file mode 100644 index 0000000..16ef9e8 --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/GiftWrappingConfigurationEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GiftWrappingConfigurationParser } from '../../parser'; + +export class GiftWrappingConfigurationEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GiftWrappingConfigurationParser); + } + + public getParser(): GiftWrappingConfigurationParser + { + return this.parser as GiftWrappingConfigurationParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/HabboClubExtendOfferMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/HabboClubExtendOfferMessageEvent.ts new file mode 100644 index 0000000..331acc2 --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/HabboClubExtendOfferMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { HabboClubExtendOfferMessageParser } from '../../parser'; + +export class HabboClubExtendOfferMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, HabboClubExtendOfferMessageParser); + } + + public getParser(): HabboClubExtendOfferMessageParser + { + return this.parser as HabboClubExtendOfferMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/HabboClubOffersMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/HabboClubOffersMessageEvent.ts new file mode 100644 index 0000000..dc92866 --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/HabboClubOffersMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { HabboClubOffersMessageParser } from '../../parser'; + +export class HabboClubOffersMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, HabboClubOffersMessageParser); + } + + public getParser(): HabboClubOffersMessageParser + { + return this.parser as HabboClubOffersMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/IsOfferGiftableMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/IsOfferGiftableMessageEvent.ts new file mode 100644 index 0000000..55bcaae --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/IsOfferGiftableMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { IsOfferGiftableMessageParser } from '../../parser'; + +export class IsOfferGiftableMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, IsOfferGiftableMessageParser); + } + + public getParser(): IsOfferGiftableMessageParser + { + return this.parser as IsOfferGiftableMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/LimitedEditionSoldOutEvent.ts b/packages/communication/src/messages/incoming/catalog/LimitedEditionSoldOutEvent.ts new file mode 100644 index 0000000..42791b5 --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/LimitedEditionSoldOutEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { LimitedEditionSoldOutParser } from '../../parser'; + +export class LimitedEditionSoldOutEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, LimitedEditionSoldOutParser); + } + + public getParser(): LimitedEditionSoldOutParser + { + return this.parser as LimitedEditionSoldOutParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/LimitedOfferAppearingNextMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/LimitedOfferAppearingNextMessageEvent.ts new file mode 100644 index 0000000..00ad392 --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/LimitedOfferAppearingNextMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { LimitedOfferAppearingNextMessageParser } from '../../parser'; + +export class LimitedOfferAppearingNextMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, LimitedOfferAppearingNextMessageParser); + } + + public getParser(): LimitedOfferAppearingNextMessageParser + { + return this.parser as LimitedOfferAppearingNextMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/NotEnoughBalanceMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/NotEnoughBalanceMessageEvent.ts new file mode 100644 index 0000000..14bd25b --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/NotEnoughBalanceMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { NotEnoughBalanceMessageParser } from '../../parser'; + +export class NotEnoughBalanceMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, NotEnoughBalanceMessageParser); + } + + public getParser(): NotEnoughBalanceMessageParser + { + return this.parser as NotEnoughBalanceMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/ProductOfferEvent.ts b/packages/communication/src/messages/incoming/catalog/ProductOfferEvent.ts new file mode 100644 index 0000000..0778949 --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/ProductOfferEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ProductOfferMessageParser } from '../../parser'; + +export class ProductOfferEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ProductOfferMessageParser); + } + + public getParser(): ProductOfferMessageParser + { + return this.parser as ProductOfferMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/PurchaseErrorMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/PurchaseErrorMessageEvent.ts new file mode 100644 index 0000000..9fb533e --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/PurchaseErrorMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PurchaseErrorMessageParser } from '../../parser'; + +export class PurchaseErrorMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PurchaseErrorMessageParser); + } + + public getParser(): PurchaseErrorMessageParser + { + return this.parser as PurchaseErrorMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/PurchaseNotAllowedMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/PurchaseNotAllowedMessageEvent.ts new file mode 100644 index 0000000..399f822 --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/PurchaseNotAllowedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PurchaseNotAllowedMessageParser } from '../../parser'; + +export class PurchaseNotAllowedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PurchaseNotAllowedMessageParser); + } + + public getParser(): PurchaseNotAllowedMessageParser + { + return this.parser as PurchaseNotAllowedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/PurchaseOKMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/PurchaseOKMessageEvent.ts new file mode 100644 index 0000000..9c2e6b5 --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/PurchaseOKMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PurchaseOKMessageParser } from '../../parser'; + +export class PurchaseOKMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PurchaseOKMessageParser); + } + + public getParser(): PurchaseOKMessageParser + { + return this.parser as PurchaseOKMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/RoomAdPurchaseInfoEvent.ts b/packages/communication/src/messages/incoming/catalog/RoomAdPurchaseInfoEvent.ts new file mode 100644 index 0000000..38c0b5f --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/RoomAdPurchaseInfoEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomAdPurchaseInfoEventParser } from '../../parser'; + +export class RoomAdPurchaseInfoEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomAdPurchaseInfoEventParser); + } + + public getParser(): RoomAdPurchaseInfoEventParser + { + return this.parser as RoomAdPurchaseInfoEventParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/SeasonalCalendarDailyOfferMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/SeasonalCalendarDailyOfferMessageEvent.ts new file mode 100644 index 0000000..f39f26e --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/SeasonalCalendarDailyOfferMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { SeasonalCalendarDailyOfferMessageParser } from '../../parser'; + +export class SeasonalCalendarDailyOfferMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, SeasonalCalendarDailyOfferMessageParser); + } + + public getParser(): SeasonalCalendarDailyOfferMessageParser + { + return this.parser as SeasonalCalendarDailyOfferMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/SellablePetPalettesMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/SellablePetPalettesMessageEvent.ts new file mode 100644 index 0000000..0da7215 --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/SellablePetPalettesMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { SellablePetPalettesParser } from '../../parser'; + +export class SellablePetPalettesMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, SellablePetPalettesParser); + } + + public getParser(): SellablePetPalettesParser + { + return this.parser as SellablePetPalettesParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/TargetedOfferEvent.ts b/packages/communication/src/messages/incoming/catalog/TargetedOfferEvent.ts new file mode 100644 index 0000000..633484b --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/TargetedOfferEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { TargetedOfferParser } from '../../parser'; + +export class TargetedOfferEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, TargetedOfferParser); + } + + public getParser(): TargetedOfferParser + { + return this.parser as TargetedOfferParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/TargetedOfferNotFoundEvent.ts b/packages/communication/src/messages/incoming/catalog/TargetedOfferNotFoundEvent.ts new file mode 100644 index 0000000..2d7e743 --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/TargetedOfferNotFoundEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { TargetedOfferNotFoundParser } from '../../parser'; + +export class TargetedOfferNotFoundEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, TargetedOfferNotFoundParser); + } + + public getParser(): TargetedOfferNotFoundParser + { + return this.parser as TargetedOfferNotFoundParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/VoucherRedeemErrorMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/VoucherRedeemErrorMessageEvent.ts new file mode 100644 index 0000000..b3d8e4b --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/VoucherRedeemErrorMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { VoucherRedeemErrorMessageParser } from '../../parser'; + +export class VoucherRedeemErrorMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, VoucherRedeemErrorMessageParser); + } + + public getParser(): VoucherRedeemErrorMessageParser + { + return this.parser as VoucherRedeemErrorMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/VoucherRedeemOkMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/VoucherRedeemOkMessageEvent.ts new file mode 100644 index 0000000..6717243 --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/VoucherRedeemOkMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { VoucherRedeemOkMessageParser } from '../../parser'; + +export class VoucherRedeemOkMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, VoucherRedeemOkMessageParser); + } + + public getParser(): VoucherRedeemOkMessageParser + { + return this.parser as VoucherRedeemOkMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/catalog/index.ts b/packages/communication/src/messages/incoming/catalog/index.ts new file mode 100644 index 0000000..c7a281c --- /dev/null +++ b/packages/communication/src/messages/incoming/catalog/index.ts @@ -0,0 +1,32 @@ +export * from './BonusRareInfoMessageEvent'; +export * from './BuildersClubFurniCountMessageEvent'; +export * from './BuildersClubSubscriptionStatusMessageEvent'; +export * from './BundleDiscountRulesetMessageEvent'; +export * from './CatalogPageExpirationEvent'; +export * from './CatalogPageMessageEvent'; +export * from './CatalogPagesListEvent'; +export * from './CatalogPageWithEarliestExpiryMessageEvent'; +export * from './CatalogPublishedMessageEvent'; +export * from './ClubGiftInfoEvent'; +export * from './ClubGiftSelectedEvent'; +export * from './DirectSMSClubBuyAvailableMessageEvent'; +export * from './FireworkChargeDataEvent'; +export * from './GiftReceiverNotFoundEvent'; +export * from './GiftWrappingConfigurationEvent'; +export * from './HabboClubExtendOfferMessageEvent'; +export * from './HabboClubOffersMessageEvent'; +export * from './IsOfferGiftableMessageEvent'; +export * from './LimitedEditionSoldOutEvent'; +export * from './LimitedOfferAppearingNextMessageEvent'; +export * from './NotEnoughBalanceMessageEvent'; +export * from './ProductOfferEvent'; +export * from './PurchaseErrorMessageEvent'; +export * from './PurchaseNotAllowedMessageEvent'; +export * from './PurchaseOKMessageEvent'; +export * from './RoomAdPurchaseInfoEvent'; +export * from './SeasonalCalendarDailyOfferMessageEvent'; +export * from './SellablePetPalettesMessageEvent'; +export * from './TargetedOfferEvent'; +export * from './TargetedOfferNotFoundEvent'; +export * from './VoucherRedeemErrorMessageEvent'; +export * from './VoucherRedeemOkMessageEvent'; diff --git a/packages/communication/src/messages/incoming/client/ClientPingEvent.ts b/packages/communication/src/messages/incoming/client/ClientPingEvent.ts new file mode 100644 index 0000000..38b063f --- /dev/null +++ b/packages/communication/src/messages/incoming/client/ClientPingEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ClientPingParser } from '../../parser'; + +export class ClientPingEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ClientPingParser); + } + + public getParser(): ClientPingParser + { + return this.parser as ClientPingParser; + } +} diff --git a/packages/communication/src/messages/incoming/client/index.ts b/packages/communication/src/messages/incoming/client/index.ts new file mode 100644 index 0000000..deaf34e --- /dev/null +++ b/packages/communication/src/messages/incoming/client/index.ts @@ -0,0 +1 @@ +export * from './ClientPingEvent'; diff --git a/packages/communication/src/messages/incoming/competition/CompetitionEntrySubmitResultEvent.ts b/packages/communication/src/messages/incoming/competition/CompetitionEntrySubmitResultEvent.ts new file mode 100644 index 0000000..e38ab0e --- /dev/null +++ b/packages/communication/src/messages/incoming/competition/CompetitionEntrySubmitResultEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CompetitionEntrySubmitResultMessageParser } from '../../parser'; + +export class CompetitionEntrySubmitResultEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CompetitionEntrySubmitResultMessageParser); + } + + public getParser(): CompetitionEntrySubmitResultMessageParser + { + return this.parser as CompetitionEntrySubmitResultMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/competition/CompetitionVotingInfoMessageEvent.ts b/packages/communication/src/messages/incoming/competition/CompetitionVotingInfoMessageEvent.ts new file mode 100644 index 0000000..a1b2b77 --- /dev/null +++ b/packages/communication/src/messages/incoming/competition/CompetitionVotingInfoMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CompetitionVotingInfoMessageParser } from '../../parser'; + +export class CompetitionVotingInfoMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CompetitionVotingInfoMessageParser); + } + + public getParser(): CompetitionVotingInfoMessageParser + { + return this.parser as CompetitionVotingInfoMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/competition/CurrentTimingCodeMessageEvent.ts b/packages/communication/src/messages/incoming/competition/CurrentTimingCodeMessageEvent.ts new file mode 100644 index 0000000..9842f77 --- /dev/null +++ b/packages/communication/src/messages/incoming/competition/CurrentTimingCodeMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CurrentTimingCodeMessageParser } from '../../parser'; + +export class CurrentTimingCodeMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CurrentTimingCodeMessageParser); + } + + public getParser(): CurrentTimingCodeMessageParser + { + return this.parser as CurrentTimingCodeMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/competition/IsUserPartOfCompetitionMessageEvent.ts b/packages/communication/src/messages/incoming/competition/IsUserPartOfCompetitionMessageEvent.ts new file mode 100644 index 0000000..331ee20 --- /dev/null +++ b/packages/communication/src/messages/incoming/competition/IsUserPartOfCompetitionMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { IsUserPartOfCompetitionMessageParser } from '../../parser'; + +export class IsUserPartOfCompetitionMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, IsUserPartOfCompetitionMessageParser); + } + + public getParser(): IsUserPartOfCompetitionMessageParser + { + return this.parser as IsUserPartOfCompetitionMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/competition/NoOwnedRoomsAlertMessageEvent.ts b/packages/communication/src/messages/incoming/competition/NoOwnedRoomsAlertMessageEvent.ts new file mode 100644 index 0000000..000cb7d --- /dev/null +++ b/packages/communication/src/messages/incoming/competition/NoOwnedRoomsAlertMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { NoOwnedRoomsAlertMessageParser } from '../../parser'; + +export class NoOwnedRoomsAlertMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, NoOwnedRoomsAlertMessageParser); + } + + public getParser(): NoOwnedRoomsAlertMessageParser + { + return this.parser as NoOwnedRoomsAlertMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/competition/SecondsUntilMessageEvent.ts b/packages/communication/src/messages/incoming/competition/SecondsUntilMessageEvent.ts new file mode 100644 index 0000000..5691262 --- /dev/null +++ b/packages/communication/src/messages/incoming/competition/SecondsUntilMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { SecondsUntilMessageParser } from '../../parser'; + +export class SecondsUntilMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, SecondsUntilMessageParser); + } + + public getParser(): SecondsUntilMessageParser + { + return this.parser as SecondsUntilMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/competition/index.ts b/packages/communication/src/messages/incoming/competition/index.ts new file mode 100644 index 0000000..7c2b70a --- /dev/null +++ b/packages/communication/src/messages/incoming/competition/index.ts @@ -0,0 +1,6 @@ +export * from './CompetitionEntrySubmitResultEvent'; +export * from './CompetitionVotingInfoMessageEvent'; +export * from './CurrentTimingCodeMessageEvent'; +export * from './IsUserPartOfCompetitionMessageEvent'; +export * from './NoOwnedRoomsAlertMessageEvent'; +export * from './SecondsUntilMessageEvent'; diff --git a/packages/communication/src/messages/incoming/crafting/CraftableProductsEvent.ts b/packages/communication/src/messages/incoming/crafting/CraftableProductsEvent.ts new file mode 100644 index 0000000..d186c19 --- /dev/null +++ b/packages/communication/src/messages/incoming/crafting/CraftableProductsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CraftableProductsMessageParser } from '../../parser'; + +export class CraftableProductsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CraftableProductsMessageParser); + } + + public getParser(): CraftableProductsMessageParser + { + return this.parser as CraftableProductsMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/crafting/CraftingRecipeEvent.ts b/packages/communication/src/messages/incoming/crafting/CraftingRecipeEvent.ts new file mode 100644 index 0000000..c7ebd4a --- /dev/null +++ b/packages/communication/src/messages/incoming/crafting/CraftingRecipeEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CraftingRecipeMessageParser } from '../../parser'; + +export class CraftingRecipeEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CraftingRecipeMessageParser); + } + + public getParser(): CraftingRecipeMessageParser + { + return this.parser as CraftingRecipeMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/crafting/CraftingRecipesAvailableEvent.ts b/packages/communication/src/messages/incoming/crafting/CraftingRecipesAvailableEvent.ts new file mode 100644 index 0000000..b8497c2 --- /dev/null +++ b/packages/communication/src/messages/incoming/crafting/CraftingRecipesAvailableEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CraftingRecipesAvailableMessageParser } from '../../parser'; + +export class CraftingRecipesAvailableEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CraftingRecipesAvailableMessageParser); + } + + public getParser(): CraftingRecipesAvailableMessageParser + { + return this.parser as CraftingRecipesAvailableMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/crafting/CraftingResultEvent.ts b/packages/communication/src/messages/incoming/crafting/CraftingResultEvent.ts new file mode 100644 index 0000000..91ec874 --- /dev/null +++ b/packages/communication/src/messages/incoming/crafting/CraftingResultEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CraftingResultMessageParser } from '../../parser'; + +export class CraftingResultEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CraftingResultMessageParser); + } + + public getParser(): CraftingResultMessageParser + { + return this.parser as CraftingResultMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/crafting/index.ts b/packages/communication/src/messages/incoming/crafting/index.ts new file mode 100644 index 0000000..cf26449 --- /dev/null +++ b/packages/communication/src/messages/incoming/crafting/index.ts @@ -0,0 +1,4 @@ +export * from './CraftableProductsEvent'; +export * from './CraftingRecipeEvent'; +export * from './CraftingRecipesAvailableEvent'; +export * from './CraftingResultEvent'; diff --git a/packages/communication/src/messages/incoming/desktop/DesktopViewEvent.ts b/packages/communication/src/messages/incoming/desktop/DesktopViewEvent.ts new file mode 100644 index 0000000..31bc346 --- /dev/null +++ b/packages/communication/src/messages/incoming/desktop/DesktopViewEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { DesktopViewParser } from '../../parser'; + +export class DesktopViewEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, DesktopViewParser); + } + + public getParser(): DesktopViewParser + { + return this.parser as DesktopViewParser; + } +} diff --git a/packages/communication/src/messages/incoming/desktop/index.ts b/packages/communication/src/messages/incoming/desktop/index.ts new file mode 100644 index 0000000..2c0758c --- /dev/null +++ b/packages/communication/src/messages/incoming/desktop/index.ts @@ -0,0 +1 @@ +export * from './DesktopViewEvent'; diff --git a/packages/communication/src/messages/incoming/friendlist/AcceptFriendResultEvent.ts b/packages/communication/src/messages/incoming/friendlist/AcceptFriendResultEvent.ts new file mode 100644 index 0000000..a87e4e8 --- /dev/null +++ b/packages/communication/src/messages/incoming/friendlist/AcceptFriendResultEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { AcceptFriendResultParser } from '../../parser'; + +export class AcceptFriendResultEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, AcceptFriendResultParser); + } + + public getParser(): AcceptFriendResultParser + { + return this.parser as AcceptFriendResultParser; + } +} diff --git a/packages/communication/src/messages/incoming/friendlist/FindFriendsProcessResultEvent.ts b/packages/communication/src/messages/incoming/friendlist/FindFriendsProcessResultEvent.ts new file mode 100644 index 0000000..70cd013 --- /dev/null +++ b/packages/communication/src/messages/incoming/friendlist/FindFriendsProcessResultEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FindFriendsProcessResultParser } from '../../parser'; + +export class FindFriendsProcessResultEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FindFriendsProcessResultParser); + } + + public getParser(): FindFriendsProcessResultParser + { + return this.parser as FindFriendsProcessResultParser; + } +} diff --git a/packages/communication/src/messages/incoming/friendlist/FollowFriendFailedEvent.ts b/packages/communication/src/messages/incoming/friendlist/FollowFriendFailedEvent.ts new file mode 100644 index 0000000..2e6eb5e --- /dev/null +++ b/packages/communication/src/messages/incoming/friendlist/FollowFriendFailedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FollowFriendFailedParser } from '../../parser'; + +export class FollowFriendFailedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FollowFriendFailedParser); + } + + public getParser(): FollowFriendFailedParser + { + return this.parser as FollowFriendFailedParser; + } +} diff --git a/packages/communication/src/messages/incoming/friendlist/FriendListFragmentEvent.ts b/packages/communication/src/messages/incoming/friendlist/FriendListFragmentEvent.ts new file mode 100644 index 0000000..2ddc473 --- /dev/null +++ b/packages/communication/src/messages/incoming/friendlist/FriendListFragmentEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FriendListFragmentParser } from '../../parser'; + +export class FriendListFragmentEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FriendListFragmentParser); + } + + public getParser(): FriendListFragmentParser + { + return this.parser as FriendListFragmentParser; + } +} diff --git a/packages/communication/src/messages/incoming/friendlist/FriendListUpdateEvent.ts b/packages/communication/src/messages/incoming/friendlist/FriendListUpdateEvent.ts new file mode 100644 index 0000000..b5a1bda --- /dev/null +++ b/packages/communication/src/messages/incoming/friendlist/FriendListUpdateEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FriendListUpdateParser } from '../../parser'; + +export class FriendListUpdateEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FriendListUpdateParser); + } + + public getParser(): FriendListUpdateParser + { + return this.parser as FriendListUpdateParser; + } +} diff --git a/packages/communication/src/messages/incoming/friendlist/FriendNotificationEvent.ts b/packages/communication/src/messages/incoming/friendlist/FriendNotificationEvent.ts new file mode 100644 index 0000000..0f5f7e3 --- /dev/null +++ b/packages/communication/src/messages/incoming/friendlist/FriendNotificationEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FriendNotificationParser } from '../../parser'; + +export class FriendNotificationEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FriendNotificationParser); + } + + public getParser(): FriendNotificationParser + { + return this.parser as FriendNotificationParser; + } +} diff --git a/packages/communication/src/messages/incoming/friendlist/FriendRequestsEvent.ts b/packages/communication/src/messages/incoming/friendlist/FriendRequestsEvent.ts new file mode 100644 index 0000000..5ddf0e0 --- /dev/null +++ b/packages/communication/src/messages/incoming/friendlist/FriendRequestsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FriendRequestsParser } from '../../parser'; + +export class FriendRequestsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FriendRequestsParser); + } + + public getParser(): FriendRequestsParser + { + return this.parser as FriendRequestsParser; + } +} diff --git a/packages/communication/src/messages/incoming/friendlist/HabboSearchResultEvent.ts b/packages/communication/src/messages/incoming/friendlist/HabboSearchResultEvent.ts new file mode 100644 index 0000000..ed49241 --- /dev/null +++ b/packages/communication/src/messages/incoming/friendlist/HabboSearchResultEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { HabboSearchResultParser } from '../../parser'; + +export class HabboSearchResultEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, HabboSearchResultParser); + } + + public getParser(): HabboSearchResultParser + { + return this.parser as HabboSearchResultParser; + } +} diff --git a/packages/communication/src/messages/incoming/friendlist/InstantMessageErrorEvent.ts b/packages/communication/src/messages/incoming/friendlist/InstantMessageErrorEvent.ts new file mode 100644 index 0000000..61ef0db --- /dev/null +++ b/packages/communication/src/messages/incoming/friendlist/InstantMessageErrorEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { InstantMessageErrorParser } from '../../parser'; + +export class InstantMessageErrorEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, InstantMessageErrorParser); + } + + public getParser(): InstantMessageErrorParser + { + return this.parser as InstantMessageErrorParser; + } +} diff --git a/packages/communication/src/messages/incoming/friendlist/MessageErrorEvent.ts b/packages/communication/src/messages/incoming/friendlist/MessageErrorEvent.ts new file mode 100644 index 0000000..bbeb6a7 --- /dev/null +++ b/packages/communication/src/messages/incoming/friendlist/MessageErrorEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { MessageErrorParser } from '../../parser'; + +export class MessageErrorEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, MessageErrorParser); + } + + public getParser(): MessageErrorParser + { + return this.parser as MessageErrorParser; + } +} diff --git a/packages/communication/src/messages/incoming/friendlist/MessengerInitEvent.ts b/packages/communication/src/messages/incoming/friendlist/MessengerInitEvent.ts new file mode 100644 index 0000000..da8320c --- /dev/null +++ b/packages/communication/src/messages/incoming/friendlist/MessengerInitEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { MessengerInitParser } from '../../parser'; + +export class MessengerInitEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, MessengerInitParser); + } + + public getParser(): MessengerInitParser + { + return this.parser as MessengerInitParser; + } +} diff --git a/packages/communication/src/messages/incoming/friendlist/MiniMailNewMessageEvent.ts b/packages/communication/src/messages/incoming/friendlist/MiniMailNewMessageEvent.ts new file mode 100644 index 0000000..35bc9eb --- /dev/null +++ b/packages/communication/src/messages/incoming/friendlist/MiniMailNewMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { MiniMailNewMessageParser } from '../../parser'; + +export class MiniMailNewMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, MiniMailNewMessageParser); + } + + public getParser(): MiniMailNewMessageParser + { + return this.parser as MiniMailNewMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/friendlist/MiniMailUnreadCountEvent.ts b/packages/communication/src/messages/incoming/friendlist/MiniMailUnreadCountEvent.ts new file mode 100644 index 0000000..8a78238 --- /dev/null +++ b/packages/communication/src/messages/incoming/friendlist/MiniMailUnreadCountEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { MiniMailUnreadCountParser } from '../../parser'; + +export class MiniMailUnreadCountEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, MiniMailUnreadCountParser); + } + + public getParser(): MiniMailUnreadCountParser + { + return this.parser as MiniMailUnreadCountParser; + } +} diff --git a/packages/communication/src/messages/incoming/friendlist/NewConsoleMessageEvent.ts b/packages/communication/src/messages/incoming/friendlist/NewConsoleMessageEvent.ts new file mode 100644 index 0000000..c88687f --- /dev/null +++ b/packages/communication/src/messages/incoming/friendlist/NewConsoleMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { NewConsoleMessageParser } from '../../parser'; + +export class NewConsoleMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, NewConsoleMessageParser); + } + + public getParser(): NewConsoleMessageParser + { + return this.parser as NewConsoleMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/friendlist/NewFriendRequestEvent.ts b/packages/communication/src/messages/incoming/friendlist/NewFriendRequestEvent.ts new file mode 100644 index 0000000..58a875f --- /dev/null +++ b/packages/communication/src/messages/incoming/friendlist/NewFriendRequestEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { NewFriendRequestParser } from '../../parser'; + +export class NewFriendRequestEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, NewFriendRequestParser); + } + + public getParser(): NewFriendRequestParser + { + return this.parser as NewFriendRequestParser; + } +} diff --git a/packages/communication/src/messages/incoming/friendlist/RoomInviteErrorEvent.ts b/packages/communication/src/messages/incoming/friendlist/RoomInviteErrorEvent.ts new file mode 100644 index 0000000..80f56d9 --- /dev/null +++ b/packages/communication/src/messages/incoming/friendlist/RoomInviteErrorEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomInviteErrorParser } from '../../parser'; + +export class RoomInviteErrorEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomInviteErrorParser); + } + + public getParser(): RoomInviteErrorParser + { + return this.parser as RoomInviteErrorParser; + } +} diff --git a/packages/communication/src/messages/incoming/friendlist/RoomInviteEvent.ts b/packages/communication/src/messages/incoming/friendlist/RoomInviteEvent.ts new file mode 100644 index 0000000..26faa00 --- /dev/null +++ b/packages/communication/src/messages/incoming/friendlist/RoomInviteEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomInviteParser } from '../../parser'; + +export class RoomInviteEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomInviteParser); + } + + public getParser(): RoomInviteParser + { + return this.parser as RoomInviteParser; + } +} diff --git a/packages/communication/src/messages/incoming/friendlist/index.ts b/packages/communication/src/messages/incoming/friendlist/index.ts new file mode 100644 index 0000000..47c991c --- /dev/null +++ b/packages/communication/src/messages/incoming/friendlist/index.ts @@ -0,0 +1,17 @@ +export * from './AcceptFriendResultEvent'; +export * from './FindFriendsProcessResultEvent'; +export * from './FollowFriendFailedEvent'; +export * from './FriendListFragmentEvent'; +export * from './FriendListUpdateEvent'; +export * from './FriendNotificationEvent'; +export * from './FriendRequestsEvent'; +export * from './HabboSearchResultEvent'; +export * from './InstantMessageErrorEvent'; +export * from './MessageErrorEvent'; +export * from './MessengerInitEvent'; +export * from './MiniMailNewMessageEvent'; +export * from './MiniMailUnreadCountEvent'; +export * from './NewConsoleMessageEvent'; +export * from './NewFriendRequestEvent'; +export * from './RoomInviteErrorEvent'; +export * from './RoomInviteEvent'; diff --git a/packages/communication/src/messages/incoming/game/directory/Game2AccountGameStatusMessageEvent.ts b/packages/communication/src/messages/incoming/game/directory/Game2AccountGameStatusMessageEvent.ts new file mode 100644 index 0000000..b7789f7 --- /dev/null +++ b/packages/communication/src/messages/incoming/game/directory/Game2AccountGameStatusMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { Game2AccountGameStatusMessageParser } from '../../../parser'; + +export class Game2AccountGameStatusMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, Game2AccountGameStatusMessageParser); + } + + public getParser(): Game2AccountGameStatusMessageParser + { + return this.parser as Game2AccountGameStatusMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/directory/Game2GameDirectoryStatusMessageEvent.ts b/packages/communication/src/messages/incoming/game/directory/Game2GameDirectoryStatusMessageEvent.ts new file mode 100644 index 0000000..0707c99 --- /dev/null +++ b/packages/communication/src/messages/incoming/game/directory/Game2GameDirectoryStatusMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { Game2GameDirectoryStatusMessageParser } from '../../../parser'; + +export class Game2GameDirectoryStatusMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, Game2GameDirectoryStatusMessageParser); + } + + public getParser(): Game2GameDirectoryStatusMessageParser + { + return this.parser as Game2GameDirectoryStatusMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/directory/Game2InArenaQueueMessageEvent.ts b/packages/communication/src/messages/incoming/game/directory/Game2InArenaQueueMessageEvent.ts new file mode 100644 index 0000000..de7ef5d --- /dev/null +++ b/packages/communication/src/messages/incoming/game/directory/Game2InArenaQueueMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { Game2InArenaQueueMessageParser } from '../../../parser'; + +export class Game2InArenaQueueMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, Game2InArenaQueueMessageParser); + } + + public getParser(): Game2InArenaQueueMessageParser + { + return this.parser as Game2InArenaQueueMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/directory/Game2JoiningGameFailedMessageEvent.ts b/packages/communication/src/messages/incoming/game/directory/Game2JoiningGameFailedMessageEvent.ts new file mode 100644 index 0000000..134f7d2 --- /dev/null +++ b/packages/communication/src/messages/incoming/game/directory/Game2JoiningGameFailedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { Game2JoiningGameFailedMessageParser } from '../../../parser'; + +export class Game2JoiningGameFailedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, Game2JoiningGameFailedMessageParser); + } + + public getParser(): Game2JoiningGameFailedMessageParser + { + return this.parser as Game2JoiningGameFailedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/directory/Game2StartingGameFailedMessageEvent.ts b/packages/communication/src/messages/incoming/game/directory/Game2StartingGameFailedMessageEvent.ts new file mode 100644 index 0000000..f52bc24 --- /dev/null +++ b/packages/communication/src/messages/incoming/game/directory/Game2StartingGameFailedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { Game2StartingGameFailedMessageParser } from '../../../parser'; + +export class Game2StartingGameFailedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, Game2StartingGameFailedMessageParser); + } + + public getParser(): Game2StartingGameFailedMessageParser + { + return this.parser as Game2StartingGameFailedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/directory/Game2StopCounterMessageEvent.ts b/packages/communication/src/messages/incoming/game/directory/Game2StopCounterMessageEvent.ts new file mode 100644 index 0000000..b12d81b --- /dev/null +++ b/packages/communication/src/messages/incoming/game/directory/Game2StopCounterMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { Game2InArenaQueueMessageParser, Game2StopCounterMessageParser } from '../../../parser'; + +export class Game2StopCounterMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, Game2StopCounterMessageParser); + } + + public getParser(): Game2InArenaQueueMessageParser + { + return this.parser as Game2InArenaQueueMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/directory/Game2UserLeftGameMessageEvent.ts b/packages/communication/src/messages/incoming/game/directory/Game2UserLeftGameMessageEvent.ts new file mode 100644 index 0000000..b949573 --- /dev/null +++ b/packages/communication/src/messages/incoming/game/directory/Game2UserLeftGameMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { Game2UserLeftGameMessageParser } from '../../../parser'; + +export class Game2UserLeftGameMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, Game2UserLeftGameMessageParser); + } + + public getParser(): Game2UserLeftGameMessageParser + { + return this.parser as Game2UserLeftGameMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/directory/index.ts b/packages/communication/src/messages/incoming/game/directory/index.ts new file mode 100644 index 0000000..8724315 --- /dev/null +++ b/packages/communication/src/messages/incoming/game/directory/index.ts @@ -0,0 +1,7 @@ +export * from './Game2AccountGameStatusMessageEvent'; +export * from './Game2GameDirectoryStatusMessageEvent'; +export * from './Game2InArenaQueueMessageEvent'; +export * from './Game2JoiningGameFailedMessageEvent'; +export * from './Game2StartingGameFailedMessageEvent'; +export * from './Game2StopCounterMessageEvent'; +export * from './Game2UserLeftGameMessageEvent'; diff --git a/packages/communication/src/messages/incoming/game/index.ts b/packages/communication/src/messages/incoming/game/index.ts new file mode 100644 index 0000000..779f388 --- /dev/null +++ b/packages/communication/src/messages/incoming/game/index.ts @@ -0,0 +1,3 @@ +export * from './directory'; +export * from './lobby'; +export * from './score'; diff --git a/packages/communication/src/messages/incoming/game/lobby/AchievementResolutionCompletedMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/AchievementResolutionCompletedMessageEvent.ts new file mode 100644 index 0000000..55223fc --- /dev/null +++ b/packages/communication/src/messages/incoming/game/lobby/AchievementResolutionCompletedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { AchievementResolutionCompletedMessageParser } from '../../../parser'; + +export class AchievementResolutionCompletedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, AchievementResolutionCompletedMessageParser); + } + + public getParser(): AchievementResolutionCompletedMessageParser + { + return this.parser as AchievementResolutionCompletedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/lobby/AchievementResolutionProgressMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/AchievementResolutionProgressMessageEvent.ts new file mode 100644 index 0000000..03a0b43 --- /dev/null +++ b/packages/communication/src/messages/incoming/game/lobby/AchievementResolutionProgressMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { AchievementResolutionProgressMessageParser } from '../../../parser'; + +export class AchievementResolutionProgressMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, AchievementResolutionProgressMessageParser); + } + + public getParser(): AchievementResolutionProgressMessageParser + { + return this.parser as AchievementResolutionProgressMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/lobby/AchievementResolutionsMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/AchievementResolutionsMessageEvent.ts new file mode 100644 index 0000000..fffd7ac --- /dev/null +++ b/packages/communication/src/messages/incoming/game/lobby/AchievementResolutionsMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { AchievementResolutionsMessageParser } from '../../../parser'; + +export class AchievementResolutionsMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, AchievementResolutionsMessageParser); + } + + public getParser(): AchievementResolutionsMessageParser + { + return this.parser as AchievementResolutionsMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/lobby/GameAchievementsMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/GameAchievementsMessageEvent.ts new file mode 100644 index 0000000..cb6cebd --- /dev/null +++ b/packages/communication/src/messages/incoming/game/lobby/GameAchievementsMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GameAchievementsMessageParser } from '../../../parser'; + +export class GameAchievementsMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GameAchievementsMessageParser); + } + + public getParser(): GameAchievementsMessageParser + { + return this.parser as GameAchievementsMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/lobby/GameInviteMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/GameInviteMessageEvent.ts new file mode 100644 index 0000000..53c1dc8 --- /dev/null +++ b/packages/communication/src/messages/incoming/game/lobby/GameInviteMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GameInviteMessageParser } from '../../../parser'; + +export class GameInviteMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GameInviteMessageParser); + } + + public getParser(): GameInviteMessageParser + { + return this.parser as GameInviteMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/lobby/GameListMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/GameListMessageEvent.ts new file mode 100644 index 0000000..c628ece --- /dev/null +++ b/packages/communication/src/messages/incoming/game/lobby/GameListMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GameListMessageParser } from '../../../parser'; + +export class GameListMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GameListMessageParser); + } + + public getParser(): GameListMessageParser + { + return this.parser as GameListMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/lobby/GameStatusMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/GameStatusMessageEvent.ts new file mode 100644 index 0000000..a75e148 --- /dev/null +++ b/packages/communication/src/messages/incoming/game/lobby/GameStatusMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GameStatusMessageParser } from '../../../parser'; + +export class GameStatusMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GameStatusMessageParser); + } + + public getParser(): GameStatusMessageParser + { + return this.parser as GameStatusMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/lobby/JoinedQueueMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/JoinedQueueMessageEvent.ts new file mode 100644 index 0000000..56dc1f6 --- /dev/null +++ b/packages/communication/src/messages/incoming/game/lobby/JoinedQueueMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { JoinedQueueMessageParser } from '../../../parser'; + +export class JoinedQueueMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, JoinedQueueMessageParser); + } + + public getParser(): JoinedQueueMessageParser + { + return this.parser as JoinedQueueMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/lobby/JoiningQueueFailedMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/JoiningQueueFailedMessageEvent.ts new file mode 100644 index 0000000..7eb147b --- /dev/null +++ b/packages/communication/src/messages/incoming/game/lobby/JoiningQueueFailedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { JoiningQueueFailedMessageParser } from '../../../parser'; + +export class JoiningQueueFailedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, JoiningQueueFailedMessageParser); + } + + public getParser(): JoiningQueueFailedMessageParser + { + return this.parser as JoiningQueueFailedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/lobby/LeftQueueMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/LeftQueueMessageEvent.ts new file mode 100644 index 0000000..8f970ed --- /dev/null +++ b/packages/communication/src/messages/incoming/game/lobby/LeftQueueMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { LeftQueueMessageParser } from '../../../parser'; + +export class LeftQueueMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, LeftQueueMessageParser); + } + + public getParser(): LeftQueueMessageParser + { + return this.parser as LeftQueueMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/lobby/LoadGameMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/LoadGameMessageEvent.ts new file mode 100644 index 0000000..73ba11c --- /dev/null +++ b/packages/communication/src/messages/incoming/game/lobby/LoadGameMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { LoadGameMessageParser } from '../../../parser'; + +export class LoadGameMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, LoadGameMessageParser); + } + + public getParser(): LoadGameMessageParser + { + return this.parser as LoadGameMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/lobby/LoadGameUrlEvent.ts b/packages/communication/src/messages/incoming/game/lobby/LoadGameUrlEvent.ts new file mode 100644 index 0000000..a2abde1 --- /dev/null +++ b/packages/communication/src/messages/incoming/game/lobby/LoadGameUrlEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { LoadGameUrlParser } from '../../../parser'; + +export class LoadGameUrlEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, LoadGameUrlParser); + } + + public getParser(): LoadGameUrlParser + { + return this.parser as LoadGameUrlParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/lobby/UnloadGameMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/UnloadGameMessageEvent.ts new file mode 100644 index 0000000..7681a28 --- /dev/null +++ b/packages/communication/src/messages/incoming/game/lobby/UnloadGameMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UnloadGameMessageParser } from '../../../parser'; + +export class UnloadGameMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UnloadGameMessageParser); + } + + public getParser(): UnloadGameMessageParser + { + return this.parser as UnloadGameMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/lobby/UserGameAchievementsMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/UserGameAchievementsMessageEvent.ts new file mode 100644 index 0000000..b89ef68 --- /dev/null +++ b/packages/communication/src/messages/incoming/game/lobby/UserGameAchievementsMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UserGameAchievementsMessageParser } from '../../../parser'; + +export class UserGameAchievementsMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UserGameAchievementsMessageParser); + } + + public getParser(): UserGameAchievementsMessageParser + { + return this.parser as UserGameAchievementsMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/lobby/index.ts b/packages/communication/src/messages/incoming/game/lobby/index.ts new file mode 100644 index 0000000..13421db --- /dev/null +++ b/packages/communication/src/messages/incoming/game/lobby/index.ts @@ -0,0 +1,14 @@ +export * from './AchievementResolutionCompletedMessageEvent'; +export * from './AchievementResolutionProgressMessageEvent'; +export * from './AchievementResolutionsMessageEvent'; +export * from './GameAchievementsMessageEvent'; +export * from './GameInviteMessageEvent'; +export * from './GameListMessageEvent'; +export * from './GameStatusMessageEvent'; +export * from './JoinedQueueMessageEvent'; +export * from './JoiningQueueFailedMessageEvent'; +export * from './LeftQueueMessageEvent'; +export * from './LoadGameMessageEvent'; +export * from './LoadGameUrlEvent'; +export * from './UnloadGameMessageEvent'; +export * from './UserGameAchievementsMessageEvent'; diff --git a/packages/communication/src/messages/incoming/game/score/Game2WeeklyFriendsLeaderboardEvent.ts b/packages/communication/src/messages/incoming/game/score/Game2WeeklyFriendsLeaderboardEvent.ts new file mode 100644 index 0000000..bd2edf3 --- /dev/null +++ b/packages/communication/src/messages/incoming/game/score/Game2WeeklyFriendsLeaderboardEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { Game2WeeklyLeaderboardParser } from '../../../parser'; + +export class Game2WeeklyFriendsLeaderboardEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, Game2WeeklyLeaderboardParser); + } + + public getParser(): Game2WeeklyLeaderboardParser + { + return this.parser as Game2WeeklyLeaderboardParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/score/Game2WeeklyLeaderboardEvent.ts b/packages/communication/src/messages/incoming/game/score/Game2WeeklyLeaderboardEvent.ts new file mode 100644 index 0000000..1a18abd --- /dev/null +++ b/packages/communication/src/messages/incoming/game/score/Game2WeeklyLeaderboardEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { Game2WeeklyLeaderboardParser } from '../../../parser'; + +export class Game2WeeklyLeaderboardEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, Game2WeeklyLeaderboardParser); + } + + public getParser(): Game2WeeklyLeaderboardParser + { + return this.parser as Game2WeeklyLeaderboardParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/score/WeeklyCompetitiveFriendsLeaderboardEvent.ts b/packages/communication/src/messages/incoming/game/score/WeeklyCompetitiveFriendsLeaderboardEvent.ts new file mode 100644 index 0000000..280cccf --- /dev/null +++ b/packages/communication/src/messages/incoming/game/score/WeeklyCompetitiveFriendsLeaderboardEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { Game2WeeklyLeaderboardParser } from '../../../parser'; + +export class WeeklyCompetitiveFriendsLeaderboardEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, Game2WeeklyLeaderboardParser); + } + + public getParser(): Game2WeeklyLeaderboardParser + { + return this.parser as Game2WeeklyLeaderboardParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/score/WeeklyCompetitiveLeaderboardEvent.ts b/packages/communication/src/messages/incoming/game/score/WeeklyCompetitiveLeaderboardEvent.ts new file mode 100644 index 0000000..bcc73bf --- /dev/null +++ b/packages/communication/src/messages/incoming/game/score/WeeklyCompetitiveLeaderboardEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { Game2WeeklyLeaderboardParser } from '../../../parser'; + +export class WeeklyCompetitiveLeaderboardEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, Game2WeeklyLeaderboardParser); + } + + public getParser(): Game2WeeklyLeaderboardParser + { + return this.parser as Game2WeeklyLeaderboardParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/score/WeeklyGameRewardEvent.ts b/packages/communication/src/messages/incoming/game/score/WeeklyGameRewardEvent.ts new file mode 100644 index 0000000..7aa8531 --- /dev/null +++ b/packages/communication/src/messages/incoming/game/score/WeeklyGameRewardEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { WeeklyGameRewardParser } from '../../../parser'; + +export class WeeklyGameRewardEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, WeeklyGameRewardParser); + } + + public getParser(): WeeklyGameRewardParser + { + return this.parser as WeeklyGameRewardParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/score/WeeklyGameRewardWinnersEvent.ts b/packages/communication/src/messages/incoming/game/score/WeeklyGameRewardWinnersEvent.ts new file mode 100644 index 0000000..5a18a10 --- /dev/null +++ b/packages/communication/src/messages/incoming/game/score/WeeklyGameRewardWinnersEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { WeeklyGameRewardWinnersParser } from '../../../parser'; + +export class WeeklyGameRewardWinnersEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, WeeklyGameRewardWinnersParser); + } + + public getParser(): WeeklyGameRewardWinnersParser + { + return this.parser as WeeklyGameRewardWinnersParser; + } +} diff --git a/packages/communication/src/messages/incoming/game/score/index.ts b/packages/communication/src/messages/incoming/game/score/index.ts new file mode 100644 index 0000000..546b5a3 --- /dev/null +++ b/packages/communication/src/messages/incoming/game/score/index.ts @@ -0,0 +1,6 @@ +export * from './Game2WeeklyFriendsLeaderboardEvent'; +export * from './Game2WeeklyLeaderboardEvent'; +export * from './WeeklyCompetitiveFriendsLeaderboardEvent'; +export * from './WeeklyCompetitiveLeaderboardEvent'; +export * from './WeeklyGameRewardEvent'; +export * from './WeeklyGameRewardWinnersEvent'; diff --git a/packages/communication/src/messages/incoming/generic/GenericErrorEvent.ts b/packages/communication/src/messages/incoming/generic/GenericErrorEvent.ts new file mode 100644 index 0000000..9ac6bc4 --- /dev/null +++ b/packages/communication/src/messages/incoming/generic/GenericErrorEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GenericErrorParser } from '../../parser'; + +export class GenericErrorEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GenericErrorParser); + } + + public getParser(): GenericErrorParser + { + return this.parser as GenericErrorParser; + } +} diff --git a/packages/communication/src/messages/incoming/generic/index.ts b/packages/communication/src/messages/incoming/generic/index.ts new file mode 100644 index 0000000..08ed38e --- /dev/null +++ b/packages/communication/src/messages/incoming/generic/index.ts @@ -0,0 +1 @@ +export * from './GenericErrorEvent'; diff --git a/packages/communication/src/messages/incoming/gifts/PhoneCollectionStateMessageEvent.ts b/packages/communication/src/messages/incoming/gifts/PhoneCollectionStateMessageEvent.ts new file mode 100644 index 0000000..40a6832 --- /dev/null +++ b/packages/communication/src/messages/incoming/gifts/PhoneCollectionStateMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PhoneCollectionStateParser } from '../../parser'; + +export class PhoneCollectionStateMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PhoneCollectionStateParser); + } + + public getParser(): PhoneCollectionStateParser + { + return this.parser as PhoneCollectionStateParser; + } +} diff --git a/packages/communication/src/messages/incoming/gifts/TryPhoneNumberResultMessageEvent.ts b/packages/communication/src/messages/incoming/gifts/TryPhoneNumberResultMessageEvent.ts new file mode 100644 index 0000000..08999f2 --- /dev/null +++ b/packages/communication/src/messages/incoming/gifts/TryPhoneNumberResultMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { TryPhoneNumberResultParser } from '../../parser'; + +export class TryPhoneNumberResultMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, TryPhoneNumberResultParser); + } + + public getParser(): TryPhoneNumberResultParser + { + return this.parser as TryPhoneNumberResultParser; + } +} diff --git a/packages/communication/src/messages/incoming/gifts/TryVerificationCodeResultMessageEvent.ts b/packages/communication/src/messages/incoming/gifts/TryVerificationCodeResultMessageEvent.ts new file mode 100644 index 0000000..5ad52a2 --- /dev/null +++ b/packages/communication/src/messages/incoming/gifts/TryVerificationCodeResultMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { TryVerificationCodeResultParser } from '../../parser'; + +export class TryVerificationCodeResultMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, TryVerificationCodeResultParser); + } + + public getParser(): TryVerificationCodeResultParser + { + return this.parser as TryVerificationCodeResultParser; + } +} diff --git a/packages/communication/src/messages/incoming/gifts/index.ts b/packages/communication/src/messages/incoming/gifts/index.ts new file mode 100644 index 0000000..ee498b9 --- /dev/null +++ b/packages/communication/src/messages/incoming/gifts/index.ts @@ -0,0 +1,3 @@ +export * from './PhoneCollectionStateMessageEvent'; +export * from './TryPhoneNumberResultMessageEvent'; +export * from './TryVerificationCodeResultMessageEvent'; diff --git a/packages/communication/src/messages/incoming/group/GroupBadgePartsEvent.ts b/packages/communication/src/messages/incoming/group/GroupBadgePartsEvent.ts new file mode 100644 index 0000000..b4bebd7 --- /dev/null +++ b/packages/communication/src/messages/incoming/group/GroupBadgePartsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GroupBadgePartsParser } from '../../parser'; + +export class GroupBadgePartsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GroupBadgePartsParser); + } + + public getParser(): GroupBadgePartsParser + { + return this.parser as GroupBadgePartsParser; + } +} diff --git a/packages/communication/src/messages/incoming/group/GroupBuyDataEvent.ts b/packages/communication/src/messages/incoming/group/GroupBuyDataEvent.ts new file mode 100644 index 0000000..8452ad6 --- /dev/null +++ b/packages/communication/src/messages/incoming/group/GroupBuyDataEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GroupBuyDataParser } from '../../parser'; + +export class GroupBuyDataEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GroupBuyDataParser); + } + + public getParser(): GroupBuyDataParser + { + return this.parser as GroupBuyDataParser; + } +} diff --git a/packages/communication/src/messages/incoming/group/GroupConfirmMemberRemoveEvent.ts b/packages/communication/src/messages/incoming/group/GroupConfirmMemberRemoveEvent.ts new file mode 100644 index 0000000..f85f919 --- /dev/null +++ b/packages/communication/src/messages/incoming/group/GroupConfirmMemberRemoveEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GroupConfirmMemberRemoveParser } from '../../parser'; + +export class GroupConfirmMemberRemoveEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GroupConfirmMemberRemoveParser); + } + + public getParser(): GroupConfirmMemberRemoveParser + { + return this.parser as GroupConfirmMemberRemoveParser; + } +} diff --git a/packages/communication/src/messages/incoming/group/GroupInformationEvent.ts b/packages/communication/src/messages/incoming/group/GroupInformationEvent.ts new file mode 100644 index 0000000..7ede203 --- /dev/null +++ b/packages/communication/src/messages/incoming/group/GroupInformationEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GroupInformationParser } from '../../parser'; + +export class GroupInformationEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GroupInformationParser); + } + + public getParser(): GroupInformationParser + { + return this.parser as GroupInformationParser; + } +} diff --git a/packages/communication/src/messages/incoming/group/GroupMembersEvent.ts b/packages/communication/src/messages/incoming/group/GroupMembersEvent.ts new file mode 100644 index 0000000..660561b --- /dev/null +++ b/packages/communication/src/messages/incoming/group/GroupMembersEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GroupMembersParser } from '../../parser'; + +export class GroupMembersEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GroupMembersParser); + } + + public getParser(): GroupMembersParser + { + return this.parser as GroupMembersParser; + } +} diff --git a/packages/communication/src/messages/incoming/group/GroupPurchasedEvent.ts b/packages/communication/src/messages/incoming/group/GroupPurchasedEvent.ts new file mode 100644 index 0000000..469b417 --- /dev/null +++ b/packages/communication/src/messages/incoming/group/GroupPurchasedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GroupPurchasedParser } from '../../parser'; + +export class GroupPurchasedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GroupPurchasedParser); + } + + public getParser(): GroupPurchasedParser + { + return this.parser as GroupPurchasedParser; + } +} diff --git a/packages/communication/src/messages/incoming/group/GroupSettingsEvent.ts b/packages/communication/src/messages/incoming/group/GroupSettingsEvent.ts new file mode 100644 index 0000000..b8f895a --- /dev/null +++ b/packages/communication/src/messages/incoming/group/GroupSettingsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GroupSettingsParser } from '../../parser'; + +export class GroupSettingsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GroupSettingsParser); + } + + public getParser(): GroupSettingsParser + { + return this.parser as GroupSettingsParser; + } +} diff --git a/packages/communication/src/messages/incoming/group/HabboGroupDeactivatedMessageEvent.ts b/packages/communication/src/messages/incoming/group/HabboGroupDeactivatedMessageEvent.ts new file mode 100644 index 0000000..ff2090b --- /dev/null +++ b/packages/communication/src/messages/incoming/group/HabboGroupDeactivatedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { HabboGroupDeactivatedMessageParser } from '../../parser'; + +export class HabboGroupDeactivatedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, HabboGroupDeactivatedMessageParser); + } + + public getParser(): HabboGroupDeactivatedMessageParser + { + return this.parser as HabboGroupDeactivatedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/group/index.ts b/packages/communication/src/messages/incoming/group/index.ts new file mode 100644 index 0000000..5fc4853 --- /dev/null +++ b/packages/communication/src/messages/incoming/group/index.ts @@ -0,0 +1,8 @@ +export * from './GroupBadgePartsEvent'; +export * from './GroupBuyDataEvent'; +export * from './GroupConfirmMemberRemoveEvent'; +export * from './GroupInformationEvent'; +export * from './GroupMembersEvent'; +export * from './GroupPurchasedEvent'; +export * from './GroupSettingsEvent'; +export * from './HabboGroupDeactivatedMessageEvent'; diff --git a/packages/communication/src/messages/incoming/groupforums/ForumDataMessageEvent.ts b/packages/communication/src/messages/incoming/groupforums/ForumDataMessageEvent.ts new file mode 100644 index 0000000..9bd073b --- /dev/null +++ b/packages/communication/src/messages/incoming/groupforums/ForumDataMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ForumDataMessageParser } from '../../parser'; + +export class ForumDataMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ForumDataMessageParser); + } + + public getParser(): ForumDataMessageParser + { + return this.parser as ForumDataMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/groupforums/ForumsListMessageEvent.ts b/packages/communication/src/messages/incoming/groupforums/ForumsListMessageEvent.ts new file mode 100644 index 0000000..7d8553f --- /dev/null +++ b/packages/communication/src/messages/incoming/groupforums/ForumsListMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GetForumsListMessageParser } from '../../parser'; + +export class ForumsListMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GetForumsListMessageParser); + } + + public getParser(): GetForumsListMessageParser + { + return this.parser as GetForumsListMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/groupforums/GuildForumThreadsEvent.ts b/packages/communication/src/messages/incoming/groupforums/GuildForumThreadsEvent.ts new file mode 100644 index 0000000..171685b --- /dev/null +++ b/packages/communication/src/messages/incoming/groupforums/GuildForumThreadsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GuildForumThreadsParser } from '../../parser'; + +export class GuildForumThreadsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GuildForumThreadsParser); + } + + public getParser(): GuildForumThreadsParser + { + return this.parser as GuildForumThreadsParser; + } +} diff --git a/packages/communication/src/messages/incoming/groupforums/PostMessageMessageEvent.ts b/packages/communication/src/messages/incoming/groupforums/PostMessageMessageEvent.ts new file mode 100644 index 0000000..76bc553 --- /dev/null +++ b/packages/communication/src/messages/incoming/groupforums/PostMessageMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PostMessageMessageParser } from '../../parser'; + +export class PostMessageMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PostMessageMessageParser); + } + + public getParser(): PostMessageMessageParser + { + return this.parser as PostMessageMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/groupforums/PostThreadMessageEvent.ts b/packages/communication/src/messages/incoming/groupforums/PostThreadMessageEvent.ts new file mode 100644 index 0000000..caa22c8 --- /dev/null +++ b/packages/communication/src/messages/incoming/groupforums/PostThreadMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PostThreadMessageParser } from '../../parser'; + +export class PostThreadMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PostThreadMessageParser); + } + + public getParser(): PostThreadMessageParser + { + return this.parser as PostThreadMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/groupforums/ThreadMessagesMessageEvent.ts b/packages/communication/src/messages/incoming/groupforums/ThreadMessagesMessageEvent.ts new file mode 100644 index 0000000..0665d88 --- /dev/null +++ b/packages/communication/src/messages/incoming/groupforums/ThreadMessagesMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ThreadMessagesMessageParser } from '../../parser'; + +export class ThreadMessagesMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ThreadMessagesMessageParser); + } + + public getParser(): ThreadMessagesMessageParser + { + return this.parser as ThreadMessagesMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/groupforums/UnreadForumsCountMessageEvent.ts b/packages/communication/src/messages/incoming/groupforums/UnreadForumsCountMessageEvent.ts new file mode 100644 index 0000000..2284ccc --- /dev/null +++ b/packages/communication/src/messages/incoming/groupforums/UnreadForumsCountMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UnreadForumsCountMessageParser } from '../../parser'; + +export class UnreadForumsCountMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UnreadForumsCountMessageParser); + } + + public getParser(): UnreadForumsCountMessageParser + { + return this.parser as UnreadForumsCountMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/groupforums/UpdateMessageMessageEvent.ts b/packages/communication/src/messages/incoming/groupforums/UpdateMessageMessageEvent.ts new file mode 100644 index 0000000..b7a9684 --- /dev/null +++ b/packages/communication/src/messages/incoming/groupforums/UpdateMessageMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UpdateMessageMessageParser } from '../../parser'; + +export class UpdateMessageMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UpdateMessageMessageParser); + } + + public getParser(): UpdateMessageMessageParser + { + return this.parser as UpdateMessageMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/groupforums/UpdateThreadMessageEvent.ts b/packages/communication/src/messages/incoming/groupforums/UpdateThreadMessageEvent.ts new file mode 100644 index 0000000..2a834c5 --- /dev/null +++ b/packages/communication/src/messages/incoming/groupforums/UpdateThreadMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UpdateThreadMessageParser } from '../../parser'; + +export class UpdateThreadMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UpdateThreadMessageParser); + } + + public getParser(): UpdateThreadMessageParser + { + return this.parser as UpdateThreadMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/groupforums/index.ts b/packages/communication/src/messages/incoming/groupforums/index.ts new file mode 100644 index 0000000..53566b9 --- /dev/null +++ b/packages/communication/src/messages/incoming/groupforums/index.ts @@ -0,0 +1,9 @@ +export * from './ForumDataMessageEvent'; +export * from './ForumsListMessageEvent'; +export * from './GuildForumThreadsEvent'; +export * from './PostMessageMessageEvent'; +export * from './PostThreadMessageEvent'; +export * from './ThreadMessagesMessageEvent'; +export * from './UnreadForumsCountMessageEvent'; +export * from './UpdateMessageMessageEvent'; +export * from './UpdateThreadMessageEvent'; diff --git a/packages/communication/src/messages/incoming/handshake/CompleteDiffieHandshakeEvent.ts b/packages/communication/src/messages/incoming/handshake/CompleteDiffieHandshakeEvent.ts new file mode 100644 index 0000000..3256284 --- /dev/null +++ b/packages/communication/src/messages/incoming/handshake/CompleteDiffieHandshakeEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CompleteDiffieHandshakeParser } from '../../parser'; + +export class CompleteDiffieHandshakeEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CompleteDiffieHandshakeParser); + } + + public getParser(): CompleteDiffieHandshakeParser + { + return this.parser as CompleteDiffieHandshakeParser; + } +} diff --git a/packages/communication/src/messages/incoming/handshake/DisconnectReasonEnum.ts b/packages/communication/src/messages/incoming/handshake/DisconnectReasonEnum.ts new file mode 100644 index 0000000..dcd50df --- /dev/null +++ b/packages/communication/src/messages/incoming/handshake/DisconnectReasonEnum.ts @@ -0,0 +1,46 @@ +export class DisconnectReasonEnum +{ + public static readonly LOGOUT: number = 0; + public static readonly JUST_BANNED: number = 1; + public static readonly CONCURRENT_LOGIN: number = 2; + public static readonly CONNECTION_LOST_TO_PEER: number = 3; + public static readonly AVATAR_IDENTITY_CHANGE: number = 4; + public static readonly REMOVE_FURNITURE_TOOL: number = 5; + public static readonly STILL_BANNED: number = 10; + public static readonly DUAL_LOGIN_BY_USERID: number = 11; + public static readonly HOTEL_CLOSED: number = 12; + public static readonly DUAL_LOGIN_BY_IP: number = 13; + public static readonly PEER_CONNECTION_MISSING: number = 16; + public static readonly NO_LOGIN_PERMISSION: number = 17; + public static readonly DUPLICATE_CONNECTION: number = 18; + public static readonly HOTEL_CLOSING: number = 19; + public static readonly INCORRECT_PASSWORD: number = 20; + public static readonly INVALID_LOGIN_TICKET: number = 22; + public static readonly VERSION_CHECK_URL: number = 23; + public static readonly VERSION_CHECK_PROPERTY: number = 24; + public static readonly VERSION_CHECK_MACHINE_ID: number = 25; + public static readonly NO_MESSENGER_SESSION: number = 26; + public static readonly USER_NOT_FOUND: number = 27; + public static readonly CRYPTO_NOT_INITIALIZED: number = 28; + public static readonly DEV_CRYPTO_NOT_ALLOWED: number = 29; + public static readonly DUPLICATE_UUID_DETECTED: number = 100; + public static readonly OLD_SESSION_IN_PROXY: number = 101; + public static readonly PUBLIC_KEY_NOT_NUMERIC: number = 102; + public static readonly PUBLIC_KEY_TOO_SHORT: number = 103; + public static readonly SOCKET_READ_GENERIC: number = 104; + public static readonly SOCKET_READ_FIRST_BYTE: number = 105; + public static readonly SOCKET_READ_LENGTH: number = 106; + public static readonly SOCKET_READ_BODY: number = 107; + public static readonly SOCKET_READ_POLICY: number = 108; + public static readonly SOCKET_IO_EXCEPTION: number = 109; + public static readonly SOCKET_WRONG_CRYPTO: number = 110; + public static readonly PROXY_RUNTIME_EXCEPTION: number = 111; + public static readonly IDLE_CONNECTION: number = 112; + public static readonly PONG_TIMEOUT: number = 113; + public static readonly IDLE_CONNECTION_NOT_AUTH: number = 114; + public static readonly IDLE_CONNECTION_NO_USER_ID: number = 115; + public static readonly WRITE_CLOSED_CHANNEL: number = 116; + public static readonly SOCKET_WRITE_EXCEPTION_1: number = 117; + public static readonly SOCKET_WRITE_EXCEPTION_2: number = 118; + public static readonly SOCKET_WRITE_EXCEPTION_3: number = 119; +} diff --git a/packages/communication/src/messages/incoming/handshake/DisconnectReasonEvent.ts b/packages/communication/src/messages/incoming/handshake/DisconnectReasonEvent.ts new file mode 100644 index 0000000..07be776 --- /dev/null +++ b/packages/communication/src/messages/incoming/handshake/DisconnectReasonEvent.ts @@ -0,0 +1,33 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { DisconnectReasonParser } from '../../parser'; +import { DisconnectReasonEnum } from './DisconnectReasonEnum'; + +export class DisconnectReasonEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, DisconnectReasonParser); + } + + public getParser(): DisconnectReasonParser + { + return this.parser as DisconnectReasonParser; + } + + public get reasonString(): string + { + switch(this.getParser().reason) + { + case DisconnectReasonEnum.JUST_BANNED: + case DisconnectReasonEnum.STILL_BANNED: + return 'banned'; + case DisconnectReasonEnum.CONCURRENT_LOGIN: + return 'concurrentlogin'; + case DisconnectReasonEnum.INCORRECT_PASSWORD: + return 'incorrectpassword'; + default: + return 'logout'; + } + } +} diff --git a/packages/communication/src/messages/incoming/handshake/IdentityAccountsEvent.ts b/packages/communication/src/messages/incoming/handshake/IdentityAccountsEvent.ts new file mode 100644 index 0000000..b9c74b8 --- /dev/null +++ b/packages/communication/src/messages/incoming/handshake/IdentityAccountsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { IdentityAccountsParser } from '../../parser'; + +export class IdentityAccountsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, IdentityAccountsParser); + } + + public getParser(): IdentityAccountsParser + { + return this.parser as IdentityAccountsParser; + } +} diff --git a/packages/communication/src/messages/incoming/handshake/InitDiffieHandshakeEvent.ts b/packages/communication/src/messages/incoming/handshake/InitDiffieHandshakeEvent.ts new file mode 100644 index 0000000..87a57dc --- /dev/null +++ b/packages/communication/src/messages/incoming/handshake/InitDiffieHandshakeEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { InitDiffieHandshakeParser } from '../../parser'; + +export class InitDiffieHandshakeEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, InitDiffieHandshakeParser); + } + + public getParser(): InitDiffieHandshakeParser + { + return this.parser as InitDiffieHandshakeParser; + } +} diff --git a/packages/communication/src/messages/incoming/handshake/NoobnessLevelMessageEvent.ts b/packages/communication/src/messages/incoming/handshake/NoobnessLevelMessageEvent.ts new file mode 100644 index 0000000..72fc16e --- /dev/null +++ b/packages/communication/src/messages/incoming/handshake/NoobnessLevelMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { NoobnessLevelMessageParser } from '../../parser'; + +export class NoobnessLevelMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, NoobnessLevelMessageParser); + } + + public getParser(): NoobnessLevelMessageParser + { + return this.parser as NoobnessLevelMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/handshake/index.ts b/packages/communication/src/messages/incoming/handshake/index.ts new file mode 100644 index 0000000..81bb67a --- /dev/null +++ b/packages/communication/src/messages/incoming/handshake/index.ts @@ -0,0 +1,6 @@ +export * from './CompleteDiffieHandshakeEvent'; +export * from './DisconnectReasonEnum'; +export * from './DisconnectReasonEvent'; +export * from './IdentityAccountsEvent'; +export * from './InitDiffieHandshakeEvent'; +export * from './NoobnessLevelMessageEvent'; diff --git a/packages/communication/src/messages/incoming/help/CallForHelpDisabledNotifyMessageEvent.ts b/packages/communication/src/messages/incoming/help/CallForHelpDisabledNotifyMessageEvent.ts new file mode 100644 index 0000000..7d8d9d7 --- /dev/null +++ b/packages/communication/src/messages/incoming/help/CallForHelpDisabledNotifyMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CallForHelpDisabledNotifyMessageParser } from '../../parser'; + +export class CallForHelpDisabledNotifyMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CallForHelpDisabledNotifyMessageParser); + } + + public getParser(): CallForHelpDisabledNotifyMessageParser + { + return this.parser as CallForHelpDisabledNotifyMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/CallForHelpPendingCallsDeletedMessageEvent.ts b/packages/communication/src/messages/incoming/help/CallForHelpPendingCallsDeletedMessageEvent.ts new file mode 100644 index 0000000..b43211e --- /dev/null +++ b/packages/communication/src/messages/incoming/help/CallForHelpPendingCallsDeletedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CallForHelpPendingCallsDeletedMessageParser } from '../../parser'; + +export class CallForHelpPendingCallsDeletedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CallForHelpPendingCallsDeletedMessageParser); + } + + public getParser(): CallForHelpPendingCallsDeletedMessageParser + { + return this.parser as CallForHelpPendingCallsDeletedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/CallForHelpPendingCallsMessageEvent.ts b/packages/communication/src/messages/incoming/help/CallForHelpPendingCallsMessageEvent.ts new file mode 100644 index 0000000..c159cb5 --- /dev/null +++ b/packages/communication/src/messages/incoming/help/CallForHelpPendingCallsMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CallForHelpPendingCallsMessageParser } from '../../parser'; + +export class CallForHelpPendingCallsMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CallForHelpPendingCallsMessageParser); + } + + public getParser(): CallForHelpPendingCallsMessageParser + { + return this.parser as CallForHelpPendingCallsMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/CallForHelpReplyMessageEvent.ts b/packages/communication/src/messages/incoming/help/CallForHelpReplyMessageEvent.ts new file mode 100644 index 0000000..9259fca --- /dev/null +++ b/packages/communication/src/messages/incoming/help/CallForHelpReplyMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CallForHelpReplyMessageParser } from '../../parser'; + +export class CallForHelpReplyMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CallForHelpReplyMessageParser); + } + + public getParser(): CallForHelpReplyMessageParser + { + return this.parser as CallForHelpReplyMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/CallForHelpResultMessageEvent.ts b/packages/communication/src/messages/incoming/help/CallForHelpResultMessageEvent.ts new file mode 100644 index 0000000..cc8973f --- /dev/null +++ b/packages/communication/src/messages/incoming/help/CallForHelpResultMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CallForHelpResultMessageParser } from '../../parser'; + +export class CallForHelpResultMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CallForHelpResultMessageParser); + } + + public getParser(): CallForHelpResultMessageParser + { + return this.parser as CallForHelpResultMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/ChatReviewSessionDetachedMessageEvent.ts b/packages/communication/src/messages/incoming/help/ChatReviewSessionDetachedMessageEvent.ts new file mode 100644 index 0000000..90f558e --- /dev/null +++ b/packages/communication/src/messages/incoming/help/ChatReviewSessionDetachedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ChatReviewSessionDetachedMessageParser } from '../../parser'; + +export class ChatReviewSessionDetachedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ChatReviewSessionDetachedMessageParser); + } + + public getParser(): ChatReviewSessionDetachedMessageParser + { + return this.parser as ChatReviewSessionDetachedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/ChatReviewSessionOfferedToGuideMessageEvent.ts b/packages/communication/src/messages/incoming/help/ChatReviewSessionOfferedToGuideMessageEvent.ts new file mode 100644 index 0000000..89b3d8b --- /dev/null +++ b/packages/communication/src/messages/incoming/help/ChatReviewSessionOfferedToGuideMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ChatReviewSessionOfferedToGuideMessageParser } from '../../parser'; + +export class ChatReviewSessionOfferedToGuideMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ChatReviewSessionOfferedToGuideMessageParser); + } + + public getParser(): ChatReviewSessionOfferedToGuideMessageParser + { + return this.parser as ChatReviewSessionOfferedToGuideMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/ChatReviewSessionResultsMessageEvent.ts b/packages/communication/src/messages/incoming/help/ChatReviewSessionResultsMessageEvent.ts new file mode 100644 index 0000000..8a7149f --- /dev/null +++ b/packages/communication/src/messages/incoming/help/ChatReviewSessionResultsMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ChatReviewSessionResultsMessageParser } from '../../parser'; + +export class ChatReviewSessionResultsMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ChatReviewSessionResultsMessageParser); + } + + public getParser(): ChatReviewSessionResultsMessageParser + { + return this.parser as ChatReviewSessionResultsMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/ChatReviewSessionStartedMessageEvent.ts b/packages/communication/src/messages/incoming/help/ChatReviewSessionStartedMessageEvent.ts new file mode 100644 index 0000000..8252d67 --- /dev/null +++ b/packages/communication/src/messages/incoming/help/ChatReviewSessionStartedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ChatReviewSessionStartedMessageParser } from '../../parser'; + +export class ChatReviewSessionStartedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ChatReviewSessionStartedMessageParser); + } + + public getParser(): ChatReviewSessionStartedMessageParser + { + return this.parser as ChatReviewSessionStartedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/ChatReviewSessionVotingStatusMessageEvent.ts b/packages/communication/src/messages/incoming/help/ChatReviewSessionVotingStatusMessageEvent.ts new file mode 100644 index 0000000..874b35a --- /dev/null +++ b/packages/communication/src/messages/incoming/help/ChatReviewSessionVotingStatusMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ChatReviewSessionVotingStatusMessageParser } from '../../parser'; + +export class ChatReviewSessionVotingStatusMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ChatReviewSessionVotingStatusMessageParser); + } + + public getParser(): ChatReviewSessionVotingStatusMessageParser + { + return this.parser as ChatReviewSessionVotingStatusMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/GuideOnDutyStatusMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideOnDutyStatusMessageEvent.ts new file mode 100644 index 0000000..ab40fd0 --- /dev/null +++ b/packages/communication/src/messages/incoming/help/GuideOnDutyStatusMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GuideOnDutyStatusMessageParser } from '../../parser'; + +export class GuideOnDutyStatusMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GuideOnDutyStatusMessageParser); + } + + public getParser(): GuideOnDutyStatusMessageParser + { + return this.parser as GuideOnDutyStatusMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/GuideReportingStatusMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideReportingStatusMessageEvent.ts new file mode 100644 index 0000000..4d5b298 --- /dev/null +++ b/packages/communication/src/messages/incoming/help/GuideReportingStatusMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GuideReportingStatusMessageParser } from './../../parser'; + +export class GuideReportingStatusMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GuideReportingStatusMessageParser); + } + + public getParser(): GuideReportingStatusMessageParser + { + return this.parser as GuideReportingStatusMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/GuideSessionAttachedMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideSessionAttachedMessageEvent.ts new file mode 100644 index 0000000..9c3be87 --- /dev/null +++ b/packages/communication/src/messages/incoming/help/GuideSessionAttachedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GuideSessionAttachedMessageParser } from '../../parser'; + +export class GuideSessionAttachedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GuideSessionAttachedMessageParser); + } + + public getParser(): GuideSessionAttachedMessageParser + { + return this.parser as GuideSessionAttachedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/GuideSessionDetachedMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideSessionDetachedMessageEvent.ts new file mode 100644 index 0000000..146a49e --- /dev/null +++ b/packages/communication/src/messages/incoming/help/GuideSessionDetachedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GuideSessionDetachedMessageParser } from '../../parser'; + +export class GuideSessionDetachedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GuideSessionDetachedMessageParser); + } + + public getParser(): GuideSessionDetachedMessageParser + { + return this.parser as GuideSessionDetachedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/GuideSessionEndedMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideSessionEndedMessageEvent.ts new file mode 100644 index 0000000..1de4f5c --- /dev/null +++ b/packages/communication/src/messages/incoming/help/GuideSessionEndedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GuideSessionEndedMessageParser } from '../../parser'; + +export class GuideSessionEndedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GuideSessionEndedMessageParser); + } + + public getParser(): GuideSessionEndedMessageParser + { + return this.parser as GuideSessionEndedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/GuideSessionErrorMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideSessionErrorMessageEvent.ts new file mode 100644 index 0000000..b505471 --- /dev/null +++ b/packages/communication/src/messages/incoming/help/GuideSessionErrorMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GuideSessionErrorMessageParser } from '../../parser'; + +export class GuideSessionErrorMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GuideSessionErrorMessageParser); + } + + public getParser(): GuideSessionErrorMessageParser + { + return this.parser as GuideSessionErrorMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/GuideSessionInvitedToGuideRoomMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideSessionInvitedToGuideRoomMessageEvent.ts new file mode 100644 index 0000000..ba9e01a --- /dev/null +++ b/packages/communication/src/messages/incoming/help/GuideSessionInvitedToGuideRoomMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GuideSessionInvitedToGuideRoomMessageParser } from '../../parser'; + +export class GuideSessionInvitedToGuideRoomMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GuideSessionInvitedToGuideRoomMessageParser); + } + + public getParser(): GuideSessionInvitedToGuideRoomMessageParser + { + return this.parser as GuideSessionInvitedToGuideRoomMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/GuideSessionMessageMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideSessionMessageMessageEvent.ts new file mode 100644 index 0000000..7e7a2cb --- /dev/null +++ b/packages/communication/src/messages/incoming/help/GuideSessionMessageMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GuideSessionMessageMessageParser } from '../../parser'; + +export class GuideSessionMessageMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GuideSessionMessageMessageParser); + } + + public getParser(): GuideSessionMessageMessageParser + { + return this.parser as GuideSessionMessageMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/GuideSessionPartnerIsTypingMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideSessionPartnerIsTypingMessageEvent.ts new file mode 100644 index 0000000..5406640 --- /dev/null +++ b/packages/communication/src/messages/incoming/help/GuideSessionPartnerIsTypingMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GuideSessionPartnerIsTypingMessageParser } from '../../parser'; + +export class GuideSessionPartnerIsTypingMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GuideSessionPartnerIsTypingMessageParser); + } + + public getParser(): GuideSessionPartnerIsTypingMessageParser + { + return this.parser as GuideSessionPartnerIsTypingMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/GuideSessionRequesterRoomMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideSessionRequesterRoomMessageEvent.ts new file mode 100644 index 0000000..3ab6c1c --- /dev/null +++ b/packages/communication/src/messages/incoming/help/GuideSessionRequesterRoomMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GuideSessionRequesterRoomMessageParser } from '../../parser'; + +export class GuideSessionRequesterRoomMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GuideSessionRequesterRoomMessageParser); + } + + public getParser(): GuideSessionRequesterRoomMessageParser + { + return this.parser as GuideSessionRequesterRoomMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/GuideSessionStartedMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideSessionStartedMessageEvent.ts new file mode 100644 index 0000000..1f139d9 --- /dev/null +++ b/packages/communication/src/messages/incoming/help/GuideSessionStartedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GuideSessionStartedMessageParser } from '../../parser'; + +export class GuideSessionStartedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GuideSessionStartedMessageParser); + } + + public getParser(): GuideSessionStartedMessageParser + { + return this.parser as GuideSessionStartedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/GuideTicketCreationResultMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideTicketCreationResultMessageEvent.ts new file mode 100644 index 0000000..730f887 --- /dev/null +++ b/packages/communication/src/messages/incoming/help/GuideTicketCreationResultMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GuideTicketCreationResultMessageParser } from '../../parser'; + +export class GuideTicketCreationResultMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GuideTicketCreationResultMessageParser); + } + + public getParser(): GuideTicketCreationResultMessageParser + { + return this.parser as GuideTicketCreationResultMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/GuideTicketResolutionMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideTicketResolutionMessageEvent.ts new file mode 100644 index 0000000..4e8ae55 --- /dev/null +++ b/packages/communication/src/messages/incoming/help/GuideTicketResolutionMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GuideTicketResolutionMessageParser } from '../../parser'; + +export class GuideTicketResolutionMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GuideTicketResolutionMessageParser); + } + + public getParser(): GuideTicketResolutionMessageParser + { + return this.parser as GuideTicketResolutionMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/HotelMergeNameChangeEvent.ts b/packages/communication/src/messages/incoming/help/HotelMergeNameChangeEvent.ts new file mode 100644 index 0000000..ab9dd38 --- /dev/null +++ b/packages/communication/src/messages/incoming/help/HotelMergeNameChangeEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { HotelMergeNameChangeParser } from '../../parser'; + +export class HotelMergeNameChangeEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, HotelMergeNameChangeParser); + } + + public getParser(): HotelMergeNameChangeParser + { + return this.parser as HotelMergeNameChangeParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/IssueCloseNotificationMessageEvent.ts b/packages/communication/src/messages/incoming/help/IssueCloseNotificationMessageEvent.ts new file mode 100644 index 0000000..5610d31 --- /dev/null +++ b/packages/communication/src/messages/incoming/help/IssueCloseNotificationMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { IssueCloseNotificationMessageParser } from '../../parser'; + +export class IssueCloseNotificationMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, IssueCloseNotificationMessageParser); + } + + public getParser(): IssueCloseNotificationMessageParser + { + return this.parser as IssueCloseNotificationMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/QuizDataMessageEvent.ts b/packages/communication/src/messages/incoming/help/QuizDataMessageEvent.ts new file mode 100644 index 0000000..6e8c2d4 --- /dev/null +++ b/packages/communication/src/messages/incoming/help/QuizDataMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { QuizDataMessageParser } from '../../parser'; + +export class QuizDataMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, QuizDataMessageParser); + } + + public getParser(): QuizDataMessageParser + { + return this.parser as QuizDataMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/QuizResultsMessageEvent.ts b/packages/communication/src/messages/incoming/help/QuizResultsMessageEvent.ts new file mode 100644 index 0000000..a063136 --- /dev/null +++ b/packages/communication/src/messages/incoming/help/QuizResultsMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { QuizResultsMessageParser } from '../../parser'; + +export class QuizResultsMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, QuizResultsMessageParser); + } + + public getParser(): QuizResultsMessageParser + { + return this.parser as QuizResultsMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/help/index.ts b/packages/communication/src/messages/incoming/help/index.ts new file mode 100644 index 0000000..029319e --- /dev/null +++ b/packages/communication/src/messages/incoming/help/index.ts @@ -0,0 +1,27 @@ +export * from './CallForHelpDisabledNotifyMessageEvent'; +export * from './CallForHelpPendingCallsDeletedMessageEvent'; +export * from './CallForHelpPendingCallsMessageEvent'; +export * from './CallForHelpReplyMessageEvent'; +export * from './CallForHelpResultMessageEvent'; +export * from './ChatReviewSessionDetachedMessageEvent'; +export * from './ChatReviewSessionOfferedToGuideMessageEvent'; +export * from './ChatReviewSessionResultsMessageEvent'; +export * from './ChatReviewSessionStartedMessageEvent'; +export * from './ChatReviewSessionVotingStatusMessageEvent'; +export * from './GuideOnDutyStatusMessageEvent'; +export * from './GuideReportingStatusMessageEvent'; +export * from './GuideSessionAttachedMessageEvent'; +export * from './GuideSessionDetachedMessageEvent'; +export * from './GuideSessionEndedMessageEvent'; +export * from './GuideSessionErrorMessageEvent'; +export * from './GuideSessionInvitedToGuideRoomMessageEvent'; +export * from './GuideSessionMessageMessageEvent'; +export * from './GuideSessionPartnerIsTypingMessageEvent'; +export * from './GuideSessionRequesterRoomMessageEvent'; +export * from './GuideSessionStartedMessageEvent'; +export * from './GuideTicketCreationResultMessageEvent'; +export * from './GuideTicketResolutionMessageEvent'; +export * from './HotelMergeNameChangeEvent'; +export * from './IssueCloseNotificationMessageEvent'; +export * from './QuizDataMessageEvent'; +export * from './QuizResultsMessageEvent'; diff --git a/packages/communication/src/messages/incoming/index.ts b/packages/communication/src/messages/incoming/index.ts new file mode 100644 index 0000000..a247dbc --- /dev/null +++ b/packages/communication/src/messages/incoming/index.ts @@ -0,0 +1,76 @@ +export * from './IncomingHeader'; +export * from './advertisement'; +export * from './availability'; +export * from './avatar'; +export * from './bots'; +export * from './callforhelp'; +export * from './camera'; +export * from './campaign'; +export * from './catalog'; +export * from './client'; +export * from './competition'; +export * from './crafting'; +export * from './desktop'; +export * from './friendlist'; +export * from './game'; +export * from './game/directory'; +export * from './game/lobby'; +export * from './game/score'; +export * from './generic'; +export * from './gifts'; +export * from './group'; +export * from './groupforums'; +export * from './handshake'; +export * from './help'; +export * from './inventory'; +export * from './inventory/achievements'; +export * from './inventory/avatareffect'; +export * from './inventory/badges'; +export * from './inventory/clothes'; +export * from './inventory/furni'; +export * from './inventory/furni/gifts'; +export * from './inventory/pets'; +export * from './inventory/trading'; +export * from './landingview'; +export * from './landingview/votes'; +export * from './marketplace'; +export * from './moderation'; +export * from './mysterybox'; +export * from './navigator'; +export * from './notifications'; +export * from './nux'; +export * from './perk'; +export * from './pet'; +export * from './pet/breeding'; +export * from './poll'; +export * from './quest'; +export * from './recycler'; +export * from './room'; +export * from './room/access'; +export * from './room/access/doorbell'; +export * from './room/access/rights'; +export * from './room/bots'; +export * from './room/data'; +export * from './room/engine'; +export * from './room/furniture'; +export * from './room/furniture/floor'; +export * from './room/furniture/wall'; +export * from './room/furniture/youtube'; +export * from './room/mapping'; +export * from './room/pet'; +export * from './room/session'; +export * from './room/unit'; +export * from './room/unit/chat'; +export * from './roomevents'; +export * from './roomsettings'; +export * from './security'; +export * from './sound'; +export * from './talent'; +export * from './user'; +export * from './user/access'; +export * from './user/data'; +export * from './user/inventory'; +export * from './user/inventory/currency'; +export * from './user/inventory/subscription'; +export * from './user/wardrobe'; +export * from './userclassification'; diff --git a/packages/communication/src/messages/incoming/inventory/achievements/AchievementEvent.ts b/packages/communication/src/messages/incoming/inventory/achievements/AchievementEvent.ts new file mode 100644 index 0000000..6ab0166 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/achievements/AchievementEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { AchievementParser } from '../../../parser'; + +export class AchievementEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, AchievementParser); + } + + public getParser(): AchievementParser + { + return this.parser as AchievementParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/achievements/AchievementsEvent.ts b/packages/communication/src/messages/incoming/inventory/achievements/AchievementsEvent.ts new file mode 100644 index 0000000..e47ef52 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/achievements/AchievementsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { AchievementsParser } from '../../../parser'; + +export class AchievementsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, AchievementsParser); + } + + public getParser(): AchievementsParser + { + return this.parser as AchievementsParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/achievements/AchievementsScoreEvent.ts b/packages/communication/src/messages/incoming/inventory/achievements/AchievementsScoreEvent.ts new file mode 100644 index 0000000..dc25c84 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/achievements/AchievementsScoreEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { AchievementsScoreParser } from '../../../parser'; + +export class AchievementsScoreEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, AchievementsScoreParser); + } + + public getParser(): AchievementsScoreParser + { + return this.parser as AchievementsScoreParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/achievements/index.ts b/packages/communication/src/messages/incoming/inventory/achievements/index.ts new file mode 100644 index 0000000..1344aec --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/achievements/index.ts @@ -0,0 +1,3 @@ +export * from './AchievementEvent'; +export * from './AchievementsEvent'; +export * from './AchievementsScoreEvent'; diff --git a/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectActivatedEvent.ts b/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectActivatedEvent.ts new file mode 100644 index 0000000..74425f2 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectActivatedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { AvatarEffectActivatedParser } from '../../../parser'; + +export class AvatarEffectActivatedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, AvatarEffectActivatedParser); + } + + public getParser(): AvatarEffectActivatedParser + { + return this.parser as AvatarEffectActivatedParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectAddedEvent.ts b/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectAddedEvent.ts new file mode 100644 index 0000000..c5a13cc --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectAddedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { AvatarEffectAddedParser } from '../../../parser'; + +export class AvatarEffectAddedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, AvatarEffectAddedParser); + } + + public getParser(): AvatarEffectAddedParser + { + return this.parser as AvatarEffectAddedParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectExpiredEvent.ts b/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectExpiredEvent.ts new file mode 100644 index 0000000..db2956e --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectExpiredEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { AvatarEffectExpiredParser } from '../../../parser'; + +export class AvatarEffectExpiredEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, AvatarEffectExpiredParser); + } + + public getParser(): AvatarEffectExpiredParser + { + return this.parser as AvatarEffectExpiredParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectSelectedEvent.ts b/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectSelectedEvent.ts new file mode 100644 index 0000000..98e6d61 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectSelectedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { AvatarEffectSelectedParser } from '../../../parser'; + +export class AvatarEffectSelectedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, AvatarEffectSelectedParser); + } + + public getParser(): AvatarEffectSelectedParser + { + return this.parser as AvatarEffectSelectedParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectsEvent.ts b/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectsEvent.ts new file mode 100644 index 0000000..38f2c29 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { AvatarEffectsParser } from '../../../parser'; + +export class AvatarEffectsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, AvatarEffectsParser); + } + + public getParser(): AvatarEffectsParser + { + return this.parser as AvatarEffectsParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/avatareffect/index.ts b/packages/communication/src/messages/incoming/inventory/avatareffect/index.ts new file mode 100644 index 0000000..4a407ad --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/avatareffect/index.ts @@ -0,0 +1,5 @@ +export * from './AvatarEffectActivatedEvent'; +export * from './AvatarEffectAddedEvent'; +export * from './AvatarEffectExpiredEvent'; +export * from './AvatarEffectSelectedEvent'; +export * from './AvatarEffectsEvent'; diff --git a/packages/communication/src/messages/incoming/inventory/badges/BadgePointLimitsEvent.ts b/packages/communication/src/messages/incoming/inventory/badges/BadgePointLimitsEvent.ts new file mode 100644 index 0000000..16859d5 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/badges/BadgePointLimitsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { BadgePointLimitsParser } from '../../../parser'; + +export class BadgePointLimitsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, BadgePointLimitsParser); + } + + public getParser(): BadgePointLimitsParser + { + return this.parser as BadgePointLimitsParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/badges/BadgeReceivedEvent.ts b/packages/communication/src/messages/incoming/inventory/badges/BadgeReceivedEvent.ts new file mode 100644 index 0000000..15d9d0c --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/badges/BadgeReceivedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { BadgeReceivedParser } from '../../../parser'; + +export class BadgeReceivedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, BadgeReceivedParser); + } + + public getParser(): BadgeReceivedParser + { + return this.parser as BadgeReceivedParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/badges/BadgesEvent.ts b/packages/communication/src/messages/incoming/inventory/badges/BadgesEvent.ts new file mode 100644 index 0000000..2062b84 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/badges/BadgesEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { BadgesParser } from '../../../parser'; + +export class BadgesEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, BadgesParser); + } + + public getParser(): BadgesParser + { + return this.parser as BadgesParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/badges/IsBadgeRequestFulfilledEvent.ts b/packages/communication/src/messages/incoming/inventory/badges/IsBadgeRequestFulfilledEvent.ts new file mode 100644 index 0000000..c5e1727 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/badges/IsBadgeRequestFulfilledEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { IsBadgeRequestFulfilledParser } from '../../../parser'; + +export class IsBadgeRequestFulfilledEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, IsBadgeRequestFulfilledParser); + } + + public getParser(): IsBadgeRequestFulfilledParser + { + return this.parser as IsBadgeRequestFulfilledParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/badges/index.ts b/packages/communication/src/messages/incoming/inventory/badges/index.ts new file mode 100644 index 0000000..fe4c995 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/badges/index.ts @@ -0,0 +1,4 @@ +export * from './BadgePointLimitsEvent'; +export * from './BadgeReceivedEvent'; +export * from './BadgesEvent'; +export * from './IsBadgeRequestFulfilledEvent'; diff --git a/packages/communication/src/messages/incoming/inventory/clothes/FigureSetIdsMessageEvent.ts b/packages/communication/src/messages/incoming/inventory/clothes/FigureSetIdsMessageEvent.ts new file mode 100644 index 0000000..e29c89e --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/clothes/FigureSetIdsMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FigureSetIdsMessageParser } from '../../../parser'; + +export class FigureSetIdsMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FigureSetIdsMessageParser); + } + + public getParser(): FigureSetIdsMessageParser + { + return this.parser as FigureSetIdsMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/clothes/_Str_16135.ts b/packages/communication/src/messages/incoming/inventory/clothes/_Str_16135.ts new file mode 100644 index 0000000..3de88ed --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/clothes/_Str_16135.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { _Str_8728 } from '../../../parser'; + +export class _Str_16135 extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, _Str_8728); + } + + public getParser(): _Str_8728 + { + return this.parser as _Str_8728; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/clothes/_Str_17532.ts b/packages/communication/src/messages/incoming/inventory/clothes/_Str_17532.ts new file mode 100644 index 0000000..24f64dd --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/clothes/_Str_17532.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { _Str_9021 } from '../../../parser'; + +export class _Str_17532 extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, _Str_9021); + } + + public getParser(): _Str_9021 + { + return this.parser as _Str_9021; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/clothes/index.ts b/packages/communication/src/messages/incoming/inventory/clothes/index.ts new file mode 100644 index 0000000..477fbf3 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/clothes/index.ts @@ -0,0 +1,3 @@ +export * from './FigureSetIdsMessageEvent'; +export * from './_Str_16135'; +export * from './_Str_17532'; diff --git a/packages/communication/src/messages/incoming/inventory/furni/FurnitureListAddOrUpdateEvent.ts b/packages/communication/src/messages/incoming/inventory/furni/FurnitureListAddOrUpdateEvent.ts new file mode 100644 index 0000000..bdb01b6 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/furni/FurnitureListAddOrUpdateEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FurnitureListAddOrUpdateParser } from '../../../parser'; + +export class FurnitureListAddOrUpdateEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FurnitureListAddOrUpdateParser); + } + + public getParser(): FurnitureListAddOrUpdateParser + { + return this.parser as FurnitureListAddOrUpdateParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/furni/FurnitureListEvent.ts b/packages/communication/src/messages/incoming/inventory/furni/FurnitureListEvent.ts new file mode 100644 index 0000000..8e44049 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/furni/FurnitureListEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FurnitureListParser } from '../../../parser'; + +export class FurnitureListEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FurnitureListParser); + } + + public getParser(): FurnitureListParser + { + return this.parser as FurnitureListParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/furni/FurnitureListInvalidateEvent.ts b/packages/communication/src/messages/incoming/inventory/furni/FurnitureListInvalidateEvent.ts new file mode 100644 index 0000000..f61d0ff --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/furni/FurnitureListInvalidateEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FurnitureListInvalidateParser } from '../../../parser'; + +export class FurnitureListInvalidateEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FurnitureListInvalidateParser); + } + + public getParser(): FurnitureListInvalidateParser + { + return this.parser as FurnitureListInvalidateParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/furni/FurnitureListRemovedEvent.ts b/packages/communication/src/messages/incoming/inventory/furni/FurnitureListRemovedEvent.ts new file mode 100644 index 0000000..ebd80f0 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/furni/FurnitureListRemovedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FurnitureListRemovedParser } from '../../../parser'; + +export class FurnitureListRemovedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FurnitureListRemovedParser); + } + + public getParser(): FurnitureListRemovedParser + { + return this.parser as FurnitureListRemovedParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/furni/FurniturePostItPlacedEvent.ts b/packages/communication/src/messages/incoming/inventory/furni/FurniturePostItPlacedEvent.ts new file mode 100644 index 0000000..a2e9303 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/furni/FurniturePostItPlacedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FurniturePostItPlacedParser } from '../../../parser'; + +export class FurniturePostItPlacedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FurniturePostItPlacedParser); + } + + public getParser(): FurniturePostItPlacedParser + { + return this.parser as FurniturePostItPlacedParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/furni/gifts/PresentOpenedMessageEvent.ts b/packages/communication/src/messages/incoming/inventory/furni/gifts/PresentOpenedMessageEvent.ts new file mode 100644 index 0000000..a62957d --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/furni/gifts/PresentOpenedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PresentOpenedMessageParser } from '../../../../parser'; + +export class PresentOpenedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PresentOpenedMessageParser); + } + + public getParser(): PresentOpenedMessageParser + { + return this.parser as PresentOpenedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/furni/gifts/index.ts b/packages/communication/src/messages/incoming/inventory/furni/gifts/index.ts new file mode 100644 index 0000000..349aca7 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/furni/gifts/index.ts @@ -0,0 +1 @@ +export * from './PresentOpenedMessageEvent'; diff --git a/packages/communication/src/messages/incoming/inventory/furni/index.ts b/packages/communication/src/messages/incoming/inventory/furni/index.ts new file mode 100644 index 0000000..79c3096 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/furni/index.ts @@ -0,0 +1,6 @@ +export * from './FurnitureListAddOrUpdateEvent'; +export * from './FurnitureListEvent'; +export * from './FurnitureListInvalidateEvent'; +export * from './FurnitureListRemovedEvent'; +export * from './FurniturePostItPlacedEvent'; +export * from './gifts'; diff --git a/packages/communication/src/messages/incoming/inventory/index.ts b/packages/communication/src/messages/incoming/inventory/index.ts new file mode 100644 index 0000000..4f6ae27 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/index.ts @@ -0,0 +1,8 @@ +export * from './achievements'; +export * from './avatareffect'; +export * from './badges'; +export * from './clothes'; +export * from './furni'; +export * from './furni/gifts'; +export * from './pets'; +export * from './trading'; diff --git a/packages/communication/src/messages/incoming/inventory/pets/ConfirmBreedingRequestEvent.ts b/packages/communication/src/messages/incoming/inventory/pets/ConfirmBreedingRequestEvent.ts new file mode 100644 index 0000000..5a07d28 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/pets/ConfirmBreedingRequestEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ConfirmBreedingRequestParser } from '../../../parser'; + +export class ConfirmBreedingRequestEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ConfirmBreedingRequestParser); + } + + public getParser(): ConfirmBreedingRequestParser + { + return this.parser as ConfirmBreedingRequestParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/pets/ConfirmBreedingResultEvent.ts b/packages/communication/src/messages/incoming/inventory/pets/ConfirmBreedingResultEvent.ts new file mode 100644 index 0000000..04b9a42 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/pets/ConfirmBreedingResultEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ConfirmBreedingResultParser } from '../../../parser'; + +export class ConfirmBreedingResultEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ConfirmBreedingResultParser); + } + + public getParser(): ConfirmBreedingResultParser + { + return this.parser as ConfirmBreedingResultParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/pets/GoToBreedingNestFailureEvent.ts b/packages/communication/src/messages/incoming/inventory/pets/GoToBreedingNestFailureEvent.ts new file mode 100644 index 0000000..e344549 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/pets/GoToBreedingNestFailureEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GoToBreedingNestFailureParser } from '../../../parser'; + +export class GoToBreedingNestFailureEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GoToBreedingNestFailureParser); + } + + public getParser(): GoToBreedingNestFailureParser + { + return this.parser as GoToBreedingNestFailureParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/pets/NestBreedingSuccessEvent.ts b/packages/communication/src/messages/incoming/inventory/pets/NestBreedingSuccessEvent.ts new file mode 100644 index 0000000..2202eb7 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/pets/NestBreedingSuccessEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { NestBreedingSuccessParser } from '../../../parser'; + +export class NestBreedingSuccessEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, NestBreedingSuccessParser); + } + + public getParser(): NestBreedingSuccessParser + { + return this.parser as NestBreedingSuccessParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/pets/PetAddedToInventoryEvent.ts b/packages/communication/src/messages/incoming/inventory/pets/PetAddedToInventoryEvent.ts new file mode 100644 index 0000000..da5e259 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/pets/PetAddedToInventoryEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PetAddedToInventoryParser } from '../../../parser'; + +export class PetAddedToInventoryEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PetAddedToInventoryParser); + } + + public getParser(): PetAddedToInventoryParser + { + return this.parser as PetAddedToInventoryParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/pets/PetInventoryEvent.ts b/packages/communication/src/messages/incoming/inventory/pets/PetInventoryEvent.ts new file mode 100644 index 0000000..e49449b --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/pets/PetInventoryEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PetInventoryParser } from '../../../parser'; + +export class PetInventoryEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PetInventoryParser); + } + + public getParser(): PetInventoryParser + { + return this.parser as PetInventoryParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/pets/PetReceivedMessageEvent.ts b/packages/communication/src/messages/incoming/inventory/pets/PetReceivedMessageEvent.ts new file mode 100644 index 0000000..072bc02 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/pets/PetReceivedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PetReceivedMessageParser } from '../../../parser'; + +export class PetReceivedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PetReceivedMessageParser); + } + + public getParser(): PetReceivedMessageParser + { + return this.parser as PetReceivedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/pets/PetRemovedFromInventoryEvent.ts b/packages/communication/src/messages/incoming/inventory/pets/PetRemovedFromInventoryEvent.ts new file mode 100644 index 0000000..d96bdff --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/pets/PetRemovedFromInventoryEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PetRemovedFromInventoryParser } from '../../../parser'; + +export class PetRemovedFromInventory extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PetRemovedFromInventoryParser); + } + + public getParser(): PetRemovedFromInventoryParser + { + return this.parser as PetRemovedFromInventoryParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/pets/index.ts b/packages/communication/src/messages/incoming/inventory/pets/index.ts new file mode 100644 index 0000000..f7c5d97 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/pets/index.ts @@ -0,0 +1,8 @@ +export * from './ConfirmBreedingRequestEvent'; +export * from './ConfirmBreedingResultEvent'; +export * from './GoToBreedingNestFailureEvent'; +export * from './NestBreedingSuccessEvent'; +export * from './PetAddedToInventoryEvent'; +export * from './PetInventoryEvent'; +export * from './PetReceivedMessageEvent'; +export * from './PetRemovedFromInventoryEvent'; diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingAcceptEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingAcceptEvent.ts new file mode 100644 index 0000000..d4f4631 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/trading/TradingAcceptEvent.ts @@ -0,0 +1,26 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { TradingAcceptParser } from '../../../parser'; + +export class TradingAcceptEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, TradingAcceptParser); + } + + public get userID(): number + { + return this.getParser().userID; + } + + public get userAccepts(): boolean + { + return this.getParser().userAccepts; + } + + public getParser(): TradingAcceptParser + { + return this.parser as TradingAcceptParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingCloseEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingCloseEvent.ts new file mode 100644 index 0000000..bb237b7 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/trading/TradingCloseEvent.ts @@ -0,0 +1,21 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { TradingCloseParser } from '../../../parser'; + +export class TradingCloseEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, TradingCloseParser); + } + + public get userID(): number + { + return this.getParser().userID; + } + + public getParser(): TradingCloseParser + { + return this.parser as TradingCloseParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingCompletedEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingCompletedEvent.ts new file mode 100644 index 0000000..09c9482 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/trading/TradingCompletedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { TradingCompletedParser } from '../../../parser'; + +export class TradingCompletedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, TradingCompletedParser); + } + + public getParser(): TradingCompletedParser + { + return this.parser as TradingCompletedParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingConfirmationEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingConfirmationEvent.ts new file mode 100644 index 0000000..0f1d78e --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/trading/TradingConfirmationEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { TradingConfirmationParser } from '../../../parser'; + +export class TradingConfirmationEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, TradingConfirmationParser); + } + + public getParser(): TradingConfirmationParser + { + return this.parser as TradingConfirmationParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingListItemEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingListItemEvent.ts new file mode 100644 index 0000000..a052c3c --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/trading/TradingListItemEvent.ts @@ -0,0 +1,56 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ItemDataStructure, TradingListItemParser } from '../../../parser'; + +export class TradingListItemEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, TradingListItemParser); + } + + public get firstUserID(): number + { + return this.getParser().firstUserID; + } + + public get secondUserID(): number + { + return this.getParser().secondUserID; + } + + public get firstUserNumItems(): number + { + return this.getParser().firstUserNumItems; + } + + public get secondUserNumItems(): number + { + return this.getParser().secondUserNumItems; + } + + public get firstUserNumCredits(): number + { + return this.getParser().firstUserNumCredits; + } + + public get secondUserNumCredits(): number + { + return this.getParser().secondUserNumCredits; + } + + public get firstUserItemArray(): ItemDataStructure[] + { + return this.getParser().firstUserItemArray; + } + + public get secondUserItemArray(): ItemDataStructure[] + { + return this.getParser().secondUserItemArray; + } + + public getParser(): TradingListItemParser + { + return this.parser as TradingListItemParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingNoSuchItemEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingNoSuchItemEvent.ts new file mode 100644 index 0000000..9e70233 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/trading/TradingNoSuchItemEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { TradingNoSuchItemParser } from '../../../parser'; + +export class TradingNoSuchItemEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, TradingNoSuchItemParser); + } + + public getParser(): TradingNoSuchItemParser + { + return this.parser as TradingNoSuchItemParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingNotOpenEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingNotOpenEvent.ts new file mode 100644 index 0000000..2e53500 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/trading/TradingNotOpenEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { TradingNotOpenParser } from '../../../parser'; + +export class TradingNotOpenEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, TradingNotOpenParser); + } + + public getParser(): TradingNotOpenParser + { + return this.parser as TradingNotOpenParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingOpenEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingOpenEvent.ts new file mode 100644 index 0000000..2347456 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/trading/TradingOpenEvent.ts @@ -0,0 +1,36 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { TradingOpenParser } from '../../../parser'; + +export class TradingOpenEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, TradingOpenParser); + } + + public get userID(): number + { + return this.getParser().userID; + } + + public get userCanTrade(): boolean + { + return this.getParser().userCanTrade; + } + + public get otherUserID(): number + { + return this.getParser().otherUserID; + } + + public get otherUserCanTrade(): boolean + { + return this.getParser().otherUserCanTrade; + } + + public getParser(): TradingOpenParser + { + return this.parser as TradingOpenParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingOpenFailedEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingOpenFailedEvent.ts new file mode 100644 index 0000000..e5baa21 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/trading/TradingOpenFailedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { TradingOpenFailedParser } from '../../../parser'; + +export class TradingOpenFailedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, TradingOpenFailedParser); + } + + public getParser(): TradingOpenFailedParser + { + return this.parser as TradingOpenFailedParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingOtherNotAllowedEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingOtherNotAllowedEvent.ts new file mode 100644 index 0000000..f292b4a --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/trading/TradingOtherNotAllowedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { TradingOtherNotAllowedParser } from '../../../parser'; + +export class TradingOtherNotAllowedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, TradingOtherNotAllowedParser); + } + + public getParser(): TradingOtherNotAllowedParser + { + return this.parser as TradingOtherNotAllowedParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingYouAreNotAllowedEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingYouAreNotAllowedEvent.ts new file mode 100644 index 0000000..b303630 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/trading/TradingYouAreNotAllowedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { TradingYouAreNotAllowedParser } from '../../../parser'; + +export class TradingYouAreNotAllowedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, TradingYouAreNotAllowedParser); + } + + public getParser(): TradingYouAreNotAllowedParser + { + return this.parser as TradingYouAreNotAllowedParser; + } +} diff --git a/packages/communication/src/messages/incoming/inventory/trading/index.ts b/packages/communication/src/messages/incoming/inventory/trading/index.ts new file mode 100644 index 0000000..cddd363 --- /dev/null +++ b/packages/communication/src/messages/incoming/inventory/trading/index.ts @@ -0,0 +1,11 @@ +export * from './TradingAcceptEvent'; +export * from './TradingCloseEvent'; +export * from './TradingCompletedEvent'; +export * from './TradingConfirmationEvent'; +export * from './TradingListItemEvent'; +export * from './TradingNoSuchItemEvent'; +export * from './TradingNotOpenEvent'; +export * from './TradingOpenEvent'; +export * from './TradingOpenFailedEvent'; +export * from './TradingOtherNotAllowedEvent'; +export * from './TradingYouAreNotAllowedEvent'; diff --git a/packages/communication/src/messages/incoming/landingview/PromoArticlesMessageEvent.ts b/packages/communication/src/messages/incoming/landingview/PromoArticlesMessageEvent.ts new file mode 100644 index 0000000..687a3bc --- /dev/null +++ b/packages/communication/src/messages/incoming/landingview/PromoArticlesMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PromoArticlesMessageParser } from '../../parser'; + +export class PromoArticlesMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PromoArticlesMessageParser); + } + + public getParser(): PromoArticlesMessageParser + { + return this.parser as PromoArticlesMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/landingview/index.ts b/packages/communication/src/messages/incoming/landingview/index.ts new file mode 100644 index 0000000..d566aeb --- /dev/null +++ b/packages/communication/src/messages/incoming/landingview/index.ts @@ -0,0 +1,2 @@ +export * from './PromoArticlesMessageEvent'; +export * from './votes'; diff --git a/packages/communication/src/messages/incoming/landingview/votes/CommunityGoalVoteMessageEvent.ts b/packages/communication/src/messages/incoming/landingview/votes/CommunityGoalVoteMessageEvent.ts new file mode 100644 index 0000000..45db269 --- /dev/null +++ b/packages/communication/src/messages/incoming/landingview/votes/CommunityGoalVoteMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CommunityVoteReceivedParser } from '../../../parser'; + +export class CommunityGoalVoteMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CommunityVoteReceivedParser); + } + + public getParser(): CommunityVoteReceivedParser + { + return this.parser as CommunityVoteReceivedParser; + } +} diff --git a/packages/communication/src/messages/incoming/landingview/votes/index.ts b/packages/communication/src/messages/incoming/landingview/votes/index.ts new file mode 100644 index 0000000..adcbb0e --- /dev/null +++ b/packages/communication/src/messages/incoming/landingview/votes/index.ts @@ -0,0 +1 @@ +export * from './CommunityGoalVoteMessageEvent'; diff --git a/packages/communication/src/messages/incoming/marketplace/MarketplaceBuyOfferResultEvent.ts b/packages/communication/src/messages/incoming/marketplace/MarketplaceBuyOfferResultEvent.ts new file mode 100644 index 0000000..ece4d67 --- /dev/null +++ b/packages/communication/src/messages/incoming/marketplace/MarketplaceBuyOfferResultEvent.ts @@ -0,0 +1,17 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { MarketplaceBuyOfferResultParser } from '../../parser'; + + +export class MarketplaceBuyOfferResultEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, MarketplaceBuyOfferResultParser); + } + + public getParser(): MarketplaceBuyOfferResultParser + { + return this.parser as MarketplaceBuyOfferResultParser; + } +} diff --git a/packages/communication/src/messages/incoming/marketplace/MarketplaceCanMakeOfferResult.ts b/packages/communication/src/messages/incoming/marketplace/MarketplaceCanMakeOfferResult.ts new file mode 100644 index 0000000..b44c520 --- /dev/null +++ b/packages/communication/src/messages/incoming/marketplace/MarketplaceCanMakeOfferResult.ts @@ -0,0 +1,17 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { MarketplaceCanMakeOfferResultParser } from '../../parser'; + + +export class MarketplaceCanMakeOfferResult extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, MarketplaceCanMakeOfferResultParser); + } + + public getParser(): MarketplaceCanMakeOfferResultParser + { + return this.parser as MarketplaceCanMakeOfferResultParser; + } +} diff --git a/packages/communication/src/messages/incoming/marketplace/MarketplaceCancelOfferResultEvent.ts b/packages/communication/src/messages/incoming/marketplace/MarketplaceCancelOfferResultEvent.ts new file mode 100644 index 0000000..a01e071 --- /dev/null +++ b/packages/communication/src/messages/incoming/marketplace/MarketplaceCancelOfferResultEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { MarketplaceCancelOfferResultParser } from '../../parser'; + +export class MarketplaceCancelOfferResultEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, MarketplaceCancelOfferResultParser); + } + + public getParser(): MarketplaceCancelOfferResultParser + { + return this.parser as MarketplaceCancelOfferResultParser; + } +} diff --git a/packages/communication/src/messages/incoming/marketplace/MarketplaceConfigurationEvent.ts b/packages/communication/src/messages/incoming/marketplace/MarketplaceConfigurationEvent.ts new file mode 100644 index 0000000..0efb244 --- /dev/null +++ b/packages/communication/src/messages/incoming/marketplace/MarketplaceConfigurationEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { MarketplaceConfigurationMessageParser } from '../../parser'; + +export class MarketplaceConfigurationEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, MarketplaceConfigurationMessageParser); + } + + public getParser(): MarketplaceConfigurationMessageParser + { + return this.parser as MarketplaceConfigurationMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/marketplace/MarketplaceItemStatsEvent.ts b/packages/communication/src/messages/incoming/marketplace/MarketplaceItemStatsEvent.ts new file mode 100644 index 0000000..3dfb9d0 --- /dev/null +++ b/packages/communication/src/messages/incoming/marketplace/MarketplaceItemStatsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { MarketplaceItemStatsParser } from '../../parser'; + +export class MarketplaceItemStatsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, MarketplaceItemStatsParser); + } + + public getParser(): MarketplaceItemStatsParser + { + return this.parser as MarketplaceItemStatsParser; + } +} diff --git a/packages/communication/src/messages/incoming/marketplace/MarketplaceMakeOfferResult.ts b/packages/communication/src/messages/incoming/marketplace/MarketplaceMakeOfferResult.ts new file mode 100644 index 0000000..db8ed99 --- /dev/null +++ b/packages/communication/src/messages/incoming/marketplace/MarketplaceMakeOfferResult.ts @@ -0,0 +1,17 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { MarketplaceMakeOfferResultParser } from '../../parser'; + + +export class MarketplaceMakeOfferResult extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, MarketplaceMakeOfferResultParser); + } + + public getParser(): MarketplaceMakeOfferResultParser + { + return this.parser as MarketplaceMakeOfferResultParser; + } +} diff --git a/packages/communication/src/messages/incoming/marketplace/MarketplaceOffersEvent.ts b/packages/communication/src/messages/incoming/marketplace/MarketplaceOffersEvent.ts new file mode 100644 index 0000000..768cecc --- /dev/null +++ b/packages/communication/src/messages/incoming/marketplace/MarketplaceOffersEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { MarketplaceOffersParser } from '../../parser'; + +export class MarketPlaceOffersEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, MarketplaceOffersParser); + } + + public getParser(): MarketplaceOffersParser + { + return this.parser as MarketplaceOffersParser; + } +} diff --git a/packages/communication/src/messages/incoming/marketplace/MarketplaceOwnOffersEvent.ts b/packages/communication/src/messages/incoming/marketplace/MarketplaceOwnOffersEvent.ts new file mode 100644 index 0000000..a40dab2 --- /dev/null +++ b/packages/communication/src/messages/incoming/marketplace/MarketplaceOwnOffersEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { MarketplaceOwnOffersParser } from '../../parser'; + +export class MarketplaceOwnOffersEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, MarketplaceOwnOffersParser); + } + + public getParser(): MarketplaceOwnOffersParser + { + return this.parser as MarketplaceOwnOffersParser; + } +} diff --git a/packages/communication/src/messages/incoming/marketplace/index.ts b/packages/communication/src/messages/incoming/marketplace/index.ts new file mode 100644 index 0000000..7f4c2d5 --- /dev/null +++ b/packages/communication/src/messages/incoming/marketplace/index.ts @@ -0,0 +1,8 @@ +export * from './MarketplaceBuyOfferResultEvent'; +export * from './MarketplaceCancelOfferResultEvent'; +export * from './MarketplaceCanMakeOfferResult'; +export * from './MarketplaceConfigurationEvent'; +export * from './MarketplaceItemStatsEvent'; +export * from './MarketplaceMakeOfferResult'; +export * from './MarketplaceOffersEvent'; +export * from './MarketplaceOwnOffersEvent'; diff --git a/packages/communication/src/messages/incoming/moderation/CfhChatlogEvent.ts b/packages/communication/src/messages/incoming/moderation/CfhChatlogEvent.ts new file mode 100644 index 0000000..228db0b --- /dev/null +++ b/packages/communication/src/messages/incoming/moderation/CfhChatlogEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CfhChatlogMessageParser } from '../../parser'; + +export class CfhChatlogEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CfhChatlogMessageParser); + } + + public getParser(): CfhChatlogMessageParser + { + return this.parser as CfhChatlogMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/moderation/IssueDeletedMessageEvent.ts b/packages/communication/src/messages/incoming/moderation/IssueDeletedMessageEvent.ts new file mode 100644 index 0000000..e8bb447 --- /dev/null +++ b/packages/communication/src/messages/incoming/moderation/IssueDeletedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { IssueDeletedMessageParser } from '../../parser'; + +export class IssueDeletedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, IssueDeletedMessageParser); + } + + public getParser(): IssueDeletedMessageParser + { + return this.parser as IssueDeletedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/moderation/IssueInfoMessageEvent.ts b/packages/communication/src/messages/incoming/moderation/IssueInfoMessageEvent.ts new file mode 100644 index 0000000..6d74f07 --- /dev/null +++ b/packages/communication/src/messages/incoming/moderation/IssueInfoMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { IssueInfoMessageParser } from '../../parser'; + +export class IssueInfoMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, IssueInfoMessageParser); + } + + public getParser(): IssueInfoMessageParser + { + return this.parser as IssueInfoMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/moderation/IssuePickFailedMessageEvent.ts b/packages/communication/src/messages/incoming/moderation/IssuePickFailedMessageEvent.ts new file mode 100644 index 0000000..6f9e627 --- /dev/null +++ b/packages/communication/src/messages/incoming/moderation/IssuePickFailedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { IssuePickFailedMessageParser } from '../../parser'; + +export class IssuePickFailedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, IssuePickFailedMessageParser); + } + + public getParser(): IssuePickFailedMessageParser + { + return this.parser as IssuePickFailedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/moderation/ModeratorActionResultMessageEvent.ts b/packages/communication/src/messages/incoming/moderation/ModeratorActionResultMessageEvent.ts new file mode 100644 index 0000000..264ff97 --- /dev/null +++ b/packages/communication/src/messages/incoming/moderation/ModeratorActionResultMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ModeratorActionResultMessageParser } from '../../parser'; + +export class ModeratorActionResultMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ModeratorActionResultMessageParser); + } + + public getParser(): ModeratorActionResultMessageParser + { + return this.parser as ModeratorActionResultMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/moderation/ModeratorCautionEvent.ts b/packages/communication/src/messages/incoming/moderation/ModeratorCautionEvent.ts new file mode 100644 index 0000000..d606577 --- /dev/null +++ b/packages/communication/src/messages/incoming/moderation/ModeratorCautionEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ModerationCautionParser } from '../../parser'; + +export class ModeratorCautionEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ModerationCautionParser); + } + + public getParser(): ModerationCautionParser + { + return this.parser as ModerationCautionParser; + } +} diff --git a/packages/communication/src/messages/incoming/moderation/ModeratorInitMessageEvent.ts b/packages/communication/src/messages/incoming/moderation/ModeratorInitMessageEvent.ts new file mode 100644 index 0000000..73891ee --- /dev/null +++ b/packages/communication/src/messages/incoming/moderation/ModeratorInitMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ModeratorInitMessageParser } from '../../parser'; + +export class ModeratorInitMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ModeratorInitMessageParser); + } + + public getParser(): ModeratorInitMessageParser + { + return this.parser as ModeratorInitMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/moderation/ModeratorMessageEvent.ts b/packages/communication/src/messages/incoming/moderation/ModeratorMessageEvent.ts new file mode 100644 index 0000000..863ec05 --- /dev/null +++ b/packages/communication/src/messages/incoming/moderation/ModeratorMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ModeratorMessageParser } from '../../parser'; + +export class ModeratorMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ModeratorMessageParser); + } + + public getParser(): ModeratorMessageParser + { + return this.parser as ModeratorMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/moderation/ModeratorRoomInfoEvent.ts b/packages/communication/src/messages/incoming/moderation/ModeratorRoomInfoEvent.ts new file mode 100644 index 0000000..e53bc73 --- /dev/null +++ b/packages/communication/src/messages/incoming/moderation/ModeratorRoomInfoEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ModeratorRoomInfoMessageParser } from '../../parser'; + +export class ModeratorRoomInfoEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ModeratorRoomInfoMessageParser); + } + + public getParser(): ModeratorRoomInfoMessageParser + { + return this.parser as ModeratorRoomInfoMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/moderation/ModeratorToolPreferencesEvent.ts b/packages/communication/src/messages/incoming/moderation/ModeratorToolPreferencesEvent.ts new file mode 100644 index 0000000..3ab1dd3 --- /dev/null +++ b/packages/communication/src/messages/incoming/moderation/ModeratorToolPreferencesEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ModeratorToolPreferencesMessageParser } from '../../parser'; + +export class ModeratorToolPreferencesEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ModeratorToolPreferencesMessageParser); + } + + public getParser(): ModeratorToolPreferencesMessageParser + { + return this.parser as ModeratorToolPreferencesMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/moderation/ModeratorUserInfoEvent.ts b/packages/communication/src/messages/incoming/moderation/ModeratorUserInfoEvent.ts new file mode 100644 index 0000000..1a8cd8e --- /dev/null +++ b/packages/communication/src/messages/incoming/moderation/ModeratorUserInfoEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ModeratorUserInfoMessageParser } from '../../parser'; + +export class ModeratorUserInfoEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ModeratorUserInfoMessageParser); + } + + public getParser(): ModeratorUserInfoMessageParser + { + return this.parser as ModeratorUserInfoMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/moderation/RoomChatlogEvent.ts b/packages/communication/src/messages/incoming/moderation/RoomChatlogEvent.ts new file mode 100644 index 0000000..fd5ce65 --- /dev/null +++ b/packages/communication/src/messages/incoming/moderation/RoomChatlogEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomChatlogMessageParser } from '../../parser'; + +export class RoomChatlogEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomChatlogMessageParser); + } + + public getParser(): RoomChatlogMessageParser + { + return this.parser as RoomChatlogMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/moderation/RoomVisitsEvent.ts b/packages/communication/src/messages/incoming/moderation/RoomVisitsEvent.ts new file mode 100644 index 0000000..4cbf2cb --- /dev/null +++ b/packages/communication/src/messages/incoming/moderation/RoomVisitsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomVisitsMessageParser } from '../../parser'; + +export class RoomVisitsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomVisitsMessageParser); + } + + public getParser(): RoomVisitsMessageParser + { + return this.parser as RoomVisitsMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/moderation/UserBannedMessageEvent.ts b/packages/communication/src/messages/incoming/moderation/UserBannedMessageEvent.ts new file mode 100644 index 0000000..54cbcda --- /dev/null +++ b/packages/communication/src/messages/incoming/moderation/UserBannedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UserBannedMessageParser } from '../../parser'; + +export class UserBannedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UserBannedMessageParser); + } + + public getParser(): UserBannedMessageParser + { + return this.parser as UserBannedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/moderation/UserChatlogEvent.ts b/packages/communication/src/messages/incoming/moderation/UserChatlogEvent.ts new file mode 100644 index 0000000..9314cff --- /dev/null +++ b/packages/communication/src/messages/incoming/moderation/UserChatlogEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UserChatlogMessageParser } from '../../parser'; + +export class UserChatlogEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UserChatlogMessageParser); + } + + public getParser(): UserChatlogMessageParser + { + return this.parser as UserChatlogMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/moderation/index.ts b/packages/communication/src/messages/incoming/moderation/index.ts new file mode 100644 index 0000000..2bbc0c0 --- /dev/null +++ b/packages/communication/src/messages/incoming/moderation/index.ts @@ -0,0 +1,15 @@ +export * from './CfhChatlogEvent'; +export * from './IssueDeletedMessageEvent'; +export * from './IssueInfoMessageEvent'; +export * from './IssuePickFailedMessageEvent'; +export * from './ModeratorActionResultMessageEvent'; +export * from './ModeratorCautionEvent'; +export * from './ModeratorInitMessageEvent'; +export * from './ModeratorMessageEvent'; +export * from './ModeratorRoomInfoEvent'; +export * from './ModeratorToolPreferencesEvent'; +export * from './ModeratorUserInfoEvent'; +export * from './RoomChatlogEvent'; +export * from './RoomVisitsEvent'; +export * from './UserBannedMessageEvent'; +export * from './UserChatlogEvent'; diff --git a/packages/communication/src/messages/incoming/mysterybox/CancelMysteryBoxWaitMessageEvent.ts b/packages/communication/src/messages/incoming/mysterybox/CancelMysteryBoxWaitMessageEvent.ts new file mode 100644 index 0000000..fd49f76 --- /dev/null +++ b/packages/communication/src/messages/incoming/mysterybox/CancelMysteryBoxWaitMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CancelMysteryBoxWaitMessageParser } from '../../parser/mysterybox'; + +export class CancelMysteryBoxWaitMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CancelMysteryBoxWaitMessageParser); + } + + public getParser(): CancelMysteryBoxWaitMessageParser + { + return this.parser as CancelMysteryBoxWaitMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/mysterybox/GotMysteryBoxPrizeMessageEvent.ts b/packages/communication/src/messages/incoming/mysterybox/GotMysteryBoxPrizeMessageEvent.ts new file mode 100644 index 0000000..00928d3 --- /dev/null +++ b/packages/communication/src/messages/incoming/mysterybox/GotMysteryBoxPrizeMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GotMysteryBoxPrizeMessageParser } from '../../parser/mysterybox'; + +export class GotMysteryBoxPrizeMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GotMysteryBoxPrizeMessageParser); + } + + public getParser(): GotMysteryBoxPrizeMessageParser + { + return this.parser as GotMysteryBoxPrizeMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/mysterybox/MysteryBoxKeysEvent.ts b/packages/communication/src/messages/incoming/mysterybox/MysteryBoxKeysEvent.ts new file mode 100644 index 0000000..bae9bd6 --- /dev/null +++ b/packages/communication/src/messages/incoming/mysterybox/MysteryBoxKeysEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { MysteryBoxKeysParser } from '../../parser'; + +export class MysteryBoxKeysEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, MysteryBoxKeysParser); + } + + public getParser(): MysteryBoxKeysParser + { + return this.parser as MysteryBoxKeysParser; + } +} diff --git a/packages/communication/src/messages/incoming/mysterybox/ShowMysteryBoxWaitMessageEvent.ts b/packages/communication/src/messages/incoming/mysterybox/ShowMysteryBoxWaitMessageEvent.ts new file mode 100644 index 0000000..6305863 --- /dev/null +++ b/packages/communication/src/messages/incoming/mysterybox/ShowMysteryBoxWaitMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ShowMysteryBoxWaitMessageParser } from '../../parser/mysterybox'; + +export class ShowMysteryBoxWaitMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ShowMysteryBoxWaitMessageParser); + } + + public getParser(): ShowMysteryBoxWaitMessageParser + { + return this.parser as ShowMysteryBoxWaitMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/mysterybox/index.ts b/packages/communication/src/messages/incoming/mysterybox/index.ts new file mode 100644 index 0000000..0d41333 --- /dev/null +++ b/packages/communication/src/messages/incoming/mysterybox/index.ts @@ -0,0 +1,4 @@ +export * from './CancelMysteryBoxWaitMessageEvent'; +export * from './GotMysteryBoxPrizeMessageEvent'; +export * from './MysteryBoxKeysEvent'; +export * from './ShowMysteryBoxWaitMessageEvent'; diff --git a/packages/communication/src/messages/incoming/navigator/CanCreateRoomEvent.ts b/packages/communication/src/messages/incoming/navigator/CanCreateRoomEvent.ts new file mode 100644 index 0000000..3836423 --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/CanCreateRoomEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CanCreateRoomMessageParser } from '../../parser'; + +export class CanCreateRoomEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CanCreateRoomMessageParser); + } + + public getParser(): CanCreateRoomMessageParser + { + return this.parser as CanCreateRoomMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/CanCreateRoomEventEvent.ts b/packages/communication/src/messages/incoming/navigator/CanCreateRoomEventEvent.ts new file mode 100644 index 0000000..e1ac7e7 --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/CanCreateRoomEventEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CanCreateRoomEventParser } from '../../parser'; + +export class CanCreateRoomEventEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CanCreateRoomEventParser); + } + + public getParser(): CanCreateRoomEventParser + { + return this.parser as CanCreateRoomEventParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/CategoriesWithVisitorCountEvent.ts b/packages/communication/src/messages/incoming/navigator/CategoriesWithVisitorCountEvent.ts new file mode 100644 index 0000000..651d255 --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/CategoriesWithVisitorCountEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CategoriesWithVisitorCountParser } from '../../parser'; + +export class CategoriesWithVisitorCountEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CategoriesWithVisitorCountParser); + } + + public getParser(): CategoriesWithVisitorCountParser + { + return this.parser as CategoriesWithVisitorCountParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/CompetitionRoomsDataMessageEvent.ts b/packages/communication/src/messages/incoming/navigator/CompetitionRoomsDataMessageEvent.ts new file mode 100644 index 0000000..bd9a360 --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/CompetitionRoomsDataMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CompetitionRoomsDataMessageParser } from '../../parser'; + +export class CompetitionRoomsDataMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CompetitionRoomsDataMessageParser); + } + + public getParser(): CompetitionRoomsDataMessageParser + { + return this.parser as CompetitionRoomsDataMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/ConvertedRoomIdEvent.ts b/packages/communication/src/messages/incoming/navigator/ConvertedRoomIdEvent.ts new file mode 100644 index 0000000..eb37e70 --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/ConvertedRoomIdEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ConvertedRoomIdMessageParser } from '../../parser'; + +export class ConvertedRoomIdEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ConvertedRoomIdMessageParser); + } + + public getParser(): ConvertedRoomIdMessageParser + { + return this.parser as ConvertedRoomIdMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/DoorbellMessageEvent.ts b/packages/communication/src/messages/incoming/navigator/DoorbellMessageEvent.ts new file mode 100644 index 0000000..ce495a1 --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/DoorbellMessageEvent.ts @@ -0,0 +1,21 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { DoorbellMessageParser } from '../../parser'; + +export class DoorbellMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, DoorbellMessageParser); + } + + public getParser(): DoorbellMessageParser + { + return this.parser as DoorbellMessageParser; + } + + public get userName(): string + { + return this.getParser().userName; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/FavouriteChangedEvent.ts b/packages/communication/src/messages/incoming/navigator/FavouriteChangedEvent.ts new file mode 100644 index 0000000..e9652cb --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/FavouriteChangedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FavouriteChangedMessageParser } from '../../parser'; + +export class FavouriteChangedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FavouriteChangedMessageParser); + } + + public getParser(): FavouriteChangedMessageParser + { + return this.parser as FavouriteChangedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/FavouritesEvent.ts b/packages/communication/src/messages/incoming/navigator/FavouritesEvent.ts new file mode 100644 index 0000000..46622f5 --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/FavouritesEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FavouritesMessageParser } from '../../parser'; + +export class FavouritesEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FavouritesMessageParser); + } + + public getParser(): FavouritesMessageParser + { + return this.parser as FavouritesMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/FlatAccessDeniedMessageEvent.ts b/packages/communication/src/messages/incoming/navigator/FlatAccessDeniedMessageEvent.ts new file mode 100644 index 0000000..205bfb5 --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/FlatAccessDeniedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FlatAccessDeniedMessageParser } from '../../parser'; + +export class FlatAccessDeniedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FlatAccessDeniedMessageParser); + } + + public getParser(): FlatAccessDeniedMessageParser + { + return this.parser as FlatAccessDeniedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/FlatCreatedEvent.ts b/packages/communication/src/messages/incoming/navigator/FlatCreatedEvent.ts new file mode 100644 index 0000000..a6e00a9 --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/FlatCreatedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FlatCreatedMessageParser } from '../../parser'; + +export class FlatCreatedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FlatCreatedMessageParser); + } + + public getParser(): FlatCreatedMessageParser + { + return this.parser as FlatCreatedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/GetGuestRoomResultEvent.ts b/packages/communication/src/messages/incoming/navigator/GetGuestRoomResultEvent.ts new file mode 100644 index 0000000..3f601ea --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/GetGuestRoomResultEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GetGuestRoomResultMessageParser } from '../../parser'; + +export class GetGuestRoomResultEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GetGuestRoomResultMessageParser); + } + + public getParser(): GetGuestRoomResultMessageParser + { + return this.parser as GetGuestRoomResultMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/GuestRoomSearchResultEvent.ts b/packages/communication/src/messages/incoming/navigator/GuestRoomSearchResultEvent.ts new file mode 100644 index 0000000..95ca50a --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/GuestRoomSearchResultEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GuestRoomSearchResultMessageParser } from '../../parser'; + +export class GuestRoomSearchResultEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GuestRoomSearchResultMessageParser); + } + + public getParser(): GuestRoomSearchResultMessageParser + { + return this.parser as GuestRoomSearchResultMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/NavigatorCollapsedEvent.ts b/packages/communication/src/messages/incoming/navigator/NavigatorCollapsedEvent.ts new file mode 100644 index 0000000..fb6e0f7 --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/NavigatorCollapsedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { NavigatorCollapsedParser } from '../../parser'; + +export class NavigatorCollapsedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, NavigatorCollapsedParser); + } + + public getParser(): NavigatorCollapsedParser + { + return this.parser as NavigatorCollapsedParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/NavigatorHomeRoomEvent.ts b/packages/communication/src/messages/incoming/navigator/NavigatorHomeRoomEvent.ts new file mode 100644 index 0000000..3e1c021 --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/NavigatorHomeRoomEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { NavigatorHomeRoomParser } from '../../parser'; + +export class NavigatorHomeRoomEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, NavigatorHomeRoomParser); + } + + public getParser(): NavigatorHomeRoomParser + { + return this.parser as NavigatorHomeRoomParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/NavigatorLiftedEvent.ts b/packages/communication/src/messages/incoming/navigator/NavigatorLiftedEvent.ts new file mode 100644 index 0000000..8dbbdf1 --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/NavigatorLiftedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { NavigatorLiftedParser } from '../../parser'; + +export class NavigatorLiftedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, NavigatorLiftedParser); + } + + public getParser(): NavigatorLiftedParser + { + return this.parser as NavigatorLiftedParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/NavigatorMetadataEvent.ts b/packages/communication/src/messages/incoming/navigator/NavigatorMetadataEvent.ts new file mode 100644 index 0000000..ed6eb51 --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/NavigatorMetadataEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { NavigatorMetadataParser } from '../../parser'; + +export class NavigatorMetadataEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, NavigatorMetadataParser); + } + + public getParser(): NavigatorMetadataParser + { + return this.parser as NavigatorMetadataParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/NavigatorOpenRoomCreatorEvent.ts b/packages/communication/src/messages/incoming/navigator/NavigatorOpenRoomCreatorEvent.ts new file mode 100644 index 0000000..70eb7ea --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/NavigatorOpenRoomCreatorEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { NavigatorOpenRoomCreatorParser } from '../../parser'; + +export class NavigatorOpenRoomCreatorEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, NavigatorOpenRoomCreatorParser); + } + + public getParser(): NavigatorOpenRoomCreatorParser + { + return this.parser as NavigatorOpenRoomCreatorParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/NavigatorSearchEvent.ts b/packages/communication/src/messages/incoming/navigator/NavigatorSearchEvent.ts new file mode 100644 index 0000000..bf2dffe --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/NavigatorSearchEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { NavigatorSearchParser } from '../../parser'; + +export class NavigatorSearchEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, NavigatorSearchParser); + } + + public getParser(): NavigatorSearchParser + { + return this.parser as NavigatorSearchParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/NavigatorSearchesEvent.ts b/packages/communication/src/messages/incoming/navigator/NavigatorSearchesEvent.ts new file mode 100644 index 0000000..df9ac9e --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/NavigatorSearchesEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { NavigatorSearchesParser } from '../../parser'; + +export class NavigatorSearchesEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, NavigatorSearchesParser); + } + + public getParser(): NavigatorSearchesParser + { + return this.parser as NavigatorSearchesParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/NavigatorSettingsEvent.ts b/packages/communication/src/messages/incoming/navigator/NavigatorSettingsEvent.ts new file mode 100644 index 0000000..9546220 --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/NavigatorSettingsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { NavigatorSettingsParser } from '../../parser'; + +export class NavigatorSettingsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, NavigatorSettingsParser); + } + + public getParser(): NavigatorSettingsParser + { + return this.parser as NavigatorSettingsParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/PopularRoomTagsResultEvent.ts b/packages/communication/src/messages/incoming/navigator/PopularRoomTagsResultEvent.ts new file mode 100644 index 0000000..738570c --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/PopularRoomTagsResultEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PopularRoomTagsResultMessageParser } from '../../parser'; + +export class PopularRoomTagsResultEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PopularRoomTagsResultMessageParser); + } + + public getParser(): PopularRoomTagsResultMessageParser + { + return this.parser as PopularRoomTagsResultMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/RoomEventCancelEvent.ts b/packages/communication/src/messages/incoming/navigator/RoomEventCancelEvent.ts new file mode 100644 index 0000000..938ffcf --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/RoomEventCancelEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomEventCancelMessageParser } from '../../parser'; + +export class RoomEventCancelEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomEventCancelMessageParser); + } + + public getParser(): RoomEventCancelMessageParser + { + return this.parser as RoomEventCancelMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/RoomEventEvent.ts b/packages/communication/src/messages/incoming/navigator/RoomEventEvent.ts new file mode 100644 index 0000000..51b2764 --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/RoomEventEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomEventMessageParser } from '../../parser'; + +export class RoomEventEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomEventMessageParser); + } + + public getParser(): RoomEventMessageParser + { + return this.parser as RoomEventMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/RoomFilterSettingsMessageEvent.ts b/packages/communication/src/messages/incoming/navigator/RoomFilterSettingsMessageEvent.ts new file mode 100644 index 0000000..c2a22f9 --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/RoomFilterSettingsMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomFilterSettingsMessageParser } from '../../parser'; + +export class RoomFilterSettingsMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomFilterSettingsMessageParser); + } + + public getParser(): RoomFilterSettingsMessageParser + { + return this.parser as RoomFilterSettingsMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/RoomSettingsUpdatedEvent.ts b/packages/communication/src/messages/incoming/navigator/RoomSettingsUpdatedEvent.ts new file mode 100644 index 0000000..f3ac9df --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/RoomSettingsUpdatedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomSettingsUpdatedParser } from '../../parser'; + +export class RoomSettingsUpdatedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomSettingsUpdatedParser); + } + + public getParser(): RoomSettingsUpdatedParser + { + return this.parser as RoomSettingsUpdatedParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/RoomThumbnailUpdateResultEvent.ts b/packages/communication/src/messages/incoming/navigator/RoomThumbnailUpdateResultEvent.ts new file mode 100644 index 0000000..eacb19a --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/RoomThumbnailUpdateResultEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomThumbnailUpdateResultMessageParser } from '../../parser'; + +export class RoomThumbnailUpdateResultEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomThumbnailUpdateResultMessageParser); + } + + public getParser(): RoomThumbnailUpdateResultMessageParser + { + return this.parser as RoomThumbnailUpdateResultMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/UserEventCatsEvent.ts b/packages/communication/src/messages/incoming/navigator/UserEventCatsEvent.ts new file mode 100644 index 0000000..a4677e2 --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/UserEventCatsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UserEventCatsMessageParser } from '../../parser'; + +export class UserEventCatsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UserEventCatsMessageParser); + } + + public getParser(): UserEventCatsMessageParser + { + return this.parser as UserEventCatsMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/UserFlatCatsEvent.ts b/packages/communication/src/messages/incoming/navigator/UserFlatCatsEvent.ts new file mode 100644 index 0000000..1d8e7b9 --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/UserFlatCatsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UserFlatCatsMessageParser } from '../../parser'; + +export class UserFlatCatsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UserFlatCatsMessageParser); + } + + public getParser(): UserFlatCatsMessageParser + { + return this.parser as UserFlatCatsMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/navigator/index.ts b/packages/communication/src/messages/incoming/navigator/index.ts new file mode 100644 index 0000000..deac832 --- /dev/null +++ b/packages/communication/src/messages/incoming/navigator/index.ts @@ -0,0 +1,28 @@ +export * from './CanCreateRoomEvent'; +export * from './CanCreateRoomEventEvent'; +export * from './CategoriesWithVisitorCountEvent'; +export * from './CompetitionRoomsDataMessageEvent'; +export * from './ConvertedRoomIdEvent'; +export * from './DoorbellMessageEvent'; +export * from './FavouriteChangedEvent'; +export * from './FavouritesEvent'; +export * from './FlatAccessDeniedMessageEvent'; +export * from './FlatCreatedEvent'; +export * from './GetGuestRoomResultEvent'; +export * from './GuestRoomSearchResultEvent'; +export * from './NavigatorCollapsedEvent'; +export * from './NavigatorHomeRoomEvent'; +export * from './NavigatorLiftedEvent'; +export * from './NavigatorMetadataEvent'; +export * from './NavigatorOpenRoomCreatorEvent'; +export * from './NavigatorSearchesEvent'; +export * from './NavigatorSearchEvent'; +export * from './NavigatorSettingsEvent'; +export * from './PopularRoomTagsResultEvent'; +export * from './RoomEventCancelEvent'; +export * from './RoomEventEvent'; +export * from './RoomFilterSettingsMessageEvent'; +export * from './RoomSettingsUpdatedEvent'; +export * from './RoomThumbnailUpdateResultEvent'; +export * from './UserEventCatsEvent'; +export * from './UserFlatCatsEvent'; diff --git a/packages/communication/src/messages/incoming/notifications/AchievementNotificationMessageEvent.ts b/packages/communication/src/messages/incoming/notifications/AchievementNotificationMessageEvent.ts new file mode 100644 index 0000000..520a99f --- /dev/null +++ b/packages/communication/src/messages/incoming/notifications/AchievementNotificationMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { AchievementNotificationMessageParser } from '../../parser'; + +export class AchievementNotificationMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, AchievementNotificationMessageParser); + } + + public getParser(): AchievementNotificationMessageParser + { + return this.parser as AchievementNotificationMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/notifications/ActivityPointNotificationMessageEvent.ts b/packages/communication/src/messages/incoming/notifications/ActivityPointNotificationMessageEvent.ts new file mode 100644 index 0000000..20bf570 --- /dev/null +++ b/packages/communication/src/messages/incoming/notifications/ActivityPointNotificationMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ActivityPointNotificationParser } from '../../parser'; + +export class ActivityPointNotificationMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ActivityPointNotificationParser); + } + + public getParser(): ActivityPointNotificationParser + { + return this.parser as ActivityPointNotificationParser; + } +} diff --git a/packages/communication/src/messages/incoming/notifications/BotErrorEvent.ts b/packages/communication/src/messages/incoming/notifications/BotErrorEvent.ts new file mode 100644 index 0000000..8eaa0a1 --- /dev/null +++ b/packages/communication/src/messages/incoming/notifications/BotErrorEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { BotErrorEventParser } from '../../parser'; + +export class BotErrorEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, BotErrorEventParser); + } + + public getParser(): BotErrorEventParser + { + return this.parser as BotErrorEventParser; + } +} diff --git a/packages/communication/src/messages/incoming/notifications/ClubGiftNotificationEvent.ts b/packages/communication/src/messages/incoming/notifications/ClubGiftNotificationEvent.ts new file mode 100644 index 0000000..d8e1795 --- /dev/null +++ b/packages/communication/src/messages/incoming/notifications/ClubGiftNotificationEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ClubGiftNotificationParser } from '../../parser'; + +export class ClubGiftNotificationEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ClubGiftNotificationParser); + } + + public getParser(): ClubGiftNotificationParser + { + return this.parser as ClubGiftNotificationParser; + } +} diff --git a/packages/communication/src/messages/incoming/notifications/ConnectionErrorEvent.ts b/packages/communication/src/messages/incoming/notifications/ConnectionErrorEvent.ts new file mode 100644 index 0000000..1b12eab --- /dev/null +++ b/packages/communication/src/messages/incoming/notifications/ConnectionErrorEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ConnectionErrorMessageParser } from '../../parser/notifications/ConnectionErrorMessageParser'; + +export class ConnectionErrorEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ConnectionErrorMessageParser); + } + + public getParser(): ConnectionErrorMessageParser + { + return this.parser as ConnectionErrorMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/notifications/ElementPointerMessageEvent.ts b/packages/communication/src/messages/incoming/notifications/ElementPointerMessageEvent.ts new file mode 100644 index 0000000..12b941e --- /dev/null +++ b/packages/communication/src/messages/incoming/notifications/ElementPointerMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ElementPointerMessageParser } from '../../parser'; + +export class ElementPointerMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ElementPointerMessageParser); + } + + public getParser(): ElementPointerMessageParser + { + return this.parser as ElementPointerMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/notifications/HabboBroadcastMessageEvent.ts b/packages/communication/src/messages/incoming/notifications/HabboBroadcastMessageEvent.ts new file mode 100644 index 0000000..58e1db0 --- /dev/null +++ b/packages/communication/src/messages/incoming/notifications/HabboBroadcastMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { HabboBroadcastMessageParser } from '../../parser'; + +export class HabboBroadcastMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, HabboBroadcastMessageParser); + } + + public getParser(): HabboBroadcastMessageParser + { + return this.parser as HabboBroadcastMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/notifications/HotelWillShutdownEvent.ts b/packages/communication/src/messages/incoming/notifications/HotelWillShutdownEvent.ts new file mode 100644 index 0000000..b726633 --- /dev/null +++ b/packages/communication/src/messages/incoming/notifications/HotelWillShutdownEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { HotelWillShutdownParser } from '../../parser'; + +export class HotelWillShutdownEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, HotelWillShutdownParser); + } + + public getParser(): HotelWillShutdownParser + { + return this.parser as HotelWillShutdownParser; + } +} diff --git a/packages/communication/src/messages/incoming/notifications/InfoFeedEnableMessageEvent.ts b/packages/communication/src/messages/incoming/notifications/InfoFeedEnableMessageEvent.ts new file mode 100644 index 0000000..5c7e54e --- /dev/null +++ b/packages/communication/src/messages/incoming/notifications/InfoFeedEnableMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { InfoFeedEnableMessageParser } from '../../parser'; + +export class InfoFeedEnableMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, InfoFeedEnableMessageParser); + } + + public getParser(): InfoFeedEnableMessageParser + { + return this.parser as InfoFeedEnableMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/notifications/MOTDNotificationEvent.ts b/packages/communication/src/messages/incoming/notifications/MOTDNotificationEvent.ts new file mode 100644 index 0000000..07ae143 --- /dev/null +++ b/packages/communication/src/messages/incoming/notifications/MOTDNotificationEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { MOTDNotificationParser } from '../../parser'; + +export class MOTDNotificationEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, MOTDNotificationParser); + } + + public getParser(): MOTDNotificationParser + { + return this.parser as MOTDNotificationParser; + } +} diff --git a/packages/communication/src/messages/incoming/notifications/NotificationDialogMessageEvent.ts b/packages/communication/src/messages/incoming/notifications/NotificationDialogMessageEvent.ts new file mode 100644 index 0000000..b6b7fd7 --- /dev/null +++ b/packages/communication/src/messages/incoming/notifications/NotificationDialogMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { NotificationDialogMessageParser } from '../../parser'; + +export class NotificationDialogMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, NotificationDialogMessageParser); + } + + public getParser(): NotificationDialogMessageParser + { + return this.parser as NotificationDialogMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/notifications/OfferRewardDeliveredMessageEvent.ts b/packages/communication/src/messages/incoming/notifications/OfferRewardDeliveredMessageEvent.ts new file mode 100644 index 0000000..7262060 --- /dev/null +++ b/packages/communication/src/messages/incoming/notifications/OfferRewardDeliveredMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { OfferRewardDeliveredMessageParser } from '../../parser'; + +export class OfferRewardDeliveredMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, OfferRewardDeliveredMessageParser); + } + + public getParser(): OfferRewardDeliveredMessageParser + { + return this.parser as OfferRewardDeliveredMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/notifications/PetLevelNotificationEvent.ts b/packages/communication/src/messages/incoming/notifications/PetLevelNotificationEvent.ts new file mode 100644 index 0000000..3bb1d11 --- /dev/null +++ b/packages/communication/src/messages/incoming/notifications/PetLevelNotificationEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PetLevelNotificationParser } from '../../parser'; + +export class PetLevelNotificationEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PetLevelNotificationParser); + } + + public getParser(): PetLevelNotificationParser + { + return this.parser as PetLevelNotificationParser; + } +} diff --git a/packages/communication/src/messages/incoming/notifications/PetPlacingErrorEvent.ts b/packages/communication/src/messages/incoming/notifications/PetPlacingErrorEvent.ts new file mode 100644 index 0000000..88aa0fb --- /dev/null +++ b/packages/communication/src/messages/incoming/notifications/PetPlacingErrorEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PetPlacingErrorEventParser } from '../../parser'; + +export class PetPlacingErrorEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PetPlacingErrorEventParser); + } + + public getParser(): PetPlacingErrorEventParser + { + return this.parser as PetPlacingErrorEventParser; + } +} diff --git a/packages/communication/src/messages/incoming/notifications/RestoreClientMessageEvent.ts b/packages/communication/src/messages/incoming/notifications/RestoreClientMessageEvent.ts new file mode 100644 index 0000000..48767d1 --- /dev/null +++ b/packages/communication/src/messages/incoming/notifications/RestoreClientMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RestoreClientMessageParser } from '../../parser'; + +export class RestoreClientMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RestoreClientMessageParser); + } + + public getParser(): RestoreClientMessageParser + { + return this.parser as RestoreClientMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/notifications/SimpleAlertMessageEvent.ts b/packages/communication/src/messages/incoming/notifications/SimpleAlertMessageEvent.ts new file mode 100644 index 0000000..11373d9 --- /dev/null +++ b/packages/communication/src/messages/incoming/notifications/SimpleAlertMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { SimpleAlertMessageParser } from '../../parser'; + +export class SimpleAlertMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, SimpleAlertMessageParser); + } + + public getParser(): SimpleAlertMessageParser + { + return this.parser as SimpleAlertMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/notifications/UnseenItemsEvent.ts b/packages/communication/src/messages/incoming/notifications/UnseenItemsEvent.ts new file mode 100644 index 0000000..9807fb1 --- /dev/null +++ b/packages/communication/src/messages/incoming/notifications/UnseenItemsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UnseenItemsParser } from '../../parser'; + +export class UnseenItemsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UnseenItemsParser); + } + + public getParser(): UnseenItemsParser + { + return this.parser as UnseenItemsParser; + } +} diff --git a/packages/communication/src/messages/incoming/notifications/index.ts b/packages/communication/src/messages/incoming/notifications/index.ts new file mode 100644 index 0000000..943253e --- /dev/null +++ b/packages/communication/src/messages/incoming/notifications/index.ts @@ -0,0 +1,17 @@ +export * from './AchievementNotificationMessageEvent'; +export * from './ActivityPointNotificationMessageEvent'; +export * from './BotErrorEvent'; +export * from './ClubGiftNotificationEvent'; +export * from './ConnectionErrorEvent'; +export * from './ElementPointerMessageEvent'; +export * from './HabboBroadcastMessageEvent'; +export * from './HotelWillShutdownEvent'; +export * from './InfoFeedEnableMessageEvent'; +export * from './MOTDNotificationEvent'; +export * from './NotificationDialogMessageEvent'; +export * from './OfferRewardDeliveredMessageEvent'; +export * from './PetLevelNotificationEvent'; +export * from './PetPlacingErrorEvent'; +export * from './RestoreClientMessageEvent'; +export * from './SimpleAlertMessageEvent'; +export * from './UnseenItemsEvent'; diff --git a/packages/communication/src/messages/incoming/nux/NewUserExperienceGift.ts b/packages/communication/src/messages/incoming/nux/NewUserExperienceGift.ts new file mode 100644 index 0000000..6d1c7d9 --- /dev/null +++ b/packages/communication/src/messages/incoming/nux/NewUserExperienceGift.ts @@ -0,0 +1,37 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { ProductOffer } from './ProductOffer'; + +export class NewUserExperienceGift +{ + private _thumbnailUrl: string; + private _productOfferList: ProductOffer[]; + + constructor(wrapper: IMessageDataWrapper) + { + this._thumbnailUrl = wrapper.readString(); + if(this._thumbnailUrl == '') + { + this._thumbnailUrl = null; + } + + this._productOfferList = []; + const count:number = wrapper.readInt(); + let index = 0; + + while(index < count) + { + this._productOfferList.push(new ProductOffer(wrapper)); + index++; + } + } + + public get productOfferList(): ProductOffer[] + { + return this._productOfferList; + } + + public get thumbnailUrl(): string + { + return this._thumbnailUrl; + } +} diff --git a/packages/communication/src/messages/incoming/nux/NewUserExperienceGiftOfferMessageEvent.ts b/packages/communication/src/messages/incoming/nux/NewUserExperienceGiftOfferMessageEvent.ts new file mode 100644 index 0000000..91b5672 --- /dev/null +++ b/packages/communication/src/messages/incoming/nux/NewUserExperienceGiftOfferMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { NewUserExperienceGiftOfferMessageParser } from '../../parser/nux'; + +export class NewUserExperienceGiftOfferMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, NewUserExperienceGiftOfferMessageParser); + } + + public getParser(): NewUserExperienceGiftOfferMessageParser + { + return this.parser as NewUserExperienceGiftOfferMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/nux/NewUserExperienceGiftOptions.ts b/packages/communication/src/messages/incoming/nux/NewUserExperienceGiftOptions.ts new file mode 100644 index 0000000..d15d7ce --- /dev/null +++ b/packages/communication/src/messages/incoming/nux/NewUserExperienceGiftOptions.ts @@ -0,0 +1,40 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { NewUserExperienceGift } from './NewUserExperienceGift'; + +export class NewUserExperienceGiftOptions +{ + private _dayIndex: number; + private _stepIndex: number; + private _options: NewUserExperienceGift[]; + + constructor(wrapper: IMessageDataWrapper) + { + this._dayIndex = wrapper.readInt(); + this._stepIndex = wrapper.readInt(); + this._options = []; + + const count:number = wrapper.readInt(); + let index = 0; + + while(index < count) + { + this._options.push(new NewUserExperienceGift(wrapper)); + index++; + } + } + + public get dayIndex(): number + { + return this._dayIndex; + } + + public get stepIndex(): number + { + return this._stepIndex; + } + + public get options(): NewUserExperienceGift[] + { + return this._options; + } +} diff --git a/packages/communication/src/messages/incoming/nux/NewUserExperienceNotCompleteEvent.ts b/packages/communication/src/messages/incoming/nux/NewUserExperienceNotCompleteEvent.ts new file mode 100644 index 0000000..2205caf --- /dev/null +++ b/packages/communication/src/messages/incoming/nux/NewUserExperienceNotCompleteEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { NewUserExperienceNotCompleteParser } from '../../parser/nux'; + +export class NewUserExperienceNotCompleteEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, NewUserExperienceNotCompleteParser); + } + + public getParser(): NewUserExperienceNotCompleteParser + { + return this.parser as NewUserExperienceNotCompleteParser; + } +} diff --git a/packages/communication/src/messages/incoming/nux/ProductOffer.ts b/packages/communication/src/messages/incoming/nux/ProductOffer.ts new file mode 100644 index 0000000..ae1ce97 --- /dev/null +++ b/packages/communication/src/messages/incoming/nux/ProductOffer.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class ProductOffer +{ + private _itemName: string; + private _extraInfo: string; + + constructor(wrapper: IMessageDataWrapper) + { + this._itemName = wrapper.readString(); + this._extraInfo = wrapper.readString(); + + if(this._extraInfo == '') + { + this._extraInfo = null; + } + } + + public get itemName(): string + { + return this._itemName; + } + + public get extraInfo(): string + { + return this._extraInfo; + } +} diff --git a/packages/communication/src/messages/incoming/nux/index.ts b/packages/communication/src/messages/incoming/nux/index.ts new file mode 100644 index 0000000..731f00d --- /dev/null +++ b/packages/communication/src/messages/incoming/nux/index.ts @@ -0,0 +1,5 @@ +export * from './NewUserExperienceGift'; +export * from './NewUserExperienceGiftOfferMessageEvent'; +export * from './NewUserExperienceGiftOptions'; +export * from './NewUserExperienceNotCompleteEvent'; +export * from './ProductOffer'; diff --git a/packages/communication/src/messages/incoming/perk/PerkAllowancesMessageEvent.ts b/packages/communication/src/messages/incoming/perk/PerkAllowancesMessageEvent.ts new file mode 100644 index 0000000..a4d257f --- /dev/null +++ b/packages/communication/src/messages/incoming/perk/PerkAllowancesMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PerkAllowancesMessageParser } from './../../parser'; + +export class PerkAllowancesMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PerkAllowancesMessageParser); + } + + public getParser(): PerkAllowancesMessageParser + { + return this.parser as PerkAllowancesMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/perk/index.ts b/packages/communication/src/messages/incoming/perk/index.ts new file mode 100644 index 0000000..b19fe4b --- /dev/null +++ b/packages/communication/src/messages/incoming/perk/index.ts @@ -0,0 +1 @@ +export * from './PerkAllowancesMessageEvent'; diff --git a/packages/communication/src/messages/incoming/pet/OpenPetPackageRequestedMessageEvent.ts b/packages/communication/src/messages/incoming/pet/OpenPetPackageRequestedMessageEvent.ts new file mode 100644 index 0000000..e1650c7 --- /dev/null +++ b/packages/communication/src/messages/incoming/pet/OpenPetPackageRequestedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { OpenPetPackageRequestedMessageParser } from './../../parser'; + +export class OpenPetPackageRequestedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, OpenPetPackageRequestedMessageParser); + } + + public getParser(): OpenPetPackageRequestedMessageParser + { + return this.parser as OpenPetPackageRequestedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/pet/OpenPetPackageResultMessageEvent.ts b/packages/communication/src/messages/incoming/pet/OpenPetPackageResultMessageEvent.ts new file mode 100644 index 0000000..aa6b5d8 --- /dev/null +++ b/packages/communication/src/messages/incoming/pet/OpenPetPackageResultMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { OpenPetPackageResultMessageParser } from './../../parser'; + +export class OpenPetPackageResultMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, OpenPetPackageResultMessageParser); + } + + public getParser(): OpenPetPackageResultMessageParser + { + return this.parser as OpenPetPackageResultMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/pet/PetLevelUpdateMessageEvent.ts b/packages/communication/src/messages/incoming/pet/PetLevelUpdateMessageEvent.ts new file mode 100644 index 0000000..ca2a8cb --- /dev/null +++ b/packages/communication/src/messages/incoming/pet/PetLevelUpdateMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PetLevelUpdateMessageParser } from '../../parser'; + +export class PetLevelUpdateMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PetLevelUpdateMessageParser); + } + + public getParser(): PetLevelUpdateMessageParser + { + return this.parser as PetLevelUpdateMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/pet/PetScratchFailedMessageEvent.ts b/packages/communication/src/messages/incoming/pet/PetScratchFailedMessageEvent.ts new file mode 100644 index 0000000..0571742 --- /dev/null +++ b/packages/communication/src/messages/incoming/pet/PetScratchFailedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PetScratchFailedMessageParser } from './../../parser'; + +export class PetScratchFailedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PetScratchFailedMessageParser); + } + + public getParser(): PetScratchFailedMessageParser + { + return this.parser as PetScratchFailedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/pet/PetTrainingPanelMessageEvent.ts b/packages/communication/src/messages/incoming/pet/PetTrainingPanelMessageEvent.ts new file mode 100644 index 0000000..0825b29 --- /dev/null +++ b/packages/communication/src/messages/incoming/pet/PetTrainingPanelMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PetTrainingMessageParser } from './../../parser'; + +export class PetTrainingPanelMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PetTrainingMessageParser); + } + + public getParser(): PetTrainingMessageParser + { + return this.parser as PetTrainingMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/pet/breeding/PetBreedingMessageEvent.ts b/packages/communication/src/messages/incoming/pet/breeding/PetBreedingMessageEvent.ts new file mode 100644 index 0000000..0f8cb1f --- /dev/null +++ b/packages/communication/src/messages/incoming/pet/breeding/PetBreedingMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PetBreedingMessageParser } from './../../../parser'; + +export class PetBreedingMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PetBreedingMessageParser); + } + + public getParser(): PetBreedingMessageParser + { + return this.parser as PetBreedingMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/pet/breeding/index.ts b/packages/communication/src/messages/incoming/pet/breeding/index.ts new file mode 100644 index 0000000..c18ef67 --- /dev/null +++ b/packages/communication/src/messages/incoming/pet/breeding/index.ts @@ -0,0 +1 @@ +export * from './PetBreedingMessageEvent'; diff --git a/packages/communication/src/messages/incoming/pet/index.ts b/packages/communication/src/messages/incoming/pet/index.ts new file mode 100644 index 0000000..d5fb00b --- /dev/null +++ b/packages/communication/src/messages/incoming/pet/index.ts @@ -0,0 +1,6 @@ +export * from './breeding'; +export * from './OpenPetPackageRequestedMessageEvent'; +export * from './OpenPetPackageResultMessageEvent'; +export * from './PetLevelUpdateMessageEvent'; +export * from './PetScratchFailedMessageEvent'; +export * from './PetTrainingPanelMessageEvent'; diff --git a/packages/communication/src/messages/incoming/poll/PollContentsEvent.ts b/packages/communication/src/messages/incoming/poll/PollContentsEvent.ts new file mode 100644 index 0000000..1c241a2 --- /dev/null +++ b/packages/communication/src/messages/incoming/poll/PollContentsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PollContentsParser } from '../../parser'; + +export class PollContentsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PollContentsParser); + } + + public getParser(): PollContentsParser + { + return this.parser as PollContentsParser; + } +} diff --git a/packages/communication/src/messages/incoming/poll/PollErrorEvent.ts b/packages/communication/src/messages/incoming/poll/PollErrorEvent.ts new file mode 100644 index 0000000..9a4b478 --- /dev/null +++ b/packages/communication/src/messages/incoming/poll/PollErrorEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PollErrorParser } from '../../parser'; + +export class PollErrorEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PollErrorParser); + } + + public getParser(): PollErrorParser + { + return this.parser as PollErrorParser; + } +} diff --git a/packages/communication/src/messages/incoming/poll/PollOfferEvent.ts b/packages/communication/src/messages/incoming/poll/PollOfferEvent.ts new file mode 100644 index 0000000..b72ea66 --- /dev/null +++ b/packages/communication/src/messages/incoming/poll/PollOfferEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PollOfferParser } from '../../parser'; + +export class PollOfferEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PollOfferParser); + } + + public getParser(): PollOfferParser + { + return this.parser as PollOfferParser; + } +} diff --git a/packages/communication/src/messages/incoming/poll/QuestionAnsweredEvent.ts b/packages/communication/src/messages/incoming/poll/QuestionAnsweredEvent.ts new file mode 100644 index 0000000..7dd889f --- /dev/null +++ b/packages/communication/src/messages/incoming/poll/QuestionAnsweredEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { QuestionAnsweredParser } from '../../parser'; + +export class QuestionAnsweredEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, QuestionAnsweredParser); + } + + public getParser(): QuestionAnsweredParser + { + return this.parser as QuestionAnsweredParser; + } +} diff --git a/packages/communication/src/messages/incoming/poll/QuestionEvent.ts b/packages/communication/src/messages/incoming/poll/QuestionEvent.ts new file mode 100644 index 0000000..6a9b153 --- /dev/null +++ b/packages/communication/src/messages/incoming/poll/QuestionEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { QuestionParser } from '../../parser'; + +export class QuestionEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, QuestionParser); + } + + public getParser(): QuestionParser + { + return this.parser as QuestionParser; + } +} diff --git a/packages/communication/src/messages/incoming/poll/QuestionFinishedEvent.ts b/packages/communication/src/messages/incoming/poll/QuestionFinishedEvent.ts new file mode 100644 index 0000000..21b0226 --- /dev/null +++ b/packages/communication/src/messages/incoming/poll/QuestionFinishedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { QuestionFinishedParser } from '../../parser'; + +export class QuestionFinishedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, QuestionFinishedParser); + } + + public getParser(): QuestionFinishedParser + { + return this.parser as QuestionFinishedParser; + } +} diff --git a/packages/communication/src/messages/incoming/poll/RoomPollResultEvent.ts b/packages/communication/src/messages/incoming/poll/RoomPollResultEvent.ts new file mode 100644 index 0000000..dbafbf6 --- /dev/null +++ b/packages/communication/src/messages/incoming/poll/RoomPollResultEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomPollResultParser } from '../../parser'; + +export class RoomPollResultEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomPollResultParser); + } + + public getParser(): RoomPollResultParser + { + return this.parser as RoomPollResultParser; + } +} diff --git a/packages/communication/src/messages/incoming/poll/StartRoomPollEvent.ts b/packages/communication/src/messages/incoming/poll/StartRoomPollEvent.ts new file mode 100644 index 0000000..c7d5cfc --- /dev/null +++ b/packages/communication/src/messages/incoming/poll/StartRoomPollEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomPollDataParser } from '../../parser'; + +export class StartRoomPollEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomPollDataParser); + } + + public getParser(): RoomPollDataParser + { + return this.parser as RoomPollDataParser; + } +} diff --git a/packages/communication/src/messages/incoming/poll/index.ts b/packages/communication/src/messages/incoming/poll/index.ts new file mode 100644 index 0000000..a90c6f5 --- /dev/null +++ b/packages/communication/src/messages/incoming/poll/index.ts @@ -0,0 +1,8 @@ +export * from './PollContentsEvent'; +export * from './PollErrorEvent'; +export * from './PollOfferEvent'; +export * from './QuestionAnsweredEvent'; +export * from './QuestionEvent'; +export * from './QuestionFinishedEvent'; +export * from './RoomPollResultEvent'; +export * from './StartRoomPollEvent'; diff --git a/packages/communication/src/messages/incoming/quest/CommunityGoalEarnedPrizesMessageEvent.ts b/packages/communication/src/messages/incoming/quest/CommunityGoalEarnedPrizesMessageEvent.ts new file mode 100644 index 0000000..7bf00ee --- /dev/null +++ b/packages/communication/src/messages/incoming/quest/CommunityGoalEarnedPrizesMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CommunityGoalEarnedPrizesMessageParser } from '../../parser'; + +export class CommunityGoalEarnedPrizesMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CommunityGoalEarnedPrizesMessageParser); + } + + public getParser(): CommunityGoalEarnedPrizesMessageParser + { + return this.parser as CommunityGoalEarnedPrizesMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/quest/CommunityGoalHallOfFameMessageEvent.ts b/packages/communication/src/messages/incoming/quest/CommunityGoalHallOfFameMessageEvent.ts new file mode 100644 index 0000000..bb4c09e --- /dev/null +++ b/packages/communication/src/messages/incoming/quest/CommunityGoalHallOfFameMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CommunityGoalHallOfFameMessageParser } from '../../parser'; + +export class CommunityGoalHallOfFameMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CommunityGoalHallOfFameMessageParser); + } + + public getParser(): CommunityGoalHallOfFameMessageParser + { + return this.parser as CommunityGoalHallOfFameMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/quest/CommunityGoalProgressMessageEvent.ts b/packages/communication/src/messages/incoming/quest/CommunityGoalProgressMessageEvent.ts new file mode 100644 index 0000000..4f3ebd1 --- /dev/null +++ b/packages/communication/src/messages/incoming/quest/CommunityGoalProgressMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CommunityGoalProgressMessageParser } from '../../parser'; + +export class CommunityGoalProgressMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CommunityGoalProgressMessageParser); + } + + public getParser(): CommunityGoalProgressMessageParser + { + return this.parser as CommunityGoalProgressMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/quest/ConcurrentUsersGoalProgressMessageEvent.ts b/packages/communication/src/messages/incoming/quest/ConcurrentUsersGoalProgressMessageEvent.ts new file mode 100644 index 0000000..1684a75 --- /dev/null +++ b/packages/communication/src/messages/incoming/quest/ConcurrentUsersGoalProgressMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ConcurrentUsersGoalProgressMessageParser } from '../../parser'; + +export class ConcurrentUsersGoalProgressMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ConcurrentUsersGoalProgressMessageParser); + } + + public getParser(): ConcurrentUsersGoalProgressMessageParser + { + return this.parser as ConcurrentUsersGoalProgressMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/quest/EpicPopupMessageEvent.ts b/packages/communication/src/messages/incoming/quest/EpicPopupMessageEvent.ts new file mode 100644 index 0000000..6812fdc --- /dev/null +++ b/packages/communication/src/messages/incoming/quest/EpicPopupMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { EpicPopupMessageParser } from '../../parser'; + +export class EpicPopupMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, EpicPopupMessageParser); + } + + public getParser(): EpicPopupMessageParser + { + return this.parser as EpicPopupMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/quest/QuestCancelledMessageEvent.ts b/packages/communication/src/messages/incoming/quest/QuestCancelledMessageEvent.ts new file mode 100644 index 0000000..1c00e67 --- /dev/null +++ b/packages/communication/src/messages/incoming/quest/QuestCancelledMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { QuestCancelledMessageParser } from '../../parser'; + +export class QuestCancelledMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, QuestCancelledMessageParser); + } + + public getParser(): QuestCancelledMessageParser + { + return this.parser as QuestCancelledMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/quest/QuestCompletedMessageEvent.ts b/packages/communication/src/messages/incoming/quest/QuestCompletedMessageEvent.ts new file mode 100644 index 0000000..c864e81 --- /dev/null +++ b/packages/communication/src/messages/incoming/quest/QuestCompletedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { QuestCompletedMessageParser } from '../../parser'; + +export class QuestCompletedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, QuestCompletedMessageParser); + } + + public getParser(): QuestCompletedMessageParser + { + return this.parser as QuestCompletedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/quest/QuestDailyMessageEvent.ts b/packages/communication/src/messages/incoming/quest/QuestDailyMessageEvent.ts new file mode 100644 index 0000000..97299a5 --- /dev/null +++ b/packages/communication/src/messages/incoming/quest/QuestDailyMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { QuestDailyMessageParser } from '../../parser'; + +export class QuestDailyMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, QuestDailyMessageParser); + } + + public getParser(): QuestDailyMessageParser + { + return this.parser as QuestDailyMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/quest/QuestMessageEvent.ts b/packages/communication/src/messages/incoming/quest/QuestMessageEvent.ts new file mode 100644 index 0000000..a592186 --- /dev/null +++ b/packages/communication/src/messages/incoming/quest/QuestMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { QuestMessageParser } from '../../parser'; + +export class QuestMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, QuestMessageParser); + } + + public getParser(): QuestMessageParser + { + return this.parser as QuestMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/quest/QuestsMessageEvent.ts b/packages/communication/src/messages/incoming/quest/QuestsMessageEvent.ts new file mode 100644 index 0000000..cbdadef --- /dev/null +++ b/packages/communication/src/messages/incoming/quest/QuestsMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { QuestsMessageParser } from '../../parser'; + +export class QuestsMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, QuestsMessageParser); + } + + public getParser(): QuestsMessageParser + { + return this.parser as QuestsMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/quest/SeasonalQuestsMessageEvent.ts b/packages/communication/src/messages/incoming/quest/SeasonalQuestsMessageEvent.ts new file mode 100644 index 0000000..f2417b5 --- /dev/null +++ b/packages/communication/src/messages/incoming/quest/SeasonalQuestsMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { SeasonalQuestsParser } from '../../parser'; + +export class SeasonalQuestsMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, SeasonalQuestsParser); + } + + public getParser(): SeasonalQuestsParser + { + return this.parser as SeasonalQuestsParser; + } +} diff --git a/packages/communication/src/messages/incoming/quest/index.ts b/packages/communication/src/messages/incoming/quest/index.ts new file mode 100644 index 0000000..f2b8707 --- /dev/null +++ b/packages/communication/src/messages/incoming/quest/index.ts @@ -0,0 +1,11 @@ +export * from './CommunityGoalEarnedPrizesMessageEvent'; +export * from './CommunityGoalHallOfFameMessageEvent'; +export * from './CommunityGoalProgressMessageEvent'; +export * from './ConcurrentUsersGoalProgressMessageEvent'; +export * from './EpicPopupMessageEvent'; +export * from './QuestCancelledMessageEvent'; +export * from './QuestCompletedMessageEvent'; +export * from './QuestDailyMessageEvent'; +export * from './QuestMessageEvent'; +export * from './QuestsMessageEvent'; +export * from './SeasonalQuestsMessageEvent'; diff --git a/packages/communication/src/messages/incoming/recycler/RecyclerFinishedMessageEvent.ts b/packages/communication/src/messages/incoming/recycler/RecyclerFinishedMessageEvent.ts new file mode 100644 index 0000000..eb5f1e9 --- /dev/null +++ b/packages/communication/src/messages/incoming/recycler/RecyclerFinishedMessageEvent.ts @@ -0,0 +1,19 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RecyclerFinishedMessageParser } from '../../parser'; + +export class RecyclerFinishedMessageEvent extends MessageEvent implements IMessageEvent +{ + public static readonly FINISHED_OK: number = 1; + public static readonly FINISHED_FAIL: number = 2; + + constructor(callBack: Function) + { + super(callBack, RecyclerFinishedMessageParser); + } + + public getParser(): RecyclerFinishedMessageParser + { + return this.parser as RecyclerFinishedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/recycler/RecyclerStatusMessageEvent.ts b/packages/communication/src/messages/incoming/recycler/RecyclerStatusMessageEvent.ts new file mode 100644 index 0000000..69f3c94 --- /dev/null +++ b/packages/communication/src/messages/incoming/recycler/RecyclerStatusMessageEvent.ts @@ -0,0 +1,20 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RecyclerStatusMessageParser } from '../../parser'; + +export class RecyclerStatusMessageEvent extends MessageEvent implements IMessageEvent +{ + public static readonly SYSTEM_STATUS_ENABLED: number = 1; + public static readonly SYSTEM_STATUS_DISABLED: number = 2; + public static readonly SYSTEM_STATUS_TIMEOUT: number = 3; + + constructor(callBack: Function) + { + super(callBack, RecyclerStatusMessageParser); + } + + public getParser(): RecyclerStatusMessageParser + { + return this.parser as RecyclerStatusMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/recycler/index.ts b/packages/communication/src/messages/incoming/recycler/index.ts new file mode 100644 index 0000000..b6f40ee --- /dev/null +++ b/packages/communication/src/messages/incoming/recycler/index.ts @@ -0,0 +1,2 @@ +export * from './RecyclerFinishedMessageEvent'; +export * from './RecyclerStatusMessageEvent'; diff --git a/packages/communication/src/messages/incoming/room/access/RoomEnterErrorEvent.ts b/packages/communication/src/messages/incoming/room/access/RoomEnterErrorEvent.ts new file mode 100644 index 0000000..8728f86 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/access/RoomEnterErrorEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CantConnectMessageParser } from '../../../parser'; + +export class RoomEnterErrorEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CantConnectMessageParser); + } + + public getParser(): CantConnectMessageParser + { + return this.parser as CantConnectMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/access/RoomEnterEvent.ts b/packages/communication/src/messages/incoming/room/access/RoomEnterEvent.ts new file mode 100644 index 0000000..f4d23b0 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/access/RoomEnterEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomEnterParser } from '../../../parser'; + +export class RoomEnterEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomEnterParser); + } + + public getParser(): RoomEnterParser + { + return this.parser as RoomEnterParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/access/RoomForwardEvent.ts b/packages/communication/src/messages/incoming/room/access/RoomForwardEvent.ts new file mode 100644 index 0000000..d36e606 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/access/RoomForwardEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomFowardParser as RoomForwardParser } from '../../../parser'; + +export class RoomForwardEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomForwardParser); + } + + public getParser(): RoomForwardParser + { + return this.parser as RoomForwardParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/access/doorbell/RoomDoorbellAcceptedEvent.ts b/packages/communication/src/messages/incoming/room/access/doorbell/RoomDoorbellAcceptedEvent.ts new file mode 100644 index 0000000..c504dc8 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/access/doorbell/RoomDoorbellAcceptedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomDoorbellAcceptedParser } from '../../../../parser'; + +export class RoomDoorbellAcceptedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomDoorbellAcceptedParser); + } + + public getParser(): RoomDoorbellAcceptedParser + { + return this.parser as RoomDoorbellAcceptedParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/access/doorbell/index.ts b/packages/communication/src/messages/incoming/room/access/doorbell/index.ts new file mode 100644 index 0000000..ce67bee --- /dev/null +++ b/packages/communication/src/messages/incoming/room/access/doorbell/index.ts @@ -0,0 +1 @@ +export * from './RoomDoorbellAcceptedEvent'; diff --git a/packages/communication/src/messages/incoming/room/access/index.ts b/packages/communication/src/messages/incoming/room/access/index.ts new file mode 100644 index 0000000..0e1f2d7 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/access/index.ts @@ -0,0 +1,5 @@ +export * from './doorbell'; +export * from './rights'; +export * from './RoomEnterErrorEvent'; +export * from './RoomEnterEvent'; +export * from './RoomForwardEvent'; diff --git a/packages/communication/src/messages/incoming/room/access/rights/RoomRightsClearEvent.ts b/packages/communication/src/messages/incoming/room/access/rights/RoomRightsClearEvent.ts new file mode 100644 index 0000000..f35a282 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/access/rights/RoomRightsClearEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomRightsClearParser } from '../../../../parser'; + +export class RoomRightsClearEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomRightsClearParser); + } + + public getParser(): RoomRightsClearParser + { + return this.parser as RoomRightsClearParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/access/rights/RoomRightsEvent.ts b/packages/communication/src/messages/incoming/room/access/rights/RoomRightsEvent.ts new file mode 100644 index 0000000..053909e --- /dev/null +++ b/packages/communication/src/messages/incoming/room/access/rights/RoomRightsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomRightsParser } from '../../../../parser'; + +export class RoomRightsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomRightsParser); + } + + public getParser(): RoomRightsParser + { + return this.parser as RoomRightsParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/access/rights/RoomRightsOwnerEvent.ts b/packages/communication/src/messages/incoming/room/access/rights/RoomRightsOwnerEvent.ts new file mode 100644 index 0000000..c0bad6e --- /dev/null +++ b/packages/communication/src/messages/incoming/room/access/rights/RoomRightsOwnerEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomRightsOwnerParser } from '../../../../parser'; + +export class RoomRightsOwnerEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomRightsOwnerParser); + } + + public getParser(): RoomRightsOwnerParser + { + return this.parser as RoomRightsOwnerParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/access/rights/index.ts b/packages/communication/src/messages/incoming/room/access/rights/index.ts new file mode 100644 index 0000000..9569969 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/access/rights/index.ts @@ -0,0 +1,3 @@ +export * from './RoomRightsClearEvent'; +export * from './RoomRightsEvent'; +export * from './RoomRightsOwnerEvent'; diff --git a/packages/communication/src/messages/incoming/room/bots/BotCommandConfigurationEvent.ts b/packages/communication/src/messages/incoming/room/bots/BotCommandConfigurationEvent.ts new file mode 100644 index 0000000..e72008b --- /dev/null +++ b/packages/communication/src/messages/incoming/room/bots/BotCommandConfigurationEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { BotCommandConfigurationParser } from '../../../parser'; + +export class BotCommandConfigurationEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, BotCommandConfigurationParser); + } + + public getParser(): BotCommandConfigurationParser + { + return this.parser as BotCommandConfigurationParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/bots/BotForceOpenContextMenuEvent.ts b/packages/communication/src/messages/incoming/room/bots/BotForceOpenContextMenuEvent.ts new file mode 100644 index 0000000..beb5166 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/bots/BotForceOpenContextMenuEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { BotForceOpenContextMenuParser } from '../../../parser'; + +export class BotForceOpenContextMenuEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, BotForceOpenContextMenuParser); + } + + public getParser(): BotForceOpenContextMenuParser + { + return this.parser as BotForceOpenContextMenuParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/bots/BotSkillListUpdateEvent.ts b/packages/communication/src/messages/incoming/room/bots/BotSkillListUpdateEvent.ts new file mode 100644 index 0000000..4be59a7 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/bots/BotSkillListUpdateEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { BotSkillListUpdateParser } from '../../../parser'; + +export class BotSkillListUpdateEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, BotSkillListUpdateParser); + } + + public getParser(): BotSkillListUpdateParser + { + return this.parser as BotSkillListUpdateParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/bots/index.ts b/packages/communication/src/messages/incoming/room/bots/index.ts new file mode 100644 index 0000000..cae047b --- /dev/null +++ b/packages/communication/src/messages/incoming/room/bots/index.ts @@ -0,0 +1,3 @@ +export * from './BotCommandConfigurationEvent'; +export * from './BotForceOpenContextMenuEvent'; +export * from './BotSkillListUpdateEvent'; diff --git a/packages/communication/src/messages/incoming/room/data/RoomChatSettingsEvent.ts b/packages/communication/src/messages/incoming/room/data/RoomChatSettingsEvent.ts new file mode 100644 index 0000000..0bddf54 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/data/RoomChatSettingsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomChatSettingsParser } from '../../../parser'; + +export class RoomChatSettingsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomChatSettingsParser); + } + + public getParser(): RoomChatSettingsParser + { + return this.parser as RoomChatSettingsParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/data/RoomEntryInfoMessageEvent.ts b/packages/communication/src/messages/incoming/room/data/RoomEntryInfoMessageEvent.ts new file mode 100644 index 0000000..52bb798 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/data/RoomEntryInfoMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomEntryInfoMessageParser } from '../../../parser'; + +export class RoomEntryInfoMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomEntryInfoMessageParser); + } + + public getParser(): RoomEntryInfoMessageParser + { + return this.parser as RoomEntryInfoMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/data/RoomScoreEvent.ts b/packages/communication/src/messages/incoming/room/data/RoomScoreEvent.ts new file mode 100644 index 0000000..1b61c3e --- /dev/null +++ b/packages/communication/src/messages/incoming/room/data/RoomScoreEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomScoreParser } from '../../../parser'; + +export class RoomScoreEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomScoreParser); + } + + public getParser(): RoomScoreParser + { + return this.parser as RoomScoreParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/data/index.ts b/packages/communication/src/messages/incoming/room/data/index.ts new file mode 100644 index 0000000..e0187f0 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/data/index.ts @@ -0,0 +1,3 @@ +export * from './RoomChatSettingsEvent'; +export * from './RoomEntryInfoMessageEvent'; +export * from './RoomScoreEvent'; diff --git a/packages/communication/src/messages/incoming/room/engine/FavoriteMembershipUpdateMessageEvent.ts b/packages/communication/src/messages/incoming/room/engine/FavoriteMembershipUpdateMessageEvent.ts new file mode 100644 index 0000000..22d0673 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/engine/FavoriteMembershipUpdateMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FavoriteMembershipUpdateMessageParser } from '../../../parser'; + +export class FavoriteMembershipUpdateMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FavoriteMembershipUpdateMessageParser); + } + + public getParser(): FavoriteMembershipUpdateMessageParser + { + return this.parser as FavoriteMembershipUpdateMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/engine/ObjectsDataUpdateEvent.ts b/packages/communication/src/messages/incoming/room/engine/ObjectsDataUpdateEvent.ts new file mode 100644 index 0000000..b437f67 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/engine/ObjectsDataUpdateEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ObjectsDataUpdateParser } from '../../../parser'; + +export class ObjectsDataUpdateEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ObjectsDataUpdateParser); + } + + public getParser(): ObjectsDataUpdateParser + { + return this.parser as ObjectsDataUpdateParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/engine/ObjectsRollingEvent.ts b/packages/communication/src/messages/incoming/room/engine/ObjectsRollingEvent.ts new file mode 100644 index 0000000..0933888 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/engine/ObjectsRollingEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ObjectsRollingParser } from '../../../parser'; + +export class ObjectsRollingEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ObjectsRollingParser); + } + + public getParser(): ObjectsRollingParser + { + return this.parser as ObjectsRollingParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/engine/index.ts b/packages/communication/src/messages/incoming/room/engine/index.ts new file mode 100644 index 0000000..24ceed5 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/engine/index.ts @@ -0,0 +1,3 @@ +export * from './FavoriteMembershipUpdateMessageEvent'; +export * from './ObjectsDataUpdateEvent'; +export * from './ObjectsRollingEvent'; diff --git a/packages/communication/src/messages/incoming/room/furniture/CustomUserNotificationMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/CustomUserNotificationMessageEvent.ts new file mode 100644 index 0000000..5d9985a --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/CustomUserNotificationMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { CustomUserNotificationMessageParser } from '../../../parser'; + +export class CustomUserNotificationMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, CustomUserNotificationMessageParser); + } + + public getParser(): CustomUserNotificationMessageParser + { + return this.parser as CustomUserNotificationMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/DiceValueMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/DiceValueMessageEvent.ts new file mode 100644 index 0000000..f51f6ea --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/DiceValueMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { DiceValueMessageParser } from '../../../parser'; + +export class DiceValueMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, DiceValueMessageParser); + } + + public getParser(): DiceValueMessageParser + { + return this.parser as DiceValueMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/FurniRentOrBuyoutOfferMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/FurniRentOrBuyoutOfferMessageEvent.ts new file mode 100644 index 0000000..8bd9108 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/FurniRentOrBuyoutOfferMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FurniRentOrBuyoutOfferMessageParser } from '../../../parser'; + +export class FurniRentOrBuyoutOfferMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FurniRentOrBuyoutOfferMessageParser); + } + + public getParser(): FurniRentOrBuyoutOfferMessageParser + { + return this.parser as FurniRentOrBuyoutOfferMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/FurnitureAliasesEvent.ts b/packages/communication/src/messages/incoming/room/furniture/FurnitureAliasesEvent.ts new file mode 100644 index 0000000..889f2d1 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/FurnitureAliasesEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FurnitureAliasesParser } from '../../../parser'; + +export class FurnitureAliasesEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FurnitureAliasesParser); + } + + public getParser(): FurnitureAliasesParser + { + return this.parser as FurnitureAliasesParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/FurnitureDataEvent.ts b/packages/communication/src/messages/incoming/room/furniture/FurnitureDataEvent.ts new file mode 100644 index 0000000..2d79a96 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/FurnitureDataEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FurnitureDataParser } from '../../../parser'; + +export class FurnitureDataEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FurnitureDataParser); + } + + public getParser(): FurnitureDataParser + { + return this.parser as FurnitureDataParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/FurnitureStackHeightEvent.ts b/packages/communication/src/messages/incoming/room/furniture/FurnitureStackHeightEvent.ts new file mode 100644 index 0000000..a3567b5 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/FurnitureStackHeightEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FurnitureStackHeightParser } from '../../../parser'; + +export class FurnitureStackHeightEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FurnitureStackHeightParser); + } + + public getParser(): FurnitureStackHeightParser + { + return this.parser as FurnitureStackHeightParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/GroupFurniContextMenuInfoMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/GroupFurniContextMenuInfoMessageEvent.ts new file mode 100644 index 0000000..39ae2e4 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/GroupFurniContextMenuInfoMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GroupFurniContextMenuInfoMessageParser } from '../../../parser'; + +export class GroupFurniContextMenuInfoMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GroupFurniContextMenuInfoMessageParser); + } + + public getParser(): GroupFurniContextMenuInfoMessageParser + { + return this.parser as GroupFurniContextMenuInfoMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/ItemDataUpdateMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/ItemDataUpdateMessageEvent.ts new file mode 100644 index 0000000..93b5b53 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/ItemDataUpdateMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ItemDataUpdateMessageParser } from '../../../parser'; + +export class ItemDataUpdateMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ItemDataUpdateMessageParser); + } + + public getParser(): ItemDataUpdateMessageParser + { + return this.parser as ItemDataUpdateMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/LoveLockFurniFinishedEvent.ts b/packages/communication/src/messages/incoming/room/furniture/LoveLockFurniFinishedEvent.ts new file mode 100644 index 0000000..f11a0a4 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/LoveLockFurniFinishedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { LoveLockFurniFinishedParser } from '../../../parser'; + +export class LoveLockFurniFinishedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, LoveLockFurniFinishedParser); + } + + public getParser(): LoveLockFurniFinishedParser + { + return this.parser as LoveLockFurniFinishedParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/LoveLockFurniFriendConfirmedEvent.ts b/packages/communication/src/messages/incoming/room/furniture/LoveLockFurniFriendConfirmedEvent.ts new file mode 100644 index 0000000..a957f9d --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/LoveLockFurniFriendConfirmedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { LoveLockFurniFriendConfirmedParser } from '../../../parser'; + +export class LoveLockFurniFriendConfirmedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, LoveLockFurniFriendConfirmedParser); + } + + public getParser(): LoveLockFurniFriendConfirmedParser + { + return this.parser as LoveLockFurniFriendConfirmedParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/LoveLockFurniStartEvent.ts b/packages/communication/src/messages/incoming/room/furniture/LoveLockFurniStartEvent.ts new file mode 100644 index 0000000..d096e0a --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/LoveLockFurniStartEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { LoveLockFurniStartParser } from '../../../parser'; + +export class LoveLockFurniStartEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, LoveLockFurniStartParser); + } + + public getParser(): LoveLockFurniStartParser + { + return this.parser as LoveLockFurniStartParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/OneWayDoorStatusMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/OneWayDoorStatusMessageEvent.ts new file mode 100644 index 0000000..47c94aa --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/OneWayDoorStatusMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { OneWayDoorStatusMessageParser } from '../../../parser'; + +export class OneWayDoorStatusMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, OneWayDoorStatusMessageParser); + } + + public getParser(): OneWayDoorStatusMessageParser + { + return this.parser as OneWayDoorStatusMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/RentableSpaceRentFailedMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/RentableSpaceRentFailedMessageEvent.ts new file mode 100644 index 0000000..7d89a75 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/RentableSpaceRentFailedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RentableSpaceRentFailedMessageParser } from '../../../parser'; + +export class RentableSpaceRentFailedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RentableSpaceRentFailedMessageParser); + } + + public getParser(): RentableSpaceRentFailedMessageParser + { + return this.parser as RentableSpaceRentFailedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/RentableSpaceRentOkMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/RentableSpaceRentOkMessageEvent.ts new file mode 100644 index 0000000..4f4411b --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/RentableSpaceRentOkMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RentableSpaceRentOkMessageParser } from '../../../parser'; + +export class RentableSpaceRentOkMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RentableSpaceRentOkMessageParser); + } + + public getParser(): RentableSpaceRentOkMessageParser + { + return this.parser as RentableSpaceRentOkMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/RentableSpaceStatusMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/RentableSpaceStatusMessageEvent.ts new file mode 100644 index 0000000..144901f --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/RentableSpaceStatusMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RentableSpaceStatusMessageParser } from '../../../parser'; + +export class RentableSpaceStatusMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RentableSpaceStatusMessageParser); + } + + public getParser(): RentableSpaceStatusMessageParser + { + return this.parser as RentableSpaceStatusMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/RequestSpamWallPostItMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/RequestSpamWallPostItMessageEvent.ts new file mode 100644 index 0000000..a56e186 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/RequestSpamWallPostItMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RequestSpamWallPostItMessageParser } from '../../../parser'; + +export class RequestSpamWallPostItMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RequestSpamWallPostItMessageParser); + } + + public getParser(): RequestSpamWallPostItMessageParser + { + return this.parser as RequestSpamWallPostItMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/RoomDimmerPresetsMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/RoomDimmerPresetsMessageEvent.ts new file mode 100644 index 0000000..f2bc75c --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/RoomDimmerPresetsMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomDimmerPresetsMessageParser } from '../../../parser'; + +export class RoomDimmerPresetsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomDimmerPresetsMessageParser); + } + + public getParser(): RoomDimmerPresetsMessageParser + { + return this.parser as RoomDimmerPresetsMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/RoomMessageNotificationMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/RoomMessageNotificationMessageEvent.ts new file mode 100644 index 0000000..38ec773 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/RoomMessageNotificationMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomMessageNotificationMessageParser } from '../../../parser'; + +export class RoomMessageNotificationMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomMessageNotificationMessageParser); + } + + public getParser(): RoomMessageNotificationMessageParser + { + return this.parser as RoomMessageNotificationMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/WelcomeGiftStatusEvent.ts b/packages/communication/src/messages/incoming/room/furniture/WelcomeGiftStatusEvent.ts new file mode 100644 index 0000000..f5d2f84 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/WelcomeGiftStatusEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { WelcomeGiftStatusParser } from '../../../parser'; + +export class WelcomeGiftStatusEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, WelcomeGiftStatusParser); + } + + public getParser(): WelcomeGiftStatusParser + { + return this.parser as WelcomeGiftStatusParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorAddEvent.ts b/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorAddEvent.ts new file mode 100644 index 0000000..7110566 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorAddEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FurnitureFloorAddParser } from '../../../../parser'; + +export class FurnitureFloorAddEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FurnitureFloorAddParser); + } + + public getParser(): FurnitureFloorAddParser + { + return this.parser as FurnitureFloorAddParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorEvent.ts b/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorEvent.ts new file mode 100644 index 0000000..aa306ad --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FurnitureFloorParser } from '../../../../parser'; + +export class FurnitureFloorEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FurnitureFloorParser); + } + + public getParser(): FurnitureFloorParser + { + return this.parser as FurnitureFloorParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorRemoveEvent.ts b/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorRemoveEvent.ts new file mode 100644 index 0000000..2e52e7d --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorRemoveEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FurnitureFloorRemoveParser } from '../../../../parser'; + +export class FurnitureFloorRemoveEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FurnitureFloorRemoveParser); + } + + public getParser(): FurnitureFloorRemoveParser + { + return this.parser as FurnitureFloorRemoveParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorUpdateEvent.ts b/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorUpdateEvent.ts new file mode 100644 index 0000000..649a919 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorUpdateEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FurnitureFloorUpdateParser } from '../../../../parser'; + +export class FurnitureFloorUpdateEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FurnitureFloorUpdateParser); + } + + public getParser(): FurnitureFloorUpdateParser + { + return this.parser as FurnitureFloorUpdateParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/floor/index.ts b/packages/communication/src/messages/incoming/room/furniture/floor/index.ts new file mode 100644 index 0000000..4b0cb67 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/floor/index.ts @@ -0,0 +1,4 @@ +export * from './FurnitureFloorAddEvent'; +export * from './FurnitureFloorEvent'; +export * from './FurnitureFloorRemoveEvent'; +export * from './FurnitureFloorUpdateEvent'; diff --git a/packages/communication/src/messages/incoming/room/furniture/index.ts b/packages/communication/src/messages/incoming/room/furniture/index.ts new file mode 100644 index 0000000..3926d97 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/index.ts @@ -0,0 +1,22 @@ +export * from './CustomUserNotificationMessageEvent'; +export * from './DiceValueMessageEvent'; +export * from './floor'; +export * from './FurniRentOrBuyoutOfferMessageEvent'; +export * from './FurnitureAliasesEvent'; +export * from './FurnitureDataEvent'; +export * from './FurnitureStackHeightEvent'; +export * from './GroupFurniContextMenuInfoMessageEvent'; +export * from './ItemDataUpdateMessageEvent'; +export * from './LoveLockFurniFinishedEvent'; +export * from './LoveLockFurniFriendConfirmedEvent'; +export * from './LoveLockFurniStartEvent'; +export * from './OneWayDoorStatusMessageEvent'; +export * from './RentableSpaceRentFailedMessageEvent'; +export * from './RentableSpaceRentOkMessageEvent'; +export * from './RentableSpaceStatusMessageEvent'; +export * from './RequestSpamWallPostItMessageEvent'; +export * from './RoomDimmerPresetsMessageEvent'; +export * from './RoomMessageNotificationMessageEvent'; +export * from './wall'; +export * from './WelcomeGiftStatusEvent'; +export * from './youtube'; diff --git a/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallAddEvent.ts b/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallAddEvent.ts new file mode 100644 index 0000000..65ed984 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallAddEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FurnitureWallAddParser } from '../../../../parser'; + +export class FurnitureWallAddEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FurnitureWallAddParser); + } + + public getParser(): FurnitureWallAddParser + { + return this.parser as FurnitureWallAddParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallEvent.ts b/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallEvent.ts new file mode 100644 index 0000000..9fa41de --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FurnitureWallParser } from '../../../../parser'; + +export class FurnitureWallEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FurnitureWallParser); + } + + public getParser(): FurnitureWallParser + { + return this.parser as FurnitureWallParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallRemoveEvent.ts b/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallRemoveEvent.ts new file mode 100644 index 0000000..629bea0 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallRemoveEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FurnitureWallRemoveParser } from '../../../../parser'; + +export class FurnitureWallRemoveEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FurnitureWallRemoveParser); + } + + public getParser(): FurnitureWallRemoveParser + { + return this.parser as FurnitureWallRemoveParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallUpdateEvent.ts b/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallUpdateEvent.ts new file mode 100644 index 0000000..9de2f54 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallUpdateEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FurnitureWallUpdateParser } from '../../../../parser'; + +export class FurnitureWallUpdateEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FurnitureWallUpdateParser); + } + + public getParser(): FurnitureWallUpdateParser + { + return this.parser as FurnitureWallUpdateParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/wall/index.ts b/packages/communication/src/messages/incoming/room/furniture/wall/index.ts new file mode 100644 index 0000000..3065491 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/wall/index.ts @@ -0,0 +1,4 @@ +export * from './FurnitureWallAddEvent'; +export * from './FurnitureWallEvent'; +export * from './FurnitureWallRemoveEvent'; +export * from './FurnitureWallUpdateEvent'; diff --git a/packages/communication/src/messages/incoming/room/furniture/youtube/YoutubeControlVideoMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/youtube/YoutubeControlVideoMessageEvent.ts new file mode 100644 index 0000000..07bd036 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/youtube/YoutubeControlVideoMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { YoutubeControlVideoMessageParser } from '../../../../parser'; + +export class YoutubeControlVideoMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, YoutubeControlVideoMessageParser); + } + + public getParser(): YoutubeControlVideoMessageParser + { + return this.parser as YoutubeControlVideoMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/youtube/YoutubeDisplayPlaylistsEvent.ts b/packages/communication/src/messages/incoming/room/furniture/youtube/YoutubeDisplayPlaylistsEvent.ts new file mode 100644 index 0000000..e0cc322 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/youtube/YoutubeDisplayPlaylistsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { YoutubeDisplayPlaylistsMessageParser } from '../../../../parser'; + +export class YoutubeDisplayPlaylistsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, YoutubeDisplayPlaylistsMessageParser); + } + + public getParser(): YoutubeDisplayPlaylistsMessageParser + { + return this.parser as YoutubeDisplayPlaylistsMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/youtube/YoutubeDisplayVideoMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/youtube/YoutubeDisplayVideoMessageEvent.ts new file mode 100644 index 0000000..c5d0808 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/youtube/YoutubeDisplayVideoMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { YoutubeDisplayVideoMessageParser } from '../../../../parser'; + +export class YoutubeDisplayVideoMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, YoutubeDisplayVideoMessageParser); + } + + public getParser(): YoutubeDisplayVideoMessageParser + { + return this.parser as YoutubeDisplayVideoMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/furniture/youtube/index.ts b/packages/communication/src/messages/incoming/room/furniture/youtube/index.ts new file mode 100644 index 0000000..4bb22a3 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/furniture/youtube/index.ts @@ -0,0 +1,3 @@ +export * from './YoutubeControlVideoMessageEvent'; +export * from './YoutubeDisplayPlaylistsEvent'; +export * from './YoutubeDisplayVideoMessageEvent'; diff --git a/packages/communication/src/messages/incoming/room/index.ts b/packages/communication/src/messages/incoming/room/index.ts new file mode 100644 index 0000000..81b327b --- /dev/null +++ b/packages/communication/src/messages/incoming/room/index.ts @@ -0,0 +1,15 @@ +export * from './access'; +export * from './access/doorbell'; +export * from './access/rights'; +export * from './bots'; +export * from './data'; +export * from './engine'; +export * from './furniture'; +export * from './furniture/floor'; +export * from './furniture/wall'; +export * from './furniture/youtube'; +export * from './mapping'; +export * from './pet'; +export * from './session'; +export * from './unit'; +export * from './unit/chat'; diff --git a/packages/communication/src/messages/incoming/room/mapping/FloorHeightMapEvent.ts b/packages/communication/src/messages/incoming/room/mapping/FloorHeightMapEvent.ts new file mode 100644 index 0000000..49f3e01 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/mapping/FloorHeightMapEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FloorHeightMapMessageParser } from '../../../parser'; + +export class FloorHeightMapEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FloorHeightMapMessageParser); + } + + public getParser(): FloorHeightMapMessageParser + { + return this.parser as FloorHeightMapMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/mapping/RoomEntryTileMessageEvent.ts b/packages/communication/src/messages/incoming/room/mapping/RoomEntryTileMessageEvent.ts new file mode 100644 index 0000000..b398781 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/mapping/RoomEntryTileMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomEntryTileMessageParser } from '../../../parser'; + +export class RoomEntryTileMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomEntryTileMessageParser); + } + + public getParser(): RoomEntryTileMessageParser + { + return this.parser as RoomEntryTileMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/mapping/RoomHeightMapEvent.ts b/packages/communication/src/messages/incoming/room/mapping/RoomHeightMapEvent.ts new file mode 100644 index 0000000..022ff6e --- /dev/null +++ b/packages/communication/src/messages/incoming/room/mapping/RoomHeightMapEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomHeightMapParser } from '../../../parser'; + +export class RoomHeightMapEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomHeightMapParser); + } + + public getParser(): RoomHeightMapParser + { + return this.parser as RoomHeightMapParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/mapping/RoomHeightMapUpdateEvent.ts b/packages/communication/src/messages/incoming/room/mapping/RoomHeightMapUpdateEvent.ts new file mode 100644 index 0000000..89892ae --- /dev/null +++ b/packages/communication/src/messages/incoming/room/mapping/RoomHeightMapUpdateEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomHeightMapUpdateParser } from '../../../parser'; + +export class RoomHeightMapUpdateEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomHeightMapUpdateParser); + } + + public getParser(): RoomHeightMapUpdateParser + { + return this.parser as RoomHeightMapUpdateParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/mapping/RoomOccupiedTilesMessageEvent.ts b/packages/communication/src/messages/incoming/room/mapping/RoomOccupiedTilesMessageEvent.ts new file mode 100644 index 0000000..d58d1e9 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/mapping/RoomOccupiedTilesMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomOccupiedTilesMessageParser } from '../../../parser'; + +export class RoomOccupiedTilesMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomOccupiedTilesMessageParser); + } + + public getParser(): RoomOccupiedTilesMessageParser + { + return this.parser as RoomOccupiedTilesMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/mapping/RoomPaintEvent.ts b/packages/communication/src/messages/incoming/room/mapping/RoomPaintEvent.ts new file mode 100644 index 0000000..c6a81e6 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/mapping/RoomPaintEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomPaintParser } from '../../../parser'; + +export class RoomPaintEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomPaintParser); + } + + public getParser(): RoomPaintParser + { + return this.parser as RoomPaintParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/mapping/RoomReadyMessageEvent.ts b/packages/communication/src/messages/incoming/room/mapping/RoomReadyMessageEvent.ts new file mode 100644 index 0000000..9866d91 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/mapping/RoomReadyMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomReadyMessageParser } from '../../../parser'; + +export class RoomReadyMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomReadyMessageParser); + } + + public getParser(): RoomReadyMessageParser + { + return this.parser as RoomReadyMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/mapping/RoomVisualizationSettingsEvent.ts b/packages/communication/src/messages/incoming/room/mapping/RoomVisualizationSettingsEvent.ts new file mode 100644 index 0000000..2c43b55 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/mapping/RoomVisualizationSettingsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomVisualizationSettingsParser } from '../../../parser'; + +export class RoomVisualizationSettingsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomVisualizationSettingsParser); + } + + public getParser(): RoomVisualizationSettingsParser + { + return this.parser as RoomVisualizationSettingsParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/mapping/index.ts b/packages/communication/src/messages/incoming/room/mapping/index.ts new file mode 100644 index 0000000..1ada5b8 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/mapping/index.ts @@ -0,0 +1,8 @@ +export * from './FloorHeightMapEvent'; +export * from './RoomEntryTileMessageEvent'; +export * from './RoomHeightMapEvent'; +export * from './RoomHeightMapUpdateEvent'; +export * from './RoomOccupiedTilesMessageEvent'; +export * from './RoomPaintEvent'; +export * from './RoomReadyMessageEvent'; +export * from './RoomVisualizationSettingsEvent'; diff --git a/packages/communication/src/messages/incoming/room/pet/PetBreedingResultEvent.ts b/packages/communication/src/messages/incoming/room/pet/PetBreedingResultEvent.ts new file mode 100644 index 0000000..15427aa --- /dev/null +++ b/packages/communication/src/messages/incoming/room/pet/PetBreedingResultEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PetBreedingResultParser } from '../../../parser'; + +export class PetBreedingResultEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PetBreedingResultParser); + } + + public getParser(): PetBreedingResultParser + { + return this.parser as PetBreedingResultParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/pet/PetExperienceEvent.ts b/packages/communication/src/messages/incoming/room/pet/PetExperienceEvent.ts new file mode 100644 index 0000000..e62fb70 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/pet/PetExperienceEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PetExperienceParser } from '../../../parser'; + +export class PetExperienceEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PetExperienceParser); + } + + public getParser(): PetExperienceParser + { + return this.parser as PetExperienceParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/pet/PetFigureUpdateEvent.ts b/packages/communication/src/messages/incoming/room/pet/PetFigureUpdateEvent.ts new file mode 100644 index 0000000..de538ae --- /dev/null +++ b/packages/communication/src/messages/incoming/room/pet/PetFigureUpdateEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PetFigureUpdateParser } from '../../../parser'; + +export class PetFigureUpdateEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PetFigureUpdateParser); + } + + public getParser(): PetFigureUpdateParser + { + return this.parser as PetFigureUpdateParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/pet/PetInfoEvent.ts b/packages/communication/src/messages/incoming/room/pet/PetInfoEvent.ts new file mode 100644 index 0000000..3e42bcf --- /dev/null +++ b/packages/communication/src/messages/incoming/room/pet/PetInfoEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PetInfoParser } from '../../../parser'; + +export class PetInfoEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PetInfoParser); + } + + public getParser(): PetInfoParser + { + return this.parser as PetInfoParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/pet/PetStatusUpdateEvent.ts b/packages/communication/src/messages/incoming/room/pet/PetStatusUpdateEvent.ts new file mode 100644 index 0000000..587b126 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/pet/PetStatusUpdateEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PetStatusUpdateParser } from '../../../parser'; + +export class PetStatusUpdateEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PetStatusUpdateParser); + } + + public getParser(): PetStatusUpdateParser + { + return this.parser as PetStatusUpdateParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/pet/index.ts b/packages/communication/src/messages/incoming/room/pet/index.ts new file mode 100644 index 0000000..e43bd92 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/pet/index.ts @@ -0,0 +1,5 @@ +export * from './PetBreedingResultEvent'; +export * from './PetExperienceEvent'; +export * from './PetFigureUpdateEvent'; +export * from './PetInfoEvent'; +export * from './PetStatusUpdateEvent'; diff --git a/packages/communication/src/messages/incoming/room/session/YouArePlayingGameEvent.ts b/packages/communication/src/messages/incoming/room/session/YouArePlayingGameEvent.ts new file mode 100644 index 0000000..a895b58 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/session/YouArePlayingGameEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { YouArePlayingGameParser } from '../../../parser'; + +export class YouArePlayingGameEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, YouArePlayingGameParser); + } + + public getParser(): YouArePlayingGameParser + { + return this.parser as YouArePlayingGameParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/session/YouAreSpectatorMessageEvent.ts b/packages/communication/src/messages/incoming/room/session/YouAreSpectatorMessageEvent.ts new file mode 100644 index 0000000..70a0067 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/session/YouAreSpectatorMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { YouAreSpectatorMessageParser } from '../../../parser'; + +export class YouAreSpectatorMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, YouAreSpectatorMessageParser); + } + + public getParser(): YouAreSpectatorMessageParser + { + return this.parser as YouAreSpectatorMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/session/index.ts b/packages/communication/src/messages/incoming/room/session/index.ts new file mode 100644 index 0000000..0ac722b --- /dev/null +++ b/packages/communication/src/messages/incoming/room/session/index.ts @@ -0,0 +1,2 @@ +export * from './YouArePlayingGameEvent'; +export * from './YouAreSpectatorMessageEvent'; diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitDanceEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitDanceEvent.ts new file mode 100644 index 0000000..3c2bc06 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitDanceEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomUnitDanceParser } from '../../../parser'; + +export class RoomUnitDanceEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomUnitDanceParser); + } + + public getParser(): RoomUnitDanceParser + { + return this.parser as RoomUnitDanceParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitEffectEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitEffectEvent.ts new file mode 100644 index 0000000..933d21a --- /dev/null +++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitEffectEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomUnitEffectParser } from '../../../parser'; + +export class RoomUnitEffectEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomUnitEffectParser); + } + + public getParser(): RoomUnitEffectParser + { + return this.parser as RoomUnitEffectParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitEvent.ts new file mode 100644 index 0000000..37a5e09 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomUnitParser } from '../../../parser'; + +export class RoomUnitEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomUnitParser); + } + + public getParser(): RoomUnitParser + { + return this.parser as RoomUnitParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitExpressionEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitExpressionEvent.ts new file mode 100644 index 0000000..f42becf --- /dev/null +++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitExpressionEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomUnitExpressionParser } from '../../../parser'; + +export class RoomUnitExpressionEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomUnitExpressionParser); + } + + public getParser(): RoomUnitExpressionParser + { + return this.parser as RoomUnitExpressionParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitHandItemEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitHandItemEvent.ts new file mode 100644 index 0000000..dd7a431 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitHandItemEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomUnitHandItemParser } from '../../../parser'; + +export class RoomUnitHandItemEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomUnitHandItemParser); + } + + public getParser(): RoomUnitHandItemParser + { + return this.parser as RoomUnitHandItemParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitHandItemReceivedEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitHandItemReceivedEvent.ts new file mode 100644 index 0000000..05548cd --- /dev/null +++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitHandItemReceivedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomUnitHandItemReceivedParser } from '../../../parser'; + +export class RoomUnitHandItemReceivedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomUnitHandItemReceivedParser); + } + + public getParser(): RoomUnitHandItemReceivedParser + { + return this.parser as RoomUnitHandItemReceivedParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitIdleEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitIdleEvent.ts new file mode 100644 index 0000000..263e64f --- /dev/null +++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitIdleEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomUnitIdleParser } from '../../../parser'; + +export class RoomUnitIdleEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomUnitIdleParser); + } + + public getParser(): RoomUnitIdleParser + { + return this.parser as RoomUnitIdleParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitInfoEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitInfoEvent.ts new file mode 100644 index 0000000..f4f91aa --- /dev/null +++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitInfoEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomUnitInfoParser } from '../../../parser'; + +export class RoomUnitInfoEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomUnitInfoParser); + } + + public getParser(): RoomUnitInfoParser + { + return this.parser as RoomUnitInfoParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitNumberEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitNumberEvent.ts new file mode 100644 index 0000000..cd2f0e8 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitNumberEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomUnitNumberParser } from '../../../parser'; + +export class RoomUnitNumberEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomUnitNumberParser); + } + + public getParser(): RoomUnitNumberParser + { + return this.parser as RoomUnitNumberParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitRemoveEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitRemoveEvent.ts new file mode 100644 index 0000000..1c55487 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitRemoveEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomUnitRemoveParser } from '../../../parser'; + +export class RoomUnitRemoveEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomUnitRemoveParser); + } + + public getParser(): RoomUnitRemoveParser + { + return this.parser as RoomUnitRemoveParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitStatusEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitStatusEvent.ts new file mode 100644 index 0000000..290b337 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitStatusEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomUnitStatusParser } from '../../../parser'; + +export class RoomUnitStatusEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomUnitStatusParser); + } + + public getParser(): RoomUnitStatusParser + { + return this.parser as RoomUnitStatusParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/unit/chat/FloodControlEvent.ts b/packages/communication/src/messages/incoming/room/unit/chat/FloodControlEvent.ts new file mode 100644 index 0000000..2e739e0 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/unit/chat/FloodControlEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FloodControlParser } from '../../../../parser'; + +export class FloodControlEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FloodControlParser); + } + + public getParser(): FloodControlParser + { + return this.parser as FloodControlParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/unit/chat/RemainingMuteEvent.ts b/packages/communication/src/messages/incoming/room/unit/chat/RemainingMuteEvent.ts new file mode 100644 index 0000000..36b194d --- /dev/null +++ b/packages/communication/src/messages/incoming/room/unit/chat/RemainingMuteEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RemainingMuteParser } from '../../../../parser'; + +export class RemainingMuteEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RemainingMuteParser); + } + + public getParser(): RemainingMuteParser + { + return this.parser as RemainingMuteParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitChatEvent.ts b/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitChatEvent.ts new file mode 100644 index 0000000..2f0a49c --- /dev/null +++ b/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitChatEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomUnitChatParser } from '../../../../parser'; + +export class RoomUnitChatEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomUnitChatParser); + } + + public getParser(): RoomUnitChatParser + { + return this.parser as RoomUnitChatParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitChatShoutEvent.ts b/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitChatShoutEvent.ts new file mode 100644 index 0000000..728de37 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitChatShoutEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomUnitChatParser } from '../../../../parser'; + +export class RoomUnitChatShoutEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomUnitChatParser); + } + + public getParser(): RoomUnitChatParser + { + return this.parser as RoomUnitChatParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitChatWhisperEvent.ts b/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitChatWhisperEvent.ts new file mode 100644 index 0000000..7706052 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitChatWhisperEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomUnitChatParser } from '../../../../parser'; + +export class RoomUnitChatWhisperEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomUnitChatParser); + } + + public getParser(): RoomUnitChatParser + { + return this.parser as RoomUnitChatParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitTypingEvent.ts b/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitTypingEvent.ts new file mode 100644 index 0000000..c13c250 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitTypingEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomUnitTypingParser } from '../../../../parser'; + +export class RoomUnitTypingEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomUnitTypingParser); + } + + public getParser(): RoomUnitTypingParser + { + return this.parser as RoomUnitTypingParser; + } +} diff --git a/packages/communication/src/messages/incoming/room/unit/chat/index.ts b/packages/communication/src/messages/incoming/room/unit/chat/index.ts new file mode 100644 index 0000000..6ba41a2 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/unit/chat/index.ts @@ -0,0 +1,6 @@ +export * from './FloodControlEvent'; +export * from './RemainingMuteEvent'; +export * from './RoomUnitChatEvent'; +export * from './RoomUnitChatShoutEvent'; +export * from './RoomUnitChatWhisperEvent'; +export * from './RoomUnitTypingEvent'; diff --git a/packages/communication/src/messages/incoming/room/unit/index.ts b/packages/communication/src/messages/incoming/room/unit/index.ts new file mode 100644 index 0000000..2592685 --- /dev/null +++ b/packages/communication/src/messages/incoming/room/unit/index.ts @@ -0,0 +1,12 @@ +export * from './chat'; +export * from './RoomUnitDanceEvent'; +export * from './RoomUnitEffectEvent'; +export * from './RoomUnitEvent'; +export * from './RoomUnitExpressionEvent'; +export * from './RoomUnitHandItemEvent'; +export * from './RoomUnitHandItemReceivedEvent'; +export * from './RoomUnitIdleEvent'; +export * from './RoomUnitInfoEvent'; +export * from './RoomUnitNumberEvent'; +export * from './RoomUnitRemoveEvent'; +export * from './RoomUnitStatusEvent'; diff --git a/packages/communication/src/messages/incoming/roomevents/WiredFurniActionEvent.ts b/packages/communication/src/messages/incoming/roomevents/WiredFurniActionEvent.ts new file mode 100644 index 0000000..4ee1c0b --- /dev/null +++ b/packages/communication/src/messages/incoming/roomevents/WiredFurniActionEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { WiredFurniActionParser } from '../../parser'; + +export class WiredFurniActionEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, WiredFurniActionParser); + } + + public getParser(): WiredFurniActionParser + { + return this.parser as WiredFurniActionParser; + } +} diff --git a/packages/communication/src/messages/incoming/roomevents/WiredFurniConditionEvent.ts b/packages/communication/src/messages/incoming/roomevents/WiredFurniConditionEvent.ts new file mode 100644 index 0000000..096c447 --- /dev/null +++ b/packages/communication/src/messages/incoming/roomevents/WiredFurniConditionEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { WiredFurniConditionParser } from '../../parser'; + +export class WiredFurniConditionEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, WiredFurniConditionParser); + } + + public getParser(): WiredFurniConditionParser + { + return this.parser as WiredFurniConditionParser; + } +} diff --git a/packages/communication/src/messages/incoming/roomevents/WiredFurniTriggerEvent.ts b/packages/communication/src/messages/incoming/roomevents/WiredFurniTriggerEvent.ts new file mode 100644 index 0000000..d6afb96 --- /dev/null +++ b/packages/communication/src/messages/incoming/roomevents/WiredFurniTriggerEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { WiredFurniTriggerParser } from '../../parser'; + +export class WiredFurniTriggerEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, WiredFurniTriggerParser); + } + + public getParser(): WiredFurniTriggerParser + { + return this.parser as WiredFurniTriggerParser; + } +} diff --git a/packages/communication/src/messages/incoming/roomevents/WiredOpenEvent.ts b/packages/communication/src/messages/incoming/roomevents/WiredOpenEvent.ts new file mode 100644 index 0000000..3496953 --- /dev/null +++ b/packages/communication/src/messages/incoming/roomevents/WiredOpenEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { WiredOpenParser } from '../../parser'; + +export class WiredOpenEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, WiredOpenParser); + } + + public getParser(): WiredOpenParser + { + return this.parser as WiredOpenParser; + } +} diff --git a/packages/communication/src/messages/incoming/roomevents/WiredRewardResultMessageEvent.ts b/packages/communication/src/messages/incoming/roomevents/WiredRewardResultMessageEvent.ts new file mode 100644 index 0000000..59252da --- /dev/null +++ b/packages/communication/src/messages/incoming/roomevents/WiredRewardResultMessageEvent.ts @@ -0,0 +1,19 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { WiredRewardResultMessageParser } from '../../parser'; + +export class WiredRewardResultMessageEvent extends MessageEvent implements IMessageEvent +{ + public static PRODUCT_DONATED_CODE: number = 6; + public static BADGE_DONATED_CODE: number = 7; + + constructor(callBack: Function) + { + super(callBack, WiredRewardResultMessageParser); + } + + public getParser(): WiredRewardResultMessageParser + { + return this.parser as WiredRewardResultMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/roomevents/WiredSaveSuccessEvent.ts b/packages/communication/src/messages/incoming/roomevents/WiredSaveSuccessEvent.ts new file mode 100644 index 0000000..3b6250a --- /dev/null +++ b/packages/communication/src/messages/incoming/roomevents/WiredSaveSuccessEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { WiredSaveSuccessParser } from '../../parser'; + +export class WiredSaveSuccessEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, WiredSaveSuccessParser); + } + + public getParser(): WiredSaveSuccessParser + { + return this.parser as WiredSaveSuccessParser; + } +} diff --git a/packages/communication/src/messages/incoming/roomevents/WiredValidationErrorEvent.ts b/packages/communication/src/messages/incoming/roomevents/WiredValidationErrorEvent.ts new file mode 100644 index 0000000..a29963a --- /dev/null +++ b/packages/communication/src/messages/incoming/roomevents/WiredValidationErrorEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { WiredValidationErrorParser } from '../../parser'; + +export class WiredValidationErrorEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, WiredValidationErrorParser); + } + + public getParser(): WiredValidationErrorParser + { + return this.parser as WiredValidationErrorParser; + } +} diff --git a/packages/communication/src/messages/incoming/roomevents/index.ts b/packages/communication/src/messages/incoming/roomevents/index.ts new file mode 100644 index 0000000..0775d57 --- /dev/null +++ b/packages/communication/src/messages/incoming/roomevents/index.ts @@ -0,0 +1,7 @@ +export * from './WiredFurniActionEvent'; +export * from './WiredFurniConditionEvent'; +export * from './WiredFurniTriggerEvent'; +export * from './WiredOpenEvent'; +export * from './WiredRewardResultMessageEvent'; +export * from './WiredSaveSuccessEvent'; +export * from './WiredValidationErrorEvent'; diff --git a/packages/communication/src/messages/incoming/roomsettings/BannedUsersFromRoomEvent.ts b/packages/communication/src/messages/incoming/roomsettings/BannedUsersFromRoomEvent.ts new file mode 100644 index 0000000..8e95804 --- /dev/null +++ b/packages/communication/src/messages/incoming/roomsettings/BannedUsersFromRoomEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { BannedUsersFromRoomParser } from '../../parser'; + +export class BannedUsersFromRoomEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, BannedUsersFromRoomParser); + } + + public getParser(): BannedUsersFromRoomParser + { + return this.parser as BannedUsersFromRoomParser; + } +} diff --git a/packages/communication/src/messages/incoming/roomsettings/FlatControllerAddedEvent.ts b/packages/communication/src/messages/incoming/roomsettings/FlatControllerAddedEvent.ts new file mode 100644 index 0000000..4d1fe0b --- /dev/null +++ b/packages/communication/src/messages/incoming/roomsettings/FlatControllerAddedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FlatControllerAddedParser } from '../../parser'; + +export class FlatControllerAddedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FlatControllerAddedParser); + } + + public getParser(): FlatControllerAddedParser + { + return this.parser as FlatControllerAddedParser; + } +} diff --git a/packages/communication/src/messages/incoming/roomsettings/FlatControllerRemovedEvent.ts b/packages/communication/src/messages/incoming/roomsettings/FlatControllerRemovedEvent.ts new file mode 100644 index 0000000..4f1bdbc --- /dev/null +++ b/packages/communication/src/messages/incoming/roomsettings/FlatControllerRemovedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FlatControllerRemovedParser } from '../../parser'; + +export class FlatControllerRemovedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FlatControllerRemovedParser); + } + + public getParser(): FlatControllerRemovedParser + { + return this.parser as FlatControllerRemovedParser; + } +} diff --git a/packages/communication/src/messages/incoming/roomsettings/FlatControllersEvent.ts b/packages/communication/src/messages/incoming/roomsettings/FlatControllersEvent.ts new file mode 100644 index 0000000..98da732 --- /dev/null +++ b/packages/communication/src/messages/incoming/roomsettings/FlatControllersEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { FlatControllersParser } from '../../parser'; + +export class FlatControllersEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, FlatControllersParser); + } + + public getParser(): FlatControllersParser + { + return this.parser as FlatControllersParser; + } +} diff --git a/packages/communication/src/messages/incoming/roomsettings/MuteAllInRoomEvent.ts b/packages/communication/src/messages/incoming/roomsettings/MuteAllInRoomEvent.ts new file mode 100644 index 0000000..9eaccf9 --- /dev/null +++ b/packages/communication/src/messages/incoming/roomsettings/MuteAllInRoomEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { MuteAllInRoomParser } from '../../parser'; + +export class MuteAllInRoomEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, MuteAllInRoomParser); + } + + public getParser(): MuteAllInRoomParser + { + return this.parser as MuteAllInRoomParser; + } +} diff --git a/packages/communication/src/messages/incoming/roomsettings/NoSuchFlatEvent.ts b/packages/communication/src/messages/incoming/roomsettings/NoSuchFlatEvent.ts new file mode 100644 index 0000000..745ac4d --- /dev/null +++ b/packages/communication/src/messages/incoming/roomsettings/NoSuchFlatEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { NoSuchFlatParser } from '../../parser'; + +export class NoSuchFlatEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, NoSuchFlatParser); + } + + public getParser(): NoSuchFlatParser + { + return this.parser as NoSuchFlatParser; + } +} diff --git a/packages/communication/src/messages/incoming/roomsettings/RoomSettingsDataEvent.ts b/packages/communication/src/messages/incoming/roomsettings/RoomSettingsDataEvent.ts new file mode 100644 index 0000000..69274ef --- /dev/null +++ b/packages/communication/src/messages/incoming/roomsettings/RoomSettingsDataEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomSettingsDataParser } from '../../parser'; + +export class RoomSettingsDataEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomSettingsDataParser); + } + + public getParser(): RoomSettingsDataParser + { + return this.parser as RoomSettingsDataParser; + } +} diff --git a/packages/communication/src/messages/incoming/roomsettings/RoomSettingsErrorEvent.ts b/packages/communication/src/messages/incoming/roomsettings/RoomSettingsErrorEvent.ts new file mode 100644 index 0000000..d245ce5 --- /dev/null +++ b/packages/communication/src/messages/incoming/roomsettings/RoomSettingsErrorEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomSettingsErrorParser } from '../../parser'; + +export class RoomSettingsErrorEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomSettingsErrorParser); + } + + public getParser(): RoomSettingsErrorParser + { + return this.parser as RoomSettingsErrorParser; + } +} diff --git a/packages/communication/src/messages/incoming/roomsettings/RoomSettingsSaveErrorEvent.ts b/packages/communication/src/messages/incoming/roomsettings/RoomSettingsSaveErrorEvent.ts new file mode 100644 index 0000000..459c672 --- /dev/null +++ b/packages/communication/src/messages/incoming/roomsettings/RoomSettingsSaveErrorEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomSettingsSaveErrorParser } from '../../parser'; + +export class RoomSettingsSaveErrorEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomSettingsSaveErrorParser); + } + + public getParser(): RoomSettingsSaveErrorParser + { + return this.parser as RoomSettingsSaveErrorParser; + } +} diff --git a/packages/communication/src/messages/incoming/roomsettings/RoomSettingsSavedEvent.ts b/packages/communication/src/messages/incoming/roomsettings/RoomSettingsSavedEvent.ts new file mode 100644 index 0000000..842de1e --- /dev/null +++ b/packages/communication/src/messages/incoming/roomsettings/RoomSettingsSavedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RoomSettingsSavedParser } from '../../parser'; + +export class RoomSettingsSavedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RoomSettingsSavedParser); + } + + public getParser(): RoomSettingsSavedParser + { + return this.parser as RoomSettingsSavedParser; + } +} diff --git a/packages/communication/src/messages/incoming/roomsettings/ShowEnforceRoomCategoryDialogEvent.ts b/packages/communication/src/messages/incoming/roomsettings/ShowEnforceRoomCategoryDialogEvent.ts new file mode 100644 index 0000000..c4fbb4f --- /dev/null +++ b/packages/communication/src/messages/incoming/roomsettings/ShowEnforceRoomCategoryDialogEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ShowEnforceRoomCategoryDialogParser } from '../../parser'; + +export class ShowEnforceRoomCategoryDialogEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ShowEnforceRoomCategoryDialogParser); + } + + public getParser(): ShowEnforceRoomCategoryDialogParser + { + return this.parser as ShowEnforceRoomCategoryDialogParser; + } +} diff --git a/packages/communication/src/messages/incoming/roomsettings/UserUnbannedFromRoomEvent.ts b/packages/communication/src/messages/incoming/roomsettings/UserUnbannedFromRoomEvent.ts new file mode 100644 index 0000000..69be3f1 --- /dev/null +++ b/packages/communication/src/messages/incoming/roomsettings/UserUnbannedFromRoomEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UserUnbannedFromRoomParser } from '../../parser'; + +export class UserUnbannedFromRoomEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UserUnbannedFromRoomParser); + } + + public getParser(): UserUnbannedFromRoomParser + { + return this.parser as UserUnbannedFromRoomParser; + } +} diff --git a/packages/communication/src/messages/incoming/roomsettings/index.ts b/packages/communication/src/messages/incoming/roomsettings/index.ts new file mode 100644 index 0000000..63327aa --- /dev/null +++ b/packages/communication/src/messages/incoming/roomsettings/index.ts @@ -0,0 +1,12 @@ +export * from './BannedUsersFromRoomEvent'; +export * from './FlatControllerAddedEvent'; +export * from './FlatControllerRemovedEvent'; +export * from './FlatControllersEvent'; +export * from './MuteAllInRoomEvent'; +export * from './NoSuchFlatEvent'; +export * from './RoomSettingsDataEvent'; +export * from './RoomSettingsErrorEvent'; +export * from './RoomSettingsSavedEvent'; +export * from './RoomSettingsSaveErrorEvent'; +export * from './ShowEnforceRoomCategoryDialogEvent'; +export * from './UserUnbannedFromRoomEvent'; diff --git a/packages/communication/src/messages/incoming/security/AuthenticatedEvent.ts b/packages/communication/src/messages/incoming/security/AuthenticatedEvent.ts new file mode 100644 index 0000000..1924bf8 --- /dev/null +++ b/packages/communication/src/messages/incoming/security/AuthenticatedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { AuthenticatedParser } from '../../parser'; + +export class AuthenticatedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, AuthenticatedParser); + } + + public getParser(): AuthenticatedParser + { + return this.parser as AuthenticatedParser; + } +} diff --git a/packages/communication/src/messages/incoming/security/index.ts b/packages/communication/src/messages/incoming/security/index.ts new file mode 100644 index 0000000..01a887c --- /dev/null +++ b/packages/communication/src/messages/incoming/security/index.ts @@ -0,0 +1 @@ +export * from './AuthenticatedEvent'; diff --git a/packages/communication/src/messages/incoming/sound/JukeboxPlayListFullMessageEvent.ts b/packages/communication/src/messages/incoming/sound/JukeboxPlayListFullMessageEvent.ts new file mode 100644 index 0000000..7af71ef --- /dev/null +++ b/packages/communication/src/messages/incoming/sound/JukeboxPlayListFullMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { JukeboxPlayListFullMessageParser } from '../../parser'; + +export class JukeboxPlayListFullMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, JukeboxPlayListFullMessageParser); + } + + public getParser(): JukeboxPlayListFullMessageParser + { + return this.parser as JukeboxPlayListFullMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/sound/JukeboxSongDisksMessageEvent.ts b/packages/communication/src/messages/incoming/sound/JukeboxSongDisksMessageEvent.ts new file mode 100644 index 0000000..aff0703 --- /dev/null +++ b/packages/communication/src/messages/incoming/sound/JukeboxSongDisksMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { JukeboxSongDisksMessageParser } from '../../parser'; + +export class JukeboxSongDisksMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, JukeboxSongDisksMessageParser); + } + + public getParser(): JukeboxSongDisksMessageParser + { + return this.parser as JukeboxSongDisksMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/sound/NowPlayingMessageEvent.ts b/packages/communication/src/messages/incoming/sound/NowPlayingMessageEvent.ts new file mode 100644 index 0000000..4dd5a2d --- /dev/null +++ b/packages/communication/src/messages/incoming/sound/NowPlayingMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { NowPlayingMessageParser } from '../../parser'; + +export class NowPlayingMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, NowPlayingMessageParser); + } + + public getParser(): NowPlayingMessageParser + { + return this.parser as NowPlayingMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/sound/OfficialSongIdMessageEvent.ts b/packages/communication/src/messages/incoming/sound/OfficialSongIdMessageEvent.ts new file mode 100644 index 0000000..d57bd3b --- /dev/null +++ b/packages/communication/src/messages/incoming/sound/OfficialSongIdMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { OfficialSongIdMessageParser } from '../../parser'; + +export class OfficialSongIdMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, OfficialSongIdMessageParser); + } + + public getParser(): OfficialSongIdMessageParser + { + return this.parser as OfficialSongIdMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/sound/PlayListMessageEvent.ts b/packages/communication/src/messages/incoming/sound/PlayListMessageEvent.ts new file mode 100644 index 0000000..762d006 --- /dev/null +++ b/packages/communication/src/messages/incoming/sound/PlayListMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PlayListMessageParser } from '../../parser'; + +export class PlayListMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PlayListMessageParser); + } + + public getParser(): PlayListMessageParser + { + return this.parser as PlayListMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/sound/PlayListSongAddedMessageEvent.ts b/packages/communication/src/messages/incoming/sound/PlayListSongAddedMessageEvent.ts new file mode 100644 index 0000000..5d5f516 --- /dev/null +++ b/packages/communication/src/messages/incoming/sound/PlayListSongAddedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PlayListSongAddedMessageParser } from '../../parser'; + +export class PlayListSongAddedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PlayListSongAddedMessageParser); + } + + public getParser(): PlayListSongAddedMessageParser + { + return this.parser as PlayListSongAddedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/sound/TraxSongInfoMessageEvent.ts b/packages/communication/src/messages/incoming/sound/TraxSongInfoMessageEvent.ts new file mode 100644 index 0000000..7bf5d17 --- /dev/null +++ b/packages/communication/src/messages/incoming/sound/TraxSongInfoMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { TraxSongInfoMessageParser } from '../../parser'; + +export class TraxSongInfoMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, TraxSongInfoMessageParser); + } + + public getParser(): TraxSongInfoMessageParser + { + return this.parser as TraxSongInfoMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/sound/UserSongDisksInventoryMessageEvent.ts b/packages/communication/src/messages/incoming/sound/UserSongDisksInventoryMessageEvent.ts new file mode 100644 index 0000000..8e09055 --- /dev/null +++ b/packages/communication/src/messages/incoming/sound/UserSongDisksInventoryMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UserSongDisksInventoryMessageParser } from '../../parser'; + +export class UserSongDisksInventoryMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UserSongDisksInventoryMessageParser); + } + + public getParser(): UserSongDisksInventoryMessageParser + { + return this.parser as UserSongDisksInventoryMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/sound/index.ts b/packages/communication/src/messages/incoming/sound/index.ts new file mode 100644 index 0000000..24744f7 --- /dev/null +++ b/packages/communication/src/messages/incoming/sound/index.ts @@ -0,0 +1,8 @@ +export * from './JukeboxPlayListFullMessageEvent'; +export * from './JukeboxSongDisksMessageEvent'; +export * from './NowPlayingMessageEvent'; +export * from './OfficialSongIdMessageEvent'; +export * from './PlayListMessageEvent'; +export * from './PlayListSongAddedMessageEvent'; +export * from './TraxSongInfoMessageEvent'; +export * from './UserSongDisksInventoryMessageEvent'; diff --git a/packages/communication/src/messages/incoming/talent/TalentLevelUpEvent.ts b/packages/communication/src/messages/incoming/talent/TalentLevelUpEvent.ts new file mode 100644 index 0000000..07684b1 --- /dev/null +++ b/packages/communication/src/messages/incoming/talent/TalentLevelUpEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { TalentLevelUpMessageParser } from '../../parser'; + +export class TalentLevelUpEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, TalentLevelUpMessageParser); + } + + public getParser(): TalentLevelUpMessageParser + { + return this.parser as TalentLevelUpMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/talent/TalentTrackLevelMessageEvent.ts b/packages/communication/src/messages/incoming/talent/TalentTrackLevelMessageEvent.ts new file mode 100644 index 0000000..dbe59b4 --- /dev/null +++ b/packages/communication/src/messages/incoming/talent/TalentTrackLevelMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { TalentTrackLevelMessageParser } from '../../parser'; + +export class TalentTrackLevelMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, TalentTrackLevelMessageParser); + } + + public getParser(): TalentTrackLevelMessageParser + { + return this.parser as TalentTrackLevelMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/talent/TalentTrackMessageEvent.ts b/packages/communication/src/messages/incoming/talent/TalentTrackMessageEvent.ts new file mode 100644 index 0000000..05192bc --- /dev/null +++ b/packages/communication/src/messages/incoming/talent/TalentTrackMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { TalentTrackParser } from '../../parser'; + +export class TalentTrackMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, TalentTrackParser); + } + + public getParser(): TalentTrackParser + { + return this.parser as TalentTrackParser; + } +} diff --git a/packages/communication/src/messages/incoming/talent/index.ts b/packages/communication/src/messages/incoming/talent/index.ts new file mode 100644 index 0000000..a05161d --- /dev/null +++ b/packages/communication/src/messages/incoming/talent/index.ts @@ -0,0 +1,3 @@ +export * from './TalentLevelUpEvent'; +export * from './TalentTrackLevelMessageEvent'; +export * from './TalentTrackMessageEvent'; diff --git a/packages/communication/src/messages/incoming/user/AccountSafetyLockStatusChangeMessageEvent.ts b/packages/communication/src/messages/incoming/user/AccountSafetyLockStatusChangeMessageEvent.ts new file mode 100644 index 0000000..e62be5d --- /dev/null +++ b/packages/communication/src/messages/incoming/user/AccountSafetyLockStatusChangeMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { AccountSafetyLockStatusChangeParser } from '../../parser/user/AccountSafetyLockStatusChangeParser'; + +export class AccountSafetyLockStatusChangeMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, AccountSafetyLockStatusChangeParser); + } + + public getParser(): AccountSafetyLockStatusChangeParser + { + return this.parser as AccountSafetyLockStatusChangeParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/ApproveNameMessageEvent.ts b/packages/communication/src/messages/incoming/user/ApproveNameMessageEvent.ts new file mode 100644 index 0000000..17b4339 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/ApproveNameMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ApproveNameResultParser } from '../../parser'; + +export class ApproveNameMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ApproveNameResultParser); + } + + public getParser(): ApproveNameResultParser + { + return this.parser as ApproveNameResultParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/ChangeEmailResultEvent.ts b/packages/communication/src/messages/incoming/user/ChangeEmailResultEvent.ts new file mode 100644 index 0000000..1e5f589 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/ChangeEmailResultEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ChangeEmailResultParser } from '../../parser'; + +export class ChangeEmailResultEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ChangeEmailResultParser); + } + + public getParser(): ChangeEmailResultParser + { + return this.parser as ChangeEmailResultParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/EmailStatusResultEvent.ts b/packages/communication/src/messages/incoming/user/EmailStatusResultEvent.ts new file mode 100644 index 0000000..0b12f24 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/EmailStatusResultEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { EmailStatusParser } from '../../parser'; + +export class EmailStatusResultEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, EmailStatusParser); + } + + public getParser(): EmailStatusParser + { + return this.parser as EmailStatusParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/ExtendedProfileChangedMessageEvent.ts b/packages/communication/src/messages/incoming/user/ExtendedProfileChangedMessageEvent.ts new file mode 100644 index 0000000..cf0dc5f --- /dev/null +++ b/packages/communication/src/messages/incoming/user/ExtendedProfileChangedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ExtendedProfileChangedMessageParser } from '../../parser'; + +export class ExtendedProfileChangedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ExtendedProfileChangedMessageParser); + } + + public getParser(): ExtendedProfileChangedMessageParser + { + return this.parser as ExtendedProfileChangedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/GroupDetailsChangedMessageEvent.ts b/packages/communication/src/messages/incoming/user/GroupDetailsChangedMessageEvent.ts new file mode 100644 index 0000000..461c9c3 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/GroupDetailsChangedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GroupDetailsChangedMessageParser } from '../../parser'; + +export class GroupDetailsChangedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GroupDetailsChangedMessageParser); + } + + public getParser(): GroupDetailsChangedMessageParser + { + return this.parser as GroupDetailsChangedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/GroupMembershipRequestedMessageEvent.ts b/packages/communication/src/messages/incoming/user/GroupMembershipRequestedMessageEvent.ts new file mode 100644 index 0000000..649648a --- /dev/null +++ b/packages/communication/src/messages/incoming/user/GroupMembershipRequestedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GroupMembershipRequestedMessageParser } from '../../parser'; + +export class GroupMembershipRequestedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GroupMembershipRequestedMessageParser); + } + + public getParser(): GroupMembershipRequestedMessageParser + { + return this.parser as GroupMembershipRequestedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/GuildEditFailedMessageEvent.ts b/packages/communication/src/messages/incoming/user/GuildEditFailedMessageEvent.ts new file mode 100644 index 0000000..bdefae8 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/GuildEditFailedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GuildEditFailedMessageParser } from '../../parser'; + +export class GuildEditFailedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GuildEditFailedMessageParser); + } + + public getParser(): GuildEditFailedMessageParser + { + return this.parser as GuildEditFailedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/GuildMemberMgmtFailedMessageEvent.ts b/packages/communication/src/messages/incoming/user/GuildMemberMgmtFailedMessageEvent.ts new file mode 100644 index 0000000..d4f67a1 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/GuildMemberMgmtFailedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GuildMemberMgmtFailedMessageParser } from '../../parser'; + +export class GuildMemberMgmtFailedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GuildMemberMgmtFailedMessageParser); + } + + public getParser(): GuildMemberMgmtFailedMessageParser + { + return this.parser as GuildMemberMgmtFailedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/GuildMembershipsMessageEvent.ts b/packages/communication/src/messages/incoming/user/GuildMembershipsMessageEvent.ts new file mode 100644 index 0000000..7a9d4be --- /dev/null +++ b/packages/communication/src/messages/incoming/user/GuildMembershipsMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { GuildMembershipsMessageParser } from '../../parser'; + +export class GuildMembershipsMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, GuildMembershipsMessageParser); + } + + public getParser(): GuildMembershipsMessageParser + { + return this.parser as GuildMembershipsMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/HabboGroupBadgesMessageEvent.ts b/packages/communication/src/messages/incoming/user/HabboGroupBadgesMessageEvent.ts new file mode 100644 index 0000000..4138952 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/HabboGroupBadgesMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { HabboGroupBadgesMessageParser } from '../../parser'; + +export class HabboGroupBadgesMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, HabboGroupBadgesMessageParser); + } + + public getParser(): HabboGroupBadgesMessageParser + { + return this.parser as HabboGroupBadgesMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/HabboGroupJoinFailedMessageEvent.ts b/packages/communication/src/messages/incoming/user/HabboGroupJoinFailedMessageEvent.ts new file mode 100644 index 0000000..f2e0846 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/HabboGroupJoinFailedMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { HabboGroupJoinFailedMessageParser } from '../../parser'; + +export class HabboGroupJoinFailedMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, HabboGroupJoinFailedMessageParser); + } + + public getParser(): HabboGroupJoinFailedMessageParser + { + return this.parser as HabboGroupJoinFailedMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/IgnoreResultEvent.ts b/packages/communication/src/messages/incoming/user/IgnoreResultEvent.ts new file mode 100644 index 0000000..521cc3d --- /dev/null +++ b/packages/communication/src/messages/incoming/user/IgnoreResultEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { IgnoreResultParser } from '../../parser'; + +export class IgnoreResultEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, IgnoreResultParser); + } + + public getParser(): IgnoreResultParser + { + return this.parser as IgnoreResultParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/IgnoredUsersEvent.ts b/packages/communication/src/messages/incoming/user/IgnoredUsersEvent.ts new file mode 100644 index 0000000..9dd6f6a --- /dev/null +++ b/packages/communication/src/messages/incoming/user/IgnoredUsersEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { IgnoredUsersParser } from '../../parser'; + +export class IgnoredUsersEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, IgnoredUsersParser); + } + + public getParser(): IgnoredUsersParser + { + return this.parser as IgnoredUsersParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/InClientLinkEvent.ts b/packages/communication/src/messages/incoming/user/InClientLinkEvent.ts new file mode 100644 index 0000000..4e8798a --- /dev/null +++ b/packages/communication/src/messages/incoming/user/InClientLinkEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { InClientLinkParser } from '../../parser'; + +export class InClientLinkEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, InClientLinkParser); + } + + public getParser(): InClientLinkParser + { + return this.parser as InClientLinkParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/MemberData.ts b/packages/communication/src/messages/incoming/user/MemberData.ts new file mode 100644 index 0000000..ac60c0e --- /dev/null +++ b/packages/communication/src/messages/incoming/user/MemberData.ts @@ -0,0 +1,70 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class MemberData +{ + private static readonly TYPE_OWNER: number = 0; + private static readonly TYPE_ADMIN: number = 1; + private static readonly TYPE_PENDING: number = 2; + private static readonly TYPE_MEMBER: number = 3; + private static readonly TYPE_BLOCKED: number = 4; + + private _type: number; + private _userId: number; + private _userName: string; + private _figure: string; + private _memberSince: string; + + constructor(wrapper: IMessageDataWrapper) + { + this._type = wrapper.readInt(); + this._userId = wrapper.readInt(); + this._userName = wrapper.readString(); + this._figure = wrapper.readString(); + this._memberSince = wrapper.readString(); + } + + public get userId(): number + { + return this._userId; + } + + public get userName(): string + { + return this._userName; + } + + public get admin(): boolean + { + return this._type == MemberData.TYPE_ADMIN; + } + + public get owner(): boolean + { + return this._type == MemberData.TYPE_OWNER; + } + + public get pending(): boolean + { + return this._type == MemberData.TYPE_PENDING; + } + + public get member(): boolean + { + return this._type != MemberData.TYPE_MEMBER; + } + + public get blocked(): boolean + { + return this._type == MemberData.TYPE_BLOCKED; + } + + public get figure(): string + { + return this._figure; + } + + public get memberSince(): string + { + return this._memberSince; + } +} diff --git a/packages/communication/src/messages/incoming/user/PetRespectNoficationEvent.ts b/packages/communication/src/messages/incoming/user/PetRespectNoficationEvent.ts new file mode 100644 index 0000000..5e44b95 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/PetRespectNoficationEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PetRespectNotificationParser } from '../../parser'; + +export class PetRespectNoficationEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PetRespectNotificationParser); + } + + public getParser(): PetRespectNotificationParser + { + return this.parser as PetRespectNotificationParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/PetSupplementedNotificationEvent.ts b/packages/communication/src/messages/incoming/user/PetSupplementedNotificationEvent.ts new file mode 100644 index 0000000..9e9ff72 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/PetSupplementedNotificationEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { PetSupplementedNotificationParser } from '../../parser'; + +export class PetSupplementedNotificationEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, PetSupplementedNotificationParser); + } + + public getParser(): PetSupplementedNotificationParser + { + return this.parser as PetSupplementedNotificationParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/RespectReceivedEvent.ts b/packages/communication/src/messages/incoming/user/RespectReceivedEvent.ts new file mode 100644 index 0000000..3326ae6 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/RespectReceivedEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RespectReceivedParser } from '../../parser'; + +export class RespectReceivedEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RespectReceivedParser); + } + + public getParser(): RespectReceivedParser + { + return this.parser as RespectReceivedParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/ScrSendKickbackInfoMessageEvent.ts b/packages/communication/src/messages/incoming/user/ScrSendKickbackInfoMessageEvent.ts new file mode 100644 index 0000000..faabaf5 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/ScrSendKickbackInfoMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { ScrSendKickbackInfoMessageParser } from '../../parser'; + +export class ScrSendKickbackInfoMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, ScrSendKickbackInfoMessageParser); + } + + public getParser(): ScrSendKickbackInfoMessageParser + { + return this.parser as ScrSendKickbackInfoMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/WelcomeGiftChangeEmailResultEvent.ts b/packages/communication/src/messages/incoming/user/WelcomeGiftChangeEmailResultEvent.ts new file mode 100644 index 0000000..a2a56ff --- /dev/null +++ b/packages/communication/src/messages/incoming/user/WelcomeGiftChangeEmailResultEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { WelcomeGiftChangeEmailResultParser } from '../../parser'; + +export class WelcomeGiftChangeEmailResultEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, WelcomeGiftChangeEmailResultParser); + } + + public getParser(): WelcomeGiftChangeEmailResultParser + { + return this.parser as WelcomeGiftChangeEmailResultParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/access/UserPermissionsEvent.ts b/packages/communication/src/messages/incoming/user/access/UserPermissionsEvent.ts new file mode 100644 index 0000000..e5943c4 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/access/UserPermissionsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UserPermissionsParser } from '../../../parser'; + +export class UserPermissionsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UserPermissionsParser); + } + + public getParser(): UserPermissionsParser + { + return this.parser as UserPermissionsParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/access/index.ts b/packages/communication/src/messages/incoming/user/access/index.ts new file mode 100644 index 0000000..51901c3 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/access/index.ts @@ -0,0 +1 @@ +export * from './UserPermissionsEvent'; diff --git a/packages/communication/src/messages/incoming/user/data/RelationshipStatusInfoEvent.ts b/packages/communication/src/messages/incoming/user/data/RelationshipStatusInfoEvent.ts new file mode 100644 index 0000000..c9caba4 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/data/RelationshipStatusInfoEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { RelationshipStatusInfoMessageParser } from '../../../parser'; + +export class RelationshipStatusInfoEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, RelationshipStatusInfoMessageParser); + } + + public getParser(): RelationshipStatusInfoMessageParser + { + return this.parser as RelationshipStatusInfoMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/data/UserCurrentBadgesEvent.ts b/packages/communication/src/messages/incoming/user/data/UserCurrentBadgesEvent.ts new file mode 100644 index 0000000..600b808 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/data/UserCurrentBadgesEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UserCurrentBadgesParser } from '../../../parser'; + +export class UserCurrentBadgesEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UserCurrentBadgesParser); + } + + public getParser(): UserCurrentBadgesParser + { + return this.parser as UserCurrentBadgesParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/data/UserInfoEvent.ts b/packages/communication/src/messages/incoming/user/data/UserInfoEvent.ts new file mode 100644 index 0000000..3231671 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/data/UserInfoEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UserInfoParser } from '../../../parser'; + +export class UserInfoEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UserInfoParser); + } + + public getParser(): UserInfoParser + { + return this.parser as UserInfoParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/data/UserNameChangeMessageEvent.ts b/packages/communication/src/messages/incoming/user/data/UserNameChangeMessageEvent.ts new file mode 100644 index 0000000..f0cd532 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/data/UserNameChangeMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UserNameChangeMessageParser } from '../../../parser'; + +export class UserNameChangeMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UserNameChangeMessageParser); + } + + public getParser(): UserNameChangeMessageParser + { + return this.parser as UserNameChangeMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/data/UserProfileEvent.ts b/packages/communication/src/messages/incoming/user/data/UserProfileEvent.ts new file mode 100644 index 0000000..cc05661 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/data/UserProfileEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UserProfileParser } from '../../../parser'; + +export class UserProfileEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UserProfileParser); + } + + public getParser(): UserProfileParser + { + return this.parser as UserProfileParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/data/UserSettingsEvent.ts b/packages/communication/src/messages/incoming/user/data/UserSettingsEvent.ts new file mode 100644 index 0000000..e95508d --- /dev/null +++ b/packages/communication/src/messages/incoming/user/data/UserSettingsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UserSettingsParser } from '../../../parser'; + +export class UserSettingsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UserSettingsParser); + } + + public getParser(): UserSettingsParser + { + return this.parser as UserSettingsParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/data/UserTagsMessageEvent.ts b/packages/communication/src/messages/incoming/user/data/UserTagsMessageEvent.ts new file mode 100644 index 0000000..a556251 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/data/UserTagsMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UserTagsParser } from '../../../parser'; + +export class UserTagsMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UserTagsParser); + } + + public getParser(): UserTagsParser + { + return this.parser as UserTagsParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/data/index.ts b/packages/communication/src/messages/incoming/user/data/index.ts new file mode 100644 index 0000000..5994aa9 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/data/index.ts @@ -0,0 +1,7 @@ +export * from './RelationshipStatusInfoEvent'; +export * from './UserCurrentBadgesEvent'; +export * from './UserInfoEvent'; +export * from './UserNameChangeMessageEvent'; +export * from './UserProfileEvent'; +export * from './UserSettingsEvent'; +export * from './UserTagsMessageEvent'; diff --git a/packages/communication/src/messages/incoming/user/index.ts b/packages/communication/src/messages/incoming/user/index.ts new file mode 100644 index 0000000..f6f8642 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/index.ts @@ -0,0 +1,27 @@ +export * from './access'; +export * from './AccountSafetyLockStatusChangeMessageEvent'; +export * from './ApproveNameMessageEvent'; +export * from './ChangeEmailResultEvent'; +export * from './data'; +export * from './EmailStatusResultEvent'; +export * from './ExtendedProfileChangedMessageEvent'; +export * from './GroupDetailsChangedMessageEvent'; +export * from './GroupMembershipRequestedMessageEvent'; +export * from './GuildEditFailedMessageEvent'; +export * from './GuildMemberMgmtFailedMessageEvent'; +export * from './GuildMembershipsMessageEvent'; +export * from './HabboGroupBadgesMessageEvent'; +export * from './HabboGroupJoinFailedMessageEvent'; +export * from './IgnoredUsersEvent'; +export * from './IgnoreResultEvent'; +export * from './InClientLinkEvent'; +export * from './inventory'; +export * from './inventory/currency'; +export * from './inventory/subscription'; +export * from './MemberData'; +export * from './PetRespectNoficationEvent'; +export * from './PetSupplementedNotificationEvent'; +export * from './RespectReceivedEvent'; +export * from './ScrSendKickbackInfoMessageEvent'; +export * from './wardrobe'; +export * from './WelcomeGiftChangeEmailResultEvent'; diff --git a/packages/communication/src/messages/incoming/user/inventory/currency/UserCreditsEvent.ts b/packages/communication/src/messages/incoming/user/inventory/currency/UserCreditsEvent.ts new file mode 100644 index 0000000..4b3aa0d --- /dev/null +++ b/packages/communication/src/messages/incoming/user/inventory/currency/UserCreditsEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UserCreditsParser } from '../../../../parser'; + +export class UserCreditsEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UserCreditsParser); + } + + public getParser(): UserCreditsParser + { + return this.parser as UserCreditsParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/inventory/currency/UserCurrencyEvent.ts b/packages/communication/src/messages/incoming/user/inventory/currency/UserCurrencyEvent.ts new file mode 100644 index 0000000..402cbe6 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/inventory/currency/UserCurrencyEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UserCurrencyParser } from '../../../../parser'; + +export class UserCurrencyEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UserCurrencyParser); + } + + public getParser(): UserCurrencyParser + { + return this.parser as UserCurrencyParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/inventory/currency/index.ts b/packages/communication/src/messages/incoming/user/inventory/currency/index.ts new file mode 100644 index 0000000..f178ba7 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/inventory/currency/index.ts @@ -0,0 +1,2 @@ +export * from './UserCreditsEvent'; +export * from './UserCurrencyEvent'; diff --git a/packages/communication/src/messages/incoming/user/inventory/index.ts b/packages/communication/src/messages/incoming/user/inventory/index.ts new file mode 100644 index 0000000..e25bf08 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/inventory/index.ts @@ -0,0 +1,2 @@ +export * from './currency'; +export * from './subscription'; diff --git a/packages/communication/src/messages/incoming/user/inventory/subscription/UserSubscriptionEvent.ts b/packages/communication/src/messages/incoming/user/inventory/subscription/UserSubscriptionEvent.ts new file mode 100644 index 0000000..ae780cc --- /dev/null +++ b/packages/communication/src/messages/incoming/user/inventory/subscription/UserSubscriptionEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UserSubscriptionParser } from '../../../../parser'; + +export class UserSubscriptionEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UserSubscriptionParser); + } + + public getParser(): UserSubscriptionParser + { + return this.parser as UserSubscriptionParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/inventory/subscription/index.ts b/packages/communication/src/messages/incoming/user/inventory/subscription/index.ts new file mode 100644 index 0000000..3d8e4a1 --- /dev/null +++ b/packages/communication/src/messages/incoming/user/inventory/subscription/index.ts @@ -0,0 +1 @@ +export * from './UserSubscriptionEvent'; diff --git a/packages/communication/src/messages/incoming/user/wardrobe/UserWardrobePageEvent.ts b/packages/communication/src/messages/incoming/user/wardrobe/UserWardrobePageEvent.ts new file mode 100644 index 0000000..41b371b --- /dev/null +++ b/packages/communication/src/messages/incoming/user/wardrobe/UserWardrobePageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UserWardrobePageParser } from '../../../parser'; + +export class UserWardrobePageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UserWardrobePageParser); + } + + public getParser(): UserWardrobePageParser + { + return this.parser as UserWardrobePageParser; + } +} diff --git a/packages/communication/src/messages/incoming/user/wardrobe/index.ts b/packages/communication/src/messages/incoming/user/wardrobe/index.ts new file mode 100644 index 0000000..179e41c --- /dev/null +++ b/packages/communication/src/messages/incoming/user/wardrobe/index.ts @@ -0,0 +1 @@ +export * from './UserWardrobePageEvent'; diff --git a/packages/communication/src/messages/incoming/userclassification/UserClassificationMessageEvent.ts b/packages/communication/src/messages/incoming/userclassification/UserClassificationMessageEvent.ts new file mode 100644 index 0000000..41bc6db --- /dev/null +++ b/packages/communication/src/messages/incoming/userclassification/UserClassificationMessageEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { UserClassificationMessageParser } from '../../parser'; + +export class UserClassificationMessageEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, UserClassificationMessageParser); + } + + public getParser(): UserClassificationMessageParser + { + return this.parser as UserClassificationMessageParser; + } +} diff --git a/packages/communication/src/messages/incoming/userclassification/index.ts b/packages/communication/src/messages/incoming/userclassification/index.ts new file mode 100644 index 0000000..f56a235 --- /dev/null +++ b/packages/communication/src/messages/incoming/userclassification/index.ts @@ -0,0 +1 @@ +export * from './UserClassificationMessageEvent'; diff --git a/packages/communication/src/messages/index.ts b/packages/communication/src/messages/index.ts new file mode 100644 index 0000000..7b88840 --- /dev/null +++ b/packages/communication/src/messages/index.ts @@ -0,0 +1,4 @@ +export * from './MessageClassManager'; +export * from './incoming'; +export * from './outgoing'; +export * from './parser'; diff --git a/packages/communication/src/messages/outgoing/OutgoingHeader.ts b/packages/communication/src/messages/outgoing/OutgoingHeader.ts new file mode 100644 index 0000000..4917a51 --- /dev/null +++ b/packages/communication/src/messages/outgoing/OutgoingHeader.ts @@ -0,0 +1,471 @@ +export class OutgoingHeader +{ + public static ACHIEVEMENT_LIST = 219; + public static AUTHENTICATION = -1; + public static BOT_CONFIGURATION = 1986; + public static BOT_PICKUP = 3323; + public static BOT_PLACE = 1592; + public static BOT_SKILL_SAVE = 2624; + public static GET_CLUB_OFFERS = 3285; + public static GET_CLUB_GIFT_INFO = 487; + public static GET_CATALOG_INDEX = 1195; + public static GET_CATALOG_PAGE = 412; + public static CATALOG_PURCHASE = 3492; + public static CATALOG_PURCHASE_GIFT = 1411; + public static GET_PRODUCT_OFFER = 2594; + public static CLIENT_LATENCY = 295; + public static CLIENT_LATENCY_MEASURE = 96; + public static CLIENT_POLICY = 26979; + public static CLIENT_PONG = 2596; + public static CLIENT_TOOLBAR_TOGGLE = 2313; + public static CLIENT_VARIABLES = 1053; + public static GET_CURRENT_TIMING_CODE = 2912; + public static DESKTOP_NEWS = 1827; + public static DESKTOP_VIEW = 105; + public static GET_BUNDLE_DISCOUNT_RULESET = 223; + public static EVENT_TRACKER = 3457; + public static FIND_NEW_FRIENDS = 516; + public static FURNITURE_ALIASES = 3898; + public static FURNITURE_FLOOR_UPDATE = 248; + public static FURNITURE_MULTISTATE = 99; + public static FURNITURE_PICKUP = 3456; + public static FURNITURE_PLACE = 1258; + public static FURNITURE_POSTIT_PLACE = 2248; + public static FURNITURE_POSTIT_SAVE_STICKY_POLE = 3283; + public static FURNITURE_RANDOMSTATE = 3617; + public static FURNITURE_WALL_MULTISTATE = 210; + public static FURNITURE_WALL_UPDATE = 168; + public static GAMES_INIT = 2914; + public static GAMES_LIST = 741; + public static ACCEPTGAMEINVITE = 3802; + public static GAMEUNLOADEDMESSAGE = 3207; + public static GETGAMEACHIEVEMENTSMESSAGE = 2399; + public static GETGAMESTATUSMESSAGE = 3171; + public static GETUSERGAMEACHIEVEMENTSMESSAGE = 389; + public static JOINQUEUEMESSAGE = 1458; + public static LEAVEQUEUEMESSAGE = 2384; + public static RESETRESOLUTIONACHIEVEMENTMESSAGE = 3144; + public static GETWEEKLYGAMEREWARDWINNERS = 1054; + public static GAME2GETACCOUNTGAMESTATUSMESSAGE = 11; + public static GAME2CHECKGAMEDIRECTORYSTATUSMESSAGE = 3259; + public static GAME2EXITGAMEMESSAGE = 1445; + public static GAME2GAMECHATMESSAGE = 2502; + public static GAME2LOADSTAGEREADYMESSAGE = 2415; + public static GAME2PLAYAGAINMESSAGE = 3196; + public static GAME2REQUESTFULLSTATUSUPDATEMESSAGE = 1598; + public static GAME2GETWEEKLYFRIENDSLEADERBOARD = 1232; + public static GAME2GETWEEKLYLEADERBOARD = 2565; + public static GET_GIFT_WRAPPING_CONFIG = 418; + public static GROUP_ADMIN_ADD = 2894; + public static GROUP_ADMIN_REMOVE = 722; + public static GROUP_CREATE_OPTIONS = 798; + public static GROUP_FAVORITE = 3549; + public static GET_FORUM_STATS = 3149; + public static GET_FORUM_THREADS = 873; + public static GET_FORUMS_LIST = 436; + public static GET_FORUM_MESSAGES = 232; + public static GET_FORUM_THREAD = 3900; + public static GET_UNREAD_FORUMS_COUNT = 2908; + public static FORUM_MODERATE_MESSAGE = 286; + public static FORUM_MODERATE_THREAD = 1397; + public static FORUM_POST_MESSAGE = 3529; + public static UPDATE_FORUM_READ_MARKER = 1855; + public static UPDATE_FORUM_SETTINGS = 2214; + public static FORUM_UPDATE_THREAD = 3045; + public static GROUP_INFO = 2991; + public static GROUP_DELETE = 1134; + public static GROUP_MEMBER_REMOVE_CONFIRM = 3593; + public static GROUP_MEMBER_REMOVE = 593; + public static GROUP_MEMBERS = 312; + public static GROUP_MEMBERSHIPS = 367; + public static GROUP_REQUEST = 998; + public static GROUP_REQUEST_ACCEPT = 3386; + public static GROUP_REQUEST_DECLINE = 1894; + public static GROUP_SETTINGS = 1004; + public static GROUP_PARTS = 813; + public static GROUP_BUY = 230; + public static GROUP_SAVE_INFORMATION = 3137; + public static GROUP_SAVE_BADGE = 1991; + public static GROUP_SAVE_COLORS = 1764; + public static GROUP_SAVE_PREFERENCES = 3435; + public static GROUP_BADGES = 21; + public static GROUP_UNBLOCK_MEMBER = 2864; + public static GET_BADGE_POINTS_LIMITS = 1371; + public static REQUESTABADGE = 3077; + public static GETISBADGEREQUESTFULFILLED = 1364; + public static ITEM_CLOTHING_REDEEM = 3374; + public static ITEM_COLOR_WHEEL_CLICK = 2144; + public static ITEM_DICE_CLICK = 1990; + public static ITEM_DICE_CLOSE = 1533; + public static ITEM_DIMMER_SAVE = 1648; + public static ITEM_DIMMER_SETTINGS = 2813; + public static ITEM_DIMMER_TOGGLE = 2296; + public static ITEM_EXCHANGE_REDEEM = 3115; + public static ITEM_PAINT = 711; + public static SET_OBJECT_DATA = 3608; + public static ITEM_STACK_HELPER = 3839; + public static ITEM_WALL_CLICK = 210; + public static ITEM_WALL_UPDATE = 168; + public static MARKETPLACE_CONFIG = 2597; + public static ACCEPT_FRIEND = 137; + public static MESSENGER_CHAT = 3567; + public static DECLINE_FRIEND = 2890; + public static FOLLOW_FRIEND = 3997; + public static MESSENGER_FRIENDS = 1523; + public static MESSENGER_INIT = 2781; + public static MESSENGER_RELATIONSHIPS = 2138; + public static SET_RELATIONSHIP_STATUS = 3768; + public static REMOVE_FRIEND = 1689; + public static REQUEST_FRIEND = 3157; + public static GET_FRIEND_REQUESTS = 2448; + public static SEND_ROOM_INVITE = 1276; + public static HABBO_SEARCH = 1210; + public static FRIEND_LIST_UPDATE = 1419; + public static MOD_TOOL_USER_INFO = 3295; + public static GET_USER_FLAT_CATS = 3027; + public static NAVIGATOR_INIT = 2110; + public static NAVIGATOR_SEARCH = 249; + public static NAVIGATOR_SEARCH_CLOSE = 1834; + public static NAVIGATOR_SEARCH_OPEN = 637; + public static NAVIGATOR_SEARCH_SAVE = 2226; + public static GET_USER_EVENT_CATS = 1782; + public static NAVIGATOR_SETTINGS_SAVE = 3159; + public static NAVIGATOR_CATEGORY_LIST_MODE = 1202; + public static NAVIGATOR_DELETE_SAVED_SEARCH = 1954; + public static PET_INFO = 2934; + public static PET_PICKUP = 1581; + public static PET_PLACE = 2647; + public static PET_RESPECT = 3202; + public static PET_RIDE = 1036; + public static PET_MOVE = 3449; + public static PET_OPEN_PACKAGE = 3698; + public static PET_SELECTED = 549; + public static PETS_BREED = 1638; + public static PET_CANCEL_BREEDING = 2713; + public static PET_CONFIRM_BREEDING = 3382; + public static GET_PET_TRAINING_PANEL = 2161; + public static RECYCLER_PRIZES = 398; + public static RECYCLER_STATUS = 1342; + public static RECYCLER_ITEMS = 2771; + public static RELEASE_VERSION = 4000; + public static CALL_FOR_HELP = 1691; + public static ROOM_AMBASSADOR_ALERT = 2996; + public static ROOM_BAN_GIVE = 1477; + public static ROOM_BAN_LIST = 2267; + public static ROOM_BAN_REMOVE = 992; + public static ROOM_CREATE = 2752; + public static ROOM_DELETE = 532; + public static ROOM_DOORBELL = 1644; + public static ROOM_ENTER = 2312; + public static ROOM_FAVORITE = 3817; + public static ROOM_FAVORITE_REMOVE = 309; + public static CAN_CREATE_ROOM = 2128; + public static CANCEL_ROOM_EVENT = 2725; + public static EDIT_ROOM_EVENT = 3991; + public static COMPETITION_ROOM_SEARCH = 433; + public static FORWARD_TO_RANDOM_PROMOTED_ROOM = 10; + public static FORWARD_TO_SOME_ROOM = 1703; + public static GET_CATEGORIES_WITH_USER_COUNT = 3782; + public static GET_GUEST_ROOM = 2230; + public static GET_OFFICIAL_ROOMS = 1229; + public static GET_POPULAR_ROOM_TAGS = 826; + public static GUILD_BASE_SEARCH = 2930; + public static MY_FAVOURITE_ROOMS_SEARCH = 2578; + public static MY_FREQUENT_ROOM_HISTORY_SEARCH = 1002; + public static MY_FRIENDS_ROOM_SEARCH = 2266; + public static MY_GUILD_BASES_SEARCH = 39; + public static MY_RECOMMENDED_ROOMS = 2537; + public static MY_ROOM_HISTORY_SEARCH = 2264; + public static MY_ROOM_RIGHTS_SEARCH = 272; + public static MY_ROOMS_SEARCH = 2277; + public static POPULAR_ROOMS_SEARCH = 2758; + public static ROOM_AD_EVENT_TAB_CLICKED = 2412; + public static ROOM_AD_EVENT_TAB_VIEWED = 2668; + public static ROOM_AD_SEARCH = 2809; + public static ROOM_TEXT_SEARCH = 3943; + public static ROOMS_WHERE_MY_FRIENDS_ARE = 1786; + public static ROOMS_WITH_HIGHEST_SCORE_SEARCH = 2939; + public static SET_ROOM_SESSION_TAGS = 3305; + public static UPDATE_ROOM_THUMBNAIL = 2468; + public static ROOM_KICK = 1320; + public static ROOM_LIKE = 3582; + public static ROOM_MODEL = 2300; + public static GET_OCCUPIED_TILES = 1687; + public static GET_ROOM_ENTRY_TILE = 3559; + public static ROOM_MODEL_SAVE = 875; + public static ROOM_MUTE = 3637; + public static ROOM_MUTE_USER = 3485; + public static ROOM_RIGHTS_GIVE = 808; + public static ROOM_RIGHTS_LIST = 3385; + public static ROOM_RIGHTS_REMOVE = 2064; + public static ROOM_RIGHTS_REMOVE_ALL = 2683; + public static ROOM_RIGHTS_REMOVE_OWN = 3182; + public static ROOM_SETTINGS = 3129; + public static ROOM_SETTINGS_SAVE = 1969; + public static ROOM_SETTINGS_UPDATE_ROOM_CATEGORY_AND_TRADE = 1265; + public static ROOM_STAFF_PICK = 1918; + public static ROOM_FILTER_WORDS = 1911; + public static ROOM_FILTER_WORDS_MODIFY = 3001; + public static MYSTERYBOXWAITINGCANCELEDMESSAGE = 2012; + public static MYSTERYBOX_OPEN_TROPHY = 3074; + public static SECURITY_MACHINE = 2490; + public static SECURITY_TICKET = 2419; + public static TRADE = 1481; + public static TRADE_ACCEPT = 3863; + public static TRADE_CANCEL = 2341; + public static TRADE_CLOSE = 2551; + public static TRADE_CONFIRM = 2760; + public static TRADE_ITEM = 3107; + public static TRADE_ITEM_REMOVE = 3845; + public static TRADE_ITEMS = 1263; + public static TRADE_UNACCEPT = 1444; + public static UNIT_ACTION = 2456; + public static UNIT_CHAT = 1314; + public static UNIT_CHAT_SHOUT = 2085; + public static UNIT_CHAT_WHISPER = 1543; + public static UNIT_DANCE = 2080; + public static UNIT_DROP_HAND_ITEM = 2814; + public static UNIT_GIVE_HANDITEM = 2941; + public static UNIT_LOOK = 3301; + public static UNIT_POSTURE = 2235; + public static UNIT_SIGN = 1975; + public static UNIT_TYPING = 1597; + public static UNIT_TYPING_STOP = 1474; + public static UNIT_WALK = 3320; + public static USER_BADGES = 2769; + public static USER_BADGES_CURRENT = 2091; + public static USER_BADGES_CURRENT_UPDATE = 644; + public static USER_BOTS = 3848; + public static USER_CURRENCY = 273; + public static USER_EFFECT_ACTIVATE = 2959; + public static USER_EFFECT_ENABLE = 1752; + public static USER_FIGURE = 2730; + public static USER_FURNITURE = 3150; // sent when in room + public static REQUESTFURNIINVENTORYWHENNOTINROOM = 3500; // sent when not in room + public static USER_HOME_ROOM = 1740; + public static USER_INFO = 357; + public static USER_MOTTO = 2228; + public static USER_IGNORED = 3878; + public static USER_PETS = 3095; + public static USER_PROFILE = 3265; + public static USER_PROFILE_BY_NAME = 2249; + public static USER_RESPECT = 2694; + public static GET_SOUND_SETTINGS = 2388; + public static USER_SETTINGS_CAMERA = 1461; + public static USER_SETTINGS_CHAT_STYLE = 1030; + public static USER_SETTINGS_INVITES = 1086; + public static USER_SETTINGS_OLD_CHAT = 1262; + public static USER_SETTINGS_VOLUME = 1367; + public static USER_SUBSCRIPTION = 3166; + public static GET_WARDROBE = 2742; + public static SAVE_WARDROBE_OUTFIT = 800; + public static USER_TAGS = 17; + public static PEER_USERS_CLASSIFICATION = 1160; + public static USER_CLASSIFICATION = 2285; + public static VISIT_USER = 2970; + public static WIRED_ACTION_SAVE = 2281; + public static WIRED_APPLY_SNAPSHOT = 3373; + public static WIRED_CONDITION_SAVE = 3203; + public static WIRED_OPEN = 768; + public static WIRED_TRIGGER_SAVE = 1520; + public static GET_ITEM_DATA = 3964; + public static ONE_WAY_DOOR_CLICK = 2765; + public static REMOVE_WALL_ITEM = 3336; + public static SET_ITEM_DATA = 3666; + public static CATALOG_REDEEM_VOUCHER = 339; + public static ROOM_TONER_APPLY = 2880; + public static FRIEND_FURNI_CONFIRM_LOCK = 3775; + public static MANNEQUIN_SAVE_NAME = 2850; + public static MANNEQUIN_SAVE_LOOK = 2209; + public static PRESENT_OPEN_PRESENT = 3558; + public static CATALOG_SELECT_VIP_GIFT = 2276; + public static USER_IGNORE_ID = 3314; + public static USER_IGNORE = 1117; + public static USER_UNIGNORE = 2061; + public static MODTOOL_REQUEST_ROOM_INFO = 707; + public static MODTOOL_CHANGE_ROOM_SETTINGS = 3260; + public static MODTOOL_REQUEST_USER_CHATLOG = 1391; + public static MODTOOL_REQUEST_ROOM_CHATLOG = 2587; + public static MODTOOL_SANCTION_ALERT = 229; + public static MODTOOL_SANCTION_BAN = 2766; + public static MODTOOL_SANCTION_KICK = 2582; + public static MODTOOL_SANCTION_TRADELOCK = 3742; + public static MODTOOL_ALERTEVENT = 1840; + public static MODTOOL_SANCTION_MUTE = 1945; + public static MODTOOL_REQUEST_USER_ROOMS = 3526; + public static MODTOOL_ROOM_ALERT = 3842; + public static MODTOOL_PREFERENCES = 31; + public static CLOSE_ISSUE_DEFAULT_ACTION = 2717; + public static CLOSE_ISSUES = 2067; + public static DEFAULT_SANCTION = 1681; + public static GET_CFH_CHATLOG = 211; + public static MODTOOL_SANCTION = 1392; + public static PICK_ISSUES = 15; + public static RELEASE_ISSUES = 1572; + public static CONVERT_GLOBAL_ROOM_ID = 314; + public static REQUEST_SELL_ITEM = 848; + public static REQUEST_MARKETPLACE_ITEM_STATS = 3288; + public static MARKETPLACE_SELL_ITEM = 3447; + public static MARKETPLACE_REQUEST_OWN_ITEMS = 2105; + public static MARKETPLACE_TAKE_BACK_ITEM = 434; + public static MARKETPLACE_REDEEM_CREDITS = 2650; + public static MARKETPLACE_REQUEST_OFFERS = 2407; + public static MARKETPLACE_BUY_OFFER = 1603; + public static MARKETPLACE_BUY_TOKENS = 1866; + public static CATALOG_REQUESET_PET_BREEDS = 1756; + public static APPROVE_NAME = 2109; + public static UNIT_GIVE_HANDITEM_PET = 2768; + public static PET_MOUNT = 1036; + public static PET_SUPPLEMENT = 749; + public static FURNITURE_GROUP_INFO = 2651; + public static ACHIEVEMENT_RESOLUTION_OPEN = 359; + public static USE_PET_PRODUCT = 1328; + public static REMOVE_PET_SADDLE = 186; + public static TOGGLE_PET_RIDING = 1472; + public static TOGGLE_PET_BREEDING = 3379; + public static UNSEEN_RESET_CATEGORY = 3493; + public static UNSEEN_RESET_ITEMS = 2343; + public static COMMUNITY_GOAL_VOTE_COMPOSER = 3536; + public static GET_PROMO_ARTICLES = 1827; + public static ACCEPT_QUEST = 3604; + public static ACTIVATE_QUEST = 793; + public static CANCEL_QUEST = 3133; + public static FRIEND_REQUEST_QUEST_COMPLETE = 1148; + public static GET_COMMUNITY_GOAL_EARNED_PRIZES = 2688; + public static GET_COMMUNITY_GOAL_HALL_OF_FAME = 2167; + public static GET_COMMUNITY_GOAL_PROGRESS = 1145; + public static GET_CONCURRENT_USERS_GOAL_PROGRESS = 1343; + public static GET_CONCURRENT_USERS_REWARD = 3872; + public static GET_DAILY_QUEST = 2486; + public static GET_QUESTS = 3333; + public static GET_SEASONAL_QUESTS_ONLY = 1190; + public static OPEN_QUEST_TRACKER = 2750; + public static REDEEM_COMMUNITY_GOAL_PRIZE = 90; + public static REJECT_QUEST = 2397; + public static START_CAMPAIGN = 1697; + public static GET_BONUS_RARE_INFO = 957; + public static CRAFT = 3591; + public static CRAFT_SECRET = 1251; + public static GET_CRAFTABLE_PRODUCTS = 633; + public static GET_CRAFTING_RECIPE = 1173; + public static GET_CRAFTING_RECIPES_AVAILABLE = 3086; + public static PHOTO_COMPETITION = 3959; + public static PUBLISH_PHOTO = 2068; + public static PURCHASE_PHOTO = 2408; + public static RENDER_ROOM = 3226; + public static RENDER_ROOM_THUMBNAIL = 1982; + public static REQUEST_CAMERA_CONFIGURATION = 796; + public static ADD_JUKEBOX_DISK = 753; + public static GET_JUKEBOX_PLAYLIST = 1435; + public static GET_NOW_PLAYING = 1325; + public static GET_OFFICIAL_SONG_ID = 3189; + public static GET_SONG_INFO = 3082; + public static GET_SOUND_MACHINE_PLAYLIST = 3498; + public static GET_USER_SONG_DISKS = 2304; + public static REMOVE_JUKEBOX_DISK = 3050; + public static INTERSTITIAL_SHOWN = 1109; + public static GET_INTERSTITIAL = 2519; + public static CHANGE_USERNAME = 2977; + public static CHECK_USERNAME = 3950; + public static OPEN_CAMPAIGN_CALENDAR_DOOR_STAFF= 3889; + public static OPEN_CAMPAIGN_CALENDAR_DOOR = 2257; + public static BUILDERS_CLUB_PLACE_ROOM_ITEM = 1051; + public static BUILDERS_CLUB_PLACE_WALL_ITEM = 462; + public static BUILDERS_CLUB_QUERY_FURNI_COUNT = 2529; + public static GET_CATALOG_PAGE_EXPIRATION = 742; + public static GET_CATALOG_PAGE_WITH_EARLIEST_EXP = 3135; + public static GET_DIRECT_CLUB_BUY_AVAILABLE = 801; + public static GET_HABBO_BASIC_MEMBERSHIP_EXTEND_OFFER = 603; + public static GET_HABBO_CLUB_EXTEND_OFFER = 2462; + public static GET_IS_OFFER_GIFTABLE = 1347; + public static GET_LIMITED_OFFER_APPEARING_NEXT = 410; + public static GET_NEXT_TARGETED_OFFER = 596; + public static GET_ROOM_AD_PURCHASE_INFO = 1075; + public static GET_SEASONAL_CALENDAR_DAILY_OFFER = 3257; + public static GET_TARGETED_OFFER = 2487; + public static MARK_CATALOG_NEW_ADDITIONS_PAGE_OPENED = 2150; + public static PURCHASE_BASIC_MEMBERSHIP_EXTENSION = 2735; + public static PURCHASE_ROOM_AD = 777; + public static PURCHASE_TARGETED_OFFER = 1826; + public static PURCHASE_VIP_MEMBERSHIP_EXTENSION = 3407; + public static ROOM_AD_PURCHASE_INITIATED = 2283; + public static SET_TARGETTED_OFFER_STATE = 2041; + public static SHOP_TARGETED_OFFER_VIEWED = 3483; + public static HELPER_TALENT_TRACK = 196; + public static TALENT_TRACK_GET_LEVEL = 2127; + public static FORWARD_TO_A_COMPETITION_ROOM = 172; + public static FORWARD_TO_A_SUBMITTABLE_ROOM = 1450; + public static FORWARD_TO_RANDOM_COMPETITION_ROOM = 865; + public static GET_IS_USER_PART_OF_COMPETITION = 2077; + public static GET_SECONDS_UNTIL = 271; + public static ROOM_COMPETITION_INIT = 1334; + public static SUBMIT_ROOM_TO_COMPETITION = 2595; + public static VOTE_FOR_ROOM = 143; + public static GET_GIFT = 2436; + public static RESET_PHONE_NUMBER_STATE = 2741; + public static SET_PHONE_NUMBER_VERIFICATION_STATUS = 1379; + public static TRY_PHONE_NUMBER = 790; + public static VERIFY_CODE = 2721; + public static CONTROL_YOUTUBE_DISPLAY_PLAYBACK = 3005; + public static GET_YOUTUBE_DISPLAY_STATUS = 336; + public static SET_YOUTUBE_DISPLAY_PLAYLIST = 2069; + public static GO_TO_FLAT = 685; + public static CHANGE_QUEUE = 3093; + public static CALL_FOR_HELP_FROM_FORUM_MESSAGE = 1412; + public static CALL_FOR_HELP_FROM_FORUM_THREAD = 534; + public static CALL_FOR_HELP_FROM_IM = 2950; + public static CALL_FOR_HELP_FROM_PHOTO = 2492; + public static CALL_FOR_HELP_FROM_SELFIE = 2755; + public static CHAT_REVIEW_GUIDE_DECIDES = 3365; + public static CHAT_REVIEW_GUIDE_DETACHED = 2501; + public static CHAT_REVIEW_GUIDE_VOTE = 3961; + public static CHAT_REVIEW_SESSION_CREATE = 3060; + public static DELETE_PENDING_CALLS_FOR_HELP = 3605; + public static GET_CFH_STATUS = 2746; + public static GET_FAQ_CATEGORY = 3445; + public static GET_FAQ_TEXT = 1849; + public static GET_GUIDE_REPORTING_STATUS = 3786; + public static GET_PENDING_CALLS_FOR_HELP = 3267; + public static GET_QUIZ_QUESTIONS = 1296; + public static GUIDE_SESSION_CREATE = 3338; + public static GUIDE_SESSION_FEEDBACK = 477; + public static GUIDE_SESSION_GET_REQUESTER_ROOM = 1052; + public static GUIDE_SESSION_GUIDE_DECIDES = 1424; + public static GUIDE_SESSION_INVITE_REQUESTER = 234; + public static GUIDE_SESSION_IS_TYPING = 519; + public static GUIDE_SESSION_MESSAGE = 3899; + public static GUIDE_SESSION_ON_DUTY_UPDATE = 1922; + public static GUIDE_SESSION_REPORT = 3969; + public static GUIDE_SESSION_REQUESTER_CANCELS = 291; + public static GUIDE_SESSION_RESOLVED = 887; + public static POST_QUIZ_ANSWERS = 3720; + public static SEARCH_FAQS = 2031; + public static POLL_ANSWER = 3505; + public static POLL_REJECT = 1773; + public static POLL_START = 109; + public static POLL_VOTE_COUNTER = 6200; + public static DISCONNECT = 2445; + public static SCR_GET_KICKBACK_INFO = 869; + public static COMPOST_PLANT = 3835; + public static HARVEST_PET = 1521; + public static SET_CLOTHING_CHANGE_DATA = 924; + public static GROUP_UNFAVORITE = 1820; + public static NEW_USER_EXPERIENCE_GET_GIFTS = 1822; + public static NEW_USER_EXPERIENCE_SCRIPT_PROCEED = 1299; + public static HANDSHAKE_INIT_DIFFIE = 3110; + public static HANDSHAKE_COMPLETE_DIFFIE = 773; + public static WELCOME_OPEN_GIFT = 2638; + public static WELCOME_GIFT_CHANGE_EMAIL = 66; + public static EMAIL_GET_STATUS = 2557; + public static EMAIL_CHANGE = 3965; + public static APPROVE_ALL_MEMBERSHIP_REQUESTS = 882; + public static RENTABLE_SPACE_CANCEL_RENT = 1667; + public static RENTABLE_SPACE_RENT = 2946; + public static RENTABLE_SPACE_STATUS = 872; + public static TRACKING_PERFORMANCE_LOG = 3230; + public static TRACKING_LAG_WARNING_REPORT = 3847; + public static ROOM_DIRECTORY_ROOM_NETWORK_OPEN_CONNECTION = 3736; + public static RENTABLE_EXTEND_RENT_OR_BUYOUT_STRIP_ITEM = 2115; + public static RENTABLE_EXTEND_RENT_OR_BUYOUT_FURNI = 1071; + public static RENTABLE_GET_RENT_OR_BUYOUT_OFFER = 2518; +} diff --git a/packages/communication/src/messages/outgoing/advertisement/GetInterstitialMessageComposer.ts b/packages/communication/src/messages/outgoing/advertisement/GetInterstitialMessageComposer.ts new file mode 100644 index 0000000..187c2b7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/advertisement/GetInterstitialMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetInterstitialMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public dispose(): void + { + return; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/advertisement/InterstitialShownMessageComposer.ts b/packages/communication/src/messages/outgoing/advertisement/InterstitialShownMessageComposer.ts new file mode 100644 index 0000000..7af8212 --- /dev/null +++ b/packages/communication/src/messages/outgoing/advertisement/InterstitialShownMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class InterstitialShownMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public dispose(): void + { + return; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/advertisement/RequestAchievementsMessageComposer.ts b/packages/communication/src/messages/outgoing/advertisement/RequestAchievementsMessageComposer.ts new file mode 100644 index 0000000..a61513e --- /dev/null +++ b/packages/communication/src/messages/outgoing/advertisement/RequestAchievementsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RequestAchievementsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/advertisement/index.ts b/packages/communication/src/messages/outgoing/advertisement/index.ts new file mode 100644 index 0000000..20e10fa --- /dev/null +++ b/packages/communication/src/messages/outgoing/advertisement/index.ts @@ -0,0 +1,3 @@ +export * from './GetInterstitialMessageComposer'; +export * from './InterstitialShownMessageComposer'; +export * from './RequestAchievementsMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/avatar/ChangeUserNameMessageComposer.ts b/packages/communication/src/messages/outgoing/avatar/ChangeUserNameMessageComposer.ts new file mode 100644 index 0000000..c720e17 --- /dev/null +++ b/packages/communication/src/messages/outgoing/avatar/ChangeUserNameMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ChangeUserNameMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(name: string) + { + this._data = [name]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/avatar/CheckUserNameMessageComposer.ts b/packages/communication/src/messages/outgoing/avatar/CheckUserNameMessageComposer.ts new file mode 100644 index 0000000..05c0f99 --- /dev/null +++ b/packages/communication/src/messages/outgoing/avatar/CheckUserNameMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CheckUserNameMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(name: string) + { + this._data = [name]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/avatar/GetWardrobeMessageComposer.ts b/packages/communication/src/messages/outgoing/avatar/GetWardrobeMessageComposer.ts new file mode 100644 index 0000000..ff75801 --- /dev/null +++ b/packages/communication/src/messages/outgoing/avatar/GetWardrobeMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetWardrobeMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(pageId: number = 0) + { + this._data = [pageId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/avatar/SaveWardrobeOutfitMessageComposer.ts b/packages/communication/src/messages/outgoing/avatar/SaveWardrobeOutfitMessageComposer.ts new file mode 100644 index 0000000..0862e91 --- /dev/null +++ b/packages/communication/src/messages/outgoing/avatar/SaveWardrobeOutfitMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class SaveWardrobeOutfitMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(slotId: number, look: string, gender: string) + { + this._data = [slotId, look, gender]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/avatar/index.ts b/packages/communication/src/messages/outgoing/avatar/index.ts new file mode 100644 index 0000000..fc2f210 --- /dev/null +++ b/packages/communication/src/messages/outgoing/avatar/index.ts @@ -0,0 +1,4 @@ +export * from './ChangeUserNameMessageComposer'; +export * from './CheckUserNameMessageComposer'; +export * from './GetWardrobeMessageComposer'; +export * from './SaveWardrobeOutfitMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/camera/PhotoCompetitionMessageComposer.ts b/packages/communication/src/messages/outgoing/camera/PhotoCompetitionMessageComposer.ts new file mode 100644 index 0000000..edc6c36 --- /dev/null +++ b/packages/communication/src/messages/outgoing/camera/PhotoCompetitionMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PhotoCompetitionMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/camera/PublishPhotoMessageComposer.ts b/packages/communication/src/messages/outgoing/camera/PublishPhotoMessageComposer.ts new file mode 100644 index 0000000..3ba3789 --- /dev/null +++ b/packages/communication/src/messages/outgoing/camera/PublishPhotoMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PublishPhotoMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/camera/PurchasePhotoMessageComposer.ts b/packages/communication/src/messages/outgoing/camera/PurchasePhotoMessageComposer.ts new file mode 100644 index 0000000..6ee27d0 --- /dev/null +++ b/packages/communication/src/messages/outgoing/camera/PurchasePhotoMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PurchasePhotoMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(photoId: string) + { + this._data = [photoId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/camera/RenderRoomMessageComposer.ts b/packages/communication/src/messages/outgoing/camera/RenderRoomMessageComposer.ts new file mode 100644 index 0000000..cf4c3ac --- /dev/null +++ b/packages/communication/src/messages/outgoing/camera/RenderRoomMessageComposer.ts @@ -0,0 +1,43 @@ +import { IMessageComposer } from '@nitrots/api'; +import { TextureUtils } from '@nitrots/utils'; +import { RenderTexture } from 'pixi.js'; + +export class RenderRoomMessageComposer implements IMessageComposer> +{ + private _data: any; + + constructor(k: any = '', _arg_2: string = '', _arg_3: string = '', _arg_4: number = -1, _arg_5: number = -1) + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + this._data = []; + } + + public async assignBitmap(texture: RenderTexture): Promise + { + const url = await TextureUtils.generateImageUrl(texture); + + if(!url) return; + + const base64Data = url.split(',')[1]; + const binaryData = Uint8Array.from(atob(base64Data), c => c.charCodeAt(0)); + + this._data.push(binaryData.byteLength, binaryData.buffer); + } + + public assignBase64(base64: string): void + { + const base64Data = base64.split(',')[1]; + const binaryData = Uint8Array.from(atob(base64Data), c => c.charCodeAt(0)); + + this._data.push(binaryData.byteLength, binaryData.buffer); + } +} diff --git a/packages/communication/src/messages/outgoing/camera/RenderRoomThumbnailMessageComposer.ts b/packages/communication/src/messages/outgoing/camera/RenderRoomThumbnailMessageComposer.ts new file mode 100644 index 0000000..78a2bf4 --- /dev/null +++ b/packages/communication/src/messages/outgoing/camera/RenderRoomThumbnailMessageComposer.ts @@ -0,0 +1,9 @@ +import { RenderRoomMessageComposer } from './RenderRoomMessageComposer'; + +export class RenderRoomThumbnailMessageComposer extends RenderRoomMessageComposer +{ + constructor(k:any = '', _arg_2: string = '', _arg_3: string = '', _arg_4: number = -1, _arg_5: number = -1) + { + super(k, _arg_2, _arg_3, _arg_4, _arg_5); + } +} diff --git a/packages/communication/src/messages/outgoing/camera/RequestCameraConfigurationComposer.ts b/packages/communication/src/messages/outgoing/camera/RequestCameraConfigurationComposer.ts new file mode 100644 index 0000000..e845049 --- /dev/null +++ b/packages/communication/src/messages/outgoing/camera/RequestCameraConfigurationComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RequestCameraConfigurationComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/camera/index.ts b/packages/communication/src/messages/outgoing/camera/index.ts new file mode 100644 index 0000000..626c1cd --- /dev/null +++ b/packages/communication/src/messages/outgoing/camera/index.ts @@ -0,0 +1,6 @@ +export * from './PhotoCompetitionMessageComposer'; +export * from './PublishPhotoMessageComposer'; +export * from './PurchasePhotoMessageComposer'; +export * from './RenderRoomMessageComposer'; +export * from './RenderRoomThumbnailMessageComposer'; +export * from './RequestCameraConfigurationComposer'; diff --git a/packages/communication/src/messages/outgoing/campaign/OpenCampaignCalendarDoorAsStaffComposer.ts b/packages/communication/src/messages/outgoing/campaign/OpenCampaignCalendarDoorAsStaffComposer.ts new file mode 100644 index 0000000..d58a329 --- /dev/null +++ b/packages/communication/src/messages/outgoing/campaign/OpenCampaignCalendarDoorAsStaffComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class OpenCampaignCalendarDoorAsStaffComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string, _arg_2: number) + { + this._data = [k, _arg_2]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/campaign/OpenCampaignCalendarDoorComposer.ts b/packages/communication/src/messages/outgoing/campaign/OpenCampaignCalendarDoorComposer.ts new file mode 100644 index 0000000..27290a7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/campaign/OpenCampaignCalendarDoorComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class OpenCampaignCalendarDoorComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string, _arg_2: number) + { + this._data = [k, _arg_2]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/campaign/index.ts b/packages/communication/src/messages/outgoing/campaign/index.ts new file mode 100644 index 0000000..2ecdb09 --- /dev/null +++ b/packages/communication/src/messages/outgoing/campaign/index.ts @@ -0,0 +1,2 @@ +export * from './OpenCampaignCalendarDoorAsStaffComposer'; +export * from './OpenCampaignCalendarDoorComposer'; diff --git a/packages/communication/src/messages/outgoing/catalog/BuildersClubPlaceRoomItemMessageComposer.ts b/packages/communication/src/messages/outgoing/catalog/BuildersClubPlaceRoomItemMessageComposer.ts new file mode 100644 index 0000000..5ee050a --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/BuildersClubPlaceRoomItemMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class BuildersClubPlaceRoomItemMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number, _arg_3: string, _arg_4: number, _arg_5: number, _arg_6: number) + { + this._data = [k, _arg_2, _arg_3, _arg_4, _arg_5, _arg_6]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/BuildersClubPlaceWallItemMessageComposer.ts b/packages/communication/src/messages/outgoing/catalog/BuildersClubPlaceWallItemMessageComposer.ts new file mode 100644 index 0000000..85a560b --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/BuildersClubPlaceWallItemMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class BuildersClubPlaceWallItemMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number, _arg_3: string, _arg_4: string) + { + this._data = [k, _arg_2, _arg_3, _arg_4]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/BuildersClubQueryFurniCountMessageComposer.ts b/packages/communication/src/messages/outgoing/catalog/BuildersClubQueryFurniCountMessageComposer.ts new file mode 100644 index 0000000..6250ea9 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/BuildersClubQueryFurniCountMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class BuildersClubQueryFurniCountMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/GetBonusRareInfoMessageComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetBonusRareInfoMessageComposer.ts new file mode 100644 index 0000000..b95e3f3 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/GetBonusRareInfoMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetBonusRareInfoMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/GetBundleDiscountRulesetComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetBundleDiscountRulesetComposer.ts new file mode 100644 index 0000000..24e3564 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/GetBundleDiscountRulesetComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetBundleDiscountRulesetComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/GetCatalogIndexComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetCatalogIndexComposer.ts new file mode 100644 index 0000000..9fbc8f3 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/GetCatalogIndexComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetCatalogIndexComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(mode: string) + { + this._data = [mode]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/GetCatalogPageComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetCatalogPageComposer.ts new file mode 100644 index 0000000..0b174ea --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/GetCatalogPageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetCatalogPageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(pageId: number, offerId: number, catalogType: string) + { + this._data = [pageId, offerId, catalogType]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/GetCatalogPageExpirationComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetCatalogPageExpirationComposer.ts new file mode 100644 index 0000000..c55aa49 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/GetCatalogPageExpirationComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetCatalogPageExpirationComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/GetCatalogPageWithEarliestExpiryComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetCatalogPageWithEarliestExpiryComposer.ts new file mode 100644 index 0000000..9599381 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/GetCatalogPageWithEarliestExpiryComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetCatalogPageWithEarliestExpiryComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/GetClubGiftInfo.ts b/packages/communication/src/messages/outgoing/catalog/GetClubGiftInfo.ts new file mode 100644 index 0000000..ed23ada --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/GetClubGiftInfo.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetClubGiftInfo implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + this._data = null; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/GetClubOffersMessageComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetClubOffersMessageComposer.ts new file mode 100644 index 0000000..bd9bbf8 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/GetClubOffersMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetClubOffersMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(offerId: number) + { + this._data = [offerId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + this._data = null; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/GetDirectClubBuyAvailableComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetDirectClubBuyAvailableComposer.ts new file mode 100644 index 0000000..8b6ab07 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/GetDirectClubBuyAvailableComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetDirectClubBuyAvailableComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(days: number) + { + this._data = [days]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + this._data = null; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/GetGiftWrappingConfigurationComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetGiftWrappingConfigurationComposer.ts new file mode 100644 index 0000000..34e1dc1 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/GetGiftWrappingConfigurationComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetGiftWrappingConfigurationComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/GetHabboBasicMembershipExtendOfferComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetHabboBasicMembershipExtendOfferComposer.ts new file mode 100644 index 0000000..03611db --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/GetHabboBasicMembershipExtendOfferComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetHabboBasicMembershipExtendOfferComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + this._data = null; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/GetHabboClubExtendOfferMessageComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetHabboClubExtendOfferMessageComposer.ts new file mode 100644 index 0000000..ab895bc --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/GetHabboClubExtendOfferMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetHabboClubExtendOfferMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + this._data = null; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/GetIsOfferGiftableComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetIsOfferGiftableComposer.ts new file mode 100644 index 0000000..25ba416 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/GetIsOfferGiftableComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetIsOfferGiftableComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + this._data = null; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/GetLimitedOfferAppearingNextComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetLimitedOfferAppearingNextComposer.ts new file mode 100644 index 0000000..69ff44e --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/GetLimitedOfferAppearingNextComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetLimitedOfferAppearingNextComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + this._data = null; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/GetNextTargetedOfferComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetNextTargetedOfferComposer.ts new file mode 100644 index 0000000..5384330 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/GetNextTargetedOfferComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetNextTargetedOfferComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + this._data = null; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/GetProductOfferComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetProductOfferComposer.ts new file mode 100644 index 0000000..65ac19b --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/GetProductOfferComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetProductOfferComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(offerId: number) + { + this._data = [offerId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/GetRoomAdPurchaseInfoComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetRoomAdPurchaseInfoComposer.ts new file mode 100644 index 0000000..6f7d3f0 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/GetRoomAdPurchaseInfoComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetRoomAdPurchaseInfoComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + this._data = null; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/GetSeasonalCalendarDailyOfferComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetSeasonalCalendarDailyOfferComposer.ts new file mode 100644 index 0000000..3cff9bd --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/GetSeasonalCalendarDailyOfferComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetSeasonalCalendarDailyOfferComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + this._data = null; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/GetSellablePetPalettesComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetSellablePetPalettesComposer.ts new file mode 100644 index 0000000..7b00e14 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/GetSellablePetPalettesComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetSellablePetPalettesComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(name: string) + { + this._data = [name]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/GetTargetedOfferComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetTargetedOfferComposer.ts new file mode 100644 index 0000000..bb70069 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/GetTargetedOfferComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetTargetedOfferComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/MarkCatalogNewAdditionsPageOpenedComposer.ts b/packages/communication/src/messages/outgoing/catalog/MarkCatalogNewAdditionsPageOpenedComposer.ts new file mode 100644 index 0000000..0989a39 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/MarkCatalogNewAdditionsPageOpenedComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class MarkCatalogNewAdditionsPageOpenedComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/PurchaseBasicMembershipExtensionComposer.ts b/packages/communication/src/messages/outgoing/catalog/PurchaseBasicMembershipExtensionComposer.ts new file mode 100644 index 0000000..34249dd --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/PurchaseBasicMembershipExtensionComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PurchaseBasicMembershipExtensionComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + this._data = null; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/PurchaseFromCatalogAsGiftComposer.ts b/packages/communication/src/messages/outgoing/catalog/PurchaseFromCatalogAsGiftComposer.ts new file mode 100644 index 0000000..7471d73 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/PurchaseFromCatalogAsGiftComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PurchaseFromCatalogAsGiftComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(pageId: number, itemId: number, extraData: string, receivingName: string, giftMessage: string, spriteId: number, boxId: number, ribbonId: number, showMyFace: boolean) + { + this._data = [pageId, itemId, extraData, receivingName, giftMessage, spriteId, boxId, ribbonId, showMyFace]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/PurchaseFromCatalogComposer.ts b/packages/communication/src/messages/outgoing/catalog/PurchaseFromCatalogComposer.ts new file mode 100644 index 0000000..fcc916a --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/PurchaseFromCatalogComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PurchaseFromCatalogComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(pageId: number, offerId: number, extraData: string, amount: number) + { + this._data = [pageId, offerId, extraData, amount]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/PurchaseRoomAdMessageComposer.ts b/packages/communication/src/messages/outgoing/catalog/PurchaseRoomAdMessageComposer.ts new file mode 100644 index 0000000..7c9604e --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/PurchaseRoomAdMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PurchaseRoomAdMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number, _arg_3: number, _arg_4: string, _arg_5: boolean, _arg_6: string, _arg_7: number) + { + this._data = [k, _arg_2, _arg_3, _arg_4, _arg_5, _arg_6, _arg_7]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/PurchaseTargetedOfferComposer.ts b/packages/communication/src/messages/outgoing/catalog/PurchaseTargetedOfferComposer.ts new file mode 100644 index 0000000..15ec1a5 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/PurchaseTargetedOfferComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PurchaseTargetedOfferComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number) + { + this._data = [k, _arg_2]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/PurchaseVipMembershipExtensionComposer.ts b/packages/communication/src/messages/outgoing/catalog/PurchaseVipMembershipExtensionComposer.ts new file mode 100644 index 0000000..9160054 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/PurchaseVipMembershipExtensionComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PurchaseVipMembershipExtensionComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/RedeemVoucherMessageComposer.ts b/packages/communication/src/messages/outgoing/catalog/RedeemVoucherMessageComposer.ts new file mode 100644 index 0000000..5d4c373 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/RedeemVoucherMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RedeemVoucherMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(voucherCode: string) + { + this._data = [voucherCode]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/RoomAdPurchaseInitiatedComposer.ts b/packages/communication/src/messages/outgoing/catalog/RoomAdPurchaseInitiatedComposer.ts new file mode 100644 index 0000000..9753c7e --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/RoomAdPurchaseInitiatedComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomAdPurchaseInitiatedComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/SelectClubGiftComposer.ts b/packages/communication/src/messages/outgoing/catalog/SelectClubGiftComposer.ts new file mode 100644 index 0000000..4117956 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/SelectClubGiftComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class SelectClubGiftComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemName: string) + { + this._data = [itemName]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/SetTargetedOfferStateComposer.ts b/packages/communication/src/messages/outgoing/catalog/SetTargetedOfferStateComposer.ts new file mode 100644 index 0000000..511bf8a --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/SetTargetedOfferStateComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class SetTargetedOfferStateComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number) + { + this._data = [k, _arg_2]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/ShopTargetedOfferViewedComposer.ts b/packages/communication/src/messages/outgoing/catalog/ShopTargetedOfferViewedComposer.ts new file mode 100644 index 0000000..22079a8 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/ShopTargetedOfferViewedComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ShopTargetedOfferViewedComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number) + { + this._data = [k, _arg_2]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/catalog/index.ts b/packages/communication/src/messages/outgoing/catalog/index.ts new file mode 100644 index 0000000..c30e6e8 --- /dev/null +++ b/packages/communication/src/messages/outgoing/catalog/index.ts @@ -0,0 +1,35 @@ +export * from './BuildersClubPlaceRoomItemMessageComposer'; +export * from './BuildersClubPlaceWallItemMessageComposer'; +export * from './BuildersClubQueryFurniCountMessageComposer'; +export * from './GetBonusRareInfoMessageComposer'; +export * from './GetBundleDiscountRulesetComposer'; +export * from './GetCatalogIndexComposer'; +export * from './GetCatalogPageComposer'; +export * from './GetCatalogPageExpirationComposer'; +export * from './GetCatalogPageWithEarliestExpiryComposer'; +export * from './GetClubGiftInfo'; +export * from './GetClubOffersMessageComposer'; +export * from './GetDirectClubBuyAvailableComposer'; +export * from './GetGiftWrappingConfigurationComposer'; +export * from './GetHabboBasicMembershipExtendOfferComposer'; +export * from './GetHabboClubExtendOfferMessageComposer'; +export * from './GetIsOfferGiftableComposer'; +export * from './GetLimitedOfferAppearingNextComposer'; +export * from './GetNextTargetedOfferComposer'; +export * from './GetProductOfferComposer'; +export * from './GetRoomAdPurchaseInfoComposer'; +export * from './GetSeasonalCalendarDailyOfferComposer'; +export * from './GetSellablePetPalettesComposer'; +export * from './GetTargetedOfferComposer'; +export * from './MarkCatalogNewAdditionsPageOpenedComposer'; +export * from './PurchaseBasicMembershipExtensionComposer'; +export * from './PurchaseFromCatalogAsGiftComposer'; +export * from './PurchaseFromCatalogComposer'; +export * from './PurchaseRoomAdMessageComposer'; +export * from './PurchaseTargetedOfferComposer'; +export * from './PurchaseVipMembershipExtensionComposer'; +export * from './RedeemVoucherMessageComposer'; +export * from './RoomAdPurchaseInitiatedComposer'; +export * from './SelectClubGiftComposer'; +export * from './SetTargetedOfferStateComposer'; +export * from './ShopTargetedOfferViewedComposer'; diff --git a/packages/communication/src/messages/outgoing/competition/ForwardToACompetitionRoomMessageComposer.ts b/packages/communication/src/messages/outgoing/competition/ForwardToACompetitionRoomMessageComposer.ts new file mode 100644 index 0000000..cb60f62 --- /dev/null +++ b/packages/communication/src/messages/outgoing/competition/ForwardToACompetitionRoomMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ForwardToACompetitionRoomMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string, _arg_2: number) + { + this._data = [k, _arg_2]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/competition/ForwardToASubmittableRoomMessageComposer.ts b/packages/communication/src/messages/outgoing/competition/ForwardToASubmittableRoomMessageComposer.ts new file mode 100644 index 0000000..e216731 --- /dev/null +++ b/packages/communication/src/messages/outgoing/competition/ForwardToASubmittableRoomMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ForwardToASubmittableRoomMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/competition/ForwardToRandomCompetitionRoomMessageComposer.ts b/packages/communication/src/messages/outgoing/competition/ForwardToRandomCompetitionRoomMessageComposer.ts new file mode 100644 index 0000000..c5c087a --- /dev/null +++ b/packages/communication/src/messages/outgoing/competition/ForwardToRandomCompetitionRoomMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ForwardToRandomCompetitionRoomMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/competition/GetCurrentTimingCodeMessageComposer.ts b/packages/communication/src/messages/outgoing/competition/GetCurrentTimingCodeMessageComposer.ts new file mode 100644 index 0000000..d1033ab --- /dev/null +++ b/packages/communication/src/messages/outgoing/competition/GetCurrentTimingCodeMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetCurrentTimingCodeMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/competition/GetIsUserPartOfCompetitionMessageComposer.ts b/packages/communication/src/messages/outgoing/competition/GetIsUserPartOfCompetitionMessageComposer.ts new file mode 100644 index 0000000..6e669d5 --- /dev/null +++ b/packages/communication/src/messages/outgoing/competition/GetIsUserPartOfCompetitionMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetIsUserPartOfCompetitionMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/competition/GetSecondsUntilMessageComposer.ts b/packages/communication/src/messages/outgoing/competition/GetSecondsUntilMessageComposer.ts new file mode 100644 index 0000000..f99a04f --- /dev/null +++ b/packages/communication/src/messages/outgoing/competition/GetSecondsUntilMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetSecondsUntilMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/competition/RoomCompetitionInitMessageComposer.ts b/packages/communication/src/messages/outgoing/competition/RoomCompetitionInitMessageComposer.ts new file mode 100644 index 0000000..6e995d6 --- /dev/null +++ b/packages/communication/src/messages/outgoing/competition/RoomCompetitionInitMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomCompetitionInitMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/competition/SubmitRoomToCompetitionMessageComposer.ts b/packages/communication/src/messages/outgoing/competition/SubmitRoomToCompetitionMessageComposer.ts new file mode 100644 index 0000000..337b487 --- /dev/null +++ b/packages/communication/src/messages/outgoing/competition/SubmitRoomToCompetitionMessageComposer.ts @@ -0,0 +1,26 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class SubmitRoomToCompetitionMessageComposer implements IMessageComposer> +{ + public static readonly CONFIRM_LEVEL_NOT_ACCEPTED = 0; + public static readonly CONFIRM_LEVEL_NOT_SUBMITTED = 1; + public static readonly CONFIRM_LEVEL_NOT_CONFIRMED = 2; + public static readonly CONFIRM_LEVEL_COMMIT = 3; + + private _data: ConstructorParameters; + + constructor(k: string, _arg_2: number) + { + this._data = [k, _arg_2]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/competition/VoteForRoomMessageComposer.ts b/packages/communication/src/messages/outgoing/competition/VoteForRoomMessageComposer.ts new file mode 100644 index 0000000..683a017 --- /dev/null +++ b/packages/communication/src/messages/outgoing/competition/VoteForRoomMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class VoteForRoomMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/competition/index.ts b/packages/communication/src/messages/outgoing/competition/index.ts new file mode 100644 index 0000000..c99db8f --- /dev/null +++ b/packages/communication/src/messages/outgoing/competition/index.ts @@ -0,0 +1,9 @@ +export * from './ForwardToACompetitionRoomMessageComposer'; +export * from './ForwardToASubmittableRoomMessageComposer'; +export * from './ForwardToRandomCompetitionRoomMessageComposer'; +export * from './GetCurrentTimingCodeMessageComposer'; +export * from './GetIsUserPartOfCompetitionMessageComposer'; +export * from './GetSecondsUntilMessageComposer'; +export * from './RoomCompetitionInitMessageComposer'; +export * from './SubmitRoomToCompetitionMessageComposer'; +export * from './VoteForRoomMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/crafting/CraftComposer.ts b/packages/communication/src/messages/outgoing/crafting/CraftComposer.ts new file mode 100644 index 0000000..d70a478 --- /dev/null +++ b/packages/communication/src/messages/outgoing/crafting/CraftComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CraftComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: string) + { + this._data = [k, _arg_2]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/crafting/CraftSecretComposer.ts b/packages/communication/src/messages/outgoing/crafting/CraftSecretComposer.ts new file mode 100644 index 0000000..79929a7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/crafting/CraftSecretComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CraftSecretComposer implements IMessageComposer +{ + private _data: number[]; + + constructor(k: number, _arg_2: number[]) + { + this._data = [k, _arg_2.length].concat(_arg_2); + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/crafting/GetCraftableProductsComposer.ts b/packages/communication/src/messages/outgoing/crafting/GetCraftableProductsComposer.ts new file mode 100644 index 0000000..52feb40 --- /dev/null +++ b/packages/communication/src/messages/outgoing/crafting/GetCraftableProductsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetCraftableProductsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/crafting/GetCraftingRecipeComposer.ts b/packages/communication/src/messages/outgoing/crafting/GetCraftingRecipeComposer.ts new file mode 100644 index 0000000..dfcfd28 --- /dev/null +++ b/packages/communication/src/messages/outgoing/crafting/GetCraftingRecipeComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetCraftingRecipeComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/crafting/GetCraftingRecipesAvailableComposer.ts b/packages/communication/src/messages/outgoing/crafting/GetCraftingRecipesAvailableComposer.ts new file mode 100644 index 0000000..a6b94a8 --- /dev/null +++ b/packages/communication/src/messages/outgoing/crafting/GetCraftingRecipesAvailableComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetCraftingRecipesAvailableComposer implements IMessageComposer +{ + private _data: number[]; + + constructor(k: number, _arg_2: number[]) + { + this._data = [k, _arg_2.length].concat(_arg_2); + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/crafting/index.ts b/packages/communication/src/messages/outgoing/crafting/index.ts new file mode 100644 index 0000000..ab46a6d --- /dev/null +++ b/packages/communication/src/messages/outgoing/crafting/index.ts @@ -0,0 +1,5 @@ +export * from './CraftComposer'; +export * from './CraftSecretComposer'; +export * from './GetCraftableProductsComposer'; +export * from './GetCraftingRecipeComposer'; +export * from './GetCraftingRecipesAvailableComposer'; diff --git a/packages/communication/src/messages/outgoing/desktop/DesktopViewComposer.ts b/packages/communication/src/messages/outgoing/desktop/DesktopViewComposer.ts new file mode 100644 index 0000000..1c4bb8c --- /dev/null +++ b/packages/communication/src/messages/outgoing/desktop/DesktopViewComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class DesktopViewComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/desktop/index.ts b/packages/communication/src/messages/outgoing/desktop/index.ts new file mode 100644 index 0000000..af7fc6e --- /dev/null +++ b/packages/communication/src/messages/outgoing/desktop/index.ts @@ -0,0 +1 @@ +export * from './DesktopViewComposer'; diff --git a/packages/communication/src/messages/outgoing/friendfurni/FriendFurniConfirmLockMessageComposer.ts b/packages/communication/src/messages/outgoing/friendfurni/FriendFurniConfirmLockMessageComposer.ts new file mode 100644 index 0000000..95bdf69 --- /dev/null +++ b/packages/communication/src/messages/outgoing/friendfurni/FriendFurniConfirmLockMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FriendFurniConfirmLockMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number, confirmed: boolean) + { + this._data = [itemId, confirmed]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/friendfurni/index.ts b/packages/communication/src/messages/outgoing/friendfurni/index.ts new file mode 100644 index 0000000..545be87 --- /dev/null +++ b/packages/communication/src/messages/outgoing/friendfurni/index.ts @@ -0,0 +1 @@ +export * from './FriendFurniConfirmLockMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/friendlist/AcceptFriendMessageComposer.ts b/packages/communication/src/messages/outgoing/friendlist/AcceptFriendMessageComposer.ts new file mode 100644 index 0000000..b52d23b --- /dev/null +++ b/packages/communication/src/messages/outgoing/friendlist/AcceptFriendMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class AcceptFriendMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(...userIds: number[]) + { + this._data = [userIds.length, ...userIds]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/friendlist/DeclineFriendMessageComposer.ts b/packages/communication/src/messages/outgoing/friendlist/DeclineFriendMessageComposer.ts new file mode 100644 index 0000000..68c632e --- /dev/null +++ b/packages/communication/src/messages/outgoing/friendlist/DeclineFriendMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class DeclineFriendMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(removeAll: boolean, ...userIds: number[]) + { + this._data = [removeAll, userIds.length, ...userIds]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/friendlist/FindNewFriendsMessageComposer.ts b/packages/communication/src/messages/outgoing/friendlist/FindNewFriendsMessageComposer.ts new file mode 100644 index 0000000..d581512 --- /dev/null +++ b/packages/communication/src/messages/outgoing/friendlist/FindNewFriendsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FindNewFriendsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/friendlist/FollowFriendMessageComposer.ts b/packages/communication/src/messages/outgoing/friendlist/FollowFriendMessageComposer.ts new file mode 100644 index 0000000..47a2a58 --- /dev/null +++ b/packages/communication/src/messages/outgoing/friendlist/FollowFriendMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FollowFriendMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number) + { + this._data = [userId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/friendlist/FriendListUpdateComposer.ts b/packages/communication/src/messages/outgoing/friendlist/FriendListUpdateComposer.ts new file mode 100644 index 0000000..b8973fc --- /dev/null +++ b/packages/communication/src/messages/outgoing/friendlist/FriendListUpdateComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FriendListUpdateComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/friendlist/GetFriendRequestsComposer.ts b/packages/communication/src/messages/outgoing/friendlist/GetFriendRequestsComposer.ts new file mode 100644 index 0000000..b8bae25 --- /dev/null +++ b/packages/communication/src/messages/outgoing/friendlist/GetFriendRequestsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetFriendRequestsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/friendlist/HabboSearchComposer.ts b/packages/communication/src/messages/outgoing/friendlist/HabboSearchComposer.ts new file mode 100644 index 0000000..c770344 --- /dev/null +++ b/packages/communication/src/messages/outgoing/friendlist/HabboSearchComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HabboSearchComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(search: string) + { + this._data = [search]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/friendlist/MessengerInitComposer.ts b/packages/communication/src/messages/outgoing/friendlist/MessengerInitComposer.ts new file mode 100644 index 0000000..000ceac --- /dev/null +++ b/packages/communication/src/messages/outgoing/friendlist/MessengerInitComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class MessengerInitComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/friendlist/RemoveFriendComposer.ts b/packages/communication/src/messages/outgoing/friendlist/RemoveFriendComposer.ts new file mode 100644 index 0000000..ccdab6c --- /dev/null +++ b/packages/communication/src/messages/outgoing/friendlist/RemoveFriendComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RemoveFriendComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(...userIds: number[]) + { + this._data = [userIds.length, ...userIds]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/friendlist/RequestFriendComposer.ts b/packages/communication/src/messages/outgoing/friendlist/RequestFriendComposer.ts new file mode 100644 index 0000000..0b56bd6 --- /dev/null +++ b/packages/communication/src/messages/outgoing/friendlist/RequestFriendComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RequestFriendComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(username: string) + { + this._data = [username]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/friendlist/SendMessageComposer.ts b/packages/communication/src/messages/outgoing/friendlist/SendMessageComposer.ts new file mode 100644 index 0000000..1fce699 --- /dev/null +++ b/packages/communication/src/messages/outgoing/friendlist/SendMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class SendMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number, message: string) + { + this._data = [userId, message]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/friendlist/SendRoomInviteComposer.ts b/packages/communication/src/messages/outgoing/friendlist/SendRoomInviteComposer.ts new file mode 100644 index 0000000..3fe9d8d --- /dev/null +++ b/packages/communication/src/messages/outgoing/friendlist/SendRoomInviteComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class SendRoomInviteComposer implements IMessageComposer +{ + private _data: any; + + constructor(message: string, userIds: number[]) + { + this._data = [userIds.length, ...userIds, message]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/friendlist/SetRelationshipStatusComposer.ts b/packages/communication/src/messages/outgoing/friendlist/SetRelationshipStatusComposer.ts new file mode 100644 index 0000000..4a04c04 --- /dev/null +++ b/packages/communication/src/messages/outgoing/friendlist/SetRelationshipStatusComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class SetRelationshipStatusComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number, relationship: number) + { + this._data = [userId, relationship]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/friendlist/VisitUserComposer.ts b/packages/communication/src/messages/outgoing/friendlist/VisitUserComposer.ts new file mode 100644 index 0000000..ea53582 --- /dev/null +++ b/packages/communication/src/messages/outgoing/friendlist/VisitUserComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class VisitUserComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(username: string) + { + this._data = [username]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/friendlist/index.ts b/packages/communication/src/messages/outgoing/friendlist/index.ts new file mode 100644 index 0000000..501c3c9 --- /dev/null +++ b/packages/communication/src/messages/outgoing/friendlist/index.ts @@ -0,0 +1,14 @@ +export * from './AcceptFriendMessageComposer'; +export * from './DeclineFriendMessageComposer'; +export * from './FindNewFriendsMessageComposer'; +export * from './FollowFriendMessageComposer'; +export * from './FriendListUpdateComposer'; +export * from './GetFriendRequestsComposer'; +export * from './HabboSearchComposer'; +export * from './MessengerInitComposer'; +export * from './RemoveFriendComposer'; +export * from './RequestFriendComposer'; +export * from './SendMessageComposer'; +export * from './SendRoomInviteComposer'; +export * from './SetRelationshipStatusComposer'; +export * from './VisitUserComposer'; diff --git a/packages/communication/src/messages/outgoing/game/arena/Game2ExitGameMessageComposer.ts b/packages/communication/src/messages/outgoing/game/arena/Game2ExitGameMessageComposer.ts new file mode 100644 index 0000000..31885ac --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/arena/Game2ExitGameMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class Game2ExitGameMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(exitToRoomBeforeGame = true) + { + this._data = [ exitToRoomBeforeGame ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/game/arena/Game2GameChatMessageComposer.ts b/packages/communication/src/messages/outgoing/game/arena/Game2GameChatMessageComposer.ts new file mode 100644 index 0000000..9e3ee81 --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/arena/Game2GameChatMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class Game2GameChatMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(chatLine: string) + { + this._data = [ chatLine ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/game/arena/Game2LoadStageReadyMessageComposer.ts b/packages/communication/src/messages/outgoing/game/arena/Game2LoadStageReadyMessageComposer.ts new file mode 100644 index 0000000..61584c7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/arena/Game2LoadStageReadyMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class Game2LoadStageReadyMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [ k ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/game/arena/Game2PlayAgainMessageComposer.ts b/packages/communication/src/messages/outgoing/game/arena/Game2PlayAgainMessageComposer.ts new file mode 100644 index 0000000..2e537e5 --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/arena/Game2PlayAgainMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class Game2PlayAgainMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = [ ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/game/arena/index.ts b/packages/communication/src/messages/outgoing/game/arena/index.ts new file mode 100644 index 0000000..b13a00d --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/arena/index.ts @@ -0,0 +1,4 @@ +export * from './Game2ExitGameMessageComposer'; +export * from './Game2GameChatMessageComposer'; +export * from './Game2LoadStageReadyMessageComposer'; +export * from './Game2PlayAgainMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/game/directory/Game2CheckGameDirectoryStatusMessageComposer.ts b/packages/communication/src/messages/outgoing/game/directory/Game2CheckGameDirectoryStatusMessageComposer.ts new file mode 100644 index 0000000..66b2da9 --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/directory/Game2CheckGameDirectoryStatusMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class Game2CheckGameDirectoryStatusMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = [ ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/game/directory/Game2GetAccountGameStatusMessageComposer.ts b/packages/communication/src/messages/outgoing/game/directory/Game2GetAccountGameStatusMessageComposer.ts new file mode 100644 index 0000000..e850477 --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/directory/Game2GetAccountGameStatusMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class Game2GetAccountGameStatusMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [ k ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/game/directory/index.ts b/packages/communication/src/messages/outgoing/game/directory/index.ts new file mode 100644 index 0000000..9274423 --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/directory/index.ts @@ -0,0 +1,2 @@ +export * from './Game2CheckGameDirectoryStatusMessageComposer'; +export * from './Game2GetAccountGameStatusMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/game/index.ts b/packages/communication/src/messages/outgoing/game/index.ts new file mode 100644 index 0000000..af311fb --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/index.ts @@ -0,0 +1,5 @@ +export * from './arena'; +export * from './directory'; +export * from './ingame'; +export * from './lobby'; +export * from './score'; diff --git a/packages/communication/src/messages/outgoing/game/ingame/Game2RequestFullStatusUpdateMessageComposer.ts b/packages/communication/src/messages/outgoing/game/ingame/Game2RequestFullStatusUpdateMessageComposer.ts new file mode 100644 index 0000000..132e461 --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/ingame/Game2RequestFullStatusUpdateMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class Game2RequestFullStatusUpdateMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [ k ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/game/ingame/index.ts b/packages/communication/src/messages/outgoing/game/ingame/index.ts new file mode 100644 index 0000000..b406813 --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/ingame/index.ts @@ -0,0 +1 @@ +export * from './Game2RequestFullStatusUpdateMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/game/lobby/AcceptGameInviteMessageComposer.ts b/packages/communication/src/messages/outgoing/game/lobby/AcceptGameInviteMessageComposer.ts new file mode 100644 index 0000000..7ddab13 --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/lobby/AcceptGameInviteMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class AcceptGameInviteMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k:number, _arg_2:number) + { + this._data = [ k, _arg_2 ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/game/lobby/GameUnloadedMessageComposer.ts b/packages/communication/src/messages/outgoing/game/lobby/GameUnloadedMessageComposer.ts new file mode 100644 index 0000000..6631653 --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/lobby/GameUnloadedMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GameUnloadedMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [ k ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/game/lobby/GetGameAchievementsMessageComposer.ts b/packages/communication/src/messages/outgoing/game/lobby/GetGameAchievementsMessageComposer.ts new file mode 100644 index 0000000..a89303c --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/lobby/GetGameAchievementsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetGameAchievementsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = [ ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/game/lobby/GetGameListMessageComposer.ts b/packages/communication/src/messages/outgoing/game/lobby/GetGameListMessageComposer.ts new file mode 100644 index 0000000..671e88b --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/lobby/GetGameListMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetGameListMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = [ ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/game/lobby/GetGameStatusMessageComposer.ts b/packages/communication/src/messages/outgoing/game/lobby/GetGameStatusMessageComposer.ts new file mode 100644 index 0000000..465e212 --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/lobby/GetGameStatusMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetGameStatusMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [ k ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/game/lobby/GetResolutionAchievementsMessageComposer.ts b/packages/communication/src/messages/outgoing/game/lobby/GetResolutionAchievementsMessageComposer.ts new file mode 100644 index 0000000..c70d91e --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/lobby/GetResolutionAchievementsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetResolutionAchievementsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(objectId: number, achievementId: number) + { + this._data = [objectId, achievementId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/game/lobby/GetUserGameAchievementsMessageComposer.ts b/packages/communication/src/messages/outgoing/game/lobby/GetUserGameAchievementsMessageComposer.ts new file mode 100644 index 0000000..c721f13 --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/lobby/GetUserGameAchievementsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetUserGameAchievementsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [ k ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/game/lobby/JoinQueueMessageComposer.ts b/packages/communication/src/messages/outgoing/game/lobby/JoinQueueMessageComposer.ts new file mode 100644 index 0000000..e65dd6c --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/lobby/JoinQueueMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class JoinQueueMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [ k ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/game/lobby/LeaveQueueMessageComposer.ts b/packages/communication/src/messages/outgoing/game/lobby/LeaveQueueMessageComposer.ts new file mode 100644 index 0000000..5105a3e --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/lobby/LeaveQueueMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class LeaveQueueMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [ k ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/game/lobby/ResetResolutionAchievementMessageComposer.ts b/packages/communication/src/messages/outgoing/game/lobby/ResetResolutionAchievementMessageComposer.ts new file mode 100644 index 0000000..c28b61d --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/lobby/ResetResolutionAchievementMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ResetResolutionAchievementMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [ k ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/game/lobby/index.ts b/packages/communication/src/messages/outgoing/game/lobby/index.ts new file mode 100644 index 0000000..e6ed4d2 --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/lobby/index.ts @@ -0,0 +1,10 @@ +export * from './AcceptGameInviteMessageComposer'; +export * from './GameUnloadedMessageComposer'; +export * from './GetGameAchievementsMessageComposer'; +export * from './GetGameListMessageComposer'; +export * from './GetGameStatusMessageComposer'; +export * from './GetResolutionAchievementsMessageComposer'; +export * from './GetUserGameAchievementsMessageComposer'; +export * from './JoinQueueMessageComposer'; +export * from './LeaveQueueMessageComposer'; +export * from './ResetResolutionAchievementMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/game/score/Game2GetWeeklyFriendsLeaderboardComposer.ts b/packages/communication/src/messages/outgoing/game/score/Game2GetWeeklyFriendsLeaderboardComposer.ts new file mode 100644 index 0000000..a1f05ef --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/score/Game2GetWeeklyFriendsLeaderboardComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class Game2GetWeeklyFriendsLeaderboardComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k:number, _arg_2:number, _arg_3:number, _arg_4:number, _arg_5:number, _arg_6:number) + { + this._data = [ k, _arg_2, _arg_3, _arg_4, _arg_5, _arg_6 ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/game/score/Game2GetWeeklyLeaderboardComposer.ts b/packages/communication/src/messages/outgoing/game/score/Game2GetWeeklyLeaderboardComposer.ts new file mode 100644 index 0000000..d47fc11 --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/score/Game2GetWeeklyLeaderboardComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class Game2GetWeeklyLeaderboardComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k:number, _arg_2:number, _arg_3:number, _arg_4:number, _arg_5:number, _arg_6:number) + { + this._data = [ k, _arg_2, _arg_3, _arg_4, _arg_5, _arg_6 ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/game/score/GetWeeklyGameRewardComposer.ts b/packages/communication/src/messages/outgoing/game/score/GetWeeklyGameRewardComposer.ts new file mode 100644 index 0000000..eae9874 --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/score/GetWeeklyGameRewardComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetWeeklyGameRewardComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [ k ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/game/score/GetWeeklyGameRewardWinnersComposer.ts b/packages/communication/src/messages/outgoing/game/score/GetWeeklyGameRewardWinnersComposer.ts new file mode 100644 index 0000000..e604f42 --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/score/GetWeeklyGameRewardWinnersComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetWeeklyGameRewardWinnersComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [ k ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/game/score/index.ts b/packages/communication/src/messages/outgoing/game/score/index.ts new file mode 100644 index 0000000..96ea0b1 --- /dev/null +++ b/packages/communication/src/messages/outgoing/game/score/index.ts @@ -0,0 +1,4 @@ +export * from './Game2GetWeeklyFriendsLeaderboardComposer'; +export * from './Game2GetWeeklyLeaderboardComposer'; +export * from './GetWeeklyGameRewardComposer'; +export * from './GetWeeklyGameRewardWinnersComposer'; diff --git a/packages/communication/src/messages/outgoing/gifts/GetGiftMessageComposer.ts b/packages/communication/src/messages/outgoing/gifts/GetGiftMessageComposer.ts new file mode 100644 index 0000000..398a9e7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/gifts/GetGiftMessageComposer.ts @@ -0,0 +1,23 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetGiftMessageComposer implements IMessageComposer> +{ + public static readonly NO_ISSUE_ID = -1; + + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/gifts/ResetPhoneNumberStateMessageComposer.ts b/packages/communication/src/messages/outgoing/gifts/ResetPhoneNumberStateMessageComposer.ts new file mode 100644 index 0000000..0ffd305 --- /dev/null +++ b/packages/communication/src/messages/outgoing/gifts/ResetPhoneNumberStateMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ResetPhoneNumberStateMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/gifts/SetPhoneNumberVerificationStatusMessageComposer.ts b/packages/communication/src/messages/outgoing/gifts/SetPhoneNumberVerificationStatusMessageComposer.ts new file mode 100644 index 0000000..5842bfd --- /dev/null +++ b/packages/communication/src/messages/outgoing/gifts/SetPhoneNumberVerificationStatusMessageComposer.ts @@ -0,0 +1,23 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class SetPhoneNumberVerificationStatusMessageComposer implements IMessageComposer> +{ + public static readonly NO_ISSUE_ID = -1; + + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/gifts/TryPhoneNumberMessageComposer.ts b/packages/communication/src/messages/outgoing/gifts/TryPhoneNumberMessageComposer.ts new file mode 100644 index 0000000..94d7f62 --- /dev/null +++ b/packages/communication/src/messages/outgoing/gifts/TryPhoneNumberMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class TryPhoneNumberMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string, _arg_2: string) + { + this._data = [k, _arg_2]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/gifts/VerifyCodeMessageComposer.ts b/packages/communication/src/messages/outgoing/gifts/VerifyCodeMessageComposer.ts new file mode 100644 index 0000000..38ff10c --- /dev/null +++ b/packages/communication/src/messages/outgoing/gifts/VerifyCodeMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class VerifyCodeMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/gifts/index.ts b/packages/communication/src/messages/outgoing/gifts/index.ts new file mode 100644 index 0000000..daa097b --- /dev/null +++ b/packages/communication/src/messages/outgoing/gifts/index.ts @@ -0,0 +1,5 @@ +export * from './GetGiftMessageComposer'; +export * from './ResetPhoneNumberStateMessageComposer'; +export * from './SetPhoneNumberVerificationStatusMessageComposer'; +export * from './TryPhoneNumberMessageComposer'; +export * from './VerifyCodeMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/group/ApproveAllMembershipRequestsMessageComposer.ts b/packages/communication/src/messages/outgoing/group/ApproveAllMembershipRequestsMessageComposer.ts new file mode 100644 index 0000000..44f230e --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/ApproveAllMembershipRequestsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ApproveAllMembershipRequestsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(groupId: number) + { + this._data = [groupId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/GroupAdminGiveComposer.ts b/packages/communication/src/messages/outgoing/group/GroupAdminGiveComposer.ts new file mode 100644 index 0000000..881472e --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/GroupAdminGiveComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GroupAdminGiveComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(groupId: number, memberId: number) + { + this._data = [groupId, memberId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/GroupAdminTakeComposer.ts b/packages/communication/src/messages/outgoing/group/GroupAdminTakeComposer.ts new file mode 100644 index 0000000..0af0f2c --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/GroupAdminTakeComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GroupAdminTakeComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(groupId: number, memberId: number) + { + this._data = [groupId, memberId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/GroupBadgePartsComposer.ts b/packages/communication/src/messages/outgoing/group/GroupBadgePartsComposer.ts new file mode 100644 index 0000000..7291bb4 --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/GroupBadgePartsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GroupBadgePartsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/GroupBuyComposer.ts b/packages/communication/src/messages/outgoing/group/GroupBuyComposer.ts new file mode 100644 index 0000000..4a64015 --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/GroupBuyComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GroupBuyComposer implements IMessageComposer +{ + private _data: any[]; + + constructor(name: string, description: string, roomId: number, colorA: number, colorB: number, badge: number[]) + { + this._data = [name, description, roomId, colorA, colorB, badge.length, ...badge]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/GroupBuyDataComposer.ts b/packages/communication/src/messages/outgoing/group/GroupBuyDataComposer.ts new file mode 100644 index 0000000..3922458 --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/GroupBuyDataComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GroupBuyDataComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/GroupConfirmRemoveMemberComposer.ts b/packages/communication/src/messages/outgoing/group/GroupConfirmRemoveMemberComposer.ts new file mode 100644 index 0000000..ac57bdd --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/GroupConfirmRemoveMemberComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GroupConfirmRemoveMemberComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(groupId: number, memberId: number) + { + this._data = [groupId, memberId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/GroupDeleteComposer.ts b/packages/communication/src/messages/outgoing/group/GroupDeleteComposer.ts new file mode 100644 index 0000000..7c051ae --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/GroupDeleteComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GroupDeleteComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(groupId: number) + { + this._data = [groupId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/GroupFavoriteComposer.ts b/packages/communication/src/messages/outgoing/group/GroupFavoriteComposer.ts new file mode 100644 index 0000000..f875a24 --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/GroupFavoriteComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GroupFavoriteComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(groupId: number) + { + this._data = [groupId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/GroupInformationComposer.ts b/packages/communication/src/messages/outgoing/group/GroupInformationComposer.ts new file mode 100644 index 0000000..02940b3 --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/GroupInformationComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GroupInformationComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(groupId: number, flag: boolean) + { + this._data = [groupId, flag]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/GroupJoinComposer.ts b/packages/communication/src/messages/outgoing/group/GroupJoinComposer.ts new file mode 100644 index 0000000..0c970e0 --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/GroupJoinComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GroupJoinComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(groupId: number) + { + this._data = [groupId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/GroupMembersComposer.ts b/packages/communication/src/messages/outgoing/group/GroupMembersComposer.ts new file mode 100644 index 0000000..bed05fa --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/GroupMembersComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GroupMembersComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(groupId: number, pageId: number, query: string, levelId: number) + { + this._data = [groupId, pageId, query, levelId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/GroupMembershipAcceptComposer.ts b/packages/communication/src/messages/outgoing/group/GroupMembershipAcceptComposer.ts new file mode 100644 index 0000000..808064b --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/GroupMembershipAcceptComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GroupMembershipAcceptComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(groupId: number, memberId: number) + { + this._data = [groupId, memberId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/GroupMembershipDeclineComposer.ts b/packages/communication/src/messages/outgoing/group/GroupMembershipDeclineComposer.ts new file mode 100644 index 0000000..1f0e371 --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/GroupMembershipDeclineComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GroupMembershipDeclineComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(groupId: number, memberId: number) + { + this._data = [groupId, memberId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/GroupRemoveMemberComposer.ts b/packages/communication/src/messages/outgoing/group/GroupRemoveMemberComposer.ts new file mode 100644 index 0000000..7686efa --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/GroupRemoveMemberComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GroupRemoveMemberComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(groupId: number, memberId: number) + { + this._data = [groupId, memberId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/GroupSaveBadgeComposer.ts b/packages/communication/src/messages/outgoing/group/GroupSaveBadgeComposer.ts new file mode 100644 index 0000000..20f2fc7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/GroupSaveBadgeComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GroupSaveBadgeComposer implements IMessageComposer +{ + private _data: any[]; + + constructor(groupId: number, badge: number[]) + { + this._data = [groupId, badge.length, ...badge]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/GroupSaveColorsComposer.ts b/packages/communication/src/messages/outgoing/group/GroupSaveColorsComposer.ts new file mode 100644 index 0000000..9b04b9a --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/GroupSaveColorsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GroupSaveColorsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(groupId: number, colorA: number, colorB: number) + { + this._data = [groupId, colorA, colorB]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/GroupSaveInformationComposer.ts b/packages/communication/src/messages/outgoing/group/GroupSaveInformationComposer.ts new file mode 100644 index 0000000..c21a740 --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/GroupSaveInformationComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GroupSaveInformationComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(groupId: number, title: string, description: string) + { + this._data = [groupId, title, description]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/GroupSavePreferencesComposer.ts b/packages/communication/src/messages/outgoing/group/GroupSavePreferencesComposer.ts new file mode 100644 index 0000000..173102c --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/GroupSavePreferencesComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GroupSavePreferencesComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(groupId: number, state: number, onlyAdminCanDecorate: number) + { + this._data = [groupId, state, onlyAdminCanDecorate]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/GroupSettingsComposer.ts b/packages/communication/src/messages/outgoing/group/GroupSettingsComposer.ts new file mode 100644 index 0000000..bede058 --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/GroupSettingsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GroupSettingsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(groupId: number) + { + this._data = [groupId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/GroupUnfavoriteComposer.ts b/packages/communication/src/messages/outgoing/group/GroupUnfavoriteComposer.ts new file mode 100644 index 0000000..72177fd --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/GroupUnfavoriteComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GroupUnfavoriteComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(groupId: number) + { + this._data = [groupId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/group/index.ts b/packages/communication/src/messages/outgoing/group/index.ts new file mode 100644 index 0000000..d8c14a2 --- /dev/null +++ b/packages/communication/src/messages/outgoing/group/index.ts @@ -0,0 +1,21 @@ +export * from './ApproveAllMembershipRequestsMessageComposer'; +export * from './GroupAdminGiveComposer'; +export * from './GroupAdminTakeComposer'; +export * from './GroupBadgePartsComposer'; +export * from './GroupBuyComposer'; +export * from './GroupBuyDataComposer'; +export * from './GroupConfirmRemoveMemberComposer'; +export * from './GroupDeleteComposer'; +export * from './GroupFavoriteComposer'; +export * from './GroupInformationComposer'; +export * from './GroupJoinComposer'; +export * from './GroupMembersComposer'; +export * from './GroupMembershipAcceptComposer'; +export * from './GroupMembershipDeclineComposer'; +export * from './GroupRemoveMemberComposer'; +export * from './GroupSaveBadgeComposer'; +export * from './GroupSaveColorsComposer'; +export * from './GroupSaveInformationComposer'; +export * from './GroupSavePreferencesComposer'; +export * from './GroupSettingsComposer'; +export * from './GroupUnfavoriteComposer'; diff --git a/packages/communication/src/messages/outgoing/groupforums/GetForumStatsMessageComposer.ts b/packages/communication/src/messages/outgoing/groupforums/GetForumStatsMessageComposer.ts new file mode 100644 index 0000000..5e7daf6 --- /dev/null +++ b/packages/communication/src/messages/outgoing/groupforums/GetForumStatsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetForumStatsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/groupforums/GetForumsListMessageComposer.ts b/packages/communication/src/messages/outgoing/groupforums/GetForumsListMessageComposer.ts new file mode 100644 index 0000000..7df78d7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/groupforums/GetForumsListMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetForumsListMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number, _arg_3: number) + { + this._data = [k, _arg_2, _arg_3]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/groupforums/GetMessagesMessageComposer.ts b/packages/communication/src/messages/outgoing/groupforums/GetMessagesMessageComposer.ts new file mode 100644 index 0000000..b5f1dec --- /dev/null +++ b/packages/communication/src/messages/outgoing/groupforums/GetMessagesMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetMessagesMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number, _arg_3: number, _arg_4: number) + { + this._data = [k, _arg_2, _arg_3, _arg_4]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/groupforums/GetThreadMessageComposer.ts b/packages/communication/src/messages/outgoing/groupforums/GetThreadMessageComposer.ts new file mode 100644 index 0000000..5e5e507 --- /dev/null +++ b/packages/communication/src/messages/outgoing/groupforums/GetThreadMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetThreadMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number) + { + this._data = [k, _arg_2]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/groupforums/GetThreadsMessageComposer.ts b/packages/communication/src/messages/outgoing/groupforums/GetThreadsMessageComposer.ts new file mode 100644 index 0000000..54ff560 --- /dev/null +++ b/packages/communication/src/messages/outgoing/groupforums/GetThreadsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetThreadsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number, _arg_3: number) + { + this._data = [k, _arg_2, _arg_3]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/groupforums/GetUnreadForumsCountMessageComposer.ts b/packages/communication/src/messages/outgoing/groupforums/GetUnreadForumsCountMessageComposer.ts new file mode 100644 index 0000000..db41d8d --- /dev/null +++ b/packages/communication/src/messages/outgoing/groupforums/GetUnreadForumsCountMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetUnreadForumsCountMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/groupforums/ModerateMessageMessageComposer.ts b/packages/communication/src/messages/outgoing/groupforums/ModerateMessageMessageComposer.ts new file mode 100644 index 0000000..316bc25 --- /dev/null +++ b/packages/communication/src/messages/outgoing/groupforums/ModerateMessageMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ModerateMessageMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number, _arg_3: number, _arg_4: number) + { + this._data = [k, _arg_2, _arg_3, _arg_4]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/groupforums/ModerateThreadMessageComposer.ts b/packages/communication/src/messages/outgoing/groupforums/ModerateThreadMessageComposer.ts new file mode 100644 index 0000000..5fd5a4e --- /dev/null +++ b/packages/communication/src/messages/outgoing/groupforums/ModerateThreadMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ModerateThreadMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number, _arg_3: number) + { + this._data = [k, _arg_2, _arg_3]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/groupforums/PostMessageMessageComposer.ts b/packages/communication/src/messages/outgoing/groupforums/PostMessageMessageComposer.ts new file mode 100644 index 0000000..f358a08 --- /dev/null +++ b/packages/communication/src/messages/outgoing/groupforums/PostMessageMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PostMessageMessageComposer 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]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/groupforums/UpdateForumReadMarkerMessageComposer.ts b/packages/communication/src/messages/outgoing/groupforums/UpdateForumReadMarkerMessageComposer.ts new file mode 100644 index 0000000..e147dda --- /dev/null +++ b/packages/communication/src/messages/outgoing/groupforums/UpdateForumReadMarkerMessageComposer.ts @@ -0,0 +1,33 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UpdateForumReadMarkerMessageComposer implements IMessageComposer +{ + private _data: any; + + constructor(...data: UpdateForumReadMarkerEntry[]) + { + this._data = [data.length]; + data.forEach(entry => + { + this._data.push(entry.k); + this._data.push(entry._arg_2); + this._data.push(entry._arg_3); + }); + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} + +export class UpdateForumReadMarkerEntry +{ + constructor(public k: number, public _arg_2: number, public _arg_3: boolean) + { } +} diff --git a/packages/communication/src/messages/outgoing/groupforums/UpdateForumSettingsMessageComposer.ts b/packages/communication/src/messages/outgoing/groupforums/UpdateForumSettingsMessageComposer.ts new file mode 100644 index 0000000..48650bf --- /dev/null +++ b/packages/communication/src/messages/outgoing/groupforums/UpdateForumSettingsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UpdateForumSettingsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number, _arg_3: number, _arg_4: number, _arg_5: number) + { + this._data = [k, _arg_2, _arg_3, _arg_4, _arg_5]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/groupforums/UpdateThreadMessageComposer.ts b/packages/communication/src/messages/outgoing/groupforums/UpdateThreadMessageComposer.ts new file mode 100644 index 0000000..f1f5efa --- /dev/null +++ b/packages/communication/src/messages/outgoing/groupforums/UpdateThreadMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UpdateThreadMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number, _arg_3: boolean, _arg_4: boolean) + { + this._data = [k, _arg_2, _arg_4, _arg_3]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/groupforums/index.ts b/packages/communication/src/messages/outgoing/groupforums/index.ts new file mode 100644 index 0000000..fc1825b --- /dev/null +++ b/packages/communication/src/messages/outgoing/groupforums/index.ts @@ -0,0 +1,12 @@ +export * from './GetForumsListMessageComposer'; +export * from './GetForumStatsMessageComposer'; +export * from './GetMessagesMessageComposer'; +export * from './GetThreadMessageComposer'; +export * from './GetThreadsMessageComposer'; +export * from './GetUnreadForumsCountMessageComposer'; +export * from './ModerateMessageMessageComposer'; +export * from './ModerateThreadMessageComposer'; +export * from './PostMessageMessageComposer'; +export * from './UpdateForumReadMarkerMessageComposer'; +export * from './UpdateForumSettingsMessageComposer'; +export * from './UpdateThreadMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/handshake/AuthenticationMessageComposer.ts b/packages/communication/src/messages/outgoing/handshake/AuthenticationMessageComposer.ts new file mode 100644 index 0000000..0937096 --- /dev/null +++ b/packages/communication/src/messages/outgoing/handshake/AuthenticationMessageComposer.ts @@ -0,0 +1,32 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class AuthenticationMessageComposer implements IMessageComposer +{ + private _type: string; + private _data: string[]; + + constructor(type: string, keys: string[], values: string[]) + { + this._type = type; + + if(keys.length !== values.length) return; + + this._data = []; + + for(let i = 0; i < keys.length; i++) + { + this._data.push(keys[i]); + this._data.push(values[i]); + } + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/handshake/ClientHelloMessageComposer.ts b/packages/communication/src/messages/outgoing/handshake/ClientHelloMessageComposer.ts new file mode 100644 index 0000000..46b1ff1 --- /dev/null +++ b/packages/communication/src/messages/outgoing/handshake/ClientHelloMessageComposer.ts @@ -0,0 +1,22 @@ +import { ClientDeviceCategoryEnum, ClientPlatformEnum, IMessageComposer } from '@nitrots/api'; +import { NitroVersion } from '@nitrots/utils'; + +export class ClientHelloMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(releaseVersion: string, type: string, platform: number, category: number) + { + this._data = [`NITRO-${NitroVersion.RENDERER_VERSION.replaceAll('.', '-')}`, 'HTML5', ClientPlatformEnum.HTML5, ClientDeviceCategoryEnum.BROWSER]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/handshake/CompleteDiffieHandshakeMessageComposer.ts b/packages/communication/src/messages/outgoing/handshake/CompleteDiffieHandshakeMessageComposer.ts new file mode 100644 index 0000000..1b84fc7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/handshake/CompleteDiffieHandshakeMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CompleteDiffieHandshakeMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(publicKey: string) + { + this._data = [publicKey]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/handshake/DisconnectMessageComposer.ts b/packages/communication/src/messages/outgoing/handshake/DisconnectMessageComposer.ts new file mode 100644 index 0000000..dd1b6a4 --- /dev/null +++ b/packages/communication/src/messages/outgoing/handshake/DisconnectMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class DisconnectMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/handshake/InfoRetrieveMessageComposer.ts b/packages/communication/src/messages/outgoing/handshake/InfoRetrieveMessageComposer.ts new file mode 100644 index 0000000..68e79be --- /dev/null +++ b/packages/communication/src/messages/outgoing/handshake/InfoRetrieveMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class InfoRetrieveMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/handshake/InitDiffieHandshakeMessageComposer.ts b/packages/communication/src/messages/outgoing/handshake/InitDiffieHandshakeMessageComposer.ts new file mode 100644 index 0000000..58e7231 --- /dev/null +++ b/packages/communication/src/messages/outgoing/handshake/InitDiffieHandshakeMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class InitDiffieHandshakeMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/handshake/PongMessageComposer.ts b/packages/communication/src/messages/outgoing/handshake/PongMessageComposer.ts new file mode 100644 index 0000000..7508851 --- /dev/null +++ b/packages/communication/src/messages/outgoing/handshake/PongMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PongMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/handshake/SSOTicketMessageComposer.ts b/packages/communication/src/messages/outgoing/handshake/SSOTicketMessageComposer.ts new file mode 100644 index 0000000..0d6d8df --- /dev/null +++ b/packages/communication/src/messages/outgoing/handshake/SSOTicketMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class SSOTicketMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(ticket: string, time: number) + { + this._data = [ticket, time]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/handshake/UniqueIDMessageComposer.ts b/packages/communication/src/messages/outgoing/handshake/UniqueIDMessageComposer.ts new file mode 100644 index 0000000..4d9c5fb --- /dev/null +++ b/packages/communication/src/messages/outgoing/handshake/UniqueIDMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UniqueIDMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(machineId: string, fingerprint: string, flashVersion: string) + { + this._data = [machineId, fingerprint, flashVersion]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/handshake/VersionCheckMessageComposer.ts b/packages/communication/src/messages/outgoing/handshake/VersionCheckMessageComposer.ts new file mode 100644 index 0000000..8399469 --- /dev/null +++ b/packages/communication/src/messages/outgoing/handshake/VersionCheckMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class VersionCheckMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(clientID: number, clientURL: string, externalVariablesURL: string) + { + this._data = [clientID, clientURL, externalVariablesURL]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/handshake/index.ts b/packages/communication/src/messages/outgoing/handshake/index.ts new file mode 100644 index 0000000..4dc6ada --- /dev/null +++ b/packages/communication/src/messages/outgoing/handshake/index.ts @@ -0,0 +1,10 @@ +export * from './AuthenticationMessageComposer'; +export * from './ClientHelloMessageComposer'; +export * from './CompleteDiffieHandshakeMessageComposer'; +export * from './DisconnectMessageComposer'; +export * from './InfoRetrieveMessageComposer'; +export * from './InitDiffieHandshakeMessageComposer'; +export * from './PongMessageComposer'; +export * from './SSOTicketMessageComposer'; +export * from './UniqueIDMessageComposer'; +export * from './VersionCheckMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/help/CallForHelpFromForumMessageMessageComposer.ts b/packages/communication/src/messages/outgoing/help/CallForHelpFromForumMessageMessageComposer.ts new file mode 100644 index 0000000..3bb059e --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/CallForHelpFromForumMessageMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CallForHelpFromForumMessageMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number, _arg_3: number, _arg_4: number, _arg_5: string) + { + this._data = [k, _arg_2, _arg_3, _arg_4, _arg_5]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/CallForHelpFromForumThreadMessageComposer.ts b/packages/communication/src/messages/outgoing/help/CallForHelpFromForumThreadMessageComposer.ts new file mode 100644 index 0000000..f34441d --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/CallForHelpFromForumThreadMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CallForHelpFromForumThreadMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number, _arg_3: number, _arg_4: string) + { + this._data = [k, _arg_2, _arg_3, _arg_4]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/CallForHelpFromIMMessageComposer.ts b/packages/communication/src/messages/outgoing/help/CallForHelpFromIMMessageComposer.ts new file mode 100644 index 0000000..627635a --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/CallForHelpFromIMMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CallForHelpFromIMMessageComposer implements IMessageComposer +{ + private _data: any; + + constructor(message: string, topicId: number, reportedUserId: number, chatEntries: (string | number)[]) + { + this._data = [message, topicId, reportedUserId, chatEntries.length / 2, ...chatEntries]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/CallForHelpFromPhotoMessageComposer.ts b/packages/communication/src/messages/outgoing/help/CallForHelpFromPhotoMessageComposer.ts new file mode 100644 index 0000000..7069e1c --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/CallForHelpFromPhotoMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CallForHelpFromPhotoMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(extraData: string, roomId: number, reportedUserId: number, topicId: number, roomObjectId: number) + { + this._data = [extraData, roomId, reportedUserId, topicId, roomObjectId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/CallForHelpFromSelfieMessageComposer.ts b/packages/communication/src/messages/outgoing/help/CallForHelpFromSelfieMessageComposer.ts new file mode 100644 index 0000000..bf4997b --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/CallForHelpFromSelfieMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CallForHelpFromSelfieMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string, _arg_2: number, _arg_3: number, _arg_4: string, _arg_5: number) + { + this._data = [k, _arg_2, _arg_3, _arg_4, _arg_5]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/CallForHelpMessageComposer.ts b/packages/communication/src/messages/outgoing/help/CallForHelpMessageComposer.ts new file mode 100644 index 0000000..593237e --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/CallForHelpMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CallForHelpMessageComposer implements IMessageComposer +{ + private _data: any; + + constructor(message: string, topicIndex: number, reportedUserId: number, reportedRoomId: number, chatEntries: (string | number)[]) + { + this._data = [message, topicIndex, reportedUserId, reportedRoomId, chatEntries.length / 2, ...chatEntries]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/ChatReviewGuideDecidesOnOfferMessageComposer.ts b/packages/communication/src/messages/outgoing/help/ChatReviewGuideDecidesOnOfferMessageComposer.ts new file mode 100644 index 0000000..bddbe93 --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/ChatReviewGuideDecidesOnOfferMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ChatReviewGuideDecidesOnOfferMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: boolean) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/ChatReviewGuideDetachedMessageComposer.ts b/packages/communication/src/messages/outgoing/help/ChatReviewGuideDetachedMessageComposer.ts new file mode 100644 index 0000000..0968d67 --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/ChatReviewGuideDetachedMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ChatReviewGuideDetachedMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/ChatReviewGuideVoteMessageComposer.ts b/packages/communication/src/messages/outgoing/help/ChatReviewGuideVoteMessageComposer.ts new file mode 100644 index 0000000..4545f64 --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/ChatReviewGuideVoteMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ChatReviewGuideVoteMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/ChatReviewSessionCreateMessageComposer.ts b/packages/communication/src/messages/outgoing/help/ChatReviewSessionCreateMessageComposer.ts new file mode 100644 index 0000000..a7866b4 --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/ChatReviewSessionCreateMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ChatReviewSessionCreateMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number) + { + this._data = [k, _arg_2]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/DeletePendingCallsForHelpMessageComposer.ts b/packages/communication/src/messages/outgoing/help/DeletePendingCallsForHelpMessageComposer.ts new file mode 100644 index 0000000..7e0f157 --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/DeletePendingCallsForHelpMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class DeletePendingCallsForHelpMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/GetCfhStatusMessageComposer.ts b/packages/communication/src/messages/outgoing/help/GetCfhStatusMessageComposer.ts new file mode 100644 index 0000000..333f185 --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/GetCfhStatusMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetCfhStatusMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: boolean) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/GetFaqCategoryMessageComposer.ts b/packages/communication/src/messages/outgoing/help/GetFaqCategoryMessageComposer.ts new file mode 100644 index 0000000..f00f066 --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/GetFaqCategoryMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetFaqCategoryMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(categoryId: number) + { + this._data = [categoryId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/GetFaqTextMessageComposer.ts b/packages/communication/src/messages/outgoing/help/GetFaqTextMessageComposer.ts new file mode 100644 index 0000000..4ebad2b --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/GetFaqTextMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetFaqTextMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(questionId: number) + { + this._data = [questionId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/GetGuideReportingStatusMessageComposer.ts b/packages/communication/src/messages/outgoing/help/GetGuideReportingStatusMessageComposer.ts new file mode 100644 index 0000000..6ba0f17 --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/GetGuideReportingStatusMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetGuideReportingStatusMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/GetPendingCallsForHelpMessageComposer.ts b/packages/communication/src/messages/outgoing/help/GetPendingCallsForHelpMessageComposer.ts new file mode 100644 index 0000000..574863d --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/GetPendingCallsForHelpMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetPendingCallsForHelpMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/GetQuizQuestionsComposer.ts b/packages/communication/src/messages/outgoing/help/GetQuizQuestionsComposer.ts new file mode 100644 index 0000000..b893303 --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/GetQuizQuestionsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetQuizQuestionsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/GuideSessionCreateMessageComposer.ts b/packages/communication/src/messages/outgoing/help/GuideSessionCreateMessageComposer.ts new file mode 100644 index 0000000..f006273 --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/GuideSessionCreateMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GuideSessionCreateMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: string) + { + this._data = [k, _arg_2]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/GuideSessionFeedbackMessageComposer.ts b/packages/communication/src/messages/outgoing/help/GuideSessionFeedbackMessageComposer.ts new file mode 100644 index 0000000..040c7de --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/GuideSessionFeedbackMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GuideSessionFeedbackMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: boolean) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/GuideSessionGetRequesterRoomMessageComposer.ts b/packages/communication/src/messages/outgoing/help/GuideSessionGetRequesterRoomMessageComposer.ts new file mode 100644 index 0000000..888d1ff --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/GuideSessionGetRequesterRoomMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GuideSessionGetRequesterRoomMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/GuideSessionGuideDecidesMessageComposer.ts b/packages/communication/src/messages/outgoing/help/GuideSessionGuideDecidesMessageComposer.ts new file mode 100644 index 0000000..caa6647 --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/GuideSessionGuideDecidesMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GuideSessionGuideDecidesMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: boolean) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/GuideSessionInviteRequesterMessageComposer.ts b/packages/communication/src/messages/outgoing/help/GuideSessionInviteRequesterMessageComposer.ts new file mode 100644 index 0000000..68628a2 --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/GuideSessionInviteRequesterMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GuideSessionInviteRequesterMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/GuideSessionIsTypingMessageComposer.ts b/packages/communication/src/messages/outgoing/help/GuideSessionIsTypingMessageComposer.ts new file mode 100644 index 0000000..05de66f --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/GuideSessionIsTypingMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GuideSessionIsTypingMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: boolean) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/GuideSessionMessageMessageComposer.ts b/packages/communication/src/messages/outgoing/help/GuideSessionMessageMessageComposer.ts new file mode 100644 index 0000000..6d1dee9 --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/GuideSessionMessageMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GuideSessionMessageMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/GuideSessionOnDutyUpdateMessageComposer.ts b/packages/communication/src/messages/outgoing/help/GuideSessionOnDutyUpdateMessageComposer.ts new file mode 100644 index 0000000..2b2ec78 --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/GuideSessionOnDutyUpdateMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GuideSessionOnDutyUpdateMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: boolean, _arg_2: boolean, _arg_3: boolean, _arg_4: boolean) + { + this._data = [k, _arg_2, _arg_3, _arg_4]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/GuideSessionReportMessageComposer.ts b/packages/communication/src/messages/outgoing/help/GuideSessionReportMessageComposer.ts new file mode 100644 index 0000000..ffb4c7a --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/GuideSessionReportMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GuideSessionReportMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/GuideSessionRequesterCancelsMessageComposer.ts b/packages/communication/src/messages/outgoing/help/GuideSessionRequesterCancelsMessageComposer.ts new file mode 100644 index 0000000..4a60b4c --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/GuideSessionRequesterCancelsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GuideSessionRequesterCancelsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/GuideSessionResolvedMessageComposer.ts b/packages/communication/src/messages/outgoing/help/GuideSessionResolvedMessageComposer.ts new file mode 100644 index 0000000..1164847 --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/GuideSessionResolvedMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GuideSessionResolvedMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/PostQuizAnswersComposer.ts b/packages/communication/src/messages/outgoing/help/PostQuizAnswersComposer.ts new file mode 100644 index 0000000..341984f --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/PostQuizAnswersComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PostQuizAnswersComposer implements IMessageComposer +{ + private _data: any; + + constructor(quizCode: string, answerIds: number[]) + { + this._data = [quizCode, answerIds.length, ...answerIds]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/SearchFaqsMessageComposer.ts b/packages/communication/src/messages/outgoing/help/SearchFaqsMessageComposer.ts new file mode 100644 index 0000000..82f5073 --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/SearchFaqsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class SearchFaqsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/help/index.ts b/packages/communication/src/messages/outgoing/help/index.ts new file mode 100644 index 0000000..9824e8c --- /dev/null +++ b/packages/communication/src/messages/outgoing/help/index.ts @@ -0,0 +1,30 @@ +export * from './CallForHelpFromForumMessageMessageComposer'; +export * from './CallForHelpFromForumThreadMessageComposer'; +export * from './CallForHelpFromIMMessageComposer'; +export * from './CallForHelpFromPhotoMessageComposer'; +export * from './CallForHelpFromSelfieMessageComposer'; +export * from './CallForHelpMessageComposer'; +export * from './ChatReviewGuideDecidesOnOfferMessageComposer'; +export * from './ChatReviewGuideDetachedMessageComposer'; +export * from './ChatReviewGuideVoteMessageComposer'; +export * from './ChatReviewSessionCreateMessageComposer'; +export * from './DeletePendingCallsForHelpMessageComposer'; +export * from './GetCfhStatusMessageComposer'; +export * from './GetFaqCategoryMessageComposer'; +export * from './GetFaqTextMessageComposer'; +export * from './GetGuideReportingStatusMessageComposer'; +export * from './GetPendingCallsForHelpMessageComposer'; +export * from './GetQuizQuestionsComposer'; +export * from './GuideSessionCreateMessageComposer'; +export * from './GuideSessionFeedbackMessageComposer'; +export * from './GuideSessionGetRequesterRoomMessageComposer'; +export * from './GuideSessionGuideDecidesMessageComposer'; +export * from './GuideSessionInviteRequesterMessageComposer'; +export * from './GuideSessionIsTypingMessageComposer'; +export * from './GuideSessionMessageMessageComposer'; +export * from './GuideSessionOnDutyUpdateMessageComposer'; +export * from './GuideSessionReportMessageComposer'; +export * from './GuideSessionRequesterCancelsMessageComposer'; +export * from './GuideSessionResolvedMessageComposer'; +export * from './PostQuizAnswersComposer'; +export * from './SearchFaqsMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/index.ts b/packages/communication/src/messages/outgoing/index.ts new file mode 100644 index 0000000..4e36160 --- /dev/null +++ b/packages/communication/src/messages/outgoing/index.ts @@ -0,0 +1,74 @@ +export * from './OutgoingHeader'; +export * from './advertisement'; +export * from './avatar'; +export * from './camera'; +export * from './campaign'; +export * from './catalog'; +export * from './competition'; +export * from './crafting'; +export * from './desktop'; +export * from './friendfurni'; +export * from './friendlist'; +export * from './game'; +export * from './game/arena'; +export * from './game/directory'; +export * from './game/ingame'; +export * from './game/lobby'; +export * from './game/score'; +export * from './gifts'; +export * from './group'; +export * from './groupforums'; +export * from './handshake'; +export * from './help'; +export * from './inventory'; +export * from './inventory/avatareffect'; +export * from './inventory/badges'; +export * from './inventory/bots'; +export * from './inventory/furni'; +export * from './inventory/pets'; +export * from './inventory/trading'; +export * from './inventory/unseen'; +export * from './landingview'; +export * from './landingview/votes'; +export * from './marketplace'; +export * from './moderation'; +export * from './mysterybox'; +export * from './navigator'; +export * from './nux'; +export * from './pet'; +export * from './poll'; +export * from './quest'; +export * from './recycler'; +export * from './room'; +export * from './room/access'; +export * from './room/action'; +export * from './room/bots'; +export * from './room/data'; +export * from './room/engine'; +export * from './room/furniture'; +export * from './room/furniture/dimmer'; +export * from './room/furniture/floor'; +export * from './room/furniture/logic'; +export * from './room/furniture/mannequin'; +export * from './room/furniture/presents'; +export * from './room/furniture/toner'; +export * from './room/furniture/wall'; +export * from './room/furniture/youtube'; +export * from './room/layout'; +export * from './room/pets'; +export * from './room/session'; +export * from './room/unit'; +export * from './room/unit/chat'; +export * from './roomdirectory'; +export * from './roomevents'; +export * from './roomsettings'; +export * from './sound'; +export * from './talent'; +export * from './tracking'; +export * from './user'; +export * from './user/data'; +export * from './user/inventory'; +export * from './user/inventory/currency'; +export * from './user/inventory/subscription'; +export * from './user/settings'; +export * from './userclassification'; diff --git a/packages/communication/src/messages/outgoing/inventory/avatareffect/AvatarEffectActivatedComposer.ts b/packages/communication/src/messages/outgoing/inventory/avatareffect/AvatarEffectActivatedComposer.ts new file mode 100644 index 0000000..d4f6f54 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/avatareffect/AvatarEffectActivatedComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class AvatarEffectActivatedComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(type: number) + { + this._data = [ type ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/avatareffect/AvatarEffectSelectedComposer.ts b/packages/communication/src/messages/outgoing/inventory/avatareffect/AvatarEffectSelectedComposer.ts new file mode 100644 index 0000000..40dd157 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/avatareffect/AvatarEffectSelectedComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class AvatarEffectSelectedComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(type: number) + { + this._data = [ type ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/avatareffect/index.ts b/packages/communication/src/messages/outgoing/inventory/avatareffect/index.ts new file mode 100644 index 0000000..f03f144 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/avatareffect/index.ts @@ -0,0 +1,2 @@ +export * from './AvatarEffectActivatedComposer'; +export * from './AvatarEffectSelectedComposer'; diff --git a/packages/communication/src/messages/outgoing/inventory/badges/GetBadgePointLimitsComposer.ts b/packages/communication/src/messages/outgoing/inventory/badges/GetBadgePointLimitsComposer.ts new file mode 100644 index 0000000..0fc527b --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/badges/GetBadgePointLimitsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetBadgePointLimitsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = [ ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/badges/GetIsBadgeRequestFulfilledComposer.ts b/packages/communication/src/messages/outgoing/inventory/badges/GetIsBadgeRequestFulfilledComposer.ts new file mode 100644 index 0000000..348a890 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/badges/GetIsBadgeRequestFulfilledComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetIsBadgeRequestFulfilledComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string) + { + this._data = [ k ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/badges/RequestABadgeComposer.ts b/packages/communication/src/messages/outgoing/inventory/badges/RequestABadgeComposer.ts new file mode 100644 index 0000000..cac7185 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/badges/RequestABadgeComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RequestABadgeComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(requestCode: string) + { + this._data = [ requestCode ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/badges/RequestBadgesComposer.ts b/packages/communication/src/messages/outgoing/inventory/badges/RequestBadgesComposer.ts new file mode 100644 index 0000000..1d5de2a --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/badges/RequestBadgesComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RequestBadgesComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/badges/SetActivatedBadgesComposer.ts b/packages/communication/src/messages/outgoing/inventory/badges/SetActivatedBadgesComposer.ts new file mode 100644 index 0000000..7c91be5 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/badges/SetActivatedBadgesComposer.ts @@ -0,0 +1,29 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class SetActivatedBadgesComposer implements IMessageComposer +{ + private _badges: string[] = []; + + public getMessageArray() + { + const data = []; + + for(let i = 1; i <= this._badges.length; i++) + { + data.push(i); + data.push(this._badges[i - 1]); + } + + return data; + } + + public dispose(): void + { + return; + } + + public addActivatedBadge(badge: string): void + { + this._badges.push(badge); + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/badges/index.ts b/packages/communication/src/messages/outgoing/inventory/badges/index.ts new file mode 100644 index 0000000..a29bc57 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/badges/index.ts @@ -0,0 +1,5 @@ +export * from './GetBadgePointLimitsComposer'; +export * from './GetIsBadgeRequestFulfilledComposer'; +export * from './RequestABadgeComposer'; +export * from './RequestBadgesComposer'; +export * from './SetActivatedBadgesComposer'; diff --git a/packages/communication/src/messages/outgoing/inventory/bots/GetBotInventoryComposer.ts b/packages/communication/src/messages/outgoing/inventory/bots/GetBotInventoryComposer.ts new file mode 100644 index 0000000..28fd50d --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/bots/GetBotInventoryComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetBotInventoryComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/bots/index.ts b/packages/communication/src/messages/outgoing/inventory/bots/index.ts new file mode 100644 index 0000000..bab9f59 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/bots/index.ts @@ -0,0 +1 @@ +export * from './GetBotInventoryComposer'; diff --git a/packages/communication/src/messages/outgoing/inventory/furni/FurnitureListComposer.ts b/packages/communication/src/messages/outgoing/inventory/furni/FurnitureListComposer.ts new file mode 100644 index 0000000..81e5d9e --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/furni/FurnitureListComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FurnitureListComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/furni/RequestFurniInventoryWhenNotInRoomComposer.ts b/packages/communication/src/messages/outgoing/inventory/furni/RequestFurniInventoryWhenNotInRoomComposer.ts new file mode 100644 index 0000000..8360547 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/furni/RequestFurniInventoryWhenNotInRoomComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RequestFurniInventoryWhenNotInRoomComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/furni/index.ts b/packages/communication/src/messages/outgoing/inventory/furni/index.ts new file mode 100644 index 0000000..9e0a8f7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/furni/index.ts @@ -0,0 +1,2 @@ +export * from './FurnitureListComposer'; +export * from './RequestFurniInventoryWhenNotInRoomComposer'; diff --git a/packages/communication/src/messages/outgoing/inventory/index.ts b/packages/communication/src/messages/outgoing/inventory/index.ts new file mode 100644 index 0000000..4fc8506 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/index.ts @@ -0,0 +1,7 @@ +export * from './avatareffect'; +export * from './badges'; +export * from './bots'; +export * from './furni'; +export * from './pets'; +export * from './trading'; +export * from './unseen'; diff --git a/packages/communication/src/messages/outgoing/inventory/pets/CancelPetBreedingComposer.ts b/packages/communication/src/messages/outgoing/inventory/pets/CancelPetBreedingComposer.ts new file mode 100644 index 0000000..c23c971 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/pets/CancelPetBreedingComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CancelPetBreedingComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number) + { + this._data = [itemId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/pets/ConfirmPetBreedingComposer.ts b/packages/communication/src/messages/outgoing/inventory/pets/ConfirmPetBreedingComposer.ts new file mode 100644 index 0000000..aeb4275 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/pets/ConfirmPetBreedingComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ConfirmPetBreedingComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number, name: string, petOneId: number, petTwoId: number) + { + this._data = [itemId, name, petOneId, petTwoId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/pets/RequestPetsComposer.ts b/packages/communication/src/messages/outgoing/inventory/pets/RequestPetsComposer.ts new file mode 100644 index 0000000..e3fafdf --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/pets/RequestPetsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RequestPetsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/pets/index.ts b/packages/communication/src/messages/outgoing/inventory/pets/index.ts new file mode 100644 index 0000000..af32d91 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/pets/index.ts @@ -0,0 +1,3 @@ +export * from './CancelPetBreedingComposer'; +export * from './ConfirmPetBreedingComposer'; +export * from './RequestPetsComposer'; diff --git a/packages/communication/src/messages/outgoing/inventory/trading/TradingAcceptComposer.ts b/packages/communication/src/messages/outgoing/inventory/trading/TradingAcceptComposer.ts new file mode 100644 index 0000000..05a3daa --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/trading/TradingAcceptComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class TradingAcceptComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/trading/TradingCancelComposer.ts b/packages/communication/src/messages/outgoing/inventory/trading/TradingCancelComposer.ts new file mode 100644 index 0000000..facdde3 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/trading/TradingCancelComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class TradingCancelComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/trading/TradingCloseComposer.ts b/packages/communication/src/messages/outgoing/inventory/trading/TradingCloseComposer.ts new file mode 100644 index 0000000..5f701a5 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/trading/TradingCloseComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class TradingCloseComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/trading/TradingConfirmationComposer.ts b/packages/communication/src/messages/outgoing/inventory/trading/TradingConfirmationComposer.ts new file mode 100644 index 0000000..62a7f44 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/trading/TradingConfirmationComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class TradingConfirmationComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/trading/TradingListAddItemComposer.ts b/packages/communication/src/messages/outgoing/inventory/trading/TradingListAddItemComposer.ts new file mode 100644 index 0000000..30fe5ca --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/trading/TradingListAddItemComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class TradingListAddItemComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number) + { + this._data = [itemId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/trading/TradingListAddItemsComposer.ts b/packages/communication/src/messages/outgoing/inventory/trading/TradingListAddItemsComposer.ts new file mode 100644 index 0000000..acecc86 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/trading/TradingListAddItemsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class TradingListAddItemsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(...itemIds: number[]) + { + this._data = [itemIds.length, ...itemIds]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/trading/TradingListRemoveItemComposer.ts b/packages/communication/src/messages/outgoing/inventory/trading/TradingListRemoveItemComposer.ts new file mode 100644 index 0000000..6e87da8 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/trading/TradingListRemoveItemComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class TradingListItemRemoveComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number) + { + this._data = [itemId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/trading/TradingOpenComposer.ts b/packages/communication/src/messages/outgoing/inventory/trading/TradingOpenComposer.ts new file mode 100644 index 0000000..7a961c9 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/trading/TradingOpenComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class TradingOpenComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number) + { + this._data = [userId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/trading/TradingUnacceptComposer.ts b/packages/communication/src/messages/outgoing/inventory/trading/TradingUnacceptComposer.ts new file mode 100644 index 0000000..ca9bb77 --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/trading/TradingUnacceptComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class TradingUnacceptComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/trading/index.ts b/packages/communication/src/messages/outgoing/inventory/trading/index.ts new file mode 100644 index 0000000..6f850eb --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/trading/index.ts @@ -0,0 +1,9 @@ +export * from './TradingAcceptComposer'; +export * from './TradingCancelComposer'; +export * from './TradingCloseComposer'; +export * from './TradingConfirmationComposer'; +export * from './TradingListAddItemComposer'; +export * from './TradingListAddItemsComposer'; +export * from './TradingListRemoveItemComposer'; +export * from './TradingOpenComposer'; +export * from './TradingUnacceptComposer'; diff --git a/packages/communication/src/messages/outgoing/inventory/unseen/UnseenResetCategoryComposer.ts b/packages/communication/src/messages/outgoing/inventory/unseen/UnseenResetCategoryComposer.ts new file mode 100644 index 0000000..5ff0d0e --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/unseen/UnseenResetCategoryComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UnseenResetCategoryComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(category: number) + { + this._data = [category]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/unseen/UnseenResetItemsComposer.ts b/packages/communication/src/messages/outgoing/inventory/unseen/UnseenResetItemsComposer.ts new file mode 100644 index 0000000..99ea8bf --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/unseen/UnseenResetItemsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UnseenResetItemsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(category: number, ...itemIds: number[]) + { + this._data = [category, itemIds.length, ...itemIds]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/inventory/unseen/index.ts b/packages/communication/src/messages/outgoing/inventory/unseen/index.ts new file mode 100644 index 0000000..52f1b4e --- /dev/null +++ b/packages/communication/src/messages/outgoing/inventory/unseen/index.ts @@ -0,0 +1,2 @@ +export * from './UnseenResetCategoryComposer'; +export * from './UnseenResetItemsComposer'; diff --git a/packages/communication/src/messages/outgoing/landingview/GetPromoArticlesComposer.ts b/packages/communication/src/messages/outgoing/landingview/GetPromoArticlesComposer.ts new file mode 100644 index 0000000..8a7bbf9 --- /dev/null +++ b/packages/communication/src/messages/outgoing/landingview/GetPromoArticlesComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetPromoArticlesComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/landingview/index.ts b/packages/communication/src/messages/outgoing/landingview/index.ts new file mode 100644 index 0000000..9adfb30 --- /dev/null +++ b/packages/communication/src/messages/outgoing/landingview/index.ts @@ -0,0 +1,2 @@ +export * from './GetPromoArticlesComposer'; +export * from './votes'; diff --git a/packages/communication/src/messages/outgoing/landingview/votes/CommunityGoalVoteMessageComposer.ts b/packages/communication/src/messages/outgoing/landingview/votes/CommunityGoalVoteMessageComposer.ts new file mode 100644 index 0000000..48a652d --- /dev/null +++ b/packages/communication/src/messages/outgoing/landingview/votes/CommunityGoalVoteMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CommunityGoalVoteMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(voteOption: number) + { + this._data = [voteOption]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/landingview/votes/index.ts b/packages/communication/src/messages/outgoing/landingview/votes/index.ts new file mode 100644 index 0000000..ceaf9d7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/landingview/votes/index.ts @@ -0,0 +1 @@ +export * from './CommunityGoalVoteMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/marketplace/BuyMarketplaceOfferMessageComposer.ts b/packages/communication/src/messages/outgoing/marketplace/BuyMarketplaceOfferMessageComposer.ts new file mode 100644 index 0000000..b527684 --- /dev/null +++ b/packages/communication/src/messages/outgoing/marketplace/BuyMarketplaceOfferMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class BuyMarketplaceOfferMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(offerId: number) + { + this._data = [offerId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + this._data = null; + } +} diff --git a/packages/communication/src/messages/outgoing/marketplace/BuyMarketplaceTokensMessageComposer.ts b/packages/communication/src/messages/outgoing/marketplace/BuyMarketplaceTokensMessageComposer.ts new file mode 100644 index 0000000..cdd1b9e --- /dev/null +++ b/packages/communication/src/messages/outgoing/marketplace/BuyMarketplaceTokensMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class BuyMarketplaceTokensMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + this._data = null; + } +} diff --git a/packages/communication/src/messages/outgoing/marketplace/CancelMarketplaceOfferMessageComposer.ts b/packages/communication/src/messages/outgoing/marketplace/CancelMarketplaceOfferMessageComposer.ts new file mode 100644 index 0000000..658115b --- /dev/null +++ b/packages/communication/src/messages/outgoing/marketplace/CancelMarketplaceOfferMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CancelMarketplaceOfferMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(offerId: number) + { + this._data = [offerId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + this._data = null; + } +} diff --git a/packages/communication/src/messages/outgoing/marketplace/GetMarketplaceCanMakeOfferComposer.ts b/packages/communication/src/messages/outgoing/marketplace/GetMarketplaceCanMakeOfferComposer.ts new file mode 100644 index 0000000..773f0f0 --- /dev/null +++ b/packages/communication/src/messages/outgoing/marketplace/GetMarketplaceCanMakeOfferComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetMarketplaceCanMakeOfferComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/marketplace/GetMarketplaceConfigurationMessageComposer.ts b/packages/communication/src/messages/outgoing/marketplace/GetMarketplaceConfigurationMessageComposer.ts new file mode 100644 index 0000000..68f138a --- /dev/null +++ b/packages/communication/src/messages/outgoing/marketplace/GetMarketplaceConfigurationMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetMarketplaceConfigurationMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + this._data = null; + } +} diff --git a/packages/communication/src/messages/outgoing/marketplace/GetMarketplaceItemStatsComposer.ts b/packages/communication/src/messages/outgoing/marketplace/GetMarketplaceItemStatsComposer.ts new file mode 100644 index 0000000..f4365d2 --- /dev/null +++ b/packages/communication/src/messages/outgoing/marketplace/GetMarketplaceItemStatsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetMarketplaceItemStatsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(unknown: number, itemId: number) + { + this._data = [unknown, itemId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + this._data = null; + } +} diff --git a/packages/communication/src/messages/outgoing/marketplace/GetMarketplaceOffersMessageComposer.ts b/packages/communication/src/messages/outgoing/marketplace/GetMarketplaceOffersMessageComposer.ts new file mode 100644 index 0000000..fa08436 --- /dev/null +++ b/packages/communication/src/messages/outgoing/marketplace/GetMarketplaceOffersMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetMarketplaceOffersMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(min: number, max: number, query: string, type: number) + { + this._data = [min, max, query, type]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + this._data = null; + } +} diff --git a/packages/communication/src/messages/outgoing/marketplace/GetMarketplaceOwnOffersMessageComposer.ts b/packages/communication/src/messages/outgoing/marketplace/GetMarketplaceOwnOffersMessageComposer.ts new file mode 100644 index 0000000..8997f40 --- /dev/null +++ b/packages/communication/src/messages/outgoing/marketplace/GetMarketplaceOwnOffersMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetMarketplaceOwnOffersMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + this._data = null; + } +} diff --git a/packages/communication/src/messages/outgoing/marketplace/MakeOfferMessageComposer.ts b/packages/communication/src/messages/outgoing/marketplace/MakeOfferMessageComposer.ts new file mode 100644 index 0000000..62d5f47 --- /dev/null +++ b/packages/communication/src/messages/outgoing/marketplace/MakeOfferMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class MakeOfferMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(credits: number, arg2: number, itemId: number) + { + this._data = [credits, arg2, itemId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/marketplace/RedeemMarketplaceOfferCreditsMessageComposer.ts b/packages/communication/src/messages/outgoing/marketplace/RedeemMarketplaceOfferCreditsMessageComposer.ts new file mode 100644 index 0000000..16f42e4 --- /dev/null +++ b/packages/communication/src/messages/outgoing/marketplace/RedeemMarketplaceOfferCreditsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RedeemMarketplaceOfferCreditsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + this._data = null; + } +} diff --git a/packages/communication/src/messages/outgoing/marketplace/index.ts b/packages/communication/src/messages/outgoing/marketplace/index.ts new file mode 100644 index 0000000..742161a --- /dev/null +++ b/packages/communication/src/messages/outgoing/marketplace/index.ts @@ -0,0 +1,10 @@ +export * from './BuyMarketplaceOfferMessageComposer'; +export * from './BuyMarketplaceTokensMessageComposer'; +export * from './CancelMarketplaceOfferMessageComposer'; +export * from './GetMarketplaceCanMakeOfferComposer'; +export * from './GetMarketplaceConfigurationMessageComposer'; +export * from './GetMarketplaceItemStatsComposer'; +export * from './GetMarketplaceOffersMessageComposer'; +export * from './GetMarketplaceOwnOffersMessageComposer'; +export * from './MakeOfferMessageComposer'; +export * from './RedeemMarketplaceOfferCreditsMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/moderation/CloseIssueDefaultActionMessageComposer.ts b/packages/communication/src/messages/outgoing/moderation/CloseIssueDefaultActionMessageComposer.ts new file mode 100644 index 0000000..59b58b6 --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/CloseIssueDefaultActionMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CloseIssueDefaultActionMessageComposer implements IMessageComposer +{ + private _data: number[]; + + constructor(k: number, issueIds: number[], _arg_2: number) + { + this._data = [k, issueIds.length, ...issueIds, _arg_2]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/CloseIssuesMessageComposer.ts b/packages/communication/src/messages/outgoing/moderation/CloseIssuesMessageComposer.ts new file mode 100644 index 0000000..26cd182 --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/CloseIssuesMessageComposer.ts @@ -0,0 +1,25 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CloseIssuesMessageComposer implements IMessageComposer +{ + public static readonly RESOLUTION_USELESS = 1; + public static readonly RESOLUTION_ABUSIVE = 2; + public static readonly RESOLUTION_RESOLVED = 3; + + private _data: number[]; + + constructor(issueIds: number[], resolutionType: number) + { + this._data = [resolutionType, issueIds.length, ...issueIds]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/DefaultSanctionMessageComposer.ts b/packages/communication/src/messages/outgoing/moderation/DefaultSanctionMessageComposer.ts new file mode 100644 index 0000000..0cc9e3c --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/DefaultSanctionMessageComposer.ts @@ -0,0 +1,26 @@ +import { IMessageComposer } from '@nitrots/api'; +import { ModBanMessageComposer } from './ModBanMessageComposer'; + +export class DefaultSanctionMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number, _arg_3: string, _arg_4: number = -1) + { + this._data = [k, _arg_2, _arg_3]; + if(_arg_4 != ModBanMessageComposer.NO_ISSUE_ID) + { + this._data.push(_arg_4); + } + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/GetCfhChatlogMessageComposer.ts b/packages/communication/src/messages/outgoing/moderation/GetCfhChatlogMessageComposer.ts new file mode 100644 index 0000000..54b3251 --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/GetCfhChatlogMessageComposer.ts @@ -0,0 +1,22 @@ +import { IMessageComposer } from '@nitrots/api'; + + +export class GetCfhChatlogMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(issueId: number) + { + this._data = [issueId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/GetModeratorRoomInfoMessageComposer.ts b/packages/communication/src/messages/outgoing/moderation/GetModeratorRoomInfoMessageComposer.ts new file mode 100644 index 0000000..cc094a2 --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/GetModeratorRoomInfoMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetModeratorRoomInfoMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomId: number) + { + this._data = [roomId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/GetModeratorUserInfoMessageComposer.ts b/packages/communication/src/messages/outgoing/moderation/GetModeratorUserInfoMessageComposer.ts new file mode 100644 index 0000000..bf48e63 --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/GetModeratorUserInfoMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetModeratorUserInfoMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number) + { + this._data = [userId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/GetRoomChatlogMessageComposer.ts b/packages/communication/src/messages/outgoing/moderation/GetRoomChatlogMessageComposer.ts new file mode 100644 index 0000000..a25c54b --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/GetRoomChatlogMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetRoomChatlogMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomId: number, useless: number = 0) + { + this._data = [useless, roomId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/GetRoomVisitsMessageComposer.ts b/packages/communication/src/messages/outgoing/moderation/GetRoomVisitsMessageComposer.ts new file mode 100644 index 0000000..aa44ea7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/GetRoomVisitsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetRoomVisitsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/GetUserChatlogMessageComposer.ts b/packages/communication/src/messages/outgoing/moderation/GetUserChatlogMessageComposer.ts new file mode 100644 index 0000000..8b52e27 --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/GetUserChatlogMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetUserChatlogMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number) + { + this._data = [userId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/ModAlertMessageComposer.ts b/packages/communication/src/messages/outgoing/moderation/ModAlertMessageComposer.ts new file mode 100644 index 0000000..ec1d786 --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/ModAlertMessageComposer.ts @@ -0,0 +1,26 @@ +import { IMessageComposer } from '@nitrots/api'; +import { ModBanMessageComposer } from './ModBanMessageComposer'; + +export class ModAlertMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, arg2: string, arg3: number, arg4: number = -1) + { + this._data = [k, arg2, arg3]; + if(arg4 != ModBanMessageComposer.NO_ISSUE_ID) + { + this._data.push(arg4); + } + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/ModBanMessageComposer.ts b/packages/communication/src/messages/outgoing/moderation/ModBanMessageComposer.ts new file mode 100644 index 0000000..fd740e4 --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/ModBanMessageComposer.ts @@ -0,0 +1,27 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ModBanMessageComposer implements IMessageComposer> +{ + public static readonly NO_ISSUE_ID = -1; + + private _data: ConstructorParameters; + + constructor(k: number, arg2: string, arg3: number, arg4: number, arg5: boolean, arg6: number = -1) + { + this._data = [k, arg2, arg3, arg4, arg5]; + if(arg6 != ModBanMessageComposer.NO_ISSUE_ID) + { + this._data.push(arg6); + } + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/ModKickMessageComposer.ts b/packages/communication/src/messages/outgoing/moderation/ModKickMessageComposer.ts new file mode 100644 index 0000000..12e0da9 --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/ModKickMessageComposer.ts @@ -0,0 +1,27 @@ +import { IMessageComposer } from '@nitrots/api'; +import { ModBanMessageComposer } from './ModBanMessageComposer'; + +export class ModKickMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, arg2: string, arg3: number, arg4: number = -1) + { + this._data = [k, arg2, arg3]; + + if(arg4 != ModBanMessageComposer.NO_ISSUE_ID) + { + this._data.push(arg4); + } + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/ModMessageMessageComposer.ts b/packages/communication/src/messages/outgoing/moderation/ModMessageMessageComposer.ts new file mode 100644 index 0000000..76b8be0 --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/ModMessageMessageComposer.ts @@ -0,0 +1,30 @@ +import { IMessageComposer } from '@nitrots/api'; +import { ModBanMessageComposer } from './ModBanMessageComposer'; + +export class ModMessageMessageComposer implements IMessageComposer +{ + private _data: any[] = []; + + constructor(k: number, arg2: string, arg3: number, arg4: number = -1) + { + this._data.push(k); + this._data.push(arg2); + this._data.push(''); + this._data.push(''); + this._data.push(arg3); + if(arg4 != ModBanMessageComposer.NO_ISSUE_ID) + { + this._data.push(arg4); + } + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/ModMuteMessageComposer.ts b/packages/communication/src/messages/outgoing/moderation/ModMuteMessageComposer.ts new file mode 100644 index 0000000..329fb2a --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/ModMuteMessageComposer.ts @@ -0,0 +1,26 @@ +import { IMessageComposer } from '@nitrots/api'; +import { ModBanMessageComposer } from './ModBanMessageComposer'; + +export class ModMuteMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, arg2: string, arg3: number, arg4: number = -1) + { + this._data = [k, arg2, arg3]; + if(arg4 != ModBanMessageComposer.NO_ISSUE_ID) + { + this._data.push(arg4); + } + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/ModToolPreferencesComposer.ts b/packages/communication/src/messages/outgoing/moderation/ModToolPreferencesComposer.ts new file mode 100644 index 0000000..6412491 --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/ModToolPreferencesComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ModToolPreferencesComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number, _arg_3: number, _arg_4: number) + { + this._data = [k, _arg_2, _arg_3, _arg_4]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/ModToolSanctionComposer.ts b/packages/communication/src/messages/outgoing/moderation/ModToolSanctionComposer.ts new file mode 100644 index 0000000..6bb9a71 --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/ModToolSanctionComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ModToolSanctionComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number, _arg_3: number) + { + this._data = [k, _arg_2, _arg_3]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/ModTradingLockMessageComposer.ts b/packages/communication/src/messages/outgoing/moderation/ModTradingLockMessageComposer.ts new file mode 100644 index 0000000..17a1c44 --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/ModTradingLockMessageComposer.ts @@ -0,0 +1,27 @@ +import { IMessageComposer } from '@nitrots/api'; +import { ModBanMessageComposer } from './ModBanMessageComposer'; + +export class ModTradingLockMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, arg2: string, arg3: number, arg4: number, arg5: number = -1) + { + this._data = [k, arg2, arg3, arg4]; + + if(arg5 != ModBanMessageComposer.NO_ISSUE_ID) + { + this._data.push(arg5); + } + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/ModerateRoomMessageComposer.ts b/packages/communication/src/messages/outgoing/moderation/ModerateRoomMessageComposer.ts new file mode 100644 index 0000000..44fd233 --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/ModerateRoomMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ModerateRoomMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomId: number, lockDoor: number, changeTitle: number, kickUsers: number) + { + this._data = [roomId, lockDoor, changeTitle, kickUsers]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/ModeratorActionMessageComposer.ts b/packages/communication/src/messages/outgoing/moderation/ModeratorActionMessageComposer.ts new file mode 100644 index 0000000..6e42613 --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/ModeratorActionMessageComposer.ts @@ -0,0 +1,28 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ModeratorActionMessageComposer implements IMessageComposer +{ + public static readonly ACTION_ALERT = 0; + public static readonly ACTION_KICK = 1; + public static readonly ACTION_MESSAGE = 3; + public static readonly ACTION_MESSAGE_AND_SOFT_KICK = 4; + + private _data: any[] = []; + + constructor(k: number, arg2: string, arg3: string) + { + this._data.push(k); + this._data.push(arg2); + this._data.push(arg3); + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/PickIssuesMessageComposer.ts b/packages/communication/src/messages/outgoing/moderation/PickIssuesMessageComposer.ts new file mode 100644 index 0000000..a5f8ea0 --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/PickIssuesMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PickIssuesMessageComposer implements IMessageComposer +{ + private _data: any; + + constructor(issueIds: number[], retryEnabled: boolean, retryCount: number, message: string) + { + this._data = [issueIds.length, ...issueIds, retryEnabled, retryCount, message]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/ReleaseIssuesMessageComposer.ts b/packages/communication/src/messages/outgoing/moderation/ReleaseIssuesMessageComposer.ts new file mode 100644 index 0000000..4d69869 --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/ReleaseIssuesMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ReleaseIssuesMessageComposer implements IMessageComposer +{ + private _data: number[]; + + constructor(issueIds: number[]) + { + this._data = [issueIds.length, ...issueIds]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/moderation/index.ts b/packages/communication/src/messages/outgoing/moderation/index.ts new file mode 100644 index 0000000..6f35762 --- /dev/null +++ b/packages/communication/src/messages/outgoing/moderation/index.ts @@ -0,0 +1,21 @@ +export * from './CloseIssueDefaultActionMessageComposer'; +export * from './CloseIssuesMessageComposer'; +export * from './DefaultSanctionMessageComposer'; +export * from './GetCfhChatlogMessageComposer'; +export * from './GetModeratorRoomInfoMessageComposer'; +export * from './GetModeratorUserInfoMessageComposer'; +export * from './GetRoomChatlogMessageComposer'; +export * from './GetRoomVisitsMessageComposer'; +export * from './GetUserChatlogMessageComposer'; +export * from './ModAlertMessageComposer'; +export * from './ModBanMessageComposer'; +export * from './ModerateRoomMessageComposer'; +export * from './ModeratorActionMessageComposer'; +export * from './ModKickMessageComposer'; +export * from './ModMessageMessageComposer'; +export * from './ModMuteMessageComposer'; +export * from './ModToolPreferencesComposer'; +export * from './ModToolSanctionComposer'; +export * from './ModTradingLockMessageComposer'; +export * from './PickIssuesMessageComposer'; +export * from './ReleaseIssuesMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/mysterybox/MysteryBoxWaitingCanceledMessageComposer.ts b/packages/communication/src/messages/outgoing/mysterybox/MysteryBoxWaitingCanceledMessageComposer.ts new file mode 100644 index 0000000..d16a8e9 --- /dev/null +++ b/packages/communication/src/messages/outgoing/mysterybox/MysteryBoxWaitingCanceledMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class MysteryBoxWaitingCanceledMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [ k ]; + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/mysterybox/index.ts b/packages/communication/src/messages/outgoing/mysterybox/index.ts new file mode 100644 index 0000000..d4ed8fb --- /dev/null +++ b/packages/communication/src/messages/outgoing/mysterybox/index.ts @@ -0,0 +1 @@ +export * from './MysteryBoxWaitingCanceledMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/navigator/AddFavouriteRoomMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/AddFavouriteRoomMessageComposer.ts new file mode 100644 index 0000000..1093bc3 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/AddFavouriteRoomMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class AddFavouriteRoomMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomId: number) + { + this._data = [roomId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/CanCreateRoomMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/CanCreateRoomMessageComposer.ts new file mode 100644 index 0000000..8be84d5 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/CanCreateRoomMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CanCreateRoomMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/CancelEventMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/CancelEventMessageComposer.ts new file mode 100644 index 0000000..d56200d --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/CancelEventMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CancelEventMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/CompetitionRoomsSearchMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/CompetitionRoomsSearchMessageComposer.ts new file mode 100644 index 0000000..96d9ecd --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/CompetitionRoomsSearchMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CompetitionRoomsSearchMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number) + { + this._data = [k, _arg_2]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/ConvertGlobalRoomIdComposer.ts b/packages/communication/src/messages/outgoing/navigator/ConvertGlobalRoomIdComposer.ts new file mode 100644 index 0000000..836da31 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/ConvertGlobalRoomIdComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ConvertGlobalRoomIdMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(flatId: string) + { + this._data = [flatId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/CreateFlatMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/CreateFlatMessageComposer.ts new file mode 100644 index 0000000..e65d1a8 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/CreateFlatMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CreateFlatMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomName: string, roomDesc: string, modelName: string, categoryId: number, maxVisitors: number, tradeType: number) + { + this._data = [roomName, roomDesc, modelName, categoryId, maxVisitors, tradeType]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/DeleteFavouriteRoomMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/DeleteFavouriteRoomMessageComposer.ts new file mode 100644 index 0000000..8bbe867 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/DeleteFavouriteRoomMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class DeleteFavouriteRoomMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/EditEventMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/EditEventMessageComposer.ts new file mode 100644 index 0000000..6244e5a --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/EditEventMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class EditEventMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: string, _arg_3: string) + { + this._data = [k, _arg_2, _arg_3]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/ForwardToARandomPromotedRoomMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/ForwardToARandomPromotedRoomMessageComposer.ts new file mode 100644 index 0000000..08060fe --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/ForwardToARandomPromotedRoomMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ForwardToARandomPromotedRoomMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/ForwardToSomeRoomMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/ForwardToSomeRoomMessageComposer.ts new file mode 100644 index 0000000..b4b48dc --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/ForwardToSomeRoomMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ForwardToSomeRoomMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/GetCategoriesWithUserCountMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/GetCategoriesWithUserCountMessageComposer.ts new file mode 100644 index 0000000..6993f54 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/GetCategoriesWithUserCountMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetCategoriesWithUserCountMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/GetCustomRoomFilterMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/GetCustomRoomFilterMessageComposer.ts new file mode 100644 index 0000000..a790aa1 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/GetCustomRoomFilterMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetCustomRoomFilterMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomId: number) + { + this._data = [roomId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/GetGuestRoomMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/GetGuestRoomMessageComposer.ts new file mode 100644 index 0000000..99218ce --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/GetGuestRoomMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetGuestRoomMessageComposer implements IMessageComposer<[number, number, number]> +{ + private _data: [number, number, number]; + + constructor(roomId: number, enterRoom: boolean, forwardRoom: boolean) + { + this._data = [roomId, (enterRoom ? 1 : 0), (forwardRoom ? 1 : 0)]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/GetOfficialRoomsMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/GetOfficialRoomsMessageComposer.ts new file mode 100644 index 0000000..3c34c60 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/GetOfficialRoomsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetOfficialRoomsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number = 0) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/GetPopularRoomTagsMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/GetPopularRoomTagsMessageComposer.ts new file mode 100644 index 0000000..b716c69 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/GetPopularRoomTagsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetPopularRoomTagsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/GetUserEventCatsMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/GetUserEventCatsMessageComposer.ts new file mode 100644 index 0000000..40ae56d --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/GetUserEventCatsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetUserEventCatsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/GetUserFlatCatsMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/GetUserFlatCatsMessageComposer.ts new file mode 100644 index 0000000..9e92a0e --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/GetUserFlatCatsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetUserFlatCatsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/GuildBaseSearchMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/GuildBaseSearchMessageComposer.ts new file mode 100644 index 0000000..7fab8a6 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/GuildBaseSearchMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GuildBaseSearchMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/MyFavouriteRoomsSearchMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/MyFavouriteRoomsSearchMessageComposer.ts new file mode 100644 index 0000000..84b8e09 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/MyFavouriteRoomsSearchMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class MyFavouriteRoomsSearchMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/MyFrequentRoomHistorySearchMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/MyFrequentRoomHistorySearchMessageComposer.ts new file mode 100644 index 0000000..91de6f9 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/MyFrequentRoomHistorySearchMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class MyFrequentRoomHistorySearchMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/MyFriendsRoomsSearchMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/MyFriendsRoomsSearchMessageComposer.ts new file mode 100644 index 0000000..e48ad1d --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/MyFriendsRoomsSearchMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class MyFriendsRoomsSearchMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/MyGuildBasesSearchMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/MyGuildBasesSearchMessageComposer.ts new file mode 100644 index 0000000..1d6237b --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/MyGuildBasesSearchMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class MyGuildBasesSearchMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/MyRecommendedRoomsMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/MyRecommendedRoomsMessageComposer.ts new file mode 100644 index 0000000..2fc05ff --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/MyRecommendedRoomsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class MyRecommendedRoomsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/MyRoomHistorySearchMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/MyRoomHistorySearchMessageComposer.ts new file mode 100644 index 0000000..5c74447 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/MyRoomHistorySearchMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class MyRoomHistorySearchMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/MyRoomRightsSearchMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/MyRoomRightsSearchMessageComposer.ts new file mode 100644 index 0000000..f7edd3a --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/MyRoomRightsSearchMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class MyRoomRightsSearchMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/MyRoomsSearchMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/MyRoomsSearchMessageComposer.ts new file mode 100644 index 0000000..a24e987 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/MyRoomsSearchMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class MyRoomsSearchMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/NavigatorCategoryListModeComposer.ts b/packages/communication/src/messages/outgoing/navigator/NavigatorCategoryListModeComposer.ts new file mode 100644 index 0000000..4ac96b0 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/NavigatorCategoryListModeComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class NavigatorCategoryListModeComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(category: string, listmode: number) + { + this._data = [category, listmode]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/NavigatorDeleteSavedSearchComposer.ts b/packages/communication/src/messages/outgoing/navigator/NavigatorDeleteSavedSearchComposer.ts new file mode 100644 index 0000000..60ebb19 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/NavigatorDeleteSavedSearchComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class NavigatorDeleteSavedSearchComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(searchId: number) + { + this._data = [searchId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/NavigatorInitComposer.ts b/packages/communication/src/messages/outgoing/navigator/NavigatorInitComposer.ts new file mode 100644 index 0000000..74e6efd --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/NavigatorInitComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class NavigatorInitComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/NavigatorSearchCloseComposer.ts b/packages/communication/src/messages/outgoing/navigator/NavigatorSearchCloseComposer.ts new file mode 100644 index 0000000..0823bf1 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/NavigatorSearchCloseComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class NavigatorSearchCloseComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(code: string) + { + this._data = [code]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/NavigatorSearchComposer.ts b/packages/communication/src/messages/outgoing/navigator/NavigatorSearchComposer.ts new file mode 100644 index 0000000..522ecb4 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/NavigatorSearchComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class NavigatorSearchComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(code: string, data: string) + { + this._data = [code, data]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/NavigatorSearchOpenComposer.ts b/packages/communication/src/messages/outgoing/navigator/NavigatorSearchOpenComposer.ts new file mode 100644 index 0000000..679b559 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/NavigatorSearchOpenComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class NavigatorSearchOpenComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(code: string) + { + this._data = [code]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/NavigatorSearchSaveComposer.ts b/packages/communication/src/messages/outgoing/navigator/NavigatorSearchSaveComposer.ts new file mode 100644 index 0000000..c4745eb --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/NavigatorSearchSaveComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class NavigatorSearchSaveComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(code: string, data: string) + { + this._data = [code, data]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/NavigatorSettingsSaveComposer.ts b/packages/communication/src/messages/outgoing/navigator/NavigatorSettingsSaveComposer.ts new file mode 100644 index 0000000..fcbff21 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/NavigatorSettingsSaveComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class NavigatorSettingsSaveComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(x: number, y: number, width: number, height: number, leftSideOpen: boolean, mode: number) + { + this._data = [x, y, width, height, leftSideOpen, mode]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/PopularRoomsSearchMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/PopularRoomsSearchMessageComposer.ts new file mode 100644 index 0000000..df0b56b --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/PopularRoomsSearchMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PopularRoomsSearchMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string, _arg_2: number) + { + this._data = [k, _arg_2]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/RateFlatMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/RateFlatMessageComposer.ts new file mode 100644 index 0000000..afeab01 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/RateFlatMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RateFlatMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/RemoveOwnRoomRightsRoomMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/RemoveOwnRoomRightsRoomMessageComposer.ts new file mode 100644 index 0000000..605bdb6 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/RemoveOwnRoomRightsRoomMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RemoveOwnRoomRightsRoomMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomId: number) + { + this._data = [roomId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/RoomAdEventTabAdClickedComposer.ts b/packages/communication/src/messages/outgoing/navigator/RoomAdEventTabAdClickedComposer.ts new file mode 100644 index 0000000..66f0022 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/RoomAdEventTabAdClickedComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomAdEventTabAdClickedComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: string, _arg_3: number) + { + this._data = [k, _arg_2, _arg_3]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/RoomAdEventTabViewedComposer.ts b/packages/communication/src/messages/outgoing/navigator/RoomAdEventTabViewedComposer.ts new file mode 100644 index 0000000..dbb271e --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/RoomAdEventTabViewedComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomAdEventTabViewedComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/RoomAdSearchMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/RoomAdSearchMessageComposer.ts new file mode 100644 index 0000000..d22bf96 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/RoomAdSearchMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomAdSearchMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number) + { + this._data = [k, _arg_2]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/RoomTextSearchMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/RoomTextSearchMessageComposer.ts new file mode 100644 index 0000000..3d5c1f7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/RoomTextSearchMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomTextSearchMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/RoomsWhereMyFriendsAreSearchMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/RoomsWhereMyFriendsAreSearchMessageComposer.ts new file mode 100644 index 0000000..67cab58 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/RoomsWhereMyFriendsAreSearchMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomsWhereMyFriendsAreSearchMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/RoomsWithHighestScoreSearchMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/RoomsWithHighestScoreSearchMessageComposer.ts new file mode 100644 index 0000000..bb87c5d --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/RoomsWithHighestScoreSearchMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomsWithHighestScoreSearchMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/SetRoomSessionTagsMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/SetRoomSessionTagsMessageComposer.ts new file mode 100644 index 0000000..a79d520 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/SetRoomSessionTagsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class SetRoomSessionTagsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string, _arg_2: string) + { + this._data = [k, _arg_2]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/ToggleStaffPickMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/ToggleStaffPickMessageComposer.ts new file mode 100644 index 0000000..d1462e2 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/ToggleStaffPickMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ToggleStaffPickMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomId: number) + { + this._data = [roomId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/UpdateHomeRoomMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/UpdateHomeRoomMessageComposer.ts new file mode 100644 index 0000000..ce555e5 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/UpdateHomeRoomMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UpdateHomeRoomMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomId: number) + { + this._data = [roomId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/UpdateRoomFilterMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/UpdateRoomFilterMessageComposer.ts new file mode 100644 index 0000000..a79b70c --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/UpdateRoomFilterMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UpdateRoomFilterMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomId: number, isAddingWord: boolean, word: string) + { + this._data = [roomId, isAddingWord, word]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/UpdateRoomThumbnailMessageComposer.ts b/packages/communication/src/messages/outgoing/navigator/UpdateRoomThumbnailMessageComposer.ts new file mode 100644 index 0000000..c12e83e --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/UpdateRoomThumbnailMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UpdateRoomThumbnailMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(flatId: number, bgImgId: number, frontImgId: number, objCount: number) + { + this._data = [flatId, bgImgId, frontImgId, objCount]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/navigator/index.ts b/packages/communication/src/messages/outgoing/navigator/index.ts new file mode 100644 index 0000000..4a73ec7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/navigator/index.ts @@ -0,0 +1,48 @@ +export * from './AddFavouriteRoomMessageComposer'; +export * from './CancelEventMessageComposer'; +export * from './CanCreateRoomMessageComposer'; +export * from './CompetitionRoomsSearchMessageComposer'; +export * from './ConvertGlobalRoomIdComposer'; +export * from './CreateFlatMessageComposer'; +export * from './DeleteFavouriteRoomMessageComposer'; +export * from './EditEventMessageComposer'; +export * from './ForwardToARandomPromotedRoomMessageComposer'; +export * from './ForwardToSomeRoomMessageComposer'; +export * from './GetCategoriesWithUserCountMessageComposer'; +export * from './GetCustomRoomFilterMessageComposer'; +export * from './GetGuestRoomMessageComposer'; +export * from './GetOfficialRoomsMessageComposer'; +export * from './GetPopularRoomTagsMessageComposer'; +export * from './GetUserEventCatsMessageComposer'; +export * from './GetUserFlatCatsMessageComposer'; +export * from './GuildBaseSearchMessageComposer'; +export * from './MyFavouriteRoomsSearchMessageComposer'; +export * from './MyFrequentRoomHistorySearchMessageComposer'; +export * from './MyFriendsRoomsSearchMessageComposer'; +export * from './MyGuildBasesSearchMessageComposer'; +export * from './MyRecommendedRoomsMessageComposer'; +export * from './MyRoomHistorySearchMessageComposer'; +export * from './MyRoomRightsSearchMessageComposer'; +export * from './MyRoomsSearchMessageComposer'; +export * from './NavigatorCategoryListModeComposer'; +export * from './NavigatorDeleteSavedSearchComposer'; +export * from './NavigatorInitComposer'; +export * from './NavigatorSearchCloseComposer'; +export * from './NavigatorSearchComposer'; +export * from './NavigatorSearchOpenComposer'; +export * from './NavigatorSearchSaveComposer'; +export * from './NavigatorSettingsSaveComposer'; +export * from './PopularRoomsSearchMessageComposer'; +export * from './RateFlatMessageComposer'; +export * from './RemoveOwnRoomRightsRoomMessageComposer'; +export * from './RoomAdEventTabAdClickedComposer'; +export * from './RoomAdEventTabViewedComposer'; +export * from './RoomAdSearchMessageComposer'; +export * from './RoomsWhereMyFriendsAreSearchMessageComposer'; +export * from './RoomsWithHighestScoreSearchMessageComposer'; +export * from './RoomTextSearchMessageComposer'; +export * from './SetRoomSessionTagsMessageComposer'; +export * from './ToggleStaffPickMessageComposer'; +export * from './UpdateHomeRoomMessageComposer'; +export * from './UpdateRoomFilterMessageComposer'; +export * from './UpdateRoomThumbnailMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/nux/NewUserExperienceGetGiftsComposer.ts b/packages/communication/src/messages/outgoing/nux/NewUserExperienceGetGiftsComposer.ts new file mode 100644 index 0000000..918a82d --- /dev/null +++ b/packages/communication/src/messages/outgoing/nux/NewUserExperienceGetGiftsComposer.ts @@ -0,0 +1,28 @@ +import { IMessageComposer } from '@nitrots/api'; +import { NewUserExperienceGetGiftsSelection } from './NewUserExperienceGetGiftsSelection'; + +export class NewUserExperienceGetGiftsComposer implements IMessageComposer> +{ + private _data: any; + + constructor(...data: NewUserExperienceGetGiftsSelection[]) + { + this._data = [data.length * 3]; + data.forEach(entry => + { + this._data.push(entry.dayIndex); + this._data.push(entry.stepIndex); + this._data.push(entry.giftIndex); + }); + } + + dispose(): void + { + this._data = null; + } + + public getMessageArray() + { + return this._data; + } +} diff --git a/packages/communication/src/messages/outgoing/nux/NewUserExperienceGetGiftsSelection.ts b/packages/communication/src/messages/outgoing/nux/NewUserExperienceGetGiftsSelection.ts new file mode 100644 index 0000000..fd95d6b --- /dev/null +++ b/packages/communication/src/messages/outgoing/nux/NewUserExperienceGetGiftsSelection.ts @@ -0,0 +1,28 @@ +export class NewUserExperienceGetGiftsSelection +{ + private _dayIndex: number; + private _stepIndex: number; + private _giftIndex: number; + + constructor(dayIndex: number, stepIndex: number, giftIndex: number) + { + this._dayIndex = dayIndex; + this._stepIndex = stepIndex; + this._giftIndex = giftIndex; + } + + public get dayIndex(): number + { + return this._dayIndex; + } + + public get stepIndex(): number + { + return this._stepIndex; + } + + public get giftIndex(): number + { + return this._giftIndex; + } +} diff --git a/packages/communication/src/messages/outgoing/nux/NewUserExperienceScriptProceedComposer.ts b/packages/communication/src/messages/outgoing/nux/NewUserExperienceScriptProceedComposer.ts new file mode 100644 index 0000000..31ee0d3 --- /dev/null +++ b/packages/communication/src/messages/outgoing/nux/NewUserExperienceScriptProceedComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class NewUserExperienceScriptProceedComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/nux/index.ts b/packages/communication/src/messages/outgoing/nux/index.ts new file mode 100644 index 0000000..31d517b --- /dev/null +++ b/packages/communication/src/messages/outgoing/nux/index.ts @@ -0,0 +1,3 @@ +export * from './NewUserExperienceGetGiftsComposer'; +export * from './NewUserExperienceGetGiftsSelection'; +export * from './NewUserExperienceScriptProceedComposer'; diff --git a/packages/communication/src/messages/outgoing/pet/GetPetCommandsComposer.ts b/packages/communication/src/messages/outgoing/pet/GetPetCommandsComposer.ts new file mode 100644 index 0000000..727faed --- /dev/null +++ b/packages/communication/src/messages/outgoing/pet/GetPetCommandsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetPetCommandsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(petId: number) + { + this._data = [petId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/pet/PetMountComposer.ts b/packages/communication/src/messages/outgoing/pet/PetMountComposer.ts new file mode 100644 index 0000000..93ff9c1 --- /dev/null +++ b/packages/communication/src/messages/outgoing/pet/PetMountComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PetMountComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(petId: number, flag: boolean) + { + this._data = [petId, flag]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/pet/PetRespectComposer.ts b/packages/communication/src/messages/outgoing/pet/PetRespectComposer.ts new file mode 100644 index 0000000..fdb919a --- /dev/null +++ b/packages/communication/src/messages/outgoing/pet/PetRespectComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PetRespectComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(petId: number) + { + this._data = [petId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/pet/PetSupplementComposer.ts b/packages/communication/src/messages/outgoing/pet/PetSupplementComposer.ts new file mode 100644 index 0000000..b0f4d12 --- /dev/null +++ b/packages/communication/src/messages/outgoing/pet/PetSupplementComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PetSupplementComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(petId: number, supplement: number) + { + this._data = [petId, supplement]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/pet/RemovePetSaddleComposer.ts b/packages/communication/src/messages/outgoing/pet/RemovePetSaddleComposer.ts new file mode 100644 index 0000000..de933bd --- /dev/null +++ b/packages/communication/src/messages/outgoing/pet/RemovePetSaddleComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RemovePetSaddleComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(petId: number) + { + this._data = [petId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/pet/RequestPetInfoComposer.ts b/packages/communication/src/messages/outgoing/pet/RequestPetInfoComposer.ts new file mode 100644 index 0000000..b4d03dd --- /dev/null +++ b/packages/communication/src/messages/outgoing/pet/RequestPetInfoComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RequestPetInfoComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(petId: number) + { + this._data = [petId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/pet/TogglePetBreedingComposer.ts b/packages/communication/src/messages/outgoing/pet/TogglePetBreedingComposer.ts new file mode 100644 index 0000000..cbe72c5 --- /dev/null +++ b/packages/communication/src/messages/outgoing/pet/TogglePetBreedingComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class TogglePetBreedingComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(petId: number) + { + this._data = [petId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/pet/TogglePetRidingComposer.ts b/packages/communication/src/messages/outgoing/pet/TogglePetRidingComposer.ts new file mode 100644 index 0000000..2bfdb96 --- /dev/null +++ b/packages/communication/src/messages/outgoing/pet/TogglePetRidingComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class TogglePetRidingComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(petId: number) + { + this._data = [petId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/pet/UsePetProductComposer.ts b/packages/communication/src/messages/outgoing/pet/UsePetProductComposer.ts new file mode 100644 index 0000000..5ef7354 --- /dev/null +++ b/packages/communication/src/messages/outgoing/pet/UsePetProductComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UsePetProductComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number, petId: number) + { + this._data = [itemId, petId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/pet/index.ts b/packages/communication/src/messages/outgoing/pet/index.ts new file mode 100644 index 0000000..6e1205d --- /dev/null +++ b/packages/communication/src/messages/outgoing/pet/index.ts @@ -0,0 +1,9 @@ +export * from './GetPetCommandsComposer'; +export * from './PetMountComposer'; +export * from './PetRespectComposer'; +export * from './PetSupplementComposer'; +export * from './RemovePetSaddleComposer'; +export * from './RequestPetInfoComposer'; +export * from './TogglePetBreedingComposer'; +export * from './TogglePetRidingComposer'; +export * from './UsePetProductComposer'; diff --git a/packages/communication/src/messages/outgoing/poll/PollAnswerComposer.ts b/packages/communication/src/messages/outgoing/poll/PollAnswerComposer.ts new file mode 100644 index 0000000..e49a948 --- /dev/null +++ b/packages/communication/src/messages/outgoing/poll/PollAnswerComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PollAnswerComposer implements IMessageComposer +{ + private _data: any; + + constructor(pollId: number, questionId: number, answers: string[]) + { + this._data = [pollId, questionId, answers.length, ...answers]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/poll/PollRejectComposer.ts b/packages/communication/src/messages/outgoing/poll/PollRejectComposer.ts new file mode 100644 index 0000000..ac38682 --- /dev/null +++ b/packages/communication/src/messages/outgoing/poll/PollRejectComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PollRejectComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/poll/PollStartComposer.ts b/packages/communication/src/messages/outgoing/poll/PollStartComposer.ts new file mode 100644 index 0000000..9621d09 --- /dev/null +++ b/packages/communication/src/messages/outgoing/poll/PollStartComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PollStartComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/poll/VotePollCounterMessageComposer.ts b/packages/communication/src/messages/outgoing/poll/VotePollCounterMessageComposer.ts new file mode 100644 index 0000000..4edfc37 --- /dev/null +++ b/packages/communication/src/messages/outgoing/poll/VotePollCounterMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class VotePollCounterMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(counter: number) + { + this._data = [counter]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/poll/index.ts b/packages/communication/src/messages/outgoing/poll/index.ts new file mode 100644 index 0000000..0055b90 --- /dev/null +++ b/packages/communication/src/messages/outgoing/poll/index.ts @@ -0,0 +1,4 @@ +export * from './PollAnswerComposer'; +export * from './PollRejectComposer'; +export * from './PollStartComposer'; +export * from './VotePollCounterMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/quest/AcceptQuestMessageComposer.ts b/packages/communication/src/messages/outgoing/quest/AcceptQuestMessageComposer.ts new file mode 100644 index 0000000..ef06b30 --- /dev/null +++ b/packages/communication/src/messages/outgoing/quest/AcceptQuestMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class AcceptQuestMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/quest/ActivateQuestMessageComposer.ts b/packages/communication/src/messages/outgoing/quest/ActivateQuestMessageComposer.ts new file mode 100644 index 0000000..366e648 --- /dev/null +++ b/packages/communication/src/messages/outgoing/quest/ActivateQuestMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ActivateQuestMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/quest/CancelQuestMessageComposer.ts b/packages/communication/src/messages/outgoing/quest/CancelQuestMessageComposer.ts new file mode 100644 index 0000000..e4238d8 --- /dev/null +++ b/packages/communication/src/messages/outgoing/quest/CancelQuestMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CancelQuestMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/quest/FriendRequestQuestCompleteMessageComposer.ts b/packages/communication/src/messages/outgoing/quest/FriendRequestQuestCompleteMessageComposer.ts new file mode 100644 index 0000000..1270d71 --- /dev/null +++ b/packages/communication/src/messages/outgoing/quest/FriendRequestQuestCompleteMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FriendRequestQuestCompleteMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/quest/GetCommunityGoalEarnedPrizesMessageComposer.ts b/packages/communication/src/messages/outgoing/quest/GetCommunityGoalEarnedPrizesMessageComposer.ts new file mode 100644 index 0000000..6c47134 --- /dev/null +++ b/packages/communication/src/messages/outgoing/quest/GetCommunityGoalEarnedPrizesMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetCommunityGoalEarnedPrizesMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/quest/GetCommunityGoalHallOfFameMessageComposer.ts b/packages/communication/src/messages/outgoing/quest/GetCommunityGoalHallOfFameMessageComposer.ts new file mode 100644 index 0000000..8ea1711 --- /dev/null +++ b/packages/communication/src/messages/outgoing/quest/GetCommunityGoalHallOfFameMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetCommunityGoalHallOfFameMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/quest/GetCommunityGoalProgressMessageComposer.ts b/packages/communication/src/messages/outgoing/quest/GetCommunityGoalProgressMessageComposer.ts new file mode 100644 index 0000000..042fcb3 --- /dev/null +++ b/packages/communication/src/messages/outgoing/quest/GetCommunityGoalProgressMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetCommunityGoalProgressMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/quest/GetConcurrentUsersGoalProgressMessageComposer.ts b/packages/communication/src/messages/outgoing/quest/GetConcurrentUsersGoalProgressMessageComposer.ts new file mode 100644 index 0000000..ebc5f26 --- /dev/null +++ b/packages/communication/src/messages/outgoing/quest/GetConcurrentUsersGoalProgressMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetConcurrentUsersGoalProgressMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/quest/GetConcurrentUsersRewardMessageComposer.ts b/packages/communication/src/messages/outgoing/quest/GetConcurrentUsersRewardMessageComposer.ts new file mode 100644 index 0000000..812e794 --- /dev/null +++ b/packages/communication/src/messages/outgoing/quest/GetConcurrentUsersRewardMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetConcurrentUsersRewardMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/quest/GetDailyQuestMessageComposer.ts b/packages/communication/src/messages/outgoing/quest/GetDailyQuestMessageComposer.ts new file mode 100644 index 0000000..6e23417 --- /dev/null +++ b/packages/communication/src/messages/outgoing/quest/GetDailyQuestMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetDailyQuestMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: boolean, _arg_2: number) + { + this._data = [k, _arg_2]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/quest/GetQuestsMessageComposer.ts b/packages/communication/src/messages/outgoing/quest/GetQuestsMessageComposer.ts new file mode 100644 index 0000000..0500bf6 --- /dev/null +++ b/packages/communication/src/messages/outgoing/quest/GetQuestsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetQuestsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/quest/GetSeasonalQuestsOnlyMessageComposer.ts b/packages/communication/src/messages/outgoing/quest/GetSeasonalQuestsOnlyMessageComposer.ts new file mode 100644 index 0000000..08a2930 --- /dev/null +++ b/packages/communication/src/messages/outgoing/quest/GetSeasonalQuestsOnlyMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetSeasonalQuestsOnlyMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/quest/OpenQuestTrackerMessageComposer.ts b/packages/communication/src/messages/outgoing/quest/OpenQuestTrackerMessageComposer.ts new file mode 100644 index 0000000..1e5ceaa --- /dev/null +++ b/packages/communication/src/messages/outgoing/quest/OpenQuestTrackerMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class OpenQuestTrackerMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/quest/RedeemCommunityGoalPrizeMessageComposer.ts b/packages/communication/src/messages/outgoing/quest/RedeemCommunityGoalPrizeMessageComposer.ts new file mode 100644 index 0000000..8807a00 --- /dev/null +++ b/packages/communication/src/messages/outgoing/quest/RedeemCommunityGoalPrizeMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RedeemCommunityGoalPrizeMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(communityGoalId: number) + { + this._data = [communityGoalId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/quest/RejectQuestMessageComposer.ts b/packages/communication/src/messages/outgoing/quest/RejectQuestMessageComposer.ts new file mode 100644 index 0000000..ddbfd07 --- /dev/null +++ b/packages/communication/src/messages/outgoing/quest/RejectQuestMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RejectQuestMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/quest/StartCampaignMessageComposer.ts b/packages/communication/src/messages/outgoing/quest/StartCampaignMessageComposer.ts new file mode 100644 index 0000000..f3c9d70 --- /dev/null +++ b/packages/communication/src/messages/outgoing/quest/StartCampaignMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class StartCampaignMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/quest/index.ts b/packages/communication/src/messages/outgoing/quest/index.ts new file mode 100644 index 0000000..e9f5c99 --- /dev/null +++ b/packages/communication/src/messages/outgoing/quest/index.ts @@ -0,0 +1,16 @@ +export * from './AcceptQuestMessageComposer'; +export * from './ActivateQuestMessageComposer'; +export * from './CancelQuestMessageComposer'; +export * from './FriendRequestQuestCompleteMessageComposer'; +export * from './GetCommunityGoalEarnedPrizesMessageComposer'; +export * from './GetCommunityGoalHallOfFameMessageComposer'; +export * from './GetCommunityGoalProgressMessageComposer'; +export * from './GetConcurrentUsersGoalProgressMessageComposer'; +export * from './GetConcurrentUsersRewardMessageComposer'; +export * from './GetDailyQuestMessageComposer'; +export * from './GetQuestsMessageComposer'; +export * from './GetSeasonalQuestsOnlyMessageComposer'; +export * from './OpenQuestTrackerMessageComposer'; +export * from './RedeemCommunityGoalPrizeMessageComposer'; +export * from './RejectQuestMessageComposer'; +export * from './StartCampaignMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/recycler/GetRecyclerStatusMessageComposer.ts b/packages/communication/src/messages/outgoing/recycler/GetRecyclerStatusMessageComposer.ts new file mode 100644 index 0000000..2a6d74b --- /dev/null +++ b/packages/communication/src/messages/outgoing/recycler/GetRecyclerStatusMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetRecyclerStatusMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/recycler/RecycleItemsMessageComposer.ts b/packages/communication/src/messages/outgoing/recycler/RecycleItemsMessageComposer.ts new file mode 100644 index 0000000..1b0fdbb --- /dev/null +++ b/packages/communication/src/messages/outgoing/recycler/RecycleItemsMessageComposer.ts @@ -0,0 +1,31 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RecycleItemsMessageComposer implements IMessageComposer +{ + private _data: any; + + constructor(...data: RecycleItemsEntry[]) + { + this._data = [data.length]; + data.forEach(entry => + { + this._data.push(entry.itemId); + }); + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} + +export class RecycleItemsEntry +{ + constructor(public itemId: number) + { } +} diff --git a/packages/communication/src/messages/outgoing/recycler/index.ts b/packages/communication/src/messages/outgoing/recycler/index.ts new file mode 100644 index 0000000..b3fc57c --- /dev/null +++ b/packages/communication/src/messages/outgoing/recycler/index.ts @@ -0,0 +1,2 @@ +export * from './GetRecyclerStatusMessageComposer'; +export * from './RecycleItemsMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/room/RedeemItemClothingComposer.ts b/packages/communication/src/messages/outgoing/room/RedeemItemClothingComposer.ts new file mode 100644 index 0000000..58f5847 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/RedeemItemClothingComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RedeemItemClothingComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(setId: number) + { + this._data = [setId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/access/RoomDoorbellAccessComposer.ts b/packages/communication/src/messages/outgoing/room/access/RoomDoorbellAccessComposer.ts new file mode 100644 index 0000000..a9c31f5 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/access/RoomDoorbellAccessComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomDoorbellAccessComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(user: string, allowedEntry: boolean) + { + this._data = [user, allowedEntry]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/access/RoomEnterComposer.ts b/packages/communication/src/messages/outgoing/room/access/RoomEnterComposer.ts new file mode 100644 index 0000000..a195223 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/access/RoomEnterComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomEnterComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomId: number, password: string = null) + { + this._data = [roomId, password]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/access/index.ts b/packages/communication/src/messages/outgoing/room/access/index.ts new file mode 100644 index 0000000..2025545 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/access/index.ts @@ -0,0 +1,2 @@ +export * from './RoomDoorbellAccessComposer'; +export * from './RoomEnterComposer'; diff --git a/packages/communication/src/messages/outgoing/room/action/RemoveAllRightsMessageComposer.ts b/packages/communication/src/messages/outgoing/room/action/RemoveAllRightsMessageComposer.ts new file mode 100644 index 0000000..f9c25cf --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/action/RemoveAllRightsMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RemoveAllRightsMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomId: number) + { + this._data = [roomId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/action/RoomAmbassadorAlertComposer.ts b/packages/communication/src/messages/outgoing/room/action/RoomAmbassadorAlertComposer.ts new file mode 100644 index 0000000..55d4944 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/action/RoomAmbassadorAlertComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomAmbassadorAlertComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number) + { + this._data = [userId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/action/RoomBanUserComposer.ts b/packages/communication/src/messages/outgoing/room/action/RoomBanUserComposer.ts new file mode 100644 index 0000000..75744a7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/action/RoomBanUserComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomBanUserComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number, roomId: number = 0, type: string) + { + this._data = [userId, roomId, type]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/action/RoomDeleteComposer.ts b/packages/communication/src/messages/outgoing/room/action/RoomDeleteComposer.ts new file mode 100644 index 0000000..95648c5 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/action/RoomDeleteComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomDeleteComposer implements IMessageComposer<[number]> +{ + private _data: [number]; + + constructor(roomId: number) + { + this._data = [roomId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/action/RoomGiveRightsComposer.ts b/packages/communication/src/messages/outgoing/room/action/RoomGiveRightsComposer.ts new file mode 100644 index 0000000..8654eea --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/action/RoomGiveRightsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomGiveRightsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number) + { + this._data = [userId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/action/RoomKickUserComposer.ts b/packages/communication/src/messages/outgoing/room/action/RoomKickUserComposer.ts new file mode 100644 index 0000000..042e4a5 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/action/RoomKickUserComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomKickUserComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number) + { + this._data = [userId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/action/RoomMuteUserComposer.ts b/packages/communication/src/messages/outgoing/room/action/RoomMuteUserComposer.ts new file mode 100644 index 0000000..35277f6 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/action/RoomMuteUserComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomMuteUserComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number, minutes: number, roomId: number = 0) + { + this._data = [userId, roomId, minutes]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/action/RoomTakeRightsComposer.ts b/packages/communication/src/messages/outgoing/room/action/RoomTakeRightsComposer.ts new file mode 100644 index 0000000..2068bf7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/action/RoomTakeRightsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomTakeRightsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(...userIds: number[]) + { + this._data = [userIds.length, ...userIds]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/action/RoomUnbanUserComposer.ts b/packages/communication/src/messages/outgoing/room/action/RoomUnbanUserComposer.ts new file mode 100644 index 0000000..49b80dd --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/action/RoomUnbanUserComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomUnbanUserComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number, roomId: number) + { + this._data = [userId, roomId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/action/index.ts b/packages/communication/src/messages/outgoing/room/action/index.ts new file mode 100644 index 0000000..3846b4a --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/action/index.ts @@ -0,0 +1,9 @@ +export * from './RemoveAllRightsMessageComposer'; +export * from './RoomAmbassadorAlertComposer'; +export * from './RoomBanUserComposer'; +export * from './RoomDeleteComposer'; +export * from './RoomGiveRightsComposer'; +export * from './RoomKickUserComposer'; +export * from './RoomMuteUserComposer'; +export * from './RoomTakeRightsComposer'; +export * from './RoomUnbanUserComposer'; diff --git a/packages/communication/src/messages/outgoing/room/bots/RequestBotConfigurationComposer.ts b/packages/communication/src/messages/outgoing/room/bots/RequestBotConfigurationComposer.ts new file mode 100644 index 0000000..7851651 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/bots/RequestBotConfigurationComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RequestBotCommandConfigurationComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(botId: number, skillId: number) + { + this._data = [botId, skillId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/bots/index.ts b/packages/communication/src/messages/outgoing/room/bots/index.ts new file mode 100644 index 0000000..d4b295a --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/bots/index.ts @@ -0,0 +1 @@ +export * from './RequestBotConfigurationComposer'; diff --git a/packages/communication/src/messages/outgoing/room/data/RoomBannedUsersComposer.ts b/packages/communication/src/messages/outgoing/room/data/RoomBannedUsersComposer.ts new file mode 100644 index 0000000..2a944d9 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/data/RoomBannedUsersComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomBannedUsersComposer implements IMessageComposer<[number]> +{ + private _data: [number]; + + constructor(roomId: number) + { + this._data = [roomId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/data/RoomSettingsComposer.ts b/packages/communication/src/messages/outgoing/room/data/RoomSettingsComposer.ts new file mode 100644 index 0000000..6fb8af1 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/data/RoomSettingsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomSettingsComposer implements IMessageComposer<[number]> +{ + private _data: [number]; + + constructor(roomId: number) + { + this._data = [roomId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/data/RoomUsersWithRightsComposer.ts b/packages/communication/src/messages/outgoing/room/data/RoomUsersWithRightsComposer.ts new file mode 100644 index 0000000..ec2902c --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/data/RoomUsersWithRightsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomUsersWithRightsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomId: number) + { + this._data = [roomId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/data/SaveRoomSettingsComposer.ts b/packages/communication/src/messages/outgoing/room/data/SaveRoomSettingsComposer.ts new file mode 100644 index 0000000..8b69492 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/data/SaveRoomSettingsComposer.ts @@ -0,0 +1,81 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class SaveRoomSettingsComposer +implements + IMessageComposer< + ConstructorParameters + > +{ + private _data: ConstructorParameters; + + constructor( + roomId: number, + roomName: string, + roomDescription: string, + lockState: number, + password: string, + userCount: number, + categoryId: number, + tagsCount: number, + tags: string[], + tradeState: number, + allowPets: boolean, + allowPetsEat: boolean, + allowWalkthrough: boolean, + hideWalls: boolean, + wallThickness: number, + floorThickness: number, + muteState: number, + kickState: number, + banState: number, + chatBubbleMode: number, + chatBubbleWeight: number, + chatBubbleSpeed: number, + chatDistance: number, + chatFloodProtection: number + ) + { + //@ts-ignore + this._data = []; + + this._data.push( + roomId, + roomName, + roomDescription, + lockState, + password, + userCount, + categoryId + ); + + this._data.push(tags.length, ...tags); + + this._data.push( + tradeState, + allowPets, + allowPetsEat, + allowWalkthrough, + hideWalls, + wallThickness, + floorThickness, + muteState, + kickState, + banState, + chatBubbleMode, + chatBubbleWeight, + chatBubbleSpeed, + chatDistance, + chatFloodProtection + ); + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/data/index.ts b/packages/communication/src/messages/outgoing/room/data/index.ts new file mode 100644 index 0000000..27df6c7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/data/index.ts @@ -0,0 +1,4 @@ +export * from './RoomBannedUsersComposer'; +export * from './RoomSettingsComposer'; +export * from './RoomUsersWithRightsComposer'; +export * from './SaveRoomSettingsComposer'; diff --git a/packages/communication/src/messages/outgoing/room/engine/BotPlaceComposer.ts b/packages/communication/src/messages/outgoing/room/engine/BotPlaceComposer.ts new file mode 100644 index 0000000..f658b65 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/engine/BotPlaceComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class BotPlaceComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(botId: number, x: number, y: number) + { + this._data = [botId, x, y]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/engine/BotRemoveComposer.ts b/packages/communication/src/messages/outgoing/room/engine/BotRemoveComposer.ts new file mode 100644 index 0000000..ddead05 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/engine/BotRemoveComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class BotRemoveComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(botId: number) + { + this._data = [botId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/engine/BotSkillSaveComposer.ts b/packages/communication/src/messages/outgoing/room/engine/BotSkillSaveComposer.ts new file mode 100644 index 0000000..c5aca60 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/engine/BotSkillSaveComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class BotSkillSaveComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(botId: number, skill: number, data: string) + { + this._data = [botId, skill, data]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/engine/CompostPlantMessageComposer.ts b/packages/communication/src/messages/outgoing/room/engine/CompostPlantMessageComposer.ts new file mode 100644 index 0000000..bc23ccb --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/engine/CompostPlantMessageComposer.ts @@ -0,0 +1,9 @@ +import { PetMessageComposer } from './PetMessageComposer'; + +export class CompostPlantMessageComposer extends PetMessageComposer +{ + constructor(id: number) + { + super(id); + } +} diff --git a/packages/communication/src/messages/outgoing/room/engine/GetItemDataComposer.ts b/packages/communication/src/messages/outgoing/room/engine/GetItemDataComposer.ts new file mode 100644 index 0000000..11a9f12 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/engine/GetItemDataComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetItemDataComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number) + { + this._data = [itemId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/engine/HarvestPetMessageComposer.ts b/packages/communication/src/messages/outgoing/room/engine/HarvestPetMessageComposer.ts new file mode 100644 index 0000000..8c14acc --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/engine/HarvestPetMessageComposer.ts @@ -0,0 +1,9 @@ +import { PetMessageComposer } from './PetMessageComposer'; + +export class HarvestPetMessageComposer extends PetMessageComposer +{ + constructor(id: number) + { + super(id); + } +} diff --git a/packages/communication/src/messages/outgoing/room/engine/PetMessageComposer.ts b/packages/communication/src/messages/outgoing/room/engine/PetMessageComposer.ts new file mode 100644 index 0000000..27f8ee2 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/engine/PetMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PetMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(id: number) + { + this._data = [id]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/engine/PetMoveComposer.ts b/packages/communication/src/messages/outgoing/room/engine/PetMoveComposer.ts new file mode 100644 index 0000000..f9c2fab --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/engine/PetMoveComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PetMoveComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(petId: number, x: number, y: number, direction: number) + { + this._data = [petId, x, y, direction]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/engine/PetPlaceComposer.ts b/packages/communication/src/messages/outgoing/room/engine/PetPlaceComposer.ts new file mode 100644 index 0000000..4549692 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/engine/PetPlaceComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PetPlaceComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(petId: number, x: number, y: number) + { + this._data = [petId, x, y]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/engine/PetRemoveComposer.ts b/packages/communication/src/messages/outgoing/room/engine/PetRemoveComposer.ts new file mode 100644 index 0000000..b011032 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/engine/PetRemoveComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PetRemoveComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(petId: number) + { + this._data = [petId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/engine/RemoveWallItemComposer.ts b/packages/communication/src/messages/outgoing/room/engine/RemoveWallItemComposer.ts new file mode 100644 index 0000000..ce427b7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/engine/RemoveWallItemComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RemoveWallItemComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number) + { + this._data = [itemId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/engine/SetClothingChangeDataMessageComposer.ts b/packages/communication/src/messages/outgoing/room/engine/SetClothingChangeDataMessageComposer.ts new file mode 100644 index 0000000..742902b --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/engine/SetClothingChangeDataMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class SetClothingChangeDataMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(objectId: number, gender: string, look: string = '') + { + this._data = [objectId, gender, look]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/engine/SetItemDataMessageComposer.ts b/packages/communication/src/messages/outgoing/room/engine/SetItemDataMessageComposer.ts new file mode 100644 index 0000000..6b4a855 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/engine/SetItemDataMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class SetItemDataMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number, colorHex: string, text: string) + { + this._data = [itemId, colorHex, text]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/engine/SetObjectDataMessageComposer.ts b/packages/communication/src/messages/outgoing/room/engine/SetObjectDataMessageComposer.ts new file mode 100644 index 0000000..4915d07 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/engine/SetObjectDataMessageComposer.ts @@ -0,0 +1,23 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class SetObjectDataMessageComposer implements IMessageComposer +{ + private _data: any[]; + + constructor(objectId: number, data: Map) + { + this._data = [objectId, (data.size * 2)]; + + for(const [key, value] of data.entries()) this._data.push(key, value); + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/engine/index.ts b/packages/communication/src/messages/outgoing/room/engine/index.ts new file mode 100644 index 0000000..d8c89dc --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/engine/index.ts @@ -0,0 +1,14 @@ +export * from './BotPlaceComposer'; +export * from './BotRemoveComposer'; +export * from './BotSkillSaveComposer'; +export * from './CompostPlantMessageComposer'; +export * from './GetItemDataComposer'; +export * from './HarvestPetMessageComposer'; +export * from './PetMessageComposer'; +export * from './PetMoveComposer'; +export * from './PetPlaceComposer'; +export * from './PetRemoveComposer'; +export * from './RemoveWallItemComposer'; +export * from './SetClothingChangeDataMessageComposer'; +export * from './SetItemDataMessageComposer'; +export * from './SetObjectDataMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/room/furniture/AddSpamWallPostItMessageComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/AddSpamWallPostItMessageComposer.ts new file mode 100644 index 0000000..31de585 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/AddSpamWallPostItMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class AddSpamWallPostItMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number, location: string, colorHex: string, message: string) + { + this._data = [itemId, location, colorHex, message]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/ExtendRentOrBuyoutFurniMessageComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/ExtendRentOrBuyoutFurniMessageComposer.ts new file mode 100644 index 0000000..b607985 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/ExtendRentOrBuyoutFurniMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ExtendRentOrBuyoutFurniMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(isWall: boolean, roomInstanceId: number, isBuyout: boolean) + { + this._data = [isWall, roomInstanceId, isBuyout]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/ExtendRentOrBuyoutStripItemMessageComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/ExtendRentOrBuyoutStripItemMessageComposer.ts new file mode 100644 index 0000000..d77d9a1 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/ExtendRentOrBuyoutStripItemMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ExtendRentOrBuyoutStripItemMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(stripId: number, isBuyout: boolean) + { + this._data = [stripId, isBuyout]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/FurnitureAliasesComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/FurnitureAliasesComposer.ts new file mode 100644 index 0000000..056bf97 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/FurnitureAliasesComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FurnitureAliasesComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/FurnitureGroupInfoComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/FurnitureGroupInfoComposer.ts new file mode 100644 index 0000000..6e133e6 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/FurnitureGroupInfoComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FurnitureGroupInfoComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(objectId: number, guildId: number) + { + this._data = [objectId, guildId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/FurniturePickupComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/FurniturePickupComposer.ts new file mode 100644 index 0000000..006a64e --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/FurniturePickupComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FurniturePickupComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(category: number, objectId: number) + { + this._data = [category, objectId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/FurniturePlaceComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/FurniturePlaceComposer.ts new file mode 100644 index 0000000..e45b74e --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/FurniturePlaceComposer.ts @@ -0,0 +1,39 @@ +import { IMessageComposer, RoomObjectCategory } from '@nitrots/api'; + +export class FurniturePlaceComposer implements IMessageComposer +{ + private _itemId: number; + private _category: number; + private _wallLocation: string; + private _x: number; + private _y: number; + private _direction: number; + + constructor(itemId: number, category: number, wallLocation: string, x: number, y: number, direction: number) + { + this._itemId = itemId; + this._category = category; + this._wallLocation = wallLocation; + this._x = x; + this._y = y; + this._direction = direction; + } + + public getMessageArray() + { + switch(this._category) + { + case RoomObjectCategory.FLOOR: + return [`${this._itemId} ${this._x} ${this._y} ${this._direction}`]; + case RoomObjectCategory.WALL: + return [`${this._itemId} ${this._wallLocation} `]; + default: + return []; + } + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/FurniturePlacePaintComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/FurniturePlacePaintComposer.ts new file mode 100644 index 0000000..22f8608 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/FurniturePlacePaintComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FurniturePlacePaintComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(furniId: number) + { + this._data = [furniId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/FurniturePostItPlaceComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/FurniturePostItPlaceComposer.ts new file mode 100644 index 0000000..087ecb4 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/FurniturePostItPlaceComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FurniturePostItPlaceComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number, wallLocation: string) + { + this._data = [itemId, wallLocation]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/GetRentOrBuyoutOfferMessageComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/GetRentOrBuyoutOfferMessageComposer.ts new file mode 100644 index 0000000..c7753eb --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/GetRentOrBuyoutOfferMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetRentOrBuyoutOfferMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(isWall: boolean, furnitureFullName: string, isBuyout: boolean) + { + this._data = [isWall, furnitureFullName, isBuyout]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/OpenMysteryTrophyMessageComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/OpenMysteryTrophyMessageComposer.ts new file mode 100644 index 0000000..e406a6e --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/OpenMysteryTrophyMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class OpenMysteryTrophyMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(objectId: number, text: string) + { + this._data = [objectId, text]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/OpenPetPackageMessageComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/OpenPetPackageMessageComposer.ts new file mode 100644 index 0000000..4de2ad8 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/OpenPetPackageMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class OpenPetPackageMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(objectId: number, petName: string) + { + this._data = [objectId, petName]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/OpenWelcomeGiftComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/OpenWelcomeGiftComposer.ts new file mode 100644 index 0000000..cd1ecc3 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/OpenWelcomeGiftComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class OpenWelcomeGiftComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(furniId: number) + { + this._data = [furniId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/RentableSpaceCancelRentMessageComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/RentableSpaceCancelRentMessageComposer.ts new file mode 100644 index 0000000..2c8715d --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/RentableSpaceCancelRentMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RentableSpaceCancelRentMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number) + { + this._data = [itemId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/RentableSpaceRentMessageComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/RentableSpaceRentMessageComposer.ts new file mode 100644 index 0000000..d75efca --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/RentableSpaceRentMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RentableSpaceRentMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number) + { + this._data = [itemId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/RentableSpaceStatusMessageComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/RentableSpaceStatusMessageComposer.ts new file mode 100644 index 0000000..fe31e36 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/RentableSpaceStatusMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RentableSpaceStatusMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number) + { + this._data = [itemId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/dimmer/MoodlightSettingsComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/dimmer/MoodlightSettingsComposer.ts new file mode 100644 index 0000000..cc7c715 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/dimmer/MoodlightSettingsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class MoodlightSettingsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/dimmer/MoodlightSettingsSaveComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/dimmer/MoodlightSettingsSaveComposer.ts new file mode 100644 index 0000000..3dfd717 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/dimmer/MoodlightSettingsSaveComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class MoodlightSettingsSaveComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, arg2: number, arg3: string, arg4: number, arg5: boolean) + { + this._data = [k, arg2, arg3, arg4, arg5]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/dimmer/MoodlightTogggleStateComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/dimmer/MoodlightTogggleStateComposer.ts new file mode 100644 index 0000000..df59f1c --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/dimmer/MoodlightTogggleStateComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class MoodlightTogggleStateComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/dimmer/index.ts b/packages/communication/src/messages/outgoing/room/furniture/dimmer/index.ts new file mode 100644 index 0000000..842aa30 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/dimmer/index.ts @@ -0,0 +1,3 @@ +export * from './MoodlightSettingsComposer'; +export * from './MoodlightSettingsSaveComposer'; +export * from './MoodlightTogggleStateComposer'; diff --git a/packages/communication/src/messages/outgoing/room/furniture/floor/FurnitureFloorUpdateComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/floor/FurnitureFloorUpdateComposer.ts new file mode 100644 index 0000000..98d8ae5 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/floor/FurnitureFloorUpdateComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FurnitureFloorUpdateComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number, x: number, y: number, direction: number) + { + this._data = [itemId, x, y, direction]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/floor/index.ts b/packages/communication/src/messages/outgoing/room/furniture/floor/index.ts new file mode 100644 index 0000000..8dde729 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/floor/index.ts @@ -0,0 +1 @@ +export * from './FurnitureFloorUpdateComposer'; diff --git a/packages/communication/src/messages/outgoing/room/furniture/index.ts b/packages/communication/src/messages/outgoing/room/furniture/index.ts new file mode 100644 index 0000000..c8fb636 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/index.ts @@ -0,0 +1,24 @@ +export * from './AddSpamWallPostItMessageComposer'; +export * from './dimmer'; +export * from './ExtendRentOrBuyoutFurniMessageComposer'; +export * from './ExtendRentOrBuyoutStripItemMessageComposer'; +export * from './floor'; +export * from './FurnitureAliasesComposer'; +export * from './FurnitureGroupInfoComposer'; +export * from './FurniturePickupComposer'; +export * from './FurniturePlaceComposer'; +export * from './FurniturePlacePaintComposer'; +export * from './FurniturePostItPlaceComposer'; +export * from './GetRentOrBuyoutOfferMessageComposer'; +export * from './logic'; +export * from './mannequin'; +export * from './OpenMysteryTrophyMessageComposer'; +export * from './OpenPetPackageMessageComposer'; +export * from './OpenWelcomeGiftComposer'; +export * from './presents'; +export * from './RentableSpaceCancelRentMessageComposer'; +export * from './RentableSpaceRentMessageComposer'; +export * from './RentableSpaceStatusMessageComposer'; +export * from './toner'; +export * from './wall'; +export * from './youtube'; diff --git a/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureColorWheelComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureColorWheelComposer.ts new file mode 100644 index 0000000..1b95091 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureColorWheelComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FurnitureColorWheelComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number) + { + this._data = [itemId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureDiceActivateComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureDiceActivateComposer.ts new file mode 100644 index 0000000..73361f4 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureDiceActivateComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FurnitureDiceActivateComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number) + { + this._data = [itemId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureDiceDeactivateComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureDiceDeactivateComposer.ts new file mode 100644 index 0000000..48ea006 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureDiceDeactivateComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FurnitureDiceDeactivateComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number) + { + this._data = [itemId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureExchangeComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureExchangeComposer.ts new file mode 100644 index 0000000..5b017df --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureExchangeComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FurnitureExchangeComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number) + { + this._data = [itemId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureMultiStateComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureMultiStateComposer.ts new file mode 100644 index 0000000..4c149fe --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureMultiStateComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FurnitureMultiStateComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number, state: number = 0) + { + this._data = [itemId, state]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureOneWayDoorComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureOneWayDoorComposer.ts new file mode 100644 index 0000000..e405984 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureOneWayDoorComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FurnitureOneWayDoorComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number) + { + this._data = [itemId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureRandomStateComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureRandomStateComposer.ts new file mode 100644 index 0000000..b4327a8 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureRandomStateComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FurnitureRandomStateComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number, state: number) + { + this._data = [itemId, state]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureStackHeightComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureStackHeightComposer.ts new file mode 100644 index 0000000..95d9033 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureStackHeightComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FurnitureStackHeightComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number, height: number = -100) + { + this._data = [itemId, height]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureWallMultiStateComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureWallMultiStateComposer.ts new file mode 100644 index 0000000..a7159e5 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/logic/FurnitureWallMultiStateComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FurnitureWallMultiStateComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number, state: number) + { + this._data = [itemId, state]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/logic/index.ts b/packages/communication/src/messages/outgoing/room/furniture/logic/index.ts new file mode 100644 index 0000000..838e338 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/logic/index.ts @@ -0,0 +1,9 @@ +export * from './FurnitureColorWheelComposer'; +export * from './FurnitureDiceActivateComposer'; +export * from './FurnitureDiceDeactivateComposer'; +export * from './FurnitureExchangeComposer'; +export * from './FurnitureMultiStateComposer'; +export * from './FurnitureOneWayDoorComposer'; +export * from './FurnitureRandomStateComposer'; +export * from './FurnitureStackHeightComposer'; +export * from './FurnitureWallMultiStateComposer'; diff --git a/packages/communication/src/messages/outgoing/room/furniture/mannequin/FurnitureMannequinSaveLookComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/mannequin/FurnitureMannequinSaveLookComposer.ts new file mode 100644 index 0000000..6d199e9 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/mannequin/FurnitureMannequinSaveLookComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FurnitureMannequinSaveLookComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/mannequin/FurnitureMannequinSaveNameComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/mannequin/FurnitureMannequinSaveNameComposer.ts new file mode 100644 index 0000000..d470b57 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/mannequin/FurnitureMannequinSaveNameComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FurnitureMannequinSaveNameComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number, name: string) + { + this._data = [itemId, name]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/mannequin/index.ts b/packages/communication/src/messages/outgoing/room/furniture/mannequin/index.ts new file mode 100644 index 0000000..ed49256 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/mannequin/index.ts @@ -0,0 +1,2 @@ +export * from './FurnitureMannequinSaveLookComposer'; +export * from './FurnitureMannequinSaveNameComposer'; diff --git a/packages/communication/src/messages/outgoing/room/furniture/presents/OpenPresentComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/presents/OpenPresentComposer.ts new file mode 100644 index 0000000..8c1e878 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/presents/OpenPresentComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class OpenPresentComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/presents/index.ts b/packages/communication/src/messages/outgoing/room/furniture/presents/index.ts new file mode 100644 index 0000000..d0d4ced --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/presents/index.ts @@ -0,0 +1 @@ +export * from './OpenPresentComposer'; diff --git a/packages/communication/src/messages/outgoing/room/furniture/toner/ApplyTonerComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/toner/ApplyTonerComposer.ts new file mode 100644 index 0000000..02a9f7f --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/toner/ApplyTonerComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ApplyTonerComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, arg2: number, arg3: number, arg4: number) + { + this._data = [k, arg2, arg3, arg4]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/toner/index.ts b/packages/communication/src/messages/outgoing/room/furniture/toner/index.ts new file mode 100644 index 0000000..f8e9d81 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/toner/index.ts @@ -0,0 +1 @@ +export * from './ApplyTonerComposer'; diff --git a/packages/communication/src/messages/outgoing/room/furniture/wall/FurnitureWallUpdateComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/wall/FurnitureWallUpdateComposer.ts new file mode 100644 index 0000000..a38dd0a --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/wall/FurnitureWallUpdateComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class FurnitureWallUpdateComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(itemId: number, location: string) + { + this._data = [itemId, location]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/wall/index.ts b/packages/communication/src/messages/outgoing/room/furniture/wall/index.ts new file mode 100644 index 0000000..75abfb7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/wall/index.ts @@ -0,0 +1 @@ +export * from './FurnitureWallUpdateComposer'; diff --git a/packages/communication/src/messages/outgoing/room/furniture/youtube/ControlYoutubeDisplayPlaybackMessageComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/youtube/ControlYoutubeDisplayPlaybackMessageComposer.ts new file mode 100644 index 0000000..f3dc474 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/youtube/ControlYoutubeDisplayPlaybackMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ControlYoutubeDisplayPlaybackMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number) + { + this._data = [k, _arg_2]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/youtube/GetYoutubeDisplayStatusMessageComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/youtube/GetYoutubeDisplayStatusMessageComposer.ts new file mode 100644 index 0000000..c4ed921 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/youtube/GetYoutubeDisplayStatusMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetYoutubeDisplayStatusMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/youtube/SetYoutubeDisplayPlaylistMessageComposer.ts b/packages/communication/src/messages/outgoing/room/furniture/youtube/SetYoutubeDisplayPlaylistMessageComposer.ts new file mode 100644 index 0000000..55d1840 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/youtube/SetYoutubeDisplayPlaylistMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class SetYoutubeDisplayPlaylistMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: string) + { + this._data = [k, _arg_2]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/furniture/youtube/index.ts b/packages/communication/src/messages/outgoing/room/furniture/youtube/index.ts new file mode 100644 index 0000000..c72bc63 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/furniture/youtube/index.ts @@ -0,0 +1,3 @@ +export * from './ControlYoutubeDisplayPlaybackMessageComposer'; +export * from './GetYoutubeDisplayStatusMessageComposer'; +export * from './SetYoutubeDisplayPlaylistMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/room/index.ts b/packages/communication/src/messages/outgoing/room/index.ts new file mode 100644 index 0000000..0067ee0 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/index.ts @@ -0,0 +1,19 @@ +export * from './access'; +export * from './action'; +export * from './bots'; +export * from './data'; +export * from './engine'; +export * from './furniture'; +export * from './furniture/dimmer'; +export * from './furniture/floor'; +export * from './furniture/logic'; +export * from './furniture/mannequin'; +export * from './furniture/presents'; +export * from './furniture/toner'; +export * from './furniture/wall'; +export * from './furniture/youtube'; +export * from './layout'; +export * from './RedeemItemClothingComposer'; +export * from './session'; +export * from './unit'; +export * from './unit/chat'; diff --git a/packages/communication/src/messages/outgoing/room/layout/GetOccupiedTilesMessageComposer.ts b/packages/communication/src/messages/outgoing/room/layout/GetOccupiedTilesMessageComposer.ts new file mode 100644 index 0000000..1836f3d --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/layout/GetOccupiedTilesMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetOccupiedTilesMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/layout/GetRoomEntryDataMessageComposer.ts b/packages/communication/src/messages/outgoing/room/layout/GetRoomEntryDataMessageComposer.ts new file mode 100644 index 0000000..8252616 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/layout/GetRoomEntryDataMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetRoomEntryDataMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/layout/GetRoomEntryTileMessageComposer.ts b/packages/communication/src/messages/outgoing/room/layout/GetRoomEntryTileMessageComposer.ts new file mode 100644 index 0000000..604b893 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/layout/GetRoomEntryTileMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetRoomEntryTileMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/layout/UpdateFloorPropertiesMessageComposer.ts b/packages/communication/src/messages/outgoing/room/layout/UpdateFloorPropertiesMessageComposer.ts new file mode 100644 index 0000000..44b48d3 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/layout/UpdateFloorPropertiesMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UpdateFloorPropertiesMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(model: string, doorX: number, doorY: number, doorDirection: number, thicknessWall: number, thicknessFloor: number, wallHeight: number) + { + this._data = [model, doorX, doorY, doorDirection, thicknessWall, thicknessFloor, wallHeight]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/layout/index.ts b/packages/communication/src/messages/outgoing/room/layout/index.ts new file mode 100644 index 0000000..e8a3d7c --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/layout/index.ts @@ -0,0 +1,4 @@ +export * from './GetOccupiedTilesMessageComposer'; +export * from './GetRoomEntryDataMessageComposer'; +export * from './GetRoomEntryTileMessageComposer'; +export * from './UpdateFloorPropertiesMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/room/pets/BreedPetsMessageComposer.ts b/packages/communication/src/messages/outgoing/room/pets/BreedPetsMessageComposer.ts new file mode 100644 index 0000000..cfb2cf4 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/pets/BreedPetsMessageComposer.ts @@ -0,0 +1,25 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class BreedPetsMessageComposer implements IMessageComposer> +{ + public static readonly STATE_START: number = 0; + public static readonly STATE_CANCEL: number = 1; + public static readonly STATE_ACCEPT: number = 2; + + private _data: ConstructorParameters; + + constructor(state: number, petOneId: number, petTwoId: number) + { + this._data = [state, petOneId, petTwoId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/pets/PetSelectedMessageComposer.ts b/packages/communication/src/messages/outgoing/room/pets/PetSelectedMessageComposer.ts new file mode 100644 index 0000000..1095897 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/pets/PetSelectedMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PetSelectedMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(petId: number) + { + this._data = [petId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/pets/index.ts b/packages/communication/src/messages/outgoing/room/pets/index.ts new file mode 100644 index 0000000..e53e7a0 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/pets/index.ts @@ -0,0 +1,2 @@ +export * from './BreedPetsMessageComposer'; +export * from './PetSelectedMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/room/session/ChangeQueueMessageComposer.ts b/packages/communication/src/messages/outgoing/room/session/ChangeQueueMessageComposer.ts new file mode 100644 index 0000000..520461f --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/session/ChangeQueueMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ChangeQueueMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(targetQueue: number) + { + this._data = [targetQueue]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/session/GoToFlatMessageComposer.ts b/packages/communication/src/messages/outgoing/room/session/GoToFlatMessageComposer.ts new file mode 100644 index 0000000..bca45c5 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/session/GoToFlatMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GoToFlatMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomId: number) + { + this._data = [roomId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/session/index.ts b/packages/communication/src/messages/outgoing/room/session/index.ts new file mode 100644 index 0000000..990e23c --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/session/index.ts @@ -0,0 +1,2 @@ +export * from './ChangeQueueMessageComposer'; +export * from './GoToFlatMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/room/unit/RoomUnitActionComposer.ts b/packages/communication/src/messages/outgoing/room/unit/RoomUnitActionComposer.ts new file mode 100644 index 0000000..f5f0220 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/unit/RoomUnitActionComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomUnitActionComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(actionType: number) + { + this._data = [actionType]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/unit/RoomUnitDanceComposer.ts b/packages/communication/src/messages/outgoing/room/unit/RoomUnitDanceComposer.ts new file mode 100644 index 0000000..de43db9 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/unit/RoomUnitDanceComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomUnitDanceComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(danceType: number) + { + this._data = [danceType]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/unit/RoomUnitDropHandItemComposer.ts b/packages/communication/src/messages/outgoing/room/unit/RoomUnitDropHandItemComposer.ts new file mode 100644 index 0000000..ffccd2a --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/unit/RoomUnitDropHandItemComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomUnitDropHandItemComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/unit/RoomUnitGiveHandItemComposer.ts b/packages/communication/src/messages/outgoing/room/unit/RoomUnitGiveHandItemComposer.ts new file mode 100644 index 0000000..713221c --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/unit/RoomUnitGiveHandItemComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomUnitGiveHandItemComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(unitId: number) + { + this._data = [unitId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/unit/RoomUnitGiveHandItemPetComposer.ts b/packages/communication/src/messages/outgoing/room/unit/RoomUnitGiveHandItemPetComposer.ts new file mode 100644 index 0000000..4f4a621 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/unit/RoomUnitGiveHandItemPetComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomUnitGiveHandItemPetComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(unitId: number) + { + this._data = [unitId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/unit/RoomUnitLookComposer.ts b/packages/communication/src/messages/outgoing/room/unit/RoomUnitLookComposer.ts new file mode 100644 index 0000000..ac3858c --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/unit/RoomUnitLookComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomUnitLookComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(x: number, y: number) + { + this._data = [x, y]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/unit/RoomUnitPostureComposer.ts b/packages/communication/src/messages/outgoing/room/unit/RoomUnitPostureComposer.ts new file mode 100644 index 0000000..902a6d2 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/unit/RoomUnitPostureComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomUnitPostureComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(posture: number) + { + this._data = [posture]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/unit/RoomUnitSignComposer.ts b/packages/communication/src/messages/outgoing/room/unit/RoomUnitSignComposer.ts new file mode 100644 index 0000000..0ac0e16 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/unit/RoomUnitSignComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomUnitSignComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(signType: number) + { + this._data = [signType]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/unit/RoomUnitWalkComposer.ts b/packages/communication/src/messages/outgoing/room/unit/RoomUnitWalkComposer.ts new file mode 100644 index 0000000..760e2b8 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/unit/RoomUnitWalkComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomUnitWalkComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(x: number, y: number) + { + this._data = [x, y]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/unit/chat/RoomUnitChatComposer.ts b/packages/communication/src/messages/outgoing/room/unit/chat/RoomUnitChatComposer.ts new file mode 100644 index 0000000..420d920 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/unit/chat/RoomUnitChatComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomUnitChatComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(message: string, styleId: number = 0) + { + this._data = [message, styleId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/unit/chat/RoomUnitChatShoutComposer.ts b/packages/communication/src/messages/outgoing/room/unit/chat/RoomUnitChatShoutComposer.ts new file mode 100644 index 0000000..6aa2265 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/unit/chat/RoomUnitChatShoutComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomUnitChatShoutComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(message: string, styleId: number) + { + this._data = [message, styleId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/unit/chat/RoomUnitChatStyleComposer.ts b/packages/communication/src/messages/outgoing/room/unit/chat/RoomUnitChatStyleComposer.ts new file mode 100644 index 0000000..482f0fe --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/unit/chat/RoomUnitChatStyleComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomUnitChatStyleComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(styleId: number) + { + this._data = [styleId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/unit/chat/RoomUnitChatWhisperComposer.ts b/packages/communication/src/messages/outgoing/room/unit/chat/RoomUnitChatWhisperComposer.ts new file mode 100644 index 0000000..8e02aff --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/unit/chat/RoomUnitChatWhisperComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomUnitChatWhisperComposer implements IMessageComposer<[string, number]> +{ + private _data: [string, number]; + + constructor(recipientName: string, message: string, styleId: number) + { + this._data = [(recipientName + ' ' + message), styleId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/unit/chat/RoomUnitTypingStartComposer.ts b/packages/communication/src/messages/outgoing/room/unit/chat/RoomUnitTypingStartComposer.ts new file mode 100644 index 0000000..1e4d635 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/unit/chat/RoomUnitTypingStartComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomUnitTypingStartComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/unit/chat/RoomUnitTypingStopComposer.ts b/packages/communication/src/messages/outgoing/room/unit/chat/RoomUnitTypingStopComposer.ts new file mode 100644 index 0000000..fad82a0 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/unit/chat/RoomUnitTypingStopComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomUnitTypingStopComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/room/unit/chat/index.ts b/packages/communication/src/messages/outgoing/room/unit/chat/index.ts new file mode 100644 index 0000000..6e53b78 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/unit/chat/index.ts @@ -0,0 +1,6 @@ +export * from './RoomUnitChatComposer'; +export * from './RoomUnitChatShoutComposer'; +export * from './RoomUnitChatStyleComposer'; +export * from './RoomUnitChatWhisperComposer'; +export * from './RoomUnitTypingStartComposer'; +export * from './RoomUnitTypingStopComposer'; diff --git a/packages/communication/src/messages/outgoing/room/unit/index.ts b/packages/communication/src/messages/outgoing/room/unit/index.ts new file mode 100644 index 0000000..52a7296 --- /dev/null +++ b/packages/communication/src/messages/outgoing/room/unit/index.ts @@ -0,0 +1,10 @@ +export * from './chat'; +export * from './RoomUnitActionComposer'; +export * from './RoomUnitDanceComposer'; +export * from './RoomUnitDropHandItemComposer'; +export * from './RoomUnitGiveHandItemComposer'; +export * from './RoomUnitGiveHandItemPetComposer'; +export * from './RoomUnitLookComposer'; +export * from './RoomUnitPostureComposer'; +export * from './RoomUnitSignComposer'; +export * from './RoomUnitWalkComposer'; diff --git a/packages/communication/src/messages/outgoing/roomdirectory/RoomNetworkOpenConnectionMessageComposer.ts b/packages/communication/src/messages/outgoing/roomdirectory/RoomNetworkOpenConnectionMessageComposer.ts new file mode 100644 index 0000000..5464bfd --- /dev/null +++ b/packages/communication/src/messages/outgoing/roomdirectory/RoomNetworkOpenConnectionMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomNetworkOpenConnectionMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number) + { + this._data = [k, _arg_2]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/roomdirectory/index.ts b/packages/communication/src/messages/outgoing/roomdirectory/index.ts new file mode 100644 index 0000000..4899347 --- /dev/null +++ b/packages/communication/src/messages/outgoing/roomdirectory/index.ts @@ -0,0 +1 @@ +export * from './RoomNetworkOpenConnectionMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/roomevents/ApplySnapshotMessageComposer.ts b/packages/communication/src/messages/outgoing/roomevents/ApplySnapshotMessageComposer.ts new file mode 100644 index 0000000..17c1fdd --- /dev/null +++ b/packages/communication/src/messages/outgoing/roomevents/ApplySnapshotMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ApplySnapshotMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(id: number) + { + this._data = [id]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/roomevents/OpenMessageComposer.ts b/packages/communication/src/messages/outgoing/roomevents/OpenMessageComposer.ts new file mode 100644 index 0000000..c32e5a0 --- /dev/null +++ b/packages/communication/src/messages/outgoing/roomevents/OpenMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class OpenMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(id: number) + { + this._data = [id]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/roomevents/RoomMuteComposer.ts b/packages/communication/src/messages/outgoing/roomevents/RoomMuteComposer.ts new file mode 100644 index 0000000..7333076 --- /dev/null +++ b/packages/communication/src/messages/outgoing/roomevents/RoomMuteComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomMuteComposer implements IMessageComposer +{ + private _data: unknown[]; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/roomevents/UpdateActionMessageComposer.ts b/packages/communication/src/messages/outgoing/roomevents/UpdateActionMessageComposer.ts new file mode 100644 index 0000000..b08dbd3 --- /dev/null +++ b/packages/communication/src/messages/outgoing/roomevents/UpdateActionMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UpdateActionMessageComposer implements IMessageComposer +{ + private _data: unknown[]; + + constructor(id: number, ints: number[], string: string, stuffs: number[], delay: number, selectionCode: number) + { + this._data = [id, ints.length, ...ints, string, stuffs.length, ...stuffs, delay, selectionCode]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/roomevents/UpdateConditionMessageComposer.ts b/packages/communication/src/messages/outgoing/roomevents/UpdateConditionMessageComposer.ts new file mode 100644 index 0000000..35b3a60 --- /dev/null +++ b/packages/communication/src/messages/outgoing/roomevents/UpdateConditionMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UpdateConditionMessageComposer implements IMessageComposer +{ + private _data: unknown[]; + + constructor(id: number, ints: number[], string: string, stuffs: number[], selectionCode: number) + { + this._data = [id, ints.length, ...ints, string, stuffs.length, ...stuffs, selectionCode]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/roomevents/UpdateTriggerMessageComposer.ts b/packages/communication/src/messages/outgoing/roomevents/UpdateTriggerMessageComposer.ts new file mode 100644 index 0000000..21359f6 --- /dev/null +++ b/packages/communication/src/messages/outgoing/roomevents/UpdateTriggerMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UpdateTriggerMessageComposer implements IMessageComposer +{ + private _data: unknown[]; + + constructor(id: number, ints: number[], string: string, stuffs: number[], selectionCode: number) + { + this._data = [id, ints.length, ...ints, string, stuffs.length, ...stuffs, selectionCode]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/roomevents/index.ts b/packages/communication/src/messages/outgoing/roomevents/index.ts new file mode 100644 index 0000000..9c4372e --- /dev/null +++ b/packages/communication/src/messages/outgoing/roomevents/index.ts @@ -0,0 +1,6 @@ +export * from './ApplySnapshotMessageComposer'; +export * from './OpenMessageComposer'; +export * from './RoomMuteComposer'; +export * from './UpdateActionMessageComposer'; +export * from './UpdateConditionMessageComposer'; +export * from './UpdateTriggerMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/roomsettings/SaveableRoomSettingsData.ts b/packages/communication/src/messages/outgoing/roomsettings/SaveableRoomSettingsData.ts new file mode 100644 index 0000000..521045e --- /dev/null +++ b/packages/communication/src/messages/outgoing/roomsettings/SaveableRoomSettingsData.ts @@ -0,0 +1,267 @@ +export class SaveableRoomSettingsData +{ + private _roomId: number; + private _name: string; + private _description: string; + private _doorMode: number; + private _password: string; + private _categoryId: number; + private _maximumVisitors: number; + private _tags: string[]; + private _tradeMode: number; + private _allowPets: boolean; + private _allowFoodConsume: boolean; + private _allowWalkThrough: boolean; + private _allowNavigatorDynCats: boolean; + private _hideWalls: boolean; + private _wallThickness: number; + private _floorThickness: number; + private _whoCanMute: number; + private _whoCanKick: number; + private _whoCanBan: number; + private _chatMode: number; + private _chatBubbleSize: number; + private _chatScrollUpFrequency: number; + private _chatFullHearRange: number; + private _chatFloodSensitivity: number; + + public get tradeMode(): number + { + return this._tradeMode; + } + + public set tradeMode(mode: number) + { + this._tradeMode = mode; + } + + public get allowPets(): boolean + { + return this._allowPets; + } + + public set allowPets(flag: boolean) + { + this._allowPets = flag; + } + + public get allowFoodConsume(): boolean + { + return this._allowFoodConsume; + } + + public set allowFoodConsume(flag: boolean) + { + this._allowFoodConsume = flag; + } + + public get allowWalkThrough(): boolean + { + return this._allowWalkThrough; + } + + public set allowWalkThrough(flag: boolean) + { + this._allowWalkThrough = flag; + } + + public get hideWalls(): boolean + { + return this._hideWalls; + } + + public set hideWalls(flag: boolean) + { + this._hideWalls = flag; + } + + public get wallThickness(): number + { + return this._wallThickness; + } + + public set wallThickness(thickness: number) + { + this._wallThickness = thickness; + } + + public get floorThickness(): number + { + return this._floorThickness; + } + + public set floorThickness(thickness: number) + { + this._floorThickness = thickness; + } + + public get roomId(): number + { + return this._roomId; + } + + public set roomId(id: number) + { + this._roomId = id; + } + + public get name(): string + { + return this._name; + } + + public set name(name: string) + { + this._name = name; + } + + public get description(): string + { + return this._description; + } + + public set description(description: string) + { + this._description = description; + } + + public get doorMode(): number + { + return this._doorMode; + } + + public set doorMode(mode: number) + { + this._doorMode = mode; + } + + public get password(): string + { + return this._password; + } + + public set password(password: string) + { + this._password = password; + } + + public get categoryId(): number + { + return this._categoryId; + } + + public set categoryId(id: number) + { + this._categoryId = id; + } + + public get maximumVisitors(): number + { + return this._maximumVisitors; + } + + public set maximumVisitors(max: number) + { + this._maximumVisitors = max; + } + + public get tags(): string[] + { + return this._tags; + } + + public set tags(tags: string[]) + { + this._tags = tags; + } + + public get whoCanMute(): number + { + return this._whoCanMute; + } + + public set whoCanMute(mute: number) + { + this._whoCanMute = mute; + } + + public get whoCanKick(): number + { + return this._whoCanKick; + } + + public set whoCanKick(kick: number) + { + this._whoCanKick = kick; + } + + public get whoCanBan(): number + { + return this._whoCanBan; + } + + public set whoCanBan(ban: number) + { + this._whoCanBan = ban; + } + + public get chatMode(): number + { + return this._chatMode; + } + + public set chatMode(mode: number) + { + this._chatMode = mode; + } + + public get chatBubbleSize(): number + { + return this._chatBubbleSize; + } + + public set chatBubbleSize(size: number) + { + this._chatBubbleSize = size; + } + + public get chatScrollUpFrequency(): number + { + return this._chatScrollUpFrequency; + } + + public set chatScrollUpFrequency(frequency: number) + { + this._chatScrollUpFrequency = frequency; + } + + public get chatFullHearRange(): number + { + return this._chatFullHearRange; + } + + public set chatFullHearRange(range: number) + { + this._chatFullHearRange = range; + } + + public get chatFloodSensitivity(): number + { + return this._chatFloodSensitivity; + } + + public set chatFloodSensitivity(sensitivity: number) + { + this._chatFloodSensitivity = sensitivity; + } + + public get allowNavigatorDynCats(): boolean + { + return this._allowNavigatorDynCats; + } + + public set allowNavigatorDynCats(flag: boolean) + { + this._allowNavigatorDynCats = flag; + } +} diff --git a/packages/communication/src/messages/outgoing/roomsettings/UpdateRoomCategoryAndTradeSettingsComposer.ts b/packages/communication/src/messages/outgoing/roomsettings/UpdateRoomCategoryAndTradeSettingsComposer.ts new file mode 100644 index 0000000..5e376f3 --- /dev/null +++ b/packages/communication/src/messages/outgoing/roomsettings/UpdateRoomCategoryAndTradeSettingsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UpdateRoomCategoryAndTradeSettingsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg_2: number, _arg_3: number) + { + this._data = [k, _arg_2, _arg_3]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/roomsettings/index.ts b/packages/communication/src/messages/outgoing/roomsettings/index.ts new file mode 100644 index 0000000..21363c6 --- /dev/null +++ b/packages/communication/src/messages/outgoing/roomsettings/index.ts @@ -0,0 +1,2 @@ +export * from './SaveableRoomSettingsData'; +export * from './UpdateRoomCategoryAndTradeSettingsComposer'; diff --git a/packages/communication/src/messages/outgoing/sound/AddJukeboxDiskComposer.ts b/packages/communication/src/messages/outgoing/sound/AddJukeboxDiskComposer.ts new file mode 100644 index 0000000..d4ce8ad --- /dev/null +++ b/packages/communication/src/messages/outgoing/sound/AddJukeboxDiskComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class AddJukeboxDiskComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, _arg2: number) + { + this._data = [k, _arg2]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/sound/GetJukeboxPlayListMessageComposer.ts b/packages/communication/src/messages/outgoing/sound/GetJukeboxPlayListMessageComposer.ts new file mode 100644 index 0000000..d889ae7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/sound/GetJukeboxPlayListMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetJukeboxPlayListMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/sound/GetNowPlayingMessageComposer.ts b/packages/communication/src/messages/outgoing/sound/GetNowPlayingMessageComposer.ts new file mode 100644 index 0000000..fffa9ed --- /dev/null +++ b/packages/communication/src/messages/outgoing/sound/GetNowPlayingMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetNowPlayingMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/sound/GetOfficialSongIdMessageComposer.ts b/packages/communication/src/messages/outgoing/sound/GetOfficialSongIdMessageComposer.ts new file mode 100644 index 0000000..d2de163 --- /dev/null +++ b/packages/communication/src/messages/outgoing/sound/GetOfficialSongIdMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetOfficialSongIdMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: string) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/sound/GetSongInfoMessageComposer.ts b/packages/communication/src/messages/outgoing/sound/GetSongInfoMessageComposer.ts new file mode 100644 index 0000000..ea18589 --- /dev/null +++ b/packages/communication/src/messages/outgoing/sound/GetSongInfoMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetSongInfoMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(...args: number[]) + { + this._data = [args.length].concat(args); + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/sound/GetSoundMachinePlayListMessageComposer.ts b/packages/communication/src/messages/outgoing/sound/GetSoundMachinePlayListMessageComposer.ts new file mode 100644 index 0000000..2c61be6 --- /dev/null +++ b/packages/communication/src/messages/outgoing/sound/GetSoundMachinePlayListMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetSoundMachinePlayListMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/sound/GetSoundSettingsComposer.ts b/packages/communication/src/messages/outgoing/sound/GetSoundSettingsComposer.ts new file mode 100644 index 0000000..f8cf55f --- /dev/null +++ b/packages/communication/src/messages/outgoing/sound/GetSoundSettingsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetSoundSettingsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/sound/GetUserSongDisksMessageComposer.ts b/packages/communication/src/messages/outgoing/sound/GetUserSongDisksMessageComposer.ts new file mode 100644 index 0000000..677dad6 --- /dev/null +++ b/packages/communication/src/messages/outgoing/sound/GetUserSongDisksMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetUserSongDisksMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/sound/RemoveJukeboxDiskComposer.ts b/packages/communication/src/messages/outgoing/sound/RemoveJukeboxDiskComposer.ts new file mode 100644 index 0000000..93d14cf --- /dev/null +++ b/packages/communication/src/messages/outgoing/sound/RemoveJukeboxDiskComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RemoveJukeboxDiskComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number) + { + this._data = [k]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/sound/index.ts b/packages/communication/src/messages/outgoing/sound/index.ts new file mode 100644 index 0000000..bb1dffd --- /dev/null +++ b/packages/communication/src/messages/outgoing/sound/index.ts @@ -0,0 +1,9 @@ +export * from './AddJukeboxDiskComposer'; +export * from './GetJukeboxPlayListMessageComposer'; +export * from './GetNowPlayingMessageComposer'; +export * from './GetOfficialSongIdMessageComposer'; +export * from './GetSongInfoMessageComposer'; +export * from './GetSoundMachinePlayListMessageComposer'; +export * from './GetSoundSettingsComposer'; +export * from './GetUserSongDisksMessageComposer'; +export * from './RemoveJukeboxDiskComposer'; diff --git a/packages/communication/src/messages/outgoing/talent/GetTalentTrackLevelMessageComposer.ts b/packages/communication/src/messages/outgoing/talent/GetTalentTrackLevelMessageComposer.ts new file mode 100644 index 0000000..7febf74 --- /dev/null +++ b/packages/communication/src/messages/outgoing/talent/GetTalentTrackLevelMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetTalentTrackLevelMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(name: string) + { + this._data = [name]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/talent/TalentTrackComposer.ts b/packages/communication/src/messages/outgoing/talent/TalentTrackComposer.ts new file mode 100644 index 0000000..2e0b977 --- /dev/null +++ b/packages/communication/src/messages/outgoing/talent/TalentTrackComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class TalentTrackComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(type: string) + { + this._data = [type]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/talent/index.ts b/packages/communication/src/messages/outgoing/talent/index.ts new file mode 100644 index 0000000..7d45f30 --- /dev/null +++ b/packages/communication/src/messages/outgoing/talent/index.ts @@ -0,0 +1,2 @@ +export * from './GetTalentTrackLevelMessageComposer'; +export * from './TalentTrackComposer'; diff --git a/packages/communication/src/messages/outgoing/tracking/LagWarningReportMessageComposer.ts b/packages/communication/src/messages/outgoing/tracking/LagWarningReportMessageComposer.ts new file mode 100644 index 0000000..9df3bdd --- /dev/null +++ b/packages/communication/src/messages/outgoing/tracking/LagWarningReportMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class LagWarningReportMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(warningCount: number) + { + this._data = [warningCount]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/tracking/PerformanceLogMessageComposer.ts b/packages/communication/src/messages/outgoing/tracking/PerformanceLogMessageComposer.ts new file mode 100644 index 0000000..e39624e --- /dev/null +++ b/packages/communication/src/messages/outgoing/tracking/PerformanceLogMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PerformanceLogMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(k: number, userAgent: string, flashVersion: string, operatingSystem: string, cpuArchitecture: string, isDebugger: boolean, totalMemory: number, _arg_8: number, gcCount: number, averageUpdateInterval: number, slowUpdateCount: number) + { + this._data = [k, userAgent, flashVersion, operatingSystem, cpuArchitecture, isDebugger, totalMemory, _arg_8, gcCount, averageUpdateInterval, slowUpdateCount]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/tracking/index.ts b/packages/communication/src/messages/outgoing/tracking/index.ts new file mode 100644 index 0000000..4a848a3 --- /dev/null +++ b/packages/communication/src/messages/outgoing/tracking/index.ts @@ -0,0 +1,2 @@ +export * from './LagWarningReportMessageComposer'; +export * from './PerformanceLogMessageComposer'; diff --git a/packages/communication/src/messages/outgoing/user/ApproveNameMessageComposer.ts b/packages/communication/src/messages/outgoing/user/ApproveNameMessageComposer.ts new file mode 100644 index 0000000..361ea3b --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/ApproveNameMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ApproveNameMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(name: string, type: number) + { + this._data = [name, type]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/CatalogGroupsComposer.ts b/packages/communication/src/messages/outgoing/user/CatalogGroupsComposer.ts new file mode 100644 index 0000000..8d1a54f --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/CatalogGroupsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class CatalogGroupsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/ChangeEmailComposer.ts b/packages/communication/src/messages/outgoing/user/ChangeEmailComposer.ts new file mode 100644 index 0000000..c5d50df --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/ChangeEmailComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ChangeEmailComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(newEmail: string) + { + this._data = [newEmail]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/GetEmailStatusComposer.ts b/packages/communication/src/messages/outgoing/user/GetEmailStatusComposer.ts new file mode 100644 index 0000000..b296d32 --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/GetEmailStatusComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetEmailStatusComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/GetHabboGroupBadgesMessageComposer.ts b/packages/communication/src/messages/outgoing/user/GetHabboGroupBadgesMessageComposer.ts new file mode 100644 index 0000000..ed745bd --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/GetHabboGroupBadgesMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetHabboGroupBadgesMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/ScrGetKickbackInfoMessageComposer.ts b/packages/communication/src/messages/outgoing/user/ScrGetKickbackInfoMessageComposer.ts new file mode 100644 index 0000000..8843be0 --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/ScrGetKickbackInfoMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class ScrGetKickbackInfoMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/UnblockGroupMemberMessageComposer.ts b/packages/communication/src/messages/outgoing/user/UnblockGroupMemberMessageComposer.ts new file mode 100644 index 0000000..394ecdd --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/UnblockGroupMemberMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UnblockGroupMemberMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(groupId: number, userId: number) + { + this._data = [groupId, userId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/UserRespectComposer.ts b/packages/communication/src/messages/outgoing/user/UserRespectComposer.ts new file mode 100644 index 0000000..fd4010e --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/UserRespectComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UserRespectComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number) + { + this._data = [userId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/WelcomeGiftChangeEmailComposer.ts b/packages/communication/src/messages/outgoing/user/WelcomeGiftChangeEmailComposer.ts new file mode 100644 index 0000000..8b7e00a --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/WelcomeGiftChangeEmailComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class WelcomeGiftChangeEmailComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(newEmail: string) + { + this._data = [newEmail]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/data/GetExtendedProfileByNameMessageComposer.ts b/packages/communication/src/messages/outgoing/user/data/GetExtendedProfileByNameMessageComposer.ts new file mode 100644 index 0000000..040c011 --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/data/GetExtendedProfileByNameMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetExtendedProfileByNameMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(username: string) + { + this._data = [username]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/data/GetIgnoredUsersComposer.ts b/packages/communication/src/messages/outgoing/user/data/GetIgnoredUsersComposer.ts new file mode 100644 index 0000000..42e4dc9 --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/data/GetIgnoredUsersComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetIgnoredUsersComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(username: string) + { + this._data = [username]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/data/GetUserTagsComposer.ts b/packages/communication/src/messages/outgoing/user/data/GetUserTagsComposer.ts new file mode 100644 index 0000000..2f388cd --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/data/GetUserTagsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class GetUserTagsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomUnitId: number) + { + this._data = [roomUnitId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/data/IgnoreUserComposer.ts b/packages/communication/src/messages/outgoing/user/data/IgnoreUserComposer.ts new file mode 100644 index 0000000..60c6b78 --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/data/IgnoreUserComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class IgnoreUserComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(username: string) + { + this._data = [username]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/data/IgnoreUserIdComposer.ts b/packages/communication/src/messages/outgoing/user/data/IgnoreUserIdComposer.ts new file mode 100644 index 0000000..b179565 --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/data/IgnoreUserIdComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class IgnoreUserIdComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number) + { + this._data = [userId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/data/UnignoreUserComposer.ts b/packages/communication/src/messages/outgoing/user/data/UnignoreUserComposer.ts new file mode 100644 index 0000000..cf23616 --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/data/UnignoreUserComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UnignoreUserComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(username: string) + { + this._data = [username]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/data/UserCurrentBadgesComposer.ts b/packages/communication/src/messages/outgoing/user/data/UserCurrentBadgesComposer.ts new file mode 100644 index 0000000..6dfa156 --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/data/UserCurrentBadgesComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UserCurrentBadgesComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number) + { + this._data = [userId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/data/UserFigureComposer.ts b/packages/communication/src/messages/outgoing/user/data/UserFigureComposer.ts new file mode 100644 index 0000000..9df5006 --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/data/UserFigureComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UserFigureComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(gender: string, figure: string) + { + this._data = [gender, figure]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/data/UserMottoComposer.ts b/packages/communication/src/messages/outgoing/user/data/UserMottoComposer.ts new file mode 100644 index 0000000..99b39b0 --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/data/UserMottoComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UserMottoComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(motto: string) + { + this._data = [motto]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/data/UserProfileComposer.ts b/packages/communication/src/messages/outgoing/user/data/UserProfileComposer.ts new file mode 100644 index 0000000..9123053 --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/data/UserProfileComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UserProfileComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number, flag: boolean = true) + { + this._data = [userId, flag]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/data/UserRelationshipsComposer.ts b/packages/communication/src/messages/outgoing/user/data/UserRelationshipsComposer.ts new file mode 100644 index 0000000..230771a --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/data/UserRelationshipsComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UserRelationshipsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number) + { + this._data = [userId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/data/index.ts b/packages/communication/src/messages/outgoing/user/data/index.ts new file mode 100644 index 0000000..edc3289 --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/data/index.ts @@ -0,0 +1,11 @@ +export * from './GetExtendedProfileByNameMessageComposer'; +export * from './GetIgnoredUsersComposer'; +export * from './GetUserTagsComposer'; +export * from './IgnoreUserComposer'; +export * from './IgnoreUserIdComposer'; +export * from './UnignoreUserComposer'; +export * from './UserCurrentBadgesComposer'; +export * from './UserFigureComposer'; +export * from './UserMottoComposer'; +export * from './UserProfileComposer'; +export * from './UserRelationshipsComposer'; diff --git a/packages/communication/src/messages/outgoing/user/index.ts b/packages/communication/src/messages/outgoing/user/index.ts new file mode 100644 index 0000000..9a10b1f --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/index.ts @@ -0,0 +1,14 @@ +export * from './ApproveNameMessageComposer'; +export * from './CatalogGroupsComposer'; +export * from './ChangeEmailComposer'; +export * from './data'; +export * from './GetEmailStatusComposer'; +export * from './GetHabboGroupBadgesMessageComposer'; +export * from './inventory'; +export * from './inventory/currency'; +export * from './inventory/subscription'; +export * from './ScrGetKickbackInfoMessageComposer'; +export * from './settings'; +export * from './UnblockGroupMemberMessageComposer'; +export * from './UserRespectComposer'; +export * from './WelcomeGiftChangeEmailComposer'; diff --git a/packages/communication/src/messages/outgoing/user/inventory/currency/UserCurrencyComposer.ts b/packages/communication/src/messages/outgoing/user/inventory/currency/UserCurrencyComposer.ts new file mode 100644 index 0000000..39d2a6a --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/inventory/currency/UserCurrencyComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UserCurrencyComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor() + { + this._data = []; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/inventory/currency/index.ts b/packages/communication/src/messages/outgoing/user/inventory/currency/index.ts new file mode 100644 index 0000000..5949cbb --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/inventory/currency/index.ts @@ -0,0 +1 @@ +export * from './UserCurrencyComposer'; diff --git a/packages/communication/src/messages/outgoing/user/inventory/index.ts b/packages/communication/src/messages/outgoing/user/inventory/index.ts new file mode 100644 index 0000000..e25bf08 --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/inventory/index.ts @@ -0,0 +1,2 @@ +export * from './currency'; +export * from './subscription'; diff --git a/packages/communication/src/messages/outgoing/user/inventory/subscription/UserSubscriptionComposer.ts b/packages/communication/src/messages/outgoing/user/inventory/subscription/UserSubscriptionComposer.ts new file mode 100644 index 0000000..2bc4f00 --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/inventory/subscription/UserSubscriptionComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UserSubscriptionComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(type: string) + { + this._data = [type]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/inventory/subscription/index.ts b/packages/communication/src/messages/outgoing/user/inventory/subscription/index.ts new file mode 100644 index 0000000..34fd638 --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/inventory/subscription/index.ts @@ -0,0 +1 @@ +export * from './UserSubscriptionComposer'; diff --git a/packages/communication/src/messages/outgoing/user/settings/UserSettingsCameraFollowComposer.ts b/packages/communication/src/messages/outgoing/user/settings/UserSettingsCameraFollowComposer.ts new file mode 100644 index 0000000..0b24eb8 --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/settings/UserSettingsCameraFollowComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UserSettingsCameraFollowComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(value: boolean) + { + this._data = [value]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/settings/UserSettingsOldChatComposer.ts b/packages/communication/src/messages/outgoing/user/settings/UserSettingsOldChatComposer.ts new file mode 100644 index 0000000..96bdca7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/settings/UserSettingsOldChatComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UserSettingsOldChatComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(value: boolean) + { + this._data = [value]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/settings/UserSettingsRoomInvitesComposer.ts b/packages/communication/src/messages/outgoing/user/settings/UserSettingsRoomInvitesComposer.ts new file mode 100644 index 0000000..1f14a15 --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/settings/UserSettingsRoomInvitesComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UserSettingsRoomInvitesComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(value: boolean) + { + this._data = [value]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/settings/UserSettingsSoundComposer.ts b/packages/communication/src/messages/outgoing/user/settings/UserSettingsSoundComposer.ts new file mode 100644 index 0000000..c71c34d --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/settings/UserSettingsSoundComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class UserSettingsSoundComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(volumeSystem: number, volumeFurni: number, volumeTrax: number) + { + this._data = [volumeSystem, volumeFurni, volumeTrax]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/user/settings/index.ts b/packages/communication/src/messages/outgoing/user/settings/index.ts new file mode 100644 index 0000000..fefcdbc --- /dev/null +++ b/packages/communication/src/messages/outgoing/user/settings/index.ts @@ -0,0 +1,4 @@ +export * from './UserSettingsCameraFollowComposer'; +export * from './UserSettingsOldChatComposer'; +export * from './UserSettingsRoomInvitesComposer'; +export * from './UserSettingsSoundComposer'; diff --git a/packages/communication/src/messages/outgoing/userclassification/PeerUsersClassificationMessageComposer.ts b/packages/communication/src/messages/outgoing/userclassification/PeerUsersClassificationMessageComposer.ts new file mode 100644 index 0000000..0b3f092 --- /dev/null +++ b/packages/communication/src/messages/outgoing/userclassification/PeerUsersClassificationMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class PeerUsersClassificationMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userClassType: string) + { + this._data = [userClassType]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/userclassification/RoomUsersClassificationMessageComposer.ts b/packages/communication/src/messages/outgoing/userclassification/RoomUsersClassificationMessageComposer.ts new file mode 100644 index 0000000..525db35 --- /dev/null +++ b/packages/communication/src/messages/outgoing/userclassification/RoomUsersClassificationMessageComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class RoomUsersClassificationMessageComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userClassType: string) + { + this._data = [userClassType]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/userclassification/index.ts b/packages/communication/src/messages/outgoing/userclassification/index.ts new file mode 100644 index 0000000..0dc5c96 --- /dev/null +++ b/packages/communication/src/messages/outgoing/userclassification/index.ts @@ -0,0 +1,2 @@ +export * from './PeerUsersClassificationMessageComposer'; +export * from './RoomUsersClassificationMessageComposer'; diff --git a/packages/communication/src/messages/parser/advertisement/InterstitialMessageParser.ts b/packages/communication/src/messages/parser/advertisement/InterstitialMessageParser.ts new file mode 100644 index 0000000..86f7fae --- /dev/null +++ b/packages/communication/src/messages/parser/advertisement/InterstitialMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class InterstitialMessageParser implements IMessageParser +{ + private _canShowInterstitial: boolean; + + public flush(): boolean + { + this._canShowInterstitial = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._canShowInterstitial = wrapper.readBoolean(); + + return true; + } + + public get canShowInterstitial(): boolean + { + return this._canShowInterstitial; + } +} diff --git a/packages/communication/src/messages/parser/advertisement/RoomAdErrorMessageParser.ts b/packages/communication/src/messages/parser/advertisement/RoomAdErrorMessageParser.ts new file mode 100644 index 0000000..83d816f --- /dev/null +++ b/packages/communication/src/messages/parser/advertisement/RoomAdErrorMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomAdErrorMessageParser implements IMessageParser +{ + private _errorCode: number; + private _filteredText: string; + + public flush(): boolean + { + this._errorCode = 0; + this._filteredText = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._errorCode = wrapper.readInt(); + this._filteredText = wrapper.readString(); + + return true; + } + + public get errorCode(): number + { + return this._errorCode; + } + + public get filteredText(): string + { + return this._filteredText; + } +} diff --git a/packages/communication/src/messages/parser/advertisement/index.ts b/packages/communication/src/messages/parser/advertisement/index.ts new file mode 100644 index 0000000..d7b6995 --- /dev/null +++ b/packages/communication/src/messages/parser/advertisement/index.ts @@ -0,0 +1,2 @@ +export * from './InterstitialMessageParser'; +export * from './RoomAdErrorMessageParser'; diff --git a/packages/communication/src/messages/parser/availability/AvailabilityStatusMessageParser.ts b/packages/communication/src/messages/parser/availability/AvailabilityStatusMessageParser.ts new file mode 100644 index 0000000..793a0bc --- /dev/null +++ b/packages/communication/src/messages/parser/availability/AvailabilityStatusMessageParser.ts @@ -0,0 +1,47 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class AvailabilityStatusMessageParser implements IMessageParser +{ + private _isOpen: boolean; + private _onShutdown: boolean; + private _isAuthenticUser: boolean; + + public flush(): boolean + { + this._isOpen = false; + this._onShutdown = false; + this._isAuthenticUser = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._isOpen = wrapper.readBoolean(); + this._onShutdown = wrapper.readBoolean(); + + if(wrapper.bytesAvailable) + { + this._isAuthenticUser = wrapper.readBoolean(); + } + + return true; + } + + public get isOpen(): boolean + { + return this._isOpen; + } + + public get onShutdown(): boolean + { + return this._onShutdown; + } + + public get isAuthenticUser(): boolean + { + return this._isAuthenticUser; + } +} diff --git a/packages/communication/src/messages/parser/availability/AvailabilityTimeMessageParser.ts b/packages/communication/src/messages/parser/availability/AvailabilityTimeMessageParser.ts new file mode 100644 index 0000000..ffb7007 --- /dev/null +++ b/packages/communication/src/messages/parser/availability/AvailabilityTimeMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class AvailabilityTimeMessageParser implements IMessageParser +{ + private _isOpen: boolean; + private _minutesUntilChange: number; + + public flush(): boolean + { + this._isOpen = false; + this._minutesUntilChange = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._isOpen = (wrapper.readInt() > 0); + this._minutesUntilChange = wrapper.readInt(); + + return true; + } + + public get isOpen(): boolean + { + return this._isOpen; + } + + public get minutesUntilChange(): number + { + return this._minutesUntilChange; + } +} diff --git a/packages/communication/src/messages/parser/availability/HotelClosedAndOpensMessageParser.ts b/packages/communication/src/messages/parser/availability/HotelClosedAndOpensMessageParser.ts new file mode 100644 index 0000000..6bdbace --- /dev/null +++ b/packages/communication/src/messages/parser/availability/HotelClosedAndOpensMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class HotelClosedAndOpensMessageParser implements IMessageParser +{ + private _openHour: number; + private _openMinute: number; + + public flush(): boolean + { + this._openHour = 0; + this._openMinute = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._openHour = wrapper.readInt(); + this._openMinute = wrapper.readInt(); + + return true; + } + + public get openHour(): number + { + return this._openHour; + } + + public get openMinute(): number + { + return this._openMinute; + } +} diff --git a/packages/communication/src/messages/parser/availability/HotelClosesAndWillOpenAtMessageParser.ts b/packages/communication/src/messages/parser/availability/HotelClosesAndWillOpenAtMessageParser.ts new file mode 100644 index 0000000..cf0ac90 --- /dev/null +++ b/packages/communication/src/messages/parser/availability/HotelClosesAndWillOpenAtMessageParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class HotelClosesAndWillOpenAtMessageParser implements IMessageParser +{ + private _openHour: number; + private _openMinute: number; + private _userThrownOutAtClose: boolean; + + public flush(): boolean + { + this._openHour = 0; + this._openMinute = 0; + this._userThrownOutAtClose = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._openHour = wrapper.readInt(); + this._openMinute = wrapper.readInt(); + this._userThrownOutAtClose = wrapper.readBoolean(); + + return true; + } + + public get openHour(): number + { + return this._openHour; + } + + public get openMinute(): number + { + return this._openMinute; + } + + public get userThrowOutAtClose(): boolean + { + return this._userThrownOutAtClose; + } +} diff --git a/packages/communication/src/messages/parser/availability/HotelWillCloseInMinutesMessageParser.ts b/packages/communication/src/messages/parser/availability/HotelWillCloseInMinutesMessageParser.ts new file mode 100644 index 0000000..a67cd31 --- /dev/null +++ b/packages/communication/src/messages/parser/availability/HotelWillCloseInMinutesMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class HotelWillCloseInMinutesMessageParser implements IMessageParser +{ + private _minutes: number; + + public flush(): boolean + { + this._minutes = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._minutes = wrapper.readInt(); + + return true; + } + + public get openMinute(): number + { + return this._minutes; + } +} diff --git a/packages/communication/src/messages/parser/availability/MaintenanceStatusMessageParser.ts b/packages/communication/src/messages/parser/availability/MaintenanceStatusMessageParser.ts new file mode 100644 index 0000000..7168910 --- /dev/null +++ b/packages/communication/src/messages/parser/availability/MaintenanceStatusMessageParser.ts @@ -0,0 +1,47 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class MaintenanceStatusMessageParser implements IMessageParser +{ + private _isInMaintenance: boolean; + private _minutesUntilMaintenance: number; + private _duration: number; + + public flush(): boolean + { + this._isInMaintenance = false; + this._minutesUntilMaintenance = 0; + this._duration = 15; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._isInMaintenance = wrapper.readBoolean(); + this._minutesUntilMaintenance = wrapper.readInt(); + + if(wrapper.bytesAvailable) + { + this._duration = wrapper.readInt(); + } + + return true; + } + + public get isInMaintenance(): boolean + { + return this._isInMaintenance; + } + + public get minutesUntilMaintenance(): number + { + return this._minutesUntilMaintenance; + } + + public get duration(): number + { + return this._duration; + } +} diff --git a/packages/communication/src/messages/parser/availability/index.ts b/packages/communication/src/messages/parser/availability/index.ts new file mode 100644 index 0000000..4f61945 --- /dev/null +++ b/packages/communication/src/messages/parser/availability/index.ts @@ -0,0 +1,6 @@ +export * from './AvailabilityStatusMessageParser'; +export * from './AvailabilityTimeMessageParser'; +export * from './HotelClosedAndOpensMessageParser'; +export * from './HotelClosesAndWillOpenAtMessageParser'; +export * from './HotelWillCloseInMinutesMessageParser'; +export * from './MaintenanceStatusMessageParser'; diff --git a/packages/communication/src/messages/parser/avatar/ChangeUserNameResultMessageParser.ts b/packages/communication/src/messages/parser/avatar/ChangeUserNameResultMessageParser.ts new file mode 100644 index 0000000..0c261e7 --- /dev/null +++ b/packages/communication/src/messages/parser/avatar/ChangeUserNameResultMessageParser.ts @@ -0,0 +1,51 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ChangeUserNameResultMessageParser implements IMessageParser +{ + private _resultCode: number; + private _name: string; + private _nameSuggestions: string[]; + + public flush(): boolean + { + this._resultCode = -1; + this._name = ''; + this._nameSuggestions = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._resultCode = wrapper.readInt(); + this._name = wrapper.readString(); + + let totalSuggestions = wrapper.readInt(); + + while(totalSuggestions > 0) + { + this._nameSuggestions.push(wrapper.readString()); + + totalSuggestions--; + } + + return true; + } + + public get resultCode(): number + { + return this._resultCode; + } + + public get name(): string + { + return this._name; + } + + public get nameSuggestions(): string[] + { + return this._nameSuggestions; + } +} diff --git a/packages/communication/src/messages/parser/avatar/CheckUserNameResultMessageParser.ts b/packages/communication/src/messages/parser/avatar/CheckUserNameResultMessageParser.ts new file mode 100644 index 0000000..649220d --- /dev/null +++ b/packages/communication/src/messages/parser/avatar/CheckUserNameResultMessageParser.ts @@ -0,0 +1,51 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CheckUserNameResultMessageParser implements IMessageParser +{ + private _resultCode: number; + private _name: string; + private _nameSuggestions: string[]; + + public flush(): boolean + { + this._resultCode = -1; + this._name = ''; + this._nameSuggestions = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._resultCode = wrapper.readInt(); + this._name = wrapper.readString(); + + let totalSuggestions = wrapper.readInt(); + + while(totalSuggestions > 0) + { + this._nameSuggestions.push(wrapper.readString()); + + totalSuggestions--; + } + + return true; + } + + public get resultCode(): number + { + return this._resultCode; + } + + public get name(): string + { + return this._name; + } + + public get nameSuggestions(): string[] + { + return this._nameSuggestions; + } +} diff --git a/packages/communication/src/messages/parser/avatar/FigureUpdateParser.ts b/packages/communication/src/messages/parser/avatar/FigureUpdateParser.ts new file mode 100644 index 0000000..952375f --- /dev/null +++ b/packages/communication/src/messages/parser/avatar/FigureUpdateParser.ts @@ -0,0 +1,37 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FigureUpdateParser implements IMessageParser +{ + private _figure: string; + private _gender: string; + + public flush(): boolean + { + this._figure = ''; + this._gender = ''; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._figure = wrapper.readString(); + this._gender = wrapper.readString(); + + if(this._gender) this._gender = this._gender.toUpperCase(); + + return true; + } + + public get figure(): string + { + return this._figure; + } + + public get gender(): string + { + return this._gender; + } +} diff --git a/packages/communication/src/messages/parser/avatar/OutfitData.ts b/packages/communication/src/messages/parser/avatar/OutfitData.ts new file mode 100644 index 0000000..de24fb9 --- /dev/null +++ b/packages/communication/src/messages/parser/avatar/OutfitData.ts @@ -0,0 +1,30 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class OutfitData +{ + private _slotId: number; + private _figureString: string; + private _gender: string; + + constructor(wrapper: IMessageDataWrapper) + { + this._slotId = wrapper.readInt(); + this._figureString = wrapper.readString(); + this._gender = wrapper.readString(); + } + + public get slotId(): number + { + return this._slotId; + } + + public get figureString(): string + { + return this._figureString; + } + + public get gender(): string + { + return this._gender; + } +} diff --git a/packages/communication/src/messages/parser/avatar/WardrobeMessageParser.ts b/packages/communication/src/messages/parser/avatar/WardrobeMessageParser.ts new file mode 100644 index 0000000..67551e2 --- /dev/null +++ b/packages/communication/src/messages/parser/avatar/WardrobeMessageParser.ts @@ -0,0 +1,44 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { OutfitData } from './OutfitData'; + +export class WardrobeMessageParser implements IMessageParser +{ + private _state: number; + private _outfits: OutfitData[]; + + public flush(): boolean + { + this._state = 0; + this._outfits = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._state = wrapper.readInt(); + + let count = wrapper.readInt(); + + while(count > 0) + { + this._outfits.push(new OutfitData(wrapper)); + + count--; + } + + return true; + } + + public get state(): number + { + return this._state; + } + + public get outfits(): OutfitData[] + { + return this._outfits; + } +} diff --git a/packages/communication/src/messages/parser/avatar/index.ts b/packages/communication/src/messages/parser/avatar/index.ts new file mode 100644 index 0000000..ca0d335 --- /dev/null +++ b/packages/communication/src/messages/parser/avatar/index.ts @@ -0,0 +1,5 @@ +export * from './ChangeUserNameResultMessageParser'; +export * from './CheckUserNameResultMessageParser'; +export * from './FigureUpdateParser'; +export * from './OutfitData'; +export * from './WardrobeMessageParser'; diff --git a/packages/communication/src/messages/parser/bots/BotAddedToInventoryParser.ts b/packages/communication/src/messages/parser/bots/BotAddedToInventoryParser.ts new file mode 100644 index 0000000..62a74b1 --- /dev/null +++ b/packages/communication/src/messages/parser/bots/BotAddedToInventoryParser.ts @@ -0,0 +1,36 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { BotData } from './BotData'; + +export class BotAddedToInventoryParser implements IMessageParser +{ + private _item: BotData; + private _openInventory: boolean; + + public flush(): boolean + { + this._item = null; + this._openInventory = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._item = new BotData(wrapper); + this._openInventory = wrapper.readBoolean(); + + return true; + } + + public get item(): BotData + { + return this._item; + } + + public openInventory(): boolean + { + return this._openInventory; + } +} diff --git a/packages/communication/src/messages/parser/bots/BotData.ts b/packages/communication/src/messages/parser/bots/BotData.ts new file mode 100644 index 0000000..0254732 --- /dev/null +++ b/packages/communication/src/messages/parser/bots/BotData.ts @@ -0,0 +1,46 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class BotData +{ + private _id: number; + private _name: string; + private _motto: string; + private _gender: string; + private _figure: string; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_parser'); + + this._id = wrapper.readInt(); + this._name = wrapper.readString(); + this._motto = wrapper.readString(); + this._gender = wrapper.readString(); + this._figure = wrapper.readString(); + } + + public get id(): number + { + return this._id; + } + + public get name(): string + { + return this._name; + } + + public get motto(): string + { + return this._motto; + } + + public get figure(): string + { + return this._figure; + } + + public get gender(): string + { + return this._gender; + } +} diff --git a/packages/communication/src/messages/parser/bots/BotInventoryMessageParser.ts b/packages/communication/src/messages/parser/bots/BotInventoryMessageParser.ts new file mode 100644 index 0000000..a4e8585 --- /dev/null +++ b/packages/communication/src/messages/parser/bots/BotInventoryMessageParser.ts @@ -0,0 +1,37 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { BotData } from './BotData'; + +export class BotInventoryMessageParser implements IMessageParser +{ + private _items: Map; + + public flush(): boolean + { + this._items = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + this._items = new Map(); + + let count = wrapper.readInt(); + + while(count > 0) + { + const data = new BotData(wrapper); + + this._items.set(data.id, data); + + count--; + } + + return true; + } + + public get items(): Map + { + return this._items; + } +} diff --git a/packages/communication/src/messages/parser/bots/BotReceivedMessageParser.ts b/packages/communication/src/messages/parser/bots/BotReceivedMessageParser.ts new file mode 100644 index 0000000..1d9abdb --- /dev/null +++ b/packages/communication/src/messages/parser/bots/BotReceivedMessageParser.ts @@ -0,0 +1,36 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { BotData } from './BotData'; + +export class BotReceivedMessageParser implements IMessageParser +{ + private _boughtAsGift: boolean; + private _item: BotData; + + public flush(): boolean + { + this._boughtAsGift = false; + this._item = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._boughtAsGift = wrapper.readBoolean(); + this._item = new BotData(wrapper); + + return true; + } + + public get boughtAsGift(): boolean + { + return this._boughtAsGift; + } + + public get item(): BotData + { + return this._item; + } +} diff --git a/packages/communication/src/messages/parser/bots/BotRemovedFromInventoryParser.ts b/packages/communication/src/messages/parser/bots/BotRemovedFromInventoryParser.ts new file mode 100644 index 0000000..4a9e0ea --- /dev/null +++ b/packages/communication/src/messages/parser/bots/BotRemovedFromInventoryParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class BotRemovedFromInventoryParser implements IMessageParser +{ + private _itemId: number; + + public flush(): boolean + { + this._itemId = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._itemId = wrapper.readInt(); + + return true; + } + + public get itemId(): number + { + return this._itemId; + } +} diff --git a/packages/communication/src/messages/parser/bots/index.ts b/packages/communication/src/messages/parser/bots/index.ts new file mode 100644 index 0000000..1224c4e --- /dev/null +++ b/packages/communication/src/messages/parser/bots/index.ts @@ -0,0 +1,5 @@ +export * from './BotAddedToInventoryParser'; +export * from './BotData'; +export * from './BotInventoryMessageParser'; +export * from './BotReceivedMessageParser'; +export * from './BotRemovedFromInventoryParser'; diff --git a/packages/communication/src/messages/parser/callforhelp/CallForHelpCategoryData.ts b/packages/communication/src/messages/parser/callforhelp/CallForHelpCategoryData.ts new file mode 100644 index 0000000..be7e98d --- /dev/null +++ b/packages/communication/src/messages/parser/callforhelp/CallForHelpCategoryData.ts @@ -0,0 +1,48 @@ +import { IDisposable, IMessageDataWrapper } from '@nitrots/api'; +import { INamed } from '../moderation'; +import { CallForHelpTopicData } from './CallForHelpTopicData'; + +export class CallForHelpCategoryData implements INamed, IDisposable +{ + private _name: string; + private _topics: CallForHelpTopicData[]; + private _disposed: boolean; + + constructor(wrapper: IMessageDataWrapper) + { + this._topics = []; + this._name = wrapper.readString(); + + let count = wrapper.readInt(); + + while(count > 0) + { + this._topics.push(new CallForHelpTopicData(wrapper)); + + count--; + } + } + + public dispose(): void + { + if(this._disposed) return; + + this._disposed = true; + this._topics = null; + } + + public get disposed(): boolean + { + return this._disposed; + } + + public get name(): string + { + return this._name; + } + + public get topics(): CallForHelpTopicData[] + { + return this._topics; + } +} diff --git a/packages/communication/src/messages/parser/callforhelp/CallForHelpTopicData.ts b/packages/communication/src/messages/parser/callforhelp/CallForHelpTopicData.ts new file mode 100644 index 0000000..9171f2b --- /dev/null +++ b/packages/communication/src/messages/parser/callforhelp/CallForHelpTopicData.ts @@ -0,0 +1,31 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { INamed } from '../moderation'; + +export class CallForHelpTopicData implements INamed +{ + private _name: string; + private _id: number; + private _consequence: string; + + constructor(wrapper: IMessageDataWrapper) + { + this._name = wrapper.readString(); + this._id = wrapper.readInt(); + this._consequence = wrapper.readString(); + } + + public get name(): string + { + return this._name; + } + + public get id(): number + { + return this._id; + } + + public get consequence(): string + { + return this._consequence; + } +} diff --git a/packages/communication/src/messages/parser/callforhelp/CfhSanctionMessageParser.ts b/packages/communication/src/messages/parser/callforhelp/CfhSanctionMessageParser.ts new file mode 100644 index 0000000..aea9d0c --- /dev/null +++ b/packages/communication/src/messages/parser/callforhelp/CfhSanctionMessageParser.ts @@ -0,0 +1,44 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { CfhSanctionTypeData } from './CfhSanctionTypeData'; + +export class CfhSanctionMessageParser implements IMessageParser +{ + private _issueId: number; + private _accountId: number; + private _sanctionType: CfhSanctionTypeData; + + public flush(): boolean + { + this._issueId = -1; + this._accountId = 1; + this._sanctionType = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._issueId = wrapper.readInt(); + this._accountId = wrapper.readInt(); + this._sanctionType = new CfhSanctionTypeData(wrapper); + + return true; + } + + public get issueId(): number + { + return this._issueId; + } + + public get accountId(): number + { + return this._accountId; + } + + public get sanctionType(): CfhSanctionTypeData + { + return this._sanctionType; + } +} diff --git a/packages/communication/src/messages/parser/callforhelp/CfhSanctionTypeData.ts b/packages/communication/src/messages/parser/callforhelp/CfhSanctionTypeData.ts new file mode 100644 index 0000000..d205414 --- /dev/null +++ b/packages/communication/src/messages/parser/callforhelp/CfhSanctionTypeData.ts @@ -0,0 +1,49 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { INamed } from '../moderation'; + +export class CfhSanctionTypeData implements INamed +{ + private _name: string; + private _sanctionLengthInHours: number; + private _probationDays: number; + private _avatarOnly: boolean; + private _tradeLockInfo: string = ''; + private _machineBanInfo: string = ''; + + constructor(wrapper: IMessageDataWrapper) + { + this._name = wrapper.readString(); + this._sanctionLengthInHours = wrapper.readInt(); + this._probationDays = wrapper.readInt(); + this._avatarOnly = wrapper.readBoolean(); + + if(wrapper.bytesAvailable) this._tradeLockInfo = wrapper.readString(); + + if(wrapper.bytesAvailable) this._machineBanInfo = wrapper.readString(); + } + + public get name(): string + { + return this._name; + } + + public get sanctionLengthInHours(): number + { + return this._sanctionLengthInHours; + } + + public get avatarOnly(): boolean + { + return this._avatarOnly; + } + + public get tradeLockInfo(): string + { + return this._tradeLockInfo; + } + + public get machineBanInfo(): string + { + return this._machineBanInfo; + } +} diff --git a/packages/communication/src/messages/parser/callforhelp/CfhTopicsInitMessageParser.ts b/packages/communication/src/messages/parser/callforhelp/CfhTopicsInitMessageParser.ts new file mode 100644 index 0000000..6d6abd8 --- /dev/null +++ b/packages/communication/src/messages/parser/callforhelp/CfhTopicsInitMessageParser.ts @@ -0,0 +1,37 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { CallForHelpCategoryData } from './CallForHelpCategoryData'; + +export class CfhTopicsInitMessageParser implements IMessageParser +{ + private _callForHelpCategories: CallForHelpCategoryData[]; + + public flush(): boolean + { + this._callForHelpCategories = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._callForHelpCategories = []; + + let count = wrapper.readInt(); + + while(count > 0) + { + this._callForHelpCategories.push(new CallForHelpCategoryData(wrapper)); + + count--; + } + + return true; + } + + public get callForHelpCategories(): CallForHelpCategoryData[] + { + return this._callForHelpCategories; + } +} diff --git a/packages/communication/src/messages/parser/callforhelp/SanctionStatusMessageParser.ts b/packages/communication/src/messages/parser/callforhelp/SanctionStatusMessageParser.ts new file mode 100644 index 0000000..2585034 --- /dev/null +++ b/packages/communication/src/messages/parser/callforhelp/SanctionStatusMessageParser.ts @@ -0,0 +1,114 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class SanctionStatusMessageParser implements IMessageParser +{ + private _isSanctionNew: boolean; + private _isSanctionActive: boolean; + private _sanctionName: string; + private _sanctionLengthHours: number; + private _sanctionReason: string; + private _sanctionCreationTime: string; + private _probationHoursLeft: number; + private _nextSanctionName: string; + private _nextSanctionLengthHours: number; + private _hasCustomMute: boolean; + private _tradeLockExpiryTime: string; + + public flush(): boolean + { + this._isSanctionNew = false; + this._isSanctionActive = false; + this._sanctionName = null; + this._sanctionLengthHours = 0; + this._sanctionReason = null; + this._sanctionCreationTime = null; + this._probationHoursLeft = 0; + this._nextSanctionName = null; + this._nextSanctionLengthHours = 0; + this._hasCustomMute = false; + this._tradeLockExpiryTime = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._isSanctionNew = wrapper.readBoolean(); + this._isSanctionActive = wrapper.readBoolean(); + this._sanctionName = wrapper.readString(); + this._sanctionLengthHours = wrapper.readInt(); + + wrapper.readInt(); + + this._sanctionReason = wrapper.readString(); + this._sanctionCreationTime = wrapper.readString(); + this._probationHoursLeft = wrapper.readInt(); + this._nextSanctionName = wrapper.readString(); + this._nextSanctionLengthHours = wrapper.readInt(); + + wrapper.readInt(); + + this._hasCustomMute = wrapper.readBoolean(); + + if(wrapper.bytesAvailable) this._tradeLockExpiryTime = wrapper.readString(); + + return true; + } + + public get isSanctionNew(): boolean + { + return this._isSanctionNew; + } + + public get isSanctionActive(): boolean + { + return this._isSanctionActive; + } + + public get sanctionName(): string + { + return this._sanctionName; + } + + public get sanctionLengthHours(): number + { + return this._sanctionLengthHours; + } + + public get sanctionReason(): string + { + return this._sanctionReason; + } + + public get sanctionCreationTime(): string + { + return this._sanctionCreationTime; + } + + public get probationHoursLeft(): number + { + return this._probationHoursLeft; + } + + public get nextSanctionName(): string + { + return this._nextSanctionName; + } + + public get nextSanctionLengthHours(): number + { + return this._nextSanctionLengthHours; + } + + public get hasCustomMute(): boolean + { + return this._hasCustomMute; + } + + public get tradeLockExpiryTime(): string + { + return this._tradeLockExpiryTime; + } +} diff --git a/packages/communication/src/messages/parser/callforhelp/index.ts b/packages/communication/src/messages/parser/callforhelp/index.ts new file mode 100644 index 0000000..578158f --- /dev/null +++ b/packages/communication/src/messages/parser/callforhelp/index.ts @@ -0,0 +1,6 @@ +export * from './CallForHelpCategoryData'; +export * from './CallForHelpTopicData'; +export * from './CfhSanctionMessageParser'; +export * from './CfhSanctionTypeData'; +export * from './CfhTopicsInitMessageParser'; +export * from './SanctionStatusMessageParser'; diff --git a/packages/communication/src/messages/parser/camera/CameraPublishStatusMessageParser.ts b/packages/communication/src/messages/parser/camera/CameraPublishStatusMessageParser.ts new file mode 100644 index 0000000..65d6223 --- /dev/null +++ b/packages/communication/src/messages/parser/camera/CameraPublishStatusMessageParser.ts @@ -0,0 +1,44 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CameraPublishStatusMessageParser implements IMessageParser +{ + private _ok: boolean = false; + private _secondsToWait: number = 0; + private _extraDataId: string; + + public flush(): boolean + { + this._ok = false; + this._secondsToWait = 0; + this._extraDataId = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._ok = wrapper.readBoolean(); + this._secondsToWait = wrapper.readInt(); + + if(this._ok && wrapper.bytesAvailable) this._extraDataId = wrapper.readString(); + + return true; + } + + public get ok(): boolean + { + return this._ok; + } + + public get secondsToWait(): number + { + return this._secondsToWait; + } + + public get extraDataId(): string + { + return this._extraDataId; + } +} diff --git a/packages/communication/src/messages/parser/camera/CameraPurchaseOKMessageParser.ts b/packages/communication/src/messages/parser/camera/CameraPurchaseOKMessageParser.ts new file mode 100644 index 0000000..f35b516 --- /dev/null +++ b/packages/communication/src/messages/parser/camera/CameraPurchaseOKMessageParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CameraPurchaseOKMessageParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/camera/CameraSnapshotMessageParser.ts b/packages/communication/src/messages/parser/camera/CameraSnapshotMessageParser.ts new file mode 100644 index 0000000..93467f9 --- /dev/null +++ b/packages/communication/src/messages/parser/camera/CameraSnapshotMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CameraSnapshotMessageParser implements IMessageParser +{ + private _roomType: string; + private _roomId: number; + + public flush(): boolean + { + this._roomType = null; + this._roomId = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomType = wrapper.readString(); + this._roomId = wrapper.readInt(); + + return true; + } + + public get roomType(): string + { + return this._roomType; + } + + public get roomId(): number + { + return this._roomId; + } +} diff --git a/packages/communication/src/messages/parser/camera/CameraStorageUrlMessageParser.ts b/packages/communication/src/messages/parser/camera/CameraStorageUrlMessageParser.ts new file mode 100644 index 0000000..e9e94b3 --- /dev/null +++ b/packages/communication/src/messages/parser/camera/CameraStorageUrlMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CameraStorageUrlMessageParser implements IMessageParser +{ + private _url: string; + + public flush(): boolean + { + this._url = ''; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._url = wrapper.readString(); + + return true; + } + + public get url(): string + { + return this._url; + } +} diff --git a/packages/communication/src/messages/parser/camera/CompetitionStatusMessageParser.ts b/packages/communication/src/messages/parser/camera/CompetitionStatusMessageParser.ts new file mode 100644 index 0000000..b9f69e7 --- /dev/null +++ b/packages/communication/src/messages/parser/camera/CompetitionStatusMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CompetitionStatusMessageParser implements IMessageParser +{ + private _ok: boolean = false; + private _errorReason: string = null; + + public flush(): boolean + { + this._ok = false; + this._errorReason = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._ok = wrapper.readBoolean(); + this._errorReason = wrapper.readString(); + + return true; + } + + public get ok(): boolean + { + return this._ok; + } + + public get errorReason(): string + { + return this._errorReason; + } +} diff --git a/packages/communication/src/messages/parser/camera/InitCameraMessageParser.ts b/packages/communication/src/messages/parser/camera/InitCameraMessageParser.ts new file mode 100644 index 0000000..2f12198 --- /dev/null +++ b/packages/communication/src/messages/parser/camera/InitCameraMessageParser.ts @@ -0,0 +1,44 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class InitCameraMessageParser implements IMessageParser +{ + private _creditPrice: number = 0; + private _ducketPrice: number = 0; + private _publishDucketPrice: number = 0; + + public flush(): boolean + { + this._creditPrice = 0; + this._ducketPrice = 0; + this._publishDucketPrice = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._creditPrice = wrapper.readInt(); + this._ducketPrice = wrapper.readInt(); + + if(wrapper.bytesAvailable) this._publishDucketPrice = wrapper.readInt(); + + return true; + } + + public get creditPrice(): number + { + return this._creditPrice; + } + + public get ducketPrice(): number + { + return this._ducketPrice; + } + + public get publishDucketPrice(): number + { + return this._publishDucketPrice; + } +} diff --git a/packages/communication/src/messages/parser/camera/ThumbnailStatusMessageParser.ts b/packages/communication/src/messages/parser/camera/ThumbnailStatusMessageParser.ts new file mode 100644 index 0000000..60d0d0d --- /dev/null +++ b/packages/communication/src/messages/parser/camera/ThumbnailStatusMessageParser.ts @@ -0,0 +1,37 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ThumbnailStatusMessageParser implements IMessageParser +{ + private _ok: boolean = true; + private _renderLimitHit: boolean = false; + + public flush(): boolean + { + this._ok = true; + this._renderLimitHit = false; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + if(wrapper.bytesAvailable) + { + this._ok = wrapper.readBoolean(); + this._renderLimitHit = wrapper.readBoolean(); + } + + return true; + } + + public get ok(): boolean + { + return this._ok; + } + + public get isRenderLimitHit(): boolean + { + return this._renderLimitHit; + } +} diff --git a/packages/communication/src/messages/parser/camera/index.ts b/packages/communication/src/messages/parser/camera/index.ts new file mode 100644 index 0000000..8215d77 --- /dev/null +++ b/packages/communication/src/messages/parser/camera/index.ts @@ -0,0 +1,7 @@ +export * from './CameraPublishStatusMessageParser'; +export * from './CameraPurchaseOKMessageParser'; +export * from './CameraSnapshotMessageParser'; +export * from './CameraStorageUrlMessageParser'; +export * from './CompetitionStatusMessageParser'; +export * from './InitCameraMessageParser'; +export * from './ThumbnailStatusMessageParser'; diff --git a/packages/communication/src/messages/parser/campaign/CampaignCalendarData.ts b/packages/communication/src/messages/parser/campaign/CampaignCalendarData.ts new file mode 100644 index 0000000..2dda0f2 --- /dev/null +++ b/packages/communication/src/messages/parser/campaign/CampaignCalendarData.ts @@ -0,0 +1,114 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class CampaignCalendarData +{ + private _campaignName: string; + private _campaignImage: string; + private _currentDay: number; + private _campaignDays: number; + private _openedDays: number[]; + private _missedDays: number[]; + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._campaignName = wrapper.readString(); + this._campaignImage = wrapper.readString(); + this._currentDay = wrapper.readInt(); + this._campaignDays = wrapper.readInt(); + this._openedDays = []; + + let count = wrapper.readInt(); + + for(let i = 0; i < count; i++) + { + this._openedDays.push(wrapper.readInt()); + } + + this._missedDays = []; + + count = wrapper.readInt(); + + for(let i = 0; i < count; i++) + { + this._missedDays.push(wrapper.readInt()); + } + + return true; + } + + public clone(): CampaignCalendarData + { + const data = new CampaignCalendarData(); + + data.campaignDays = this._campaignDays; + data.campaignImage = this._campaignImage; + data.campaignName = this._campaignName; + data.currentDay = this._currentDay; + data.missedDays = this._missedDays; + data.openedDays = this._openedDays; + + return data; + } + + public get campaignName(): string + { + return this._campaignName; + } + + public set campaignName(name: string) + { + this._campaignName = name; + } + + public get campaignImage(): string + { + return this._campaignImage; + } + + public set campaignImage(image: string) + { + this._campaignImage = image; + } + + public get currentDay(): number + { + return this._currentDay; + } + + public set currentDay(day: number) + { + this._currentDay = day; + } + + public get campaignDays(): number + { + return this._campaignDays; + } + + public set campaignDays(days: number) + { + this._campaignDays = days; + } + + public get openedDays(): number[] + { + return this._openedDays; + } + + public set openedDays(days: number[]) + { + this._openedDays = days; + } + + public get missedDays(): number[] + { + return this._missedDays; + } + + public set missedDays(days: number[]) + { + this._missedDays = days; + } +} diff --git a/packages/communication/src/messages/parser/campaign/CampaignCalendarDataMessageParser.ts b/packages/communication/src/messages/parser/campaign/CampaignCalendarDataMessageParser.ts new file mode 100644 index 0000000..8d887de --- /dev/null +++ b/packages/communication/src/messages/parser/campaign/CampaignCalendarDataMessageParser.ts @@ -0,0 +1,29 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { CampaignCalendarData } from './CampaignCalendarData'; + +export class CampaignCalendarDataMessageParser implements IMessageParser +{ + private _calendarData: CampaignCalendarData; + + public flush(): boolean + { + this._calendarData = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._calendarData = new CampaignCalendarData(); + this._calendarData.parse(wrapper); + + return true; + } + + public get calendarData(): CampaignCalendarData + { + return this._calendarData; + } +} diff --git a/packages/communication/src/messages/parser/campaign/CampaignCalendarDoorOpenedMessageParser.ts b/packages/communication/src/messages/parser/campaign/CampaignCalendarDoorOpenedMessageParser.ts new file mode 100644 index 0000000..1a834fa --- /dev/null +++ b/packages/communication/src/messages/parser/campaign/CampaignCalendarDoorOpenedMessageParser.ts @@ -0,0 +1,51 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CampaignCalendarDoorOpenedMessageParser implements IMessageParser +{ + private _doorOpened: boolean; + private _productName: string; + private _customImage: string; + private _furnitureClassName: string; + + public flush(): boolean + { + this._doorOpened = false; + this._productName = null; + this._customImage = null; + this._furnitureClassName = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._doorOpened = wrapper.readBoolean(); + this._productName = wrapper.readString(); + this._customImage = wrapper.readString(); + this._furnitureClassName = wrapper.readString(); + + return true; + } + + public get doorOpened(): boolean + { + return this._doorOpened; + } + + public get productName(): string + { + return this._productName; + } + + public get customImage(): string + { + return this._customImage; + } + + public get furnitureClassName(): string + { + return this._furnitureClassName; + } +} diff --git a/packages/communication/src/messages/parser/campaign/index.ts b/packages/communication/src/messages/parser/campaign/index.ts new file mode 100644 index 0000000..bb30603 --- /dev/null +++ b/packages/communication/src/messages/parser/campaign/index.ts @@ -0,0 +1,3 @@ +export * from './CampaignCalendarData'; +export * from './CampaignCalendarDataMessageParser'; +export * from './CampaignCalendarDoorOpenedMessageParser'; diff --git a/packages/communication/src/messages/parser/catalog/BonusRareInfoMessageParser.ts b/packages/communication/src/messages/parser/catalog/BonusRareInfoMessageParser.ts new file mode 100644 index 0000000..83fbd39 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/BonusRareInfoMessageParser.ts @@ -0,0 +1,49 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class BonusRareInfoMessageParser implements IMessageParser +{ + private _productType: string; + private _productClassId: number; + private _totalCoinsForBonus: number; + private _coinsStillRequiredToBuy: number; + + public flush(): boolean + { + this._totalCoinsForBonus = -1; + this._coinsStillRequiredToBuy = -1; + this._productType = ''; + this._productClassId = -1; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._productType = wrapper.readString(); + this._productClassId = wrapper.readInt(); + this._totalCoinsForBonus = wrapper.readInt(); + this._coinsStillRequiredToBuy = wrapper.readInt(); + return true; + } + + public get totalCoinsForBonus(): number + { + return this._totalCoinsForBonus; + } + + public get coinsStillRequiredToBuy(): number + { + return this._coinsStillRequiredToBuy; + } + + public get productType(): string + { + return this._productType; + } + + public get productClassId(): number + { + return this._productClassId; + } +} diff --git a/packages/communication/src/messages/parser/catalog/BuildersClubFurniCountMessageParser.ts b/packages/communication/src/messages/parser/catalog/BuildersClubFurniCountMessageParser.ts new file mode 100644 index 0000000..d380d10 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/BuildersClubFurniCountMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class BuildersClubFurniCountMessageParser implements IMessageParser +{ + private _furniCount: number; + + public flush(): boolean + { + this._furniCount = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._furniCount = wrapper.readInt(); + + return true; + } + + public get furniCount(): number + { + return this._furniCount; + } +} diff --git a/packages/communication/src/messages/parser/catalog/BuildersClubSubscriptionStatusMessageParser.ts b/packages/communication/src/messages/parser/catalog/BuildersClubSubscriptionStatusMessageParser.ts new file mode 100644 index 0000000..a4a64dd --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/BuildersClubSubscriptionStatusMessageParser.ts @@ -0,0 +1,53 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class BuildersClubSubscriptionStatusMessageParser implements IMessageParser +{ + private _secondsLeft: number; + private _furniLimit: number; + private _maxFurniLimit: number; + private _secondsLeftWithGrace: number; + + public flush(): boolean + { + this._secondsLeft = 0; + this._furniLimit = 0; + this._maxFurniLimit = 0; + this._secondsLeftWithGrace = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._secondsLeft = wrapper.readInt(); + this._furniLimit = wrapper.readInt(); + this._maxFurniLimit = wrapper.readInt(); + + if(wrapper.bytesAvailable) this._secondsLeftWithGrace = wrapper.readInt(); + else this._secondsLeftWithGrace = this._secondsLeft; + + return true; + } + + public get secondsLeft(): number + { + return this._secondsLeft; + } + + public get furniLimit(): number + { + return this._furniLimit; + } + + public get maxFurniLimit(): number + { + return this._maxFurniLimit; + } + + public get secondsLeftWithGrace(): number + { + return this._secondsLeftWithGrace; + } +} diff --git a/packages/communication/src/messages/parser/catalog/BundleDiscountRuleset.ts b/packages/communication/src/messages/parser/catalog/BundleDiscountRuleset.ts new file mode 100644 index 0000000..94b6e40 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/BundleDiscountRuleset.ts @@ -0,0 +1,53 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class BundleDiscountRuleset +{ + private _maxPurchaseSize: number; + private _bundleSize: number; + private _bundleDiscountSize: number; + private _bonusThreshold: number; + private _additionalBonusDiscountThresholdQuantities: number[]; + + constructor(wrapper: IMessageDataWrapper) + { + this._maxPurchaseSize = wrapper.readInt(); + this._bundleSize = wrapper.readInt(); + this._bundleDiscountSize = wrapper.readInt(); + this._bonusThreshold = wrapper.readInt(); + this._additionalBonusDiscountThresholdQuantities = []; + + let count = wrapper.readInt(); + + while(count > 0) + { + this._additionalBonusDiscountThresholdQuantities.push(wrapper.readInt()); + + count--; + } + } + + public get maxPurchaseSize(): number + { + return this._maxPurchaseSize; + } + + public get bundleSize(): number + { + return this._bundleSize; + } + + public get bundleDiscountSize(): number + { + return this._bundleDiscountSize; + } + + public get bonusThreshold(): number + { + return this._bonusThreshold; + } + + public get additionalBonusDiscountThresholdQuantities(): number[] + { + return this._additionalBonusDiscountThresholdQuantities; + } +} diff --git a/packages/communication/src/messages/parser/catalog/BundleDiscountRulesetMessageParser.ts b/packages/communication/src/messages/parser/catalog/BundleDiscountRulesetMessageParser.ts new file mode 100644 index 0000000..e954fd5 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/BundleDiscountRulesetMessageParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { BundleDiscountRuleset } from './BundleDiscountRuleset'; + +export class BundleDiscountRulesetMessageParser implements IMessageParser +{ + private _bundleDiscountRuleset: BundleDiscountRuleset; + + public flush(): boolean + { + this._bundleDiscountRuleset = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._bundleDiscountRuleset = new BundleDiscountRuleset(wrapper); + + return true; + } + + public get bundleDiscountRuleset(): BundleDiscountRuleset + { + return this._bundleDiscountRuleset; + } +} diff --git a/packages/communication/src/messages/parser/catalog/CatalogIndexMessageParser.ts b/packages/communication/src/messages/parser/catalog/CatalogIndexMessageParser.ts new file mode 100644 index 0000000..1acf356 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/CatalogIndexMessageParser.ts @@ -0,0 +1,42 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { NodeData } from './NodeData'; + +export class CatalogIndexMessageParser implements IMessageParser +{ + private _root: NodeData; + private _newAdditionsAvailable: boolean; + private _catalogType: string; + + public flush(): boolean + { + this._root = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._root = new NodeData(wrapper); + this._newAdditionsAvailable = wrapper.readBoolean(); + this._catalogType = wrapper.readString(); + + return true; + } + + public get root(): NodeData + { + return this._root; + } + + public get newAdditionsAvailable(): boolean + { + return this._newAdditionsAvailable; + } + + public get catalogType(): string + { + return this._catalogType; + } +} diff --git a/packages/communication/src/messages/parser/catalog/CatalogLocalizationData.ts b/packages/communication/src/messages/parser/catalog/CatalogLocalizationData.ts new file mode 100644 index 0000000..c6bfce5 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/CatalogLocalizationData.ts @@ -0,0 +1,41 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class CatalogLocalizationData +{ + private _images: string[]; + private _texts: string[]; + + constructor(wrapper: IMessageDataWrapper) + { + this._images = []; + this._texts = []; + + let totalImages = wrapper.readInt(); + + while(totalImages > 0) + { + this._images.push(wrapper.readString()); + + totalImages--; + } + + let totalTexts = wrapper.readInt(); + + while(totalTexts > 0) + { + this._texts.push(wrapper.readString()); + + totalTexts--; + } + } + + public get images(): string[] + { + return this._images; + } + + public get texts(): string[] + { + return this._texts; + } +} diff --git a/packages/communication/src/messages/parser/catalog/CatalogPageExpirationParser.ts b/packages/communication/src/messages/parser/catalog/CatalogPageExpirationParser.ts new file mode 100644 index 0000000..73e0b0f --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/CatalogPageExpirationParser.ts @@ -0,0 +1,51 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CatalogPageExpirationParser implements IMessageParser +{ + private _pageName: string; + private _pageId: number; + private _secondsToExpiry: number; + private _image: string; + + public flush(): boolean + { + this._pageName = null; + this._pageId = 0; + this._secondsToExpiry = 0; + this._image = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._pageId = wrapper.readInt(); + this._pageName = wrapper.readString(); + this._secondsToExpiry = wrapper.readInt(); + this._image = wrapper.readString(); + + return true; + } + + public get pageName(): string + { + return this._pageName; + } + + public get pageId(): number + { + return this._pageId; + } + + public get secondsToExpiry(): number + { + return this._secondsToExpiry; + } + + public get image(): string + { + return this._image; + } +} diff --git a/packages/communication/src/messages/parser/catalog/CatalogPageMessageOfferData.ts b/packages/communication/src/messages/parser/catalog/CatalogPageMessageOfferData.ts new file mode 100644 index 0000000..4ac4bf2 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/CatalogPageMessageOfferData.ts @@ -0,0 +1,105 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { CatalogPageMessageProductData } from './CatalogPageMessageProductData'; + +export class CatalogPageMessageOfferData +{ + private _offerId: number; + private _localizationId: string; + private _rent: boolean; + private _priceCredits: number; + private _priceActivityPoints: number; + private _priceActivityPointsType: number; + private _clubLevel: number; + private _giftable: boolean; + private _bundlePurchaseAllowed: boolean; + private _isPet: boolean; + private _previewImage: string; + private _products: CatalogPageMessageProductData[]; + + constructor(wrapper: IMessageDataWrapper) + { + this._offerId = wrapper.readInt(); + this._localizationId = wrapper.readString(); + this._rent = wrapper.readBoolean(); + this._priceCredits = wrapper.readInt(); + this._priceActivityPoints = wrapper.readInt(); + this._priceActivityPointsType = wrapper.readInt(); + this._giftable = wrapper.readBoolean(); + + this._products = []; + + let totalProducts = wrapper.readInt(); + + while(totalProducts > 0) + { + this._products.push(new CatalogPageMessageProductData(wrapper)); + + totalProducts--; + } + + this._clubLevel = wrapper.readInt(); + this._bundlePurchaseAllowed = wrapper.readBoolean(); + this._isPet = wrapper.readBoolean(); + this._previewImage = wrapper.readString(); + } + + public get offerId(): number + { + return this._offerId; + } + + public get localizationId(): string + { + return this._localizationId; + } + + public get rent(): boolean + { + return this._rent; + } + + public get priceCredits(): number + { + return this._priceCredits; + } + + public get priceActivityPoints(): number + { + return this._priceActivityPoints; + } + + public get priceActivityPointsType(): number + { + return this._priceActivityPointsType; + } + + public get clubLevel(): number + { + return this._clubLevel; + } + + public get giftable(): boolean + { + return this._giftable; + } + + public get bundlePurchaseAllowed(): boolean + { + return this._bundlePurchaseAllowed; + } + + public get isPet(): boolean + { + return this._isPet; + } + + public get previewImage(): string + { + return this._previewImage; + } + + public get products(): CatalogPageMessageProductData[] + { + return this._products; + } +} diff --git a/packages/communication/src/messages/parser/catalog/CatalogPageMessageParser.ts b/packages/communication/src/messages/parser/catalog/CatalogPageMessageParser.ts new file mode 100644 index 0000000..58b5e0e --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/CatalogPageMessageParser.ts @@ -0,0 +1,106 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { CatalogLocalizationData } from './CatalogLocalizationData'; +import { CatalogPageMessageOfferData } from './CatalogPageMessageOfferData'; +import { FrontPageItem } from './FrontPageItem'; + +export class CatalogPageMessageParser implements IMessageParser +{ + private _pageId: number; + private _catalogType: string; + private _layoutCode: string; + private _localization: CatalogLocalizationData; + private _offers: CatalogPageMessageOfferData[]; + private _offerId: number; + private _acceptSeasonCurrencyAsCredits: boolean; + private _frontPageItems: FrontPageItem[]; + + public flush(): boolean + { + this._pageId = -1; + this._catalogType = null; + this._layoutCode = null; + this._localization = null; + this._offers = []; + this._offerId = -1; + this._acceptSeasonCurrencyAsCredits = false; + this._frontPageItems = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._pageId = wrapper.readInt(); + this._catalogType = wrapper.readString(); + this._layoutCode = wrapper.readString(); + this._localization = new CatalogLocalizationData(wrapper); + + let totalOffers = wrapper.readInt(); + + while(totalOffers > 0) + { + this._offers.push(new CatalogPageMessageOfferData(wrapper)); + + totalOffers--; + } + + this._offerId = wrapper.readInt(); + this._acceptSeasonCurrencyAsCredits = wrapper.readBoolean(); + + if(wrapper.bytesAvailable) + { + let totalFrontPageItems = wrapper.readInt(); + + while(totalFrontPageItems > 0) + { + this._frontPageItems.push(new FrontPageItem(wrapper)); + + totalFrontPageItems--; + } + } + + return true; + } + + public get pageId(): number + { + return this._pageId; + } + + public get catalogType(): string + { + return this._catalogType; + } + + public get layoutCode(): string + { + return this._layoutCode; + } + + public get localization(): CatalogLocalizationData + { + return this._localization; + } + + public get offers(): CatalogPageMessageOfferData[] + { + return this._offers; + } + + public get offerId(): number + { + return this._offerId; + } + + public get acceptSeasonCurrencyAsCredits(): boolean + { + return this._acceptSeasonCurrencyAsCredits; + } + + public get frontPageItems(): FrontPageItem[] + { + return this._frontPageItems; + } +} diff --git a/packages/communication/src/messages/parser/catalog/CatalogPageMessageProductData.ts b/packages/communication/src/messages/parser/catalog/CatalogPageMessageProductData.ts new file mode 100644 index 0000000..7225e10 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/CatalogPageMessageProductData.ts @@ -0,0 +1,98 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class CatalogPageMessageProductData +{ + public static I: string = 'i'; + public static S: string = 's'; + public static E: string = 'e'; + public static B: string = 'b'; + + private _productType: string; + private _furniClassId: number; + private _extraParam: string; + private _productCount: number; + private _uniqueLimitedItem: boolean; + private _uniqueLimitedItemSeriesSize: number; + private _uniqueLimitedItemsLeft: number; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this.flush(); + this.parse(wrapper); + } + + public flush(): boolean + { + this._productType = null; + this._furniClassId = -1; + this._extraParam = null; + this._productCount = 0; + this._uniqueLimitedItem = false; + this._uniqueLimitedItemSeriesSize = 0; + this._uniqueLimitedItemsLeft = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + this._productType = wrapper.readString(); + + switch(this._productType) + { + case CatalogPageMessageProductData.B: + this._extraParam = wrapper.readString(); + this._productCount = 1; + return true; + default: + this._furniClassId = wrapper.readInt(); + this._extraParam = wrapper.readString(); + this._productCount = wrapper.readInt(); + this._uniqueLimitedItem = wrapper.readBoolean(); + + if(this._uniqueLimitedItem) + { + this._uniqueLimitedItemSeriesSize = wrapper.readInt(); + this._uniqueLimitedItemsLeft = wrapper.readInt(); + } + return true; + } + } + + public get productType(): string + { + return this._productType; + } + + public get furniClassId(): number + { + return this._furniClassId; + } + + public get extraParam(): string + { + return this._extraParam; + } + + public get productCount(): number + { + return this._productCount; + } + + public get uniqueLimitedItem(): boolean + { + return this._uniqueLimitedItem; + } + + public get uniqueLimitedSeriesSize(): number + { + return this._uniqueLimitedItemSeriesSize; + } + + public get uniqueLimitedItemsLeft(): number + { + return this._uniqueLimitedItemsLeft; + } +} diff --git a/packages/communication/src/messages/parser/catalog/CatalogPageWithEarliestExpiryMessageParser.ts b/packages/communication/src/messages/parser/catalog/CatalogPageWithEarliestExpiryMessageParser.ts new file mode 100644 index 0000000..116ed4c --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/CatalogPageWithEarliestExpiryMessageParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CatalogPageWithEarliestExpiryMessageParser implements IMessageParser +{ + private _pageName: string; + private _secondsToExpiry: number; + private _image: string; + + public flush(): boolean + { + this._pageName = null; + this._secondsToExpiry = 0; + this._image = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._pageName = wrapper.readString(); + this._secondsToExpiry = wrapper.readInt(); + this._image = wrapper.readString(); + + return true; + } + + public get pageName(): string + { + return this._pageName; + } + + public get secondsToExpiry(): number + { + return this._secondsToExpiry; + } + + public get image(): string + { + return this._image; + } +} diff --git a/packages/communication/src/messages/parser/catalog/CatalogPublishedMessageParser.ts b/packages/communication/src/messages/parser/catalog/CatalogPublishedMessageParser.ts new file mode 100644 index 0000000..faf816d --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/CatalogPublishedMessageParser.ts @@ -0,0 +1,36 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CatalogPublishedMessageParser implements IMessageParser +{ + private _instantlyRefreshCatalogue: boolean; + private _newFurniDataHash: string; + + public flush(): boolean + { + this._instantlyRefreshCatalogue = false; + this._newFurniDataHash = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._instantlyRefreshCatalogue = wrapper.readBoolean(); + + if(wrapper.bytesAvailable) this._newFurniDataHash = wrapper.readString(); + + return true; + } + + public get instantlyRefreshCatalogue(): boolean + { + return this._instantlyRefreshCatalogue; + } + + public get newFurniDataHash(): string + { + return this._newFurniDataHash; + } +} diff --git a/packages/communication/src/messages/parser/catalog/ClubGiftData.ts b/packages/communication/src/messages/parser/catalog/ClubGiftData.ts new file mode 100644 index 0000000..1ab4f2c --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/ClubGiftData.ts @@ -0,0 +1,37 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class ClubGiftData +{ + private _offerId: number; + private _isVip: boolean; + private _isSelectable: boolean; + private _daysRequired: number; + + constructor(wrapper: IMessageDataWrapper) + { + this._offerId = wrapper.readInt(); + this._isVip = wrapper.readBoolean(); + this._daysRequired = wrapper.readInt(); + this._isSelectable = wrapper.readBoolean(); + } + + public get offerId(): number + { + return this._offerId; + } + + public get isVip(): boolean + { + return this._isVip; + } + + public get isSelectable(): boolean + { + return this._isSelectable; + } + + public get daysRequired(): number + { + return this._daysRequired; + } +} diff --git a/packages/communication/src/messages/parser/catalog/ClubGiftInfoParser.ts b/packages/communication/src/messages/parser/catalog/ClubGiftInfoParser.ts new file mode 100644 index 0000000..b6938ad --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/ClubGiftInfoParser.ts @@ -0,0 +1,77 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { CatalogPageMessageOfferData } from './CatalogPageMessageOfferData'; +import { ClubGiftData } from './ClubGiftData'; + +export class ClubGiftInfoParser implements IMessageParser +{ + private _daysUntilNextGift: number; + private _giftsAvailable: number; + private _offers: CatalogPageMessageOfferData[]; + private _giftData: Map; + + public flush(): boolean + { + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._offers = []; + this._giftData = new Map(); + this._daysUntilNextGift = wrapper.readInt(); + this._giftsAvailable = wrapper.readInt(); + + const offerCount = wrapper.readInt(); + + for(let i = 0; i < offerCount; i++) + { + this._offers.push(new CatalogPageMessageOfferData(wrapper)); + } + + const giftDataCount = wrapper.readInt(); + + for(let i = 0; i < giftDataCount; i++) + { + const item = new ClubGiftData(wrapper); + this._giftData.set(item.offerId, item); + } + + return true; + } + + public get offers(): CatalogPageMessageOfferData[] + { + return this._offers; + } + + public get daysUntilNextGift(): number + { + return this._daysUntilNextGift; + } + + public get giftsAvailable(): number + { + return this._giftsAvailable; + } + + public set giftsAvailable(gifts: number) + { + this._giftsAvailable = gifts; + } + + public getOfferExtraData(offerId: number): ClubGiftData + { + if(!offerId) return null; + + return this._giftData.get(offerId); + } + + + public get giftData(): Map + { + return this._giftData; + } +} diff --git a/packages/communication/src/messages/parser/catalog/ClubGiftSelectedParser.ts b/packages/communication/src/messages/parser/catalog/ClubGiftSelectedParser.ts new file mode 100644 index 0000000..625f28d --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/ClubGiftSelectedParser.ts @@ -0,0 +1,44 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { CatalogPageMessageProductData } from './CatalogPageMessageProductData'; + +export class ClubGiftSelectedParser implements IMessageParser +{ + private _productCode: string; + private _products: CatalogPageMessageProductData[]; + + public flush(): boolean + { + this._productCode = null; + this._products = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._productCode = wrapper.readString(); + + let count = wrapper.readInt(); + + while(count > 0) + { + this._products.push(new CatalogPageMessageProductData(wrapper)); + + count--; + } + + return true; + } + + public get productCode(): string + { + return this._productCode; + } + + public get products(): CatalogPageMessageProductData[] + { + return this._products; + } +} diff --git a/packages/communication/src/messages/parser/catalog/ClubOfferData.ts b/packages/communication/src/messages/parser/catalog/ClubOfferData.ts new file mode 100644 index 0000000..44126ed --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/ClubOfferData.ts @@ -0,0 +1,105 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class ClubOfferData +{ + private _offerId: number; + private _productCode: string; + private _priceCredits: number; + private _priceActivityPoints: number; + private _priceActivityPointsType: number; + private _vip: boolean; + private _months: number; + private _extraDays: number; + private _daysLeftAfterPurchase: number; + private _year: number; + private _month: number; + private _day: number; + private _giftable: boolean; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this._offerId = wrapper.readInt(); + this._productCode = wrapper.readString(); + + wrapper.readBoolean(); + + this._priceCredits = wrapper.readInt(); + this._priceActivityPoints = wrapper.readInt(); + this._priceActivityPointsType = wrapper.readInt(); + this._vip = wrapper.readBoolean(); + this._months = wrapper.readInt(); + this._extraDays = wrapper.readInt(); + this._giftable = wrapper.readBoolean(); + this._daysLeftAfterPurchase = wrapper.readInt(); + this._year = wrapper.readInt(); + this._month = wrapper.readInt(); + this._day = wrapper.readInt(); + } + + public get offerId(): number + { + return this._offerId; + } + + public get productCode(): string + { + return this._productCode; + } + + public get priceCredits(): number + { + return this._priceCredits; + } + + public get priceActivityPoints(): number + { + return this._priceActivityPoints; + } + + public get priceActivityPointsType(): number + { + return this._priceActivityPointsType; + } + + public get vip(): boolean + { + return this._vip; + } + + public get months(): number + { + return this._months; + } + + public get extraDays(): number + { + return this._extraDays; + } + + public get daysLeftAfterPurchase(): number + { + return this._daysLeftAfterPurchase; + } + + public get year(): number + { + return this._year; + } + + public get month(): number + { + return this._month; + } + + public get day(): number + { + return this._day; + } + + public get giftable(): boolean + { + return this._giftable; + } +} diff --git a/packages/communication/src/messages/parser/catalog/ClubOfferExtendData.ts b/packages/communication/src/messages/parser/catalog/ClubOfferExtendData.ts new file mode 100644 index 0000000..1bfaf16 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/ClubOfferExtendData.ts @@ -0,0 +1,50 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { ClubOfferData } from './ClubOfferData'; + +export class ClubOfferExtendData extends ClubOfferData +{ + private _originalPrice: number; + private _originalActivityPointPrice: number; + private _originalActivityPointType: number; + private _subscriptionDaysLeft: number; + + constructor(wrapper: IMessageDataWrapper) + { + super(wrapper); + + this._originalPrice = wrapper.readInt(); + this._originalActivityPointPrice = wrapper.readInt(); + this._originalActivityPointType = wrapper.readInt(); + this._subscriptionDaysLeft = wrapper.readInt(); + } + + public get originalPrice(): number + { + return this._originalPrice * this.months; + } + + public get originalActivityPointPrice(): number + { + return this._originalActivityPointPrice * this.months; + } + + public get originalActivityPointType(): number + { + return this._originalActivityPointType; + } + + public get discountCreditAmount(): number + { + return (this._originalPrice * this.months) - this.priceCredits; + } + + public get discountActivityPointAmount(): number + { + return (this.originalActivityPointPrice * this.months) - this.priceActivityPoints; + } + + public get subscriptionDaysLeft(): number + { + return this._subscriptionDaysLeft; + } +} diff --git a/packages/communication/src/messages/parser/catalog/DirectSMSClubBuyAvailableMessageParser.ts b/packages/communication/src/messages/parser/catalog/DirectSMSClubBuyAvailableMessageParser.ts new file mode 100644 index 0000000..8318c7b --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/DirectSMSClubBuyAvailableMessageParser.ts @@ -0,0 +1,53 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class DirectSMSClubBuyAvailableMessageParser implements IMessageParser +{ + private _available: boolean; + private _pricePointUrl: string; + private _market: string; + private _lengthInDays: number; + + public flush(): boolean + { + this._available = false; + this._pricePointUrl = null; + this._market = null; + this._lengthInDays = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._pricePointUrl = wrapper.readString(); + + if(this._pricePointUrl !== '') this._available = true; + + this._market = wrapper.readString(); + this._lengthInDays = wrapper.readInt(); + + return true; + } + + public get available(): boolean + { + return this._available; + } + + public get pricePointUrl(): string + { + return this._pricePointUrl; + } + + public get market(): string + { + return this._market; + } + + public get lengthInDays(): number + { + return this._lengthInDays; + } +} diff --git a/packages/communication/src/messages/parser/catalog/FireworkChargeData.ts b/packages/communication/src/messages/parser/catalog/FireworkChargeData.ts new file mode 100644 index 0000000..dfa5981 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/FireworkChargeData.ts @@ -0,0 +1,51 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class FireworkChargeData +{ + private _stuffId: number; + private _charges: number; + private _SafeStr_6935: number; + private _SafeStr_6936: number; + private _SafeStr_6518: number; + private _SafeStr_7875: number; + + constructor(wrapper: IMessageDataWrapper) + { + this._stuffId = wrapper.readInt(); + this._charges = wrapper.readInt(); + this._SafeStr_6935 = wrapper.readInt(); + this._SafeStr_6936 = wrapper.readInt(); + this._SafeStr_6518 = wrapper.readInt(); + this._SafeStr_7875 = wrapper.readInt(); + } + + public get stuffId(): number + { + return this._stuffId; + } + + public get charges(): number + { + return this._charges; + } + + public get _SafeStr_5946(): number + { + return this._SafeStr_6935; + } + + public get _SafeStr_5944(): number + { + return this._SafeStr_6936; + } + + public get _SafeStr_7876(): number + { + return this._SafeStr_7875; + } + + public get _SafeStr_5945(): number + { + return this._SafeStr_6518; + } +} diff --git a/packages/communication/src/messages/parser/catalog/FireworkChargeDataParser.ts b/packages/communication/src/messages/parser/catalog/FireworkChargeDataParser.ts new file mode 100644 index 0000000..cde0977 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/FireworkChargeDataParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { FireworkChargeData } from './FireworkChargeData'; + +export class FireworkChargeDataParser implements IMessageParser +{ + private _fireworkChargeData: FireworkChargeData; + + public flush(): boolean + { + this._fireworkChargeData = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._fireworkChargeData = new FireworkChargeData(wrapper); + + return true; + } + + public get fireworkChargeData(): FireworkChargeData + { + return this._fireworkChargeData; + } +} diff --git a/packages/communication/src/messages/parser/catalog/FrontPageItem.ts b/packages/communication/src/messages/parser/catalog/FrontPageItem.ts new file mode 100644 index 0000000..7e7ffa7 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/FrontPageItem.ts @@ -0,0 +1,108 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class FrontPageItem +{ + public static ITEM_CATALOGUE_PAGE: number = 0; + public static ITEM_PRODUCT_OFFER: number = 1; + public static ITEM_IAP: number = 2; + + private _type: number; + private _position: number; + private _itemName: string; + private _itemPromoImage: string; + private _catalogPageLocation: string; + private _productCode: string; + private _productOfferId: number; + private _expirationTime: number; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this.flush(); + this.parse(wrapper); + } + + public flush(): boolean + { + this._type = -1; + this._position = null; + this._itemName = null; + this._itemPromoImage = null; + this._catalogPageLocation = null; + this._productCode = null; + this._productOfferId = 0; + this._expirationTime = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._position = wrapper.readInt(); + this._itemName = wrapper.readString(); + this._itemPromoImage = wrapper.readString(); + this._type = wrapper.readInt(); + + switch(this._type) + { + case FrontPageItem.ITEM_CATALOGUE_PAGE: + this._catalogPageLocation = wrapper.readString(); + break; + case FrontPageItem.ITEM_PRODUCT_OFFER: + this._productOfferId = wrapper.readInt(); + break; + case FrontPageItem.ITEM_IAP: + this._productCode = wrapper.readString(); + break; + } + + const time = wrapper.readInt(); + + this._expirationTime = ((time > 0) ? ((time * 1000) + 0) : 0); //GetTickerTime + + return true; + } + + public get type(): number + { + return this._type; + } + + public get position(): number + { + return this._position; + } + + public get itemName(): string + { + return this._itemName; + } + + public get itemPromoImage(): string + { + return this._itemPromoImage; + } + + public get catalogPageLocation(): string + { + return this._catalogPageLocation; + } + + public get productCode(): string + { + return this._productCode; + } + + public get productOfferId(): number + { + return this._productOfferId; + } + + public get expirationTime(): number + { + return this._expirationTime; + } +} diff --git a/packages/communication/src/messages/parser/catalog/GiftReceiverNotFoundParser.ts b/packages/communication/src/messages/parser/catalog/GiftReceiverNotFoundParser.ts new file mode 100644 index 0000000..34f64f9 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/GiftReceiverNotFoundParser.ts @@ -0,0 +1,20 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GiftReceiverNotFoundParser implements IMessageParser +{ + + public flush(): boolean + { + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } + + +} diff --git a/packages/communication/src/messages/parser/catalog/GiftWrappingConfigurationParser.ts b/packages/communication/src/messages/parser/catalog/GiftWrappingConfigurationParser.ts new file mode 100644 index 0000000..252070b --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/GiftWrappingConfigurationParser.ts @@ -0,0 +1,105 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GiftWrappingConfigurationParser implements IMessageParser +{ + private _isEnabled: boolean = false; + private _price: number = null; + private _giftWrappers: number[] = null; + private _boxTypes: number[] = null; + private _ribbonTypes: number[] = null; + private _giftFurnis: number[] = null; + + public flush(): boolean + { + this._boxTypes = null; + this._giftFurnis = null; + this._giftWrappers = null; + this._ribbonTypes = null; + this._isEnabled = null; + this._price = null; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + const giftWrappers = []; + const boxTypes = []; + const ribbonTypes = []; + const giftFurnis = []; + this._isEnabled = wrapper.readBoolean(); + // hotel.gifts.special.price + this._price = wrapper.readInt(); + + + let _local_3 = wrapper.readInt(); + + let i = 0; + while(i < _local_3) + { + giftWrappers.push(wrapper.readInt()); + i++; + } + + _local_3 = wrapper.readInt(); + i = 0; + while(i < _local_3) + { + boxTypes.push(wrapper.readInt()); + i++; + } + + _local_3 = wrapper.readInt(); + i = 0; + while(i < _local_3) + { + ribbonTypes.push(wrapper.readInt()); + i++; + } + + _local_3 = wrapper.readInt(); + i = 0; + while(i < _local_3) + { + giftFurnis.push(wrapper.readInt()); + i++; + } + + this._giftWrappers = giftWrappers; + this._ribbonTypes = ribbonTypes; + this._giftFurnis = giftFurnis; + this._boxTypes = boxTypes; + return true; + } + + public get giftWrappers(): number[] + { + return this._giftWrappers; + } + + public get ribbonTypes(): number[] + { + return this._ribbonTypes; + } + + public get giftFurnis(): number[] + { + return this._giftFurnis; + } + + public get boxTypes(): number[] + { + return this._boxTypes; + } + + public get isEnabled(): boolean + { + return this._isEnabled; + } + + public get price(): number + { + return this._price; + } +} diff --git a/packages/communication/src/messages/parser/catalog/HabboClubExtendOfferMessageParser.ts b/packages/communication/src/messages/parser/catalog/HabboClubExtendOfferMessageParser.ts new file mode 100644 index 0000000..7d5b586 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/HabboClubExtendOfferMessageParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { ClubOfferExtendData } from './ClubOfferExtendData'; + +export class HabboClubExtendOfferMessageParser implements IMessageParser +{ + private _offer: ClubOfferExtendData; + + public flush(): boolean + { + this._offer = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._offer = new ClubOfferExtendData(wrapper); + + return true; + } + + public get offer(): ClubOfferExtendData + { + return this._offer; + } +} diff --git a/packages/communication/src/messages/parser/catalog/HabboClubOffersMessageParser.ts b/packages/communication/src/messages/parser/catalog/HabboClubOffersMessageParser.ts new file mode 100644 index 0000000..c87ea4f --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/HabboClubOffersMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { ClubOfferData } from './ClubOfferData'; + +export class HabboClubOffersMessageParser implements IMessageParser +{ + private _offers: ClubOfferData[]; + + public flush(): boolean + { + this._offers = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalOffers = wrapper.readInt(); + + while(totalOffers > 0) + { + this._offers.push(new ClubOfferData(wrapper)); + + totalOffers--; + } + + return true; + } + + public get offers(): ClubOfferData[] + { + return this._offers; + } +} diff --git a/packages/communication/src/messages/parser/catalog/INodeData.ts b/packages/communication/src/messages/parser/catalog/INodeData.ts new file mode 100644 index 0000000..2c201e9 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/INodeData.ts @@ -0,0 +1,10 @@ +export interface INodeData +{ + visible: boolean; + icon: number; + pageId: number; + pageName: string; + localization: string; + children: INodeData[]; + offerIds: number[]; +} diff --git a/packages/communication/src/messages/parser/catalog/IsOfferGiftableMessageParser.ts b/packages/communication/src/messages/parser/catalog/IsOfferGiftableMessageParser.ts new file mode 100644 index 0000000..45bdefe --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/IsOfferGiftableMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class IsOfferGiftableMessageParser implements IMessageParser +{ + private _offerId: number; + private _isGiftable: boolean; + + public flush(): boolean + { + this._offerId = 0; + this._isGiftable = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._offerId = wrapper.readInt(); + this._isGiftable = wrapper.readBoolean(); + + return true; + } + + public get offerId(): number + { + return this._offerId; + } + + public get isGiftable(): boolean + { + return this._isGiftable; + } +} diff --git a/packages/communication/src/messages/parser/catalog/LimitedEditionSoldOutParser.ts b/packages/communication/src/messages/parser/catalog/LimitedEditionSoldOutParser.ts new file mode 100644 index 0000000..c641602 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/LimitedEditionSoldOutParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class LimitedEditionSoldOutParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/catalog/LimitedOfferAppearingNextMessageParser.ts b/packages/communication/src/messages/parser/catalog/LimitedOfferAppearingNextMessageParser.ts new file mode 100644 index 0000000..7fef6ce --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/LimitedOfferAppearingNextMessageParser.ts @@ -0,0 +1,51 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class LimitedOfferAppearingNextMessageParser implements IMessageParser +{ + private _appearsInSeconds: number; + private _pageId: number; + private _offerId: number; + private _productType: string; + + public flush(): boolean + { + this._appearsInSeconds = -1; + this._pageId = -1; + this._offerId = -1; + this._productType = ''; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._appearsInSeconds = wrapper.readInt(); + this._pageId = wrapper.readInt(); + this._offerId = wrapper.readInt(); + this._productType = wrapper.readString(); + + return true; + } + + public get appearsInSeconds(): number + { + return this._appearsInSeconds; + } + + public get pageId(): number + { + return this._pageId; + } + + public get offerId(): number + { + return this._offerId; + } + + public get productType(): string + { + return this._productType; + } +} diff --git a/packages/communication/src/messages/parser/catalog/NodeData.ts b/packages/communication/src/messages/parser/catalog/NodeData.ts new file mode 100644 index 0000000..7cd7b9a --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/NodeData.ts @@ -0,0 +1,99 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class NodeData +{ + private _visible: boolean; + private _icon: number; + private _pageId: number; + private _pageName: string; + private _localization: string; + private _children: NodeData[]; + private _offerIds: number[]; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this.flush(); + this.parse(wrapper); + } + + public flush(): boolean + { + this._visible = false; + this._icon = 0; + this._pageId = -1; + this._pageName = null; + this._localization = null; + this._children = []; + this._offerIds = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._visible = wrapper.readBoolean(); + this._icon = wrapper.readInt(); + this._pageId = wrapper.readInt(); + this._pageName = wrapper.readString(); + this._localization = wrapper.readString(); + + let totalOffers = wrapper.readInt(); + + while(totalOffers > 0) + { + this._offerIds.push(wrapper.readInt()); + + totalOffers--; + } + + let totalChildren = wrapper.readInt(); + + while(totalChildren > 0) + { + this._children.push(new NodeData(wrapper)); + + totalChildren--; + } + + return true; + } + + public get visible(): boolean + { + return this._visible; + } + + public get icon(): number + { + return this._icon; + } + + public get pageId(): number + { + return this._pageId; + } + + public get pageName(): string + { + return this._pageName; + } + + public get localization(): string + { + return this._localization; + } + + public get children(): NodeData[] + { + return this._children; + } + + public get offerIds(): number[] + { + return this._offerIds; + } +} diff --git a/packages/communication/src/messages/parser/catalog/NotEnoughBalanceMessageParser.ts b/packages/communication/src/messages/parser/catalog/NotEnoughBalanceMessageParser.ts new file mode 100644 index 0000000..65c5833 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/NotEnoughBalanceMessageParser.ts @@ -0,0 +1,44 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class NotEnoughBalanceMessageParser implements IMessageParser +{ + private _notEnoughCredits: boolean = false; + private _notEnoughActivityPoints: boolean = false; + private _activityPointType: number = 0; + + public flush(): boolean + { + this._notEnoughCredits = false; + this._notEnoughActivityPoints = false; + this._activityPointType = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._notEnoughCredits = wrapper.readBoolean(); + this._notEnoughActivityPoints = wrapper.readBoolean(); + + if(wrapper.bytesAvailable) this._activityPointType = wrapper.readInt(); + + return true; + } + + public get notEnoughCredits(): boolean + { + return this._notEnoughCredits; + } + + public get notEnoughActivityPoints(): boolean + { + return this._notEnoughActivityPoints; + } + + public get activityPointType(): number + { + return this._activityPointType; + } +} diff --git a/packages/communication/src/messages/parser/catalog/ProductOfferMessageParser.ts b/packages/communication/src/messages/parser/catalog/ProductOfferMessageParser.ts new file mode 100644 index 0000000..93072c1 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/ProductOfferMessageParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { CatalogPageMessageOfferData } from './CatalogPageMessageOfferData'; + +export class ProductOfferMessageParser implements IMessageParser +{ + private _offer: CatalogPageMessageOfferData; + + public flush(): boolean + { + this._offer = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._offer = new CatalogPageMessageOfferData(wrapper); + + return true; + } + + public get offer(): CatalogPageMessageOfferData + { + return this._offer; + } +} diff --git a/packages/communication/src/messages/parser/catalog/PurchaseErrorMessageParser.ts b/packages/communication/src/messages/parser/catalog/PurchaseErrorMessageParser.ts new file mode 100644 index 0000000..5c70a8e --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/PurchaseErrorMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class PurchaseErrorMessageParser implements IMessageParser +{ + private _code: number; + + public flush(): boolean + { + this._code = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._code = wrapper.readInt(); + + return true; + } + + public get code(): number + { + return this._code; + } +} diff --git a/packages/communication/src/messages/parser/catalog/PurchaseNotAllowedMessageParser.ts b/packages/communication/src/messages/parser/catalog/PurchaseNotAllowedMessageParser.ts new file mode 100644 index 0000000..4c17ee8 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/PurchaseNotAllowedMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class PurchaseNotAllowedMessageParser implements IMessageParser +{ + private _code: number; + + public flush(): boolean + { + this._code = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._code = wrapper.readInt(); + + return true; + } + + public get code(): number + { + return this._code; + } +} diff --git a/packages/communication/src/messages/parser/catalog/PurchaseOKMessageOfferData.ts b/packages/communication/src/messages/parser/catalog/PurchaseOKMessageOfferData.ts new file mode 100644 index 0000000..b32f0c9 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/PurchaseOKMessageOfferData.ts @@ -0,0 +1,117 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { CatalogPageMessageProductData } from './CatalogPageMessageProductData'; + +export class PurchaseOKMessageOfferData +{ + private _offerId: number; + private _localizationId: string; + private _rent: boolean; + private _priceCredits: number; + private _priceActivityPoints: number; + private _priceActivityPointsType: number; + private _clubLevel: number; + private _giftable: boolean; + private _bundlePurchaseAllowed: boolean; + private _products: CatalogPageMessageProductData[]; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this.flush(); + this.parse(wrapper); + } + + public flush(): boolean + { + this._offerId = -1; + this._localizationId = null; + this._rent = false; + this._priceCredits = 0; + this._priceActivityPoints = 0; + this._priceActivityPointsType = 0; + this._clubLevel = 0; + this._giftable = false; + this._bundlePurchaseAllowed = false; + this._products = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._offerId = wrapper.readInt(); + this._localizationId = wrapper.readString(); + this._rent = wrapper.readBoolean(); + this._priceCredits = wrapper.readInt(); + this._priceActivityPoints = wrapper.readInt(); + this._priceActivityPointsType = wrapper.readInt(); + this._giftable = wrapper.readBoolean(); + + let totalProducts = wrapper.readInt(); + + while(totalProducts > 0) + { + this._products.push(new CatalogPageMessageProductData(wrapper)); + + totalProducts--; + } + + this._clubLevel = wrapper.readInt(); + this._bundlePurchaseAllowed = wrapper.readBoolean(); + + return true; + } + + public get offerId(): number + { + return this._offerId; + } + + public get localizationId(): string + { + return this._localizationId; + } + + public get rent(): boolean + { + return this._rent; + } + + public get priceCredits(): number + { + return this._priceCredits; + } + + public get priceActivityPoints(): number + { + return this._priceActivityPoints; + } + + public get priceActivityPointsType(): number + { + return this._priceActivityPointsType; + } + + public get clubLevel(): number + { + return this._clubLevel; + } + + public get giftable(): boolean + { + return this._giftable; + } + + public get bundlePurchaseAllowed(): boolean + { + return this._bundlePurchaseAllowed; + } + + public get products(): CatalogPageMessageProductData[] + { + return this._products; + } +} diff --git a/packages/communication/src/messages/parser/catalog/PurchaseOKMessageParser.ts b/packages/communication/src/messages/parser/catalog/PurchaseOKMessageParser.ts new file mode 100644 index 0000000..2988c78 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/PurchaseOKMessageParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { PurchaseOKMessageOfferData } from './PurchaseOKMessageOfferData'; + +export class PurchaseOKMessageParser implements IMessageParser +{ + private _offer: PurchaseOKMessageOfferData; + + public flush(): boolean + { + this._offer = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._offer = new PurchaseOKMessageOfferData(wrapper); + + return true; + } + + public get offer(): PurchaseOKMessageOfferData + { + return this._offer; + } +} diff --git a/packages/communication/src/messages/parser/catalog/RoomAdPurchaseInfoEventParser.ts b/packages/communication/src/messages/parser/catalog/RoomAdPurchaseInfoEventParser.ts new file mode 100644 index 0000000..06d84fc --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/RoomAdPurchaseInfoEventParser.ts @@ -0,0 +1,44 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { RoomEntryData } from '../user'; + +export class RoomAdPurchaseInfoEventParser implements IMessageParser +{ + private _isVip: boolean; + private _rooms: RoomEntryData[]; + + public flush(): boolean + { + this._isVip = false; + this._rooms = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._isVip = wrapper.readBoolean(); + + let count = wrapper.readInt(); + + while(count > 0) + { + this._rooms.push(new RoomEntryData(wrapper.readInt(), wrapper.readString(), wrapper.readBoolean())); + + count--; + } + + return true; + } + + public get isVip(): boolean + { + return this._isVip; + } + + public get rooms(): RoomEntryData[] + { + return this._rooms; + } +} diff --git a/packages/communication/src/messages/parser/catalog/SeasonalCalendarDailyOfferMessageParser.ts b/packages/communication/src/messages/parser/catalog/SeasonalCalendarDailyOfferMessageParser.ts new file mode 100644 index 0000000..01a6141 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/SeasonalCalendarDailyOfferMessageParser.ts @@ -0,0 +1,36 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { CatalogPageMessageOfferData } from './CatalogPageMessageOfferData'; + +export class SeasonalCalendarDailyOfferMessageParser implements IMessageParser +{ + private _pageId: number; + private _data: CatalogPageMessageOfferData; + + public flush(): boolean + { + this._pageId = -1; + this._data = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._pageId = wrapper.readInt(); + this._data = new CatalogPageMessageOfferData(wrapper); + + return true; + } + + public get pageId(): number + { + return this._pageId; + } + + public get data(): CatalogPageMessageOfferData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/catalog/SellablePetPaletteData.ts b/packages/communication/src/messages/parser/catalog/SellablePetPaletteData.ts new file mode 100644 index 0000000..2674267 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/SellablePetPaletteData.ts @@ -0,0 +1,67 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class SellablePetPaletteData +{ + private _type: number; + private _breedId: number; + private _paletteId: number; + private _sellable: boolean; + private _rare: boolean; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this.flush(); + this.parse(wrapper); + } + + public flush(): boolean + { + this._type = -1; + this._breedId = -1; + this._paletteId = -1; + this._sellable = false; + this._rare = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._type = wrapper.readInt(); + this._breedId = wrapper.readInt(); + this._paletteId = wrapper.readInt(); + this._sellable = wrapper.readBoolean(); + this._rare = wrapper.readBoolean(); + + return true; + } + + public get type(): number + { + return this._type; + } + + public get breedId(): number + { + return this._breedId; + } + + public get paletteId(): number + { + return this._paletteId; + } + + public get sellable(): boolean + { + return this._sellable; + } + + public get rare(): boolean + { + return this._rare; + } +} diff --git a/packages/communication/src/messages/parser/catalog/SellablePetPalettesParser.ts b/packages/communication/src/messages/parser/catalog/SellablePetPalettesParser.ts new file mode 100644 index 0000000..f960aec --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/SellablePetPalettesParser.ts @@ -0,0 +1,44 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { SellablePetPaletteData } from './SellablePetPaletteData'; + +export class SellablePetPalettesParser implements IMessageParser +{ + private _productCode: string; + private _palettes: SellablePetPaletteData[]; + + public flush(): boolean + { + this._productCode = ''; + this._palettes = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._productCode = wrapper.readString(); + + let totalPalettes = wrapper.readInt(); + + while(totalPalettes > 0) + { + this._palettes.push(new SellablePetPaletteData(wrapper)); + + totalPalettes--; + } + + return true; + } + + public get productCode(): string + { + return this._productCode; + } + + public get palettes(): SellablePetPaletteData[] + { + return this._palettes; + } +} diff --git a/packages/communication/src/messages/parser/catalog/TargetedOfferData.ts b/packages/communication/src/messages/parser/catalog/TargetedOfferData.ts new file mode 100644 index 0000000..68e602a --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/TargetedOfferData.ts @@ -0,0 +1,153 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class TargetedOfferData +{ + protected _id: number; + protected _identifier: string; + protected _type: number; + protected _title: string; + protected _description: string; + protected _imageUrl: string; + protected _iconImageUrl: string; + protected _productCode: string; + protected _purchaseLimit: number; + protected _expirationTime: number; + protected _priceInCredits: number; + protected _priceInActivityPoints: number; + protected _activityPointType: number; + protected _subProductCodes: string[]; + protected _trackingState: number; + + constructor(wrapper: IMessageDataWrapper) + { + this._trackingState = wrapper.readInt(); + this._id = wrapper.readInt(); + this._identifier = wrapper.readString(); + this._productCode = wrapper.readString(); + this._priceInCredits = wrapper.readInt(); + this._priceInActivityPoints = wrapper.readInt(); + this._activityPointType = wrapper.readInt(); + this._purchaseLimit = wrapper.readInt(); + + const time = wrapper.readInt(); + this._expirationTime = ((time > 0) ? ((time * 1000) + Date.now()) : 0); + + this._title = wrapper.readString(); + this._description = wrapper.readString(); + this._imageUrl = wrapper.readString(); + this._iconImageUrl = wrapper.readString(); + this._type = wrapper.readInt(); + this._subProductCodes = []; + + let count = wrapper.readInt(); + + while(count > 0) + { + this._subProductCodes.push(wrapper.readString()); + + count--; + } + return this; + } + + public populate(offerData: TargetedOfferData) + { + if(!offerData) return; + + this._id = offerData.id; + this._identifier = offerData.identifier; + this._type = offerData.type; + this._title = offerData.title; + this._description = offerData.description; + this._imageUrl = offerData.imageUrl; + this._iconImageUrl = offerData.iconImageUrl; + this._productCode = offerData.productCode; + this._purchaseLimit = offerData.purchaseLimit; + this._expirationTime = offerData.expirationTime; + this._priceInCredits = offerData.priceInCredits; + this._priceInActivityPoints = offerData.priceInActivityPoints; + this._activityPointType = offerData.activityPointType; + this._subProductCodes = offerData.subProductCodes; + this._trackingState = offerData.trackingState; + } + + public purchase(k: number): void + { + this._purchaseLimit = (this._purchaseLimit - k); + } + + public get id(): number + { + return this._id; + } + + public get identifier(): string + { + return this._identifier; + } + + public get type(): number + { + return this._type; + } + + public get title(): string + { + return this._title; + } + + public get description(): string + { + return this._description; + } + + public get imageUrl(): string + { + return this._imageUrl; + } + + public get iconImageUrl(): string + { + return this._iconImageUrl; + } + + public get productCode(): string + { + return this._productCode; + } + + public get purchaseLimit(): number + { + return this._purchaseLimit; + } + + public get expirationTime(): number + { + return this._expirationTime; + } + + public get priceInCredits(): number + { + return this._priceInCredits; + } + + public get priceInActivityPoints(): number + { + return this._priceInActivityPoints; + } + + public get activityPointType(): number + { + return this._activityPointType; + } + + public get subProductCodes(): string[] + { + return this._subProductCodes; + } + + public get trackingState(): number + { + return this._trackingState; + } +} diff --git a/packages/communication/src/messages/parser/catalog/TargetedOfferNotFoundParser.ts b/packages/communication/src/messages/parser/catalog/TargetedOfferNotFoundParser.ts new file mode 100644 index 0000000..8f103ea --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/TargetedOfferNotFoundParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class TargetedOfferNotFoundParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/catalog/TargetedOfferParser.ts b/packages/communication/src/messages/parser/catalog/TargetedOfferParser.ts new file mode 100644 index 0000000..8191e15 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/TargetedOfferParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { TargetedOfferData } from './TargetedOfferData'; + +export class TargetedOfferParser implements IMessageParser +{ + private _data: TargetedOfferData; + + public flush(): boolean + { + this._data = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._data = new TargetedOfferData(wrapper); + + return true; + } + + public get data(): TargetedOfferData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/catalog/VoucherRedeemErrorMessageParser.ts b/packages/communication/src/messages/parser/catalog/VoucherRedeemErrorMessageParser.ts new file mode 100644 index 0000000..200f0f2 --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/VoucherRedeemErrorMessageParser.ts @@ -0,0 +1,26 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class VoucherRedeemErrorMessageParser implements IMessageParser +{ + private _errorCode: string = ''; + + public flush(): boolean + { + this._errorCode = ''; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._errorCode = wrapper.readString(); + + return true; + } + + public get errorCode(): string + { + return this._errorCode; + } +} diff --git a/packages/communication/src/messages/parser/catalog/VoucherRedeemOkMessageParser.ts b/packages/communication/src/messages/parser/catalog/VoucherRedeemOkMessageParser.ts new file mode 100644 index 0000000..55ea51f --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/VoucherRedeemOkMessageParser.ts @@ -0,0 +1,34 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class VoucherRedeemOkMessageParser implements IMessageParser +{ + private _productName: string = ''; + private _productDescription: string = ''; + + public flush(): boolean + { + this._productDescription = ''; + this._productName = ''; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._productDescription = wrapper.readString(); + this._productName = wrapper.readString(); + + return true; + } + + public get productName(): string + { + return this._productName; + } + + public get productDescription(): string + { + return this._productDescription; + } +} diff --git a/packages/communication/src/messages/parser/catalog/index.ts b/packages/communication/src/messages/parser/catalog/index.ts new file mode 100644 index 0000000..6225fef --- /dev/null +++ b/packages/communication/src/messages/parser/catalog/index.ts @@ -0,0 +1,46 @@ +export * from './BonusRareInfoMessageParser'; +export * from './BuildersClubFurniCountMessageParser'; +export * from './BuildersClubSubscriptionStatusMessageParser'; +export * from './BundleDiscountRuleset'; +export * from './BundleDiscountRulesetMessageParser'; +export * from './CatalogIndexMessageParser'; +export * from './CatalogLocalizationData'; +export * from './CatalogPageExpirationParser'; +export * from './CatalogPageMessageOfferData'; +export * from './CatalogPageMessageParser'; +export * from './CatalogPageMessageProductData'; +export * from './CatalogPageWithEarliestExpiryMessageParser'; +export * from './CatalogPublishedMessageParser'; +export * from './ClubGiftData'; +export * from './ClubGiftInfoParser'; +export * from './ClubGiftSelectedParser'; +export * from './ClubOfferData'; +export * from './ClubOfferExtendData'; +export * from './DirectSMSClubBuyAvailableMessageParser'; +export * from './FireworkChargeData'; +export * from './FireworkChargeDataParser'; +export * from './FrontPageItem'; +export * from './GiftReceiverNotFoundParser'; +export * from './GiftWrappingConfigurationParser'; +export * from './HabboClubExtendOfferMessageParser'; +export * from './HabboClubOffersMessageParser'; +export * from './INodeData'; +export * from './IsOfferGiftableMessageParser'; +export * from './LimitedEditionSoldOutParser'; +export * from './LimitedOfferAppearingNextMessageParser'; +export * from './NodeData'; +export * from './NotEnoughBalanceMessageParser'; +export * from './ProductOfferMessageParser'; +export * from './PurchaseErrorMessageParser'; +export * from './PurchaseNotAllowedMessageParser'; +export * from './PurchaseOKMessageOfferData'; +export * from './PurchaseOKMessageParser'; +export * from './RoomAdPurchaseInfoEventParser'; +export * from './SeasonalCalendarDailyOfferMessageParser'; +export * from './SellablePetPaletteData'; +export * from './SellablePetPalettesParser'; +export * from './TargetedOfferData'; +export * from './TargetedOfferNotFoundParser'; +export * from './TargetedOfferParser'; +export * from './VoucherRedeemErrorMessageParser'; +export * from './VoucherRedeemOkMessageParser'; diff --git a/packages/communication/src/messages/parser/client/ClientPingParser.ts b/packages/communication/src/messages/parser/client/ClientPingParser.ts new file mode 100644 index 0000000..156534e --- /dev/null +++ b/packages/communication/src/messages/parser/client/ClientPingParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ClientPingParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/client/index.ts b/packages/communication/src/messages/parser/client/index.ts new file mode 100644 index 0000000..129f672 --- /dev/null +++ b/packages/communication/src/messages/parser/client/index.ts @@ -0,0 +1 @@ +export * from './ClientPingParser'; diff --git a/packages/communication/src/messages/parser/competition/CompetitionEntrySubmitResultMessageParser.ts b/packages/communication/src/messages/parser/competition/CompetitionEntrySubmitResultMessageParser.ts new file mode 100644 index 0000000..590d91e --- /dev/null +++ b/packages/communication/src/messages/parser/competition/CompetitionEntrySubmitResultMessageParser.ts @@ -0,0 +1,83 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CompetitionEntrySubmitResultMessageParser implements IMessageParser +{ + public static SUBMITTED: number = 0; + public static ASK_FOR_SUBMIT: number = 1; + public static ASK_FOR_CONFIRM: number = 2; + public static PREREQUISITES_NOT_MET: number = 3; + public static ROOM_DOOR_NOT_OPEN: number = 4; + public static ROOM_TOO_OLD: number = 5; + public static ASK_FOR_ACCEPT_RULES: number = 6; + + private _goalId: number; + private _goalCode: string; + private _result: number; + private _requiredFurnis: string[]; + private _missingFurnis: { [index: string]: string }; + + public flush(): boolean + { + this._goalId = 0; + this._goalCode = null; + this._result = 0; + this._requiredFurnis = null; + this._missingFurnis = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + this._goalId = wrapper.readInt(); + this._goalCode = wrapper.readString(); + this._result = wrapper.readInt(); + this._requiredFurnis = []; + + let count = wrapper.readInt(); + + while(count > 0) + { + this._requiredFurnis.push(wrapper.readString()); + + count--; + } + + + count = wrapper.readInt(); + + while(count > 0) + { + this._missingFurnis[wrapper.readString()] = ''; + + count--; + } + + return true; + } + + public get goalId(): number + { + return this._goalId; + } + + public get goalCode(): string + { + return this._goalCode; + } + + public get result(): number + { + return this._result; + } + + public get requiredFurnis(): string[] + { + return this._requiredFurnis; + } + + public isMissing(name: string): boolean + { + return !!this._missingFurnis[name]; + } +} diff --git a/packages/communication/src/messages/parser/competition/CompetitionVotingInfoMessageParser.ts b/packages/communication/src/messages/parser/competition/CompetitionVotingInfoMessageParser.ts new file mode 100644 index 0000000..9012c1f --- /dev/null +++ b/packages/communication/src/messages/parser/competition/CompetitionVotingInfoMessageParser.ts @@ -0,0 +1,55 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { CompetitionVotingInfoResult } from './CompetitionVotingInfoResult'; + +export class CompetitionVotingInfoMessageParser implements IMessageParser +{ + private _goalId: number; + private _goalCode: string; + private _resultCode: number; + private _votesRemaining: number; + + public flush(): boolean + { + this._goalId = 0; + this._goalCode = null; + this._resultCode = 0; + this._votesRemaining = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + this._goalId = wrapper.readInt(); + this._goalCode = wrapper.readString(); + this._resultCode = wrapper.readInt(); + this._votesRemaining = wrapper.readInt(); + + return true; + } + + public get goalId(): number + { + return this._goalId; + } + + public get goalCode(): string + { + return this._goalCode; + } + + public get isVotingAllowedForUser(): boolean + { + return (this._resultCode === CompetitionVotingInfoResult.ALLOWED); + } + + public get votesRemaining(): number + { + return this._votesRemaining; + } + + public get resultCode(): number + { + return this._resultCode; + } +} diff --git a/packages/communication/src/messages/parser/competition/CompetitionVotingInfoResult.ts b/packages/communication/src/messages/parser/competition/CompetitionVotingInfoResult.ts new file mode 100644 index 0000000..119f9b5 --- /dev/null +++ b/packages/communication/src/messages/parser/competition/CompetitionVotingInfoResult.ts @@ -0,0 +1,6 @@ +export class CompetitionVotingInfoResult +{ + public static ALLOWED: number = 0; + public static REQUIRED_PERK_MISSING: number = 1; + public static REQUIRED_BADGE_MISSING: number = 2; +} diff --git a/packages/communication/src/messages/parser/competition/CurrentTimingCodeMessageParser.ts b/packages/communication/src/messages/parser/competition/CurrentTimingCodeMessageParser.ts new file mode 100644 index 0000000..7719f3b --- /dev/null +++ b/packages/communication/src/messages/parser/competition/CurrentTimingCodeMessageParser.ts @@ -0,0 +1,33 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CurrentTimingCodeMessageParser implements IMessageParser +{ + private _schedulingStr: string; + private _code: string; + + public flush(): boolean + { + this._schedulingStr = null; + this._code = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + this._schedulingStr = wrapper.readString(); + this._code = wrapper.readString(); + + return true; + } + + public get schedulingStr(): string + { + return this._schedulingStr; + } + + public get code(): string + { + return this._code; + } +} diff --git a/packages/communication/src/messages/parser/competition/IsUserPartOfCompetitionMessageParser.ts b/packages/communication/src/messages/parser/competition/IsUserPartOfCompetitionMessageParser.ts new file mode 100644 index 0000000..1fb1b83 --- /dev/null +++ b/packages/communication/src/messages/parser/competition/IsUserPartOfCompetitionMessageParser.ts @@ -0,0 +1,33 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class IsUserPartOfCompetitionMessageParser implements IMessageParser +{ + private _isPartOf: boolean; + private _targetId: number; + + public flush(): boolean + { + this._isPartOf = false; + this._targetId = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + this._isPartOf = wrapper.readBoolean(); + this._targetId = wrapper.readInt(); + + return true; + } + + public get isPartOf(): boolean + { + return this._isPartOf; + } + + public get targetId(): number + { + return this._targetId; + } +} diff --git a/packages/communication/src/messages/parser/competition/NoOwnedRoomsAlertMessageParser.ts b/packages/communication/src/messages/parser/competition/NoOwnedRoomsAlertMessageParser.ts new file mode 100644 index 0000000..b1e2101 --- /dev/null +++ b/packages/communication/src/messages/parser/competition/NoOwnedRoomsAlertMessageParser.ts @@ -0,0 +1,14 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class NoOwnedRoomsAlertMessageParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + return true; + } +} diff --git a/packages/communication/src/messages/parser/competition/SecondsUntilMessageParser.ts b/packages/communication/src/messages/parser/competition/SecondsUntilMessageParser.ts new file mode 100644 index 0000000..9c507bc --- /dev/null +++ b/packages/communication/src/messages/parser/competition/SecondsUntilMessageParser.ts @@ -0,0 +1,33 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class SecondsUntilMessageParser implements IMessageParser +{ + private _timeStr: string; + private _secondsUntil: number; + + public flush(): boolean + { + this._timeStr = null; + this._secondsUntil = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + this._timeStr = wrapper.readString(); + this._secondsUntil = wrapper.readInt(); + + return true; + } + + public get timeStr(): string + { + return this._timeStr; + } + + public get secondsUntil(): number + { + return this._secondsUntil; + } +} diff --git a/packages/communication/src/messages/parser/competition/index.ts b/packages/communication/src/messages/parser/competition/index.ts new file mode 100644 index 0000000..674fda0 --- /dev/null +++ b/packages/communication/src/messages/parser/competition/index.ts @@ -0,0 +1,7 @@ +export * from './CompetitionEntrySubmitResultMessageParser'; +export * from './CompetitionVotingInfoMessageParser'; +export * from './CompetitionVotingInfoResult'; +export * from './CurrentTimingCodeMessageParser'; +export * from './IsUserPartOfCompetitionMessageParser'; +export * from './NoOwnedRoomsAlertMessageParser'; +export * from './SecondsUntilMessageParser'; diff --git a/packages/communication/src/messages/parser/crafting/CraftableProductsMessageParser.ts b/packages/communication/src/messages/parser/crafting/CraftableProductsMessageParser.ts new file mode 100644 index 0000000..bae6f58 --- /dev/null +++ b/packages/communication/src/messages/parser/crafting/CraftableProductsMessageParser.ts @@ -0,0 +1,52 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { CraftingResultObjectParser } from './CraftingResultObjectParser'; + +export class CraftableProductsMessageParser implements IMessageParser +{ + private _recipes: CraftingResultObjectParser[]; + private _ingredients: string[]; + + constructor() + { + this._recipes = []; + this._ingredients = []; + } + + public flush(): boolean + { + this._recipes = []; + this._ingredients = []; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + const craftingResultCount = wrapper.readInt(); + for(let i = 0; i < craftingResultCount; i++) + { + this._recipes.push(new CraftingResultObjectParser(wrapper)); + } + const ingredientCount = wrapper.readInt(); + for(let i = 0; i < ingredientCount; i++) + { + this._ingredients.push(wrapper.readString()); + } + return true; + } + + public get recipes(): CraftingResultObjectParser[] + { + return this._recipes; + } + + public get ingredients(): string[] + { + return this._ingredients; + } + + public isActive(): boolean + { + return (this._recipes.length > 0) || (this._ingredients.length > 0); + } +} diff --git a/packages/communication/src/messages/parser/crafting/CraftingRecipeIngredientParser.ts b/packages/communication/src/messages/parser/crafting/CraftingRecipeIngredientParser.ts new file mode 100644 index 0000000..a9d61f3 --- /dev/null +++ b/packages/communication/src/messages/parser/crafting/CraftingRecipeIngredientParser.ts @@ -0,0 +1,23 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class CraftingRecipeIngredientParser +{ + private _count: number; + private _itemName: string; + + constructor(wrapper: IMessageDataWrapper) + { + this._count = wrapper.readInt(); + this._itemName = wrapper.readString(); + } + + public get count(): number + { + return this._count; + } + + public get itemName(): string + { + return this._itemName; + } +} diff --git a/packages/communication/src/messages/parser/crafting/CraftingRecipeMessageParser.ts b/packages/communication/src/messages/parser/crafting/CraftingRecipeMessageParser.ts new file mode 100644 index 0000000..1fe9f8a --- /dev/null +++ b/packages/communication/src/messages/parser/crafting/CraftingRecipeMessageParser.ts @@ -0,0 +1,34 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { CraftingRecipeIngredientParser } from './CraftingRecipeIngredientParser'; + +export class CraftingRecipeMessageParser implements IMessageParser +{ + private _ingredients: CraftingRecipeIngredientParser[]; + + constructor() + { + this._ingredients = []; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + const ingredientCount = wrapper.readInt(); + for(let i = 0; i < ingredientCount; i++) + { + this._ingredients.push(new CraftingRecipeIngredientParser(wrapper)); + } + return true; + } + + public flush(): boolean + { + this._ingredients = []; + return true; + } + + public get ingredients(): CraftingRecipeIngredientParser[] + { + return this._ingredients; + } +} diff --git a/packages/communication/src/messages/parser/crafting/CraftingRecipesAvailableMessageParser.ts b/packages/communication/src/messages/parser/crafting/CraftingRecipesAvailableMessageParser.ts new file mode 100644 index 0000000..bd214d5 --- /dev/null +++ b/packages/communication/src/messages/parser/crafting/CraftingRecipesAvailableMessageParser.ts @@ -0,0 +1,32 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CraftingRecipesAvailableMessageParser implements IMessageParser +{ + private _hasRecipes: boolean; + private _count: number; + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + this._count = wrapper.readInt(); + this._hasRecipes = wrapper.readBoolean(); + return true; + } + + public flush(): boolean + { + this._count = 0; + this._hasRecipes = false; + return true; + } + + public get count(): number + { + return this._count; + } + + public get hasRecipes(): boolean + { + return this._hasRecipes; + } +} diff --git a/packages/communication/src/messages/parser/crafting/CraftingResultMessageParser.ts b/packages/communication/src/messages/parser/crafting/CraftingResultMessageParser.ts new file mode 100644 index 0000000..d050532 --- /dev/null +++ b/packages/communication/src/messages/parser/crafting/CraftingResultMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { CraftingResultObjectParser } from './CraftingResultObjectParser'; + +export class CraftingResultMessageParser implements IMessageParser +{ + private _success: boolean; + private _result: CraftingResultObjectParser; + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + this._success = wrapper.readBoolean(); + if(this._success) + { + this._result = new CraftingResultObjectParser(wrapper); + } + return true; + } + + public flush(): boolean + { + this._success = false; + return true; + } + + public get success(): boolean + { + return this._success; + } + + public get result(): CraftingResultObjectParser + { + return this._result; + } +} diff --git a/packages/communication/src/messages/parser/crafting/CraftingResultObjectParser.ts b/packages/communication/src/messages/parser/crafting/CraftingResultObjectParser.ts new file mode 100644 index 0000000..f03eb69 --- /dev/null +++ b/packages/communication/src/messages/parser/crafting/CraftingResultObjectParser.ts @@ -0,0 +1,23 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class CraftingResultObjectParser +{ + private _recipeName: string; + private _itemName: string; + + constructor(wrapper: IMessageDataWrapper) + { + this._recipeName = wrapper.readString(); + this._itemName = wrapper.readString(); + } + + public get recipeName(): string + { + return this._recipeName; + } + + public get itemName(): string + { + return this._itemName; + } +} diff --git a/packages/communication/src/messages/parser/crafting/index.ts b/packages/communication/src/messages/parser/crafting/index.ts new file mode 100644 index 0000000..d0dc5ee --- /dev/null +++ b/packages/communication/src/messages/parser/crafting/index.ts @@ -0,0 +1,6 @@ +export * from './CraftableProductsMessageParser'; +export * from './CraftingRecipeIngredientParser'; +export * from './CraftingRecipeMessageParser'; +export * from './CraftingRecipesAvailableMessageParser'; +export * from './CraftingResultMessageParser'; +export * from './CraftingResultObjectParser'; diff --git a/packages/communication/src/messages/parser/desktop/DesktopViewParser.ts b/packages/communication/src/messages/parser/desktop/DesktopViewParser.ts new file mode 100644 index 0000000..577fb04 --- /dev/null +++ b/packages/communication/src/messages/parser/desktop/DesktopViewParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class DesktopViewParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/desktop/index.ts b/packages/communication/src/messages/parser/desktop/index.ts new file mode 100644 index 0000000..442a303 --- /dev/null +++ b/packages/communication/src/messages/parser/desktop/index.ts @@ -0,0 +1 @@ +export * from './DesktopViewParser'; diff --git a/packages/communication/src/messages/parser/friendlist/AcceptFriendFailureData.ts b/packages/communication/src/messages/parser/friendlist/AcceptFriendFailureData.ts new file mode 100644 index 0000000..ecf4bb2 --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/AcceptFriendFailureData.ts @@ -0,0 +1,25 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class AcceptFriendFailerData +{ + private _senderId: number; + private _errorCode: number; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this._senderId = wrapper.readInt(); + this._errorCode = wrapper.readInt(); + } + + public get senderId(): number + { + return this._senderId; + } + + public get errorCode(): number + { + return this._errorCode; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/AcceptFriendResultParser.ts b/packages/communication/src/messages/parser/friendlist/AcceptFriendResultParser.ts new file mode 100644 index 0000000..8dff4d1 --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/AcceptFriendResultParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { AcceptFriendFailerData } from './AcceptFriendFailureData'; + +export class AcceptFriendResultParser implements IMessageParser +{ + private _failuers: AcceptFriendFailerData[]; + + public flush(): boolean + { + this._failuers = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalFailures = wrapper.readInt(); + + while(totalFailures > 0) + { + this._failuers.push(new AcceptFriendFailerData(wrapper)); + + totalFailures--; + } + + return true; + } + + public get failures(): AcceptFriendFailerData[] + { + return this._failuers; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/FindFriendsProcessResultParser.ts b/packages/communication/src/messages/parser/friendlist/FindFriendsProcessResultParser.ts new file mode 100644 index 0000000..7ee7862 --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/FindFriendsProcessResultParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FindFriendsProcessResultParser implements IMessageParser +{ + private _success: boolean; + + public flush(): boolean + { + this._success = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._success = wrapper.readBoolean(); + + return true; + } + + public get success(): boolean + { + return this._success; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/FollowFriendFailedParser.ts b/packages/communication/src/messages/parser/friendlist/FollowFriendFailedParser.ts new file mode 100644 index 0000000..ca212de --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/FollowFriendFailedParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FollowFriendFailedParser implements IMessageParser +{ + private _errorCode: number; + + public flush(): boolean + { + this._errorCode = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._errorCode = wrapper.readInt(); + + return true; + } + + public get errorCode(): number + { + return this._errorCode; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/FriendCategoryData.ts b/packages/communication/src/messages/parser/friendlist/FriendCategoryData.ts new file mode 100644 index 0000000..a6165fe --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/FriendCategoryData.ts @@ -0,0 +1,25 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class FriendCategoryData +{ + private _id: number; + private _name: string; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this._id = wrapper.readInt(); + this._name = wrapper.readString(); + } + + public get id(): number + { + return this._id; + } + + public get name(): string + { + return this._name; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/FriendListFragmentMessageParser.ts b/packages/communication/src/messages/parser/friendlist/FriendListFragmentMessageParser.ts new file mode 100644 index 0000000..8186ce8 --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/FriendListFragmentMessageParser.ts @@ -0,0 +1,52 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { FriendParser } from './FriendParser'; + +export class FriendListFragmentParser implements IMessageParser +{ + private _totalFragments: number; + private _fragmentNumber: number; + private _fragment: FriendParser[]; + + public flush(): boolean + { + this._totalFragments = 0; + this._fragmentNumber = 0; + this._fragment = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._totalFragments = wrapper.readInt(); + this._fragmentNumber = wrapper.readInt(); + + let totalFriends = wrapper.readInt(); + + while(totalFriends > 0) + { + this._fragment.push(new FriendParser(wrapper)); + + totalFriends--; + } + + return true; + } + + public get totalFragments(): number + { + return this._totalFragments; + } + + public get fragmentNumber(): number + { + return this._fragmentNumber; + } + + public get fragment(): FriendParser[] + { + return this._fragment; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/FriendListUpdateParser.ts b/packages/communication/src/messages/parser/friendlist/FriendListUpdateParser.ts new file mode 100644 index 0000000..d8ef91d --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/FriendListUpdateParser.ts @@ -0,0 +1,81 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { FriendCategoryData } from './FriendCategoryData'; +import { FriendParser } from './FriendParser'; + +export class FriendListUpdateParser implements IMessageParser +{ + private _categories: FriendCategoryData[]; + private _removedFriendIds: number[]; + private _addedFriends: FriendParser[]; + private _updatedFriends: FriendParser[]; + + public flush(): boolean + { + this._categories = []; + this._removedFriendIds = []; + this._addedFriends = []; + this._updatedFriends = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalCategories = wrapper.readInt(); + + while(totalCategories > 0) + { + this._categories.push(new FriendCategoryData(wrapper)); + + totalCategories--; + } + + let totalUpdates = wrapper.readInt(); + + while(totalUpdates > 0) + { + const type = wrapper.readInt(); + + if(type === -1) + { + this._removedFriendIds.push(wrapper.readInt()); + } + + else if(type === 0) + { + this._updatedFriends.push(new FriendParser(wrapper)); + } + + else if(type === 1) + { + this._addedFriends.push(new FriendParser(wrapper)); + } + + totalUpdates--; + } + + return true; + } + + public get categories(): FriendCategoryData[] + { + return this._categories; + } + + public get removedFriendIds(): number[] + { + return this._removedFriendIds; + } + + public get addedFriends(): FriendParser[] + { + return this._addedFriends; + } + + public get updatedFriends(): FriendParser[] + { + return this._updatedFriends; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/FriendNotificationParser.ts b/packages/communication/src/messages/parser/friendlist/FriendNotificationParser.ts new file mode 100644 index 0000000..aee22ee --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/FriendNotificationParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FriendNotificationParser implements IMessageParser +{ + private _typeCode: number; + private _avatarId: number; + private _message: string; + + public flush(): boolean + { + this._typeCode = -1; + this._avatarId = 0; + this._message = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._typeCode = wrapper.readInt(); + this._avatarId = wrapper.readInt(); + this._message = wrapper.readString(); + + return true; + } + + public get typeCode(): number + { + return this._typeCode; + } + + public get avatarId(): number + { + return this._avatarId; + } + + public get message(): string + { + return this._message; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/FriendParser.ts b/packages/communication/src/messages/parser/friendlist/FriendParser.ts new file mode 100644 index 0000000..3f2042e --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/FriendParser.ts @@ -0,0 +1,109 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class FriendParser +{ + private _id: number; + private _name: string; + private _gender: number; + private _online: boolean; + private _followingAllowed: boolean; + private _figure: string; + private _categoryId: number; + private _motto: string; + private _realName: string; + private _lastAccess: string; + private _persistedMessageUser: boolean; + private _vipMember: boolean; + private _pocketHabboUser: boolean; + private _relationshipStatus: number; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this._id = wrapper.readInt(); + this._name = wrapper.readString(); + this._gender = wrapper.readInt(); + this._online = wrapper.readBoolean(); + this._followingAllowed = wrapper.readBoolean(); + this._figure = wrapper.readString(); + this._categoryId = wrapper.readInt(); + this._motto = wrapper.readString(); + this._realName = wrapper.readString(); + this._lastAccess = wrapper.readString(); + this._persistedMessageUser = wrapper.readBoolean(); + this._vipMember = wrapper.readBoolean(); + this._pocketHabboUser = wrapper.readBoolean(); + this._relationshipStatus = wrapper.readShort(); + } + + public get id(): number + { + return this._id; + } + + public get name(): string + { + return this._name; + } + + public get gender(): number + { + return this._gender; + } + + public get online(): boolean + { + return this._online; + } + + public get followingAllowed(): boolean + { + return this._followingAllowed; + } + + public get figure(): string + { + return this._figure; + } + + public get categoryId(): number + { + return this._categoryId; + } + + public get motto(): string + { + return this._motto; + } + + public get lastAccess(): string + { + return this._lastAccess; + } + + public get realName(): string + { + return this._realName; + } + + public get persistedMessageUser(): boolean + { + return this._persistedMessageUser; + } + + public get vipMember(): boolean + { + return this._vipMember; + } + + public get pocketHabboUser(): boolean + { + return this._pocketHabboUser; + } + + public get relationshipStatus(): number + { + return this._relationshipStatus; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/FriendRequestData.ts b/packages/communication/src/messages/parser/friendlist/FriendRequestData.ts new file mode 100644 index 0000000..47ddfc5 --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/FriendRequestData.ts @@ -0,0 +1,39 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class FriendRequestData +{ + private _requestId: number; + private _requesterName: string; + private _requesterUserId: number; + private _figureString: string; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this._requestId = wrapper.readInt(); + this._requesterName = wrapper.readString(); + this._figureString = wrapper.readString(); + this._requesterUserId = this._requestId; + } + + public get requestId(): number + { + return this._requestId; + } + + public get requesterName(): string + { + return this._requesterName; + } + + public get requesterUserId(): number + { + return this._requesterUserId; + } + + public get figureString(): string + { + return this._figureString; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/FriendRequestsParser.ts b/packages/communication/src/messages/parser/friendlist/FriendRequestsParser.ts new file mode 100644 index 0000000..3e591cf --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/FriendRequestsParser.ts @@ -0,0 +1,44 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { FriendRequestData } from './FriendRequestData'; + +export class FriendRequestsParser implements IMessageParser +{ + private _totalRequests: number; + private _requests: FriendRequestData[]; + + public flush(): boolean + { + this._totalRequests = 0; + this._requests = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._totalRequests = wrapper.readInt(); + + let totalRequests = wrapper.readInt(); + + while(totalRequests > 0) + { + this._requests.push(new FriendRequestData(wrapper)); + + totalRequests--; + } + + return true; + } + + public get totalRequests(): number + { + return this._totalRequests; + } + + public get requests(): FriendRequestData[] + { + return this._requests; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/HabboSearchResultData.ts b/packages/communication/src/messages/parser/friendlist/HabboSearchResultData.ts new file mode 100644 index 0000000..8b2f8c4 --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/HabboSearchResultData.ts @@ -0,0 +1,76 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class HabboSearchResultData +{ + private _avatarId: number; + private _avatarName: string; + private _avatarMotto: string; + private _isAvatarOnline: boolean; + private _canFollow: boolean; + private _avatarGender: number; + private _avatarFigure: string; + private _lastOnlineData: string; + private _realName: string; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this._avatarId = wrapper.readInt(); + this._avatarName = wrapper.readString(); + this._avatarMotto = wrapper.readString(); + this._isAvatarOnline = wrapper.readBoolean(); + this._canFollow = wrapper.readBoolean(); + + this._lastOnlineData = wrapper.readString(); // this was not assigned to anything on original packet + + this._avatarGender = wrapper.readInt(); + this._avatarFigure = wrapper.readString(); + this._realName = wrapper.readString(); + } + + public get avatarId(): number + { + return this._avatarId; + } + + public get avatarName(): string + { + return this._avatarName; + } + + public get avatarMotto(): string + { + return this._avatarMotto; + } + + public get isAvatarOnline(): boolean + { + return this._isAvatarOnline; + } + + public get canFollow(): boolean + { + return this._canFollow; + } + + public get avatarGender(): number + { + return this._avatarGender; + } + + public get avatarFigure(): string + { + return this._avatarFigure; + } + + public get lastOnlineData(): string + { + return this._lastOnlineData; + } + + public get realName(): string + { + return this._realName; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/HabboSearchResultParser.ts b/packages/communication/src/messages/parser/friendlist/HabboSearchResultParser.ts new file mode 100644 index 0000000..6e5d655 --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/HabboSearchResultParser.ts @@ -0,0 +1,51 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { HabboSearchResultData } from './HabboSearchResultData'; + +export class HabboSearchResultParser implements IMessageParser +{ + private _friends: HabboSearchResultData[]; + private _others: HabboSearchResultData[]; + + public flush(): boolean + { + this._friends = []; + this._others = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalFriends = wrapper.readInt(); + + while(totalFriends > 0) + { + this._friends.push(new HabboSearchResultData(wrapper)); + + totalFriends--; + } + + let totalOthers = wrapper.readInt(); + + while(totalOthers > 0) + { + this._others.push(new HabboSearchResultData(wrapper)); + + totalOthers--; + } + + return true; + } + + public get friends(): HabboSearchResultData[] + { + return this._friends; + } + + public get others(): HabboSearchResultData[] + { + return this._others; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/InstantMessageErrorParser.ts b/packages/communication/src/messages/parser/friendlist/InstantMessageErrorParser.ts new file mode 100644 index 0000000..bb74211 --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/InstantMessageErrorParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class InstantMessageErrorParser implements IMessageParser +{ + private _errorCode: number; + private _userId: number; + private _message: string; + + public flush(): boolean + { + this._errorCode = 0; + this._userId = 0; + this._message = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._errorCode = wrapper.readInt(); + this._userId = wrapper.readInt(); + this._message = wrapper.readString(); + + return true; + } + + public get errorCode(): number + { + return this._errorCode; + } + + public get userId(): number + { + return this._userId; + } + + public get message(): string + { + return this._message; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/MessageErrorParser.ts b/packages/communication/src/messages/parser/friendlist/MessageErrorParser.ts new file mode 100644 index 0000000..4821bbf --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/MessageErrorParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class MessageErrorParser implements IMessageParser +{ + private _clientMessageId: number; + private _errorCode: number; + + public flush(): boolean + { + this._clientMessageId = 0; + this._errorCode = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._clientMessageId = wrapper.readInt(); + this._errorCode = wrapper.readInt(); + + return true; + } + + public get clientMessageId(): number + { + return this._clientMessageId; + } + + public get errorCode(): number + { + return this._errorCode; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/MessengerInitParser.ts b/packages/communication/src/messages/parser/friendlist/MessengerInitParser.ts new file mode 100644 index 0000000..4a3a856 --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/MessengerInitParser.ts @@ -0,0 +1,59 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { FriendCategoryData } from './FriendCategoryData'; + +export class MessengerInitParser implements IMessageParser +{ + private _userFriendLimit: number; + private _normalFriendLimit: number; + private _extendedFriendLimit: number; + private _categories: FriendCategoryData[]; + + public flush(): boolean + { + this._userFriendLimit = 0; + this._normalFriendLimit = 0; + this._extendedFriendLimit = 0; + this._categories = []; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._userFriendLimit = wrapper.readInt(); + this._normalFriendLimit = wrapper.readInt(); + this._extendedFriendLimit = wrapper.readInt(); + + let totalCategories = wrapper.readInt(); + + while(totalCategories > 0) + { + this._categories.push(new FriendCategoryData(wrapper)); + + totalCategories--; + } + + return true; + } + + public get userFriendLimit(): number + { + return this._userFriendLimit; + } + + public get normalFriendLimit(): number + { + return this._normalFriendLimit; + } + + public get extendedFriendLimit(): number + { + return this._extendedFriendLimit; + } + + public get categories(): FriendCategoryData[] + { + return this._categories; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/MiniMailNewMessageParser.ts b/packages/communication/src/messages/parser/friendlist/MiniMailNewMessageParser.ts new file mode 100644 index 0000000..c43f538 --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/MiniMailNewMessageParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class MiniMailNewMessageParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/MiniMailUnreadCountParser.ts b/packages/communication/src/messages/parser/friendlist/MiniMailUnreadCountParser.ts new file mode 100644 index 0000000..2afe79a --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/MiniMailUnreadCountParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class MiniMailUnreadCountParser implements IMessageParser +{ + private _count: number; + + public flush(): boolean + { + this._count = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._count = wrapper.readInt(); + + return true; + } + + public get count(): number + { + return this._count; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/NewConsoleMessageParser.ts b/packages/communication/src/messages/parser/friendlist/NewConsoleMessageParser.ts new file mode 100644 index 0000000..623f83f --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/NewConsoleMessageParser.ts @@ -0,0 +1,55 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class NewConsoleMessageParser implements IMessageParser +{ + private _senderId: number; + private _messageText: string; + private _secondsSinceSent: number; + private _extraData: string; + + public flush(): boolean + { + this._senderId = 0; + this._messageText = null; + this._secondsSinceSent = 0; + this._extraData = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._senderId = wrapper.readInt(); + this._messageText = wrapper.readString(); + this._secondsSinceSent = wrapper.readInt(); + + if(wrapper.bytesAvailable) + { + this._extraData = wrapper.readString(); + } + + return true; + } + + public get senderId(): number + { + return this._senderId; + } + + public get messageText(): string + { + return this._messageText; + } + + public get secondsSinceSent(): number + { + return this._secondsSinceSent; + } + + public get extraData(): string + { + return this._extraData; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/NewFriendRequestMessageParser.ts b/packages/communication/src/messages/parser/friendlist/NewFriendRequestMessageParser.ts new file mode 100644 index 0000000..8764657 --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/NewFriendRequestMessageParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { FriendRequestData } from './FriendRequestData'; + +export class NewFriendRequestParser implements IMessageParser +{ + private _request: FriendRequestData; + + public flush(): boolean + { + this._request = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._request = new FriendRequestData(wrapper); + + return true; + } + + public get request(): FriendRequestData + { + return this._request; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/RoomInviteErrorParser.ts b/packages/communication/src/messages/parser/friendlist/RoomInviteErrorParser.ts new file mode 100644 index 0000000..fa658e8 --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/RoomInviteErrorParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomInviteErrorParser implements IMessageParser +{ + private _errorCode: number; + private _failedRecipients: number[]; + + public flush(): boolean + { + this._errorCode = 0; + this._failedRecipients = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._errorCode = wrapper.readInt(); + + let totalFailed = wrapper.readInt(); + + while(totalFailed > 0) + { + this._failedRecipients.push(wrapper.readInt()); + + totalFailed--; + } + + return true; + } + + public get errorCode(): number + { + return this._errorCode; + } + + public get failedRecipients(): number[] + { + return this._failedRecipients; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/RoomInviteMessageParser.ts b/packages/communication/src/messages/parser/friendlist/RoomInviteMessageParser.ts new file mode 100644 index 0000000..671da95 --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/RoomInviteMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomInviteParser implements IMessageParser +{ + private _senderId: number; + private _messageText: string; + + public flush(): boolean + { + this._senderId = 0; + this._messageText = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._senderId = wrapper.readInt(); + this._messageText = wrapper.readString(); + + return true; + } + + public get senderId(): number + { + return this._senderId; + } + + public get messageText(): string + { + return this._messageText; + } +} diff --git a/packages/communication/src/messages/parser/friendlist/index.ts b/packages/communication/src/messages/parser/friendlist/index.ts new file mode 100644 index 0000000..6542588 --- /dev/null +++ b/packages/communication/src/messages/parser/friendlist/index.ts @@ -0,0 +1,22 @@ +export * from './AcceptFriendFailureData'; +export * from './AcceptFriendResultParser'; +export * from './FindFriendsProcessResultParser'; +export * from './FollowFriendFailedParser'; +export * from './FriendCategoryData'; +export * from './FriendListFragmentMessageParser'; +export * from './FriendListUpdateParser'; +export * from './FriendNotificationParser'; +export * from './FriendParser'; +export * from './FriendRequestData'; +export * from './FriendRequestsParser'; +export * from './HabboSearchResultData'; +export * from './HabboSearchResultParser'; +export * from './InstantMessageErrorParser'; +export * from './MessageErrorParser'; +export * from './MessengerInitParser'; +export * from './MiniMailNewMessageParser'; +export * from './MiniMailUnreadCountParser'; +export * from './NewConsoleMessageParser'; +export * from './NewFriendRequestMessageParser'; +export * from './RoomInviteErrorParser'; +export * from './RoomInviteMessageParser'; diff --git a/packages/communication/src/messages/parser/game/directory/Game2AccountGameStatusMessageParser.ts b/packages/communication/src/messages/parser/game/directory/Game2AccountGameStatusMessageParser.ts new file mode 100644 index 0000000..fdd7675 --- /dev/null +++ b/packages/communication/src/messages/parser/game/directory/Game2AccountGameStatusMessageParser.ts @@ -0,0 +1,45 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class Game2AccountGameStatusMessageParser implements IMessageParser +{ + private _gameTypeId:number; + private _freeGamesLeft:number; + private _gamesPlayedTotal:number; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._gameTypeId = wrapper.readInt(); + this._freeGamesLeft = wrapper.readInt(); + this._gamesPlayedTotal = wrapper.readInt(); + + return true; + } + + public get gameTypeId():number + { + return this._gameTypeId; + } + + public get freeGamesLeft():number + { + return this._freeGamesLeft; + } + + public get gamesPlayedTotal():number + { + return this._gamesPlayedTotal; + } + + public get hasUnlimitedGames():boolean + { + return this._freeGamesLeft == -1; + } + +} diff --git a/packages/communication/src/messages/parser/game/directory/Game2GameDirectoryStatusMessageParser.ts b/packages/communication/src/messages/parser/game/directory/Game2GameDirectoryStatusMessageParser.ts new file mode 100644 index 0000000..b758fbb --- /dev/null +++ b/packages/communication/src/messages/parser/game/directory/Game2GameDirectoryStatusMessageParser.ts @@ -0,0 +1,61 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class Game2GameDirectoryStatusMessageParser implements IMessageParser +{ + public static readonly STATUS_OK: number = 0; + public static readonly STATUS_FAILED_REASON_UNKNOWN: number = 1; + public static readonly STATUS_FAILED_REASON_GAME_DIRECTORY_IS_NOT_AVAILABLE: number = 2; + public static readonly STATUS_FAILED_REASON_HOTEL_IS_CLOSED: number = 3; + + private _status: number; + private _blockLength: number; + private _gamesPlayed: number; + private _freeGamesLeft: number; + + public flush(): boolean + { + this._status = -1; + this._blockLength = -1; + this._gamesPlayed = -1; + this._freeGamesLeft = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._status = wrapper.readInt(); + this._blockLength = wrapper.readInt(); + this._gamesPlayed = wrapper.readInt(); + this._freeGamesLeft = wrapper.readInt(); + + return true; + } + + public get status(): number + { + return this._status; + } + + public get blockLength(): number + { + return this._blockLength; + } + + public get gamesPlayed(): number + { + return this._gamesPlayed; + } + + public get freeGamesLeft(): number + { + return this._freeGamesLeft; + } + + public get hasUnlimitedGames(): boolean + { + return this._freeGamesLeft == -1; + } +} diff --git a/packages/communication/src/messages/parser/game/directory/Game2InArenaQueueMessageParser.ts b/packages/communication/src/messages/parser/game/directory/Game2InArenaQueueMessageParser.ts new file mode 100644 index 0000000..8e09846 --- /dev/null +++ b/packages/communication/src/messages/parser/game/directory/Game2InArenaQueueMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class Game2InArenaQueueMessageParser implements IMessageParser +{ + private _position: number; + + public flush(): boolean + { + this._position = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._position = wrapper.readInt(); + + return true; + } + + public get position(): number + { + return this._position; + } +} diff --git a/packages/communication/src/messages/parser/game/directory/Game2JoiningGameFailedMessageParser.ts b/packages/communication/src/messages/parser/game/directory/Game2JoiningGameFailedMessageParser.ts new file mode 100644 index 0000000..c00f08b --- /dev/null +++ b/packages/communication/src/messages/parser/game/directory/Game2JoiningGameFailedMessageParser.ts @@ -0,0 +1,36 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class Game2JoiningGameFailedMessageParser implements IMessageParser +{ + public static readonly KICKED: number = 1; + public static readonly DUPLICATE_MACHINEID: number = 2; + public static readonly INVITATION_REQUIRED: number = 3; + public static readonly NO_SPACE_IN_TEAM: number = 4; + public static readonly TEAM_NOT_FOUND: number = 5; + public static readonly USER_HAS_ACTIVE_INSTANCE: number = 6; + public static readonly USER_HAS_PENDING_INSTANCE_REQUEST: number = 7; + public static readonly USER_HAS_NO_FREE_GAMES_LEFT: number = 8; + + private _reason: number; + + public flush(): boolean + { + this._reason = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._reason = wrapper.readInt(); + + return true; + } + + public get reason(): number + { + return this._reason; + } +} diff --git a/packages/communication/src/messages/parser/game/directory/Game2StartingGameFailedMessageParser.ts b/packages/communication/src/messages/parser/game/directory/Game2StartingGameFailedMessageParser.ts new file mode 100644 index 0000000..2c94785 --- /dev/null +++ b/packages/communication/src/messages/parser/game/directory/Game2StartingGameFailedMessageParser.ts @@ -0,0 +1,30 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class Game2StartingGameFailedMessageParser implements IMessageParser +{ + public static readonly NOT_ENOUGH_PLAYERS: number = 1; + public static readonly GAME_HAS_NO_OWNER: number = 2; + + private _reason: number; + + public flush(): boolean + { + this._reason = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._reason = wrapper.readInt(); + + return true; + } + + public get reason(): number + { + return this._reason; + } +} diff --git a/packages/communication/src/messages/parser/game/directory/Game2StopCounterMessageParser.ts b/packages/communication/src/messages/parser/game/directory/Game2StopCounterMessageParser.ts new file mode 100644 index 0000000..51bf9cf --- /dev/null +++ b/packages/communication/src/messages/parser/game/directory/Game2StopCounterMessageParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class Game2StopCounterMessageParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/game/directory/Game2UserLeftGameMessageParser.ts b/packages/communication/src/messages/parser/game/directory/Game2UserLeftGameMessageParser.ts new file mode 100644 index 0000000..a12f7f1 --- /dev/null +++ b/packages/communication/src/messages/parser/game/directory/Game2UserLeftGameMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class Game2UserLeftGameMessageParser implements IMessageParser +{ + private _userId: number; + + public flush(): boolean + { + this._userId = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._userId = wrapper.readInt(); + + return true; + } + + public get userId():number + { + return this._userId; + } +} diff --git a/packages/communication/src/messages/parser/game/directory/index.ts b/packages/communication/src/messages/parser/game/directory/index.ts new file mode 100644 index 0000000..917ffbb --- /dev/null +++ b/packages/communication/src/messages/parser/game/directory/index.ts @@ -0,0 +1,7 @@ +export * from './Game2AccountGameStatusMessageParser'; +export * from './Game2GameDirectoryStatusMessageParser'; +export * from './Game2InArenaQueueMessageParser'; +export * from './Game2JoiningGameFailedMessageParser'; +export * from './Game2StartingGameFailedMessageParser'; +export * from './Game2StopCounterMessageParser'; +export * from './Game2UserLeftGameMessageParser'; diff --git a/packages/communication/src/messages/parser/game/index.ts b/packages/communication/src/messages/parser/game/index.ts new file mode 100644 index 0000000..779f388 --- /dev/null +++ b/packages/communication/src/messages/parser/game/index.ts @@ -0,0 +1,3 @@ +export * from './directory'; +export * from './lobby'; +export * from './score'; diff --git a/packages/communication/src/messages/parser/game/lobby/AchievementResolutionCompletedMessageParser.ts b/packages/communication/src/messages/parser/game/lobby/AchievementResolutionCompletedMessageParser.ts new file mode 100644 index 0000000..65764c5 --- /dev/null +++ b/packages/communication/src/messages/parser/game/lobby/AchievementResolutionCompletedMessageParser.ts @@ -0,0 +1,32 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class AchievementResolutionCompletedMessageParser implements IMessageParser +{ + private _stuffCode:string; + private _badgeCode:string; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._stuffCode = wrapper.readString(); + this._badgeCode = wrapper.readString(); + + return true; + } + + public get stuffCode():string + { + return this._stuffCode; + } + + public get badgeCode():string + { + return this._badgeCode; + } +} diff --git a/packages/communication/src/messages/parser/game/lobby/AchievementResolutionProgressMessageParser.ts b/packages/communication/src/messages/parser/game/lobby/AchievementResolutionProgressMessageParser.ts new file mode 100644 index 0000000..b1c7b77 --- /dev/null +++ b/packages/communication/src/messages/parser/game/lobby/AchievementResolutionProgressMessageParser.ts @@ -0,0 +1,66 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class AchievementResolutionProgressMessageParser implements IMessageParser +{ + private _stuffId:number; + private _achievementId:number; + private _requiredLevelBadgeCode:string; + private _userProgress:number; + private _totalProgress:number; + private _endTime:number; + + public flush(): boolean + { + this._stuffId = -1; + this._achievementId = 0; + this._requiredLevelBadgeCode = ''; + this._userProgress = 0; + this._totalProgress = 0; + this._endTime = 0; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._stuffId = wrapper.readInt(); + this._achievementId = wrapper.readInt(); + this._requiredLevelBadgeCode = wrapper.readString(); + this._userProgress = wrapper.readInt(); + this._totalProgress = wrapper.readInt(); + this._endTime = wrapper.readInt(); + + return true; + } + + public get stuffId():number + { + return this._stuffId; + } + + public get achievementId():number + { + return this._achievementId; + } + + public get requiredLevelBadgeCode():string + { + return this._requiredLevelBadgeCode; + } + + public get userProgress():number + { + return this._userProgress; + } + + public get totalProgress():number + { + return this._totalProgress; + } + + public get endTime():number + { + return this._endTime; + } +} diff --git a/packages/communication/src/messages/parser/game/lobby/AchievementResolutionsMessageParser.ts b/packages/communication/src/messages/parser/game/lobby/AchievementResolutionsMessageParser.ts new file mode 100644 index 0000000..bc40f66 --- /dev/null +++ b/packages/communication/src/messages/parser/game/lobby/AchievementResolutionsMessageParser.ts @@ -0,0 +1,46 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { AchievementResolutionData } from '../../inventory'; + +export class AchievementResolutionsMessageParser implements IMessageParser +{ + private _stuffId:number; + private _achievements:AchievementResolutionData[]; + private _endTime:number; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._stuffId = wrapper.readInt(); + const count = wrapper.readInt(); + let _local_3 = 0; + while(_local_3 < count) + { + this._achievements.push(new AchievementResolutionData(wrapper)); + _local_3++; + } + this._endTime = wrapper.readInt(); + + return true; + } + + public get stuffId():number + { + return this._stuffId; + } + + public get achievements():AchievementResolutionData[] + { + return this._achievements; + } + + public get endTime():number + { + return this._endTime; + } +} diff --git a/packages/communication/src/messages/parser/game/lobby/GameAchievementData.ts b/packages/communication/src/messages/parser/game/lobby/GameAchievementData.ts new file mode 100644 index 0000000..6fbd040 --- /dev/null +++ b/packages/communication/src/messages/parser/game/lobby/GameAchievementData.ts @@ -0,0 +1,35 @@ +export class GameAchievementData +{ + private _gameTypeId:number; + private _achievementId:number; + private _achievementName:string; + private _levels:number; + + constructor(gameTypeId:number, achievementId:number, achievementName:string, levels:number) + { + this._gameTypeId = gameTypeId; + this._achievementId = achievementId; + this._achievementName = achievementName; + this._levels = levels; + } + + public get gameTypeId():number + { + return this._gameTypeId; + } + + public get achievementId():number + { + return this._achievementId; + } + + public get achievementName():string + { + return this._achievementName; + } + + public get levels():number + { + return this._levels; + } +} diff --git a/packages/communication/src/messages/parser/game/lobby/GameAchievementsMessageParser.ts b/packages/communication/src/messages/parser/game/lobby/GameAchievementsMessageParser.ts new file mode 100644 index 0000000..f74a433 --- /dev/null +++ b/packages/communication/src/messages/parser/game/lobby/GameAchievementsMessageParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { GameAchievementData } from './GameAchievementData'; + +export class GameAchievementsMessageParser implements IMessageParser +{ + private _achievements:GameAchievementData[]; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._achievements = []; + const count = wrapper.readInt(); + let _local_3 = 0; + while(_local_3 < count) + { + const gameTypeId = wrapper.readInt(); + const achievementCount = wrapper.readInt(); + let _local_6 = 0; + while(_local_6 < achievementCount) + { + const achievementId = wrapper.readInt(); + const achievementName = wrapper.readString(); + const levels = wrapper.readInt(); + this._achievements.push(new GameAchievementData(gameTypeId, achievementId, achievementName, levels)); + _local_6++; + } + _local_3++; + } + + return true; + } + + public get achievements():GameAchievementData[] + { + return this._achievements; + } +} diff --git a/packages/communication/src/messages/parser/game/lobby/GameConfigurationData.ts b/packages/communication/src/messages/parser/game/lobby/GameConfigurationData.ts new file mode 100644 index 0000000..4bf7e87 --- /dev/null +++ b/packages/communication/src/messages/parser/game/lobby/GameConfigurationData.ts @@ -0,0 +1,49 @@ +export class GameConfigurationData +{ + private _gameId:number; + private _gameNameId:string; + private _bgColor:number; + private _textColor:number; + private _assetUrl:string; + private _supportUrl:string; + + constructor(gameId:number, gameNameId:string, bgColor:number, textColor:number, assetUrl:string, supportUrl:string) + { + this._gameId = gameId; + this._gameNameId = gameNameId; + this._bgColor = bgColor; + this._textColor = textColor; + this._assetUrl = assetUrl; + this._supportUrl = supportUrl; + } + + public get gameId():number + { + return this._gameId; + } + + public get gameNameId():string + { + return this._gameNameId; + } + + public get bgColor():number + { + return this._bgColor; + } + + public get textColor():number + { + return this._textColor; + } + + public get assetUrl():string + { + return this._assetUrl; + } + + public get supportUrl():string + { + return this._supportUrl; + } +} diff --git a/packages/communication/src/messages/parser/game/lobby/GameInviteMessageParser.ts b/packages/communication/src/messages/parser/game/lobby/GameInviteMessageParser.ts new file mode 100644 index 0000000..94dcc10 --- /dev/null +++ b/packages/communication/src/messages/parser/game/lobby/GameInviteMessageParser.ts @@ -0,0 +1,32 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GameInviteMessageParser implements IMessageParser +{ + private _gameTypeId:number; + private _inviterId:number; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._gameTypeId = wrapper.readInt(); + this._inviterId = wrapper.readInt(); + + return true; + } + + public get gameTypeId():number + { + return this._gameTypeId; + } + + public get inviterId():number + { + return this._inviterId; + } +} diff --git a/packages/communication/src/messages/parser/game/lobby/GameListMessageParser.ts b/packages/communication/src/messages/parser/game/lobby/GameListMessageParser.ts new file mode 100644 index 0000000..6414e06 --- /dev/null +++ b/packages/communication/src/messages/parser/game/lobby/GameListMessageParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { GameConfigurationData } from './GameConfigurationData'; + +export class GameListMessageParser implements IMessageParser +{ + private _games:GameConfigurationData[]; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._games = []; + + const count = wrapper.readInt(); + + for(let i = 0; i < count; i++) + { + const gameId = wrapper.readInt(); + const gameNameId = wrapper.readString(); + const _local_6 = wrapper.readString(); + let bgColor = parseInt(_local_6, 16); + bgColor = (bgColor | 0xFF000000); + const _local_8 = wrapper.readString(); + let textColor = parseInt(_local_8, 16); + textColor = (textColor | 0xFF000000); + const assetUrl = wrapper.readString(); + const supportUrl = wrapper.readString(); + this._games.push(new GameConfigurationData(gameId, gameNameId, bgColor, textColor, assetUrl, supportUrl)); + } + + return true; + } + + public get games(): GameConfigurationData[] + { + return this._games; + } +} diff --git a/packages/communication/src/messages/parser/game/lobby/GameStatusMessageParser.ts b/packages/communication/src/messages/parser/game/lobby/GameStatusMessageParser.ts new file mode 100644 index 0000000..8ac106e --- /dev/null +++ b/packages/communication/src/messages/parser/game/lobby/GameStatusMessageParser.ts @@ -0,0 +1,40 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GameStatusMessageParser implements IMessageParser +{ + private static readonly OK = 0; + private static readonly MAINTENANCE = 1; + + private _gameTypeId:number; + private _status:number; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._gameTypeId = wrapper.readInt(); + this._status = wrapper.readInt(); + + return true; + } + + public get gameTypeId():number + { + return this._gameTypeId; + } + + public get isOk():boolean + { + return this._status == GameStatusMessageParser.OK; + } + + public get isInMaintenance():boolean + { + return this._status == GameStatusMessageParser.MAINTENANCE; + } +} diff --git a/packages/communication/src/messages/parser/game/lobby/JoinedQueueMessageParser.ts b/packages/communication/src/messages/parser/game/lobby/JoinedQueueMessageParser.ts new file mode 100644 index 0000000..6826dfa --- /dev/null +++ b/packages/communication/src/messages/parser/game/lobby/JoinedQueueMessageParser.ts @@ -0,0 +1,25 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class JoinedQueueMessageParser implements IMessageParser +{ + private _gameTypeId:number; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._gameTypeId = wrapper.readInt(); + + return true; + } + + public get gameTypeId():number + { + return this._gameTypeId; + } +} diff --git a/packages/communication/src/messages/parser/game/lobby/JoiningQueueFailedMessageParser.ts b/packages/communication/src/messages/parser/game/lobby/JoiningQueueFailedMessageParser.ts new file mode 100644 index 0000000..9ca821f --- /dev/null +++ b/packages/communication/src/messages/parser/game/lobby/JoiningQueueFailedMessageParser.ts @@ -0,0 +1,34 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class JoiningQueueFailedMessageParser implements IMessageParser +{ + public static readonly DUPLICATE_MACHINEID = 1; + + private _gameTypeId:number; + private _reason:number; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._gameTypeId = wrapper.readInt(); + this._reason = wrapper.readInt(); + + return true; + } + + public get gameTypeId():number + { + return this._gameTypeId; + } + + public get reason():number + { + return this._reason; + } +} diff --git a/packages/communication/src/messages/parser/game/lobby/LeftQueueMessageParser.ts b/packages/communication/src/messages/parser/game/lobby/LeftQueueMessageParser.ts new file mode 100644 index 0000000..a65bbc4 --- /dev/null +++ b/packages/communication/src/messages/parser/game/lobby/LeftQueueMessageParser.ts @@ -0,0 +1,25 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class LeftQueueMessageParser implements IMessageParser +{ + private _gameTypeId:number; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._gameTypeId = wrapper.readInt(); + + return true; + } + + public get gameTypeId():number + { + return this._gameTypeId; + } +} diff --git a/packages/communication/src/messages/parser/game/lobby/LoadGameMessageParser.ts b/packages/communication/src/messages/parser/game/lobby/LoadGameMessageParser.ts new file mode 100644 index 0000000..5b6f834 --- /dev/null +++ b/packages/communication/src/messages/parser/game/lobby/LoadGameMessageParser.ts @@ -0,0 +1,88 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class LoadGameMessageParser implements IMessageParser +{ + private _gameTypeId:number; + private _url:string; + private _quality:string; + private _scaleMode:string; + private _frameRate:number; + private _minMajorVersion:number; + private _minMinorVersion:number; + private _params:Map; + private _gameClientId:string; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._gameTypeId = wrapper.readInt(); + this._gameClientId = wrapper.readString(); + this._url = wrapper.readString(); + this._quality = wrapper.readString(); + this._scaleMode = wrapper.readString(); + this._frameRate = wrapper.readInt(); + this._minMajorVersion = wrapper.readInt(); + this._minMinorVersion = wrapper.readInt(); + this._params = new Map(); + const count = wrapper.readInt(); + let _local_3 = 0; + while(_local_3 < count) + { + this._params.set(wrapper.readString(), wrapper.readString()); + _local_3++; + } + + return true; + } + + public get gameTypeId():number + { + return this._gameTypeId; + } + + public get url():string + { + return this._url; + } + + public get quality():string + { + return this._quality; + } + + public get scaleMode():string + { + return this._scaleMode; + } + + public get frameRate():number + { + return this._frameRate; + } + + public get minMajorVersion():number + { + return this._minMajorVersion; + } + + public get minMinorVersion():number + { + return this._minMinorVersion; + } + + public get params():Map + { + return this._params; + } + + public get gameClientId():string + { + return this._gameClientId; + } +} diff --git a/packages/communication/src/messages/parser/game/lobby/LoadGameUrlParser.ts b/packages/communication/src/messages/parser/game/lobby/LoadGameUrlParser.ts new file mode 100644 index 0000000..f06ce45 --- /dev/null +++ b/packages/communication/src/messages/parser/game/lobby/LoadGameUrlParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class LoadGameUrlParser implements IMessageParser +{ + private _gameTypeId: number; + private _url: string; + private _gameClientId: string; + + public flush(): boolean + { + this._gameTypeId = 0; + this._url = null; + this._gameClientId = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._gameTypeId = wrapper.readInt(); + this._gameClientId = wrapper.readString(); + this._url = wrapper.readString(); + + return true; + } + + public get gameTypeId(): number + { + return this._gameTypeId; + } + + public get url(): string + { + return this._url; + } + + public get gameClientId(): string + { + return this._gameClientId; + } +} diff --git a/packages/communication/src/messages/parser/game/lobby/UnloadGameMessageParser.ts b/packages/communication/src/messages/parser/game/lobby/UnloadGameMessageParser.ts new file mode 100644 index 0000000..d53244b --- /dev/null +++ b/packages/communication/src/messages/parser/game/lobby/UnloadGameMessageParser.ts @@ -0,0 +1,32 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class UnloadGameMessageParser implements IMessageParser +{ + private _gameTypeId:number; + private _gameClientId:string; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._gameTypeId = wrapper.readInt(); + this._gameClientId = wrapper.readString(); + + return true; + } + + public get gameTypeId():number + { + return this._gameTypeId; + } + + public get gameClientId():string + { + return this._gameClientId; + } +} diff --git a/packages/communication/src/messages/parser/game/lobby/UserGameAchievementsMessageParser.ts b/packages/communication/src/messages/parser/game/lobby/UserGameAchievementsMessageParser.ts new file mode 100644 index 0000000..f53f0cb --- /dev/null +++ b/packages/communication/src/messages/parser/game/lobby/UserGameAchievementsMessageParser.ts @@ -0,0 +1,21 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class UserGameAchievementsMessageParser implements IMessageParser +{ + + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + + + return true; + } + +} diff --git a/packages/communication/src/messages/parser/game/lobby/index.ts b/packages/communication/src/messages/parser/game/lobby/index.ts new file mode 100644 index 0000000..847d309 --- /dev/null +++ b/packages/communication/src/messages/parser/game/lobby/index.ts @@ -0,0 +1,16 @@ +export * from './AchievementResolutionCompletedMessageParser'; +export * from './AchievementResolutionProgressMessageParser'; +export * from './AchievementResolutionsMessageParser'; +export * from './GameAchievementData'; +export * from './GameAchievementsMessageParser'; +export * from './GameConfigurationData'; +export * from './GameInviteMessageParser'; +export * from './GameListMessageParser'; +export * from './GameStatusMessageParser'; +export * from './JoinedQueueMessageParser'; +export * from './JoiningQueueFailedMessageParser'; +export * from './LeftQueueMessageParser'; +export * from './LoadGameMessageParser'; +export * from './LoadGameUrlParser'; +export * from './UnloadGameMessageParser'; +export * from './UserGameAchievementsMessageParser'; diff --git a/packages/communication/src/messages/parser/game/score/Game2WeeklyLeaderboardParser.ts b/packages/communication/src/messages/parser/game/score/Game2WeeklyLeaderboardParser.ts new file mode 100644 index 0000000..6f330fe --- /dev/null +++ b/packages/communication/src/messages/parser/game/score/Game2WeeklyLeaderboardParser.ts @@ -0,0 +1,59 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class Game2WeeklyLeaderboardParser implements IMessageParser +{ + private _year: number; + private _week: number; + private _maxOffset: number; + private _currentOffset: number; + private _minutesUntilReset: number; + + public flush(): boolean + { + this._year = -1; + this._week = -1; + this._maxOffset = -1; + this._currentOffset = -1; + this._minutesUntilReset = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._year = wrapper.readInt(); + this._week = wrapper.readInt(); + this._maxOffset = wrapper.readInt(); + this._currentOffset = wrapper.readInt(); + this._minutesUntilReset = wrapper.readInt(); + + return true; + } + + public get year(): number + { + return this._year; + } + + public get week(): number + { + return this._week; + } + + public get maxOffset(): number + { + return this._maxOffset; + } + + public get currentOffset(): number + { + return this._currentOffset; + } + + public get minutesUntilReset(): number + { + return this._minutesUntilReset; + } +} diff --git a/packages/communication/src/messages/parser/game/score/GameRewardWinnerEntry.ts b/packages/communication/src/messages/parser/game/score/GameRewardWinnerEntry.ts new file mode 100644 index 0000000..2604dce --- /dev/null +++ b/packages/communication/src/messages/parser/game/score/GameRewardWinnerEntry.ts @@ -0,0 +1,44 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class GameRewardWinnerEntry +{ + private _name: string; + private _figure: string; + private _gender: string; + private _rank: number; + private _score: number; + + constructor(wrapper: IMessageDataWrapper) + { + this._name = wrapper.readString(); + this._figure = wrapper.readString(); + this._gender = wrapper.readString(); + this._rank = wrapper.readInt(); + this._score = wrapper.readInt(); + } + + public get name(): string + { + return this._name; + } + + public get figure(): string + { + return this._figure; + } + + public get gender(): string + { + return this._gender; + } + + public get rank(): number + { + return this._rank; + } + + public get score(): number + { + return this._score; + } +} diff --git a/packages/communication/src/messages/parser/game/score/LeaderboardEntry.ts b/packages/communication/src/messages/parser/game/score/LeaderboardEntry.ts new file mode 100644 index 0000000..fcf11d9 --- /dev/null +++ b/packages/communication/src/messages/parser/game/score/LeaderboardEntry.ts @@ -0,0 +1,51 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class LeaderboardEntry +{ + private _userId:number; + private _score:number; + private _rank:number; + private _name:string; + private _figure:string; + private _gender:string; + + constructor(k:IMessageDataWrapper) + { + this._userId = k.readInt(); + this._score = k.readInt(); + this._rank = k.readInt(); + this._name = k.readString(); + this._figure = k.readString(); + this._gender = k.readString(); + } + + public get userId():number + { + return this._userId; + } + + public get score():number + { + return this._score; + } + + public get rank():number + { + return this._rank; + } + + public get figure():string + { + return this._figure; + } + + public get gender():string + { + return this._gender; + } + + public get name():string + { + return this._name; + } +} diff --git a/packages/communication/src/messages/parser/game/score/WeeklyGameRewardParser.ts b/packages/communication/src/messages/parser/game/score/WeeklyGameRewardParser.ts new file mode 100644 index 0000000..11ad73c --- /dev/null +++ b/packages/communication/src/messages/parser/game/score/WeeklyGameRewardParser.ts @@ -0,0 +1,59 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { CatalogPageMessageProductData } from '../../catalog'; + +export class WeeklyGameRewardParser implements IMessageParser +{ + private _gameTypeId: number; + private _products: CatalogPageMessageProductData[]; + private _minutesUntilNextWeek: number; + private _rewardingOn: boolean; + + public flush(): boolean + { + this._gameTypeId = -1; + this._products = []; + this._minutesUntilNextWeek = 0; + this._rewardingOn = true; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._gameTypeId = wrapper.readInt(); + let totalProducts: number = wrapper.readInt(); + + while(totalProducts > 0) + { + this._products.push(new CatalogPageMessageProductData(wrapper)); + totalProducts--; + } + + this._minutesUntilNextWeek = wrapper.readInt(); + this._rewardingOn = wrapper.readBoolean(); + + return true; + } + + public get gameTypeId(): number + { + return this._gameTypeId; + } + + public get products(): CatalogPageMessageProductData[] + { + return this._products; + } + + public get minutesUntilNextWeek(): number + { + return this._minutesUntilNextWeek; + } + + public get rewardingOn(): boolean + { + return this._rewardingOn; + } +} diff --git a/packages/communication/src/messages/parser/game/score/WeeklyGameRewardWinnersParser.ts b/packages/communication/src/messages/parser/game/score/WeeklyGameRewardWinnersParser.ts new file mode 100644 index 0000000..6b5cc30 --- /dev/null +++ b/packages/communication/src/messages/parser/game/score/WeeklyGameRewardWinnersParser.ts @@ -0,0 +1,42 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { GameRewardWinnerEntry } from './GameRewardWinnerEntry'; + +export class WeeklyGameRewardWinnersParser implements IMessageParser +{ + private _gameTypeId: number; + private _winners: GameRewardWinnerEntry[]; + + public flush(): boolean + { + this._gameTypeId = -1; + this._winners = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._gameTypeId = wrapper.readInt(); + let totalWinners: number = wrapper.readInt(); + + while(totalWinners > 0) + { + this._winners.push(new GameRewardWinnerEntry(wrapper)); + totalWinners--; + } + + return true; + } + + public get gameTypeId(): number + { + return this._gameTypeId; + } + + public get winners(): GameRewardWinnerEntry[] + { + return this._winners; + } +} diff --git a/packages/communication/src/messages/parser/game/score/index.ts b/packages/communication/src/messages/parser/game/score/index.ts new file mode 100644 index 0000000..1ba2ce8 --- /dev/null +++ b/packages/communication/src/messages/parser/game/score/index.ts @@ -0,0 +1,5 @@ +export * from './Game2WeeklyLeaderboardParser'; +export * from './GameRewardWinnerEntry'; +export * from './LeaderboardEntry'; +export * from './WeeklyGameRewardParser'; +export * from './WeeklyGameRewardWinnersParser'; diff --git a/packages/communication/src/messages/parser/generic/GenericErrorParser.ts b/packages/communication/src/messages/parser/generic/GenericErrorParser.ts new file mode 100644 index 0000000..8c43363 --- /dev/null +++ b/packages/communication/src/messages/parser/generic/GenericErrorParser.ts @@ -0,0 +1,26 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GenericErrorParser implements IMessageParser +{ + private _errorCode: number; + + public flush(): boolean + { + this._errorCode = 0; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._errorCode = wrapper.readInt(); + + return true; + } + + public get errorCode(): number + { + return this._errorCode; + } +} diff --git a/packages/communication/src/messages/parser/generic/index.ts b/packages/communication/src/messages/parser/generic/index.ts new file mode 100644 index 0000000..4e395b3 --- /dev/null +++ b/packages/communication/src/messages/parser/generic/index.ts @@ -0,0 +1 @@ +export * from './GenericErrorParser'; diff --git a/packages/communication/src/messages/parser/gifts/PhoneCollectionStateParser.ts b/packages/communication/src/messages/parser/gifts/PhoneCollectionStateParser.ts new file mode 100644 index 0000000..46b1209 --- /dev/null +++ b/packages/communication/src/messages/parser/gifts/PhoneCollectionStateParser.ts @@ -0,0 +1,41 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class PhoneCollectionStateParser implements IMessageParser +{ + private _phoneStatusCode: number; + private _collectionStatusCode: number; + private _millisecondsToAllowProcessReset: number; + + public flush(): boolean + { + this._phoneStatusCode = -1; + this._millisecondsToAllowProcessReset = -1; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._phoneStatusCode = wrapper.readInt(); + this._collectionStatusCode = wrapper.readInt(); + this._millisecondsToAllowProcessReset = wrapper.readInt(); + + return true; + } + + public get phoneStatusCode(): number + { + return this._phoneStatusCode; + } + + public get collectionStatusCode(): number + { + return this._collectionStatusCode; + } + + public get millisecondsToAllowProcessReset(): number + { + return this._millisecondsToAllowProcessReset; + } +} diff --git a/packages/communication/src/messages/parser/gifts/TryPhoneNumberResultParser.ts b/packages/communication/src/messages/parser/gifts/TryPhoneNumberResultParser.ts new file mode 100644 index 0000000..4fe8d46 --- /dev/null +++ b/packages/communication/src/messages/parser/gifts/TryPhoneNumberResultParser.ts @@ -0,0 +1,33 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class TryPhoneNumberResultParser implements IMessageParser +{ + private _resultCode: number; + private _millisToAllowProcessReset: number; + + public flush(): boolean + { + this._resultCode = -1; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._resultCode = wrapper.readInt(); + this._millisToAllowProcessReset = wrapper.readInt(); + + return true; + } + + public get resultCode(): number + { + return this._resultCode; + } + + public get millisToAllowProcessReset(): number + { + return this._millisToAllowProcessReset; + } +} diff --git a/packages/communication/src/messages/parser/gifts/TryVerificationCodeResultParser.ts b/packages/communication/src/messages/parser/gifts/TryVerificationCodeResultParser.ts new file mode 100644 index 0000000..4a32bbb --- /dev/null +++ b/packages/communication/src/messages/parser/gifts/TryVerificationCodeResultParser.ts @@ -0,0 +1,34 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class TryVerificationCodeResultParser implements IMessageParser +{ + private _resultCode: number; + private _millisecondsToAllowProcessReset: number; + + public flush(): boolean + { + this._resultCode = -1; + this._millisecondsToAllowProcessReset = -1; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._resultCode = wrapper.readInt(); + this._millisecondsToAllowProcessReset = wrapper.readInt(); + + return true; + } + + public get resultCode(): number + { + return this._resultCode; + } + + public get millisToAllowProcessReset(): number + { + return this._millisecondsToAllowProcessReset; + } +} diff --git a/packages/communication/src/messages/parser/gifts/index.ts b/packages/communication/src/messages/parser/gifts/index.ts new file mode 100644 index 0000000..19357a7 --- /dev/null +++ b/packages/communication/src/messages/parser/gifts/index.ts @@ -0,0 +1,3 @@ +export * from './PhoneCollectionStateParser'; +export * from './TryPhoneNumberResultParser'; +export * from './TryVerificationCodeResultParser'; diff --git a/packages/communication/src/messages/parser/group/GroupBadgePartsParser.ts b/packages/communication/src/messages/parser/group/GroupBadgePartsParser.ts new file mode 100644 index 0000000..73f1696 --- /dev/null +++ b/packages/communication/src/messages/parser/group/GroupBadgePartsParser.ts @@ -0,0 +1,109 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GroupBadgePartsParser implements IMessageParser +{ + private _bases: Map; + private _symbols: Map; + private _partColors: Map; + private _colorsA: Map; + private _colorsB: Map; + + flush(): boolean + { + this._bases = new Map(); + this._symbols = new Map(); + this._partColors = new Map(); + this._colorsA = new Map(); + this._colorsB = new Map(); + + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let basesCount = wrapper.readInt(); + + while(basesCount > 0) + { + const id = wrapper.readInt(); + const valueA = wrapper.readString(); + const valueB = wrapper.readString(); + + this._bases.set(id, [valueA, valueB]); + basesCount--; + } + + let symbolsCount = wrapper.readInt(); + + while(symbolsCount > 0) + { + const id = wrapper.readInt(); + const valueA = wrapper.readString(); + const valueB = wrapper.readString(); + + this._symbols.set(id, [valueA, valueB]); + symbolsCount--; + } + + let partColorsCount = wrapper.readInt(); + + while(partColorsCount > 0) + { + const id = wrapper.readInt(); + const color = wrapper.readString(); + + this._partColors.set(id, color); + partColorsCount--; + } + + let colorsACount = wrapper.readInt(); + + while(colorsACount > 0) + { + const id = wrapper.readInt(); + const color = wrapper.readString(); + + this._colorsA.set(id, color); + colorsACount--; + } + + let colorsBCount = wrapper.readInt(); + + while(colorsBCount > 0) + { + const id = wrapper.readInt(); + const color = wrapper.readString(); + + this._colorsB.set(id, color); + colorsBCount--; + } + return true; + } + + public get bases(): Map + { + return this._bases; + } + + public get symbols(): Map + { + return this._symbols; + } + + public get partColors(): Map + { + return this._partColors; + } + + public get colorsA(): Map + { + return this._colorsA; + } + + public get colorsB(): Map + { + return this._colorsB; + } +} diff --git a/packages/communication/src/messages/parser/group/GroupBuyDataParser.ts b/packages/communication/src/messages/parser/group/GroupBuyDataParser.ts new file mode 100644 index 0000000..c667691 --- /dev/null +++ b/packages/communication/src/messages/parser/group/GroupBuyDataParser.ts @@ -0,0 +1,45 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GroupBuyDataParser implements IMessageParser +{ + private _groupCost: number; + private _availableRooms: Map; + + flush(): boolean + { + this._groupCost = 0; + this._availableRooms = new Map(); + + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._groupCost = wrapper.readInt(); + let availableRoomsCount = wrapper.readInt(); + + while(availableRoomsCount > 0) + { + const roomId = wrapper.readInt(); + const roomName = wrapper.readString(); + wrapper.readBoolean(); + + this._availableRooms.set(roomId, roomName); + + availableRoomsCount--; + } + return true; + } + + public get groupCost(): number + { + return this._groupCost; + } + + public get availableRooms(): Map + { + return this._availableRooms; + } +} diff --git a/packages/communication/src/messages/parser/group/GroupConfirmMemberRemoveParser.ts b/packages/communication/src/messages/parser/group/GroupConfirmMemberRemoveParser.ts new file mode 100644 index 0000000..4240708 --- /dev/null +++ b/packages/communication/src/messages/parser/group/GroupConfirmMemberRemoveParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GroupConfirmMemberRemoveParser implements IMessageParser +{ + private _userId: number; + private _furnitureCount: number; + + flush(): boolean + { + this._userId = 0; + this._furnitureCount = 0; + + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._userId = wrapper.readInt(); + this._furnitureCount = wrapper.readInt(); + + return true; + } + + public get userId(): number + { + return this._userId; + } + + public get furnitureCount(): number + { + return this._furnitureCount; + } +} diff --git a/packages/communication/src/messages/parser/group/GroupInformationParser.ts b/packages/communication/src/messages/parser/group/GroupInformationParser.ts new file mode 100644 index 0000000..c73706b --- /dev/null +++ b/packages/communication/src/messages/parser/group/GroupInformationParser.ts @@ -0,0 +1,156 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GroupInformationParser implements IMessageParser +{ + private _id: number; + private _type: number; + private _title: string; + private _description: string; + private _badge: string; + private _roomId: number; + private _roomName: string; + private _membershipType: number; + private _membersCount: number; + private _isFavorite: boolean; + private _createdAt: string; + private _isOwner: boolean; + private _isAdmin: boolean; + private _ownerName: string; + private _flag: boolean; + private _canMembersDecorate: boolean; + private _pendingRequestsCount: number; + + public flush(): boolean + { + this._id = 0; + this._type = 0; + this._title = null; + this._description = null; + this._badge = null; + this._roomId = 0; + this._roomName = null; + this._membershipType = 0; + this._membersCount = 0; + this._isFavorite = false; + this._createdAt = null; + this._isOwner = false; + this._isAdmin = false; + this._ownerName = null; + this._flag = false; + this._canMembersDecorate = false; + this._pendingRequestsCount = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._id = wrapper.readInt(); + wrapper.readBoolean(); + this._type = wrapper.readInt(); + this._title = wrapper.readString(); + this._description = wrapper.readString(); + this._badge = wrapper.readString(); + this._roomId = wrapper.readInt(); + this._roomName = wrapper.readString(); + this._membershipType = wrapper.readInt(); + this._membersCount = wrapper.readInt(); + this._isFavorite = wrapper.readBoolean(); + this._createdAt = wrapper.readString(); + this._isOwner = wrapper.readBoolean(); + this._isAdmin = wrapper.readBoolean(); + this._ownerName = wrapper.readString(); + this._flag = wrapper.readBoolean(); + this._canMembersDecorate = wrapper.readBoolean(); + this._pendingRequestsCount = wrapper.readInt(); + + return true; + } + + public get id(): number + { + return this._id; + } + + public get type(): number + { + return this._type; + } + + public get title(): string + { + return this._title; + } + + public get description(): string + { + return this._description; + } + + public get badge(): string + { + return this._badge; + } + + public get roomId(): number + { + return this._roomId; + } + + public get roomName(): string + { + return this._roomName; + } + + public get membershipType(): number + { + return this._membershipType; + } + + public get membersCount(): number + { + return this._membersCount; + } + + public get isFavorite(): boolean + { + return this._isFavorite; + } + + public get createdAt(): string + { + return this._createdAt; + } + + public get isOwner(): boolean + { + return this._isOwner; + } + + public get isAdmin(): boolean + { + return this._isAdmin; + } + + public get ownerName(): string + { + return this._ownerName; + } + + public get flag(): boolean + { + return this._flag; + } + + public get canMembersDecorate(): boolean + { + return this._canMembersDecorate; + } + + public get pendingRequestsCount(): number + { + return this._pendingRequestsCount; + } +} diff --git a/packages/communication/src/messages/parser/group/GroupMembersParser.ts b/packages/communication/src/messages/parser/group/GroupMembersParser.ts new file mode 100644 index 0000000..ab5e9b8 --- /dev/null +++ b/packages/communication/src/messages/parser/group/GroupMembersParser.ts @@ -0,0 +1,116 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { GroupMemberParser } from './utils'; + +export class GroupMembersParser implements IMessageParser +{ + private _groupId: number; + private _groupTitle: string; + private _roomId: number; + private _badge: string; + private _totalMembersCount: number; + private _result: GroupMemberParser[]; + private _admin: boolean; + private _pageSize: number; + private _pageIndex: number; + private _level: number; + private _query: string; + + public flush(): boolean + { + this._groupId = 0; + this._groupTitle = null; + this._roomId = 0; + this._badge = null; + this._totalMembersCount = 0; + this._result = []; + this._admin = false; + this._pageSize = 0; + this._pageIndex = 0; + this._level = 0; + this._query = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._groupId = wrapper.readInt(); + this._groupTitle = wrapper.readString(); + this._roomId = wrapper.readInt(); + this._badge = wrapper.readString(); + this._totalMembersCount = wrapper.readInt(); + + let resultCount = wrapper.readInt(); + + while(resultCount > 0) + { + this._result.push(new GroupMemberParser(wrapper)); + + resultCount--; + } + + this._admin = wrapper.readBoolean(); + this._pageSize = wrapper.readInt(); + this._pageIndex = wrapper.readInt(); + this._level = wrapper.readInt(); + this._query = wrapper.readString(); + + return true; + } + + public get groupId(): number + { + return this._groupId; + } + public get groupTitle(): string + { + return this._groupTitle; + } + + public get roomId(): number + { + return this._roomId; + } + + public get badge(): string + { + return this._badge; + } + + public get totalMembersCount(): number + { + return this._totalMembersCount; + } + + public get result(): GroupMemberParser[] + { + return this._result; + } + + public get admin(): boolean + { + return this._admin; + } + + public get pageSize(): number + { + return this._pageSize; + } + + public get pageIndex(): number + { + return this._pageIndex; + } + + public get level(): number + { + return this._level; + } + + public get query(): string + { + return this._query; + } +} diff --git a/packages/communication/src/messages/parser/group/GroupPurchasedParser.ts b/packages/communication/src/messages/parser/group/GroupPurchasedParser.ts new file mode 100644 index 0000000..ce3c88d --- /dev/null +++ b/packages/communication/src/messages/parser/group/GroupPurchasedParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GroupPurchasedParser implements IMessageParser +{ + private _roomId: number; + private _groupId: number; + + flush(): boolean + { + this._roomId = 0; + this._groupId = 0; + + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomId = wrapper.readInt(); + this._groupId = wrapper.readInt(); + + return true; + } + + public get roomId(): number + { + return this._roomId; + } + + public get guildId(): number + { + return this._groupId; + } +} diff --git a/packages/communication/src/messages/parser/group/GroupSettingsParser.ts b/packages/communication/src/messages/parser/group/GroupSettingsParser.ts new file mode 100644 index 0000000..964f9b1 --- /dev/null +++ b/packages/communication/src/messages/parser/group/GroupSettingsParser.ts @@ -0,0 +1,149 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { GroupDataBadgePart } from './utils'; + +export class GroupSettingsParser implements IMessageParser +{ + private _roomId: number; + private _roomName: string; + private _id: number; + private _title: string; + private _description: string; + private _colorA: number; + private _colorB: number; + private _state: number; + private _canMembersDecorate: boolean; + private _badgeParts: Map; + private _badgeCode: string; + private _membersCount: number; + + public flush(): boolean + { + this._roomId = 0; + this._roomName = null; + this._id = 0; + this._title = null; + this._description = null; + this._colorA = 0; + this._colorB = 0; + this._state = 0; + this._canMembersDecorate = false; + this._badgeParts = new Map(); + this._badgeCode = null; + this._membersCount = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + const hasRoomData = wrapper.readInt(); + + if(hasRoomData === 1) + { + this._roomId = wrapper.readInt(); + this._roomName = wrapper.readString(); + wrapper.readBoolean(); + } + + wrapper.readBoolean(); + + this._id = wrapper.readInt(); + this._title = wrapper.readString(); + this._description = wrapper.readString(); + + wrapper.readInt(); + + this._colorA = wrapper.readInt(); + this._colorB = wrapper.readInt(); + this._state = wrapper.readInt(); + this._canMembersDecorate = wrapper.readInt() === 0; + + wrapper.readBoolean(); + wrapper.readString(); + + const badgePartsCount = wrapper.readInt(); + + for(let i = 0; i < badgePartsCount; i++) + { + const part = new GroupDataBadgePart(i === 0); + + part.key = wrapper.readInt(); + part.color = wrapper.readInt(); + part.position = wrapper.readInt(); + + if(part.key === 0) + { + part.position = 4; + } + + this._badgeParts.set(i, part); + } + + this._badgeCode = wrapper.readString(); + this._membersCount = wrapper.readInt(); + + return true; + } + + public get roomId(): number + { + return this._roomId; + } + + public get roomName(): string + { + return this._roomName; + } + + public get id(): number + { + return this._id; + } + + public get title(): string + { + return this._title; + } + + public get description(): string + { + return this._description; + } + + public get colorA(): number + { + return this._colorA; + } + + public get colorB(): number + { + return this._colorB; + } + + public get state(): number + { + return this._state; + } + + public get canMembersDecorate(): boolean + { + return this._canMembersDecorate; + } + + public get badgeParts(): Map + { + return this._badgeParts; + } + + public get badgeCode(): string + { + return this._badgeCode; + } + + public get membersCount(): number + { + return this._membersCount; + } +} diff --git a/packages/communication/src/messages/parser/group/HabboGroupDeactivatedMessageParser.ts b/packages/communication/src/messages/parser/group/HabboGroupDeactivatedMessageParser.ts new file mode 100644 index 0000000..0f08897 --- /dev/null +++ b/packages/communication/src/messages/parser/group/HabboGroupDeactivatedMessageParser.ts @@ -0,0 +1,23 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class HabboGroupDeactivatedMessageParser implements IMessageParser +{ + private _groupId: number; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + this._groupId = wrapper.readInt(); + + return true; + } + + public get groupId(): number + { + return this._groupId; + } +} diff --git a/packages/communication/src/messages/parser/group/index.ts b/packages/communication/src/messages/parser/group/index.ts new file mode 100644 index 0000000..1b24da1 --- /dev/null +++ b/packages/communication/src/messages/parser/group/index.ts @@ -0,0 +1,9 @@ +export * from './GroupBadgePartsParser'; +export * from './GroupBuyDataParser'; +export * from './GroupConfirmMemberRemoveParser'; +export * from './GroupInformationParser'; +export * from './GroupMembersParser'; +export * from './GroupPurchasedParser'; +export * from './GroupSettingsParser'; +export * from './HabboGroupDeactivatedMessageParser'; +export * from './utils'; diff --git a/packages/communication/src/messages/parser/group/utils/GroupDataBadgePart.ts b/packages/communication/src/messages/parser/group/utils/GroupDataBadgePart.ts new file mode 100644 index 0000000..7ebdb58 --- /dev/null +++ b/packages/communication/src/messages/parser/group/utils/GroupDataBadgePart.ts @@ -0,0 +1,22 @@ +export class GroupDataBadgePart +{ + public isBase: boolean; + public key: number; + public color: number; + public position: number; + + constructor(isBase: boolean) + { + this.isBase = isBase; + this.key = 0; + this.color = 0; + this.position = 4; + } + + public get code(): string + { + if(this.key === 0) return null; + + return (this.isBase ? 'b' : 's') + (this.key < 100 ? '0' : '') + (this.key < 10 ? '0' : '') + this.key + (this.color < 10 ? '0' : '') + this.color + this.position; + } +} diff --git a/packages/communication/src/messages/parser/group/utils/GroupMemberParser.ts b/packages/communication/src/messages/parser/group/utils/GroupMemberParser.ts new file mode 100644 index 0000000..8bb4cc5 --- /dev/null +++ b/packages/communication/src/messages/parser/group/utils/GroupMemberParser.ts @@ -0,0 +1,76 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class GroupRank +{ + public static readonly OWNER: number = 0; + public static readonly ADMIN: number = 1; + public static readonly MEMBER: number = 2; + public static readonly REQUESTED: number = 3; + public static readonly DELETED: number = 4; +} + +export class GroupMemberParser +{ + private _rank: number; + private _id: number; + private _name: string; + private _figure: string; + private _joinedAt: string; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this.flush(); + this.parse(wrapper); + } + + public flush(): boolean + { + this._rank = -1; + this._id = 0; + this._name = null; + this._figure = null; + this._joinedAt = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._rank = wrapper.readInt(); + this._id = wrapper.readInt(); + this._name = wrapper.readString(); + this._figure = wrapper.readString(); + this._joinedAt = wrapper.readString(); + + return true; + } + + public get id(): number + { + return this._id; + } + + public get name(): string + { + return this._name; + } + + public get figure(): string + { + return this._figure; + } + + public get rank(): number + { + return this._rank; + } + + public get joinedAt(): string + { + return this._joinedAt; + } +} diff --git a/packages/communication/src/messages/parser/group/utils/index.ts b/packages/communication/src/messages/parser/group/utils/index.ts new file mode 100644 index 0000000..62a121b --- /dev/null +++ b/packages/communication/src/messages/parser/group/utils/index.ts @@ -0,0 +1,2 @@ +export * from './GroupDataBadgePart'; +export * from './GroupMemberParser'; diff --git a/packages/communication/src/messages/parser/groupforums/ExtendedForumData.ts b/packages/communication/src/messages/parser/groupforums/ExtendedForumData.ts new file mode 100644 index 0000000..0bed98c --- /dev/null +++ b/packages/communication/src/messages/parser/groupforums/ExtendedForumData.ts @@ -0,0 +1,118 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { ForumData } from './ForumData'; + +export class ExtendedForumData extends ForumData +{ + private _readPermissions: number; + private _postMessagePermissions: number; + private _postThreadPermissions: number; + private _moderatePermissions: number; + private _readPermissionError: string; + private _postMessagePermissionError: string; + private _postThreadPermissionError: string; + private _moderatePermissionError: string; + private _reportPermissionError: string; + private _canChangeSettings: boolean; + private _isStaff: boolean; + + public static parse(wrapper: IMessageDataWrapper): ExtendedForumData + { + const extendedForumData: ExtendedForumData = new ExtendedForumData(); + + ForumData.fillFromMessage(extendedForumData, wrapper); + + extendedForumData._readPermissions = wrapper.readInt(); + extendedForumData._postMessagePermissions = wrapper.readInt(); + extendedForumData._postThreadPermissions = wrapper.readInt(); + extendedForumData._moderatePermissions = wrapper.readInt(); + extendedForumData._readPermissionError = wrapper.readString(); + extendedForumData._postMessagePermissionError = wrapper.readString(); + extendedForumData._postThreadPermissionError = wrapper.readString(); + extendedForumData._moderatePermissionError = wrapper.readString(); + extendedForumData._reportPermissionError = wrapper.readString(); + extendedForumData._canChangeSettings = wrapper.readBoolean(); + extendedForumData._isStaff = wrapper.readBoolean(); + + return extendedForumData; + } + + public get readPermissions(): number + { + return this._readPermissions; + } + + public get postMessagePermissions(): number + { + return this._postMessagePermissions; + } + + public get postThreadPermissions(): number + { + return this._postThreadPermissions; + } + + public get moderatePermissions(): number + { + return this._moderatePermissions; + } + + public get hasReadPermissionError(): boolean + { + return (this._readPermissionError.length === 0); + } + + public get canReport(): boolean + { + return true; + } + + public get hasPostMessagePermissionError(): boolean + { + return (this._postMessagePermissionError.length === 0); + } + + public get hasPostThreadPermissionError(): boolean + { + return (this._postThreadPermissionError.length === 0); + } + + public get hasModeratePermissionError(): boolean + { + return (this._moderatePermissionError.length === 0); + } + + public get canChangeSettings(): boolean + { + return this._canChangeSettings; + } + + public get isStaf(): boolean + { + return this._isStaff; + } + + public get readPermissionError(): string + { + return this._readPermissionError; + } + + public get postMessagePermissionError(): string + { + return this._postMessagePermissionError; + } + + public get postThreadPermissionError(): string + { + return this._postThreadPermissionError; + } + + public get moderatePermissionError(): string + { + return this._moderatePermissionError; + } + + public get reportPermissionError(): string + { + return this._reportPermissionError; + } +} diff --git a/packages/communication/src/messages/parser/groupforums/ForumData.ts b/packages/communication/src/messages/parser/groupforums/ForumData.ts new file mode 100644 index 0000000..1b40a7a --- /dev/null +++ b/packages/communication/src/messages/parser/groupforums/ForumData.ts @@ -0,0 +1,135 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { GuildForumThread } from './GuildForumThread'; + +export class ForumData +{ + private _groupId: number; + private _name: string; + private _description: string; + private _icon: string; + private _totalThreads: number; + private _leaderboardScore: number; + private _totalMessages: number; + private _unreadMessages: number; + private _lastMessageId: number; + private _lastMessageAuthorId: number; + private _lastMessageAuthorName: string; + private _lastMessageTimeAsSecondsAgo: number; + + public static parse(wrapper: IMessageDataWrapper): ForumData + { + return this.fillFromMessage(new ForumData(), wrapper); + } + + protected static fillFromMessage(data: ForumData, wrapper: IMessageDataWrapper): ForumData + { + data._groupId = wrapper.readInt(); + data._name = wrapper.readString(); + data._description = wrapper.readString(); + data._icon = wrapper.readString(); + data._totalThreads = wrapper.readInt(); + data._leaderboardScore = wrapper.readInt(); + data._totalMessages = wrapper.readInt(); + data._unreadMessages = wrapper.readInt(); + data._lastMessageId = wrapper.readInt(); + data._lastMessageAuthorId = wrapper.readInt(); + data._lastMessageAuthorName = wrapper.readString(); + data._lastMessageTimeAsSecondsAgo = wrapper.readInt(); + + return data; + } + + public get groupId(): number + { + return this._groupId; + } + + public get name(): string + { + return this._name; + } + + public get description(): string + { + return this._description; + } + + public get icon(): string + { + return this._icon; + } + + public get totalThreads(): number + { + return this._totalThreads; + } + + public get leaderboardScore(): number + { + return this._leaderboardScore; + } + + public get totalMessages(): number + { + return this._totalMessages; + } + + public get unreadMessages(): number + { + return this._unreadMessages; + } + + public get lastMessageId(): number + { + return this._lastMessageId; + } + + public get lastMessageAuthorId(): number + { + return this._lastMessageAuthorId; + } + + public get lastMessageAuthorName(): string + { + return this._lastMessageAuthorName; + } + + public get lastMessageTimeAsSecondsAgo(): number + { + return this._lastMessageTimeAsSecondsAgo; + } + + public updateFrom(forum: ForumData): void + { + this._totalThreads = forum._totalThreads; + this._totalMessages = forum._totalMessages; + this._unreadMessages = forum._unreadMessages; + this._lastMessageAuthorId = forum._lastMessageAuthorId; + this._lastMessageAuthorName = forum._lastMessageAuthorName; + this._lastMessageId = forum._lastMessageId; + this._lastMessageTimeAsSecondsAgo = forum._lastMessageTimeAsSecondsAgo; + } + + public get lastReadMessageId(): number + { + return (this._totalMessages - this._unreadMessages); + } + + public set lastReadMessageId(k: number) + { + this._unreadMessages = (this._totalMessages - k); + + if(this._unreadMessages < 0) this._unreadMessages = 0; + } + + public addNewThread(thread: GuildForumThread): void + { + this._lastMessageAuthorId = thread.lastUserId; + this._lastMessageAuthorName = thread.lastUserName; + this._lastMessageId = thread.lastMessageId; + this._lastMessageTimeAsSecondsAgo = thread.lastCommentTime; + this._totalThreads++; + this._totalMessages++; + this._unreadMessages = 0; + } +} diff --git a/packages/communication/src/messages/parser/groupforums/ForumDataMessageParser.ts b/packages/communication/src/messages/parser/groupforums/ForumDataMessageParser.ts new file mode 100644 index 0000000..9ddccae --- /dev/null +++ b/packages/communication/src/messages/parser/groupforums/ForumDataMessageParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { ExtendedForumData } from './ExtendedForumData'; + +export class ForumDataMessageParser implements IMessageParser +{ + private _extendedForumData: ExtendedForumData; + + public flush(): boolean + { + this._extendedForumData = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._extendedForumData = ExtendedForumData.parse(wrapper); + + return true; + } + + public get extendedForumData(): ExtendedForumData + { + return this._extendedForumData; + } +} diff --git a/packages/communication/src/messages/parser/groupforums/GetForumsListMessageParser.ts b/packages/communication/src/messages/parser/groupforums/GetForumsListMessageParser.ts new file mode 100644 index 0000000..7c13abc --- /dev/null +++ b/packages/communication/src/messages/parser/groupforums/GetForumsListMessageParser.ts @@ -0,0 +1,69 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { ForumData } from './ForumData'; + +export class GetForumsListMessageParser implements IMessageParser +{ + private _listCode: number; + private _totalAmount: number; + private _startIndex: number; + private _amount: number; + private _forums: ForumData[]; + + public flush(): boolean + { + this._listCode = -1; + this._totalAmount = 0; + this._startIndex = -1; + this._amount = 0; + this._forums = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._listCode = wrapper.readInt(); + this._totalAmount = wrapper.readInt(); + this._startIndex = wrapper.readInt(); + this._amount = wrapper.readInt(); + this._forums = []; + + let i = 0; + + while(i < this._amount) + { + this._forums.push(ForumData.parse(wrapper)); + + i++; + } + + return true; + } + + public get listCode(): number + { + return this._listCode; + } + + public get totalAmount(): number + { + return this._totalAmount; + } + + public get startIndex(): number + { + return this._startIndex; + } + + public get amount(): number + { + return this._amount; + } + + public get forums(): ForumData[] + { + return this._forums; + } +} diff --git a/packages/communication/src/messages/parser/groupforums/GuildForumThread.ts b/packages/communication/src/messages/parser/groupforums/GuildForumThread.ts new file mode 100644 index 0000000..ba07d45 --- /dev/null +++ b/packages/communication/src/messages/parser/groupforums/GuildForumThread.ts @@ -0,0 +1,217 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class GuildForumThread +{ + private _threadId: number; + private _authorId: number; + private _authorName: string; + private _creationTimeAsSecondsAgo: number; + private _header: string; + private _totalMessages: number; + private _unreadMessagesCount: number; + private _lastMessageId: number; + private _lastUserId: number; + private _lastUserName: string; + private _lastCommentTime: number; + private _state: number; + private _adminId: number; + private _adminName: string; + private _adminOperationTimeAsSecondsAgo: number; + private _isPinned: boolean; + private _isLocked: boolean; + + public static parse(wrapper: IMessageDataWrapper): GuildForumThread + { + const thread = new GuildForumThread(); + + thread._threadId = wrapper.readInt(); + thread._authorId = wrapper.readInt(); + thread._authorName = wrapper.readString(); + thread._header = wrapper.readString(); + thread._isPinned = wrapper.readBoolean(); + thread._isLocked = wrapper.readBoolean(); + thread._creationTimeAsSecondsAgo = wrapper.readInt(); + thread._totalMessages = wrapper.readInt(); + thread._unreadMessagesCount = wrapper.readInt(); + thread._lastMessageId = wrapper.readInt(); + thread._lastUserId = wrapper.readInt(); + thread._lastUserName = wrapper.readString(); + thread._lastCommentTime = wrapper.readInt(); + thread._state = wrapper.readByte(); + thread._adminId = wrapper.readInt(); + thread._adminName = wrapper.readString(); + thread._adminOperationTimeAsSecondsAgo = wrapper.readInt(); + + return thread; + } + + public get adminOperationTimeAsSecondsAgo(): number + { + return this._adminOperationTimeAsSecondsAgo; + } + + public set adminOperationTimeAsSecondsAgo(k: number) + { + this._adminOperationTimeAsSecondsAgo = k; + } + + public get lastCommentTime(): number + { + return this._lastCommentTime; + } + + public set lastCommentTime(time: number) + { + this._lastCommentTime = time; + } + + public get threadId(): number + { + return this._threadId; + } + + public set threadId(id: number) + { + this._threadId = id; + } + + public get authorId(): number + { + return this._authorId; + } + + public set authorId(id: number) + { + this._authorId = id; + } + + public get authorName(): string + { + return this._authorName; + } + + public set authorName(name: string) + { + this._authorName = name; + } + + public get creationTimeAsSecondsAgo(): number + { + return this._creationTimeAsSecondsAgo; + } + + public set creationTimeAsSecondsAgo(time: number) + { + this._creationTimeAsSecondsAgo = time; + } + + public get header(): string + { + return this._header; + } + + public set header(header: string) + { + this._header = header; + } + + public get lastMessageId(): number + { + return this._lastMessageId; + } + + public set lastMessageId(id: number) + { + this._lastMessageId = id; + } + + public get lastUserId(): number + { + return this._lastUserId; + } + + public set lastUserId(id: number) + { + this._lastUserId = id; + } + + public get lastUserName(): string + { + return this._lastUserName; + } + + public set lastUserName(name: string) + { + this._lastUserName = name; + } + + public get totalMessages(): number + { + return this._totalMessages; + } + + public set totalMessages(total: number) + { + this._totalMessages = total; + } + + public get unreadMessagesCount(): number + { + return this._unreadMessagesCount; + } + + public set unreadMessagesCount(count: number) + { + this._unreadMessagesCount = count; + } + + public get state(): number + { + return this._state; + } + + public set state(state: number) + { + this._state = state; + } + + public get adminId(): number + { + return this._adminId; + } + + public set adminId(id: number) + { + this._adminId = id; + } + + public get adminName(): string + { + return this._adminName; + } + + public set adminName(name: string) + { + this._adminName = name; + } + + public get isPinned(): boolean + { + return this._isPinned; + } + + public set isPinned(k: boolean) + { + this._isPinned = k; + } + + public get isLocked(): boolean + { + return this._isLocked; + } + + public set isLocked(flag: boolean) + { + this._isLocked = flag; + } +} diff --git a/packages/communication/src/messages/parser/groupforums/GuildForumThreadsParser.ts b/packages/communication/src/messages/parser/groupforums/GuildForumThreadsParser.ts new file mode 100644 index 0000000..5b1207d --- /dev/null +++ b/packages/communication/src/messages/parser/groupforums/GuildForumThreadsParser.ts @@ -0,0 +1,61 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { GuildForumThread } from './GuildForumThread'; + +export class GuildForumThreadsParser implements IMessageParser +{ + private _groupId: number; + private _startIndex: number; + private _amount: number; + private _threads: GuildForumThread[]; + + public flush(): boolean + { + this._groupId = -1; + this._startIndex = -1; + this._amount = 0; + this._threads = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._groupId = wrapper.readInt(); + this._startIndex = wrapper.readInt(); + this._amount = wrapper.readInt(); + this._threads = []; + + let i = 0; + + while(i < this._amount) + { + this._threads.push(GuildForumThread.parse(wrapper)); + + i++; + } + + return true; + } + + public get groupId(): number + { + return this._groupId; + } + + public get startIndex(): number + { + return this._startIndex; + } + + public get amount(): number + { + return this._amount; + } + + public get threads(): GuildForumThread[] + { + return this._threads; + } +} diff --git a/packages/communication/src/messages/parser/groupforums/MessageData.ts b/packages/communication/src/messages/parser/groupforums/MessageData.ts new file mode 100644 index 0000000..0fdf03c --- /dev/null +++ b/packages/communication/src/messages/parser/groupforums/MessageData.ts @@ -0,0 +1,179 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class MessageData +{ + private _groupId: number; + private _messageId: number; + private _messageIndex: number; + private _authorId: number; + private _threadId: number; + private _creationTime: number; + private _messageText: string; + private _authorName: string; + private _authorFigure: string; + private _state: number; + private _adminId: number; + private _adminName: string; + private _adminOperationTimeAsSeccondsAgo: number; + private _authorPostCount: number; + + public static parse(wrapper: IMessageDataWrapper): MessageData + { + const messageData = new MessageData(); + + messageData._messageId = wrapper.readInt(); + messageData._messageIndex = wrapper.readInt(); + messageData._authorId = wrapper.readInt(); + messageData._authorName = wrapper.readString(); + messageData._authorFigure = wrapper.readString(); + messageData._creationTime = wrapper.readInt(); + messageData._messageText = wrapper.readString(); + messageData._state = wrapper.readByte(); + messageData._adminId = wrapper.readInt(); + messageData._adminName = wrapper.readString(); + messageData._adminOperationTimeAsSeccondsAgo = wrapper.readInt(); + messageData._authorPostCount = wrapper.readInt(); + + return messageData; + } + + public get state(): number + { + return this._state; + } + + public set state(state: number) + { + this._state = state; + } + + public get adminId(): number + { + return this._adminId; + } + + public set adminId(id: number) + { + this._adminId = id; + } + + public get adminName(): string + { + return this._adminName; + } + + public set adminName(name: string) + { + this._adminName = name; + } + + public get adminOperationTimeAsSeccondsAgo(): number + { + return this._adminOperationTimeAsSeccondsAgo; + } + + public set adminOperationTimeAsSeccondsAgo(time: number) + { + this._adminOperationTimeAsSeccondsAgo = time; + } + + public get messageId(): number + { + return this._messageId; + } + + public set messageId(id: number) + { + this._messageId = id; + } + + public get creationTime(): number + { + return this._creationTime; + } + + public set creationTime(time: number) + { + this._creationTime = time; + } + + public get authorName(): string + { + return this._authorName; + } + + public set authorName(name: string) + { + this._authorName = name; + } + + public get authorFigure(): string + { + return this._authorFigure; + } + + public set authorFigure(figure: string) + { + this._authorFigure = figure; + } + + public get threadId(): number + { + return this._threadId; + } + + public set threadId(id: number) + { + this._threadId = id; + } + + public get messageIndex(): number + { + return this._messageIndex; + } + + public set messageIndex(index: number) + { + this._messageIndex = index; + } + + public set groupID(id: number) + { + this._groupId = id; + } + + public get groupId(): number + { + return this._groupId; + } + + public get authorId(): number + { + return this._authorId; + } + + public set authorId(id: number) + { + this._authorId = id; + } + + public get messageText(): string + { + return this._messageText; + } + + public set messageText(text: string) + { + this._messageText = text; + } + + public get authorPostCount(): number + { + return this._authorPostCount; + } + + public set authorPostCount(count: number) + { + this._authorPostCount = count; + } +} diff --git a/packages/communication/src/messages/parser/groupforums/PostMessageMessageParser.ts b/packages/communication/src/messages/parser/groupforums/PostMessageMessageParser.ts new file mode 100644 index 0000000..d973204 --- /dev/null +++ b/packages/communication/src/messages/parser/groupforums/PostMessageMessageParser.ts @@ -0,0 +1,44 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { MessageData } from './MessageData'; + +export class PostMessageMessageParser implements IMessageParser +{ + private _groupId: number; + private _threadId: number; + private _message: MessageData; + + public flush(): boolean + { + this._groupId = -1; + this._threadId = -1; + this._message = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._groupId = wrapper.readInt(); + this._threadId = wrapper.readInt(); + this._message = MessageData.parse(wrapper); + + return true; + } + + public get groupId(): number + { + return this._groupId; + } + + public get threadId(): number + { + return this._threadId; + } + + public get message(): MessageData + { + return this._message; + } +} diff --git a/packages/communication/src/messages/parser/groupforums/PostThreadMessageParser.ts b/packages/communication/src/messages/parser/groupforums/PostThreadMessageParser.ts new file mode 100644 index 0000000..3f65cc6 --- /dev/null +++ b/packages/communication/src/messages/parser/groupforums/PostThreadMessageParser.ts @@ -0,0 +1,36 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { GuildForumThread } from './GuildForumThread'; + +export class PostThreadMessageParser implements IMessageParser +{ + private _groupId: number; + private _thread: GuildForumThread; + + public flush(): boolean + { + this._groupId = -1; + this._thread = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._groupId = wrapper.readInt(); + this._thread = GuildForumThread.parse(wrapper); + + return true; + } + + public get groupId(): number + { + return this._groupId; + } + + public get thread(): GuildForumThread + { + return this._thread; + } +} diff --git a/packages/communication/src/messages/parser/groupforums/ThreadMessagesMessageParser.ts b/packages/communication/src/messages/parser/groupforums/ThreadMessagesMessageParser.ts new file mode 100644 index 0000000..5d0e1ee --- /dev/null +++ b/packages/communication/src/messages/parser/groupforums/ThreadMessagesMessageParser.ts @@ -0,0 +1,74 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { MessageData } from './MessageData'; + +export class ThreadMessagesMessageParser implements IMessageParser +{ + private _groupId: number; + private _threadId: number; + private _startIndex: number; + private _amount: number; + private _messages: MessageData[]; + + public flush(): boolean + { + this._groupId = -1; + this._threadId = -1; + this._startIndex = -1; + this._amount = 0; + this._messages = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._groupId = wrapper.readInt(); + this._threadId = wrapper.readInt(); + this._startIndex = wrapper.readInt(); + this._amount = wrapper.readInt(); + this._messages = []; + + let i = 0; + + while(i < this._amount) + { + const message = MessageData.parse(wrapper); + + message.groupID = this._groupId; + message.threadId = this._threadId; + + this._messages.push(message); + + i++; + } + + return true; + } + + public get groupId(): number + { + return this._groupId; + } + + public get threadId(): number + { + return this._threadId; + } + + public get startIndex(): number + { + return this._startIndex; + } + + public get amount(): number + { + return this._amount; + } + + public get messages(): MessageData[] + { + return this._messages; + } +} diff --git a/packages/communication/src/messages/parser/groupforums/UnreadForumsCountMessageParser.ts b/packages/communication/src/messages/parser/groupforums/UnreadForumsCountMessageParser.ts new file mode 100644 index 0000000..a8616d9 --- /dev/null +++ b/packages/communication/src/messages/parser/groupforums/UnreadForumsCountMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class UnreadForumsCountMessageParser implements IMessageParser +{ + private _count: number; + + public flush(): boolean + { + this._count = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._count = wrapper.readInt(); + + return true; + } + + public get count(): number + { + return this._count; + } +} diff --git a/packages/communication/src/messages/parser/groupforums/UpdateMessageMessageParser.ts b/packages/communication/src/messages/parser/groupforums/UpdateMessageMessageParser.ts new file mode 100644 index 0000000..6fce331 --- /dev/null +++ b/packages/communication/src/messages/parser/groupforums/UpdateMessageMessageParser.ts @@ -0,0 +1,44 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { MessageData } from './MessageData'; + +export class UpdateMessageMessageParser implements IMessageParser +{ + private _groupId: number; + private _threadId: number; + private _message: MessageData; + + public flush(): boolean + { + this._groupId = -1; + this._threadId = -1; + this._message = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._groupId = wrapper.readInt(); + this._threadId = wrapper.readInt(); + this._message = MessageData.parse(wrapper); + + return true; + } + + public get groupId(): number + { + return this._groupId; + } + + public get threadId(): number + { + return this._threadId; + } + + public get message(): MessageData + { + return this._message; + } +} diff --git a/packages/communication/src/messages/parser/groupforums/UpdateThreadMessageParser.ts b/packages/communication/src/messages/parser/groupforums/UpdateThreadMessageParser.ts new file mode 100644 index 0000000..7e6abb7 --- /dev/null +++ b/packages/communication/src/messages/parser/groupforums/UpdateThreadMessageParser.ts @@ -0,0 +1,36 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { GuildForumThread } from './GuildForumThread'; + +export class UpdateThreadMessageParser implements IMessageParser +{ + private _groupId: number; + private _thread: GuildForumThread; + + public flush(): boolean + { + this._groupId = -1; + this._thread = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._groupId = wrapper.readInt(); + this._thread = GuildForumThread.parse(wrapper); + + return true; + } + + public get groupId(): number + { + return this._groupId; + } + + public get thread(): GuildForumThread + { + return this._thread; + } +} diff --git a/packages/communication/src/messages/parser/groupforums/index.ts b/packages/communication/src/messages/parser/groupforums/index.ts new file mode 100644 index 0000000..6f07091 --- /dev/null +++ b/packages/communication/src/messages/parser/groupforums/index.ts @@ -0,0 +1,13 @@ +export * from './ExtendedForumData'; +export * from './ForumData'; +export * from './ForumDataMessageParser'; +export * from './GetForumsListMessageParser'; +export * from './GuildForumThread'; +export * from './GuildForumThreadsParser'; +export * from './MessageData'; +export * from './PostMessageMessageParser'; +export * from './PostThreadMessageParser'; +export * from './ThreadMessagesMessageParser'; +export * from './UnreadForumsCountMessageParser'; +export * from './UpdateMessageMessageParser'; +export * from './UpdateThreadMessageParser'; diff --git a/packages/communication/src/messages/parser/handshake/CompleteDiffieHandshakeParser.ts b/packages/communication/src/messages/parser/handshake/CompleteDiffieHandshakeParser.ts new file mode 100644 index 0000000..38f9226 --- /dev/null +++ b/packages/communication/src/messages/parser/handshake/CompleteDiffieHandshakeParser.ts @@ -0,0 +1,36 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CompleteDiffieHandshakeParser implements IMessageParser +{ + private _encryptedPublicKey: string = null; + private _serverClientEncryption: boolean = false; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._encryptedPublicKey = wrapper.readString(); + + if(wrapper.bytesAvailable) + { + this._serverClientEncryption = wrapper.readBoolean(); + } + + return true; + } + + public get encryptedPublicKey(): string + { + return this._encryptedPublicKey; + } + + public get serverClientEncryption(): boolean + { + return this._serverClientEncryption; + } +} diff --git a/packages/communication/src/messages/parser/handshake/DisconnectReasonParser.ts b/packages/communication/src/messages/parser/handshake/DisconnectReasonParser.ts new file mode 100644 index 0000000..e7d997c --- /dev/null +++ b/packages/communication/src/messages/parser/handshake/DisconnectReasonParser.ts @@ -0,0 +1,32 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class DisconnectReasonParser implements IMessageParser +{ + private _reason: number; + + public flush(): boolean + { + this._reason = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._reason = 0; + + if(wrapper.bytesAvailable) + { + this._reason = wrapper.readInt(); + } + + return true; + } + + public get reason(): number + { + return this._reason; + } +} diff --git a/packages/communication/src/messages/parser/handshake/IdentityAccountsParser.ts b/packages/communication/src/messages/parser/handshake/IdentityAccountsParser.ts new file mode 100644 index 0000000..37ec22a --- /dev/null +++ b/packages/communication/src/messages/parser/handshake/IdentityAccountsParser.ts @@ -0,0 +1,39 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class IdentityAccountsParser implements IMessageParser +{ + private _accounts: Map; + + public flush(): boolean + { + if(this._accounts) + { + this._accounts = new Map(); + } + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._accounts = new Map(); + + let totalCount = wrapper.readInt(); + + while(totalCount > 0) + { + this._accounts.set(wrapper.readInt(), wrapper.readString()); + + totalCount--; + } + + return true; + } + + public get accounts(): Map + { + return this._accounts; + } +} diff --git a/packages/communication/src/messages/parser/handshake/InitDiffieHandshakeParser.ts b/packages/communication/src/messages/parser/handshake/InitDiffieHandshakeParser.ts new file mode 100644 index 0000000..30ad728 --- /dev/null +++ b/packages/communication/src/messages/parser/handshake/InitDiffieHandshakeParser.ts @@ -0,0 +1,32 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class InitDiffieHandshakeParser implements IMessageParser +{ + private _encryptedPrime: string; + private _encryptedGenerator: string; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._encryptedPrime = wrapper.readString(); + this._encryptedGenerator = wrapper.readString(); + + return true; + } + + public get encryptedPrime(): string + { + return this._encryptedPrime; + } + + public get encryptedGenerator(): string + { + return this._encryptedGenerator; + } +} diff --git a/packages/communication/src/messages/parser/handshake/NoobnessLevelMessageParser.ts b/packages/communication/src/messages/parser/handshake/NoobnessLevelMessageParser.ts new file mode 100644 index 0000000..e64919b --- /dev/null +++ b/packages/communication/src/messages/parser/handshake/NoobnessLevelMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class NoobnessLevelMessageParser implements IMessageParser +{ + private _noobnessLevel: number; + + public flush(): boolean + { + this._noobnessLevel = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._noobnessLevel = wrapper.readInt(); + + return true; + } + + public get noobnessLevel(): number + { + return this._noobnessLevel; + } +} diff --git a/packages/communication/src/messages/parser/handshake/index.ts b/packages/communication/src/messages/parser/handshake/index.ts new file mode 100644 index 0000000..786e98b --- /dev/null +++ b/packages/communication/src/messages/parser/handshake/index.ts @@ -0,0 +1,5 @@ +export * from './CompleteDiffieHandshakeParser'; +export * from './DisconnectReasonParser'; +export * from './IdentityAccountsParser'; +export * from './InitDiffieHandshakeParser'; +export * from './NoobnessLevelMessageParser'; diff --git a/packages/communication/src/messages/parser/help/CallForHelpDisabledNotifyMessageParser.ts b/packages/communication/src/messages/parser/help/CallForHelpDisabledNotifyMessageParser.ts new file mode 100644 index 0000000..1af8a2a --- /dev/null +++ b/packages/communication/src/messages/parser/help/CallForHelpDisabledNotifyMessageParser.ts @@ -0,0 +1,25 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CallForHelpDisabledNotifyMessageParser implements IMessageParser +{ + private _infoUrl: string; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._infoUrl = wrapper.readString(); + + return true; + } + + public get infoUrl(): string + { + return this._infoUrl; + } +} diff --git a/packages/communication/src/messages/parser/help/CallForHelpPendingCallsDeletedMessageParser.ts b/packages/communication/src/messages/parser/help/CallForHelpPendingCallsDeletedMessageParser.ts new file mode 100644 index 0000000..a080247 --- /dev/null +++ b/packages/communication/src/messages/parser/help/CallForHelpPendingCallsDeletedMessageParser.ts @@ -0,0 +1,14 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CallForHelpPendingCallsDeletedMessageParser implements IMessageParser +{ + flush(): boolean + { + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + return true; + } +} diff --git a/packages/communication/src/messages/parser/help/CallForHelpPendingCallsMessageParser.ts b/packages/communication/src/messages/parser/help/CallForHelpPendingCallsMessageParser.ts new file mode 100644 index 0000000..d8e1e6e --- /dev/null +++ b/packages/communication/src/messages/parser/help/CallForHelpPendingCallsMessageParser.ts @@ -0,0 +1,46 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CallForHelpPendingCallsMessageParser implements IMessageParser +{ + private _calls: ICall[]; + + flush(): boolean + { + this._calls = []; + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._calls = []; + + const count = wrapper.readInt(); + + for(let i = 0; i < count; i++) + { + const callId = wrapper.readString(); + const timestamp = wrapper.readString(); + const message = wrapper.readString(); + + this._calls.push({ callId: callId, timeStamp: timestamp, message: message }); + } + return true; + } + + public get pendingCalls(): ICall[] + { + return this._calls; + } + + public get count(): number + { + return this._calls.length; + } +} + +export interface ICall +{ + callId: string; + timeStamp: string; + message: string; +} diff --git a/packages/communication/src/messages/parser/help/CallForHelpReplyMessageParser.ts b/packages/communication/src/messages/parser/help/CallForHelpReplyMessageParser.ts new file mode 100644 index 0000000..ed8c770 --- /dev/null +++ b/packages/communication/src/messages/parser/help/CallForHelpReplyMessageParser.ts @@ -0,0 +1,23 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CallForHelpReplyMessageParser implements IMessageParser +{ + private _message: string; + + flush(): boolean + { + this._message = null; + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._message = wrapper.readString(); + return true; + } + + public get message(): string + { + return this._message; + } +} diff --git a/packages/communication/src/messages/parser/help/CallForHelpResultMessageParser.ts b/packages/communication/src/messages/parser/help/CallForHelpResultMessageParser.ts new file mode 100644 index 0000000..bc75465 --- /dev/null +++ b/packages/communication/src/messages/parser/help/CallForHelpResultMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CallForHelpResultMessageParser implements IMessageParser +{ + private _resultType: number; + private _messageText: string; + + public flush(): boolean + { + this._resultType = 0; + this._messageText = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._resultType = wrapper.readInt(); + this._messageText = wrapper.readString(); + + return true; + } + + public get resultType(): number + { + return this._resultType; + } + + public get messageText(): string + { + return this._messageText; + } +} diff --git a/packages/communication/src/messages/parser/help/ChatReviewSessionDetachedMessageParser.ts b/packages/communication/src/messages/parser/help/ChatReviewSessionDetachedMessageParser.ts new file mode 100644 index 0000000..23af15d --- /dev/null +++ b/packages/communication/src/messages/parser/help/ChatReviewSessionDetachedMessageParser.ts @@ -0,0 +1,15 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ChatReviewSessionDetachedMessageParser implements IMessageParser +{ + flush(): boolean + { + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + return true; + } + +} diff --git a/packages/communication/src/messages/parser/help/ChatReviewSessionOfferedToGuideMessageParser.ts b/packages/communication/src/messages/parser/help/ChatReviewSessionOfferedToGuideMessageParser.ts new file mode 100644 index 0000000..cf2e9e7 --- /dev/null +++ b/packages/communication/src/messages/parser/help/ChatReviewSessionOfferedToGuideMessageParser.ts @@ -0,0 +1,23 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ChatReviewSessionOfferedToGuideMessageParser implements IMessageParser +{ + private _acceptanceTimeout: number; + + flush(): boolean + { + this._acceptanceTimeout = -1; + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._acceptanceTimeout = wrapper.readInt(); + return true; + } + + public get acceptanceTimeout(): number + { + return this._acceptanceTimeout; + } +} diff --git a/packages/communication/src/messages/parser/help/ChatReviewSessionResultsMessageParser.ts b/packages/communication/src/messages/parser/help/ChatReviewSessionResultsMessageParser.ts new file mode 100644 index 0000000..4280fea --- /dev/null +++ b/packages/communication/src/messages/parser/help/ChatReviewSessionResultsMessageParser.ts @@ -0,0 +1,47 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ChatReviewSessionResultsMessageParser implements IMessageParser +{ + private _winningVoteCode: number; + private _ownVoteCode: number; + private _finalStatus: number[]; + + flush(): boolean + { + this._winningVoteCode = -1; + this._ownVoteCode = -1; + this._finalStatus = null; + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._finalStatus = []; + this._winningVoteCode = wrapper.readInt(); + this._ownVoteCode = wrapper.readInt(); + const count = wrapper.readInt(); + + for(let i = 0; i < count; i++) + { + this._finalStatus.push(wrapper.readInt()); + } + + return true; + } + + public get winningVoteCode(): number + { + return this._winningVoteCode; + } + + public get ownVoteCode(): number + { + return this._ownVoteCode; + } + + public get finalStatus(): number[] + { + return this._finalStatus; + } + +} diff --git a/packages/communication/src/messages/parser/help/ChatReviewSessionStartedMessageParser.ts b/packages/communication/src/messages/parser/help/ChatReviewSessionStartedMessageParser.ts new file mode 100644 index 0000000..fea86a9 --- /dev/null +++ b/packages/communication/src/messages/parser/help/ChatReviewSessionStartedMessageParser.ts @@ -0,0 +1,29 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ChatReviewSessionStartedMessageParser implements IMessageParser +{ + private _votingTimeout: number; + private _chatRecord: string; + + flush(): boolean + { + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._votingTimeout = wrapper.readInt(); + this._chatRecord = wrapper.readString(); + return true; + } + + public get votingTimeout(): number + { + return this._votingTimeout; + } + + public get chatRecord(): string + { + return this._chatRecord; + } +} diff --git a/packages/communication/src/messages/parser/help/ChatReviewSessionVotingStatusMessageParser.ts b/packages/communication/src/messages/parser/help/ChatReviewSessionVotingStatusMessageParser.ts new file mode 100644 index 0000000..1c3edb3 --- /dev/null +++ b/packages/communication/src/messages/parser/help/ChatReviewSessionVotingStatusMessageParser.ts @@ -0,0 +1,38 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ChatReviewSessionVotingStatusMessageParser implements IMessageParser +{ + public static readonly AWAITING_VOTE = 0; + public static readonly VOTED_OK = 1; + public static readonly VOTED_BAD = 2; + public static readonly VOTED_VERY_BAD = 3; + public static readonly NO_VOTE = 4; + public static readonly FINDING_NEW_VOTER = 5; + + private _status: number[]; + + flush(): boolean + { + this._status = null; + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._status = []; + + const count = wrapper.readInt(); + + for(let i = 0; i < count; i++) + { + this._status.push(wrapper.readInt()); + } + + return true; + } + + public get status(): number[] + { + return this._status; + } +} diff --git a/packages/communication/src/messages/parser/help/GuideOnDutyStatusMessageParser.ts b/packages/communication/src/messages/parser/help/GuideOnDutyStatusMessageParser.ts new file mode 100644 index 0000000..920d603 --- /dev/null +++ b/packages/communication/src/messages/parser/help/GuideOnDutyStatusMessageParser.ts @@ -0,0 +1,51 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GuideOnDutyStatusMessageParser implements IMessageParser +{ + private _onDuty: boolean; + private _guidesOnDuty: number; + private _helpersOnDuty: number; + private _guardiansOnDuty: number; + + public flush(): boolean + { + this._onDuty = false; + this._guidesOnDuty = 0; + this._helpersOnDuty = 0; + this._guardiansOnDuty = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._onDuty = wrapper.readBoolean(); + this._guidesOnDuty = wrapper.readInt(); + this._helpersOnDuty = wrapper.readInt(); + this._guardiansOnDuty = wrapper.readInt(); + + return true; + } + + public get onDuty(): boolean + { + return this._onDuty; + } + + public get guidesOnDuty(): number + { + return this._guidesOnDuty; + } + + public get helpersOnDuty(): number + { + return this._helpersOnDuty; + } + + public get guardiansOnDuty(): number + { + return this._guardiansOnDuty; + } +} diff --git a/packages/communication/src/messages/parser/help/GuideReportingStatusMessageParser.ts b/packages/communication/src/messages/parser/help/GuideReportingStatusMessageParser.ts new file mode 100644 index 0000000..e73f3e0 --- /dev/null +++ b/packages/communication/src/messages/parser/help/GuideReportingStatusMessageParser.ts @@ -0,0 +1,49 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { PendingGuideTicketData } from './PendingGuideTicketData'; + +export class GuideReportingStatusMessageParser implements IMessageParser +{ + public static readonly GUIDE_REPORTING_STATUS_OK: number = 0; + public static readonly GUIDE_REPORTING_STATUS_PENDING_TICKET: number = 1; + public static readonly GUIDE_REPORTING_STATUS_ABUSIVE: number = 2; + public static readonly GUIDE_REPORTING_STATUS_REPORTING_TOO_QUICKLY: number = 3; + + private _statusCode: number; + private _pendingTicket: PendingGuideTicketData; + + public flush(): boolean + { + this._statusCode = 0; + this._pendingTicket = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._statusCode = wrapper.readInt(); + this._pendingTicket = new PendingGuideTicketData( + wrapper.readInt(), + wrapper.readInt(), + wrapper.readBoolean(), + wrapper.readString(), + wrapper.readString(), + wrapper.readString(), + wrapper.readString() + ); + + return true; + } + + public get statusCode(): number + { + return this._statusCode; + } + + public get pendingTicket(): PendingGuideTicketData + { + return this._pendingTicket; + } +} diff --git a/packages/communication/src/messages/parser/help/GuideSessionAttachedMessageParser.ts b/packages/communication/src/messages/parser/help/GuideSessionAttachedMessageParser.ts new file mode 100644 index 0000000..5ab009d --- /dev/null +++ b/packages/communication/src/messages/parser/help/GuideSessionAttachedMessageParser.ts @@ -0,0 +1,51 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GuideSessionAttachedMessageParser implements IMessageParser +{ + private _asGuide: boolean; + private _helpRequestType: number; + private _helpRequestDescription: string; + private _roleSpecificWaitTime: number; + + public flush(): boolean + { + this._asGuide = false; + this._helpRequestType = 0; + this._helpRequestDescription = null; + this._roleSpecificWaitTime = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._asGuide = wrapper.readBoolean(); + this._helpRequestType = wrapper.readInt(); + this._helpRequestDescription = wrapper.readString(); + this._roleSpecificWaitTime = wrapper.readInt(); + + return true; + } + + public get asGuide(): boolean + { + return this._asGuide; + } + + public get helpRequestType(): number + { + return this._helpRequestType; + } + + public get helpRequestDescription(): string + { + return this._helpRequestDescription; + } + + public get roleSpecificWaitTime(): number + { + return this._roleSpecificWaitTime; + } +} diff --git a/packages/communication/src/messages/parser/help/GuideSessionDetachedMessageParser.ts b/packages/communication/src/messages/parser/help/GuideSessionDetachedMessageParser.ts new file mode 100644 index 0000000..c4dac16 --- /dev/null +++ b/packages/communication/src/messages/parser/help/GuideSessionDetachedMessageParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GuideSessionDetachedMessageParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/help/GuideSessionEndedMessageParser.ts b/packages/communication/src/messages/parser/help/GuideSessionEndedMessageParser.ts new file mode 100644 index 0000000..0a8dcf1 --- /dev/null +++ b/packages/communication/src/messages/parser/help/GuideSessionEndedMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GuideSessionEndedMessageParser implements IMessageParser +{ + private _endReason: number; + + public flush(): boolean + { + this._endReason = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._endReason = wrapper.readInt(); + + return true; + } + + public get endReason(): number + { + return this._endReason; + } +} diff --git a/packages/communication/src/messages/parser/help/GuideSessionErrorMessageParser.ts b/packages/communication/src/messages/parser/help/GuideSessionErrorMessageParser.ts new file mode 100644 index 0000000..815ba14 --- /dev/null +++ b/packages/communication/src/messages/parser/help/GuideSessionErrorMessageParser.ts @@ -0,0 +1,33 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GuideSessionErrorMessageParser implements IMessageParser +{ + public static readonly ERROR_GENERIC: number = 0; + public static readonly ERROR_GUIDES_REJECT: number = 1; + public static readonly ERROR_NOT_ENOUGH_GUIDES: number = 2; + public static readonly ERROR_NOT_ENOUGH_VOTES: number = 3; + public static readonly ERROR_NO_CHATLOG_FOUND: number = 4; + + private _errorCode: number; + + public flush(): boolean + { + this._errorCode = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._errorCode = wrapper.readInt(); + + return true; + } + + public get errorCode(): number + { + return this._errorCode; + } +} diff --git a/packages/communication/src/messages/parser/help/GuideSessionInvitedToGuideRoomMessageParser.ts b/packages/communication/src/messages/parser/help/GuideSessionInvitedToGuideRoomMessageParser.ts new file mode 100644 index 0000000..8810cf5 --- /dev/null +++ b/packages/communication/src/messages/parser/help/GuideSessionInvitedToGuideRoomMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GuideSessionInvitedToGuideRoomMessageParser implements IMessageParser +{ + private _roomId: number; + private _roomName: string; + + public flush(): boolean + { + this._roomId = 0; + this._roomName = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomId = wrapper.readInt(); + this._roomName = wrapper.readString(); + + return true; + } + + public get roomId(): number + { + return this._roomId; + } + + public get roomName(): string + { + return this._roomName; + } +} diff --git a/packages/communication/src/messages/parser/help/GuideSessionMessageMessageParser.ts b/packages/communication/src/messages/parser/help/GuideSessionMessageMessageParser.ts new file mode 100644 index 0000000..43731e3 --- /dev/null +++ b/packages/communication/src/messages/parser/help/GuideSessionMessageMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GuideSessionMessageMessageParser implements IMessageParser +{ + private _chatMessage: string; + private _senderId: number; + + public flush(): boolean + { + this._chatMessage = null; + this._senderId = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._chatMessage = wrapper.readString(); + this._senderId = wrapper.readInt(); + + return true; + } + + public get chatMessage(): string + { + return this._chatMessage; + } + + public get senderId(): number + { + return this._senderId; + } +} diff --git a/packages/communication/src/messages/parser/help/GuideSessionPartnerIsTypingMessageParser.ts b/packages/communication/src/messages/parser/help/GuideSessionPartnerIsTypingMessageParser.ts new file mode 100644 index 0000000..08400fb --- /dev/null +++ b/packages/communication/src/messages/parser/help/GuideSessionPartnerIsTypingMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GuideSessionPartnerIsTypingMessageParser implements IMessageParser +{ + private _isTyping: boolean; + + public flush(): boolean + { + this._isTyping = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._isTyping = wrapper.readBoolean(); + + return true; + } + + public get isTyping(): boolean + { + return this._isTyping; + } +} diff --git a/packages/communication/src/messages/parser/help/GuideSessionRequesterRoomMessageParser.ts b/packages/communication/src/messages/parser/help/GuideSessionRequesterRoomMessageParser.ts new file mode 100644 index 0000000..d9dc5d1 --- /dev/null +++ b/packages/communication/src/messages/parser/help/GuideSessionRequesterRoomMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GuideSessionRequesterRoomMessageParser implements IMessageParser +{ + private _requesterRoomId: number; + + public flush(): boolean + { + this._requesterRoomId = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._requesterRoomId = wrapper.readInt(); + + return true; + } + + public get requesterRoomId(): number + { + return this._requesterRoomId; + } +} diff --git a/packages/communication/src/messages/parser/help/GuideSessionStartedMessageParser.ts b/packages/communication/src/messages/parser/help/GuideSessionStartedMessageParser.ts new file mode 100644 index 0000000..f47bfc6 --- /dev/null +++ b/packages/communication/src/messages/parser/help/GuideSessionStartedMessageParser.ts @@ -0,0 +1,67 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GuideSessionStartedMessageParser implements IMessageParser +{ + private _requesterUserId: number; + private _requesterName: string; + private _requesterFigure: string; + private _guideUserId: number; + private _guideName: string; + private _guideFigure: string; + + public flush(): boolean + { + this._requesterUserId = 0; + this._requesterName = null; + this._requesterFigure = null; + this._guideUserId = 0; + this._guideName = null; + this._guideFigure = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._requesterUserId = wrapper.readInt(); + this._requesterName = wrapper.readString(); + this._requesterFigure = wrapper.readString(); + this._guideUserId = wrapper.readInt(); + this._guideName = wrapper.readString(); + this._guideFigure = wrapper.readString(); + + return true; + } + + public get requesterUserId(): number + { + return this._requesterUserId; + } + + public get requesterName(): string + { + return this._requesterName; + } + + public get requesterFigure(): string + { + return this._requesterFigure; + } + + public get guideUserId(): number + { + return this._guideUserId; + } + + public get guideName(): string + { + return this._guideName; + } + + public get guideFigure(): string + { + return this._guideFigure; + } +} diff --git a/packages/communication/src/messages/parser/help/GuideTicketCreationResultMessageParser.ts b/packages/communication/src/messages/parser/help/GuideTicketCreationResultMessageParser.ts new file mode 100644 index 0000000..fd3ba08 --- /dev/null +++ b/packages/communication/src/messages/parser/help/GuideTicketCreationResultMessageParser.ts @@ -0,0 +1,32 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GuideTicketCreationResultMessageParser implements IMessageParser +{ + public static readonly CREATION_RESULT_OK: number = 0; + public static readonly CREATION_RESULT_UNABLE_TO_REPORT: number = 1; + public static readonly CREATION_RESULT_NO_CHATLOG_FOUND: number = 2; + public static readonly CREATION_RESULT_BULLY_ALREADY_REPORTED: number = 3; + + private _result: number; + + public flush(): boolean + { + this._result = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._result = wrapper.readInt(); + + return true; + } + + public get result(): number + { + return this._result; + } +} diff --git a/packages/communication/src/messages/parser/help/GuideTicketResolutionMessageParser.ts b/packages/communication/src/messages/parser/help/GuideTicketResolutionMessageParser.ts new file mode 100644 index 0000000..33c6bd9 --- /dev/null +++ b/packages/communication/src/messages/parser/help/GuideTicketResolutionMessageParser.ts @@ -0,0 +1,31 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GuideTicketResolutionMessageParser implements IMessageParser +{ + public static readonly RESOLUTION_GUARDIANS_TOOK_ACTION: number = 0; + public static readonly RESOLUTION_FORWARDED_TO_MODERATORS: number = 1; + public static readonly RESOLUTION_REPORTER_IS_ABUSIVE: number = 2; + + private _resolution: number; + + public flush(): boolean + { + this._resolution = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._resolution = wrapper.readInt(); + + return true; + } + + public get resolution(): number + { + return this._resolution; + } +} diff --git a/packages/communication/src/messages/parser/help/HotelMergeNameChangeParser.ts b/packages/communication/src/messages/parser/help/HotelMergeNameChangeParser.ts new file mode 100644 index 0000000..53d3417 --- /dev/null +++ b/packages/communication/src/messages/parser/help/HotelMergeNameChangeParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class HotelMergeNameChangeParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/help/IssueCloseNotificationMessageParser.ts b/packages/communication/src/messages/parser/help/IssueCloseNotificationMessageParser.ts new file mode 100644 index 0000000..5518d90 --- /dev/null +++ b/packages/communication/src/messages/parser/help/IssueCloseNotificationMessageParser.ts @@ -0,0 +1,34 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class IssueCloseNotificationMessageParser implements IMessageParser +{ + private _closeReason: number; + private _messageText: string; + + public flush(): boolean + { + this._closeReason = 0; + this._messageText = ''; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._closeReason = wrapper.readInt(); + this._messageText = wrapper.readString(); + + return true; + } + + public get closeReason(): number + { + return this._closeReason; + } + + public get messageText(): string + { + return this._messageText; + } +} diff --git a/packages/communication/src/messages/parser/help/PendingGuideTicketData.ts b/packages/communication/src/messages/parser/help/PendingGuideTicketData.ts new file mode 100644 index 0000000..fa592e8 --- /dev/null +++ b/packages/communication/src/messages/parser/help/PendingGuideTicketData.ts @@ -0,0 +1,91 @@ +export class PendingGuideTicketData +{ + private _type: number; + private _secondsAgo: number; + private _isGuide: boolean; + private _otherPartyName: string; + private _otherPartyFigure: string; + private _description: string; + private _roomName: string; + + constructor(type: number, secondsAgo: number, isGuide: boolean, otherPartyName: string, otherPartyFigure: string, description: string, roomName: string) + { + this._type = type; + this._secondsAgo = secondsAgo; + this._isGuide = isGuide; + this._otherPartyName = otherPartyName; + this._otherPartyFigure = otherPartyFigure; + this._description = description; + this._roomName = roomName; + } + + public get type(): number + { + return this._type; + } + + public set type(value: number) + { + this._type = value; + } + + public get secondsAgo(): number + { + return this._secondsAgo; + } + + public set secondsAgo(value: number) + { + this._secondsAgo = value; + } + + public get isGuide(): boolean + { + return this._isGuide; + } + + public set isGuide(value: boolean) + { + this._isGuide = value; + } + + public get otherPartyName(): string + { + return this._otherPartyName; + } + + public set otherPartyName(value: string) + { + this._otherPartyName = value; + } + + public get otherPartyFigure(): string + { + return this._otherPartyFigure; + } + + public set otherPartyFigure(value: string) + { + this._otherPartyFigure = value; + } + + public get description(): string + { + return this._description; + } + + public set description(value: string) + { + this._description = value; + } + + public get roomName(): string + { + return this._roomName; + } + + public set roomName(value: string) + { + this._roomName = value; + } +} diff --git a/packages/communication/src/messages/parser/help/QuizDataMessageParser.ts b/packages/communication/src/messages/parser/help/QuizDataMessageParser.ts new file mode 100644 index 0000000..d78699b --- /dev/null +++ b/packages/communication/src/messages/parser/help/QuizDataMessageParser.ts @@ -0,0 +1,40 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class QuizDataMessageParser implements IMessageParser +{ + private _quizCode: string; + private _questionIds: number[]; + + public flush(): boolean + { + this._quizCode = null; + this._questionIds = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._quizCode = wrapper.readString(); + + const size = wrapper.readInt(); + + this._questionIds = []; + + for(let i = 0; i < size; i++) this._questionIds.push(wrapper.readInt()); + + return true; + } + + public get quizCode(): string + { + return this._quizCode; + } + + public get questionIds(): number[] + { + return this._questionIds; + } +} diff --git a/packages/communication/src/messages/parser/help/QuizResultsMessageParser.ts b/packages/communication/src/messages/parser/help/QuizResultsMessageParser.ts new file mode 100644 index 0000000..e0b52da --- /dev/null +++ b/packages/communication/src/messages/parser/help/QuizResultsMessageParser.ts @@ -0,0 +1,40 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class QuizResultsMessageParser implements IMessageParser +{ + private _quizCode: string; + private _questionIdsForWrongAnswers: number[]; + + public flush(): boolean + { + this._quizCode = null; + this._questionIdsForWrongAnswers = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._quizCode = wrapper.readString(); + + const size = wrapper.readInt(); + + this._questionIdsForWrongAnswers = []; + + for(let i = 0; i < size; i++) this._questionIdsForWrongAnswers.push(wrapper.readInt()); + + return true; + } + + public get quizCode(): string + { + return this._quizCode; + } + + public get questionIdsForWrongAnswers(): number[] + { + return this._questionIdsForWrongAnswers; + } +} diff --git a/packages/communication/src/messages/parser/help/index.ts b/packages/communication/src/messages/parser/help/index.ts new file mode 100644 index 0000000..684885f --- /dev/null +++ b/packages/communication/src/messages/parser/help/index.ts @@ -0,0 +1,28 @@ +export * from './CallForHelpDisabledNotifyMessageParser'; +export * from './CallForHelpPendingCallsDeletedMessageParser'; +export * from './CallForHelpPendingCallsMessageParser'; +export * from './CallForHelpReplyMessageParser'; +export * from './CallForHelpResultMessageParser'; +export * from './ChatReviewSessionDetachedMessageParser'; +export * from './ChatReviewSessionOfferedToGuideMessageParser'; +export * from './ChatReviewSessionResultsMessageParser'; +export * from './ChatReviewSessionStartedMessageParser'; +export * from './ChatReviewSessionVotingStatusMessageParser'; +export * from './GuideOnDutyStatusMessageParser'; +export * from './GuideReportingStatusMessageParser'; +export * from './GuideSessionAttachedMessageParser'; +export * from './GuideSessionDetachedMessageParser'; +export * from './GuideSessionEndedMessageParser'; +export * from './GuideSessionErrorMessageParser'; +export * from './GuideSessionInvitedToGuideRoomMessageParser'; +export * from './GuideSessionMessageMessageParser'; +export * from './GuideSessionPartnerIsTypingMessageParser'; +export * from './GuideSessionRequesterRoomMessageParser'; +export * from './GuideSessionStartedMessageParser'; +export * from './GuideTicketCreationResultMessageParser'; +export * from './GuideTicketResolutionMessageParser'; +export * from './HotelMergeNameChangeParser'; +export * from './IssueCloseNotificationMessageParser'; +export * from './PendingGuideTicketData'; +export * from './QuizDataMessageParser'; +export * from './QuizResultsMessageParser'; diff --git a/packages/communication/src/messages/parser/index.ts b/packages/communication/src/messages/parser/index.ts new file mode 100644 index 0000000..b807dc4 --- /dev/null +++ b/packages/communication/src/messages/parser/index.ts @@ -0,0 +1,77 @@ +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 './group/utils'; +export * from './groupforums'; +export * from './handshake'; +export * from './help'; +export * from './inventory'; +export * from './inventory/achievements'; +export * from './inventory/avatareffect'; +export * from './inventory/badges'; +export * from './inventory/clothing'; +export * from './inventory/furniture'; +export * from './inventory/pets'; +export * from './inventory/purse'; +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 './navigator/utils'; +export * from './notifications'; +export * from './nux'; +export * from './perk'; +export * from './perk/common'; +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/packages/communication/src/messages/parser/inventory/achievements/AchievementData.ts b/packages/communication/src/messages/parser/inventory/achievements/AchievementData.ts new file mode 100644 index 0000000..653d3d7 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/achievements/AchievementData.ts @@ -0,0 +1,156 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class AchievementData +{ + public static DISPLAY_METHOD_OBSOLETE: number = -1; + public static DISPLAY_METHOD_SHOW_LEVEL_PROGRESS: number = 0; + public static DISPLAY_METHOD_NEVER_SHOW_PROGRESS: number = 1; + public static DISPLAY_METHOD_SHOW_TOTAL_PROGRESS: number = 2; + + private _achievementId: number; + private _level: number; + private _badgeId: string; + private _scoreAtStartOfLevel: number; + private _scoreLimit: number; + private _levelRewardPoints: number; + private _levelRewardPointType: number; + private _currentPoints: number; + private _finalLevel: boolean; + private _category: string; + private _subCategory: string; + private _levelCount: number; + private _displayMethod: number; + + private _unseen: number = 0; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_parser'); + + this._achievementId = wrapper.readInt(); + this._level = wrapper.readInt(); + this._badgeId = wrapper.readString(); + this._scoreAtStartOfLevel = wrapper.readInt(); + this._scoreLimit = Math.max(1, wrapper.readInt()); + this._levelRewardPoints = wrapper.readInt(); + this._levelRewardPointType = wrapper.readInt(); + this._currentPoints = wrapper.readInt(); + this._finalLevel = wrapper.readBoolean(); + this._category = wrapper.readString(); + this._subCategory = wrapper.readString(); + this._levelCount = wrapper.readInt(); + this._displayMethod = wrapper.readInt(); + } + + public get achievementId(): number + { + return this._achievementId; + } + + public get badgeId(): string + { + return this._badgeId; + } + + public get level(): number + { + return this._level; + } + + public get scoreAtStartOfLevel(): number + { + return this._scoreAtStartOfLevel; + } + + public get scoreLimit(): number + { + return (this._scoreLimit - this._scoreAtStartOfLevel); + } + + public get levelRewardPoints(): number + { + return this._levelRewardPoints; + } + + public get levelRewardPointType(): number + { + return this._levelRewardPointType; + } + + public get currentPoints(): number + { + return (this._currentPoints - this._scoreAtStartOfLevel); + } + + public get finalLevel(): boolean + { + return this._finalLevel; + } + + public get category(): string + { + return this._category; + } + + public get subCategory(): string + { + return this._subCategory; + } + + public get levelCount(): number + { + return this._levelCount; + } + + public get firstLevelAchieved(): boolean + { + return (this._level > 1) || (this._finalLevel); + } + + public setMaxProgress(): void + { + this._currentPoints = this._scoreLimit; + } + + public get displayMethod(): number + { + return this._displayMethod; + } + + public get progress(): number + { + return this._currentPoints; + } + + public get toNextProgress(): number + { + return this._scoreLimit; + } + + public set unseen(unseen: number) + { + this._unseen = unseen; + } + + public get unseen(): number + { + return this._unseen; + } + + public reset(badge: AchievementData) + { + this._achievementId = badge._achievementId; + this._level = badge._level; + this._badgeId = badge._badgeId; + this._scoreAtStartOfLevel = badge._scoreAtStartOfLevel; + this._scoreLimit = badge._scoreLimit; + this._levelRewardPoints = badge._levelRewardPoints; + this._levelRewardPointType = badge._levelRewardPointType; + this._currentPoints = badge._currentPoints; + this._finalLevel = badge._finalLevel; + this._category = badge.category; + this._subCategory = badge._subCategory; + this._levelCount = badge._levelCount; + this._displayMethod = badge._displayMethod; + } +} diff --git a/packages/communication/src/messages/parser/inventory/achievements/AchievementParser.ts b/packages/communication/src/messages/parser/inventory/achievements/AchievementParser.ts new file mode 100644 index 0000000..4d04c80 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/achievements/AchievementParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { AchievementData } from './AchievementData'; + +export class AchievementParser implements IMessageParser +{ + private _achievement: AchievementData; + + public flush(): boolean + { + this._achievement = null; + + return true; + } + + public parse(k: IMessageDataWrapper): boolean + { + if(!k) return false; + + this._achievement = new AchievementData(k); + + return true; + } + + public get achievement(): AchievementData + { + return this._achievement; + } +} diff --git a/packages/communication/src/messages/parser/inventory/achievements/AchievementResolutionData.ts b/packages/communication/src/messages/parser/inventory/achievements/AchievementResolutionData.ts new file mode 100644 index 0000000..449c825 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/achievements/AchievementResolutionData.ts @@ -0,0 +1,59 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class AchievementResolutionData +{ + public static STATE_SELECTABLE: number = 0; + + private _achievementId: number; + private _level: number; + private _badgeId: string; + private _requiredLevel: number; + private _state: number; + + constructor(wrapper: IMessageDataWrapper) + { + this._achievementId = wrapper.readInt(); + this._level = wrapper.readInt(); + this._badgeId = wrapper.readString(); + this._requiredLevel = wrapper.readInt(); + this._state = wrapper.readInt(); + } + + public dispose(): void + { + this._achievementId = 0; + this._level = 0; + this._badgeId = ''; + this._requiredLevel = 0; + } + + public get achievementId(): number + { + return this._achievementId; + } + + public get level(): number + { + return this._level; + } + + public get badgeId(): string + { + return this._badgeId; + } + + public get requiredLevel(): number + { + return this._requiredLevel; + } + + public get enabled(): boolean + { + return (this._state === AchievementResolutionData.STATE_SELECTABLE); + } + + public get state(): number + { + return this._state; + } +} diff --git a/packages/communication/src/messages/parser/inventory/achievements/AchievementsParser.ts b/packages/communication/src/messages/parser/inventory/achievements/AchievementsParser.ts new file mode 100644 index 0000000..ecce86d --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/achievements/AchievementsParser.ts @@ -0,0 +1,46 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { AchievementData } from './AchievementData'; + +export class AchievementsParser implements IMessageParser +{ + private _achievements: AchievementData[]; + private _defaultCategory: string; + + public flush(): boolean + { + this._achievements = []; + this._defaultCategory = null; + + return true; + } + + public parse(k: IMessageDataWrapper): boolean + { + if(!k) return false; + + this._achievements = []; + + let totalCount = k.readInt(); + + while(totalCount > 0) + { + this._achievements.push(new AchievementData(k)); + + totalCount--; + } + + this._defaultCategory = k.readString(); + + return true; + } + + public get achievements(): AchievementData[] + { + return this._achievements; + } + + public get defaultCategory(): string + { + return this._defaultCategory; + } +} diff --git a/packages/communication/src/messages/parser/inventory/achievements/AchievementsScoreParser.ts b/packages/communication/src/messages/parser/inventory/achievements/AchievementsScoreParser.ts new file mode 100644 index 0000000..ad15939 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/achievements/AchievementsScoreParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class AchievementsScoreParser implements IMessageParser +{ + private _score: number; + + public flush(): boolean + { + this._score = 0; + + return true; + } + + public parse(k: IMessageDataWrapper): boolean + { + if(!k) return false; + + this._score = k.readInt(); + + return true; + } + + public get score(): number + { + return this._score; + } +} diff --git a/packages/communication/src/messages/parser/inventory/achievements/index.ts b/packages/communication/src/messages/parser/inventory/achievements/index.ts new file mode 100644 index 0000000..3b5ad93 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/achievements/index.ts @@ -0,0 +1,5 @@ +export * from './AchievementData'; +export * from './AchievementParser'; +export * from './AchievementResolutionData'; +export * from './AchievementsParser'; +export * from './AchievementsScoreParser'; diff --git a/packages/communication/src/messages/parser/inventory/avatareffect/AvatarEffect.ts b/packages/communication/src/messages/parser/inventory/avatareffect/AvatarEffect.ts new file mode 100644 index 0000000..e4b8f21 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/avatareffect/AvatarEffect.ts @@ -0,0 +1,69 @@ +export class AvatarEffect +{ + private _type: number; + private _subType: number; + private _duration: number; + private _inactiveEffectsInInventory: number; + private _secondsLeftIfActive: number; + private _permanent: boolean; + + public get type(): number + { + return this._type; + } + + public set type(k: number) + { + this._type = k; + } + + public get subType(): number + { + return this._subType; + } + + public set subType(k: number) + { + this._subType = k; + } + + public get duration(): number + { + return this._duration; + } + + public set duration(k: number) + { + this._duration = k; + } + + public get inactiveEffectsInInventory(): number + { + return this._inactiveEffectsInInventory; + } + + public set inactiveEffectsInInventory(k: number) + { + this._inactiveEffectsInInventory = k; + } + + public get secondsLeftIfActive(): number + { + return this._secondsLeftIfActive; + } + + public set secondsLeftIfActive(k: number) + { + this._secondsLeftIfActive = k; + } + + public get isPermanent(): boolean + { + return this._permanent; + } + + public set isPermanent(k: boolean) + { + this._permanent = k; + } +} diff --git a/packages/communication/src/messages/parser/inventory/avatareffect/AvatarEffectActivatedParser.ts b/packages/communication/src/messages/parser/inventory/avatareffect/AvatarEffectActivatedParser.ts new file mode 100644 index 0000000..7d8d5e8 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/avatareffect/AvatarEffectActivatedParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class AvatarEffectActivatedParser implements IMessageParser +{ + private _type: number; + private _duration: number; + private _isPermanent: boolean; + + public flush(): boolean + { + this._type = 0; + this._duration = 0; + this._isPermanent = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._type = wrapper.readInt(); + this._duration = wrapper.readInt(); + this._isPermanent = wrapper.readBoolean(); + + return true; + } + + public get type(): number + { + return this._type; + } + + public get duration(): number + { + return this._duration; + } + + public get isPermanent(): boolean + { + return this._isPermanent; + } +} diff --git a/packages/communication/src/messages/parser/inventory/avatareffect/AvatarEffectAddedParser.ts b/packages/communication/src/messages/parser/inventory/avatareffect/AvatarEffectAddedParser.ts new file mode 100644 index 0000000..ad9d6ea --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/avatareffect/AvatarEffectAddedParser.ts @@ -0,0 +1,51 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class AvatarEffectAddedParser implements IMessageParser +{ + private _type: number; + private _subType: number; + private _duration: number; + private _permanent: boolean; + + public flush(): boolean + { + this._type = 0; + this._subType = 0; + this._duration = 0; + this._permanent = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._type = wrapper.readInt(); + this._subType = wrapper.readInt(); + this._duration = wrapper.readInt(); + this._permanent = wrapper.readBoolean(); + + return true; + } + + public get type(): number + { + return this._type; + } + + public get subType(): number + { + return this._subType; + } + + public get duration(): number + { + return this._duration; + } + + public get isPermanent(): boolean + { + return this._permanent; + } +} diff --git a/packages/communication/src/messages/parser/inventory/avatareffect/AvatarEffectExpiredParser.ts b/packages/communication/src/messages/parser/inventory/avatareffect/AvatarEffectExpiredParser.ts new file mode 100644 index 0000000..36ed079 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/avatareffect/AvatarEffectExpiredParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class AvatarEffectExpiredParser implements IMessageParser +{ + private _type: number; + + public flush(): boolean + { + this._type = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._type = wrapper.readInt(); + + return true; + } + + public get type(): number + { + return this._type; + } +} diff --git a/packages/communication/src/messages/parser/inventory/avatareffect/AvatarEffectSelectedParser.ts b/packages/communication/src/messages/parser/inventory/avatareffect/AvatarEffectSelectedParser.ts new file mode 100644 index 0000000..aa2af6a --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/avatareffect/AvatarEffectSelectedParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class AvatarEffectSelectedParser implements IMessageParser +{ + private _type: number; + + public flush(): boolean + { + this._type = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._type = wrapper.readInt(); + + return true; + } + + public get type(): number + { + return this._type; + } +} diff --git a/packages/communication/src/messages/parser/inventory/avatareffect/AvatarEffectsParser.ts b/packages/communication/src/messages/parser/inventory/avatareffect/AvatarEffectsParser.ts new file mode 100644 index 0000000..9f0075d --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/avatareffect/AvatarEffectsParser.ts @@ -0,0 +1,44 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { AvatarEffect } from './AvatarEffect'; + +export class AvatarEffectsParser implements IMessageParser +{ + private _effects: AvatarEffect[]; + + public flush(): boolean + { + this._effects = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalEffects = wrapper.readInt(); + + while(totalEffects > 0) + { + const effect = new AvatarEffect(); + + effect.type = wrapper.readInt(); + effect.subType = wrapper.readInt(); + effect.duration = wrapper.readInt(); + effect.inactiveEffectsInInventory = wrapper.readInt(); + effect.secondsLeftIfActive = wrapper.readInt(); + effect.isPermanent = wrapper.readBoolean(); + + this._effects.push(effect); + + totalEffects--; + } + + return true; + } + + public get effects(): AvatarEffect[] + { + return this._effects; + } +} diff --git a/packages/communication/src/messages/parser/inventory/avatareffect/index.ts b/packages/communication/src/messages/parser/inventory/avatareffect/index.ts new file mode 100644 index 0000000..ff677c4 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/avatareffect/index.ts @@ -0,0 +1,6 @@ +export * from './AvatarEffect'; +export * from './AvatarEffectActivatedParser'; +export * from './AvatarEffectAddedParser'; +export * from './AvatarEffectExpiredParser'; +export * from './AvatarEffectSelectedParser'; +export * from './AvatarEffectsParser'; diff --git a/packages/communication/src/messages/parser/inventory/badges/BadgeAndPointLimit.ts b/packages/communication/src/messages/parser/inventory/badges/BadgeAndPointLimit.ts new file mode 100644 index 0000000..e822350 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/badges/BadgeAndPointLimit.ts @@ -0,0 +1,25 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class BadgeAndPointLimit +{ + private _badgeId: string; + private _limit: number; + + constructor(k: string, _arg_2: IMessageDataWrapper) + { + if(!_arg_2) throw new Error('invalid_parser'); + + this._badgeId = (('ACH_' + k) + _arg_2.readInt()); + this._limit = _arg_2.readInt(); + } + + public get badgeId(): string + { + return this._badgeId; + } + + public get limit(): number + { + return this._limit; + } +} diff --git a/packages/communication/src/messages/parser/inventory/badges/BadgePointLimitsParser.ts b/packages/communication/src/messages/parser/inventory/badges/BadgePointLimitsParser.ts new file mode 100644 index 0000000..f08837a --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/badges/BadgePointLimitsParser.ts @@ -0,0 +1,45 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { BadgeAndPointLimit } from './BadgeAndPointLimit'; + +export class BadgePointLimitsParser implements IMessageParser +{ + private _data: BadgeAndPointLimit[]; + + public flush(): boolean + { + this._data = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let _local_2 = wrapper.readInt(); + + while(_local_2 > 0) + { + const _local_4 = wrapper.readString(); + const _local_5 = wrapper.readInt(); + + let _local_6 = 0; + + while(_local_6 < _local_5) + { + this._data.push(new BadgeAndPointLimit(_local_4, wrapper)); + + _local_6++; + } + + _local_2--; + } + + return true; + } + + public get data(): BadgeAndPointLimit[] + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/inventory/badges/BadgeReceivedParser.ts b/packages/communication/src/messages/parser/inventory/badges/BadgeReceivedParser.ts new file mode 100644 index 0000000..b4b6bcd --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/badges/BadgeReceivedParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class BadgeReceivedParser implements IMessageParser +{ + private _badgeId: number; + private _badgeCode: string; + + public flush(): boolean + { + this._badgeId = 0; + this._badgeCode = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._badgeId = wrapper.readInt(); + this._badgeCode = wrapper.readString(); + + return true; + } + + public get badgeId(): number + { + return this._badgeId; + } + + public get badgeCode(): string + { + return this._badgeCode; + } +} diff --git a/packages/communication/src/messages/parser/inventory/badges/BadgesParser.ts b/packages/communication/src/messages/parser/inventory/badges/BadgesParser.ts new file mode 100644 index 0000000..5d305ed --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/badges/BadgesParser.ts @@ -0,0 +1,69 @@ +import { IAdvancedMap, IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { AdvancedMap } from '@nitrots/utils'; + +export class BadgesParser implements IMessageParser +{ + private _allBadgeCodes: string[]; + private _activeBadgeCodes: string[]; + private _badgeIds: IAdvancedMap; + + public flush(): boolean + { + this._allBadgeCodes = []; + this._activeBadgeCodes = null; + this._badgeIds = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._allBadgeCodes = []; + this._activeBadgeCodes = []; + this._badgeIds = new AdvancedMap(); + + let count = wrapper.readInt(); + + while(count > 0) + { + const badgeId = wrapper.readInt(); + const badgeCode = wrapper.readString(); + + this._badgeIds.add(badgeCode, badgeId); + + this._allBadgeCodes.push(badgeCode); + + count--; + } + + count = wrapper.readInt(); + + while(count > 0) + { + const badgeSlot = wrapper.readInt(); + const badgeCode = wrapper.readString(); + + this._activeBadgeCodes.push(badgeCode); + + count--; + } + + return true; + } + + public getBadgeId(code: string): number + { + return this._badgeIds.getValue(code); + } + public getAllBadgeCodes(): string[] + { + return this._allBadgeCodes; + } + + public getActiveBadgeCodes(): string[] + { + return this._activeBadgeCodes; + } +} diff --git a/packages/communication/src/messages/parser/inventory/badges/IsBadgeRequestFulfilledParser.ts b/packages/communication/src/messages/parser/inventory/badges/IsBadgeRequestFulfilledParser.ts new file mode 100644 index 0000000..2cae759 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/badges/IsBadgeRequestFulfilledParser.ts @@ -0,0 +1,32 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class IsBadgeRequestFulfilledParser implements IMessageParser +{ + private _requestCode: string; + private _fulfilled: boolean; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._requestCode = wrapper.readString(); + this._fulfilled = wrapper.readBoolean(); + + return true; + } + + public get requestCode(): string + { + return this._requestCode; + } + + public get fulfilled(): boolean + { + return this._fulfilled; + } +} diff --git a/packages/communication/src/messages/parser/inventory/badges/index.ts b/packages/communication/src/messages/parser/inventory/badges/index.ts new file mode 100644 index 0000000..5ba1686 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/badges/index.ts @@ -0,0 +1,5 @@ +export * from './BadgeAndPointLimit'; +export * from './BadgePointLimitsParser'; +export * from './BadgeReceivedParser'; +export * from './BadgesParser'; +export * from './IsBadgeRequestFulfilledParser'; diff --git a/packages/communication/src/messages/parser/inventory/clothing/FigureSetIdsMessageParser.ts b/packages/communication/src/messages/parser/inventory/clothing/FigureSetIdsMessageParser.ts new file mode 100644 index 0000000..28a2db4 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/clothing/FigureSetIdsMessageParser.ts @@ -0,0 +1,50 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FigureSetIdsMessageParser implements IMessageParser +{ + private _figureSetIds: number[]; + private _boundFurnitureNames: string[]; + + public flush(): boolean + { + this._figureSetIds = []; + this._boundFurnitureNames = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalSetIds = wrapper.readInt(); + + while(totalSetIds > 0) + { + this._figureSetIds.push(wrapper.readInt()); + + totalSetIds--; + } + + let totalFurnitureNames = wrapper.readInt(); + + while(totalFurnitureNames > 0) + { + this._boundFurnitureNames.push(wrapper.readString()); + + totalFurnitureNames--; + } + + return true; + } + + public get figureSetIds(): number[] + { + return this._figureSetIds; + } + + public get boundsFurnitureNames(): string[] + { + return this._boundFurnitureNames; + } +} diff --git a/packages/communication/src/messages/parser/inventory/clothing/_Str_8728.ts b/packages/communication/src/messages/parser/inventory/clothing/_Str_8728.ts new file mode 100644 index 0000000..e4ba1a2 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/clothing/_Str_8728.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class _Str_8728 implements IMessageParser +{ + private _itemId: number; + + public flush(): boolean + { + this._itemId = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._itemId = wrapper.readInt(); + + return true; + } + + public get itemId(): number + { + return this._itemId; + } +} diff --git a/packages/communication/src/messages/parser/inventory/clothing/_Str_9021.ts b/packages/communication/src/messages/parser/inventory/clothing/_Str_9021.ts new file mode 100644 index 0000000..9a75a5f --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/clothing/_Str_9021.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class _Str_9021 implements IMessageParser +{ + private _itemId: number; + + public flush(): boolean + { + this._itemId = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._itemId = wrapper.readInt(); + + return true; + } + + public get itemId(): number + { + return this._itemId; + } +} diff --git a/packages/communication/src/messages/parser/inventory/clothing/index.ts b/packages/communication/src/messages/parser/inventory/clothing/index.ts new file mode 100644 index 0000000..72484f0 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/clothing/index.ts @@ -0,0 +1,3 @@ +export * from './FigureSetIdsMessageParser'; +export * from './_Str_8728'; +export * from './_Str_9021'; diff --git a/packages/communication/src/messages/parser/inventory/furniture/FurnitureListAddOrUpdateParser.ts b/packages/communication/src/messages/parser/inventory/furniture/FurnitureListAddOrUpdateParser.ts new file mode 100644 index 0000000..0c1d8e5 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/furniture/FurnitureListAddOrUpdateParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { FurnitureListItemParser } from './FurnitureListItemParser'; + +export class FurnitureListAddOrUpdateParser implements IMessageParser +{ + private _items: FurnitureListItemParser[]; + + public flush(): boolean + { + this._items = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._items.push(new FurnitureListItemParser(wrapper)); + + return true; + } + + public get items(): FurnitureListItemParser[] + { + return this._items; + } +} diff --git a/packages/communication/src/messages/parser/inventory/furniture/FurnitureListInvalidateParser.ts b/packages/communication/src/messages/parser/inventory/furniture/FurnitureListInvalidateParser.ts new file mode 100644 index 0000000..009ce2e --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/furniture/FurnitureListInvalidateParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FurnitureListInvalidateParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/inventory/furniture/FurnitureListItemParser.ts b/packages/communication/src/messages/parser/inventory/furniture/FurnitureListItemParser.ts new file mode 100644 index 0000000..cde8466 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/furniture/FurnitureListItemParser.ts @@ -0,0 +1,217 @@ +import { IMessageDataWrapper, IObjectData } from '@nitrots/api'; +import { FurnitureDataParser } from '../../room'; +import { IFurnitureItemData } from './IFurnitureItemData'; + +export class FurnitureListItemParser implements IFurnitureItemData +{ + private static WALL_ITEM: string = 'I'; + private static FLOOR_ITEM: string = 'S'; + + private _rentable: boolean; + private _itemId: number; + private _furniType: string; + private _ref: number; + private _spriteId: number; + private _category: number; + private _stuffData: IObjectData; + private _isGroupable: boolean; + private _isRecyclable: boolean; + private _tradable: boolean; + private _sellable: boolean; + private _secondsToExpiration: number; + private _extra: number; + private _flatId: number; + private _isWallItem: boolean; + private _hasRentPeriodStarted: boolean; + private _expirationTimeStamp: number; + private _slotId: string; + private _songId: number; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this.flush(); + this.parse(wrapper); + } + + public flush(): boolean + { + this._rentable = false; + this._itemId = 0; + this._furniType = null; + this._ref = 0; + this._spriteId = 0; + this._category = 0; + this._stuffData = null; + this._isGroupable = false; + this._isRecyclable = false; + this._tradable = false; + this._sellable = false; + this._secondsToExpiration = 0; + this._extra = 0; + this._flatId = 0; + this._isWallItem = false; + this._hasRentPeriodStarted = false; + this._expirationTimeStamp = 0; + this._slotId = ''; + this._songId = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._itemId = wrapper.readInt(); + this._furniType = wrapper.readString(); + this._ref = wrapper.readInt(); + this._spriteId = wrapper.readInt(); + this._category = wrapper.readInt(); + this._stuffData = FurnitureDataParser.parseObjectData(wrapper); + this._isRecyclable = wrapper.readBoolean(); + this._tradable = wrapper.readBoolean(); + this._isGroupable = wrapper.readBoolean(); + this._sellable = wrapper.readBoolean(); + this._secondsToExpiration = wrapper.readInt(); + this._expirationTimeStamp = 0; //GetTickerTime + + if(this.secondsToExpiration > -1) + { + this._rentable = true; + } + else + { + this._rentable = false; + this._secondsToExpiration = -1; + } + + this._hasRentPeriodStarted = wrapper.readBoolean(); + this._flatId = wrapper.readInt(); + this._isWallItem = (this._furniType === FurnitureListItemParser.WALL_ITEM); + + if(this._furniType === FurnitureListItemParser.FLOOR_ITEM) + { + this._slotId = wrapper.readString(); + this._extra = wrapper.readInt(); + } + + return true; + } + + public get itemId(): number + { + return this._itemId; + } + + public get furniType(): string + { + return this._furniType; + } + + public get ref(): number + { + return this._ref; + } + + public get spriteId(): number + { + return this._spriteId; + } + + public get category(): number + { + return this._category; + } + + public get stuffData(): IObjectData + { + return this._stuffData; + } + + public get isGroupable(): boolean + { + return this._isGroupable; + } + + public get isRecycleable(): boolean + { + return this._isRecyclable; + } + + public get tradable(): boolean + { + return this._tradable; + } + + public get sellable(): boolean + { + return this._sellable; + } + + public get secondsToExpiration(): number + { + return this._secondsToExpiration; + } + + public get flatId(): number + { + return this._flatId; + } + + public get slotId(): string + { + return this._slotId; + } + + public get songId(): number + { + return this._songId; + } + + public get extra(): number + { + return this._extra; + } + + public get rentable(): boolean + { + return this._rentable; + } + + public get isWallItem(): boolean + { + return this._isWallItem; + } + + public get hasRentPeriodStarted(): boolean + { + return this._hasRentPeriodStarted; + } + + public get expirationTimeStamp(): number + { + return this._expirationTimeStamp; + } + + public get creationDay(): number + { + return 0; + } + + public get creationMonth(): number + { + return 0; + } + + public get creationYear(): number + { + return 0; + } + + public get isExternalImageFurni(): boolean + { + return !(this._furniType.indexOf('external_image') === -1); + } +} diff --git a/packages/communication/src/messages/parser/inventory/furniture/FurnitureListParser.ts b/packages/communication/src/messages/parser/inventory/furniture/FurnitureListParser.ts new file mode 100644 index 0000000..13deca6 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/furniture/FurnitureListParser.ts @@ -0,0 +1,54 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { FurnitureListItemParser } from './FurnitureListItemParser'; + +export class FurnitureListParser implements IMessageParser +{ + private _totalFragments: number; + private _fragmentNumber: number; + private _fragment: Map; + + public flush(): boolean + { + this._totalFragments = 0; + this._fragmentNumber = 0; + this._fragment = new Map(); + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._totalFragments = wrapper.readInt(); + this._fragmentNumber = wrapper.readInt(); + + let totalItems = wrapper.readInt(); + + while(totalItems > 0) + { + const item = new FurnitureListItemParser(wrapper); + + if(item) this._fragment.set(item.itemId, item); + + totalItems--; + } + + return true; + } + + public get totalFragments(): number + { + return this._totalFragments; + } + + public get fragmentNumber(): number + { + return this._fragmentNumber; + } + + public get fragment(): Map + { + return this._fragment; + } +} diff --git a/packages/communication/src/messages/parser/inventory/furniture/FurnitureListRemovedParser.ts b/packages/communication/src/messages/parser/inventory/furniture/FurnitureListRemovedParser.ts new file mode 100644 index 0000000..81838e1 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/furniture/FurnitureListRemovedParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FurnitureListRemovedParser implements IMessageParser +{ + private _itemId: number; + + public flush(): boolean + { + this._itemId = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._itemId = wrapper.readInt(); + + return true; + } + + public get itemId(): number + { + return this._itemId; + } +} diff --git a/packages/communication/src/messages/parser/inventory/furniture/FurniturePostItPlacedParser.ts b/packages/communication/src/messages/parser/inventory/furniture/FurniturePostItPlacedParser.ts new file mode 100644 index 0000000..8a6c4eb --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/furniture/FurniturePostItPlacedParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FurniturePostItPlacedParser implements IMessageParser +{ + private _itemId: number; + private _itemsLeft: number; + + public flush(): boolean + { + this._itemId = 0; + this._itemsLeft = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._itemId = wrapper.readInt(); + this._itemsLeft = wrapper.readInt(); + + return true; + } + + public get itemId(): number + { + return this._itemId; + } + + public get itemsLeft(): number + { + return this._itemsLeft; + } +} diff --git a/packages/communication/src/messages/parser/inventory/furniture/IFurnitureItemData.ts b/packages/communication/src/messages/parser/inventory/furniture/IFurnitureItemData.ts new file mode 100644 index 0000000..e2a9bdd --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/furniture/IFurnitureItemData.ts @@ -0,0 +1,28 @@ +import { IObjectData } from '@nitrots/api'; + +export interface IFurnitureItemData +{ + itemId: number; + furniType: string; + ref: number; + spriteId: number; + category: number; + stuffData: IObjectData; + isGroupable: boolean; + isRecycleable: boolean; + tradable: boolean; + sellable: boolean; + secondsToExpiration: number; + flatId: number; + slotId: string; + songId: number; + extra: number; + rentable: boolean; + isWallItem: boolean; + hasRentPeriodStarted: boolean; + expirationTimeStamp: number; + creationDay: number; + creationMonth: number; + creationYear: number; + isExternalImageFurni: boolean; +} diff --git a/packages/communication/src/messages/parser/inventory/furniture/PresentOpenedMessageParser.ts b/packages/communication/src/messages/parser/inventory/furniture/PresentOpenedMessageParser.ts new file mode 100644 index 0000000..8fb114b --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/furniture/PresentOpenedMessageParser.ts @@ -0,0 +1,70 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class PresentOpenedMessageParser implements IMessageParser +{ + private _itemType: string; + private _classId: number; + private _productCode: string; + private _placedItemId: number; + private _placedItemType: string; + private _placedInRoom: boolean; + private _petFigureString: string; + + public flush(): boolean + { + this._itemType = ''; + this._classId = 0; + this._productCode = ''; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._itemType = wrapper.readString(); + this._classId = wrapper.readInt(); + this._productCode = wrapper.readString(); + this._placedItemId = wrapper.readInt(); + this._placedItemType = wrapper.readString(); + this._placedInRoom = wrapper.readBoolean(); + this._petFigureString = wrapper.readString(); + return true; + } + + public get itemType(): string + { + return this._itemType; + } + + public get classId(): number + { + return this._classId; + } + + public get productCode(): string + { + return this._productCode; + } + + public get placedItemId(): number + { + return this._placedItemId; + } + + public get placedItemType(): string + { + return this._placedItemType; + } + + public get placedInRoom(): boolean + { + return this._placedInRoom; + } + + public get petFigureString(): string + { + return this._petFigureString; + } +} diff --git a/packages/communication/src/messages/parser/inventory/furniture/index.ts b/packages/communication/src/messages/parser/inventory/furniture/index.ts new file mode 100644 index 0000000..a56120a --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/furniture/index.ts @@ -0,0 +1,8 @@ +export * from './FurnitureListAddOrUpdateParser'; +export * from './FurnitureListInvalidateParser'; +export * from './FurnitureListItemParser'; +export * from './FurnitureListParser'; +export * from './FurnitureListRemovedParser'; +export * from './FurniturePostItPlacedParser'; +export * from './IFurnitureItemData'; +export * from './PresentOpenedMessageParser'; diff --git a/packages/communication/src/messages/parser/inventory/index.ts b/packages/communication/src/messages/parser/inventory/index.ts new file mode 100644 index 0000000..01f6a81 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/index.ts @@ -0,0 +1,8 @@ +export * from './achievements'; +export * from './avatareffect'; +export * from './badges'; +export * from './clothing'; +export * from './furniture'; +export * from './pets'; +export * from './purse'; +export * from './trading'; diff --git a/packages/communication/src/messages/parser/inventory/pets/ConfirmBreedingRequestParser.ts b/packages/communication/src/messages/parser/inventory/pets/ConfirmBreedingRequestParser.ts new file mode 100644 index 0000000..38ed7c6 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/pets/ConfirmBreedingRequestParser.ts @@ -0,0 +1,80 @@ +import { BreedingPetInfo, IMessageDataWrapper, IMessageParser, RarityCategoryData } from '@nitrots/api'; + +export class ConfirmBreedingRequestParser implements IMessageParser +{ + private _nestId: number; + private _pet1: BreedingPetInfo; + private _pet2: BreedingPetInfo; + private _rarityCategories: RarityCategoryData[]; + private _resultPetType: number; + + public flush(): boolean + { + this._nestId = 0; + + if(this._pet1) + { + this._pet1.dispose(); + this._pet1 = null; + } + + if(this._pet2) + { + this._pet2.dispose(); + this._pet2 = null; + } + + for(const k of this._rarityCategories) k && k.dispose(); + + this._rarityCategories = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._nestId = wrapper.readInt(); + this._pet1 = new BreedingPetInfo(wrapper); + this._pet2 = new BreedingPetInfo(wrapper); + + let totalCount = wrapper.readInt(); + + while(totalCount > 0) + { + this._rarityCategories.push(new RarityCategoryData(wrapper)); + + totalCount--; + } + + this._resultPetType = wrapper.readInt(); + + return true; + } + + 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 resultPetType(): number + { + return this._resultPetType; + } +} diff --git a/packages/communication/src/messages/parser/inventory/pets/ConfirmBreedingResultParser.ts b/packages/communication/src/messages/parser/inventory/pets/ConfirmBreedingResultParser.ts new file mode 100644 index 0000000..4ca1eb5 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/pets/ConfirmBreedingResultParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ConfirmBreedingResultParser implements IMessageParser +{ + private _breedingNestStuffId: number; + private _result: number; + + public flush(): boolean + { + this._breedingNestStuffId = 0; + this._result = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._breedingNestStuffId = wrapper.readInt(); + this._result = wrapper.readInt(); + + return true; + } + + public get breedingNestStuffId(): number + { + return this._breedingNestStuffId; + } + + public get result(): number + { + return this._result; + } +} diff --git a/packages/communication/src/messages/parser/inventory/pets/GoToBreedingNestFailureParser.ts b/packages/communication/src/messages/parser/inventory/pets/GoToBreedingNestFailureParser.ts new file mode 100644 index 0000000..3520c34 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/pets/GoToBreedingNestFailureParser.ts @@ -0,0 +1,25 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GoToBreedingNestFailureParser implements IMessageParser +{ + public static PET_TOO_TIRED_TO_BREED: number = 6; + + private _reason: number; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + this._reason = wrapper.readInt(); + + return true; + } + + public get reason(): number + { + return this._reason; + } +} diff --git a/packages/communication/src/messages/parser/inventory/pets/NestBreedingSuccessParser.ts b/packages/communication/src/messages/parser/inventory/pets/NestBreedingSuccessParser.ts new file mode 100644 index 0000000..905de61 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/pets/NestBreedingSuccessParser.ts @@ -0,0 +1,33 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class NestBreedingSuccessParser implements IMessageParser +{ + private _rarityCategory: number; + private _petId: number; + + public flush(): boolean + { + this._petId = -1; + this._rarityCategory = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + this._petId = wrapper.readInt(); + this._rarityCategory = wrapper.readInt(); + + return true; + } + + public get rarityCategory(): number + { + return this._rarityCategory; + } + + public get petId(): number + { + return this._petId; + } +} diff --git a/packages/communication/src/messages/parser/inventory/pets/PetAddedToInventoryParser.ts b/packages/communication/src/messages/parser/inventory/pets/PetAddedToInventoryParser.ts new file mode 100644 index 0000000..f3c4515 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/pets/PetAddedToInventoryParser.ts @@ -0,0 +1,34 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { PetData } from './PetData'; + +export class PetAddedToInventoryParser implements IMessageParser +{ + private _pet: PetData; + private _boughtAsGift: boolean; + + public flush(): boolean + { + this._pet = null; + this._boughtAsGift = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + this._pet = new PetData(wrapper); + this._boughtAsGift = wrapper.readBoolean(); + + return true; + } + + public get pet(): PetData + { + return this._pet; + } + + public get boughtAsGift(): boolean + { + return this._boughtAsGift; + } +} diff --git a/packages/communication/src/messages/parser/inventory/pets/PetBreedingMessageParser.ts b/packages/communication/src/messages/parser/inventory/pets/PetBreedingMessageParser.ts new file mode 100644 index 0000000..595c32a --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/pets/PetBreedingMessageParser.ts @@ -0,0 +1,47 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class PetBreedingMessageParser implements IMessageParser +{ + public static STATE_CANCEL: number = 1; + public static STATE_ACCEPT: number = 2; + public static STATE_REQUEST: number = 3; + + private _state: number; + private _ownPetId: number; + private _otherPetId: number; + + public flush(): boolean + { + this._state = 0; + this._ownPetId = 0; + this._otherPetId = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._state = wrapper.readInt(); + this._ownPetId = wrapper.readInt(); + this._otherPetId = wrapper.readInt(); + + return true; + } + + public get state(): number + { + return this._state; + } + + public get ownPetId(): number + { + return this._ownPetId; + } + + public get otherPetId(): number + { + return this._otherPetId; + } +} diff --git a/packages/communication/src/messages/parser/inventory/pets/PetData.ts b/packages/communication/src/messages/parser/inventory/pets/PetData.ts new file mode 100644 index 0000000..0f0eda5 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/pets/PetData.ts @@ -0,0 +1,70 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { PetFigureDataParser } from './PetFigureDataParser'; + +export class PetData +{ + private _id: number; + private _name: string; + private _figureData: PetFigureDataParser; + private _level: number; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this._id = wrapper.readInt(); + this._name = wrapper.readString(); + this._figureData = new PetFigureDataParser(wrapper); + this._level = wrapper.readInt(); + } + + public get id(): number + { + return this._id; + } + + public get name(): string + { + return this._name; + } + + public get typeId(): number + { + return this._figureData.typeId; + } + + public get paletteId(): number + { + return this._figureData.paletteId; + } + + public get color(): string + { + return this._figureData.color; + } + + public get breedId(): number + { + return this._figureData.breedId; + } + + public get customPartCount(): number + { + return this._figureData.customPartCount; + } + + public get figureString(): string + { + return this._figureData.figuredata; + } + + public get figureData(): PetFigureDataParser + { + return this._figureData; + } + + public get level(): number + { + return this._level; + } +} diff --git a/packages/communication/src/messages/parser/inventory/pets/PetFigureDataParser.ts b/packages/communication/src/messages/parser/inventory/pets/PetFigureDataParser.ts new file mode 100644 index 0000000..509db73 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/pets/PetFigureDataParser.ts @@ -0,0 +1,71 @@ +import { IMessageDataWrapper, IPetCustomPart, IPetFigureData, PetCustomPart } from '@nitrots/api'; + +export class PetFigureDataParser implements IPetFigureData +{ + private _typeId: number; + private _paletteId: number; + private _color: string; + private _breedId: number; + private _customPartCount: number; + private _customParts: IPetCustomPart[]; + + constructor(wrapper: IMessageDataWrapper) + { + this._typeId = wrapper.readInt(); + this._paletteId = wrapper.readInt(); + this._color = wrapper.readString(); + this._breedId = wrapper.readInt(); + this._customParts = []; + this._customPartCount = wrapper.readInt(); + + let i = 0; + + while(i < this._customPartCount) + { + this._customParts.push(new PetCustomPart(wrapper.readInt(), wrapper.readInt(), wrapper.readInt())); + + i++; + } + } + + public get typeId(): number + { + return this._typeId; + } + + public get paletteId(): number + { + return this._paletteId; + } + + public get color(): string + { + return this._color; + } + + public get breedId(): number + { + return this._breedId; + } + + public get figuredata(): string + { + let figure = ((((this.typeId + ' ') + this.paletteId) + ' ') + this.color); + + figure = (figure + (' ' + this.customPartCount)); + + for(const _local_2 of this.customParts) figure = (figure + (' ' + _local_2.layerId + ' ' + _local_2.partId + ' ' + _local_2.paletteId)); + + return figure; + } + + public get customParts(): IPetCustomPart[] + { + return this._customParts; + } + + public get customPartCount(): number + { + return this._customPartCount; + } +} diff --git a/packages/communication/src/messages/parser/inventory/pets/PetInventoryParser.ts b/packages/communication/src/messages/parser/inventory/pets/PetInventoryParser.ts new file mode 100644 index 0000000..dbdfb2f --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/pets/PetInventoryParser.ts @@ -0,0 +1,52 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { PetData } from './PetData'; + +export class PetInventoryParser implements IMessageParser +{ + protected _totalFragments: number; + protected _fragmentNumber: number; + private _fragment: Map; + + public flush(): boolean + { + this._fragment = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + this._totalFragments = wrapper.readInt(); + this._fragmentNumber = wrapper.readInt(); + + let totalCount: number = wrapper.readInt(); + + this._fragment = new Map(); + + while(totalCount > 0) + { + const petData = new PetData(wrapper); + + this._fragment.set(petData.id, petData); + + totalCount--; + } + + return true; + } + + public get totalFragments(): number + { + return this._totalFragments; + } + + public get fragmentNumber(): number + { + return this._fragmentNumber; + } + + public get fragment(): Map + { + return this._fragment; + } +} diff --git a/packages/communication/src/messages/parser/inventory/pets/PetReceivedMessageParser.ts b/packages/communication/src/messages/parser/inventory/pets/PetReceivedMessageParser.ts new file mode 100644 index 0000000..5401be4 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/pets/PetReceivedMessageParser.ts @@ -0,0 +1,34 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { PetData } from './PetData'; + +export class PetReceivedMessageParser implements IMessageParser +{ + private _boughtAsGift: boolean; + private _pet: PetData; + + public flush(): boolean + { + this._boughtAsGift = false; + this._pet = null; + + return true; + } + + public parse(k: IMessageDataWrapper): boolean + { + this._boughtAsGift = k.readBoolean(); + this._pet = new PetData(k); + + return true; + } + + public get boughtAsGift(): boolean + { + return this._boughtAsGift; + } + + public get pet(): PetData + { + return this._pet; + } +} diff --git a/packages/communication/src/messages/parser/inventory/pets/PetRemovedFromInventoryParser.ts b/packages/communication/src/messages/parser/inventory/pets/PetRemovedFromInventoryParser.ts new file mode 100644 index 0000000..21b1193 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/pets/PetRemovedFromInventoryParser.ts @@ -0,0 +1,25 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class PetRemovedFromInventoryParser implements IMessageParser +{ + private _petId: number; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._petId = wrapper.readInt(); + + return true; + } + + public get petId(): number + { + return this._petId; + } +} diff --git a/packages/communication/src/messages/parser/inventory/pets/index.ts b/packages/communication/src/messages/parser/inventory/pets/index.ts new file mode 100644 index 0000000..a69532a --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/pets/index.ts @@ -0,0 +1,11 @@ +export * from './ConfirmBreedingRequestParser'; +export * from './ConfirmBreedingResultParser'; +export * from './GoToBreedingNestFailureParser'; +export * from './NestBreedingSuccessParser'; +export * from './PetAddedToInventoryParser'; +export * from './PetBreedingMessageParser'; +export * from './PetData'; +export * from './PetFigureDataParser'; +export * from './PetInventoryParser'; +export * from './PetReceivedMessageParser'; +export * from './PetRemovedFromInventoryParser'; diff --git a/packages/communication/src/messages/parser/inventory/purse/UserCreditsMessageParser.ts b/packages/communication/src/messages/parser/inventory/purse/UserCreditsMessageParser.ts new file mode 100644 index 0000000..bfb427f --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/purse/UserCreditsMessageParser.ts @@ -0,0 +1,25 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class UserCreditsMessageParser implements IMessageParser +{ + private _balance: number; + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._balance = parseFloat(wrapper.readString()); + + return true; + } + + public flush(): boolean + { + return true; + } + + public get balance(): number + { + return this._balance; + } +} diff --git a/packages/communication/src/messages/parser/inventory/purse/index.ts b/packages/communication/src/messages/parser/inventory/purse/index.ts new file mode 100644 index 0000000..720991a --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/purse/index.ts @@ -0,0 +1 @@ +export * from './UserCreditsMessageParser'; diff --git a/packages/communication/src/messages/parser/inventory/trading/ItemDataStructure.ts b/packages/communication/src/messages/parser/inventory/trading/ItemDataStructure.ts new file mode 100644 index 0000000..11914d4 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/trading/ItemDataStructure.ts @@ -0,0 +1,162 @@ +import { IMessageDataWrapper, IObjectData } from '@nitrots/api'; +import { GetTickerTime } from '@nitrots/utils'; +import { FurnitureDataParser } from '../../room'; +import { IFurnitureItemData } from '../furniture'; + +export class ItemDataStructure implements IFurnitureItemData +{ + private _expirationTimeStamp: number; + private _isWallItem: boolean; + private _itemId: number; + private _furniType: string; + private _ref: number; + private _spriteId: number; + private _category: number; + private _stuffData: IObjectData; + private _extra: number; + private _secondsToExpiration: number; + private _creationDay: number; + private _creationMonth: number; + private _creationYear: number; + private _isGroupable: boolean; + private _songId: number; + private _flatId: number; + private _rentable: boolean; + private _hasRentPeriodStarted: boolean; + + constructor(wrapper: IMessageDataWrapper) + { + this._itemId = wrapper.readInt(); + this._furniType = wrapper.readString().toUpperCase(); + this._ref = wrapper.readInt(); + this._spriteId = wrapper.readInt(); + this._category = wrapper.readInt(); + this._isGroupable = wrapper.readBoolean(); + this._stuffData = FurnitureDataParser.parseObjectData(wrapper); + this._secondsToExpiration = -1; + this._expirationTimeStamp = GetTickerTime(); + this._hasRentPeriodStarted = false; + this._creationDay = wrapper.readInt(); + this._creationMonth = wrapper.readInt(); + this._creationYear = wrapper.readInt(); + this._extra = ((this.furniType === 'S') ? wrapper.readInt() : -1); + this._flatId = -1; + this._rentable = false; + this._isWallItem = (this._furniType === 'I'); + } + + public get itemId(): number + { + return this._itemId; + } + + public get furniType(): string + { + return this._furniType; + } + + public get ref(): number + { + return this._ref; + } + + public get spriteId(): number + { + return this._spriteId; + } + + public get category(): number + { + return this._category; + } + + public get stuffData(): IObjectData + { + return this._stuffData; + } + + public get extra(): number + { + return this._extra; + } + + public get secondsToExpiration(): number + { + return this._secondsToExpiration; + } + + public get creationDay(): number + { + return this._creationDay; + } + + public get creationMonth(): number + { + return this._creationMonth; + } + + public get creationYear(): number + { + return this._creationYear; + } + + public get isGroupable(): boolean + { + return this._isGroupable; + } + + public get songId(): number + { + return this._extra; + } + + public get flatId(): number + { + return this._flatId; + } + + public get rentable(): boolean + { + return this._rentable; + } + + public get isWallItem(): boolean + { + return this._isWallItem; + } + + public get hasRentPeriodStarted(): boolean + { + return this._hasRentPeriodStarted; + } + + public get expirationTimeStamp(): number + { + return this._expirationTimeStamp; + } + + public get isRecycleable(): boolean + { + return true; + } + + public get tradable(): boolean + { + return true; + } + + public get sellable(): boolean + { + return true; + } + + public get slotId(): string + { + return null; + } + + public get isExternalImageFurni(): boolean + { + return (this._furniType.indexOf('external_image') !== -1); + } +} diff --git a/packages/communication/src/messages/parser/inventory/trading/TradingAcceptParser.ts b/packages/communication/src/messages/parser/inventory/trading/TradingAcceptParser.ts new file mode 100644 index 0000000..8106aac --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/trading/TradingAcceptParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class TradingAcceptParser implements IMessageParser +{ + private _userID: number; + private _userAccepts: boolean; + + public flush(): boolean + { + this._userID = -1; + this._userAccepts = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._userID = wrapper.readInt(); + this._userAccepts = (wrapper.readInt() > 0); + + return true; + } + + public get userID(): number + { + return this._userID; + } + + public get userAccepts(): boolean + { + return this._userAccepts; + } +} diff --git a/packages/communication/src/messages/parser/inventory/trading/TradingCloseParser.ts b/packages/communication/src/messages/parser/inventory/trading/TradingCloseParser.ts new file mode 100644 index 0000000..6dbbec2 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/trading/TradingCloseParser.ts @@ -0,0 +1,34 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class TradingCloseParser implements IMessageParser +{ + public static ERROR_WHILE_COMMIT: number = 1; + + private _userId: number; + private _reason: number; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._userId = wrapper.readInt(); + this._reason = wrapper.readInt(); + + return true; + } + + public get userID(): number + { + return this._userId; + } + + public get reason(): number + { + return this._reason; + } +} diff --git a/packages/communication/src/messages/parser/inventory/trading/TradingCompletedParser.ts b/packages/communication/src/messages/parser/inventory/trading/TradingCompletedParser.ts new file mode 100644 index 0000000..895d3d4 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/trading/TradingCompletedParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class TradingCompletedParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/inventory/trading/TradingConfirmationParser.ts b/packages/communication/src/messages/parser/inventory/trading/TradingConfirmationParser.ts new file mode 100644 index 0000000..1047452 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/trading/TradingConfirmationParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class TradingConfirmationParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/inventory/trading/TradingListItemParser.ts b/packages/communication/src/messages/parser/inventory/trading/TradingListItemParser.ts new file mode 100644 index 0000000..f4f6fe3 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/trading/TradingListItemParser.ts @@ -0,0 +1,105 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { ItemDataStructure } from './ItemDataStructure'; + +export class TradingListItemParser implements IMessageParser +{ + private _firstUserID: number; + private _firstUserItemArray: ItemDataStructure[]; + private _firstUserNumItems: number; + private _firstUserNumCredits: number; + private _secondUserID: number; + private _secondUserItemArray: ItemDataStructure[]; + private _secondUserNumItems: number; + private _secondUserNumCredits: number; + + public flush(): boolean + { + this._firstUserID = -1; + this._firstUserItemArray = null; + this._firstUserNumItems = 0; + this._firstUserNumCredits = 0; + this._secondUserID = -1; + this._secondUserItemArray = null; + this._secondUserNumItems = 0; + this._secondUserNumCredits = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._firstUserID = wrapper.readInt(); + this._firstUserItemArray = []; + + if(!this.parseItems(wrapper, this._firstUserItemArray)) return false; + + this._firstUserNumItems = wrapper.readInt(); + this._firstUserNumCredits = wrapper.readInt(); + + this._secondUserID = wrapper.readInt(); + this._secondUserItemArray = []; + + if(!this.parseItems(wrapper, this._secondUserItemArray)) return false; + + this._secondUserNumItems = wrapper.readInt(); + this._secondUserNumCredits = wrapper.readInt(); + + return true; + } + + private parseItems(k: IMessageDataWrapper, itemArray: ItemDataStructure[]): boolean + { + let count = k.readInt(); + + while(count > 0) + { + itemArray.push(new ItemDataStructure(k)); + + count--; + } + + return true; + } + + public get firstUserID(): number + { + return this._firstUserID; + } + + public get firstUserItemArray(): ItemDataStructure[] + { + return this._firstUserItemArray; + } + + public get firstUserNumItems(): number + { + return this._firstUserNumItems; + } + + public get firstUserNumCredits(): number + { + return this._firstUserNumCredits; + } + + public get secondUserID(): number + { + return this._secondUserID; + } + + public get secondUserItemArray(): ItemDataStructure[] + { + return this._secondUserItemArray; + } + + public get secondUserNumItems(): number + { + return this._secondUserNumItems; + } + + public get secondUserNumCredits(): number + { + return this._secondUserNumCredits; + } +} diff --git a/packages/communication/src/messages/parser/inventory/trading/TradingNoSuchItemParser.ts b/packages/communication/src/messages/parser/inventory/trading/TradingNoSuchItemParser.ts new file mode 100644 index 0000000..b767fd1 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/trading/TradingNoSuchItemParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class TradingNoSuchItemParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/inventory/trading/TradingNotOpenParser.ts b/packages/communication/src/messages/parser/inventory/trading/TradingNotOpenParser.ts new file mode 100644 index 0000000..5818c27 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/trading/TradingNotOpenParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class TradingNotOpenParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/inventory/trading/TradingOpenFailedParser.ts b/packages/communication/src/messages/parser/inventory/trading/TradingOpenFailedParser.ts new file mode 100644 index 0000000..7d1bd5a --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/trading/TradingOpenFailedParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class TradingOpenFailedParser implements IMessageParser +{ + public static REASON_YOU_ARE_ALREADY_TRADING: number = 7; + public static REASON_OTHER_USER_ALREADY_TRADING: number = 8; + + private _reason: number; + private _otherUserName: string; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._reason = wrapper.readInt(); + this._otherUserName = wrapper.readString(); + + return true; + } + + public get reason(): number + { + return this._reason; + } + + public get otherUserName(): string + { + return this._otherUserName; + } +} diff --git a/packages/communication/src/messages/parser/inventory/trading/TradingOpenParser.ts b/packages/communication/src/messages/parser/inventory/trading/TradingOpenParser.ts new file mode 100644 index 0000000..f8b3c98 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/trading/TradingOpenParser.ts @@ -0,0 +1,51 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class TradingOpenParser implements IMessageParser +{ + private _userId: number; + private _userCanTrade: boolean; + private _otherUserId: number; + private _otherUserCanTrade: boolean; + + public flush(): boolean + { + this._userId = -1; + this._userCanTrade = false; + this._otherUserId = -1; + this._otherUserCanTrade = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._userId = wrapper.readInt(); + this._userCanTrade = (wrapper.readInt() === 1); + this._otherUserId = wrapper.readInt(); + this._otherUserCanTrade = (wrapper.readInt() === 1); + + return true; + } + + public get userID(): number + { + return this._userId; + } + + public get userCanTrade(): boolean + { + return this._userCanTrade; + } + + public get otherUserID(): number + { + return this._otherUserId; + } + + public get otherUserCanTrade(): boolean + { + return this._otherUserCanTrade; + } +} diff --git a/packages/communication/src/messages/parser/inventory/trading/TradingOtherNotAllowedParser.ts b/packages/communication/src/messages/parser/inventory/trading/TradingOtherNotAllowedParser.ts new file mode 100644 index 0000000..7f4de33 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/trading/TradingOtherNotAllowedParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class TradingOtherNotAllowedParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/inventory/trading/TradingYouAreNotAllowedParser.ts b/packages/communication/src/messages/parser/inventory/trading/TradingYouAreNotAllowedParser.ts new file mode 100644 index 0000000..f5570fa --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/trading/TradingYouAreNotAllowedParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class TradingYouAreNotAllowedParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/inventory/trading/index.ts b/packages/communication/src/messages/parser/inventory/trading/index.ts new file mode 100644 index 0000000..cc51bb9 --- /dev/null +++ b/packages/communication/src/messages/parser/inventory/trading/index.ts @@ -0,0 +1,12 @@ +export * from './ItemDataStructure'; +export * from './TradingAcceptParser'; +export * from './TradingCloseParser'; +export * from './TradingCompletedParser'; +export * from './TradingConfirmationParser'; +export * from './TradingListItemParser'; +export * from './TradingNoSuchItemParser'; +export * from './TradingNotOpenParser'; +export * from './TradingOpenFailedParser'; +export * from './TradingOpenParser'; +export * from './TradingOtherNotAllowedParser'; +export * from './TradingYouAreNotAllowedParser'; diff --git a/packages/communication/src/messages/parser/landingview/PromoArticleData.ts b/packages/communication/src/messages/parser/landingview/PromoArticleData.ts new file mode 100644 index 0000000..f698071 --- /dev/null +++ b/packages/communication/src/messages/parser/landingview/PromoArticleData.ts @@ -0,0 +1,62 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class PromoArticleData +{ + public static readonly LINK_TYPE_URL = 0; + public static readonly LINK_TYPE_INTERNAL = 1; + public static readonly LINK_TYPE_NO_LINK = 2; + + private _id: number; + private _title: string; + private _bodyText: string; + private _buttonText: string; + private _linkType: number; + private _linkContent: string; + private _imageUrl: string; + + constructor(k: IMessageDataWrapper) + { + this._id = k.readInt(); + this._title = k.readString(); + this._bodyText = k.readString(); + this._buttonText = k.readString(); + this._linkType = k.readInt(); + this._linkContent = k.readString(); + this._imageUrl = k.readString(); + } + + public get id(): number + { + return this._id; + } + + public get title(): string + { + return this._title; + } + + public get bodyText(): string + { + return this._bodyText; + } + + public get buttonText(): string + { + return this._buttonText; + } + + public get linkType(): number + { + return this._linkType; + } + + public get linkContent(): string + { + return this._linkContent; + } + + public get imageUrl(): string + { + return this._imageUrl; + } +} diff --git a/packages/communication/src/messages/parser/landingview/PromoArticlesMessageParser.ts b/packages/communication/src/messages/parser/landingview/PromoArticlesMessageParser.ts new file mode 100644 index 0000000..42b78c6 --- /dev/null +++ b/packages/communication/src/messages/parser/landingview/PromoArticlesMessageParser.ts @@ -0,0 +1,32 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { PromoArticleData } from './PromoArticleData'; + +export class PromoArticlesMessageParser implements IMessageParser +{ + private _articles: PromoArticleData[]; + + public flush(): boolean + { + this._articles = []; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + const count = wrapper.readInt(); + + for(let i = 0; i < count; i++) + { + this._articles.push(new PromoArticleData(wrapper)); + } + + return true; + } + + public get articles(): PromoArticleData[] + { + return this._articles; + } +} diff --git a/packages/communication/src/messages/parser/landingview/index.ts b/packages/communication/src/messages/parser/landingview/index.ts new file mode 100644 index 0000000..2d3eae4 --- /dev/null +++ b/packages/communication/src/messages/parser/landingview/index.ts @@ -0,0 +1,3 @@ +export * from './PromoArticleData'; +export * from './PromoArticlesMessageParser'; +export * from './votes'; diff --git a/packages/communication/src/messages/parser/landingview/votes/CommunityVoteReceivedParser.ts b/packages/communication/src/messages/parser/landingview/votes/CommunityVoteReceivedParser.ts new file mode 100644 index 0000000..1cc5a4a --- /dev/null +++ b/packages/communication/src/messages/parser/landingview/votes/CommunityVoteReceivedParser.ts @@ -0,0 +1,23 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CommunityVoteReceivedParser implements IMessageParser +{ + private _acknowledged: boolean; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + this._acknowledged = wrapper.readBoolean(); + return true; + } + + public get acknowledged(): boolean + { + return this._acknowledged; + } +} diff --git a/packages/communication/src/messages/parser/landingview/votes/index.ts b/packages/communication/src/messages/parser/landingview/votes/index.ts new file mode 100644 index 0000000..4a0e00f --- /dev/null +++ b/packages/communication/src/messages/parser/landingview/votes/index.ts @@ -0,0 +1 @@ +export * from './CommunityVoteReceivedParser'; diff --git a/packages/communication/src/messages/parser/marketplace/MarketplaceBuyOfferResultParser.ts b/packages/communication/src/messages/parser/marketplace/MarketplaceBuyOfferResultParser.ts new file mode 100644 index 0000000..c45c58f --- /dev/null +++ b/packages/communication/src/messages/parser/marketplace/MarketplaceBuyOfferResultParser.ts @@ -0,0 +1,50 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class MarketplaceBuyOfferResultParser implements IMessageParser +{ + private _result: number; + private _newOfferId: number; + private _newPrice: number; + private _requestedOfferId: number; + + public flush(): boolean + { + this._newOfferId = -1; + this._newPrice = 0; + this._requestedOfferId = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._result = wrapper.readInt(); + this._newOfferId = wrapper.readInt(); + this._newPrice = wrapper.readInt(); + this._requestedOfferId = wrapper.readInt(); + + return true; + } + + public get result(): number + { + return this._result; + } + + public get offerId(): number + { + return this._newOfferId; + } + + public get newPrice(): number + { + return this._newPrice; + } + + public get requestedOfferId(): number + { + return this._requestedOfferId; + } +} diff --git a/packages/communication/src/messages/parser/marketplace/MarketplaceCanMakeOfferResultParser.ts b/packages/communication/src/messages/parser/marketplace/MarketplaceCanMakeOfferResultParser.ts new file mode 100644 index 0000000..233a357 --- /dev/null +++ b/packages/communication/src/messages/parser/marketplace/MarketplaceCanMakeOfferResultParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class MarketplaceCanMakeOfferResultParser implements IMessageParser +{ + private _tokenCount: number; + private _result: number; + + public flush(): boolean + { + this._tokenCount = 0; + this._result = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._result = wrapper.readInt(); + this._tokenCount = wrapper.readInt(); + + return true; + } + + public get tokenCount(): number + { + return this._tokenCount; + } + + public get resultCode(): number + { + return this._result; + } +} diff --git a/packages/communication/src/messages/parser/marketplace/MarketplaceCancelOfferResultParser.ts b/packages/communication/src/messages/parser/marketplace/MarketplaceCancelOfferResultParser.ts new file mode 100644 index 0000000..1583b2c --- /dev/null +++ b/packages/communication/src/messages/parser/marketplace/MarketplaceCancelOfferResultParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class MarketplaceCancelOfferResultParser implements IMessageParser +{ + private _offerId: number; + private _success: boolean; + + public flush(): boolean + { + this._offerId = 0; + this._success = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._offerId = wrapper.readInt(); + this._success = wrapper.readBoolean(); + + return true; + } + + public get offerId(): number + { + return this._offerId; + } + + public get success(): boolean + { + return this._success; + } +} diff --git a/packages/communication/src/messages/parser/marketplace/MarketplaceConfigurationMessageParser.ts b/packages/communication/src/messages/parser/marketplace/MarketplaceConfigurationMessageParser.ts new file mode 100644 index 0000000..5185954 --- /dev/null +++ b/packages/communication/src/messages/parser/marketplace/MarketplaceConfigurationMessageParser.ts @@ -0,0 +1,83 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class MarketplaceConfigurationMessageParser implements IMessageParser +{ + private _enabled: boolean; + private _commission: number; + private _credits: number; + private _advertisements: number; + private _maximumPrice: number; + private _minimumPrice: number; + private _offerTime: number; + private _displayTime: number; + + public flush(): boolean + { + this._enabled = false; + this._commission = 0; + this._credits = 0; + this._advertisements = 0; + this._maximumPrice = 0; + this._minimumPrice = 0; + this._offerTime = 0; + this._displayTime = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._enabled = wrapper.readBoolean(); + this._commission = wrapper.readInt(); + this._credits = wrapper.readInt(); + this._advertisements = wrapper.readInt(); + this._minimumPrice = wrapper.readInt(); + this._maximumPrice = wrapper.readInt(); + this._offerTime = wrapper.readInt(); + this._displayTime = wrapper.readInt(); + + return true; + } + + public get enabled(): boolean + { + return this._enabled; + } + + public get commission(): number + { + return this._commission; + } + + public get credits(): number + { + return this._credits; + } + + public get advertisements(): number + { + return this._advertisements; + } + + public get minimumPrice(): number + { + return this._minimumPrice; + } + + public get maximumPrice(): number + { + return this._maximumPrice; + } + + public get offerTime(): number + { + return this._offerTime; + } + + public get displayTime(): number + { + return this._displayTime; + } +} diff --git a/packages/communication/src/messages/parser/marketplace/MarketplaceItemPostedParser.ts b/packages/communication/src/messages/parser/marketplace/MarketplaceItemPostedParser.ts new file mode 100644 index 0000000..dbcc81c --- /dev/null +++ b/packages/communication/src/messages/parser/marketplace/MarketplaceItemPostedParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class MarketplaceMakeOfferResultParser implements IMessageParser +{ + private _result: number; + + public flush(): boolean + { + this._result = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._result = wrapper.readInt(); + + return true; + } + + public get result(): number + { + return this._result; + } +} diff --git a/packages/communication/src/messages/parser/marketplace/MarketplaceItemStatsParser.ts b/packages/communication/src/messages/parser/marketplace/MarketplaceItemStatsParser.ts new file mode 100644 index 0000000..1f96880 --- /dev/null +++ b/packages/communication/src/messages/parser/marketplace/MarketplaceItemStatsParser.ts @@ -0,0 +1,92 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class MarketplaceItemStatsParser implements IMessageParser +{ + private _averagePrice: number; + private _currentOfferCount: number; + private _historyLength: number; + private _dayOffsets: number[]; + private _averagePrices: number[]; + private _soldAmounts: number[]; + private _furniTypeId: number; + private _furniCategoryId: number; + + public flush(): boolean + { + this._averagePrice = 0; + this._currentOfferCount = 0; + this._historyLength = 0; + this._dayOffsets = []; + this._averagePrices = []; + this._soldAmounts = []; + this._furniTypeId = 0; + this._furniCategoryId = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._averagePrice = wrapper.readInt(); + this._currentOfferCount = wrapper.readInt(); + this._historyLength = wrapper.readInt(); + + let count = wrapper.readInt(); + + while(count > 0) + { + this._dayOffsets.push(wrapper.readInt()); + this._averagePrices.push(wrapper.readInt()); + this._soldAmounts.push(wrapper.readInt()); + + count--; + } + + this._furniCategoryId = wrapper.readInt(); + this._furniTypeId = wrapper.readInt(); + + return true; + } + + public get averagePrice(): number + { + return this._averagePrice; + } + + public get offerCount(): number + { + return this._currentOfferCount; + } + + public get historyLength(): number + { + return this._historyLength; + } + + public get dayOffsets(): number[] + { + return this._dayOffsets; + } + + public get averagePrices(): number[] + { + return this._averagePrices; + } + + public get soldAmounts(): number[] + { + return this._soldAmounts; + } + + public get furniTypeId(): number + { + return this._furniTypeId; + } + + public get furniCategoryId(): number + { + return this._furniCategoryId; + } +} diff --git a/packages/communication/src/messages/parser/marketplace/MarketplaceOffer.ts b/packages/communication/src/messages/parser/marketplace/MarketplaceOffer.ts new file mode 100644 index 0000000..fe2cd2a --- /dev/null +++ b/packages/communication/src/messages/parser/marketplace/MarketplaceOffer.ts @@ -0,0 +1,84 @@ +import { IObjectData } from '@nitrots/api'; + +export class MarketplaceOffer +{ + private readonly _offerId: number; + private readonly _furniId: number; + private readonly _furniType: number; + private readonly _extraData: string; + private readonly _stuffData: IObjectData; + private readonly _price: number; + private readonly _status: number; + private readonly _timeLeftMinutes: number = -1; + private readonly _averagePrice: number; + private readonly _offerCount: number; + + constructor(offerId: number, furniId: number, furniType: number, extraData: string, stuffData: IObjectData, price: number, status: number, timeLeftMinutes: number, averagePrice: number, offerCount: number = -1) + { + this._offerId = offerId; + this._furniId = furniId; + this._furniType = furniType; + this._extraData = extraData; + this._stuffData = stuffData; + this._price = price; + this._status = status; + this._timeLeftMinutes = timeLeftMinutes; + this._averagePrice = averagePrice; + this._offerCount = offerCount; + } + + public get offerId(): number + { + return this._offerId; + } + + public get furniId(): number + { + return this._furniId; + } + + public get furniType(): number + { + return this._furniType; + } + + public get extraData(): string + { + return this._extraData; + } + + public get stuffData(): IObjectData + { + return this._stuffData; + } + + public get price(): number + { + return this._price; + } + + public get status(): number + { + return this._status; + } + + public get timeLeftMinutes(): number + { + return this._timeLeftMinutes; + } + + public get averagePrice(): number + { + return this._averagePrice; + } + + public get offerCount(): number + { + return this._offerCount; + } + + public get isUniqueLimitedItem(): boolean + { + return (!(this.stuffData == null)) && (this.stuffData.uniqueSeries > 0); + } +} diff --git a/src/api/catalog/MarketplaceOfferData.ts b/packages/communication/src/messages/parser/marketplace/MarketplaceOfferData.ts similarity index 94% rename from src/api/catalog/MarketplaceOfferData.ts rename to packages/communication/src/messages/parser/marketplace/MarketplaceOfferData.ts index ba1fa88..3fb4b32 100644 --- a/src/api/catalog/MarketplaceOfferData.ts +++ b/packages/communication/src/messages/parser/marketplace/MarketplaceOfferData.ts @@ -1,9 +1,9 @@ -import { IObjectData } from '@nitrots/nitro-renderer'; +import { IObjectData } from '@nitrots/api'; export class MarketplaceOfferData { - public static readonly TYPE_FLOOR: number = 1; - public static readonly TYPE_WALL: number = 2; + public static TYPE_LANDSCAPE: number = 1; + public static TYPE_FLOOR: number = 2; private _offerId: number; private _furniId: number; diff --git a/packages/communication/src/messages/parser/marketplace/MarketplaceOffersParser.ts b/packages/communication/src/messages/parser/marketplace/MarketplaceOffersParser.ts new file mode 100644 index 0000000..4053b4a --- /dev/null +++ b/packages/communication/src/messages/parser/marketplace/MarketplaceOffersParser.ts @@ -0,0 +1,89 @@ +import { IMessageDataWrapper, IMessageParser, IObjectData, LegacyDataType, ObjectDataFactory } from '@nitrots/api'; +import { FurnitureDataParser } from '../room'; +import { MarketplaceOffer } from './MarketplaceOffer'; + +export class MarketplaceOffersParser implements IMessageParser +{ + private static FURNITYPE_STUFF: number = 1; + private static FURNITYPE_WALL: number = 2; + private static FAKE_FURNITYPE_UNIQUE: number = 3; + + private readonly MAX_LIST_LENGTH = 500; + + private _offers: MarketplaceOffer[]; + private _totalItemsFound: number; + + public flush(): boolean + { + this._offers = []; + this._totalItemsFound = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + const count = wrapper.readInt(); + + let i = 0; + + while(i < count) + { + const offerId = wrapper.readInt(); + const status = wrapper.readInt(); + let furniType = wrapper.readInt(); + + let furniId = -1; + let extraData = ''; + let stuffData: IObjectData = null; + + if(furniType === MarketplaceOffersParser.FURNITYPE_STUFF) + { + furniId = wrapper.readInt(); + stuffData = FurnitureDataParser.parseObjectData(wrapper); + } + + else if(furniType === MarketplaceOffersParser.FURNITYPE_WALL) + { + furniId = wrapper.readInt(); + extraData = wrapper.readString(); + } + + else if(furniType == MarketplaceOffersParser.FAKE_FURNITYPE_UNIQUE) + { + furniId = wrapper.readInt(); + stuffData = ObjectDataFactory.getData(LegacyDataType.FORMAT_KEY); + stuffData.uniqueNumber = wrapper.readInt(); + stuffData.uniqueSeries = wrapper.readInt(); + furniType = MarketplaceOffersParser.FURNITYPE_STUFF; + } + + const price = wrapper.readInt(); + const timeLeftMinutes = wrapper.readInt(); + const averagePrice = wrapper.readInt(); + const offerCount = wrapper.readInt(); + + const offerItem = new MarketplaceOffer(offerId, furniId, furniType, extraData, stuffData, price, status, timeLeftMinutes, averagePrice, offerCount); + + if(i < this.MAX_LIST_LENGTH) this._offers.push(offerItem); + + i++; + } + + this._totalItemsFound = wrapper.readInt(); + + return true; + } + + public get offers(): MarketplaceOffer[] + { + return this._offers; + } + + public get totalItemsFound(): number + { + return this._totalItemsFound; + } +} diff --git a/packages/communication/src/messages/parser/marketplace/MarketplaceOwnOffersParser.ts b/packages/communication/src/messages/parser/marketplace/MarketplaceOwnOffersParser.ts new file mode 100644 index 0000000..d06d51b --- /dev/null +++ b/packages/communication/src/messages/parser/marketplace/MarketplaceOwnOffersParser.ts @@ -0,0 +1,88 @@ +import { IMessageDataWrapper, IMessageParser, IObjectData, LegacyDataType, ObjectDataFactory } from '@nitrots/api'; +import { MarketplaceOffer } from './MarketplaceOffer'; + +export class MarketplaceOwnOffersParser implements IMessageParser +{ + private static MAX_LIST_LENGTH = 500; + private _offers: MarketplaceOffer[]; + private _creditsWaiting: number; + + + public flush(): boolean + { + this._offers = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._offers = []; + this._creditsWaiting = wrapper.readInt(); // SoldPriceTotal + + const offerCount = wrapper.readInt(); + for(let i = 0; i < offerCount; i++) + { + const offerId = wrapper.readInt(); + const status = wrapper.readInt(); + let furniType = wrapper.readInt(); + + let furniId; + let extraData; + let stuffData: IObjectData; + if(furniType == 1) + { + furniId = wrapper.readInt(); + stuffData = this.getStuffData(wrapper); + } + else + { + if(furniType == 2) + { + furniId = wrapper.readInt(); + extraData = wrapper.readString(); + } + else if(furniType == 3) + { + furniId = wrapper.readInt(); + stuffData = ObjectDataFactory.getData(LegacyDataType.FORMAT_KEY); + stuffData.uniqueNumber = wrapper.readInt(); + stuffData.uniqueSeries = wrapper.readInt(); + furniType = 1; + } + } + + const price = wrapper.readInt(); + const local9 = wrapper.readInt(); + const local10 = wrapper.readInt(); + const local13 = new MarketplaceOffer(offerId, furniId, furniType, extraData, stuffData, price, status, local9, local10); + + if(i < MarketplaceOwnOffersParser.MAX_LIST_LENGTH) + { + this._offers.push(local13); + } + } + + return true; + } + + public get offers(): MarketplaceOffer[] + { + return this._offers; + } + + public get creditsWaiting(): number + { + return this._creditsWaiting; + } + + private getStuffData(wrapper: IMessageDataWrapper): IObjectData + { + const local2 = wrapper.readInt(); + const local3 = ObjectDataFactory.getData(local2); + local3.parseWrapper(wrapper); + return local3; + } +} diff --git a/packages/communication/src/messages/parser/marketplace/index.ts b/packages/communication/src/messages/parser/marketplace/index.ts new file mode 100644 index 0000000..3b77f7e --- /dev/null +++ b/packages/communication/src/messages/parser/marketplace/index.ts @@ -0,0 +1,10 @@ +export * from './MarketplaceBuyOfferResultParser'; +export * from './MarketplaceCancelOfferResultParser'; +export * from './MarketplaceCanMakeOfferResultParser'; +export * from './MarketplaceConfigurationMessageParser'; +export * from './MarketplaceItemPostedParser'; +export * from './MarketplaceItemStatsParser'; +export * from './MarketplaceOffer'; +export * from './MarketplaceOfferData'; +export * from './MarketplaceOffersParser'; +export * from './MarketplaceOwnOffersParser'; diff --git a/packages/communication/src/messages/parser/moderation/CfhChatlogData.ts b/packages/communication/src/messages/parser/moderation/CfhChatlogData.ts new file mode 100644 index 0000000..5245393 --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/CfhChatlogData.ts @@ -0,0 +1,45 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { ChatRecordData } from './ChatRecordData'; + +export class CfhChatlogData +{ + private _issueId: number; + private _callerUserId: number; + private _reportedUserId: number; + private _chatRecordId: number; + private _chatRecord: ChatRecordData; + + constructor(k: IMessageDataWrapper) + { + this._issueId = k.readInt(); + this._callerUserId = k.readInt(); + this._reportedUserId = k.readInt(); + this._chatRecordId = k.readInt(); + this._chatRecord = new ChatRecordData(k); + } + + public get issueId(): number + { + return this._issueId; + } + + public get callerUserId(): number + { + return this._callerUserId; + } + + public get reportedUserId(): number + { + return this._reportedUserId; + } + + public get chatRecordId(): number + { + return this._chatRecordId; + } + + public get chatRecord(): ChatRecordData + { + return this._chatRecord; + } +} diff --git a/packages/communication/src/messages/parser/moderation/CfhChatlogMessageParser.ts b/packages/communication/src/messages/parser/moderation/CfhChatlogMessageParser.ts new file mode 100644 index 0000000..7774166 --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/CfhChatlogMessageParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { CfhChatlogData } from './CfhChatlogData'; + +export class CfhChatlogMessageParser implements IMessageParser +{ + private _data: CfhChatlogData; + + public flush(): boolean + { + this._data = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._data = new CfhChatlogData(wrapper); + + return true; + } + + public get data(): CfhChatlogData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/moderation/ChatRecordData.ts b/packages/communication/src/messages/parser/moderation/ChatRecordData.ts new file mode 100644 index 0000000..d49cbf8 --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/ChatRecordData.ts @@ -0,0 +1,110 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { ChatlineData } from './ChatlineData'; + +export class ChatRecordData +{ + public static readonly TYPE_SIMPLE = 0; + public static readonly TYPE_ROOM_CHAT = 1; + public static readonly TYPE_IM_SESSION = 2; + public static readonly TYPE_DISCUSSION_THREAD = 3; + public static readonly TYPE_DISCUSSION_MESSAGE = 4; + public static readonly TYPE_SELFIE = 5; + public static readonly TYPE_PHOTO = 6; + + private _recordType: number; + private _context: Map; + private _chatlog: ChatlineData[]; + + constructor(wrapper: IMessageDataWrapper) + { + this._context = new Map(); + this._chatlog = []; + + this._recordType = wrapper.readByte(); + const contextCount = wrapper.readShort(); + + for(let i = 0; i < contextCount; i++) + { + const key = wrapper.readString(); + const type = wrapper.readByte(); + + switch(type) + { + case 0: + this._context.set(key, wrapper.readBoolean()); + break; + case 1: + this._context.set(key, wrapper.readInt()); + break; + case 2: + this._context.set(key, wrapper.readString()); + break; + default: + throw new Error('Unknown data type ' + type); + } + } + + const chatCount = wrapper.readShort(); + + for(let i = 0; i < chatCount; i++) + { + const timestamp = wrapper.readString(); + const habboId = wrapper.readInt(); + const username = wrapper.readString(); + const message = wrapper.readString(); + const hasHighlighting = wrapper.readBoolean(); + + this._chatlog.push(new ChatlineData(timestamp, habboId, username, message, hasHighlighting)); + } + } + + public get recordType(): number + { + return this._recordType; + } + + public get context(): Map + { + return this._context; + } + + public get chatlog(): ChatlineData[] + { + return this._chatlog; + } + + public get roomId(): number + { + return this.getInt('roomId'); + } + + public get roomName(): string + { + return this._context.get('roomName') as string; + } + + public get groupId(): number + { + return this.getInt('groupId'); + } + + public get threadId(): number + { + return this.getInt('threadId'); + } + + public get messageId(): number + { + return this.getInt('messageId'); + } + + private getInt(k: string): number + { + const value = this._context.get(k); + if(!value) + { + return 0; + } + return value as number; + } +} diff --git a/packages/communication/src/messages/parser/moderation/ChatlineData.ts b/packages/communication/src/messages/parser/moderation/ChatlineData.ts new file mode 100644 index 0000000..32432b7 --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/ChatlineData.ts @@ -0,0 +1,42 @@ +export class ChatlineData +{ + private readonly _timestamp: string; + private readonly _habboId: number; + private readonly _username: string; + private readonly _message: string; + private readonly _hasHighlighting: boolean; + + constructor(timestamp: string, habboId: number, username: string, message: string, hasHighlighting: boolean) + { + this._timestamp = timestamp; + this._habboId = habboId; + this._username = username; + this._message = message; + this._hasHighlighting = hasHighlighting; + } + + public get timestamp(): string + { + return this._timestamp; + } + + public get userId(): number + { + return this._habboId; + } + + public get userName(): string + { + return this._username; + } + + public get message(): string + { + return this._message; + } + + public get hasHighlighting(): boolean + { + return this._hasHighlighting; + } +} diff --git a/packages/communication/src/messages/parser/moderation/INamed.ts b/packages/communication/src/messages/parser/moderation/INamed.ts new file mode 100644 index 0000000..3a74243 --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/INamed.ts @@ -0,0 +1,4 @@ +export interface INamed +{ + name: string; +} diff --git a/packages/communication/src/messages/parser/moderation/IssueDeletedMessageParser.ts b/packages/communication/src/messages/parser/moderation/IssueDeletedMessageParser.ts new file mode 100644 index 0000000..4b7dd9c --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/IssueDeletedMessageParser.ts @@ -0,0 +1,22 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class IssueDeletedMessageParser implements IMessageParser +{ + private _issueId: number; + + public flush(): boolean + { + return true; + } + + public parse(k: IMessageDataWrapper): boolean + { + this._issueId = parseInt(k.readString()); + return true; + } + + public get issueId(): number + { + return this._issueId; + } +} diff --git a/packages/communication/src/messages/parser/moderation/IssueInfoMessageParser.ts b/packages/communication/src/messages/parser/moderation/IssueInfoMessageParser.ts new file mode 100644 index 0000000..cd0d18e --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/IssueInfoMessageParser.ts @@ -0,0 +1,52 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { IssueMessageData } from './IssueMessageData'; +import { PatternMatchData } from './PatternMatchData'; + +export class IssueInfoMessageParser implements IMessageParser +{ + private _issueData: IssueMessageData; + + + public get issueData(): IssueMessageData + { + return this._issueData; + } + + public flush(): boolean + { + this._issueData = null; + return true; + } + + public parse(k: IMessageDataWrapper): boolean + { + const issueId: number = k.readInt(); + const state: number = k.readInt(); + const categoryId: number = k.readInt(); + const reportedCategoryId: number = k.readInt(); + const issueAgeInMs: number = k.readInt(); + const priority: number = k.readInt(); + const groupingId: number = k.readInt(); + const reporterUserId: number = k.readInt(); + const reporterUsername: string = k.readString(); + const reportedUserId: number = k.readInt(); + const reportedUsername: string = k.readString(); + const pickerUserId: number = k.readInt(); + const pickerUsername: string = k.readString(); + const message: string = k.readString(); + const chatRecordId: number = k.readInt(); + + const patternsCount: number = k.readInt(); + const patterns: PatternMatchData[] = []; + + for(let i = 0; i < patternsCount; i++) + { + patterns.push(new PatternMatchData(k)); + } + + this._issueData = new IssueMessageData(issueId, state, categoryId, reportedCategoryId, issueAgeInMs, + priority, groupingId, reporterUserId, reporterUsername, reportedUserId, reportedUsername, + pickerUserId, pickerUsername, message, chatRecordId, patterns); + return true; + } +} diff --git a/packages/communication/src/messages/parser/moderation/IssueMessageData.ts b/packages/communication/src/messages/parser/moderation/IssueMessageData.ts new file mode 100644 index 0000000..a0b945a --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/IssueMessageData.ts @@ -0,0 +1,162 @@ +import { PatternMatchData } from './PatternMatchData'; + +export class IssueMessageData +{ + public static STATE_OPEN: number = 1; + public static STATE_PICKED: number = 2; + public static STATE_CLOSED: number = 3; + + private _issueId: number; + private _state: number; + private _categoryId: number; + private _reportedCategoryId: number; + private _issueAgeInMilliseconds: number; + private _priority: number; + private _groupingId: number; + private _reporterUserId: number; + private _reporterUserName: string; + private _reportedUserId: number; + private _reportedUserName: string; + private _pickerUserId: number; + private _pickerUserName: string; + private _message: string; + private _chatRecordId: number; + private _patterns: PatternMatchData[]; + private _disposed: boolean = false; + private _creationTimeInMilliseconds: number; + + constructor(issueId: number, state: number, categoryId: number, reportedCategoryId: number, + issueAgeinMs: number, priority: number, groupingId: number, reporterUserId: number, reporterUsername: string, + reportedUserId: number, reportedUsername: string, pickerUserId: number, pickerUsername: string, message: string, + chatRecordId: number, patterns: PatternMatchData[]) + { + this._issueId = issueId; + this._state = state; + this._categoryId = categoryId; + this._reportedCategoryId = reportedCategoryId; + this._issueAgeInMilliseconds = issueAgeinMs; + this._priority = priority; + this._groupingId = groupingId; + this._reporterUserId = reporterUserId; + this._reporterUserName = reporterUsername; + this._reportedUserId = reportedUserId; + this._reportedUserName = reportedUsername; + this._pickerUserId = pickerUserId; + this._pickerUserName = pickerUsername; + this._message = message; + this._chatRecordId = chatRecordId; + this._patterns = patterns; + this._creationTimeInMilliseconds = 0; //0 + } + + public get issueId(): number + { + return this._issueId; + } + + public get state(): number + { + return this._state; + } + + public get categoryId(): number + { + return this._categoryId; + } + + public get reportedCategoryId(): number + { + return this._reportedCategoryId; + } + + public get issueAgeInMilliseconds(): number + { + return this._issueAgeInMilliseconds; + } + + public get priority(): number + { + return this._priority; + } + + public get groupingId(): number + { + return this._groupingId; + } + + public get reporterUserId(): number + { + return this._reporterUserId; + } + + public get reporterUserName(): string + { + return this._reporterUserName; + } + + public get reportedUserId(): number + { + return this._reportedUserId; + } + + public get reportedUserName(): string + { + return this._reportedUserName; + } + + public get pickerUserId(): number + { + return this._pickerUserId; + } + + public get pickerUserName(): string + { + return this._pickerUserName; + } + + public get message(): string + { + return this._message; + } + + public get chatRecordId(): number + { + return this._chatRecordId; + } + + public get patterns(): PatternMatchData[] + { + return this._patterns; + } + + public dispose(): void + { + + if(this.disposed) + { + return; + } + for(const k of this._patterns) + { + k.dispose(); + } + this._patterns = []; + this._disposed = true; + } + + public get disposed(): boolean + { + return this._disposed; + } + + public getOpenTime(k: number): string + { + const _local_2: number = (((this._issueAgeInMilliseconds + k) - this._creationTimeInMilliseconds) / 1000); + const _local_3: number = (_local_2 / 60); + const _local_4: number = (_local_3 % 60); + const _local_5: number = (_local_3 / 60); + const _local_6: string = (((_local_4 < 10) ? '0' : '') + _local_4); + const _local_7: string = (((_local_5 < 10) ? '0' : '') + _local_5); + return (_local_7 + ':') + _local_6; + } +} diff --git a/packages/communication/src/messages/parser/moderation/IssuePickFailedMessageParser.ts b/packages/communication/src/messages/parser/moderation/IssuePickFailedMessageParser.ts new file mode 100644 index 0000000..3032ae3 --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/IssuePickFailedMessageParser.ts @@ -0,0 +1,50 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { IssueMessageData } from './IssueMessageData'; + +export class IssuePickFailedMessageParser implements IMessageParser +{ + private _issues: IssueMessageData[]; + private _retryEnabled: boolean; + private _retryCount: number; + + public flush(): boolean + { + this._issues = null; + return true; + } + + public parse(k: IMessageDataWrapper): boolean + { + this._issues = []; + + const count = k.readInt(); + + for(let i = 0; i < count; i++) + { + const _local_4 = k.readInt(); + const _local_5 = k.readInt(); + const _local_6 = k.readString(); + const _local_7 = new IssueMessageData(_local_4, 0, 0, 0, 0, 0, 0, 0, null, 0, null, _local_5, _local_6, null, 0, []); + this._issues.push(_local_7); + } + + this._retryEnabled = k.readBoolean(); + this._retryCount = k.readInt(); + return true; + } + + public get issues(): IssueMessageData[] + { + return this._issues; + } + + public get retryEnabled(): boolean + { + return this._retryEnabled; + } + + public get retryCount(): number + { + return this._retryCount; + } +} diff --git a/packages/communication/src/messages/parser/moderation/ModRoomData.ts b/packages/communication/src/messages/parser/moderation/ModRoomData.ts new file mode 100644 index 0000000..4d84501 --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/ModRoomData.ts @@ -0,0 +1,64 @@ +import { IDisposable, IMessageDataWrapper } from '@nitrots/api'; + +export class ModRoomData implements IDisposable +{ + private _exists: boolean; + private _name: string; + private _desc: string; + private _tags: string[]; + private _disposed: boolean; + + constructor(k: IMessageDataWrapper) + { + this._tags = []; + this._exists = k.readBoolean(); + if(!this.exists) + { + return; + } + this._name = k.readString(); + this._desc = k.readString(); + + const tagCount = k.readInt(); + + for(let i = 0; i < tagCount; i++) + { + this._tags.push(k.readString()); + } + } + + public get name(): string + { + return this._name; + } + + public get desc(): string + { + return this._desc; + } + + public get tags(): string[] + { + return this._tags; + } + + public get exists(): boolean + { + return this._exists; + } + + public get disposed(): boolean + { + return this._disposed; + } + + public dispose(): void + { + if(this._disposed) + { + return; + } + this._disposed = true; + this._tags = null; + } +} diff --git a/packages/communication/src/messages/parser/moderation/ModerationCautionParser.ts b/packages/communication/src/messages/parser/moderation/ModerationCautionParser.ts new file mode 100644 index 0000000..d2b965d --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/ModerationCautionParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ModerationCautionParser implements IMessageParser +{ + private _message: string; + private _url: string; + + public flush(): boolean + { + this._message = ''; + this._url = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._message = wrapper.readString(); + this._url = wrapper.readString(); + + return true; + } + + public get message(): string + { + return this._message; + } + + public get url(): string + { + return this._url; + } +} diff --git a/packages/communication/src/messages/parser/moderation/ModeratorActionResultMessageParser.ts b/packages/communication/src/messages/parser/moderation/ModeratorActionResultMessageParser.ts new file mode 100644 index 0000000..0bf8523 --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/ModeratorActionResultMessageParser.ts @@ -0,0 +1,32 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ModeratorActionResultMessageParser implements IMessageParser +{ + private _userId: number; + private _success: boolean; + + public flush(): boolean + { + this._userId = -1; + this._success = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + this._userId = wrapper.readInt(); + this._success = wrapper.readBoolean(); + return true; + } + + public get userId(): number + { + return this._userId; + } + + public get success(): boolean + { + return this._success; + } +} diff --git a/packages/communication/src/messages/parser/moderation/ModeratorInitData.ts b/packages/communication/src/messages/parser/moderation/ModeratorInitData.ts new file mode 100644 index 0000000..b78935f --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/ModeratorInitData.ts @@ -0,0 +1,138 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { IssueInfoMessageParser } from './IssueInfoMessageParser'; +import { IssueMessageData } from './IssueMessageData'; + +export class ModeratorInitData +{ + private _messageTemplates: string[]; + private _roomMessageTemplates: string[]; + private _issues: IssueMessageData[]; + private _cfhPermission: boolean; + private _chatlogsPermission: boolean; + private _alertPermission: boolean; + private _kickPermission: boolean; + private _banPermission: boolean; + private _roomAlertPermission: boolean; + private _roomKickPermission: boolean; + + private _disposed: boolean = false; + + constructor(wrapper: IMessageDataWrapper) + { + const local2 = new IssueInfoMessageParser(); + this._issues = []; + this._messageTemplates = []; + this._roomMessageTemplates = []; + + let local3 = wrapper.readInt(); + let i = 0; + while(i < local3) + { + if(local2.parse(wrapper)) + { + this._issues.push(local2.issueData); + } + i++; + } + + local3 = wrapper.readInt(); + i = 0; + while(i < local3) + { + this._messageTemplates.push(wrapper.readString()); + i++; + } + + local3 = wrapper.readInt(); + i = 0; + while(i < local3) + { + wrapper.readString(); + i++; + } + + this._cfhPermission = wrapper.readBoolean(); + this._chatlogsPermission = wrapper.readBoolean(); + this._alertPermission = wrapper.readBoolean(); + this._kickPermission = wrapper.readBoolean(); + this._banPermission = wrapper.readBoolean(); + this._roomAlertPermission = wrapper.readBoolean(); + this._roomKickPermission = wrapper.readBoolean(); + local3 = wrapper.readInt(); + i = 0; + while(i < local3) + { + this._roomMessageTemplates.push(wrapper.readString()); + i++; + } + + + } + public dispose(): void + { + if(this._disposed) + { + return; + } + this._disposed = true; + this._messageTemplates = null; + this._roomMessageTemplates = null; + this._issues = null; + } + + public get disposed(): boolean + { + return this._disposed; + } + + public get messageTemplates(): string[] + { + return this._messageTemplates; + } + + public get roomMessageTemplates(): string[] + { + return this._roomMessageTemplates; + } + + public get issues(): IssueMessageData[] + { + return this._issues; + } + + public get cfhPermission(): boolean + { + return this._cfhPermission; + } + + public get chatlogsPermission(): boolean + { + return this._chatlogsPermission; + } + + public get alertPermission(): boolean + { + return this._alertPermission; + } + + public get kickPermission(): boolean + { + return this._kickPermission; + } + + public get banPermission(): boolean + { + return this._banPermission; + } + + public get roomAlertPermission(): boolean + { + return this._roomAlertPermission; + } + + public get roomKickPermission(): boolean + { + return this._roomKickPermission; + } + +} diff --git a/packages/communication/src/messages/parser/moderation/ModeratorInitMessageParser.ts b/packages/communication/src/messages/parser/moderation/ModeratorInitMessageParser.ts new file mode 100644 index 0000000..74132cf --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/ModeratorInitMessageParser.ts @@ -0,0 +1,23 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { ModeratorInitData } from './ModeratorInitData'; + +export class ModeratorInitMessageParser implements IMessageParser +{ + private _data: ModeratorInitData = null; + public flush(): boolean + { + this._data = null; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + this._data = new ModeratorInitData(wrapper); + return true; + } + + public get data(): ModeratorInitData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/moderation/ModeratorMessageParser.ts b/packages/communication/src/messages/parser/moderation/ModeratorMessageParser.ts new file mode 100644 index 0000000..ec9459f --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/ModeratorMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ModeratorMessageParser implements IMessageParser +{ + private _message: string; + private _url: string; + + public flush(): boolean + { + this._message = ''; + this._url = ''; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._message = wrapper.readString(); + this._url = wrapper.readString(); + + return true; + } + + public get message(): string + { + return this._message; + } + + public get url(): string + { + return this._url; + } +} diff --git a/packages/communication/src/messages/parser/moderation/ModeratorRoomInfoMessageParser.ts b/packages/communication/src/messages/parser/moderation/ModeratorRoomInfoMessageParser.ts new file mode 100644 index 0000000..1f95990 --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/ModeratorRoomInfoMessageParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { RoomModerationData } from './RoomModerationData'; + +export class ModeratorRoomInfoMessageParser implements IMessageParser +{ + private _data: RoomModerationData; + + public flush(): boolean + { + this._data = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._data = new RoomModerationData(wrapper); + + return true; + } + + public get data(): RoomModerationData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/moderation/ModeratorToolPreferencesMessageParser.ts b/packages/communication/src/messages/parser/moderation/ModeratorToolPreferencesMessageParser.ts new file mode 100644 index 0000000..a2d83a0 --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/ModeratorToolPreferencesMessageParser.ts @@ -0,0 +1,47 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ModeratorToolPreferencesMessageParser implements IMessageParser +{ + private _windowX: number; + private _windowY: number; + private _windowWidth: number; + private _windowHeight: number; + + public flush(): boolean + { + this._windowX = 0; + this._windowY = 0; + this._windowWidth = 0; + this._windowHeight = 0; + return true; + } + + public parse(k: IMessageDataWrapper): boolean + { + this._windowX = k.readInt(); + this._windowY = k.readInt(); + this._windowWidth = k.readInt(); + this._windowHeight = k.readInt(); + return true; + } + + public get windowX(): number + { + return this._windowX; + } + + public get windowY(): number + { + return this._windowY; + } + + public get windowWidth(): number + { + return this._windowWidth; + } + + public get windowHeight(): number + { + return this._windowHeight; + } +} diff --git a/packages/communication/src/messages/parser/moderation/ModeratorUserInfoData.ts b/packages/communication/src/messages/parser/moderation/ModeratorUserInfoData.ts new file mode 100644 index 0000000..011f14e --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/ModeratorUserInfoData.ts @@ -0,0 +1,145 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class ModeratorUserInfoData +{ + private _userId: number; + private _userName: string; + private _registrationAgeInMinutes: number; + private _minutesSinceLastLogin: number; + private _online: boolean; + private _cfhCount: number; + private _abusiveCfhCount: number; + private _cautionCount: number; + private _banCount: number; + private _tradingLockCount: number; + private _tradingExpiryDate: string; + private _lastPurchaseDate: string; + private _identityId: number; + private _identityRelatedBanCount: number; + private _primaryEmailAddress: string; + private _figure: string; + private _userClassification: string; + private _lastSanctionTime: string = ''; + private _sanctionAgeHours: number = 0; + + constructor(wrapper: IMessageDataWrapper) + { + this._userId = wrapper.readInt(); + this._userName = wrapper.readString(); + this._figure = wrapper.readString(); + this._registrationAgeInMinutes = wrapper.readInt(); + this._minutesSinceLastLogin = wrapper.readInt(); + this._online = wrapper.readBoolean(); + this._cfhCount = wrapper.readInt(); + this._abusiveCfhCount = wrapper.readInt(); + this._cautionCount = wrapper.readInt(); + this._banCount = wrapper.readInt(); + this._tradingLockCount = wrapper.readInt(); + this._tradingExpiryDate = wrapper.readString(); + this._lastPurchaseDate = wrapper.readString(); + this._identityId = wrapper.readInt(); + this._identityRelatedBanCount = wrapper.readInt(); + this._primaryEmailAddress = wrapper.readString(); + this._userClassification = wrapper.readString(); + if(wrapper.bytesAvailable) + { + this._lastSanctionTime = wrapper.readString(); + this._sanctionAgeHours = wrapper.readInt(); + } + } + + public get userId(): number + { + return this._userId; + } + + public get userName(): string + { + return this._userName; + } + + public get figure(): string + { + return this._figure; + } + + public get registrationAgeInMinutes(): number + { + return this._registrationAgeInMinutes; + } + + public get minutesSinceLastLogin(): number + { + return this._minutesSinceLastLogin; + } + + public get online(): boolean + { + return this._online; + } + + public get cfhCount(): number + { + return this._cfhCount; + } + + public get abusiveCfhCount(): number + { + return this._abusiveCfhCount; + } + + public get cautionCount(): number + { + return this._cautionCount; + } + + public get banCount(): number + { + return this._banCount; + } + + public get tradingLockCount(): number + { + return this._tradingLockCount; + } + + public get tradingExpiryDate(): string + { + return this._tradingExpiryDate; + } + + public get lastPurchaseDate(): string + { + return this._lastPurchaseDate; + } + + public get identityId(): number + { + return this._identityId; + } + + public get identityRelatedBanCount(): number + { + return this._identityRelatedBanCount; + } + + public get primaryEmailAddress(): string + { + return this._primaryEmailAddress; + } + + public get userClassification(): string + { + return this._userClassification; + } + + public get lastSanctionTime(): string + { + return this._lastSanctionTime; + } + + public get sanctionAgeHours(): number + { + return this._sanctionAgeHours; + } +} diff --git a/packages/communication/src/messages/parser/moderation/ModeratorUserInfoMessageParser.ts b/packages/communication/src/messages/parser/moderation/ModeratorUserInfoMessageParser.ts new file mode 100644 index 0000000..344e83f --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/ModeratorUserInfoMessageParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { ModeratorUserInfoData } from './ModeratorUserInfoData'; + +export class ModeratorUserInfoMessageParser implements IMessageParser +{ + private _data: ModeratorUserInfoData; + + public flush(): boolean + { + this._data = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._data = new ModeratorUserInfoData(wrapper); + + return true; + } + + public get data(): ModeratorUserInfoData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/moderation/PatternMatchData.ts b/packages/communication/src/messages/parser/moderation/PatternMatchData.ts new file mode 100644 index 0000000..88285d1 --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/PatternMatchData.ts @@ -0,0 +1,44 @@ +import { IDisposable, IMessageDataWrapper } from '@nitrots/api'; + +export class PatternMatchData implements IDisposable +{ + private _pattern: string; + private _startIndex: number; + private _endIndex: number; + private _disposed: boolean = false; + + constructor(k: IMessageDataWrapper) + { + this._pattern = k.readString(); + this._startIndex = k.readInt(); + this._endIndex = k.readInt(); + } + + public dispose(): void + { + this._disposed = true; + this._pattern = ''; + this._startIndex = -1; + this._endIndex = -1; + } + + public get disposed(): boolean + { + return this._disposed; + } + + public get pattern(): string + { + return this._pattern; + } + + public get startIndex(): number + { + return this._startIndex; + } + + public get endIndex(): number + { + return this._endIndex; + } +} diff --git a/packages/communication/src/messages/parser/moderation/RoomChatlogMessageParser.ts b/packages/communication/src/messages/parser/moderation/RoomChatlogMessageParser.ts new file mode 100644 index 0000000..91be2bb --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/RoomChatlogMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { ChatRecordData } from './ChatRecordData'; + +export class RoomChatlogMessageParser implements IMessageParser +{ + private _data: ChatRecordData; + + public flush(): boolean + { + this._data = null; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._data = new ChatRecordData(wrapper); + + return true; + } + + public get data(): ChatRecordData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/moderation/RoomModerationData.ts b/packages/communication/src/messages/parser/moderation/RoomModerationData.ts new file mode 100644 index 0000000..ba5b065 --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/RoomModerationData.ts @@ -0,0 +1,72 @@ +import { IDisposable, IMessageDataWrapper } from '@nitrots/api'; +import { ModRoomData } from './ModRoomData'; + +export class RoomModerationData implements IDisposable +{ + private _flatId: number; + private _userCount: number; + private _ownerInRoom: boolean; + private _ownerId: number; + private _ownerName: string; + private _room: ModRoomData; + private _disposed: boolean; + + constructor(k: IMessageDataWrapper) + { + this._flatId = k.readInt(); + this._userCount = k.readInt(); + this._ownerInRoom = k.readBoolean(); + this._ownerId = k.readInt(); + this._ownerName = k.readString(); + this._room = new ModRoomData(k); + } + + public get flatId(): number + { + return this._flatId; + } + + public get userCount(): number + { + return this._userCount; + } + + public get ownerInRoom(): boolean + { + return this._ownerInRoom; + } + + public get ownerId(): number + { + return this._ownerId; + } + + public get ownerName(): string + { + return this._ownerName; + } + + public get room(): ModRoomData + { + return this._room; + } + + public get disposed(): boolean + { + return this._disposed; + } + + public dispose(): void + { + if(this._disposed) + { + return; + } + this._disposed = true; + if(this._room != null) + { + this._room.dispose(); + this._room = null; + } + } +} diff --git a/packages/communication/src/messages/parser/moderation/RoomVisitData.ts b/packages/communication/src/messages/parser/moderation/RoomVisitData.ts new file mode 100644 index 0000000..9db6c0d --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/RoomVisitData.ts @@ -0,0 +1,37 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class RoomVisitData +{ + private _roomId: number; + private _roomName: string; + private _enterHour: number; + private _enterMinute: number; + + constructor(k: IMessageDataWrapper) + { + this._roomId = k.readInt(); + this._roomName = k.readString(); + this._enterHour = k.readInt(); + this._enterMinute = k.readInt(); + } + + public get roomId(): number + { + return this._roomId; + } + + public get roomName(): string + { + return this._roomName; + } + + public get enterHour(): number + { + return this._enterHour; + } + + public get enterMinute(): number + { + return this._enterMinute; + } +} diff --git a/packages/communication/src/messages/parser/moderation/RoomVisitsData.ts b/packages/communication/src/messages/parser/moderation/RoomVisitsData.ts new file mode 100644 index 0000000..13c80d7 --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/RoomVisitsData.ts @@ -0,0 +1,38 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { RoomVisitData } from './RoomVisitData'; + +export class RoomVisitsData +{ + private _userId: number; + private _userName: string; + private _rooms: RoomVisitData[]; + + constructor(k: IMessageDataWrapper) + { + this._rooms = []; + this._userId = k.readInt(); + this._userName = k.readString(); + const _local_2 = k.readInt(); + let _local_3 = 0; + while(_local_3 < _local_2) + { + this._rooms.push(new RoomVisitData(k)); + _local_3++; + } + } + + public get userId(): number + { + return this._userId; + } + + public get userName(): string + { + return this._userName; + } + + public get rooms(): RoomVisitData[] + { + return this._rooms; + } +} diff --git a/packages/communication/src/messages/parser/moderation/RoomVisitsMessageParser.ts b/packages/communication/src/messages/parser/moderation/RoomVisitsMessageParser.ts new file mode 100644 index 0000000..9724f97 --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/RoomVisitsMessageParser.ts @@ -0,0 +1,23 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { RoomVisitsData } from './RoomVisitsData'; + +export class RoomVisitsMessageParser implements IMessageParser +{ + private _data: RoomVisitsData; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + this._data = new RoomVisitsData(wrapper); + return true; + } + + public get data(): RoomVisitsData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/moderation/UserBannedMessageParser.ts b/packages/communication/src/messages/parser/moderation/UserBannedMessageParser.ts new file mode 100644 index 0000000..16d5719 --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/UserBannedMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class UserBannedMessageParser implements IMessageParser +{ + private _message: string; + + public flush(): boolean + { + this._message = ''; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._message = wrapper.readString(); + + return true; + } + + public get message(): string + { + return this._message; + } +} diff --git a/packages/communication/src/messages/parser/moderation/UserChatlogData.ts b/packages/communication/src/messages/parser/moderation/UserChatlogData.ts new file mode 100644 index 0000000..29dfd1e --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/UserChatlogData.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { ChatRecordData } from './ChatRecordData'; + +export class UserChatlogData +{ + private _userId: number; + private _username: string; + private _roomChatlogs: ChatRecordData[] = []; + + constructor(wrapper: IMessageDataWrapper) + { + this._userId = wrapper.readInt(); + this._username = wrapper.readString(); + const size = wrapper.readInt(); + for(let i = 0; i < size; i++) + { + this._roomChatlogs.push(new ChatRecordData(wrapper)); + } + } + + public get userId(): number + { + return this._userId; + } + + public get username(): string + { + return this._username; + } + + public get roomChatlogs(): ChatRecordData[] + { + return this._roomChatlogs; + } +} diff --git a/packages/communication/src/messages/parser/moderation/UserChatlogMessageParser.ts b/packages/communication/src/messages/parser/moderation/UserChatlogMessageParser.ts new file mode 100644 index 0000000..9beac71 --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/UserChatlogMessageParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { UserChatlogData } from './UserChatlogData'; + +export class UserChatlogMessageParser implements IMessageParser +{ + private _data: UserChatlogData; + + public flush(): boolean + { + this._data = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._data = new UserChatlogData(wrapper); + + return true; + } + + public get data(): UserChatlogData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/moderation/index.ts b/packages/communication/src/messages/parser/moderation/index.ts new file mode 100644 index 0000000..4d7d3a3 --- /dev/null +++ b/packages/communication/src/messages/parser/moderation/index.ts @@ -0,0 +1,28 @@ +export * from './CfhChatlogData'; +export * from './CfhChatlogMessageParser'; +export * from './ChatlineData'; +export * from './ChatRecordData'; +export * from './INamed'; +export * from './IssueDeletedMessageParser'; +export * from './IssueInfoMessageParser'; +export * from './IssueMessageData'; +export * from './IssuePickFailedMessageParser'; +export * from './ModerationCautionParser'; +export * from './ModeratorActionResultMessageParser'; +export * from './ModeratorInitData'; +export * from './ModeratorInitMessageParser'; +export * from './ModeratorMessageParser'; +export * from './ModeratorRoomInfoMessageParser'; +export * from './ModeratorToolPreferencesMessageParser'; +export * from './ModeratorUserInfoData'; +export * from './ModeratorUserInfoMessageParser'; +export * from './ModRoomData'; +export * from './PatternMatchData'; +export * from './RoomChatlogMessageParser'; +export * from './RoomModerationData'; +export * from './RoomVisitData'; +export * from './RoomVisitsData'; +export * from './RoomVisitsMessageParser'; +export * from './UserBannedMessageParser'; +export * from './UserChatlogData'; +export * from './UserChatlogMessageParser'; diff --git a/packages/communication/src/messages/parser/mysterybox/CancelMysteryBoxWaitMessageParser.ts b/packages/communication/src/messages/parser/mysterybox/CancelMysteryBoxWaitMessageParser.ts new file mode 100644 index 0000000..6f6b105 --- /dev/null +++ b/packages/communication/src/messages/parser/mysterybox/CancelMysteryBoxWaitMessageParser.ts @@ -0,0 +1,21 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CancelMysteryBoxWaitMessageParser implements IMessageParser +{ + + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + + + return true; + } + +} diff --git a/packages/communication/src/messages/parser/mysterybox/GotMysteryBoxPrizeMessageParser.ts b/packages/communication/src/messages/parser/mysterybox/GotMysteryBoxPrizeMessageParser.ts new file mode 100644 index 0000000..3268e5a --- /dev/null +++ b/packages/communication/src/messages/parser/mysterybox/GotMysteryBoxPrizeMessageParser.ts @@ -0,0 +1,33 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GotMysteryBoxPrizeMessageParser implements IMessageParser +{ + private _contentType:string; + private _classId:number; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._contentType = wrapper.readString(); + this._classId = wrapper.readInt(); + + return true; + } + + public get contentType():string + { + return this._contentType; + } + + public get classId():number + { + return this._classId; + } + +} diff --git a/packages/communication/src/messages/parser/mysterybox/MysteryBoxKeysParser.ts b/packages/communication/src/messages/parser/mysterybox/MysteryBoxKeysParser.ts new file mode 100644 index 0000000..3934ff0 --- /dev/null +++ b/packages/communication/src/messages/parser/mysterybox/MysteryBoxKeysParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class MysteryBoxKeysParser implements IMessageParser +{ + private _boxColor: string; + private _keyColor: string; + + public flush(): boolean + { + this._boxColor = null; + this._keyColor = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._boxColor = wrapper.readString(); + this._keyColor = wrapper.readString(); + + return true; + } + + public get boxColor(): string + { + return this._boxColor; + } + + public get keyColor(): string + { + return this._keyColor; + } +} diff --git a/packages/communication/src/messages/parser/mysterybox/ShowMysteryBoxWaitMessageParser.ts b/packages/communication/src/messages/parser/mysterybox/ShowMysteryBoxWaitMessageParser.ts new file mode 100644 index 0000000..e847264 --- /dev/null +++ b/packages/communication/src/messages/parser/mysterybox/ShowMysteryBoxWaitMessageParser.ts @@ -0,0 +1,21 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ShowMysteryBoxWaitMessageParser implements IMessageParser +{ + + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + + + return true; + } + +} diff --git a/packages/communication/src/messages/parser/mysterybox/index.ts b/packages/communication/src/messages/parser/mysterybox/index.ts new file mode 100644 index 0000000..8a3c165 --- /dev/null +++ b/packages/communication/src/messages/parser/mysterybox/index.ts @@ -0,0 +1,4 @@ +export * from './CancelMysteryBoxWaitMessageParser'; +export * from './GotMysteryBoxPrizeMessageParser'; +export * from './MysteryBoxKeysParser'; +export * from './ShowMysteryBoxWaitMessageParser'; diff --git a/packages/communication/src/messages/parser/navigator/CanCreateRoomEventParser.ts b/packages/communication/src/messages/parser/navigator/CanCreateRoomEventParser.ts new file mode 100644 index 0000000..85b291e --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/CanCreateRoomEventParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CanCreateRoomEventParser implements IMessageParser +{ + private _canCreate: boolean; + private _errorCode: number; + + public flush(): boolean + { + this._canCreate = false; + this._errorCode = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._canCreate = wrapper.readBoolean(); + this._errorCode = wrapper.readInt(); + + return true; + } + + public get canCreate(): boolean + { + return this._canCreate; + } + + public get errorCode(): number + { + return this._errorCode; + } +} diff --git a/packages/communication/src/messages/parser/navigator/CanCreateRoomMessageParser.ts b/packages/communication/src/messages/parser/navigator/CanCreateRoomMessageParser.ts new file mode 100644 index 0000000..dfe39fa --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/CanCreateRoomMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CanCreateRoomMessageParser implements IMessageParser +{ + public static readonly CREATION_ALLOWED = 0; + public static readonly ROOM_LIMIT_REACHED = 1; + + private _resultCode: number; + private _roomLimit: number; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._resultCode = wrapper.readInt(); + this._roomLimit = wrapper.readInt(); + + return true; + } + + public get resultCode(): number + { + return this._resultCode; + } + + public get roomLimit(): number + { + return this._roomLimit; + } +} diff --git a/packages/communication/src/messages/parser/navigator/CategoriesWithVisitorCountParser.ts b/packages/communication/src/messages/parser/navigator/CategoriesWithVisitorCountParser.ts new file mode 100644 index 0000000..3214f4e --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/CategoriesWithVisitorCountParser.ts @@ -0,0 +1,26 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { CategoriesWithVisitorCountData } from './utils'; + +export class CategoriesWithVisitorCountParser implements IMessageParser +{ + private _data: CategoriesWithVisitorCountData; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._data = new CategoriesWithVisitorCountData(wrapper); + + return true; + } + + public get data(): CategoriesWithVisitorCountData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/navigator/CompetitionRoomsDataMessageParser.ts b/packages/communication/src/messages/parser/navigator/CompetitionRoomsDataMessageParser.ts new file mode 100644 index 0000000..f06fb32 --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/CompetitionRoomsDataMessageParser.ts @@ -0,0 +1,26 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { CompetitionRoomsData } from './utils'; + +export class CompetitionRoomsDataMessageParser implements IMessageParser +{ + private _data: CompetitionRoomsData; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._data = new CompetitionRoomsData(wrapper); + + return true; + } + + public get data(): CompetitionRoomsData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/navigator/ConvertedRoomIdMessageParser.ts b/packages/communication/src/messages/parser/navigator/ConvertedRoomIdMessageParser.ts new file mode 100644 index 0000000..0ef5825 --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/ConvertedRoomIdMessageParser.ts @@ -0,0 +1,32 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ConvertedRoomIdMessageParser implements IMessageParser +{ + private _globalId: string; + private _convertedId: number; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._globalId = wrapper.readString(); + this._convertedId = wrapper.readInt(); + + return true; + } + + public get globalId(): string + { + return this._globalId; + } + + public get convertedId(): number + { + return this._convertedId; + } +} diff --git a/packages/communication/src/messages/parser/navigator/DoorbellMessageParser.ts b/packages/communication/src/messages/parser/navigator/DoorbellMessageParser.ts new file mode 100644 index 0000000..1ab4dbe --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/DoorbellMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class DoorbellMessageParser implements IMessageParser +{ + private _userName: string; + + public flush(): boolean + { + this._userName = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._userName = wrapper.readString(); + + return true; + } + + public get userName(): string + { + return this._userName; + } +} diff --git a/packages/communication/src/messages/parser/navigator/FavouriteChangedMessageParser.ts b/packages/communication/src/messages/parser/navigator/FavouriteChangedMessageParser.ts new file mode 100644 index 0000000..3495d4d --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/FavouriteChangedMessageParser.ts @@ -0,0 +1,32 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FavouriteChangedMessageParser implements IMessageParser +{ + private _flatId: number; + private _added: boolean; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._flatId = wrapper.readInt(); + this._added = wrapper.readBoolean(); + + return true; + } + + public get flatId(): number + { + return this._flatId; + } + + public get added(): boolean + { + return this._added; + } +} diff --git a/packages/communication/src/messages/parser/navigator/FavouritesMessageParser.ts b/packages/communication/src/messages/parser/navigator/FavouritesMessageParser.ts new file mode 100644 index 0000000..f34b04c --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/FavouritesMessageParser.ts @@ -0,0 +1,39 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FavouritesMessageParser implements IMessageParser +{ + private _limit: number; + private _favouriteRoomIds: number[]; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._favouriteRoomIds = []; + this._limit = wrapper.readInt(); + + const count = wrapper.readInt(); + + for(let i = 0; i < count; i++) + { + this._favouriteRoomIds.push(wrapper.readInt()); + } + + return true; + } + + public get limit(): number + { + return this._limit; + } + + public get favoriteRoomIds(): number[] + { + return this._favouriteRoomIds; + } +} diff --git a/packages/communication/src/messages/parser/navigator/FlatAccessDeniedMessageParser.ts b/packages/communication/src/messages/parser/navigator/FlatAccessDeniedMessageParser.ts new file mode 100644 index 0000000..52cb9f4 --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/FlatAccessDeniedMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FlatAccessDeniedMessageParser implements IMessageParser +{ + private _userName: string; + + public flush(): boolean + { + this._userName = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._userName = wrapper.readString(); + + return true; + } + + public get userName(): string + { + return this._userName; + } +} diff --git a/packages/communication/src/messages/parser/navigator/FlatCreatedMessageParser.ts b/packages/communication/src/messages/parser/navigator/FlatCreatedMessageParser.ts new file mode 100644 index 0000000..e1d888f --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/FlatCreatedMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FlatCreatedMessageParser implements IMessageParser +{ + private _roomId: number; + private _roomName: string; + + public flush(): boolean + { + this._roomId = -1; + this._roomName = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomId = wrapper.readInt(); + this._roomName = wrapper.readString(); + + return true; + } + + public get roomId(): number + { + return this._roomId; + } + + public get roomName(): string + { + return this._roomName; + } +} diff --git a/packages/communication/src/messages/parser/navigator/GetGuestRoomResultMessageParser.ts b/packages/communication/src/messages/parser/navigator/GetGuestRoomResultMessageParser.ts new file mode 100644 index 0000000..ebebe41 --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/GetGuestRoomResultMessageParser.ts @@ -0,0 +1,79 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { RoomDataParser } from '../room'; +import { RoomChatSettings, RoomModerationSettings } from '../roomsettings'; + +export class GetGuestRoomResultMessageParser implements IMessageParser +{ + private _roomEnter: boolean; + private _roomForward: boolean; + private _data: RoomDataParser; + private _staffPick: boolean; + private _isGroupMember: boolean; + private _moderation: RoomModerationSettings; + private _chat: RoomChatSettings; + + public flush(): boolean + { + this._roomEnter = false; + this._roomForward = false; + this._data = null; + this._staffPick = false; + this._isGroupMember = false; + this._moderation = null; + this._chat = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomEnter = wrapper.readBoolean(); + this._data = new RoomDataParser(wrapper); + this._roomForward = wrapper.readBoolean(); + this._staffPick = wrapper.readBoolean(); + this._isGroupMember = wrapper.readBoolean(); + this.data.allInRoomMuted = wrapper.readBoolean(); + this._moderation = new RoomModerationSettings(wrapper); + this.data.canMute = wrapper.readBoolean(); + this._chat = new RoomChatSettings(wrapper); + + return true; + } + + public get roomEnter(): boolean + { + return this._roomEnter; + } + + public get roomForward(): boolean + { + return this._roomForward; + } + + public get data(): RoomDataParser + { + return this._data; + } + + public get staffPick(): boolean + { + return this._staffPick; + } + + public get isGroupMember(): boolean + { + return this._isGroupMember; + } + + public get moderation(): RoomModerationSettings + { + return this._moderation; + } + + public get chat(): RoomChatSettings + { + return this._chat; + } +} diff --git a/packages/communication/src/messages/parser/navigator/GuestRoomSearchResultMessageParser.ts b/packages/communication/src/messages/parser/navigator/GuestRoomSearchResultMessageParser.ts new file mode 100644 index 0000000..3ed50a9 --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/GuestRoomSearchResultMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { GuestRoomSearchResultData } from './utils'; + +export class GuestRoomSearchResultMessageParser implements IMessageParser +{ + _data: GuestRoomSearchResultData; + + public flush(): boolean + { + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._data = new GuestRoomSearchResultData(wrapper); + + return true; + } + + public get data(): GuestRoomSearchResultData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/navigator/NavigatorCategoryDataParser.ts b/packages/communication/src/messages/parser/navigator/NavigatorCategoryDataParser.ts new file mode 100644 index 0000000..0c5506b --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/NavigatorCategoryDataParser.ts @@ -0,0 +1,83 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class NavigatorCategoryDataParser +{ + private _id: number; + private _name: string; + private _visible: boolean; + private _automatic: boolean; + private _automaticCategoryKey: string; + private _globalCategoryKey: string; + private _staffOnly: boolean; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this.flush(); + this.parse(wrapper); + } + + public flush(): boolean + { + this._id = -1; + this._name = null; + this._visible = false; + this._automatic = false; + this._automaticCategoryKey = null; + this._globalCategoryKey = null; + this._staffOnly = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._id = wrapper.readInt(); + this._name = wrapper.readString(); + this._visible = wrapper.readBoolean(); + this._automatic = wrapper.readBoolean(); + this._automaticCategoryKey = wrapper.readString(); + this._globalCategoryKey = wrapper.readString(); + this._staffOnly = wrapper.readBoolean(); + + return true; + } + + public get id(): number + { + return this._id; + } + + public get name(): string + { + return this._name; + } + + public get visible(): boolean + { + return this._visible; + } + + public get automatic(): boolean + { + return this._automatic; + } + + public get automaticCategoryKey(): string + { + return this._automaticCategoryKey; + } + + public get globalCategoryKey(): string + { + return this._globalCategoryKey; + } + + public get staffOnly(): boolean + { + return this._staffOnly; + } +} diff --git a/packages/communication/src/messages/parser/navigator/NavigatorCollapsedParser.ts b/packages/communication/src/messages/parser/navigator/NavigatorCollapsedParser.ts new file mode 100644 index 0000000..bccb78c --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/NavigatorCollapsedParser.ts @@ -0,0 +1,34 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class NavigatorCollapsedParser implements IMessageParser +{ + private _categories: string[]; + + public flush(): boolean + { + this._categories = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalCategories = wrapper.readInt(); + + while(totalCategories > 0) + { + this._categories.push(wrapper.readString()); + + totalCategories--; + } + + return true; + } + + public get categories(): string[] + { + return this._categories; + } +} diff --git a/packages/communication/src/messages/parser/navigator/NavigatorEventCategoryDataParser.ts b/packages/communication/src/messages/parser/navigator/NavigatorEventCategoryDataParser.ts new file mode 100644 index 0000000..bde28ee --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/NavigatorEventCategoryDataParser.ts @@ -0,0 +1,51 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class NavigatorEventCategoryDataParser +{ + private _id: number; + private _name: string; + private _visible: boolean; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this.flush(); + this.parse(wrapper); + } + + public flush(): boolean + { + this._id = -1; + this._name = null; + this._visible = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._id = wrapper.readInt(); + this._name = wrapper.readString(); + this._visible = wrapper.readBoolean(); + + return true; + } + + public get id(): number + { + return this._id; + } + + public get name(): string + { + return this._name; + } + + public get visible(): boolean + { + return this._visible; + } +} diff --git a/packages/communication/src/messages/parser/navigator/NavigatorHomeRoomParser.ts b/packages/communication/src/messages/parser/navigator/NavigatorHomeRoomParser.ts new file mode 100644 index 0000000..e34f47c --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/NavigatorHomeRoomParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class NavigatorHomeRoomParser implements IMessageParser +{ + private _homeRoomId: number; + private _roomIdToEnter: number; + + public flush(): boolean + { + this._homeRoomId = -1; + this._roomIdToEnter = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._homeRoomId = wrapper.readInt(); + this._roomIdToEnter = wrapper.readInt(); + + return true; + } + + public get homeRoomId(): number + { + return this._homeRoomId; + } + + public get roomIdToEnter(): number + { + return this._roomIdToEnter; + } +} diff --git a/packages/communication/src/messages/parser/navigator/NavigatorLiftedDataParser.ts b/packages/communication/src/messages/parser/navigator/NavigatorLiftedDataParser.ts new file mode 100644 index 0000000..c370434 --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/NavigatorLiftedDataParser.ts @@ -0,0 +1,59 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class NavigatorLiftedDataParser +{ + private _roomId: number; + private _areaId: number; + private _image: string; + private _caption: string; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this.flush(); + this.parse(wrapper); + } + + public flush(): boolean + { + this._roomId = -1; + this._areaId = -1; + this._image = null; + this._caption = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomId = wrapper.readInt(); + this._areaId = wrapper.readInt(); + this._image = wrapper.readString(); + this._caption = wrapper.readString(); + + return true; + } + + public get roomId(): number + { + return this._roomId; + } + + public get areaId(): number + { + return this._areaId; + } + + public get image(): string + { + return this._image; + } + + public get caption(): string + { + return this._caption; + } +} diff --git a/packages/communication/src/messages/parser/navigator/NavigatorLiftedParser.ts b/packages/communication/src/messages/parser/navigator/NavigatorLiftedParser.ts new file mode 100644 index 0000000..f8071ac --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/NavigatorLiftedParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { NavigatorLiftedDataParser } from './NavigatorLiftedDataParser'; + +export class NavigatorLiftedParser implements IMessageParser +{ + private _rooms: NavigatorLiftedDataParser[]; + + public flush(): boolean + { + this._rooms = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalRooms = wrapper.readInt(); + + while(totalRooms > 0) + { + this._rooms.push(new NavigatorLiftedDataParser(wrapper)); + + totalRooms--; + } + + return true; + } + + public get rooms(): NavigatorLiftedDataParser[] + { + return this._rooms; + } +} diff --git a/packages/communication/src/messages/parser/navigator/NavigatorMetadataParser.ts b/packages/communication/src/messages/parser/navigator/NavigatorMetadataParser.ts new file mode 100644 index 0000000..14fc619 --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/NavigatorMetadataParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { NavigatorTopLevelContext } from './utils'; + +export class NavigatorMetadataParser implements IMessageParser +{ + private _topLevelContexts: NavigatorTopLevelContext[]; + + public flush(): boolean + { + this._topLevelContexts = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalContexts = wrapper.readInt(); + + while(totalContexts > 0) + { + this._topLevelContexts.push(new NavigatorTopLevelContext(wrapper)); + + totalContexts--; + } + + return true; + } + + public get topLevelContexts(): NavigatorTopLevelContext[] + { + return this._topLevelContexts; + } +} diff --git a/packages/communication/src/messages/parser/navigator/NavigatorOpenRoomCreatorParser.ts b/packages/communication/src/messages/parser/navigator/NavigatorOpenRoomCreatorParser.ts new file mode 100644 index 0000000..397fcef --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/NavigatorOpenRoomCreatorParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class NavigatorOpenRoomCreatorParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/navigator/NavigatorSearchParser.ts b/packages/communication/src/messages/parser/navigator/NavigatorSearchParser.ts new file mode 100644 index 0000000..e437597 --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/NavigatorSearchParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { NavigatorSearchResultSet } from './utils'; + +export class NavigatorSearchParser implements IMessageParser +{ + private _result: NavigatorSearchResultSet; + + public flush(): boolean + { + this._result = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._result = new NavigatorSearchResultSet(wrapper); + + return true; + } + + public get result(): NavigatorSearchResultSet + { + return this._result; + } +} diff --git a/packages/communication/src/messages/parser/navigator/NavigatorSearchesParser.ts b/packages/communication/src/messages/parser/navigator/NavigatorSearchesParser.ts new file mode 100644 index 0000000..f63e673 --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/NavigatorSearchesParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { NavigatorSavedSearch } from './utils'; + +export class NavigatorSearchesParser implements IMessageParser +{ + private _searches: NavigatorSavedSearch[]; + + public flush(): boolean + { + this._searches = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalSearches = wrapper.readInt(); + + while(totalSearches > 0) + { + this._searches.push(new NavigatorSavedSearch(wrapper)); + + totalSearches--; + } + + return true; + } + + public get searches(): NavigatorSavedSearch[] + { + return this._searches; + } +} diff --git a/packages/communication/src/messages/parser/navigator/NavigatorSettingsParser.ts b/packages/communication/src/messages/parser/navigator/NavigatorSettingsParser.ts new file mode 100644 index 0000000..3a32f12 --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/NavigatorSettingsParser.ts @@ -0,0 +1,67 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class NavigatorSettingsParser implements IMessageParser +{ + private _windowX: number; + private _windowY: number; + private _windowWidth: number; + private _windowHeight: number; + private _leftPanelHidden: boolean; + private _resultsMode: number; + + public flush(): boolean + { + this._windowX = 0; + this._windowY = 0; + this._windowWidth = 0; + this._windowHeight = 0; + this._leftPanelHidden = false; + this._resultsMode = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._windowX = wrapper.readInt(); + this._windowY = wrapper.readInt(); + this._windowWidth = wrapper.readInt(); + this._windowHeight = wrapper.readInt(); + this._leftPanelHidden = wrapper.readBoolean(); + this._resultsMode = wrapper.readInt(); + + return true; + } + + public get windowX(): number + { + return this._windowX; + } + + public get windowY(): number + { + return this._windowY; + } + + public get windowWidth(): number + { + return this._windowWidth; + } + + public get windowHeight(): number + { + return this._windowHeight; + } + + public get leftPanelHidden(): boolean + { + return this._leftPanelHidden; + } + + public get resultsMode(): number + { + return this._resultsMode; + } +} diff --git a/packages/communication/src/messages/parser/navigator/PopularRoomTagsData.ts b/packages/communication/src/messages/parser/navigator/PopularRoomTagsData.ts new file mode 100644 index 0000000..10471b0 --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/PopularRoomTagsData.ts @@ -0,0 +1,46 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { PopularTagData } from './PopularTagData'; + +export class PopularRoomTagsData +{ + private _tags: PopularTagData[]; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this.flush(); + this.parse(wrapper); + } + + public flush(): boolean + { + this._tags = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._tags = []; + + const totalTags = wrapper.readInt(); + + let total = 0; + + while(total < totalTags) + { + this._tags.push(new PopularTagData(wrapper)); + total++; + } + + return true; + } + + public get tags(): PopularTagData[] + { + return this._tags; + } +} diff --git a/packages/communication/src/messages/parser/navigator/PopularRoomTagsResultMessageParser.ts b/packages/communication/src/messages/parser/navigator/PopularRoomTagsResultMessageParser.ts new file mode 100644 index 0000000..b7be4ba --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/PopularRoomTagsResultMessageParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { PopularRoomTagsData } from './PopularRoomTagsData'; + +export class PopularRoomTagsResultMessageParser implements IMessageParser +{ + private _data: PopularRoomTagsData; + + public flush(): boolean + { + this._data = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._data = new PopularRoomTagsData(wrapper); + + return true; + } + + public get data(): PopularRoomTagsData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/navigator/PopularTagData.ts b/packages/communication/src/messages/parser/navigator/PopularTagData.ts new file mode 100644 index 0000000..34f898a --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/PopularTagData.ts @@ -0,0 +1,23 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class PopularTagData +{ + private _tagName: string; + private _userCount: number; + + constructor(wrapper: IMessageDataWrapper) + { + this._tagName = wrapper.readString(); + this._userCount = wrapper.readInt(); + } + + public get tagName(): string + { + return this._tagName; + } + + public get userCount(): number + { + return this._userCount; + } +} diff --git a/packages/communication/src/messages/parser/navigator/RoomEventCancelMessageParser.ts b/packages/communication/src/messages/parser/navigator/RoomEventCancelMessageParser.ts new file mode 100644 index 0000000..768829e --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/RoomEventCancelMessageParser.ts @@ -0,0 +1,15 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomEventCancelMessageParser implements IMessageParser +{ + flush(): boolean + { + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + return true; + } + +} diff --git a/packages/communication/src/messages/parser/navigator/RoomEventMessageParser.ts b/packages/communication/src/messages/parser/navigator/RoomEventMessageParser.ts new file mode 100644 index 0000000..c77d0ac --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/RoomEventMessageParser.ts @@ -0,0 +1,23 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { RoomEventData } from './utils'; + +export class RoomEventMessageParser implements IMessageParser +{ + private _data: RoomEventData; + + flush(): boolean + { + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._data = new RoomEventData(wrapper); + return true; + } + + public get data(): RoomEventData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/navigator/RoomFilterSettingsMessageParser.ts b/packages/communication/src/messages/parser/navigator/RoomFilterSettingsMessageParser.ts new file mode 100644 index 0000000..84f116d --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/RoomFilterSettingsMessageParser.ts @@ -0,0 +1,34 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomFilterSettingsMessageParser implements IMessageParser +{ + private _words: string[]; + + public flush(): boolean + { + this._words = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalWords = wrapper.readInt(); + + while(totalWords > 0) + { + this._words.push(wrapper.readString()); + + totalWords--; + } + + return true; + } + + public get words(): string[] + { + return this._words; + } +} diff --git a/packages/communication/src/messages/parser/navigator/RoomSettingsUpdatedParser.ts b/packages/communication/src/messages/parser/navigator/RoomSettingsUpdatedParser.ts new file mode 100644 index 0000000..3163301 --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/RoomSettingsUpdatedParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomSettingsUpdatedParser implements IMessageParser +{ + private _roomId: number; + + public flush(): boolean + { + this._roomId = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomId = wrapper.readInt(); + + return true; + } + + public get roomId(): number + { + return this._roomId; + } +} diff --git a/packages/communication/src/messages/parser/navigator/RoomThumbnailUpdateResultMessageParser.ts b/packages/communication/src/messages/parser/navigator/RoomThumbnailUpdateResultMessageParser.ts new file mode 100644 index 0000000..0767844 --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/RoomThumbnailUpdateResultMessageParser.ts @@ -0,0 +1,30 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomThumbnailUpdateResultMessageParser implements IMessageParser +{ + private _flatId: number; + private _resultCode: number; + + flush(): boolean + { + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._flatId = wrapper.readInt(); + this._resultCode = wrapper.readInt(); + return true; + } + + public get flatId(): number + { + return this._flatId; + } + + public get resultCode(): number + { + return this._resultCode; + } + +} diff --git a/packages/communication/src/messages/parser/navigator/UserEventCatsMessageParser.ts b/packages/communication/src/messages/parser/navigator/UserEventCatsMessageParser.ts new file mode 100644 index 0000000..97765ee --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/UserEventCatsMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { NavigatorEventCategoryDataParser } from './NavigatorEventCategoryDataParser'; + +export class UserEventCatsMessageParser implements IMessageParser +{ + private _categories: NavigatorEventCategoryDataParser[]; + + public flush(): boolean + { + this._categories = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalCategories = wrapper.readInt(); + + while(totalCategories > 0) + { + this._categories.push(new NavigatorEventCategoryDataParser(wrapper)); + + totalCategories--; + } + + return true; + } + + public get categories(): NavigatorEventCategoryDataParser[] + { + return this._categories; + } +} diff --git a/packages/communication/src/messages/parser/navigator/UserFlatCatsMessageParser.ts b/packages/communication/src/messages/parser/navigator/UserFlatCatsMessageParser.ts new file mode 100644 index 0000000..fc1ab68 --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/UserFlatCatsMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { NavigatorCategoryDataParser } from './NavigatorCategoryDataParser'; + +export class UserFlatCatsMessageParser implements IMessageParser +{ + private _categories: NavigatorCategoryDataParser[]; + + public flush(): boolean + { + this._categories = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalCategories = wrapper.readInt(); + + while(totalCategories > 0) + { + this._categories.push(new NavigatorCategoryDataParser(wrapper)); + + totalCategories--; + } + + return true; + } + + public get categories(): NavigatorCategoryDataParser[] + { + return this._categories; + } +} diff --git a/packages/communication/src/messages/parser/navigator/index.ts b/packages/communication/src/messages/parser/navigator/index.ts new file mode 100644 index 0000000..e4b0bc8 --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/index.ts @@ -0,0 +1,34 @@ +export * from './CanCreateRoomEventParser'; +export * from './CanCreateRoomMessageParser'; +export * from './CategoriesWithVisitorCountParser'; +export * from './CompetitionRoomsDataMessageParser'; +export * from './ConvertedRoomIdMessageParser'; +export * from './DoorbellMessageParser'; +export * from './FavouriteChangedMessageParser'; +export * from './FavouritesMessageParser'; +export * from './FlatAccessDeniedMessageParser'; +export * from './FlatCreatedMessageParser'; +export * from './GetGuestRoomResultMessageParser'; +export * from './GuestRoomSearchResultMessageParser'; +export * from './NavigatorCategoryDataParser'; +export * from './NavigatorCollapsedParser'; +export * from './NavigatorEventCategoryDataParser'; +export * from './NavigatorHomeRoomParser'; +export * from './NavigatorLiftedDataParser'; +export * from './NavigatorLiftedParser'; +export * from './NavigatorMetadataParser'; +export * from './NavigatorOpenRoomCreatorParser'; +export * from './NavigatorSearchesParser'; +export * from './NavigatorSearchParser'; +export * from './NavigatorSettingsParser'; +export * from './PopularRoomTagsData'; +export * from './PopularRoomTagsResultMessageParser'; +export * from './PopularTagData'; +export * from './RoomEventCancelMessageParser'; +export * from './RoomEventMessageParser'; +export * from './RoomFilterSettingsMessageParser'; +export * from './RoomSettingsUpdatedParser'; +export * from './RoomThumbnailUpdateResultMessageParser'; +export * from './UserEventCatsMessageParser'; +export * from './UserFlatCatsMessageParser'; +export * from './utils'; diff --git a/packages/communication/src/messages/parser/navigator/utils/CategoriesWithVisitorCountData.ts b/packages/communication/src/messages/parser/navigator/utils/CategoriesWithVisitorCountData.ts new file mode 100644 index 0000000..e32777b --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/utils/CategoriesWithVisitorCountData.ts @@ -0,0 +1,34 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class CategoriesWithVisitorCountData +{ + private _categoryToCurrentUserCountMap: Map; + private _categoryToMaxUserCountMap: Map; + + constructor(k: IMessageDataWrapper) + { + this._categoryToCurrentUserCountMap = new Map(); + this._categoryToMaxUserCountMap = new Map(); + + const count = k.readInt(); + + for(let i = 0; i < count; i++) + { + const _local_4 = k.readInt(); + const _local_5 = k.readInt(); + const _local_6 = k.readInt(); + this._categoryToCurrentUserCountMap.set(_local_4, _local_5); + this._categoryToMaxUserCountMap.set(_local_4, _local_6); + } + } + + public get categoryToCurrentUserCountMap(): Map + { + return this._categoryToCurrentUserCountMap; + } + + public get categoryToMaxUserCountMap(): Map + { + return this._categoryToMaxUserCountMap; + } +} diff --git a/packages/communication/src/messages/parser/navigator/utils/CompetitionRoomsData.ts b/packages/communication/src/messages/parser/navigator/utils/CompetitionRoomsData.ts new file mode 100644 index 0000000..3780d4b --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/utils/CompetitionRoomsData.ts @@ -0,0 +1,36 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class CompetitionRoomsData +{ + private _goalId: number; + private _pageIndex: number; + private _pageCount: number; + + constructor(k: IMessageDataWrapper, _arg_2: number = 0, _arg_3: number = 0) + { + this._goalId = _arg_2; + this._pageIndex = _arg_3; + + if(k) + { + this._goalId = k.readInt(); + this._pageIndex = k.readInt(); + this._pageCount = k.readInt(); + } + } + + public get goalId(): number + { + return this._goalId; + } + + public get pageIndex(): number + { + return this._pageIndex; + } + + public get pageCount(): number + { + return this._pageCount; + } +} diff --git a/packages/communication/src/messages/parser/navigator/utils/GuestRoomSearchResultData.ts b/packages/communication/src/messages/parser/navigator/utils/GuestRoomSearchResultData.ts new file mode 100644 index 0000000..87013ee --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/utils/GuestRoomSearchResultData.ts @@ -0,0 +1,76 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { RoomDataParser } from '../../room'; +import { OfficialRoomEntryData } from './OfficialRoomEntryData'; + +export class GuestRoomSearchResultData +{ + private _searchType: number; + private _searchParam: string; + private _rooms: RoomDataParser[]; + private _ad: OfficialRoomEntryData; + private _disposed: boolean; + + constructor(k: IMessageDataWrapper) + { + this._rooms = []; + this._searchType = k.readInt(); + this._searchParam = k.readString(); + const count = k.readInt(); + for(let i = 0; i < count; i++) + { + this._rooms.push(new RoomDataParser(k)); + } + const hasAdditional = k.readBoolean(); + if(hasAdditional) + { + this._ad = new OfficialRoomEntryData(k); + } + } + + public dispose(): void + { + if(this._disposed) + { + return; + } + this._disposed = true; + if(this._rooms != null) + { + for(const k of this._rooms) + { + k.flush(); + } + } + if(this._ad != null) + { + this._ad.dispose(); + this._ad = null; + } + this._rooms = null; + } + + public get disposed(): boolean + { + return this._disposed; + } + + public get searchType(): number + { + return this._searchType; + } + + public get searchParam(): string + { + return this._searchParam; + } + + public get rooms(): RoomDataParser[] + { + return this._rooms; + } + + public get ad(): OfficialRoomEntryData + { + return this._ad; + } +} diff --git a/packages/communication/src/messages/parser/navigator/utils/NavigatorSavedSearch.ts b/packages/communication/src/messages/parser/navigator/utils/NavigatorSavedSearch.ts new file mode 100644 index 0000000..9ac1cbc --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/utils/NavigatorSavedSearch.ts @@ -0,0 +1,59 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class NavigatorSavedSearch +{ + private _id: number; + private _code: string; + private _filter: string; + private _localization: string; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this.flush(); + this.parse(wrapper); + } + + public flush(): boolean + { + this._id = -1; + this._code = null; + this._filter = null; + this._localization = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._id = wrapper.readInt(); + this._code = wrapper.readString(); + this._filter = wrapper.readString(); + this._localization = wrapper.readString(); + + return true; + } + + public get id(): number + { + return this._id; + } + + public get code(): string + { + return this._code; + } + + public get filter(): string + { + return this._filter; + } + + public get localization(): string + { + return this._localization; + } +} diff --git a/packages/communication/src/messages/parser/navigator/utils/NavigatorSearchResultList.ts b/packages/communication/src/messages/parser/navigator/utils/NavigatorSearchResultList.ts new file mode 100644 index 0000000..b96c83d --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/utils/NavigatorSearchResultList.ts @@ -0,0 +1,84 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { RoomDataParser } from '../../room'; + +export class NavigatorSearchResultList +{ + private _code: string; + private _data: string; + private _action: number; + private _closed: boolean; + private _mode: number; + private _rooms: RoomDataParser[]; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this.flush(); + this.parse(wrapper); + } + + public flush(): boolean + { + this._code = null; + this._data = null; + this._action = -1; + this._closed = false; + this._mode = -1; + this._rooms = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._code = wrapper.readString(); + this._data = wrapper.readString(); + this._action = wrapper.readInt(); + this._closed = wrapper.readBoolean(); + this._mode = wrapper.readInt(); + + let totalRooms = wrapper.readInt(); + + while(totalRooms > 0) + { + this._rooms.push(new RoomDataParser(wrapper)); + + totalRooms--; + } + + return true; + } + + public get code(): string + { + return this._code; + } + + public get data(): string + { + return this._data; + } + + public get action(): number + { + return this._action; + } + + public get closed(): boolean + { + return this._closed; + } + + public get mode(): number + { + return this._mode; + } + + public get rooms(): RoomDataParser[] + { + return this._rooms; + } +} diff --git a/packages/communication/src/messages/parser/navigator/utils/NavigatorSearchResultSet.ts b/packages/communication/src/messages/parser/navigator/utils/NavigatorSearchResultSet.ts new file mode 100644 index 0000000..301f723 --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/utils/NavigatorSearchResultSet.ts @@ -0,0 +1,60 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { NavigatorSearchResultList } from './NavigatorSearchResultList'; + +export class NavigatorSearchResultSet +{ + private _code: string; + private _data: string; + private _results: NavigatorSearchResultList[]; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this.flush(); + this.parse(wrapper); + } + + public flush(): boolean + { + this._code = null; + this._data = null; + this._results = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._code = wrapper.readString(); + this._data = wrapper.readString(); + + let totalResults = wrapper.readInt(); + + while(totalResults > 0) + { + this._results.push(new NavigatorSearchResultList(wrapper)); + + totalResults--; + } + + return true; + } + + public get code(): string + { + return this._code; + } + + public get data(): string + { + return this._data; + } + + public get results(): NavigatorSearchResultList[] + { + return this._results; + } +} diff --git a/packages/communication/src/messages/parser/navigator/utils/NavigatorTopLevelContext.ts b/packages/communication/src/messages/parser/navigator/utils/NavigatorTopLevelContext.ts new file mode 100644 index 0000000..7c8b6ef --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/utils/NavigatorTopLevelContext.ts @@ -0,0 +1,52 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { NavigatorSavedSearch } from './NavigatorSavedSearch'; + +export class NavigatorTopLevelContext +{ + private _code: string; + private _savedSearches: NavigatorSavedSearch[]; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this.flush(); + this.parse(wrapper); + } + + public flush(): boolean + { + this._code = null; + this._savedSearches = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._code = wrapper.readString(); + + let totalSavedSearches = wrapper.readInt(); + + while(totalSavedSearches > 0) + { + this._savedSearches.push(new NavigatorSavedSearch(wrapper)); + + totalSavedSearches--; + } + + return true; + } + + public get code(): string + { + return this._code; + } + + public get savedSearches(): NavigatorSavedSearch[] + { + return this._savedSearches; + } +} diff --git a/packages/communication/src/messages/parser/navigator/utils/OfficialRoomEntryData.ts b/packages/communication/src/messages/parser/navigator/utils/OfficialRoomEntryData.ts new file mode 100644 index 0000000..e96b601 --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/utils/OfficialRoomEntryData.ts @@ -0,0 +1,148 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { RoomDataParser } from '../../room'; + +export class OfficialRoomEntryData +{ + public static readonly TYPE_TAG = 1; + public static readonly TYPE_GUEST_ROOM = 2; + public static readonly TYPE_FOLDER = 4; + + private _index: number; + private _popupCaption: string; + private _popupDesc: string; + private _showDetails: boolean; + private _picText: string; + private _picRef: string; + private _folderId: number; + private _userCount: number; + private _type: number; + private _tag: string; + private _guestRoomData: RoomDataParser; + private _open: boolean; + private _disposed: boolean; + + constructor(k: IMessageDataWrapper) + { + this._index = k.readInt(); + this._popupCaption = k.readString(); + this._popupDesc = k.readString(); + this._showDetails = k.readInt() == 1; + this._picText = k.readString(); + this._picRef = k.readString(); + this._folderId = k.readInt(); + this._userCount = k.readInt(); + this._type = k.readInt(); + if(this._type == OfficialRoomEntryData.TYPE_TAG) + { + this._tag = k.readString(); + } + else + { + if(this._type == OfficialRoomEntryData.TYPE_GUEST_ROOM) + { + this._guestRoomData = new RoomDataParser(k); + } + else + { + this._open = k.readBoolean(); + } + } + } + + public dispose(): void + { + if(this._disposed) + { + return; + } + this._disposed = true; + if(this._guestRoomData != null) + { + this._guestRoomData.flush(); + this._guestRoomData = null; + } + } + + public get disposed(): boolean + { + return this._disposed; + } + + public get type(): number + { + return this._type; + } + + public get index(): number + { + return this._index; + } + + public get popupCaption(): string + { + return this._popupCaption; + } + + public get popupDesc(): string + { + return this._popupDesc; + } + + public get showDetails(): boolean + { + return this._showDetails; + } + + public get picText(): string + { + return this._picText; + } + + public get picRef(): string + { + return this._picRef; + } + + public get folderId(): number + { + return this._folderId; + } + + public get tag(): string + { + return this._tag; + } + + public get userCount(): number + { + return this._userCount; + } + + public get guestRoomData(): RoomDataParser + { + return this._guestRoomData; + } + + public get open(): boolean + { + return this._open; + } + + public toggleOpen(): void + { + this._open = !this._open; + } + + public get maxUsers(): number + { + if(this.type == OfficialRoomEntryData.TYPE_TAG) + { + return 0; + } + if(this.type == OfficialRoomEntryData.TYPE_GUEST_ROOM) + { + return this._guestRoomData.maxUserCount; + } + return 0; + } +} diff --git a/packages/communication/src/messages/parser/navigator/utils/RoomEventData.ts b/packages/communication/src/messages/parser/navigator/utils/RoomEventData.ts new file mode 100644 index 0000000..2ae9ebd --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/utils/RoomEventData.ts @@ -0,0 +1,104 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class RoomEventData +{ + private _adId: number; + private _ownerAvatarId: number; + private _ownerAvatarName: string; + private _flatId: number; + private _categoryId: number; + private _eventType: number; + private _eventName: string; + private _eventDescription: string; + private _creationTime: string; + private _expirationDate: Date; + private _disposed: boolean; + + constructor(k: IMessageDataWrapper) + { + this._adId = k.readInt(); + this._ownerAvatarId = k.readInt(); + this._ownerAvatarName = k.readString(); + this._flatId = k.readInt(); + this._eventType = k.readInt(); + this._eventName = k.readString(); + this._eventDescription = k.readString(); + const _local_2 = k.readInt(); + const _local_3 = k.readInt(); + const _local_4: Date = new Date(); + let _local_5 = _local_4.getTime(); + const _local_6 = ((_local_2 * 60) * 1000); + _local_5 = (_local_5 - _local_6); + const _local_7: Date = new Date(_local_5); + this._creationTime = ((((((((_local_7.getDate() + '-') + _local_7.getMonth()) + '-') + _local_7.getFullYear()) + ' ') + _local_7.getHours()) + ':') + _local_7.getMinutes()); + let _local_8 = _local_4.getTime(); + const _local_9 = ((_local_3 * 60) * 1000); + _local_8 = (_local_8 + _local_9); + this._expirationDate = new Date(_local_8); + this._categoryId = k.readInt(); + } + + public dispose(): void + { + if(this._disposed) + { + return; + } + this._disposed = true; + } + + public get disposed(): boolean + { + return this._disposed; + } + + public get adId(): number + { + return this._adId; + } + + public get ownerAvatarId(): number + { + return this._ownerAvatarId; + } + + public get ownerAvatarName(): string + { + return this._ownerAvatarName; + } + + public get flatId(): number + { + return this._flatId; + } + + public get categoryId(): number + { + return this._categoryId; + } + + public get eventType(): number + { + return this._eventType; + } + + public get eventName(): string + { + return this._eventName; + } + + public get eventDescription(): string + { + return this._eventDescription; + } + + public get creationTime(): string + { + return this._creationTime; + } + + public get expirationDate(): Date + { + return this._expirationDate; + } +} diff --git a/packages/communication/src/messages/parser/navigator/utils/index.ts b/packages/communication/src/messages/parser/navigator/utils/index.ts new file mode 100644 index 0000000..7b9f182 --- /dev/null +++ b/packages/communication/src/messages/parser/navigator/utils/index.ts @@ -0,0 +1,9 @@ +export * from './CategoriesWithVisitorCountData'; +export * from './CompetitionRoomsData'; +export * from './GuestRoomSearchResultData'; +export * from './NavigatorSavedSearch'; +export * from './NavigatorSearchResultList'; +export * from './NavigatorSearchResultSet'; +export * from './NavigatorTopLevelContext'; +export * from './OfficialRoomEntryData'; +export * from './RoomEventData'; diff --git a/packages/communication/src/messages/parser/notifications/AchievementLevelUpData.ts b/packages/communication/src/messages/parser/notifications/AchievementLevelUpData.ts new file mode 100644 index 0000000..a22c736 --- /dev/null +++ b/packages/communication/src/messages/parser/notifications/AchievementLevelUpData.ts @@ -0,0 +1,93 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class AchievementLevelUpData +{ + private _type: number; + private _level: number; + private _points: number; + private _levelRewardPoints: number; + private _levelRewardPointType: number; + private _bonusPoints: number; + private _badgeId: number; + private _badgeCode: string = ''; + private _removedBadgeCode: string = ''; + private _achievementID: number; + private _category: string; + private _showDialogToUser: boolean; + + constructor(wrapper: IMessageDataWrapper) + { + this._type = wrapper.readInt(); + this._level = wrapper.readInt(); + this._badgeId = wrapper.readInt(); + this._badgeCode = wrapper.readString(); + this._points = wrapper.readInt(); + this._levelRewardPoints = wrapper.readInt(); + this._levelRewardPointType = wrapper.readInt(); + this._bonusPoints = wrapper.readInt(); + this._achievementID = wrapper.readInt(); + this._removedBadgeCode = wrapper.readString(); + this._category = wrapper.readString(); + this._showDialogToUser = wrapper.readBoolean(); + } + + public get type(): number + { + return this._type; + } + + public get level(): number + { + return this._level; + } + + public get points(): number + { + return this._points; + } + + public get levelRewardPoints(): number + { + return this._levelRewardPoints; + } + + public get levelRewardPointType(): number + { + return this._levelRewardPointType; + } + + public get bonusPoints(): number + { + return this._bonusPoints; + } + + public get badgeId(): number + { + return this._badgeId; + } + + public get badgeCode(): string + { + return this._badgeCode; + } + + public get removedBadgeCode(): string + { + return this._removedBadgeCode; + } + + public get achievementID(): number + { + return this._achievementID; + } + + public get category(): string + { + return this._category; + } + + public get showDialogToUser(): boolean + { + return this._showDialogToUser; + } +} diff --git a/packages/communication/src/messages/parser/notifications/AchievementNotificationMessageParser.ts b/packages/communication/src/messages/parser/notifications/AchievementNotificationMessageParser.ts new file mode 100644 index 0000000..2ece3e6 --- /dev/null +++ b/packages/communication/src/messages/parser/notifications/AchievementNotificationMessageParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { AchievementLevelUpData } from './AchievementLevelUpData'; + +export class AchievementNotificationMessageParser implements IMessageParser +{ + private _data: AchievementLevelUpData; + + public flush(): boolean + { + this._data = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._data = new AchievementLevelUpData(wrapper); + + return true; + } + + public get data(): AchievementLevelUpData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/notifications/ActivityPointNotificationParser.ts b/packages/communication/src/messages/parser/notifications/ActivityPointNotificationParser.ts new file mode 100644 index 0000000..d2d777d --- /dev/null +++ b/packages/communication/src/messages/parser/notifications/ActivityPointNotificationParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ActivityPointNotificationParser implements IMessageParser +{ + private _amount: number; + private _amountChanged: number; + private _type: number; + + public flush(): boolean + { + this._amount = 0; + this._amountChanged = 0; + this._type = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._amount = wrapper.readInt(); + this._amountChanged = wrapper.readInt(); + this._type = wrapper.readInt(); + + return true; + } + + public get amount(): number + { + return this._amount; + } + + public get amountChanged(): number + { + return this._amountChanged; + } + + public get type(): number + { + return this._type; + } +} diff --git a/packages/communication/src/messages/parser/notifications/BotErrorEventParser.ts b/packages/communication/src/messages/parser/notifications/BotErrorEventParser.ts new file mode 100644 index 0000000..c22f9f4 --- /dev/null +++ b/packages/communication/src/messages/parser/notifications/BotErrorEventParser.ts @@ -0,0 +1,26 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class BotErrorEventParser implements IMessageParser +{ + private _errorCode: number; + + public flush(): boolean + { + this._errorCode = -1; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._errorCode = wrapper.readInt(); + + return true; + } + + public get errorCode(): number + { + return this._errorCode; + } +} diff --git a/packages/communication/src/messages/parser/notifications/ClubGiftNotificationParser.ts b/packages/communication/src/messages/parser/notifications/ClubGiftNotificationParser.ts new file mode 100644 index 0000000..a027612 --- /dev/null +++ b/packages/communication/src/messages/parser/notifications/ClubGiftNotificationParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ClubGiftNotificationParser implements IMessageParser +{ + private _numGifts: number; + + public flush(): boolean + { + this._numGifts = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._numGifts = wrapper.readInt(); + + return true; + } + + public get numGifts(): number + { + return this._numGifts; + } +} diff --git a/packages/communication/src/messages/parser/notifications/ConnectionErrorMessageParser.ts b/packages/communication/src/messages/parser/notifications/ConnectionErrorMessageParser.ts new file mode 100644 index 0000000..8075593 --- /dev/null +++ b/packages/communication/src/messages/parser/notifications/ConnectionErrorMessageParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ConnectionErrorMessageParser implements IMessageParser +{ + private _errorCode: number; + private _messageId: number; + private _timestamp: string; + + public flush(): boolean + { + this._errorCode = 0; + this._messageId = 0; + this._timestamp = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._messageId = wrapper.readInt(); + this._errorCode = wrapper.readInt(); + this._timestamp = wrapper.readString(); + + return true; + } + + public get errorCode(): number + { + return this._errorCode; + } + + public get messageId(): number + { + return this._messageId; + } + + public get timestamp(): string + { + return this._timestamp; + } +} diff --git a/packages/communication/src/messages/parser/notifications/ElementPointerMessageParser.ts b/packages/communication/src/messages/parser/notifications/ElementPointerMessageParser.ts new file mode 100644 index 0000000..e2c97d4 --- /dev/null +++ b/packages/communication/src/messages/parser/notifications/ElementPointerMessageParser.ts @@ -0,0 +1,26 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ElementPointerMessageParser implements IMessageParser +{ + private _key: string; + + public flush(): boolean + { + this._key = null; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._key = wrapper.readString(); + + return true; + } + + public get key(): string + { + return this._key; + } +} diff --git a/packages/communication/src/messages/parser/notifications/HabboBroadcastMessageParser.ts b/packages/communication/src/messages/parser/notifications/HabboBroadcastMessageParser.ts new file mode 100644 index 0000000..6246122 --- /dev/null +++ b/packages/communication/src/messages/parser/notifications/HabboBroadcastMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class HabboBroadcastMessageParser implements IMessageParser +{ + private _message: string; + + public flush(): boolean + { + this._message = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._message = wrapper.readString(); + + return true; + } + + public get message(): string + { + return this._message; + } +} diff --git a/packages/communication/src/messages/parser/notifications/HotelWillShutdownParser.ts b/packages/communication/src/messages/parser/notifications/HotelWillShutdownParser.ts new file mode 100644 index 0000000..03a40c2 --- /dev/null +++ b/packages/communication/src/messages/parser/notifications/HotelWillShutdownParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class HotelWillShutdownParser implements IMessageParser +{ + private _minutes: number; + + public flush(): boolean + { + this._minutes = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._minutes = wrapper.readInt(); + + return true; + } + + public get minutes(): number + { + return this._minutes; + } +} diff --git a/packages/communication/src/messages/parser/notifications/InfoFeedEnableMessageParser.ts b/packages/communication/src/messages/parser/notifications/InfoFeedEnableMessageParser.ts new file mode 100644 index 0000000..47c6ef0 --- /dev/null +++ b/packages/communication/src/messages/parser/notifications/InfoFeedEnableMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class InfoFeedEnableMessageParser implements IMessageParser +{ + private _enabled: boolean; + + public flush(): boolean + { + this._enabled = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._enabled = wrapper.readBoolean(); + + return true; + } + + public get enabled(): boolean + { + return this._enabled; + } +} diff --git a/packages/communication/src/messages/parser/notifications/MOTDNotificationParser.ts b/packages/communication/src/messages/parser/notifications/MOTDNotificationParser.ts new file mode 100644 index 0000000..855dc9e --- /dev/null +++ b/packages/communication/src/messages/parser/notifications/MOTDNotificationParser.ts @@ -0,0 +1,34 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class MOTDNotificationParser implements IMessageParser +{ + private _messages: string[]; + + public flush(): boolean + { + this._messages = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalMessages = wrapper.readInt(); + + while(totalMessages > 0) + { + this._messages.push(wrapper.readString()); + + totalMessages--; + } + + return true; + } + + public get messages(): string[] + { + return this._messages; + } +} diff --git a/packages/communication/src/messages/parser/notifications/NotificationDialogMessageParser.ts b/packages/communication/src/messages/parser/notifications/NotificationDialogMessageParser.ts new file mode 100644 index 0000000..81009a4 --- /dev/null +++ b/packages/communication/src/messages/parser/notifications/NotificationDialogMessageParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class NotificationDialogMessageParser implements IMessageParser +{ + private _type: string; + private _parameters: Map; + + public flush(): boolean + { + this._type = null; + this._parameters = new Map(); + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._type = wrapper.readString(); + + let totalParameters = wrapper.readInt(); + + while(totalParameters > 0) + { + this._parameters.set(wrapper.readString(), wrapper.readString()); + + totalParameters--; + } + + return true; + } + + public get type(): string + { + return this._type; + } + + public get parameters(): Map + { + return this._parameters; + } +} diff --git a/packages/communication/src/messages/parser/notifications/OfferRewardDeliveredMessageParser.ts b/packages/communication/src/messages/parser/notifications/OfferRewardDeliveredMessageParser.ts new file mode 100644 index 0000000..81b9512 --- /dev/null +++ b/packages/communication/src/messages/parser/notifications/OfferRewardDeliveredMessageParser.ts @@ -0,0 +1,51 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class OfferRewardDeliveredMessageParser implements IMessageParser +{ + private _contentType: string; + private _classId: number; + private _name: string; + private _description: string; + + public flush(): boolean + { + this._contentType = null; + this._classId = 0; + this._name = null; + this._description = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._contentType = wrapper.readString(); + this._classId = wrapper.readInt(); + this._name = wrapper.readString(); + this._description = wrapper.readString(); + + return true; + } + + public get contentType(): string + { + return this._contentType; + } + + public get classId(): number + { + return this._classId; + } + + public get name(): string + { + return this._name; + } + + public get description(): string + { + return this._description; + } +} diff --git a/packages/communication/src/messages/parser/notifications/PetLevelNotificationParser.ts b/packages/communication/src/messages/parser/notifications/PetLevelNotificationParser.ts new file mode 100644 index 0000000..280771b --- /dev/null +++ b/packages/communication/src/messages/parser/notifications/PetLevelNotificationParser.ts @@ -0,0 +1,52 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { PetFigureDataParser } from '../inventory'; + +export class PetLevelNotificationParser implements IMessageParser +{ + private _petId: number; + private _petName: string; + private _level: number; + private _figureData: PetFigureDataParser; + + public flush(): boolean + { + this._petId = -1; + this._petName = null; + this._level = 0; + this._figureData = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._petId = wrapper.readInt(); + this._petName = wrapper.readString(); + this._level = wrapper.readInt(); + this._figureData = new PetFigureDataParser(wrapper); + + return true; + } + + public get petId(): number + { + return this._petId; + } + + public get petName(): string + { + return this._petName; + } + + public get level(): number + { + return this._level; + } + + public get figureData(): PetFigureDataParser + { + return this._figureData; + } +} diff --git a/packages/communication/src/messages/parser/notifications/PetPlacingErrorEventParser.ts b/packages/communication/src/messages/parser/notifications/PetPlacingErrorEventParser.ts new file mode 100644 index 0000000..66ee55a --- /dev/null +++ b/packages/communication/src/messages/parser/notifications/PetPlacingErrorEventParser.ts @@ -0,0 +1,26 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class PetPlacingErrorEventParser implements IMessageParser +{ + private _errorCode: number; + + public flush(): boolean + { + this._errorCode = -1; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._errorCode = wrapper.readInt(); + + return true; + } + + public get errorCode(): number + { + return this._errorCode; + } +} diff --git a/packages/communication/src/messages/parser/notifications/RestoreClientMessageParser.ts b/packages/communication/src/messages/parser/notifications/RestoreClientMessageParser.ts new file mode 100644 index 0000000..7f9e5be --- /dev/null +++ b/packages/communication/src/messages/parser/notifications/RestoreClientMessageParser.ts @@ -0,0 +1,14 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RestoreClientMessageParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + return true; + } +} diff --git a/packages/communication/src/messages/parser/notifications/SimpleAlertMessageParser.ts b/packages/communication/src/messages/parser/notifications/SimpleAlertMessageParser.ts new file mode 100644 index 0000000..8781898 --- /dev/null +++ b/packages/communication/src/messages/parser/notifications/SimpleAlertMessageParser.ts @@ -0,0 +1,37 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class SimpleAlertMessageParser implements IMessageParser +{ + private _alertMessage: string; + private _titleMessage: string; + + public flush(): boolean + { + this._alertMessage = null; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._alertMessage = wrapper.readString(); + + if(wrapper.bytesAvailable) + { + this._titleMessage = wrapper.readString(); + } + + return true; + } + + public get alertMessage(): string + { + return this._alertMessage; + } + + public get titleMessage(): string + { + return this._titleMessage; + } +} diff --git a/packages/communication/src/messages/parser/notifications/UnseenItemsParser.ts b/packages/communication/src/messages/parser/notifications/UnseenItemsParser.ts new file mode 100644 index 0000000..099019c --- /dev/null +++ b/packages/communication/src/messages/parser/notifications/UnseenItemsParser.ts @@ -0,0 +1,52 @@ +import { IAdvancedMap, IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { AdvancedMap } from '@nitrots/utils'; + +export class UnseenItemsParser implements IMessageParser +{ + private _items: IAdvancedMap; + + public flush(): boolean + { + this._items = new AdvancedMap(); + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalUnseen = wrapper.readInt(); + + while(totalUnseen > 0) + { + const category = wrapper.readInt(); + + let totalItems = wrapper.readInt(); + const itemIds: number[] = []; + + while(totalItems > 0) + { + itemIds.push(wrapper.readInt()); + + totalItems--; + } + + this._items.add(category, itemIds); + + totalUnseen--; + } + + return true; + } + + public getItemsByCategory(category: number): number[] + { + return this._items.getValue(category); + } + + public get categories(): number[] + { + return this._items.getKeys(); + } +} diff --git a/packages/communication/src/messages/parser/notifications/index.ts b/packages/communication/src/messages/parser/notifications/index.ts new file mode 100644 index 0000000..d22f38f --- /dev/null +++ b/packages/communication/src/messages/parser/notifications/index.ts @@ -0,0 +1,18 @@ +export * from './AchievementLevelUpData'; +export * from './AchievementNotificationMessageParser'; +export * from './ActivityPointNotificationParser'; +export * from './BotErrorEventParser'; +export * from './ClubGiftNotificationParser'; +export * from './ConnectionErrorMessageParser'; +export * from './ElementPointerMessageParser'; +export * from './HabboBroadcastMessageParser'; +export * from './HotelWillShutdownParser'; +export * from './InfoFeedEnableMessageParser'; +export * from './MOTDNotificationParser'; +export * from './NotificationDialogMessageParser'; +export * from './OfferRewardDeliveredMessageParser'; +export * from './PetLevelNotificationParser'; +export * from './PetPlacingErrorEventParser'; +export * from './RestoreClientMessageParser'; +export * from './SimpleAlertMessageParser'; +export * from './UnseenItemsParser'; diff --git a/packages/communication/src/messages/parser/nux/NewUserExperienceGiftOfferMessageParser.ts b/packages/communication/src/messages/parser/nux/NewUserExperienceGiftOfferMessageParser.ts new file mode 100644 index 0000000..d3e9a08 --- /dev/null +++ b/packages/communication/src/messages/parser/nux/NewUserExperienceGiftOfferMessageParser.ts @@ -0,0 +1,34 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { NewUserExperienceGiftOptions } from '../../incoming/nux'; + +export class NewUserExperienceGiftOfferMessageParser implements IMessageParser +{ + private _giftOptions: NewUserExperienceGiftOptions[]; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + const count = wrapper.readInt(); + this._giftOptions = []; + let index = 0; + + while(index < count) + { + this._giftOptions.push(new NewUserExperienceGiftOptions(wrapper)); + index++; + } + + return true; + } + + public get giftOptions(): NewUserExperienceGiftOptions[] + { + return this._giftOptions; + } +} diff --git a/packages/communication/src/messages/parser/nux/NewUserExperienceNotCompleteParser.ts b/packages/communication/src/messages/parser/nux/NewUserExperienceNotCompleteParser.ts new file mode 100644 index 0000000..d54b86b --- /dev/null +++ b/packages/communication/src/messages/parser/nux/NewUserExperienceNotCompleteParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class NewUserExperienceNotCompleteParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/nux/index.ts b/packages/communication/src/messages/parser/nux/index.ts new file mode 100644 index 0000000..0ebcd05 --- /dev/null +++ b/packages/communication/src/messages/parser/nux/index.ts @@ -0,0 +1,2 @@ +export * from './NewUserExperienceGiftOfferMessageParser'; +export * from './NewUserExperienceNotCompleteParser'; diff --git a/packages/communication/src/messages/parser/perk/PerkAllowancesMessageParser.ts b/packages/communication/src/messages/parser/perk/PerkAllowancesMessageParser.ts new file mode 100644 index 0000000..0aae0de --- /dev/null +++ b/packages/communication/src/messages/parser/perk/PerkAllowancesMessageParser.ts @@ -0,0 +1,52 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { PerkData } from './common'; + +export class PerkAllowancesMessageParser implements IMessageParser +{ + private _perks: PerkData[]; + + public flush(): boolean + { + this._perks = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._perks = []; + + const size: number = wrapper.readInt(); + + for(let i = 0; i < size; i++) this._perks.push(new PerkData( + wrapper.readString(), + wrapper.readString(), + wrapper.readBoolean() + )); + + return true; + } + + public isAllowed(perkCode: string): boolean + { + let allowed = false; + + for(const perk of this._perks) + { + if(perk.code === perkCode) + { + allowed = perk.isAllowed; + break; + } + } + + return allowed; + } + + public get perks(): PerkData[] + { + return this._perks; + } +} diff --git a/packages/communication/src/messages/parser/perk/common/PerkData.ts b/packages/communication/src/messages/parser/perk/common/PerkData.ts new file mode 100644 index 0000000..61ef542 --- /dev/null +++ b/packages/communication/src/messages/parser/perk/common/PerkData.ts @@ -0,0 +1,28 @@ +export class PerkData +{ + private _code: string; + private _errorMessage: string; + private _isAllowed: boolean; + + constructor(code: string, errorMessage: string, isAllowed: boolean) + { + this._code = code; + this._errorMessage = errorMessage; + this._isAllowed = isAllowed; + } + + public get code(): string + { + return this._code; + } + + public get errorMessage(): string + { + return this._errorMessage; + } + + public get isAllowed(): boolean + { + return this._isAllowed; + } +} diff --git a/packages/communication/src/messages/parser/perk/common/PerkEnum.ts b/packages/communication/src/messages/parser/perk/common/PerkEnum.ts new file mode 100644 index 0000000..454eee9 --- /dev/null +++ b/packages/communication/src/messages/parser/perk/common/PerkEnum.ts @@ -0,0 +1,15 @@ +export class PerkEnum +{ + public static USE_GUIDE_TOOL: string = 'USE_GUIDE_TOOL'; + public static GIVE_GUIDE_TOUR: string = 'GIVE_GUIDE_TOUR'; + public static JUDGE_CHAT_REVIEWS: string = 'JUDGE_CHAT_REVIEWS'; + public static VOTE_IN_COMPETITIONS: string = 'VOTE_IN_COMPETITIONS'; + public static CALL_ON_HELPERS: string = 'CALL_ON_HELPERS'; + public static CITIZEN: string = 'CITIZEN'; + public static TRADE: string = 'TRADE'; + public static HEIGHTMAP_EDITOR_BETA: string = 'HEIGHTMAP_EDITOR_BETA'; + public static BUILDER_AT_WORK: string = 'BUILDER_AT_WORK'; + public static NAVIGATOR_ROOM_THUMBNAIL_CAMERA: string = 'NAVIGATOR_ROOM_THUMBNAIL_CAMERA'; + public static CAMERA: string = 'CAMERA'; + public static MOUSE_ZOOM: string = 'MOUSE_ZOOM'; +} diff --git a/packages/communication/src/messages/parser/perk/common/index.ts b/packages/communication/src/messages/parser/perk/common/index.ts new file mode 100644 index 0000000..a617073 --- /dev/null +++ b/packages/communication/src/messages/parser/perk/common/index.ts @@ -0,0 +1,2 @@ +export * from './PerkData'; +export * from './PerkEnum'; diff --git a/packages/communication/src/messages/parser/perk/index.ts b/packages/communication/src/messages/parser/perk/index.ts new file mode 100644 index 0000000..598feef --- /dev/null +++ b/packages/communication/src/messages/parser/perk/index.ts @@ -0,0 +1,2 @@ +export * from './common'; +export * from './PerkAllowancesMessageParser'; diff --git a/packages/communication/src/messages/parser/pet/OpenPetPackageRequestedMessageParser.ts b/packages/communication/src/messages/parser/pet/OpenPetPackageRequestedMessageParser.ts new file mode 100644 index 0000000..30b7421 --- /dev/null +++ b/packages/communication/src/messages/parser/pet/OpenPetPackageRequestedMessageParser.ts @@ -0,0 +1,36 @@ +import { IMessageDataWrapper, IMessageParser, PetFigureData } from '@nitrots/api'; + +export class OpenPetPackageRequestedMessageParser implements IMessageParser +{ + private _objectId: number; + private _figureData: PetFigureData; + + flush(): boolean + { + this._objectId = -1; + this._figureData = null; + + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._objectId = wrapper.readInt(); + + if(!wrapper.bytesAvailable) return true; + + this._figureData = new PetFigureData(wrapper.readString()); + + return true; + } + + public get objectId(): number + { + return this._objectId; + } + + public get figureData(): PetFigureData + { + return this._figureData; + } +} diff --git a/packages/communication/src/messages/parser/pet/OpenPetPackageResultMessageParser.ts b/packages/communication/src/messages/parser/pet/OpenPetPackageResultMessageParser.ts new file mode 100644 index 0000000..38f8c35 --- /dev/null +++ b/packages/communication/src/messages/parser/pet/OpenPetPackageResultMessageParser.ts @@ -0,0 +1,41 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class OpenPetPackageResultMessageParser implements IMessageParser +{ + private _objectId: number; + private _nameValidationStatus: number; + private _nameValidationInfo: string; + + flush(): boolean + { + this._objectId = 0; + this._nameValidationStatus = 0; + this._nameValidationInfo = null; + + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._objectId = wrapper.readInt(); + this._nameValidationStatus = wrapper.readInt(); + this._nameValidationInfo = wrapper.readString(); + + return true; + } + + public get objectId(): number + { + return this._objectId; + } + + public get nameValidationStatus(): number + { + return this._nameValidationStatus; + } + + public get nameValidationInfo(): string + { + return this._nameValidationInfo; + } +} diff --git a/packages/communication/src/messages/parser/pet/PetLevelUpdateMessageParser.ts b/packages/communication/src/messages/parser/pet/PetLevelUpdateMessageParser.ts new file mode 100644 index 0000000..52107f0 --- /dev/null +++ b/packages/communication/src/messages/parser/pet/PetLevelUpdateMessageParser.ts @@ -0,0 +1,41 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class PetLevelUpdateMessageParser implements IMessageParser +{ + private _roomIndex: number; + private _petId: number; + private _level: number; + + flush(): boolean + { + this._roomIndex = -1; + this._petId = -1; + this._level = -1; + + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._roomIndex = wrapper.readInt(); + this._petId = wrapper.readInt(); + this._level = wrapper.readInt(); + + return true; + } + + public get roomIndex(): number + { + return this._roomIndex; + } + + public get petId(): number + { + return this._petId; + } + + public get level(): number + { + return this._level; + } +} diff --git a/packages/communication/src/messages/parser/pet/PetScratchFailedMessageParser.ts b/packages/communication/src/messages/parser/pet/PetScratchFailedMessageParser.ts new file mode 100644 index 0000000..6633bd6 --- /dev/null +++ b/packages/communication/src/messages/parser/pet/PetScratchFailedMessageParser.ts @@ -0,0 +1,33 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class PetScratchFailedMessageParser implements IMessageParser +{ + private _currentAge: number; + private _requiredAge: number; + + flush(): boolean + { + this._currentAge = -1; + this._requiredAge = -1; + + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._currentAge = wrapper.readInt(); + this._requiredAge = wrapper.readInt(); + + return true; + } + + public get currentAge(): number + { + return this._currentAge; + } + + public get requiredAge(): number + { + return this._requiredAge; + } +} diff --git a/packages/communication/src/messages/parser/pet/PetTrainingMessageParser.ts b/packages/communication/src/messages/parser/pet/PetTrainingMessageParser.ts new file mode 100644 index 0000000..0918200 --- /dev/null +++ b/packages/communication/src/messages/parser/pet/PetTrainingMessageParser.ts @@ -0,0 +1,57 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class PetTrainingMessageParser implements IMessageParser +{ + private _petId: number; + private _commands: number[]; + private _enabledCommands: number[]; + + flush(): boolean + { + this._petId = -1; + this._commands = []; + this._enabledCommands = []; + + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._petId = wrapper.readInt(); + + let commands = wrapper.readInt(); + + while(commands > 0) + { + this._commands.push(wrapper.readInt()); + + commands--; + } + + let enabledCommands = wrapper.readInt(); + + while(enabledCommands > 0) + { + this._enabledCommands.push(wrapper.readInt()); + + enabledCommands--; + } + + return true; + } + + public get petId(): number + { + return this._petId; + } + + public get commands(): number[] + { + return this._commands; + } + + public get enabledCommands(): number[] + { + return this._enabledCommands; + } +} diff --git a/packages/communication/src/messages/parser/pet/index.ts b/packages/communication/src/messages/parser/pet/index.ts new file mode 100644 index 0000000..41e89ca --- /dev/null +++ b/packages/communication/src/messages/parser/pet/index.ts @@ -0,0 +1,5 @@ +export * from './OpenPetPackageRequestedMessageParser'; +export * from './OpenPetPackageResultMessageParser'; +export * from './PetLevelUpdateMessageParser'; +export * from './PetScratchFailedMessageParser'; +export * from './PetTrainingMessageParser'; diff --git a/packages/communication/src/messages/parser/poll/PollChoice.ts b/packages/communication/src/messages/parser/poll/PollChoice.ts new file mode 100644 index 0000000..ccf9612 --- /dev/null +++ b/packages/communication/src/messages/parser/poll/PollChoice.ts @@ -0,0 +1,45 @@ +import { IPollChoice } from '@nitrots/api'; + +export class PollChoice implements IPollChoice +{ + private _value: string; + private _choiceText: string; + private _choiceType: number; + + constructor(value: string, choiceText: string, choiceType: number) + { + this._value = value; + this._choiceText = choiceText; + this._choiceType = choiceType; + } + + public get value(): string + { + return this._value; + } + + public set value(value: string) + { + this._value = value; + } + + public get choiceText(): string + { + return this._choiceText; + } + + public set choiceText(choiceText: string) + { + this._choiceText = choiceText; + } + + public get choiceType(): number + { + return this._choiceType; + } + + public set choiceType(choiceType: number) + { + this._choiceType = choiceType; + } +} diff --git a/packages/communication/src/messages/parser/poll/PollContentsParser.ts b/packages/communication/src/messages/parser/poll/PollContentsParser.ts new file mode 100644 index 0000000..c8f66dd --- /dev/null +++ b/packages/communication/src/messages/parser/poll/PollContentsParser.ts @@ -0,0 +1,98 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { PollChoice } from './PollChoice'; +import { PollQuestion } from './PollQuestion'; + +export class PollContentsParser implements IMessageParser +{ + private _id = -1; + private _startMessage = ''; + private _endMessage = ''; + private _numQuestions = 0; + private _questionArray: PollQuestion[] = []; + private _npsPoll = false; + + flush(): boolean + { + this._id = -1; + this._startMessage = ''; + this._endMessage = ''; + this._numQuestions = 0; + this._questionArray = []; + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._id = wrapper.readInt(); + this._startMessage = wrapper.readString(); + this._endMessage = wrapper.readString(); + this._numQuestions = wrapper.readInt(); + + for(let i = 0; i < this._numQuestions; i++) + { + const question = this.parsePollQuestion(wrapper); + const childrenCount = wrapper.readInt(); + + for(let j = 0; j < childrenCount; j++) + { + question.children.push(this.parsePollQuestion(wrapper)); + } + + this._questionArray.push(question); + } + + this._npsPoll = wrapper.readBoolean(); + return true; + } + + private parsePollQuestion(k: IMessageDataWrapper): PollQuestion + { + const pollQuestion = new PollQuestion(); + pollQuestion.questionId = k.readInt(); + pollQuestion.sortOrder = k.readInt(); + pollQuestion.questionType = k.readInt(); + pollQuestion.questionText = k.readString(); + pollQuestion.questionCategory = k.readInt(); + pollQuestion.questionAnswerType = k.readInt(); + pollQuestion.questionAnswerCount = k.readInt(); + if(((pollQuestion.questionType == 1) || (pollQuestion.questionType == 2))) + { + for(let i = 0; i < pollQuestion.questionAnswerCount; i++) + { + pollQuestion.questionChoices.push(new PollChoice(k.readString(), k.readString(), k.readInt())); + } + } + return pollQuestion; + } + + public get id(): number + { + return this._id; + } + + public get startMessage(): string + { + return this._startMessage; + } + + public get endMessage(): string + { + return this._endMessage; + } + + public get numQuestions(): number + { + return this._numQuestions; + } + + public get questionArray(): PollQuestion[] + { + return this._questionArray; + } + + public get npsPoll(): boolean + { + return this._npsPoll; + } + +} diff --git a/packages/communication/src/messages/parser/poll/PollErrorParser.ts b/packages/communication/src/messages/parser/poll/PollErrorParser.ts new file mode 100644 index 0000000..f15fed6 --- /dev/null +++ b/packages/communication/src/messages/parser/poll/PollErrorParser.ts @@ -0,0 +1,14 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class PollErrorParser implements IMessageParser +{ + flush(): boolean + { + throw true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + return true; + } +} diff --git a/packages/communication/src/messages/parser/poll/PollOfferParser.ts b/packages/communication/src/messages/parser/poll/PollOfferParser.ts new file mode 100644 index 0000000..bff1dfc --- /dev/null +++ b/packages/communication/src/messages/parser/poll/PollOfferParser.ts @@ -0,0 +1,46 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class PollOfferParser implements IMessageParser +{ + private _id = -1; + private _type = ''; + private _headline = ''; + private _summary = ''; + + flush(): boolean + { + this._id = -1; + this._type = ''; + this._summary = ''; + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._id = wrapper.readInt(); + this._type = wrapper.readString(); + this._headline = wrapper.readString(); + this._summary = wrapper.readString(); + return true; + } + + public get id(): number + { + return this._id; + } + + public get type(): string + { + return this._type; + } + + public get headline(): string + { + return this._headline; + } + + public get summary(): string + { + return this._summary; + } +} diff --git a/packages/communication/src/messages/parser/poll/PollQuestion.ts b/packages/communication/src/messages/parser/poll/PollQuestion.ts new file mode 100644 index 0000000..2e158f9 --- /dev/null +++ b/packages/communication/src/messages/parser/poll/PollQuestion.ts @@ -0,0 +1,111 @@ +import { IPollQuestion } from '@nitrots/api'; +import { PollChoice } from './PollChoice'; + +export class PollQuestion implements IPollQuestion +{ + private _questionId: number; + private _questionType: number; + private _sortOrder: number; + private _questionCategory: number; + private _questionText: string; + private _questionAnswerType: number; + private _questionAnswerCount: number; + private _children: PollQuestion[]; + private _questionChoices: PollChoice[]; + + constructor() + { + this._children = []; + this._questionChoices = []; + } + + public get questionId(): number + { + return this._questionId; + } + + public set questionId(questionId: number) + { + this._questionId = questionId; + } + + public get questionType(): number + { + return this._questionType; + } + + public set questionType(questionType: number) + { + this._questionType = questionType; + } + + public get sortOrder(): number + { + return this._sortOrder; + } + + public set sortOrder(sortOrder: number) + { + this._sortOrder = sortOrder; + } + + public get questionText(): string + { + return this._questionText; + } + + public set questionText(questionText: string) + { + this._questionText = questionText; + } + + public get questionCategory(): number + { + return this._questionCategory; + } + + public set questionCategory(questionCategory: number) + { + this._questionCategory = questionCategory; + } + + public get questionAnswerType(): number + { + return this._questionAnswerType; + } + + public set questionAnswerType(answerType: number) + { + this._questionAnswerType = answerType; + } + + public get questionAnswerCount(): number + { + return this._questionAnswerCount; + } + + public set questionAnswerCount(k: number) + { + this._questionAnswerCount = k; + } + + public get children(): PollQuestion[] + { + return this._children; + } + + public set children(children: PollQuestion[]) + { + this._children = children; + } + + public get questionChoices(): PollChoice[] + { + return this._questionChoices; + } + + public set questionChoices(k: PollChoice[]) + { + this._questionChoices = k; + } +} diff --git a/packages/communication/src/messages/parser/poll/QuestionAnsweredParser.ts b/packages/communication/src/messages/parser/poll/QuestionAnsweredParser.ts new file mode 100644 index 0000000..ebbcadd --- /dev/null +++ b/packages/communication/src/messages/parser/poll/QuestionAnsweredParser.ts @@ -0,0 +1,49 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class QuestionAnsweredParser implements IMessageParser +{ + private _userId: number; + private _value: string; + private _answerCounts: Map; + + flush(): boolean + { + this._userId = -1; + this._value = ''; + this._answerCounts = null; + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._userId = wrapper.readInt(); + this._value = wrapper.readString(); + this._answerCounts = new Map(); + + const count = wrapper.readInt(); + + for(let i = 0; i < count; i++) + { + const key = wrapper.readString(); + const value = wrapper.readInt(); + this._answerCounts.set(key, value); + } + return true; + } + + public get userId(): number + { + return this._userId; + } + + public get value(): string + { + return this._value; + } + + public get answerCounts(): Map + { + return this._answerCounts; + } + +} diff --git a/packages/communication/src/messages/parser/poll/QuestionFinishedParser.ts b/packages/communication/src/messages/parser/poll/QuestionFinishedParser.ts new file mode 100644 index 0000000..540c6c9 --- /dev/null +++ b/packages/communication/src/messages/parser/poll/QuestionFinishedParser.ts @@ -0,0 +1,39 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class QuestionFinishedParser implements IMessageParser +{ + private _questionId: number; + private _answerCounts: Map; + + flush(): boolean + { + this._questionId = -1; + this._answerCounts = null; + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._questionId = wrapper.readInt(); + this._answerCounts = new Map(); + const count = wrapper.readInt(); + + for(let i = 0; i < count; i++) + { + const key = wrapper.readString(); + const value = wrapper.readInt(); + this._answerCounts.set(key, value); + } + return true; + } + + public get questionId(): number + { + return this._questionId; + } + + public get answerCounts(): Map + { + return this._answerCounts; + } +} diff --git a/packages/communication/src/messages/parser/poll/QuestionParser.ts b/packages/communication/src/messages/parser/poll/QuestionParser.ts new file mode 100644 index 0000000..2bb19fe --- /dev/null +++ b/packages/communication/src/messages/parser/poll/QuestionParser.ts @@ -0,0 +1,77 @@ +import { IMessageDataWrapper, IMessageParser, IQuestion } from '@nitrots/api'; + +export class QuestionParser implements IMessageParser +{ + private _pollType: string = null; + private _pollId = -1; + private _questionId = -1; + private _duration = -1; + private _question: IQuestion = null; + + flush(): boolean + { + this._pollType = null; + this._pollId = -1; + this._questionId = -1; + this._duration = -1; + this._question = null; + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._pollType = wrapper.readString(); + this._pollId = wrapper.readInt(); + this._questionId = wrapper.readInt(); + this._duration = wrapper.readInt(); + + const questionId = wrapper.readInt(); + const questionNumber = wrapper.readInt(); + const questionType = wrapper.readInt(); + const questionContent = wrapper.readString(); + + this._question = { id: questionId, number: questionNumber, type: questionType, content: questionContent }; + + if(((this._question.type == 1) || (this._question.type == 2))) + { + this._question.selection_min = wrapper.readInt(); + const count = wrapper.readInt(); + this._question.selections = []; + this._question.selection_values = []; + this._question.selection_count = count; + this._question.selection_max = count; + + for(let i = 0; i < count; i++) + { + this._question.selection_values.push(wrapper.readString()); + this._question.selections.push(wrapper.readString()); + } + } + return true; + } + + public get pollType(): string + { + return this._pollType; + } + + public get pollId(): number + { + return this._pollId; + } + + public get questionId(): number + { + return this._questionId; + } + + public get duration(): number + { + return this._duration; + } + + public get question(): IQuestion + { + return this._question; + } +} diff --git a/packages/communication/src/messages/parser/poll/RoomPollDataParser.ts b/packages/communication/src/messages/parser/poll/RoomPollDataParser.ts new file mode 100644 index 0000000..bebbc25 --- /dev/null +++ b/packages/communication/src/messages/parser/poll/RoomPollDataParser.ts @@ -0,0 +1,41 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomPollDataParser implements IMessageParser +{ + private _question: string; + private _choices: string[]; + + flush(): boolean + { + this._question = null; + this._choices = []; + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._question = wrapper.readString(); + this._choices = []; + + const totalChoices = wrapper.readInt(); + let total = 0; + + while(total < totalChoices) + { + this._choices.push(wrapper.readString()); + total++; + } + + return true; + } + + public get question(): string + { + return this._question; + } + + public get choices(): string[] + { + return this._choices.slice(); + } +} diff --git a/packages/communication/src/messages/parser/poll/RoomPollResultParser.ts b/packages/communication/src/messages/parser/poll/RoomPollResultParser.ts new file mode 100644 index 0000000..ac19feb --- /dev/null +++ b/packages/communication/src/messages/parser/poll/RoomPollResultParser.ts @@ -0,0 +1,59 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomPollResultParser implements IMessageParser +{ + private _question: string; + private _choices: string[]; + private _SafeStr_7651: any[]; + private _SafeStr_7654: number; + + flush(): boolean + { + this._question = null; + this._choices = []; + this._SafeStr_7651 = []; + this._SafeStr_7654 = -1; + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._question = wrapper.readString(); + + this._choices = []; + this._SafeStr_7651 = []; + + let totalChoices = wrapper.readInt(); + + while(totalChoices > 0) + { + this._choices.push(wrapper.readString()); + this._SafeStr_7651.push(wrapper.readInt()); + + totalChoices--; + } + this._SafeStr_7654 = wrapper.readInt(); + + return true; + } + + public get question(): string + { + return this._question; + } + + public get choices(): string[] + { + return this._choices; + } + + public get SafeStr_7651(): any[] + { + return this._SafeStr_7651; + } + + public get SafeStr_7654(): number + { + return this._SafeStr_7654; + } +} diff --git a/packages/communication/src/messages/parser/poll/index.ts b/packages/communication/src/messages/parser/poll/index.ts new file mode 100644 index 0000000..efe3a4a --- /dev/null +++ b/packages/communication/src/messages/parser/poll/index.ts @@ -0,0 +1,10 @@ +export * from './PollChoice'; +export * from './PollContentsParser'; +export * from './PollErrorParser'; +export * from './PollOfferParser'; +export * from './PollQuestion'; +export * from './QuestionAnsweredParser'; +export * from './QuestionFinishedParser'; +export * from './QuestionParser'; +export * from './RoomPollResultParser'; +export * from './RoomPollDataParser'; diff --git a/packages/communication/src/messages/parser/quest/CommunityGoalData.ts b/packages/communication/src/messages/parser/quest/CommunityGoalData.ts new file mode 100644 index 0000000..aad88a9 --- /dev/null +++ b/packages/communication/src/messages/parser/quest/CommunityGoalData.ts @@ -0,0 +1,95 @@ +import { IDisposable, IMessageDataWrapper } from '@nitrots/api'; + +export class CommunityGoalData implements IDisposable +{ + private _hasGoalExpired: boolean; + private _personalContributionScore: number; + private _personalContributionRank: number; + private _communityTotalScore: number; + private _communityHighestAchievedLevel: number; + private _scoreRemainingUntilNextLevel: number; + private _percentCompletionTowardsNextLevel: number; + private _goalCode: string; + private _timeRemainingInSeconds: number; + private _rewardUserLimits: number[]; + + constructor(wrapper: IMessageDataWrapper) + { + this._rewardUserLimits = []; + this._hasGoalExpired = wrapper.readBoolean(); + this._personalContributionScore = wrapper.readInt(); + this._personalContributionRank = wrapper.readInt(); + this._communityTotalScore = wrapper.readInt(); + this._communityHighestAchievedLevel = wrapper.readInt(); + this._scoreRemainingUntilNextLevel = wrapper.readInt(); + this._percentCompletionTowardsNextLevel = wrapper.readInt(); + this._goalCode = wrapper.readString(); + this._timeRemainingInSeconds = wrapper.readInt(); + + const count = wrapper.readInt(); + for(let i = 0; i < count; i++) + { + this._rewardUserLimits.push(wrapper.readInt()); + } + } + + public dispose(): void + { + this._rewardUserLimits = null; + } + + public get disposed(): boolean + { + return this._rewardUserLimits == null; + } + + public get hasGoalExpired(): boolean + { + return this._hasGoalExpired; + } + + public get personalContributionScore(): number + { + return this._personalContributionScore; + } + + public get personalContributionRank(): number + { + return this._personalContributionRank; + } + + public get communityTotalScore(): number + { + return this._communityTotalScore; + } + + public get communityHighestAchievedLevel(): number + { + return this._communityHighestAchievedLevel; + } + + public get scoreRemainingUntilNextLevel(): number + { + return this._scoreRemainingUntilNextLevel; + } + + public get percentCompletionTowardsNextLevel(): number + { + return this._percentCompletionTowardsNextLevel; + } + + public get timeRemainingInSeconds(): number + { + return this._timeRemainingInSeconds; + } + + public get rewardUserLimits(): number[] + { + return this._rewardUserLimits; + } + + public get goalCode(): string + { + return this._goalCode; + } +} diff --git a/packages/communication/src/messages/parser/quest/CommunityGoalEarnedPrizesMessageParser.ts b/packages/communication/src/messages/parser/quest/CommunityGoalEarnedPrizesMessageParser.ts new file mode 100644 index 0000000..836bff9 --- /dev/null +++ b/packages/communication/src/messages/parser/quest/CommunityGoalEarnedPrizesMessageParser.ts @@ -0,0 +1,30 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { PrizeData } from './PrizeData'; + +export class CommunityGoalEarnedPrizesMessageParser implements IMessageParser +{ + private _prizes: PrizeData[]; + + public flush(): boolean + { + this._prizes = []; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + const count = wrapper.readInt(); + for(let i = 0; i < count; i++) + { + this._prizes.push(new PrizeData(wrapper)); + } + return true; + } + + public get prizes(): PrizeData[] + { + return this._prizes; + } +} diff --git a/packages/communication/src/messages/parser/quest/CommunityGoalHallOfFameData.ts b/packages/communication/src/messages/parser/quest/CommunityGoalHallOfFameData.ts new file mode 100644 index 0000000..9132de6 --- /dev/null +++ b/packages/communication/src/messages/parser/quest/CommunityGoalHallOfFameData.ts @@ -0,0 +1,41 @@ +import { IDisposable, IMessageDataWrapper } from '@nitrots/api'; +import { HallOfFameEntryData } from './HallOfFameEntryData'; + +export class CommunityGoalHallOfFameData implements IDisposable +{ + private _goalCode: string; + private _hof: HallOfFameEntryData[]; + + constructor(wrapper: IMessageDataWrapper) + { + this._hof = []; + this._goalCode = wrapper.readString(); + + const count = wrapper.readInt(); + + for(let i = 0; i < count; i++) + { + this._hof.push(new HallOfFameEntryData(wrapper)); + } + } + + public dispose(): void + { + this._hof = null; + } + + public get disposed(): boolean + { + return this._hof == null; + } + + public get hof(): HallOfFameEntryData[] + { + return this._hof; + } + + public get goalCode(): string + { + return this._goalCode; + } +} diff --git a/packages/communication/src/messages/parser/quest/CommunityGoalHallOfFameMessageParser.ts b/packages/communication/src/messages/parser/quest/CommunityGoalHallOfFameMessageParser.ts new file mode 100644 index 0000000..b65644c --- /dev/null +++ b/packages/communication/src/messages/parser/quest/CommunityGoalHallOfFameMessageParser.ts @@ -0,0 +1,26 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { CommunityGoalHallOfFameData } from './CommunityGoalHallOfFameData'; + +export class CommunityGoalHallOfFameMessageParser implements IMessageParser +{ + private _data: CommunityGoalHallOfFameData; + + public flush(): boolean + { + this._data = null; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._data = new CommunityGoalHallOfFameData(wrapper); + return true; + } + + public get data(): CommunityGoalHallOfFameData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/quest/CommunityGoalProgressMessageParser.ts b/packages/communication/src/messages/parser/quest/CommunityGoalProgressMessageParser.ts new file mode 100644 index 0000000..f2b866c --- /dev/null +++ b/packages/communication/src/messages/parser/quest/CommunityGoalProgressMessageParser.ts @@ -0,0 +1,26 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { CommunityGoalData } from './CommunityGoalData'; + +export class CommunityGoalProgressMessageParser implements IMessageParser +{ + private _data: CommunityGoalData; + + public flush(): boolean + { + this._data = null; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._data = new CommunityGoalData(wrapper); + return true; + } + + public get data(): CommunityGoalData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/quest/ConcurrentUsersGoalProgressMessageParser.ts b/packages/communication/src/messages/parser/quest/ConcurrentUsersGoalProgressMessageParser.ts new file mode 100644 index 0000000..2c9f1b7 --- /dev/null +++ b/packages/communication/src/messages/parser/quest/ConcurrentUsersGoalProgressMessageParser.ts @@ -0,0 +1,41 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ConcurrentUsersGoalProgressMessageParser implements IMessageParser +{ + private _state: number; + private _userCount: number; + private _userCountGoal: number; + + public flush(): boolean + { + this._state = -1; + this._userCount = -1; + this._userCountGoal = -1; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._state = wrapper.readInt(); + this._userCount = wrapper.readInt(); + this._userCountGoal = wrapper.readInt(); + return true; + } + + public get state(): number + { + return this._state; + } + + public get userCount(): number + { + return this._userCount; + } + + public get userCountGoal(): number + { + return this._userCountGoal; + } +} diff --git a/packages/communication/src/messages/parser/quest/EpicPopupMessageParser.ts b/packages/communication/src/messages/parser/quest/EpicPopupMessageParser.ts new file mode 100644 index 0000000..2feea55 --- /dev/null +++ b/packages/communication/src/messages/parser/quest/EpicPopupMessageParser.ts @@ -0,0 +1,25 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class EpicPopupMessageParser implements IMessageParser +{ + private _imageUri: string; + + public flush(): boolean + { + this._imageUri = ''; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._imageUri = wrapper.readString(); + return true; + } + + public get imageUri(): string + { + return this._imageUri; + } +} diff --git a/packages/communication/src/messages/parser/quest/HallOfFameEntryData.ts b/packages/communication/src/messages/parser/quest/HallOfFameEntryData.ts new file mode 100644 index 0000000..4d2d257 --- /dev/null +++ b/packages/communication/src/messages/parser/quest/HallOfFameEntryData.ts @@ -0,0 +1,45 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { ILandingPageUserEntry } from './ILandingPageUserEntry'; + +export class HallOfFameEntryData implements ILandingPageUserEntry +{ + private _userId: number; + private _userName: string; + private _figure: string; + private _rank: number; + private _currentScore: number; + + constructor(wrapper: IMessageDataWrapper) + { + this._userId = wrapper.readInt(); + this._userName = wrapper.readString(); + this._figure = wrapper.readString(); + this._rank = wrapper.readInt(); + this._currentScore = wrapper.readInt(); + } + + public get userId(): number + { + return this._userId; + } + + public get userName(): string + { + return this._userName; + } + + public get figure(): string + { + return this._figure; + } + + public get rank(): number + { + return this._rank; + } + + public get currentScore(): number + { + return this._currentScore; + } +} diff --git a/packages/communication/src/messages/parser/quest/ILandingPageUserEntry.ts b/packages/communication/src/messages/parser/quest/ILandingPageUserEntry.ts new file mode 100644 index 0000000..02362a8 --- /dev/null +++ b/packages/communication/src/messages/parser/quest/ILandingPageUserEntry.ts @@ -0,0 +1,6 @@ +export interface ILandingPageUserEntry +{ + userId: number; + userName: string; + figure: string; +} diff --git a/packages/communication/src/messages/parser/quest/PrizeData.ts b/packages/communication/src/messages/parser/quest/PrizeData.ts new file mode 100644 index 0000000..c3a5085 --- /dev/null +++ b/packages/communication/src/messages/parser/quest/PrizeData.ts @@ -0,0 +1,51 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class PrizeData +{ + private _communityGoalId: number; + private _communityGoalCode: string; + private _userRank: number; + private _rewardCode: string; + private _badge: boolean; + private _localizedName: string; + + constructor(k: IMessageDataWrapper) + { + this._communityGoalId = k.readInt(); + this._communityGoalCode = k.readString(); + this._userRank = k.readInt(); + this._rewardCode = k.readString(); + this._badge = k.readBoolean(); + this._localizedName = k.readString(); + } + + public get communityGoalId(): number + { + return this._communityGoalId; + } + + public get communityGoalCode(): string + { + return this._communityGoalCode; + } + + public get userRank(): number + { + return this._userRank; + } + + public get rewardCode(): string + { + return this._rewardCode; + } + + public get badge(): boolean + { + return this._badge; + } + + public get localizedName(): string + { + return this._localizedName; + } +} diff --git a/packages/communication/src/messages/parser/quest/QuestCancelledMessageParser.ts b/packages/communication/src/messages/parser/quest/QuestCancelledMessageParser.ts new file mode 100644 index 0000000..d9e729d --- /dev/null +++ b/packages/communication/src/messages/parser/quest/QuestCancelledMessageParser.ts @@ -0,0 +1,24 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class QuestCancelledMessageParser implements IMessageParser +{ + private _expired: boolean; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._expired = wrapper.readBoolean(); + return true; + } + + public get expired(): boolean + { + return this._expired; + } +} diff --git a/packages/communication/src/messages/parser/quest/QuestCompletedMessageParser.ts b/packages/communication/src/messages/parser/quest/QuestCompletedMessageParser.ts new file mode 100644 index 0000000..a6c5826 --- /dev/null +++ b/packages/communication/src/messages/parser/quest/QuestCompletedMessageParser.ts @@ -0,0 +1,33 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { QuestMessageData } from './QuestMessageData'; + +export class QuestCompletedMessageParser implements IMessageParser +{ + private _questData: QuestMessageData; + private _showDialog: boolean; + + public flush(): boolean + { + this._questData = null; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._questData = new QuestMessageData(wrapper); + this._showDialog = wrapper.readBoolean(); + return true; + } + + public get questData(): QuestMessageData + { + return this._questData; + } + + public get showDialog(): boolean + { + return this._showDialog; + } +} diff --git a/packages/communication/src/messages/parser/quest/QuestDailyMessageParser.ts b/packages/communication/src/messages/parser/quest/QuestDailyMessageParser.ts new file mode 100644 index 0000000..c2b14a9 --- /dev/null +++ b/packages/communication/src/messages/parser/quest/QuestDailyMessageParser.ts @@ -0,0 +1,44 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { QuestMessageData } from './QuestMessageData'; + +export class QuestDailyMessageParser implements IMessageParser +{ + private _quest: QuestMessageData; + private _easyQuestCount: number; + private _hardQuestCount: number; + + public flush(): boolean + { + this._quest = null; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + const _local_2 = wrapper.readBoolean(); + if(_local_2) + { + this._quest = new QuestMessageData(wrapper); + this._easyQuestCount = wrapper.readInt(); + this._hardQuestCount = wrapper.readInt(); + } + return true; + } + + public get quest(): QuestMessageData + { + return this._quest; + } + + public get easyQuestCount(): number + { + return this._easyQuestCount; + } + + public get hardQuestCount(): number + { + return this._hardQuestCount; + } +} diff --git a/packages/communication/src/messages/parser/quest/QuestMessageData.ts b/packages/communication/src/messages/parser/quest/QuestMessageData.ts new file mode 100644 index 0000000..98b4806 --- /dev/null +++ b/packages/communication/src/messages/parser/quest/QuestMessageData.ts @@ -0,0 +1,186 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class QuestMessageData +{ + private _campaignCode: string; + private _completedQuestsInCampaign: number; + private _questCountInCampaign: number; + private _activityPointType: number; + private _id: number; + private _accepted: boolean; + private _type: string; + private _imageVersion: string; + private _rewardCurrencyAmount: number; + private _localizationCode: string; + private _completedSteps: number; + private _totalSteps: number; + private _waitPeriodSeconds: number; + private _sortOrder: number; + private _catalogPageName: string; + private _chainCode: string; + private _easy: boolean; + private _receiveTime: Date; + + constructor(wrapper: IMessageDataWrapper) + { + this._receiveTime = new Date(); + this._campaignCode = wrapper.readString(); + this._completedQuestsInCampaign = wrapper.readInt(); + this._questCountInCampaign = wrapper.readInt(); + this._activityPointType = wrapper.readInt(); + this._id = wrapper.readInt(); + this._accepted = wrapper.readBoolean(); + this._type = wrapper.readString(); + this._imageVersion = wrapper.readString(); + this._rewardCurrencyAmount = wrapper.readInt(); + this._localizationCode = wrapper.readString(); + this._completedSteps = wrapper.readInt(); + this._totalSteps = wrapper.readInt(); + this._sortOrder = wrapper.readInt(); + this._catalogPageName = wrapper.readString(); + this._chainCode = wrapper.readString(); + this._easy = wrapper.readBoolean(); + } + + public static getCampaignLocalizationKeyForCode(k: string): string + { + return 'quests.' + k; + } + + public get campaignCode(): string + { + return this._campaignCode; + } + + public get localizationCode(): string + { + return this._localizationCode; + } + + public get completedQuestsInCampaign(): number + { + return this._completedQuestsInCampaign; + } + + public get questCountInCampaign(): number + { + return this._questCountInCampaign; + } + + public get activityPointType(): number + { + return this._activityPointType; + } + + public set accepted(k: boolean) + { + this._accepted = k; + } + + public get accepted(): boolean + { + return this._accepted; + } + + public set id(k: number) + { + this._id = k; + } + + public get id(): number + { + return this._id; + } + + public get type(): string + { + return this._type; + } + + public get imageVersion(): string + { + return this._imageVersion; + } + + public get rewardCurrencyAmount(): number + { + return this._rewardCurrencyAmount; + } + + public get completedSteps(): number + { + return this._completedSteps; + } + + public get totalSteps(): number + { + return this._totalSteps; + } + + public get isCompleted(): boolean + { + return this._completedSteps == this._totalSteps; + } + + public set waitPeriodSeconds(k: number) + { + this._waitPeriodSeconds = k; + } + + public get waitPeriodSeconds(): number + { + if(this._waitPeriodSeconds < 1) + { + return 0; + } + const k = new Date(); + const _local_2 = (k.getTime() - this._receiveTime.getTime()); + const _local_3 = Math.max(0, (this._waitPeriodSeconds - Math.floor((_local_2 / 1000)))); + return _local_3; + } + + public getCampaignLocalizationKey(): string + { + return QuestMessageData.getCampaignLocalizationKeyForCode(this.campaignCode); + } + + public getQuestLocalizationKey(): string + { + return (this.getCampaignLocalizationKey() + '.') + this._localizationCode; + } + + public get completedCampaign(): boolean + { + return this._id < 1; + } + + public get lastQuestInCampaign(): boolean + { + return this._completedQuestsInCampaign >= this._questCountInCampaign; + } + + public get receiveTime(): Date + { + return this._receiveTime; + } + + public get sortOrder(): number + { + return this._sortOrder; + } + + public get catalogPageName(): string + { + return this._catalogPageName; + } + + public get chainCode(): string + { + return this._chainCode; + } + + public get easy(): boolean + { + return this._easy; + } +} diff --git a/packages/communication/src/messages/parser/quest/QuestMessageParser.ts b/packages/communication/src/messages/parser/quest/QuestMessageParser.ts new file mode 100644 index 0000000..851ebb9 --- /dev/null +++ b/packages/communication/src/messages/parser/quest/QuestMessageParser.ts @@ -0,0 +1,26 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { QuestMessageData } from './QuestMessageData'; + +export class QuestMessageParser implements IMessageParser +{ + private _quest: QuestMessageData; + + public flush(): boolean + { + this._quest = null; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._quest = new QuestMessageData(wrapper); + return true; + } + + public get quest(): QuestMessageData + { + return this._quest; + } +} diff --git a/packages/communication/src/messages/parser/quest/QuestsMessageParser.ts b/packages/communication/src/messages/parser/quest/QuestsMessageParser.ts new file mode 100644 index 0000000..c87cf82 --- /dev/null +++ b/packages/communication/src/messages/parser/quest/QuestsMessageParser.ts @@ -0,0 +1,40 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { QuestMessageData } from './QuestMessageData'; + +export class QuestsMessageParser implements IMessageParser +{ + private _quests: QuestMessageData[]; + private _openWindow: boolean; + + + public flush(): boolean + { + this._quests = []; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + const count = wrapper.readInt(); + + for(let i = 0; i < count; i++) + { + this._quests.push(new QuestMessageData(wrapper)); + } + + this._openWindow = wrapper.readBoolean(); + return true; + } + + public get quests(): QuestMessageData[] + { + return this._quests; + } + + public get openWindow(): boolean + { + return this._openWindow; + } +} diff --git a/packages/communication/src/messages/parser/quest/SeasonalQuestsParser.ts b/packages/communication/src/messages/parser/quest/SeasonalQuestsParser.ts new file mode 100644 index 0000000..a658469 --- /dev/null +++ b/packages/communication/src/messages/parser/quest/SeasonalQuestsParser.ts @@ -0,0 +1,32 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { QuestMessageData } from './QuestMessageData'; + +export class SeasonalQuestsParser implements IMessageParser +{ + private _quests: QuestMessageData[]; + + public flush(): boolean + { + this._quests = []; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + const count = wrapper.readInt(); + + for(let i = 0; i < count; i++) + { + this._quests.push(new QuestMessageData(wrapper)); + } + + return true; + } + + public get quests(): QuestMessageData[] + { + return this._quests; + } +} diff --git a/packages/communication/src/messages/parser/quest/index.ts b/packages/communication/src/messages/parser/quest/index.ts new file mode 100644 index 0000000..1185da4 --- /dev/null +++ b/packages/communication/src/messages/parser/quest/index.ts @@ -0,0 +1,17 @@ +export * from './CommunityGoalData'; +export * from './CommunityGoalEarnedPrizesMessageParser'; +export * from './CommunityGoalHallOfFameData'; +export * from './CommunityGoalHallOfFameMessageParser'; +export * from './CommunityGoalProgressMessageParser'; +export * from './ConcurrentUsersGoalProgressMessageParser'; +export * from './EpicPopupMessageParser'; +export * from './HallOfFameEntryData'; +export * from './ILandingPageUserEntry'; +export * from './PrizeData'; +export * from './QuestCancelledMessageParser'; +export * from './QuestCompletedMessageParser'; +export * from './QuestDailyMessageParser'; +export * from './QuestMessageData'; +export * from './QuestMessageParser'; +export * from './QuestsMessageParser'; +export * from './SeasonalQuestsParser'; diff --git a/packages/communication/src/messages/parser/recycler/RecyclerFinishedMessageParser.ts b/packages/communication/src/messages/parser/recycler/RecyclerFinishedMessageParser.ts new file mode 100644 index 0000000..4d366de --- /dev/null +++ b/packages/communication/src/messages/parser/recycler/RecyclerFinishedMessageParser.ts @@ -0,0 +1,34 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RecyclerFinishedMessageParser implements IMessageParser +{ + private _recyclerFinishedStatus: number; + private _prizeId: number; + + public flush(): boolean + { + this._recyclerFinishedStatus = -1; + this._prizeId = 0; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._recyclerFinishedStatus = wrapper.readInt(); + this._prizeId = wrapper.readInt(); + + return true; + } + + public get recyclerFinishedStatus(): number + { + return this._recyclerFinishedStatus; + } + + public get prizeId(): number + { + return this._prizeId; + } +} diff --git a/packages/communication/src/messages/parser/recycler/RecyclerStatusMessageParser.ts b/packages/communication/src/messages/parser/recycler/RecyclerStatusMessageParser.ts new file mode 100644 index 0000000..15aed28 --- /dev/null +++ b/packages/communication/src/messages/parser/recycler/RecyclerStatusMessageParser.ts @@ -0,0 +1,34 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RecyclerStatusMessageParser implements IMessageParser +{ + private _recyclerStatus: number; + private _recyclerTimeoutSeconds: number; + + public flush(): boolean + { + this._recyclerStatus = -1; + this._recyclerTimeoutSeconds = 0; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._recyclerStatus = wrapper.readInt(); + this._recyclerTimeoutSeconds = wrapper.readInt(); + + return true; + } + + public get recyclerStatus(): number + { + return this._recyclerStatus; + } + + public get recyclerTimeoutSeconds(): number + { + return this._recyclerTimeoutSeconds; + } +} diff --git a/packages/communication/src/messages/parser/recycler/index.ts b/packages/communication/src/messages/parser/recycler/index.ts new file mode 100644 index 0000000..8fbc648 --- /dev/null +++ b/packages/communication/src/messages/parser/recycler/index.ts @@ -0,0 +1,2 @@ +export * from './RecyclerFinishedMessageParser'; +export * from './RecyclerStatusMessageParser'; diff --git a/packages/communication/src/messages/parser/room/access/CantConnectMessageParser.ts b/packages/communication/src/messages/parser/room/access/CantConnectMessageParser.ts new file mode 100644 index 0000000..b7c6c70 --- /dev/null +++ b/packages/communication/src/messages/parser/room/access/CantConnectMessageParser.ts @@ -0,0 +1,40 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CantConnectMessageParser implements IMessageParser +{ + public static REASON_FULL: number = 1; + public static REASON_CLOSED: number = 2; + public static REASON_QUEUE_ERROR: number = 3; + public static REASON_BANNED: number = 4; + + private _reason: number; + private _parameter: string; + + public flush(): boolean + { + this._reason = 0; + this._parameter = ''; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._reason = wrapper.readInt(); + this._parameter = wrapper.readString(); + + return true; + } + + public get reason(): number + { + return this._reason; + } + + public get parameter(): string + { + return this._parameter; + } +} diff --git a/packages/communication/src/messages/parser/room/access/RoomEnterParser.ts b/packages/communication/src/messages/parser/room/access/RoomEnterParser.ts new file mode 100644 index 0000000..0f0e892 --- /dev/null +++ b/packages/communication/src/messages/parser/room/access/RoomEnterParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomEnterParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/room/access/RoomFowardParser.ts b/packages/communication/src/messages/parser/room/access/RoomFowardParser.ts new file mode 100644 index 0000000..1b09136 --- /dev/null +++ b/packages/communication/src/messages/parser/room/access/RoomFowardParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomFowardParser implements IMessageParser +{ + private _roomId: number; + + public flush(): boolean + { + this._roomId = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomId = wrapper.readInt(); + + return true; + } + + public get roomId(): number + { + return this._roomId; + } +} diff --git a/packages/communication/src/messages/parser/room/access/doorbell/RoomDoorbellAcceptedParser.ts b/packages/communication/src/messages/parser/room/access/doorbell/RoomDoorbellAcceptedParser.ts new file mode 100644 index 0000000..2b4d825 --- /dev/null +++ b/packages/communication/src/messages/parser/room/access/doorbell/RoomDoorbellAcceptedParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomDoorbellAcceptedParser implements IMessageParser +{ + private _userName: string; + + public flush(): boolean + { + this._userName = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._userName = wrapper.readString(); + + return true; + } + + public get userName(): string + { + return this._userName; + } +} diff --git a/packages/communication/src/messages/parser/room/access/doorbell/index.ts b/packages/communication/src/messages/parser/room/access/doorbell/index.ts new file mode 100644 index 0000000..bc56d17 --- /dev/null +++ b/packages/communication/src/messages/parser/room/access/doorbell/index.ts @@ -0,0 +1 @@ +export * from './RoomDoorbellAcceptedParser'; diff --git a/packages/communication/src/messages/parser/room/access/index.ts b/packages/communication/src/messages/parser/room/access/index.ts new file mode 100644 index 0000000..90158a7 --- /dev/null +++ b/packages/communication/src/messages/parser/room/access/index.ts @@ -0,0 +1,5 @@ +export * from './CantConnectMessageParser'; +export * from './doorbell'; +export * from './rights'; +export * from './RoomEnterParser'; +export * from './RoomFowardParser'; diff --git a/packages/communication/src/messages/parser/room/access/rights/RoomRightsClearParser.ts b/packages/communication/src/messages/parser/room/access/rights/RoomRightsClearParser.ts new file mode 100644 index 0000000..12823ba --- /dev/null +++ b/packages/communication/src/messages/parser/room/access/rights/RoomRightsClearParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomRightsClearParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/room/access/rights/RoomRightsOwnerParser.ts b/packages/communication/src/messages/parser/room/access/rights/RoomRightsOwnerParser.ts new file mode 100644 index 0000000..be0ca3b --- /dev/null +++ b/packages/communication/src/messages/parser/room/access/rights/RoomRightsOwnerParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomRightsOwnerParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/room/access/rights/RoomRightsParser.ts b/packages/communication/src/messages/parser/room/access/rights/RoomRightsParser.ts new file mode 100644 index 0000000..5e5b541 --- /dev/null +++ b/packages/communication/src/messages/parser/room/access/rights/RoomRightsParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser, RoomControllerLevel } from '@nitrots/api'; + +export class RoomRightsParser implements IMessageParser +{ + private _controllerLevel: number; + + public flush(): boolean + { + this._controllerLevel = RoomControllerLevel.NONE; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._controllerLevel = wrapper.readInt(); + + return true; + } + + public get controllerLevel(): number + { + return this._controllerLevel; + } +} diff --git a/packages/communication/src/messages/parser/room/access/rights/index.ts b/packages/communication/src/messages/parser/room/access/rights/index.ts new file mode 100644 index 0000000..e5a319d --- /dev/null +++ b/packages/communication/src/messages/parser/room/access/rights/index.ts @@ -0,0 +1,3 @@ +export * from './RoomRightsClearParser'; +export * from './RoomRightsOwnerParser'; +export * from './RoomRightsParser'; diff --git a/packages/communication/src/messages/parser/room/bots/BotCommandConfigurationParser.ts b/packages/communication/src/messages/parser/room/bots/BotCommandConfigurationParser.ts new file mode 100644 index 0000000..ee3dc82 --- /dev/null +++ b/packages/communication/src/messages/parser/room/bots/BotCommandConfigurationParser.ts @@ -0,0 +1,42 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class BotCommandConfigurationParser implements IMessageParser +{ + private _botId: number; + private _commandId: number; + private _data: string; + + public flush(): boolean + { + this._botId = -1; + this._commandId = -1; + this._data = ''; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._botId = wrapper.readInt(); + this._commandId = wrapper.readInt(); + this._data = wrapper.readString(); + + return true; + } + + public get botId(): number + { + return this._botId; + } + public get commandId(): number + { + return this._commandId; + } + + public get data(): string + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/room/bots/BotForceOpenContextMenuParser.ts b/packages/communication/src/messages/parser/room/bots/BotForceOpenContextMenuParser.ts new file mode 100644 index 0000000..402ec9f --- /dev/null +++ b/packages/communication/src/messages/parser/room/bots/BotForceOpenContextMenuParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class BotForceOpenContextMenuParser implements IMessageParser +{ + private _botId: number; + + public flush(): boolean + { + this._botId = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._botId = wrapper.readInt(); + + return true; + } + + public get botId(): number + { + return this._botId; + } +} diff --git a/packages/communication/src/messages/parser/room/bots/BotSkillData.ts b/packages/communication/src/messages/parser/room/bots/BotSkillData.ts new file mode 100644 index 0000000..4be45e4 --- /dev/null +++ b/packages/communication/src/messages/parser/room/bots/BotSkillData.ts @@ -0,0 +1,23 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class BotSkillData +{ + private _id: number; + private _data: string; + + constructor(wrapper: IMessageDataWrapper) + { + this._id = wrapper.readInt(); + this._data = wrapper.readString(); + } + + public get id(): number + { + return this._id; + } + + public get data(): string + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/room/bots/BotSkillListUpdateParser.ts b/packages/communication/src/messages/parser/room/bots/BotSkillListUpdateParser.ts new file mode 100644 index 0000000..4d09a4f --- /dev/null +++ b/packages/communication/src/messages/parser/room/bots/BotSkillListUpdateParser.ts @@ -0,0 +1,44 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { BotSkillData } from './BotSkillData'; + +export class BotSkillListUpdateParser implements IMessageParser +{ + private _botId: number; + private _skillList: BotSkillData[]; + + public flush(): boolean + { + this._botId = -1; + this._skillList = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._botId = wrapper.readInt(); + + let totalSkills = wrapper.readInt(); + + while(totalSkills > 0) + { + this._skillList.push(new BotSkillData(wrapper)); + + totalSkills--; + } + + return true; + } + + public get botId(): number + { + return this._botId; + } + + public get skillList(): BotSkillData[] + { + return this._skillList; + } +} diff --git a/packages/communication/src/messages/parser/room/bots/index.ts b/packages/communication/src/messages/parser/room/bots/index.ts new file mode 100644 index 0000000..f9be3fa --- /dev/null +++ b/packages/communication/src/messages/parser/room/bots/index.ts @@ -0,0 +1,4 @@ +export * from './BotCommandConfigurationParser'; +export * from './BotForceOpenContextMenuParser'; +export * from './BotSkillData'; +export * from './BotSkillListUpdateParser'; diff --git a/packages/communication/src/messages/parser/room/data/RoomChatSettingsParser.ts b/packages/communication/src/messages/parser/room/data/RoomChatSettingsParser.ts new file mode 100644 index 0000000..cfa3338 --- /dev/null +++ b/packages/communication/src/messages/parser/room/data/RoomChatSettingsParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { RoomChatSettings } from '../../roomsettings'; + +export class RoomChatSettingsParser implements IMessageParser +{ + private _chat: RoomChatSettings; + + public flush(): boolean + { + this._chat = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._chat = new RoomChatSettings(wrapper); + + return true; + } + + public get chat(): RoomChatSettings + { + return this._chat; + } +} diff --git a/packages/communication/src/messages/parser/room/data/RoomDataParser.ts b/packages/communication/src/messages/parser/room/data/RoomDataParser.ts new file mode 100644 index 0000000..067649b --- /dev/null +++ b/packages/communication/src/messages/parser/room/data/RoomDataParser.ts @@ -0,0 +1,301 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class RoomDataParser +{ + public static THUMBNAIL_BITMASK = 1; + public static GROUPDATA_BITMASK = 2; + public static ROOMAD_BITMASK = 4; + public static SHOWOWNER_BITMASK = 8; + public static ALLOW_PETS_BITMASK = 16; + public static DISPLAY_ROOMAD_BITMASK = 32; + + public static OPEN_STATE = 0; + public static DOORBELL_STATE = 1; + public static PASSWORD_STATE = 2; + public static INVISIBLE_STATE = 3; + public static NOOB_STATE = 4; + + private _roomId: number; + private _roomName: string; + private _showOwner: boolean; + private _ownerId: number; + private _ownerName: string; + private _doorMode: number; + private _userCount: number; + private _maxUserCount: number; + private _description: string; + private _tradeMode: number; + private _score: number; + private _ranking: number; + private _categoryId: number; + private _totalStars: number; + private _groupId: number; + private _groupName: string; + private _groupBadge: string; + private _tags: string[]; + private _bitMask: number; + private _thumbnail: any; + private _allowPets: boolean; + private _displayAd: boolean; + private _adName: string; + private _adDescription: string; + private _adExpiresIn: number; + private _allInRoomMuted: boolean; + private _canMute: boolean; + + private _officialRoomPicRef: string; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this.flush(); + this.parse(wrapper); + } + + public flush(): boolean + { + this._roomId = 0; + this._roomName = null; + this._ownerId = 0; + this._ownerName = null; + this._doorMode = 0; + this._userCount = 0; + this._maxUserCount = 0; + this._description = null; + this._tradeMode = 2; + this._score = 0; + this._ranking = 0; + this._categoryId = 0; + this._totalStars = 0; + this._groupId = 0; + this._groupName = null; + this._groupBadge = null; + this._tags = []; + this._bitMask = 0; + this._thumbnail = null; + this._allowPets = false; + this._showOwner = true; + this._displayAd = false; + this._adName = null; + this._adDescription = null; + this._adExpiresIn = 0; + this._allInRoomMuted = false; + this._canMute = false; + this._officialRoomPicRef = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomId = wrapper.readInt(); + this._roomName = wrapper.readString(); + this._ownerId = wrapper.readInt(); + this._ownerName = wrapper.readString(); + this._doorMode = wrapper.readInt(); + this._userCount = wrapper.readInt(); + this._maxUserCount = wrapper.readInt(); + this._description = wrapper.readString(); + this._tradeMode = wrapper.readInt(); + this._score = wrapper.readInt(); + this._ranking = wrapper.readInt(); + this._categoryId = wrapper.readInt(); + + this.parseTags(wrapper); + + this.parseBitMask(wrapper); + + return true; + } + + private parseTags(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._tags = []; + + let totalTags = wrapper.readInt(); + + while(totalTags > 0) + { + this._tags.push(wrapper.readString()); + + totalTags--; + } + + return true; + } + + private parseBitMask(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._bitMask = wrapper.readInt(); + + if(this._bitMask & RoomDataParser.THUMBNAIL_BITMASK) this._officialRoomPicRef = wrapper.readString(); + + if(this._bitMask & RoomDataParser.GROUPDATA_BITMASK) + { + this._groupId = wrapper.readInt(); + this._groupName = wrapper.readString(); + this._groupBadge = wrapper.readString(); + } + + if(this._bitMask & RoomDataParser.ROOMAD_BITMASK) + { + this._adName = wrapper.readString(); + this._adDescription = wrapper.readString(); + this._adExpiresIn = wrapper.readInt(); + } + + this._showOwner = (this._bitMask & RoomDataParser.SHOWOWNER_BITMASK) > 0; + this._allowPets = (this._bitMask & RoomDataParser.ALLOW_PETS_BITMASK) > 0; + this._displayAd = (this._bitMask & RoomDataParser.DISPLAY_ROOMAD_BITMASK) > 0; + this._thumbnail = null; + + return true; + } + + public get roomId(): number + { + return this._roomId; + } + + public get roomName(): string + { + return this._roomName; + } + + public set roomName(name: string) + { + this._roomName = name; + } + + public get ownerId(): number + { + return this._ownerId; + } + + public get ownerName(): string + { + return this._ownerName; + } + + public get doorMode(): number + { + return this._doorMode; + } + + public get userCount(): number + { + return this._userCount; + } + + public get maxUserCount(): number + { + return this._maxUserCount; + } + + public get description(): string + { + return this._description; + } + + public get tradeMode(): number + { + return this._tradeMode; + } + + public get score(): number + { + return this._score; + } + + public get ranking(): number + { + return this._ranking; + } + + public get categoryId(): number + { + return this._categoryId; + } + + public get tags(): string[] + { + return this._tags; + } + + public get officialRoomPicRef(): string + { + return this._officialRoomPicRef; + } + + public get habboGroupId(): number + { + return this._groupId; + } + + public get groupName(): string + { + return this._groupName; + } + + public get groupBadgeCode(): string + { + return this._groupBadge; + } + + public get roomAdName(): string + { + return this._adName; + } + + public get roomAdDescription(): string + { + return this._adDescription; + } + + public get roomAdExpiresInMin(): number + { + return this._adExpiresIn; + } + + public get showOwner(): boolean + { + return this._showOwner; + } + + public get allowPets(): boolean + { + return this._allowPets; + } + + public get displayRoomEntryAd(): boolean + { + return this._displayAd; + } + + public get canMute(): boolean + { + return this._canMute; + } + + public set canMute(k: boolean) + { + this._canMute = k; + } + + public get allInRoomMuted(): boolean + { + return this._allInRoomMuted; + } + + public set allInRoomMuted(k: boolean) + { + this._allInRoomMuted = k; + } +} diff --git a/packages/communication/src/messages/parser/room/data/RoomEntryInfoMessageParser.ts b/packages/communication/src/messages/parser/room/data/RoomEntryInfoMessageParser.ts new file mode 100644 index 0000000..8d5d5bd --- /dev/null +++ b/packages/communication/src/messages/parser/room/data/RoomEntryInfoMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomEntryInfoMessageParser implements IMessageParser +{ + private _roomId: number; + private _isOwner: boolean; + + public flush(): boolean + { + this._roomId = 0; + this._isOwner = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomId = wrapper.readInt(); + this._isOwner = wrapper.readBoolean(); + + return true; + } + + public get roomId(): number + { + return this._roomId; + } + + public get isOwner(): boolean + { + return this._isOwner; + } +} diff --git a/packages/communication/src/messages/parser/room/data/RoomScoreParser.ts b/packages/communication/src/messages/parser/room/data/RoomScoreParser.ts new file mode 100644 index 0000000..df2579d --- /dev/null +++ b/packages/communication/src/messages/parser/room/data/RoomScoreParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomScoreParser implements IMessageParser +{ + private _totalLikes: number; + private _canLike: boolean; + + public flush(): boolean + { + this._totalLikes = 0; + this._canLike = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._totalLikes = wrapper.readInt(); + this._canLike = wrapper.readBoolean(); + + return true; + } + + public get totalLikes(): number + { + return this._totalLikes; + } + + public get canLike(): boolean + { + return this._canLike; + } +} diff --git a/packages/communication/src/messages/parser/room/data/index.ts b/packages/communication/src/messages/parser/room/data/index.ts new file mode 100644 index 0000000..7e040d1 --- /dev/null +++ b/packages/communication/src/messages/parser/room/data/index.ts @@ -0,0 +1,4 @@ +export * from './RoomChatSettingsParser'; +export * from './RoomDataParser'; +export * from './RoomEntryInfoMessageParser'; +export * from './RoomScoreParser'; diff --git a/packages/communication/src/messages/parser/room/engine/FavoriteMembershipUpdateMessageParser.ts b/packages/communication/src/messages/parser/room/engine/FavoriteMembershipUpdateMessageParser.ts new file mode 100644 index 0000000..9473fc4 --- /dev/null +++ b/packages/communication/src/messages/parser/room/engine/FavoriteMembershipUpdateMessageParser.ts @@ -0,0 +1,51 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FavoriteMembershipUpdateMessageParser implements IMessageParser +{ + private _roomIndex: number; + private _groupId: number; + private _status: number; + private _groupName: string; + + public flush(): boolean + { + this._roomIndex = -1; + this._groupId = -1; + this._status = 0; + this._groupName = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomIndex = wrapper.readInt(); + this._groupId = wrapper.readInt(); + this._status = wrapper.readInt(); + this._groupName = wrapper.readString(); + + return true; + } + + public get roomIndex(): number + { + return this._roomIndex; + } + + public get groupId(): number + { + return this._groupId; + } + + public get status(): number + { + return this._status; + } + + public get groupName(): string + { + return this._groupName; + } +} diff --git a/packages/communication/src/messages/parser/room/engine/ObjectData.ts b/packages/communication/src/messages/parser/room/engine/ObjectData.ts new file mode 100644 index 0000000..ba5f1bf --- /dev/null +++ b/packages/communication/src/messages/parser/room/engine/ObjectData.ts @@ -0,0 +1,30 @@ +import { IObjectData } from '@nitrots/api'; + +export class ObjectData +{ + private _id: number = 0; + private _state: number = 0; + private _data: IObjectData; + + constructor(id: number, state: number, objectData: IObjectData) + { + this._id = id; + this._state = state; + this._data = objectData; + } + + public get id(): number + { + return this._id; + } + + public get state(): number + { + return this._state; + } + + public get data(): IObjectData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/room/engine/ObjectsDataUpdateParser.ts b/packages/communication/src/messages/parser/room/engine/ObjectsDataUpdateParser.ts new file mode 100644 index 0000000..c9b933e --- /dev/null +++ b/packages/communication/src/messages/parser/room/engine/ObjectsDataUpdateParser.ts @@ -0,0 +1,40 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { FurnitureDataParser } from '../furniture'; +import { ObjectData } from './ObjectData'; + +export class ObjectsDataUpdateParser implements IMessageParser +{ + private _objects: ObjectData[]; + + public flush(): boolean + { + this._objects = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalObjects = wrapper.readInt(); + + while(totalObjects > 0) + { + const id = wrapper.readInt(); + const stuffData = FurnitureDataParser.parseObjectData(wrapper); + const state = parseFloat(stuffData.getLegacyString()); + + this._objects.push(new ObjectData(id, state, stuffData)); + + totalObjects--; + } + + return true; + } + + public get objects(): ObjectData[] + { + return this._objects; + } +} diff --git a/packages/communication/src/messages/parser/room/engine/ObjectsRollingParser.ts b/packages/communication/src/messages/parser/room/engine/ObjectsRollingParser.ts new file mode 100644 index 0000000..32240d8 --- /dev/null +++ b/packages/communication/src/messages/parser/room/engine/ObjectsRollingParser.ts @@ -0,0 +1,80 @@ +import { IMessageDataWrapper, IMessageParser, ObjectRolling } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; + +export class ObjectsRollingParser implements IMessageParser +{ + private _rollerId: number; + private _itemsRolling: ObjectRolling[]; + private _unitRolling: ObjectRolling; + + public flush(): boolean + { + this._rollerId = 0; + + this._itemsRolling = []; + this._unitRolling = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + const x = wrapper.readInt(); + const y = wrapper.readInt(); + const nextX = wrapper.readInt(); + const nextY = wrapper.readInt(); + + let totalItems = wrapper.readInt(); + + while(totalItems > 0) + { + const id = wrapper.readInt(); + const height = parseFloat(wrapper.readString()); + const nextHeight = parseFloat(wrapper.readString()); + const rollingData = new ObjectRolling(id, new Vector3d(x, y, height), new Vector3d(nextX, nextY, nextHeight)); + + this._itemsRolling.push(rollingData); + + totalItems--; + } + + this._rollerId = wrapper.readInt(); + + if(!wrapper.bytesAvailable) return true; + + const movementType = wrapper.readInt(); + const unitId = wrapper.readInt(); + const height = parseFloat(wrapper.readString()); + const nextHeight = parseFloat(wrapper.readString()); + + switch(movementType) + { + case 0: break; + case 1: + this._unitRolling = new ObjectRolling(unitId, new Vector3d(x, y, height), new Vector3d(nextX, nextY, nextHeight), ObjectRolling.MOVE); + break; + case 2: + this._unitRolling = new ObjectRolling(unitId, new Vector3d(x, y, height), new Vector3d(nextX, nextY, nextHeight), ObjectRolling.SLIDE); + break; + } + + return true; + } + + public get rollerId(): number + { + return this._rollerId; + } + + public get itemsRolling(): ObjectRolling[] + { + return this._itemsRolling; + } + + public get unitRolling(): ObjectRolling + { + return this._unitRolling; + } +} diff --git a/packages/communication/src/messages/parser/room/engine/index.ts b/packages/communication/src/messages/parser/room/engine/index.ts new file mode 100644 index 0000000..ba275c9 --- /dev/null +++ b/packages/communication/src/messages/parser/room/engine/index.ts @@ -0,0 +1,4 @@ +export * from './FavoriteMembershipUpdateMessageParser'; +export * from './ObjectData'; +export * from './ObjectsDataUpdateParser'; +export * from './ObjectsRollingParser'; diff --git a/packages/communication/src/messages/parser/room/furniture/CustomUserNotificationMessageParser.ts b/packages/communication/src/messages/parser/room/furniture/CustomUserNotificationMessageParser.ts new file mode 100644 index 0000000..e951a1c --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/CustomUserNotificationMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class CustomUserNotificationMessageParser implements IMessageParser +{ + private _code: number; + + public flush(): boolean + { + this._code = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._code = wrapper.readInt(); + + return true; + } + + public get count(): number + { + return this._code; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/DiceValueMessageParser.ts b/packages/communication/src/messages/parser/room/furniture/DiceValueMessageParser.ts new file mode 100644 index 0000000..18f341a --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/DiceValueMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class DiceValueMessageParser implements IMessageParser +{ + private _itemId: number; + private _value: number; + + public flush(): boolean + { + this._itemId = 0; + this._value = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._itemId = wrapper.readInt(); + this._value = wrapper.readInt(); + + return true; + } + + public get itemId(): number + { + return this._itemId; + } + + public get value(): number + { + return this._value; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/FurniRentOrBuyoutOfferMessageParser.ts b/packages/communication/src/messages/parser/room/furniture/FurniRentOrBuyoutOfferMessageParser.ts new file mode 100644 index 0000000..14655f3 --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/FurniRentOrBuyoutOfferMessageParser.ts @@ -0,0 +1,67 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FurniRentOrBuyoutOfferMessageParser implements IMessageParser +{ + private _isWallItem: boolean; + private _furniTypeName: string; + private _buyout: boolean; + private _priceInCredits: number; + private _priceInActivityPoints: number; + private _activityPointType: number; + + public flush(): boolean + { + this._isWallItem = false; + this._furniTypeName = null; + this._buyout = false; + this._priceInCredits = -1; + this._priceInActivityPoints = -1; + this._activityPointType = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._isWallItem = wrapper.readBoolean(); + this._furniTypeName = wrapper.readString(); + this._buyout = wrapper.readBoolean(); + this._priceInCredits = wrapper.readInt(); + this._priceInActivityPoints = wrapper.readInt(); + this._activityPointType = wrapper.readInt(); + + return true; + } + + public get isWallItem(): boolean + { + return this._isWallItem; + } + + public get furniTypeName(): string + { + return this._furniTypeName; + } + + public get buyout(): boolean + { + return this._buyout; + } + + public get priceInCredits(): number + { + return this._priceInCredits; + } + + public get priceInActivityPoints(): number + { + return this._priceInActivityPoints; + } + + public get activityPointType(): number + { + return this._activityPointType; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/FurnitureAliasesParser.ts b/packages/communication/src/messages/parser/room/furniture/FurnitureAliasesParser.ts new file mode 100644 index 0000000..82f2427 --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/FurnitureAliasesParser.ts @@ -0,0 +1,34 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FurnitureAliasesParser implements IMessageParser +{ + private _aliases: Map; + + public flush(): boolean + { + this._aliases = new Map(); + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalCount = wrapper.readInt(); + + while(totalCount > 0) + { + this._aliases.set(wrapper.readString(), wrapper.readString()); + + totalCount--; + } + + return true; + } + + public get aliases(): Map + { + return this._aliases; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/FurnitureDataParser.ts b/packages/communication/src/messages/parser/room/furniture/FurnitureDataParser.ts new file mode 100644 index 0000000..2d73d29 --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/FurnitureDataParser.ts @@ -0,0 +1,48 @@ +import { IMessageDataWrapper, IMessageParser, IObjectData, ObjectDataFactory } from '@nitrots/api'; + +export class FurnitureDataParser implements IMessageParser +{ + private _itemId: number; + private _data: IObjectData; + + public flush(): boolean + { + this._itemId = 0; + this._data = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._itemId = parseInt(wrapper.readString()); + this._data = FurnitureDataParser.parseObjectData(wrapper); + + return true; + } + + public static parseObjectData(wrapper: IMessageDataWrapper): IObjectData + { + if(!wrapper) return null; + + const data = ObjectDataFactory.getData(wrapper.readInt()); + + if(!data) return null; + + data.parseWrapper(wrapper); + + return data; + } + + public get furnitureId(): number + { + return this._itemId; + } + + public get objectData(): IObjectData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/FurnitureStackHeightParser.ts b/packages/communication/src/messages/parser/room/furniture/FurnitureStackHeightParser.ts new file mode 100644 index 0000000..eedf85d --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/FurnitureStackHeightParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FurnitureStackHeightParser implements IMessageParser +{ + private _furniId: number; + private _height: number; + + public flush(): boolean + { + this._furniId = -1; + this._height = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._furniId = wrapper.readInt(); + this._height = (wrapper.readInt() / 100); + + return true; + } + + public get furniId(): number + { + return this._furniId; + } + + public get height(): number + { + return this._height; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/GroupFurniContextMenuInfoMessageParser.ts b/packages/communication/src/messages/parser/room/furniture/GroupFurniContextMenuInfoMessageParser.ts new file mode 100644 index 0000000..ab5a649 --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/GroupFurniContextMenuInfoMessageParser.ts @@ -0,0 +1,67 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GroupFurniContextMenuInfoMessageParser implements IMessageParser +{ + private _objectId: number; + private _guildId: number; + private _guildName: string; + private _guildHomeRoomId: number; + private _userIsMember: boolean; + private _guildHasReadableForum: boolean; + + public flush(): boolean + { + this._objectId = 0; + this._guildId = 0; + this._guildName = null; + this._guildHomeRoomId = 0; + this._userIsMember = false; + this._guildHasReadableForum = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._objectId = wrapper.readInt(); + this._guildId = wrapper.readInt(); + this._guildName = wrapper.readString(); + this._guildHomeRoomId = wrapper.readInt(); + this._userIsMember = wrapper.readBoolean(); + this._guildHasReadableForum = wrapper.readBoolean(); + + return true; + } + + public get objectId(): number + { + return this._objectId; + } + + public get guildId(): number + { + return this._guildId; + } + + public get guildName(): string + { + return this._guildName; + } + + public get guildHomeRoomId(): number + { + return this._guildHomeRoomId; + } + + public get userIsMember(): boolean + { + return this._userIsMember; + } + + public get guildHasReadableForum(): boolean + { + return this._guildHasReadableForum; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/ItemDataUpdateMessageParser.ts b/packages/communication/src/messages/parser/room/furniture/ItemDataUpdateMessageParser.ts new file mode 100644 index 0000000..6655aba --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/ItemDataUpdateMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ItemDataUpdateMessageParser implements IMessageParser +{ + private _itemId: number; + private _data: string; + + public flush(): boolean + { + this._itemId = 0; + this._data = ''; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._itemId = parseInt(wrapper.readString()); + this._data = wrapper.readString(); + + return true; + } + + public get furnitureId(): number + { + return this._itemId; + } + + public get data(): string + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/LoveLockFurniFinishedParser.ts b/packages/communication/src/messages/parser/room/furniture/LoveLockFurniFinishedParser.ts new file mode 100644 index 0000000..92177da --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/LoveLockFurniFinishedParser.ts @@ -0,0 +1,23 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class LoveLockFurniFinishedParser implements IMessageParser +{ + private _furniId: number; + + public get furniId(): number + { + return this._furniId; + } + + public flush(): boolean + { + this._furniId = -1; + return true; + } + + public parse(packet: IMessageDataWrapper): boolean + { + this._furniId = packet.readInt(); + return true; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/LoveLockFurniFriendConfirmedParser.ts b/packages/communication/src/messages/parser/room/furniture/LoveLockFurniFriendConfirmedParser.ts new file mode 100644 index 0000000..c1be162 --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/LoveLockFurniFriendConfirmedParser.ts @@ -0,0 +1,23 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class LoveLockFurniFriendConfirmedParser implements IMessageParser +{ + private _furniId: number; + + public get furniId(): number + { + return this._furniId; + } + + public flush(): boolean + { + this._furniId = -1; + return true; + } + + public parse(packet: IMessageDataWrapper): boolean + { + this._furniId = packet.readInt(); + return true; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/LoveLockFurniStartParser.ts b/packages/communication/src/messages/parser/room/furniture/LoveLockFurniStartParser.ts new file mode 100644 index 0000000..81d587d --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/LoveLockFurniStartParser.ts @@ -0,0 +1,31 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class LoveLockFurniStartParser implements IMessageParser +{ + private _furniId: number; + private _start: boolean; + + public get furniId(): number + { + return this._furniId; + } + + public get start(): boolean + { + return this._start; + } + + public flush(): boolean + { + this._furniId = -1; + this._start = false; + return true; + } + + public parse(packet: IMessageDataWrapper): boolean + { + this._furniId = packet.readInt(); + this._start = packet.readBoolean(); + return true; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/OneWayDoorStatusMessageParser.ts b/packages/communication/src/messages/parser/room/furniture/OneWayDoorStatusMessageParser.ts new file mode 100644 index 0000000..5eb6283 --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/OneWayDoorStatusMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class OneWayDoorStatusMessageParser implements IMessageParser +{ + private _itemId: number; + private _state: number; + + public flush(): boolean + { + this._itemId = 0; + this._state = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._itemId = wrapper.readInt(); + this._state = wrapper.readInt(); + + return true; + } + + public get itemId(): number + { + return this._itemId; + } + + public get state(): number + { + return this._state; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/RentableSpaceRentFailedMessageParser.ts b/packages/communication/src/messages/parser/room/furniture/RentableSpaceRentFailedMessageParser.ts new file mode 100644 index 0000000..a31533c --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/RentableSpaceRentFailedMessageParser.ts @@ -0,0 +1,25 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RentableSpaceRentFailedMessageParser implements IMessageParser +{ + private _reason: number; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._reason = wrapper.readInt(); + + return true; + } + + public get reason(): number + { + return this._reason; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/RentableSpaceRentOkMessageParser.ts b/packages/communication/src/messages/parser/room/furniture/RentableSpaceRentOkMessageParser.ts new file mode 100644 index 0000000..db3e03d --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/RentableSpaceRentOkMessageParser.ts @@ -0,0 +1,25 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RentableSpaceRentOkMessageParser implements IMessageParser +{ + private _expiryTime: number; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._expiryTime = wrapper.readInt(); + + return true; + } + + public get expiryTime(): number + { + return this._expiryTime; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/RentableSpaceStatusMessageParser.ts b/packages/communication/src/messages/parser/room/furniture/RentableSpaceStatusMessageParser.ts new file mode 100644 index 0000000..b9a8cae --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/RentableSpaceStatusMessageParser.ts @@ -0,0 +1,92 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RentableSpaceStatusMessageParser implements IMessageParser +{ + public static readonly SPACE_ALREADY_RENTED = 100; + public static readonly SPACE_EXTEND_NOT_RENTED = 101; + public static readonly SPACE_EXTEND_NOT_RENTED_BY_YOU = 102; + public static readonly CAN_RENT_ONLY_ONE_SPACE = 103; + public static readonly NOT_ENOUGH_CREDITS = 200; + public static readonly NOT_ENOUGH_PIXELS = 201; + public static readonly CANT_RENT_NO_PERMISSION = 202; + public static readonly CANT_RENT_NO_HABBO_CLUB = 203; + public static readonly CANT_RENT = 300; + public static readonly CANT_RENT_GENERIC = 400; + + private _rented: boolean; + private _renterId: number; + private _renterName: string; + private _canRent: boolean; + private _canRentErrorCode: number; + private _timeRemaining: number; + private _price: number; + + public flush(): boolean + { + this._rented = false; + this._renterId = -1; + this._renterName = null; + this._canRent = false; + this._canRentErrorCode = -1; + this._timeRemaining = -1; + this._price = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._rented = wrapper.readBoolean(); + this._canRentErrorCode = wrapper.readInt(); + this._canRent = (this._canRentErrorCode === 0); + this._renterId = wrapper.readInt(); + this._renterName = wrapper.readString(); + this._timeRemaining = wrapper.readInt(); + this._price = wrapper.readInt(); + + if(!this._rented) + { + this._renterId = -1; + this._renterName = ''; + } + + return true; + } + + public get rented(): boolean + { + return this._rented; + } + + public get renterId(): number + { + return this._renterId; + } + + public get renterName(): string + { + return this._renterName; + } + + public get canRent(): boolean + { + return this._canRent; + } + + public get price(): number + { + return this._price; + } + + public get timeRemaining(): number + { + return this._timeRemaining; + } + + public get canRentErrorCode(): number + { + return this._canRentErrorCode; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/RequestSpamWallPostItMessageParser.ts b/packages/communication/src/messages/parser/room/furniture/RequestSpamWallPostItMessageParser.ts new file mode 100644 index 0000000..b4cfbcd --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/RequestSpamWallPostItMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RequestSpamWallPostItMessageParser implements IMessageParser +{ + private _itemId: number; + private _location: string; + + public flush(): boolean + { + this._itemId = -1; + this._location = ''; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._itemId = wrapper.readInt(); + this._location = wrapper.readString(); + + return true; + } + + public get itemId(): number + { + return this._itemId; + } + + public get location(): string + { + return this._location; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/RoomDimmerPresetsMessageData.ts b/packages/communication/src/messages/parser/room/furniture/RoomDimmerPresetsMessageData.ts new file mode 100644 index 0000000..9264b72 --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/RoomDimmerPresetsMessageData.ts @@ -0,0 +1,9 @@ +export class RoomDimmerPresetsMessageData +{ + constructor( + public id: number, + public type: number, + public color: number, + public brightness: number) + {} +} diff --git a/packages/communication/src/messages/parser/room/furniture/RoomDimmerPresetsMessageParser.ts b/packages/communication/src/messages/parser/room/furniture/RoomDimmerPresetsMessageParser.ts new file mode 100644 index 0000000..d69e04d --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/RoomDimmerPresetsMessageParser.ts @@ -0,0 +1,57 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { RoomDimmerPresetsMessageData } from './RoomDimmerPresetsMessageData'; + +export class RoomDimmerPresetsMessageParser implements IMessageParser +{ + private _selectedPresetId: number; + private _presets: RoomDimmerPresetsMessageData[]; + + constructor() + { + this._selectedPresetId = 0; + this._presets = []; + } + + public flush(): boolean + { + this._presets = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + const totalPresets = wrapper.readInt(); + + this._selectedPresetId = wrapper.readInt(); + + for(let i = 0; i < totalPresets; i++) + { + const presetId = wrapper.readInt(); + const type = wrapper.readInt(); + const color = parseInt(wrapper.readString().substr(1), 16); + const brightness = wrapper.readInt(); + + this._presets.push(new RoomDimmerPresetsMessageData(presetId, type, color, brightness)); + } + + return true; + } + + public getPreset(id: number): RoomDimmerPresetsMessageData + { + if((id < 0) || (id >= this.presetCount)) return null; + + return this._presets[id]; + } + + public get presetCount(): number + { + return this._presets.length; + } + + public get selectedPresetId(): number + { + return this._selectedPresetId; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/RoomMessageNotificationMessageParser.ts b/packages/communication/src/messages/parser/room/furniture/RoomMessageNotificationMessageParser.ts new file mode 100644 index 0000000..4b19c0e --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/RoomMessageNotificationMessageParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomMessageNotificationMessageParser implements IMessageParser +{ + private _roomId: number; + private _roomName: string; + private _messageCount: number; + + public flush(): boolean + { + this._roomId = -1; + this._roomName = null; + this._messageCount = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomId = wrapper.readInt(); + this._roomName = wrapper.readString(); + this._messageCount = wrapper.readInt(); + + return true; + } + + public get roomId(): number + { + return this._roomId; + } + + public get roomName(): string + { + return this._roomName; + } + + public get messageCount(): number + { + return this._messageCount; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/WelcomeGiftStatusParser.ts b/packages/communication/src/messages/parser/room/furniture/WelcomeGiftStatusParser.ts new file mode 100644 index 0000000..b7ffc5d --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/WelcomeGiftStatusParser.ts @@ -0,0 +1,59 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class WelcomeGiftStatusParser implements IMessageParser +{ + private _email: string; + private _isVerified: boolean; + private _allowChange: boolean; + private _furniId: number; + private _requestedByUser: boolean; + + public flush(): boolean + { + this._email = null; + this._isVerified = false; + this._allowChange = false; + this._furniId = -1; + this._requestedByUser = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._email = wrapper.readString(); + this._isVerified = wrapper.readBoolean(); + this._allowChange = wrapper.readBoolean(); + this._furniId = wrapper.readInt(); + this._requestedByUser = wrapper.readBoolean(); + + return true; + } + + public get email(): string + { + return this._email; + } + + public get isVerified(): boolean + { + return this._isVerified; + } + + public get allowChange(): boolean + { + return this._allowChange; + } + + public get furniId(): number + { + return this._furniId; + } + + public get requestedByUser(): boolean + { + return this._requestedByUser; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/floor/FurnitureFloorAddParser.ts b/packages/communication/src/messages/parser/room/furniture/floor/FurnitureFloorAddParser.ts new file mode 100644 index 0000000..6125e16 --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/floor/FurnitureFloorAddParser.ts @@ -0,0 +1,29 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { FurnitureFloorDataParser } from './FurnitureFloorDataParser'; + +export class FurnitureFloorAddParser implements IMessageParser +{ + private _item: FurnitureFloorDataParser; + + public flush(): boolean + { + this._item = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._item = new FurnitureFloorDataParser(wrapper); + this._item.username = wrapper.readString(); + + return true; + } + + public get item(): FurnitureFloorDataParser + { + return this._item; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/floor/FurnitureFloorDataParser.ts b/packages/communication/src/messages/parser/room/furniture/floor/FurnitureFloorDataParser.ts new file mode 100644 index 0000000..f8340d1 --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/floor/FurnitureFloorDataParser.ts @@ -0,0 +1,159 @@ +import { IMessageDataWrapper, IObjectData } from '@nitrots/api'; +import { FurnitureDataParser } from '../FurnitureDataParser'; + +export class FurnitureFloorDataParser +{ + private _itemId: number; + private _spriteId: number; + private _spriteName: string; + private _x: number; + private _y: number; + private _direction: number; + private _z: number; + private _stackHeight: number; + private _extra: number; + private _data: IObjectData; + private _state: number; + private _expires: number; + private _usagePolicy: number; + private _userId: number; + private _username: string; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this.flush(); + this.parse(wrapper); + } + + public flush(): boolean + { + this._itemId = 0; + this._spriteId = 0; + this._spriteName = null; + this._x = 0; + this._y = 0; + this._direction = 0; + this._z = 0; + this._stackHeight = 0; + this._extra = 0; + this._data = null; + this._state = 0; + this._expires = 0; + this._usagePolicy = 0; + this._userId = 0; + this._username = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._itemId = wrapper.readInt(); + this._spriteId = wrapper.readInt(); + this._x = wrapper.readInt(); + this._y = wrapper.readInt(); + this._direction = ((wrapper.readInt() % 8) * 45); + this._z = parseFloat(wrapper.readString()); + this._stackHeight = parseFloat(wrapper.readString()); + this._extra = wrapper.readInt(); + this._data = FurnitureDataParser.parseObjectData(wrapper); + this._state = parseFloat(this._data && this._data.getLegacyString()) || 0; + this._expires = wrapper.readInt(); + this._usagePolicy = wrapper.readInt(); + this._userId = wrapper.readInt(); + this._username = null; + + if(this._spriteId < 0) this._spriteName = wrapper.readString(); + + return true; + } + + public get itemId(): number + { + return this._itemId; + } + + public get spriteId(): number + { + return this._spriteId; + } + + public get x(): number + { + return this._x; + } + + public get y(): number + { + return this._y; + } + + public get direction(): number + { + return this._direction; + } + + public get z(): number + { + return ((isNaN(this._z)) ? 0 : this._z); + } + + public get stackHeight(): number + { + return ((isNaN(this._stackHeight)) ? 0 : this._stackHeight); + } + + public get extra(): number + { + return this._extra; + } + + public get data(): IObjectData + { + return this._data; + } + + public get state(): number + { + return this._state; + } + + public get expires(): number + { + return this._expires; + } + + public get usagePolicy(): number + { + return this._usagePolicy; + } + + public get userId(): number + { + return this._userId; + } + + public get username(): string + { + return this._username; + } + + public set username(username: string) + { + this._username = username; + } + + public get spriteName(): string + { + return this._spriteName; + } + + public set spriteName(type: string) + { + this._spriteName = type; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/floor/FurnitureFloorParser.ts b/packages/communication/src/messages/parser/room/furniture/floor/FurnitureFloorParser.ts new file mode 100644 index 0000000..0a2f3c4 --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/floor/FurnitureFloorParser.ts @@ -0,0 +1,68 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { FurnitureFloorDataParser } from './FurnitureFloorDataParser'; + +export class FurnitureFloorParser implements IMessageParser +{ + private _owners: Map; + private _items: FurnitureFloorDataParser[]; + + public flush(): boolean + { + this._owners = new Map(); + this._items = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + if(!this.parseOwners(wrapper)) return false; + + let totalItems = wrapper.readInt(); + + while(totalItems > 0) + { + const item = new FurnitureFloorDataParser(wrapper); + + if(!item) continue; + + const username = this._owners.get(item.userId); + + if(username) item.username = username; + + this._items.push(item); + + totalItems--; + } + + return true; + } + + private parseOwners(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalOwners = wrapper.readInt(); + + while(totalOwners > 0) + { + this._owners.set(wrapper.readInt(), wrapper.readString()); + + totalOwners--; + } + + return true; + } + + public get owners(): Map + { + return this._owners; + } + + public get items(): FurnitureFloorDataParser[] + { + return this._items; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/floor/FurnitureFloorRemoveParser.ts b/packages/communication/src/messages/parser/room/furniture/floor/FurnitureFloorRemoveParser.ts new file mode 100644 index 0000000..e5f4b77 --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/floor/FurnitureFloorRemoveParser.ts @@ -0,0 +1,51 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FurnitureFloorRemoveParser implements IMessageParser +{ + private _itemId: number; + private _isExpired: boolean; + private _userId: number; + private _delay: number; + + public flush(): boolean + { + this._itemId = 0; + this._isExpired = true; + this._userId = 0; + this._delay = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._itemId = parseInt(wrapper.readString()); + this._isExpired = wrapper.readBoolean(); + this._userId = wrapper.readInt(); + this._delay = wrapper.readInt(); + + return true; + } + + public get itemId(): number + { + return this._itemId; + } + + public get isExpired(): boolean + { + return this._isExpired; + } + + public get userId(): number + { + return this._userId; + } + + public get delay(): number + { + return this._delay; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/floor/FurnitureFloorUpdateParser.ts b/packages/communication/src/messages/parser/room/furniture/floor/FurnitureFloorUpdateParser.ts new file mode 100644 index 0000000..8f5b1e2 --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/floor/FurnitureFloorUpdateParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { FurnitureFloorDataParser } from './FurnitureFloorDataParser'; + +export class FurnitureFloorUpdateParser implements IMessageParser +{ + private _item: FurnitureFloorDataParser; + + public flush(): boolean + { + this._item = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._item = new FurnitureFloorDataParser(wrapper); + + return true; + } + + public get item(): FurnitureFloorDataParser + { + return this._item; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/floor/index.ts b/packages/communication/src/messages/parser/room/furniture/floor/index.ts new file mode 100644 index 0000000..710c755 --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/floor/index.ts @@ -0,0 +1,5 @@ +export * from './FurnitureFloorAddParser'; +export * from './FurnitureFloorDataParser'; +export * from './FurnitureFloorParser'; +export * from './FurnitureFloorRemoveParser'; +export * from './FurnitureFloorUpdateParser'; diff --git a/packages/communication/src/messages/parser/room/furniture/index.ts b/packages/communication/src/messages/parser/room/furniture/index.ts new file mode 100644 index 0000000..8cebe4b --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/index.ts @@ -0,0 +1,23 @@ +export * from './CustomUserNotificationMessageParser'; +export * from './DiceValueMessageParser'; +export * from './floor'; +export * from './FurniRentOrBuyoutOfferMessageParser'; +export * from './FurnitureAliasesParser'; +export * from './FurnitureDataParser'; +export * from './FurnitureStackHeightParser'; +export * from './GroupFurniContextMenuInfoMessageParser'; +export * from './ItemDataUpdateMessageParser'; +export * from './LoveLockFurniFinishedParser'; +export * from './LoveLockFurniFriendConfirmedParser'; +export * from './LoveLockFurniStartParser'; +export * from './OneWayDoorStatusMessageParser'; +export * from './RentableSpaceRentFailedMessageParser'; +export * from './RentableSpaceRentOkMessageParser'; +export * from './RentableSpaceStatusMessageParser'; +export * from './RequestSpamWallPostItMessageParser'; +export * from './RoomDimmerPresetsMessageData'; +export * from './RoomDimmerPresetsMessageParser'; +export * from './RoomMessageNotificationMessageParser'; +export * from './wall'; +export * from './WelcomeGiftStatusParser'; +export * from './youtube'; diff --git a/packages/communication/src/messages/parser/room/furniture/wall/FurnitureWallAddParser.ts b/packages/communication/src/messages/parser/room/furniture/wall/FurnitureWallAddParser.ts new file mode 100644 index 0000000..be52de9 --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/wall/FurnitureWallAddParser.ts @@ -0,0 +1,29 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { FurnitureWallDataParser } from './FurnitureWallDataParser'; + +export class FurnitureWallAddParser implements IMessageParser +{ + private _item: FurnitureWallDataParser; + + public flush(): boolean + { + this._item = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._item = new FurnitureWallDataParser(wrapper); + this._item.username = wrapper.readString(); + + return true; + } + + public get item(): FurnitureWallDataParser + { + return this._item; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/wall/FurnitureWallDataParser.ts b/packages/communication/src/messages/parser/room/furniture/wall/FurnitureWallDataParser.ts new file mode 100644 index 0000000..a716e74 --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/wall/FurnitureWallDataParser.ts @@ -0,0 +1,228 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class FurnitureWallDataParser +{ + private _itemId: number; + private _spriteId: number; + private _location: string; + private _stuffData: string; + private _state: number; + private _secondsToExpiration: number; + private _usagePolicy: number; + private _userId: number; + private _username: string; + + private _width: number; + private _height: number; + private _localX: number; + private _localY: number; + private _y: number; + private _z: number; + private _direction: string; + private _isOldFormat: boolean; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this.flush(); + this.parse(wrapper); + } + + public flush(): boolean + { + this._itemId = 0; + this._spriteId = 0; + this._location = null; + this._stuffData = null; + this._state = 0; + this._secondsToExpiration = 0; + this._usagePolicy = -1; + this._userId = 0; + this._username = null; + + this._width = 0; + this._height = 0; + this._localX = 0; + this._localY = 0; + this._y = 0; + this._z = 0; + this._direction = null; + this._isOldFormat = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._itemId = parseInt(wrapper.readString()); + this._spriteId = wrapper.readInt(); + this._location = wrapper.readString(); + this._stuffData = wrapper.readString(); + this._secondsToExpiration = wrapper.readInt(); + this._usagePolicy = wrapper.readInt(); + this._userId = wrapper.readInt(); + this._username = null; + + const state = parseFloat(this._stuffData); + + if(!isNaN(state)) this._state = Math.trunc(state); + + if(this._location.indexOf(':') === 0) + { + this._isOldFormat = false; + + let parts = this._location.split(' '); + + if(parts.length >= 3) + { + let widthHeight = parts[0]; + let leftRight = parts[1]; + + const direction = parts[2]; + + if((widthHeight.length > 3) && (leftRight.length > 2)) + { + widthHeight = widthHeight.substr(3); + leftRight = leftRight.substr(2); + parts = widthHeight.split(','); + + if(parts.length >= 2) + { + const width = parseInt(parts[0]); + const height = parseInt(parts[1]); + + parts = leftRight.split(','); + + if(parts.length >= 2) + { + const localX = parseInt(parts[0]); + const localY = parseInt(parts[1]); + + this._width = width; + this._height = height; + this._localX = localX; + this._localY = localY; + this._direction = direction; + } + } + } + } + } + else + { + this._isOldFormat = true; + + // _local_12 = _local_4.split(" "); + // if (_local_12.length >= 2) + // { + // _local_13 = String(_local_12[0]); + // if (((_local_13 == "rightwall") || (_local_13 == "frontwall"))) + // { + // _local_13 = "r"; + // } + // else + // { + // _local_13 = "l"; + // } + // _local_20 = String(_local_12[1]); + // _local_21 = _local_20.split(","); + // if (_local_21.length >= 3) + // { + // _local_22 = 0; + // _local_23 = parseFloat(_local_21[0]); + // _local_24 = parseFloat(_local_21[1]); + // _local_11.y = _local_23; + // _local_11.z = _local_24; + // _local_11.dir = _local_13; + // _local_11.data = _local_5; + // _local_11.state = _local_9; + // } + // } + } + + return true; + } + + public get itemId(): number + { + return this._itemId; + } + + public get spriteId(): number + { + return this._spriteId; + } + + public get wallPosition(): string + { + return this._location; + } + + public get stuffData(): string + { + return this._stuffData; + } + + public get state(): number + { + return this._state; + } + + public get secondsToExpiration(): number + { + return this._secondsToExpiration; + } + + public get usagePolicy(): number + { + return this._usagePolicy; + } + + public get userId(): number + { + return this._userId; + } + + public get username(): string + { + return this._username; + } + + public set username(username: string) + { + this._username = username; + } + + public get width(): number + { + return this._width; + } + + public get height(): number + { + return this._height; + } + + public get localX(): number + { + return this._localX; + } + + public get localY(): number + { + return this._localY; + } + + public get direction(): string + { + return this._direction; + } + + public get isOldFormat(): boolean + { + return this._isOldFormat; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/wall/FurnitureWallParser.ts b/packages/communication/src/messages/parser/room/furniture/wall/FurnitureWallParser.ts new file mode 100644 index 0000000..b017bcf --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/wall/FurnitureWallParser.ts @@ -0,0 +1,68 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { FurnitureWallDataParser } from './FurnitureWallDataParser'; + +export class FurnitureWallParser implements IMessageParser +{ + private _owners: Map; + private _items: FurnitureWallDataParser[]; + + public flush(): boolean + { + this._owners = new Map(); + this._items = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + if(!this.parseOwners(wrapper)) return false; + + let totalItems = wrapper.readInt(); + + while(totalItems > 0) + { + const item = new FurnitureWallDataParser(wrapper); + + if(!item) continue; + + const username = this._owners.get(item.userId); + + if(username) item.username = username; + + this._items.push(item); + + totalItems--; + } + + return true; + } + + private parseOwners(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalOwners = wrapper.readInt(); + + while(totalOwners > 0) + { + this._owners.set(wrapper.readInt(), wrapper.readString()); + + totalOwners--; + } + + return true; + } + + public get owners(): Map + { + return this._owners; + } + + public get items(): FurnitureWallDataParser[] + { + return this._items; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/wall/FurnitureWallRemoveParser.ts b/packages/communication/src/messages/parser/room/furniture/wall/FurnitureWallRemoveParser.ts new file mode 100644 index 0000000..a0442ee --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/wall/FurnitureWallRemoveParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FurnitureWallRemoveParser implements IMessageParser +{ + private _itemId: number; + private _userId: number; + + public flush(): boolean + { + this._itemId = 0; + this._userId = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._itemId = parseInt(wrapper.readString()); + this._userId = wrapper.readInt(); + + return true; + } + + public get itemId(): number + { + return this._itemId; + } + + public get userId(): number + { + return this._userId; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/wall/FurnitureWallUpdateParser.ts b/packages/communication/src/messages/parser/room/furniture/wall/FurnitureWallUpdateParser.ts new file mode 100644 index 0000000..475061c --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/wall/FurnitureWallUpdateParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { FurnitureWallDataParser } from './FurnitureWallDataParser'; + +export class FurnitureWallUpdateParser implements IMessageParser +{ + private _item: FurnitureWallDataParser; + + public flush(): boolean + { + this._item = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._item = new FurnitureWallDataParser(wrapper); + + return true; + } + + public get item(): FurnitureWallDataParser + { + return this._item; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/wall/index.ts b/packages/communication/src/messages/parser/room/furniture/wall/index.ts new file mode 100644 index 0000000..2b085b2 --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/wall/index.ts @@ -0,0 +1,5 @@ +export * from './FurnitureWallAddParser'; +export * from './FurnitureWallDataParser'; +export * from './FurnitureWallParser'; +export * from './FurnitureWallRemoveParser'; +export * from './FurnitureWallUpdateParser'; diff --git a/packages/communication/src/messages/parser/room/furniture/youtube/YoutubeControlVideoMessageParser.ts b/packages/communication/src/messages/parser/room/furniture/youtube/YoutubeControlVideoMessageParser.ts new file mode 100644 index 0000000..d18451f --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/youtube/YoutubeControlVideoMessageParser.ts @@ -0,0 +1,31 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class YoutubeControlVideoMessageParser implements IMessageParser +{ + private _furniId: number; + private _commandId: number; + + public parse(wrapper: IMessageDataWrapper): boolean + { + this._furniId = wrapper.readInt(); + this._commandId = wrapper.readInt(); + return true; + } + + public flush(): boolean + { + this._furniId = -1; + this._commandId = -1; + return true; + } + + public get furniId(): number + { + return this._furniId; + } + + public get commandId(): number + { + return this._commandId; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/youtube/YoutubeDisplayPlaylist.ts b/packages/communication/src/messages/parser/room/furniture/youtube/YoutubeDisplayPlaylist.ts new file mode 100644 index 0000000..f47c5ee --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/youtube/YoutubeDisplayPlaylist.ts @@ -0,0 +1,28 @@ +export class YoutubeDisplayPlaylist +{ + private _video: string; + private _title: string; + private _description: string; + + constructor(k: string, _arg_2: string, _arg_3: string) + { + this._video = k; + this._title = _arg_2; + this._description = _arg_3; + } + + public get video():string + { + return this._video; + } + + public get title():string + { + return this._title; + } + + public get description():string + { + return this._description; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/youtube/YoutubeDisplayPlaylistsMessageParser.ts b/packages/communication/src/messages/parser/room/furniture/youtube/YoutubeDisplayPlaylistsMessageParser.ts new file mode 100644 index 0000000..dcbcb96 --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/youtube/YoutubeDisplayPlaylistsMessageParser.ts @@ -0,0 +1,45 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { YoutubeDisplayPlaylist } from './YoutubeDisplayPlaylist'; + +export class YoutubeDisplayPlaylistsMessageParser implements IMessageParser +{ + private _furniId: number; + private _playlists: YoutubeDisplayPlaylist[]; + private _selectedPlaylistId: string; + + flush(): boolean + { + this._furniId = -1; + this._playlists = null; + this._selectedPlaylistId = null; + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._furniId = wrapper.readInt(); + const count = wrapper.readInt(); + this._playlists = []; + for(let i = 0; i < count; i++) + { + this._playlists.push(new YoutubeDisplayPlaylist(wrapper.readString(), wrapper.readString(), wrapper.readString())); + } + this._selectedPlaylistId = wrapper.readString(); + return true; + } + + public get furniId(): number + { + return this._furniId; + } + + public get playlists(): YoutubeDisplayPlaylist[] + { + return this._playlists; + } + + public get selectedPlaylistId(): string + { + return this._selectedPlaylistId; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/youtube/YoutubeDisplayVideoMessageParser.ts b/packages/communication/src/messages/parser/room/furniture/youtube/YoutubeDisplayVideoMessageParser.ts new file mode 100644 index 0000000..221fedd --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/youtube/YoutubeDisplayVideoMessageParser.ts @@ -0,0 +1,50 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class YoutubeDisplayVideoMessageParser implements IMessageParser +{ + private _furniId: number; + private _videoId: string; + private _startAtSeconds: number; + private _endAtSeconds: number; + private _state: number; + + flush(): boolean + { + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._furniId = wrapper.readInt(); + this._videoId = wrapper.readString(); + this._startAtSeconds = wrapper.readInt(); + this._endAtSeconds = wrapper.readInt(); + this._state = wrapper.readInt(); + return true; + } + + public get furniId(): number + { + return this._furniId; + } + + public get videoId(): string + { + return this._videoId; + } + + public get state(): number + { + return this._state; + } + + public get startAtSeconds(): number + { + return this._startAtSeconds; + } + + public get endAtSeconds(): number + { + return this._endAtSeconds; + } +} diff --git a/packages/communication/src/messages/parser/room/furniture/youtube/index.ts b/packages/communication/src/messages/parser/room/furniture/youtube/index.ts new file mode 100644 index 0000000..9339473 --- /dev/null +++ b/packages/communication/src/messages/parser/room/furniture/youtube/index.ts @@ -0,0 +1,4 @@ +export * from './YoutubeControlVideoMessageParser'; +export * from './YoutubeDisplayPlaylist'; +export * from './YoutubeDisplayPlaylistsMessageParser'; +export * from './YoutubeDisplayVideoMessageParser'; diff --git a/packages/communication/src/messages/parser/room/index.ts b/packages/communication/src/messages/parser/room/index.ts new file mode 100644 index 0000000..81b327b --- /dev/null +++ b/packages/communication/src/messages/parser/room/index.ts @@ -0,0 +1,15 @@ +export * from './access'; +export * from './access/doorbell'; +export * from './access/rights'; +export * from './bots'; +export * from './data'; +export * from './engine'; +export * from './furniture'; +export * from './furniture/floor'; +export * from './furniture/wall'; +export * from './furniture/youtube'; +export * from './mapping'; +export * from './pet'; +export * from './session'; +export * from './unit'; +export * from './unit/chat'; diff --git a/packages/communication/src/messages/parser/room/mapping/FloorHeightMapMessageParser.ts b/packages/communication/src/messages/parser/room/mapping/FloorHeightMapMessageParser.ts new file mode 100644 index 0000000..3100840 --- /dev/null +++ b/packages/communication/src/messages/parser/room/mapping/FloorHeightMapMessageParser.ts @@ -0,0 +1,167 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FloorHeightMapMessageParser implements IMessageParser +{ + public static TILE_BLOCKED: number = -110; + + private _model: string; + private _width: number; + private _height: number; + private _heightMap: number[][]; + private _wallHeight: number; + private _scale: number; + + public flush(): boolean + { + this._model = null; + this._width = 0; + this._height = 0; + this._wallHeight = -1; + this._heightMap = []; + this._scale = 64; + this._model = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + const scale = wrapper.readBoolean(); + const wallHeight = wrapper.readInt(); + const model = wrapper.readString(); + + return this.parseExplicitly(model, wallHeight, scale); + } + + public parseModel(modelString: string, wallHeight: number, scale: boolean = true): boolean + { + return this.parseExplicitly(modelString, wallHeight, scale); + } + + private parseExplicitly(modelString: string, wallHeight: number, scale: boolean = true): boolean + { + this._scale = scale ? 32 : 64; + this._wallHeight = wallHeight; + this._model = modelString; + + const model = this._model.split('\r'); + const modelRows = model.length; + + let width = 0; + const height = 0; + + let iterator = 0; + + while(iterator < modelRows) + { + const row = model[iterator]; + + if(row.length > width) + { + width = row.length; + } + + iterator++; + } + + this._heightMap = []; + iterator = 0; + + while(iterator < modelRows) + { + const heightMap: number[] = []; + + let subIterator = 0; + + while(subIterator < width) + { + heightMap.push(FloorHeightMapMessageParser.TILE_BLOCKED); + + subIterator++; + } + + this._heightMap.push(heightMap); + + iterator++; + } + + this._width = width; + this._height = modelRows; + + iterator = 0; + + while(iterator < modelRows) + { + const heightMap = this._heightMap[iterator]; + const text = model[iterator]; + + if(text.length > 0) + { + let subIterator = 0; + + while(subIterator < text.length) + { + const char = text.charAt(subIterator); + let height = FloorHeightMapMessageParser.TILE_BLOCKED; + + if((char !== 'x') && (char !== 'X')) height = parseInt(char, 36); + + heightMap[subIterator] = height; + + subIterator++; + } + } + + iterator++; + } + + return true; + } + + public getHeight(x: number, y: number): number + { + if((x < 0) || (x >= this._width) || (y < 0) || (y >= this._height)) return -110; + + const row = this._heightMap[y]; + + if(row === undefined) return -110; + + const height = row[x]; + + if(height === undefined) return -110; + + return height; + } + + public get model(): string + { + return this._model; + } + + public get width(): number + { + return this._width; + } + + public get height(): number + { + return this._height; + } + + public get heightMap(): number[][] + { + return this._heightMap; + } + + public get wallHeight(): number + { + return this._wallHeight; + } + + public get scale(): number + { + return this._scale; + } +} diff --git a/packages/communication/src/messages/parser/room/mapping/RoomEntryTileMessageParser.ts b/packages/communication/src/messages/parser/room/mapping/RoomEntryTileMessageParser.ts new file mode 100644 index 0000000..a3bda84 --- /dev/null +++ b/packages/communication/src/messages/parser/room/mapping/RoomEntryTileMessageParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomEntryTileMessageParser implements IMessageParser +{ + private _x: number; + private _y: number; + private _direction: number; + + public flush(): boolean + { + this._x = 0; + this._y = 0; + this._direction = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._x = wrapper.readInt(); + this._y = wrapper.readInt(); + this._direction = wrapper.readInt(); + + return true; + } + + public get x(): number + { + return this._x; + } + + public get y(): number + { + return this._y; + } + + public get direction(): number + { + return this._direction; + } +} diff --git a/packages/communication/src/messages/parser/room/mapping/RoomHeightMapParser.ts b/packages/communication/src/messages/parser/room/mapping/RoomHeightMapParser.ts new file mode 100644 index 0000000..763419f --- /dev/null +++ b/packages/communication/src/messages/parser/room/mapping/RoomHeightMapParser.ts @@ -0,0 +1,88 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomHeightMapParser implements IMessageParser +{ + private _width: number; + private _height: number; + private _heights: number[]; + + public static decodeTileHeight(height: number): number + { + return ((height < 0) ? -1 : ((height & 16383) / 0x0100)); + } + + public static decodeIsStackingBlocked(height: number): boolean + { + return !!(height & 0x4000); + } + + public static decodeIsRoomTile(height: number): boolean + { + return height >= 0; + } + + public getTileHeight(x: number, y: number): number + { + if((x < 0) || (x >= this._width) || (y < 0) || (y >= this._height)) return -1; + + return RoomHeightMapParser.decodeTileHeight(this._heights[((y * this._width) + x)]); + } + + public getStackingBlocked(x: number, y: number): boolean + { + if((x < 0) || (x >= this._width) || (y < 0) || (y >= this._height)) return true; + + return RoomHeightMapParser.decodeIsStackingBlocked(this._heights[((y * this._width) + x)]); + } + + public isRoomTile(x: number, y: number): boolean + { + if((x < 0) || (x >= this._width) || (y < 0) || (y >= this._height)) return false; + + return RoomHeightMapParser.decodeIsRoomTile(this._heights[((y * this._width) + x)]); + } + + public flush(): boolean + { + this._width = 0; + this._height = 0; + this._heights = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._width = wrapper.readInt(); + const totalTiles = wrapper.readInt(); + this._height = totalTiles / this._width; + + let i = 0; + + while(i < totalTiles) + { + this._heights[i] = wrapper.readShort(); + + i++; + } + + return true; + } + + public get width(): number + { + return this._width; + } + + public get height(): number + { + return this._height; + } + + public get heights(): number[] + { + return this._heights; + } +} diff --git a/packages/communication/src/messages/parser/room/mapping/RoomHeightMapUpdateParser.ts b/packages/communication/src/messages/parser/room/mapping/RoomHeightMapUpdateParser.ts new file mode 100644 index 0000000..58234b2 --- /dev/null +++ b/packages/communication/src/messages/parser/room/mapping/RoomHeightMapUpdateParser.ts @@ -0,0 +1,75 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { RoomHeightMapParser } from './RoomHeightMapParser'; + +export class RoomHeightMapUpdateParser implements IMessageParser +{ + private _wrapper: IMessageDataWrapper; + private _count: number; + private _x: number; + private _y: number; + private _value: number; + + public flush(): boolean + { + this._wrapper = null; + this._count = 0; + this._x = 0; + this._y = 0; + this._value = 0; + + return true; + } + + public tileHeight(): number + { + return RoomHeightMapParser.decodeTileHeight(this._value); + } + + public isStackingBlocked(): boolean + { + return RoomHeightMapParser.decodeIsStackingBlocked(this._value); + } + + public isRoomTile(): boolean + { + return RoomHeightMapParser.decodeIsRoomTile(this._value); + } + + public next(): boolean + { + if(!this._count) return false; + + this._count--; + + this._x = this._wrapper.readByte(); + this._y = this._wrapper.readByte(); + this._value = this._wrapper.readShort(); + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._wrapper = wrapper; + this._count = wrapper.readByte(); + + return true; + } + + public get x(): number + { + return this._x; + } + + public get y(): number + { + return this._y; + } + + public get height(): number + { + return this._value; + } +} diff --git a/packages/communication/src/messages/parser/room/mapping/RoomOccupiedTilesMessageParser.ts b/packages/communication/src/messages/parser/room/mapping/RoomOccupiedTilesMessageParser.ts new file mode 100644 index 0000000..6887aed --- /dev/null +++ b/packages/communication/src/messages/parser/room/mapping/RoomOccupiedTilesMessageParser.ts @@ -0,0 +1,39 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomOccupiedTilesMessageParser implements IMessageParser +{ + private _blockedTilesMap: boolean[][]; + + public flush(): boolean + { + this._blockedTilesMap = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let tilesCount = wrapper.readInt(); + + while(tilesCount > 0) + { + const x = wrapper.readInt(); + const y = wrapper.readInt(); + + if(!this._blockedTilesMap[y]) this._blockedTilesMap[y] = []; + + this._blockedTilesMap[y][x] = true; + + tilesCount--; + } + + return true; + } + + public get blockedTilesMap(): boolean[][] + { + return this._blockedTilesMap; + } +} diff --git a/packages/communication/src/messages/parser/room/mapping/RoomPaintParser.ts b/packages/communication/src/messages/parser/room/mapping/RoomPaintParser.ts new file mode 100644 index 0000000..82d54b4 --- /dev/null +++ b/packages/communication/src/messages/parser/room/mapping/RoomPaintParser.ts @@ -0,0 +1,65 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomPaintParser implements IMessageParser +{ + private _floorType: string; + private _wallType: string; + private _landscapeType: string; + private _landscapeAnimation: string; + + public flush(): boolean + { + this._floorType = null; + this._wallType = null; + this._landscapeType = null; + this._landscapeAnimation = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + const type = wrapper.readString(); + const value = wrapper.readString(); + + switch(type) + { + case 'floor': + this._floorType = value; + break; + case 'wallpaper': + this._wallType = value; + break; + case 'landscape': + this._landscapeType = value; + break; + case 'landscapeanim': + this._landscapeAnimation = value; + break; + } + + return true; + } + + public get floorType(): string + { + return this._floorType; + } + + public get wallType(): string + { + return this._wallType; + } + + public get landscapeType(): string + { + return this._landscapeType; + } + + public get landscapeAnimation(): string + { + return this._landscapeAnimation; + } +} diff --git a/packages/communication/src/messages/parser/room/mapping/RoomReadyMessageParser.ts b/packages/communication/src/messages/parser/room/mapping/RoomReadyMessageParser.ts new file mode 100644 index 0000000..72b4add --- /dev/null +++ b/packages/communication/src/messages/parser/room/mapping/RoomReadyMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomReadyMessageParser implements IMessageParser +{ + private _name: string; + private _roomId: number; + + public flush(): boolean + { + this._name = null; + this._roomId = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._name = wrapper.readString(); + this._roomId = wrapper.readInt(); + + return true; + } + + public get name(): string + { + return this._name; + } + + public get roomId(): number + { + return this._roomId; + } +} diff --git a/packages/communication/src/messages/parser/room/mapping/RoomVisualizationSettingsParser.ts b/packages/communication/src/messages/parser/room/mapping/RoomVisualizationSettingsParser.ts new file mode 100644 index 0000000..ea0e203 --- /dev/null +++ b/packages/communication/src/messages/parser/room/mapping/RoomVisualizationSettingsParser.ts @@ -0,0 +1,50 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomVisualizationSettingsParser implements IMessageParser +{ + private _hideWalls: boolean; + private _thicknessWall: number; + private _thicknessFloor: number; + + public flush(): boolean + { + this._hideWalls = false; + this._thicknessWall = 0; + this._thicknessFloor = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._hideWalls = wrapper.readBoolean(); + + let thicknessWall = wrapper.readInt(); + let thicknessFloor = wrapper.readInt(); + + thicknessWall = (thicknessWall < -2) ? -2 : (thicknessWall > 1) ? 1 : thicknessWall; + thicknessFloor = (thicknessFloor < -2) ? -2 : (thicknessFloor > 1) ? 1 : thicknessFloor; + + this._thicknessWall = Math.pow(2, thicknessWall); + this._thicknessFloor = Math.pow(2, thicknessFloor); + + return true; + } + + public get hideWalls(): boolean + { + return this._hideWalls; + } + + public get thicknessWall(): number + { + return this._thicknessWall; + } + + public get thicknessFloor(): number + { + return this._thicknessFloor; + } +} diff --git a/packages/communication/src/messages/parser/room/mapping/index.ts b/packages/communication/src/messages/parser/room/mapping/index.ts new file mode 100644 index 0000000..11846fd --- /dev/null +++ b/packages/communication/src/messages/parser/room/mapping/index.ts @@ -0,0 +1,8 @@ +export * from './FloorHeightMapMessageParser'; +export * from './RoomEntryTileMessageParser'; +export * from './RoomHeightMapParser'; +export * from './RoomHeightMapUpdateParser'; +export * from './RoomOccupiedTilesMessageParser'; +export * from './RoomPaintParser'; +export * from './RoomReadyMessageParser'; +export * from './RoomVisualizationSettingsParser'; diff --git a/packages/communication/src/messages/parser/room/pet/PetBreedingResultParser.ts b/packages/communication/src/messages/parser/room/pet/PetBreedingResultParser.ts new file mode 100644 index 0000000..a8f7c14 --- /dev/null +++ b/packages/communication/src/messages/parser/room/pet/PetBreedingResultParser.ts @@ -0,0 +1,34 @@ +import { IMessageDataWrapper, IMessageParser, PetBreedingResultData } from '@nitrots/api'; + +export class PetBreedingResultParser implements IMessageParser +{ + private _resultData: PetBreedingResultData; + private _otherResultData: PetBreedingResultData; + + public flush(): boolean + { + this._resultData = null; + this._otherResultData = null; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._resultData = new PetBreedingResultData(wrapper); + this._otherResultData = new PetBreedingResultData(wrapper); + + return true; + } + + public get resultData(): PetBreedingResultData + { + return this._resultData; + } + + public get otherResultData(): PetBreedingResultData + { + return this._otherResultData; + } +} diff --git a/packages/communication/src/messages/parser/room/pet/PetExperienceParser.ts b/packages/communication/src/messages/parser/room/pet/PetExperienceParser.ts new file mode 100644 index 0000000..0b86bbc --- /dev/null +++ b/packages/communication/src/messages/parser/room/pet/PetExperienceParser.ts @@ -0,0 +1,42 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class PetExperienceParser implements IMessageParser +{ + private _petId: number; + private _roomIndex: number; + private _gainedExperience: number; + + public flush(): boolean + { + this._petId = -1; + this._roomIndex = -1; + this._gainedExperience = 0; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._petId = wrapper.readInt(); + this._roomIndex = wrapper.readInt(); + this._gainedExperience = wrapper.readInt(); + + return true; + } + + public get petId(): number + { + return this._petId; + } + + public get roomIndex(): number + { + return this._roomIndex; + } + + public get gainedExperience(): number + { + return this._gainedExperience; + } +} diff --git a/packages/communication/src/messages/parser/room/pet/PetFigureUpdateParser.ts b/packages/communication/src/messages/parser/room/pet/PetFigureUpdateParser.ts new file mode 100644 index 0000000..435de5b --- /dev/null +++ b/packages/communication/src/messages/parser/room/pet/PetFigureUpdateParser.ts @@ -0,0 +1,54 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { PetFigureDataParser } from '../../inventory'; + +export class PetFigureUpdateParser implements IMessageParser +{ + private _roomIndex: number; + private _petId: number; + private _figureData: PetFigureDataParser; + private _hasSaddle: boolean; + private _isRiding: boolean; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomIndex = wrapper.readInt(); + this._petId = wrapper.readInt(); + this._figureData = new PetFigureDataParser(wrapper); + this._hasSaddle = wrapper.readBoolean(); + this._isRiding = wrapper.readBoolean(); + + return true; + } + + public get roomIndex(): number + { + return this._roomIndex; + } + + public get petId(): number + { + return this._petId; + } + + public get figureData(): PetFigureDataParser + { + return this._figureData; + } + + public get hasSaddle(): boolean + { + return this._hasSaddle; + } + + public get isRiding(): boolean + { + return this._isRiding; + } +} diff --git a/packages/communication/src/messages/parser/room/pet/PetInfoParser.ts b/packages/communication/src/messages/parser/room/pet/PetInfoParser.ts new file mode 100644 index 0000000..774d651 --- /dev/null +++ b/packages/communication/src/messages/parser/room/pet/PetInfoParser.ts @@ -0,0 +1,220 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class PetInfoParser implements IMessageParser +{ + private _id: number; + private _name: string; + private _level: number; + private _maximumLevel: number; + private _experience: number; + private _energy: number; + private _happyness: number; + private _levelExperienceGoal: number; + private _maximumEnergy: number; + private _maximumHappyness: number; + private _respect: number; + private _ownerId: number; + private _ownerName: string; + private _age: number; + private _rarityLevel: number; + private _saddle: boolean; + private _rider: boolean; + private _breedable: boolean; + private _fullyGrown: boolean; + private _dead: boolean; + private _maximumTimeToLive: number; + private _remainingTimeToLive: number; + private _remainingGrowTime: number; + private _skillThresholds: number[]; + private _publiclyRideable: number; + private _unknownRarity: number; + private _publiclyBreedable: boolean; + + public flush(): boolean + { + this._id = -1; + this._skillThresholds = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._id = wrapper.readInt(); + this._name = wrapper.readString(); + this._level = wrapper.readInt(); + this._maximumLevel = wrapper.readInt(); + this._experience = wrapper.readInt(); + this._levelExperienceGoal = wrapper.readInt(); + this._energy = wrapper.readInt(); + this._maximumEnergy = wrapper.readInt(); + this._happyness = wrapper.readInt(); + this._maximumHappyness = wrapper.readInt(); + this._respect = wrapper.readInt(); + this._ownerId = wrapper.readInt(); + this._age = wrapper.readInt(); + this._ownerName = wrapper.readString(); + this._rarityLevel = wrapper.readInt(); + this._saddle = wrapper.readBoolean(); + this._rider = wrapper.readBoolean(); + + let total = wrapper.readInt(); + + while(total > 0) + { + this._skillThresholds.push(wrapper.readInt()); + + total--; + } + + this._skillThresholds.sort(); + this._publiclyRideable = wrapper.readInt(); + this._breedable = wrapper.readBoolean(); + this._fullyGrown = wrapper.readBoolean(); + this._dead = wrapper.readBoolean(); + this._unknownRarity = wrapper.readInt(); + this._maximumTimeToLive = wrapper.readInt(); + this._remainingTimeToLive = wrapper.readInt(); + this._remainingGrowTime = wrapper.readInt(); + this._publiclyBreedable = wrapper.readBoolean(); + + return true; + } + + public get id(): number + { + return this._id; + } + + public get name(): string + { + return this._name; + } + + public get level(): number + { + return this._level; + } + + public get maximumLevel(): number + { + return this._maximumLevel; + } + + public get experience(): number + { + return this._experience; + } + + public get energy(): number + { + return this._energy; + } + + public get happyness(): number + { + return this._happyness; + } + + public get levelExperienceGoal(): number + { + return this._levelExperienceGoal; + } + + public get maximumEnergy(): number + { + return this._maximumEnergy; + } + + public get maximumHappyness(): number + { + return this._maximumHappyness; + } + + public get respect(): number + { + return this._respect; + } + + public get ownerId(): number + { + return this._ownerId; + } + + public get ownerName(): string + { + return this._ownerName; + } + + public get age(): number + { + return this._age; + } + + public get rarityLevel(): number + { + return this._rarityLevel; + } + + public get saddle(): boolean + { + return this._saddle; + } + + public get rider(): boolean + { + return this._rider; + } + + public get breedable(): boolean + { + return this._breedable; + } + + public get fullyGrown(): boolean + { + return this._fullyGrown; + } + + public get dead(): boolean + { + return this._dead; + } + + public get maximumTimeToLive(): number + { + return this._maximumTimeToLive; + } + + public get remainingTimeToLive(): number + { + return this._remainingTimeToLive; + } + + public get remainingGrowTime(): number + { + return this._remainingGrowTime; + } + + public get skillTresholds(): number[] + { + return this._skillThresholds; + } + + public get publiclyRideable(): number + { + return this._publiclyRideable; + } + + public get unknownRarity(): number + { + return this._unknownRarity; + } + + public get publiclyBreedable(): boolean + { + return this._publiclyBreedable; + } +} diff --git a/packages/communication/src/messages/parser/room/pet/PetStatusUpdateParser.ts b/packages/communication/src/messages/parser/room/pet/PetStatusUpdateParser.ts new file mode 100644 index 0000000..56ee0a8 --- /dev/null +++ b/packages/communication/src/messages/parser/room/pet/PetStatusUpdateParser.ts @@ -0,0 +1,67 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class PetStatusUpdateParser implements IMessageParser +{ + private _roomIndex: number; + private _petId: number; + private _canBreed: boolean; + private _canHarvest: boolean; + private _canRevive: boolean; + private _hasBreedingPermission: boolean; + + public flush(): boolean + { + this._roomIndex = -1; + this._petId = -1; + this._canBreed = false; + this._canHarvest = false; + this._canRevive = false; + this._hasBreedingPermission = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomIndex = wrapper.readInt(); + this._petId = wrapper.readInt(); + this._canBreed = wrapper.readBoolean(); + this._canHarvest = wrapper.readBoolean(); + this._canRevive = wrapper.readBoolean(); + this._hasBreedingPermission = wrapper.readBoolean(); + + return true; + } + + public get roomIndex(): number + { + return this._roomIndex; + } + + 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/packages/communication/src/messages/parser/room/pet/index.ts b/packages/communication/src/messages/parser/room/pet/index.ts new file mode 100644 index 0000000..5e187c2 --- /dev/null +++ b/packages/communication/src/messages/parser/room/pet/index.ts @@ -0,0 +1,5 @@ +export * from './PetBreedingResultParser'; +export * from './PetExperienceParser'; +export * from './PetFigureUpdateParser'; +export * from './PetInfoParser'; +export * from './PetStatusUpdateParser'; diff --git a/packages/communication/src/messages/parser/room/session/YouArePlayingGameParser.ts b/packages/communication/src/messages/parser/room/session/YouArePlayingGameParser.ts new file mode 100644 index 0000000..093d295 --- /dev/null +++ b/packages/communication/src/messages/parser/room/session/YouArePlayingGameParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class YouArePlayingGameParser implements IMessageParser +{ + private _isPlaying: boolean; + + public flush(): boolean + { + this._isPlaying = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._isPlaying = wrapper.readBoolean(); + + return true; + } + + public get isPlaying(): boolean + { + return this._isPlaying; + } +} diff --git a/packages/communication/src/messages/parser/room/session/YouAreSpectatorMessageParser.ts b/packages/communication/src/messages/parser/room/session/YouAreSpectatorMessageParser.ts new file mode 100644 index 0000000..07c351a --- /dev/null +++ b/packages/communication/src/messages/parser/room/session/YouAreSpectatorMessageParser.ts @@ -0,0 +1,14 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class YouAreSpectatorMessageParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + return true; + } +} diff --git a/packages/communication/src/messages/parser/room/session/index.ts b/packages/communication/src/messages/parser/room/session/index.ts new file mode 100644 index 0000000..4624934 --- /dev/null +++ b/packages/communication/src/messages/parser/room/session/index.ts @@ -0,0 +1,2 @@ +export * from './YouArePlayingGameParser'; +export * from './YouAreSpectatorMessageParser'; diff --git a/packages/communication/src/messages/parser/room/unit/RoomUnitDanceParser.ts b/packages/communication/src/messages/parser/room/unit/RoomUnitDanceParser.ts new file mode 100644 index 0000000..915052c --- /dev/null +++ b/packages/communication/src/messages/parser/room/unit/RoomUnitDanceParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomUnitDanceParser implements IMessageParser +{ + private _unitId: number; + private _danceId: number; + + public flush(): boolean + { + this._unitId = null; + this._danceId = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._unitId = wrapper.readInt(); + this._danceId = wrapper.readInt(); + + return true; + } + + public get unitId(): number + { + return this._unitId; + } + + public get danceId(): number + { + return this._danceId; + } +} diff --git a/packages/communication/src/messages/parser/room/unit/RoomUnitEffectParser.ts b/packages/communication/src/messages/parser/room/unit/RoomUnitEffectParser.ts new file mode 100644 index 0000000..77fb9a8 --- /dev/null +++ b/packages/communication/src/messages/parser/room/unit/RoomUnitEffectParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomUnitEffectParser implements IMessageParser +{ + private _unitId: number; + private _effectId: number; + private _delay: number; + + public flush(): boolean + { + this._unitId = null; + this._effectId = 0; + this._delay = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._unitId = wrapper.readInt(); + this._effectId = wrapper.readInt(); + this._delay = wrapper.readInt(); + + return true; + } + + public get unitId(): number + { + return this._unitId; + } + + public get effectId(): number + { + return this._effectId; + } + + public get delay(): number + { + return this._delay; + } +} diff --git a/packages/communication/src/messages/parser/room/unit/RoomUnitExpressionParser.ts b/packages/communication/src/messages/parser/room/unit/RoomUnitExpressionParser.ts new file mode 100644 index 0000000..043e5fe --- /dev/null +++ b/packages/communication/src/messages/parser/room/unit/RoomUnitExpressionParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomUnitExpressionParser implements IMessageParser +{ + private _unitId: number; + private _expression: number; + + public flush(): boolean + { + this._unitId = null; + this._expression = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._unitId = wrapper.readInt(); + this._expression = wrapper.readInt(); + + return true; + } + + public get unitId(): number + { + return this._unitId; + } + + public get expression(): number + { + return this._expression; + } +} diff --git a/packages/communication/src/messages/parser/room/unit/RoomUnitHandItemParser.ts b/packages/communication/src/messages/parser/room/unit/RoomUnitHandItemParser.ts new file mode 100644 index 0000000..b6f7e0f --- /dev/null +++ b/packages/communication/src/messages/parser/room/unit/RoomUnitHandItemParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomUnitHandItemParser implements IMessageParser +{ + private _unitId: number; + private _handId: number; + + public flush(): boolean + { + this._unitId = null; + this._handId = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._unitId = wrapper.readInt(); + this._handId = wrapper.readInt(); + + return true; + } + + public get unitId(): number + { + return this._unitId; + } + + public get handId(): number + { + return this._handId; + } +} diff --git a/packages/communication/src/messages/parser/room/unit/RoomUnitHandItemReceivedParser.ts b/packages/communication/src/messages/parser/room/unit/RoomUnitHandItemReceivedParser.ts new file mode 100644 index 0000000..54556fe --- /dev/null +++ b/packages/communication/src/messages/parser/room/unit/RoomUnitHandItemReceivedParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomUnitHandItemReceivedParser implements IMessageParser +{ + private _giverUserId: number; + private _handItemType: number; + + public flush(): boolean + { + this._giverUserId = -1; + this._handItemType = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._giverUserId = wrapper.readInt(); + this._handItemType = wrapper.readInt(); + + return true; + } + + public get giverUserId(): number + { + return this._giverUserId; + } + + public get handItemType(): number + { + return this._handItemType; + } +} diff --git a/packages/communication/src/messages/parser/room/unit/RoomUnitIdleParser.ts b/packages/communication/src/messages/parser/room/unit/RoomUnitIdleParser.ts new file mode 100644 index 0000000..fa2940b --- /dev/null +++ b/packages/communication/src/messages/parser/room/unit/RoomUnitIdleParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomUnitIdleParser implements IMessageParser +{ + private _unitId: number; + private _isIdle: boolean; + + public flush(): boolean + { + this._unitId = null; + this._isIdle = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._unitId = wrapper.readInt(); + this._isIdle = wrapper.readBoolean(); + + return true; + } + + public get unitId(): number + { + return this._unitId; + } + + public get isIdle(): boolean + { + return this._isIdle; + } +} diff --git a/packages/communication/src/messages/parser/room/unit/RoomUnitInfoParser.ts b/packages/communication/src/messages/parser/room/unit/RoomUnitInfoParser.ts new file mode 100644 index 0000000..2fed182 --- /dev/null +++ b/packages/communication/src/messages/parser/room/unit/RoomUnitInfoParser.ts @@ -0,0 +1,59 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomUnitInfoParser implements IMessageParser +{ + private _unitId: number; + private _figure: string; + private _gender: string; + private _motto: string; + private _achievementScore: number; + + public flush(): boolean + { + this._unitId = null; + this._figure = null; + this._gender = 'M'; + this._motto = null; + this._achievementScore = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._unitId = wrapper.readInt(); + this._figure = wrapper.readString(); + this._gender = wrapper.readString().toLocaleUpperCase(); + this._motto = wrapper.readString(); + this._achievementScore = wrapper.readInt(); + + return true; + } + + public get unitId(): number + { + return this._unitId; + } + + public get figure(): string + { + return this._figure; + } + + public get gender(): string + { + return this._gender; + } + + public get motto(): string + { + return this._motto; + } + + public get achievementScore(): number + { + return this._achievementScore; + } +} diff --git a/packages/communication/src/messages/parser/room/unit/RoomUnitNumberParser.ts b/packages/communication/src/messages/parser/room/unit/RoomUnitNumberParser.ts new file mode 100644 index 0000000..7868f22 --- /dev/null +++ b/packages/communication/src/messages/parser/room/unit/RoomUnitNumberParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomUnitNumberParser implements IMessageParser +{ + private _unitId: number; + private _value: number; + + public flush(): boolean + { + this._unitId = null; + this._value = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._unitId = wrapper.readInt(); + this._value = wrapper.readInt(); + + return true; + } + + public get unitId(): number + { + return this._unitId; + } + + public get value(): number + { + return this._value; + } +} diff --git a/packages/communication/src/messages/parser/room/unit/RoomUnitParser.ts b/packages/communication/src/messages/parser/room/unit/RoomUnitParser.ts new file mode 100644 index 0000000..dbd5976 --- /dev/null +++ b/packages/communication/src/messages/parser/room/unit/RoomUnitParser.ts @@ -0,0 +1,186 @@ +import { IMessageDataWrapper, IMessageParser, RoomObjectType } from '@nitrots/api'; +import { UserMessageData } from './UserMessageData'; + +export class RoomUnitParser implements IMessageParser +{ + private _users: UserMessageData[]; + + public flush(): boolean + { + this._users = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._users = []; + + const totalUsers = wrapper.readInt(); + + let i = 0; + + while(i < totalUsers) + { + const id = wrapper.readInt(); + const username = wrapper.readString(); + const custom = wrapper.readString(); + let figure = wrapper.readString(); + const roomIndex = wrapper.readInt(); + const x = wrapper.readInt(); + const y = wrapper.readInt(); + const z = parseFloat(wrapper.readString()); + const direction = wrapper.readInt(); + const type = wrapper.readInt(); + + const user = new UserMessageData(roomIndex); + + user.dir = direction; + user.name = username; + user.custom = custom; + user.x = x; + user.y = y; + user.z = z; + + this._users.push(user); + + if(type === 1) + { + user.webID = id; + user.userType = RoomObjectType.USER; + user.sex = this.resolveSex(wrapper.readString()); + user.groupID = wrapper.readInt(); + user.groupStatus = wrapper.readInt(); + user.groupName = wrapper.readString(); + + const swimFigure = wrapper.readString(); + + if(swimFigure !== '') figure = this.convertSwimFigure(swimFigure, figure, user.sex); + + user.figure = figure; + user.activityPoints = wrapper.readInt(); + user.isModerator = wrapper.readBoolean(); + } + + else if(type === 2) + { + user.userType = RoomObjectType.PET; + user.figure = figure; + user.webID = id; + user.subType = wrapper.readInt().toString(); + user.ownerId = wrapper.readInt(); + user.ownerName = wrapper.readString(); + user.rarityLevel = wrapper.readInt(); + user.hasSaddle = wrapper.readBoolean(); + user.isRiding = wrapper.readBoolean(); + user.canBreed = wrapper.readBoolean(); + user.canHarvest = wrapper.readBoolean(); + user.canRevive = wrapper.readBoolean(); + user.hasBreedingPermission = wrapper.readBoolean(); + user.petLevel = wrapper.readInt(); + user.petPosture = wrapper.readString(); + } + + else if(type === 3) + { + user.userType = RoomObjectType.BOT; + user.webID = (roomIndex * -1); + + if(figure.indexOf('/') === -1) user.figure = figure; + else user.figure = 'hr-100-.hd-180-1.ch-876-66.lg-270-94.sh-300-64'; + + user.sex = UserMessageData.M; + } + + else if(type === 4) + { + user.userType = RoomObjectType.RENTABLE_BOT; + user.webID = id; + user.sex = this.resolveSex(wrapper.readString()); + user.figure = figure; + user.ownerId = wrapper.readInt(); + user.ownerName = wrapper.readString(); + + const totalSkills = wrapper.readInt(); + + if(totalSkills) + { + const skills: number[] = []; + + let j = 0; + + while(j < totalSkills) + { + skills.push(wrapper.readShort()); + + j++; + } + + user.botSkills = skills; + } + } + + i++; + } + + return true; + } + + private resolveSex(sex: string): string + { + if(sex.substr(0, 1).toLowerCase() === 'f') return UserMessageData.F; + + return UserMessageData.M; + } + + private convertSwimFigure(k: string, _arg_2: string, _arg_3: string): string + { + const _local_4 = _arg_2.split('.'); + let _local_5 = 1; + let _local_6 = 1; + let _local_7 = 1; + const _local_8 = 10000; + let i = 0; + + while(i < _local_4.length) + { + const _local_13 = _local_4[i]; + const _local_14 = _local_13.split('-'); + + if(_local_14.length > 2) + { + const _local_15 = _local_14[0]; + + if(_local_15 === 'hd') _local_5 = parseInt(_local_14[2]); + } + + i++; + } + + const _local_10 = ['238,238,238', '250,56,49', '253,146,160', '42,199,210', '53,51,44', '239,255,146', '198,255,152', '255,146,90', '157,89,126', '182,243,255', '109,255,51', '51,120,201', '255,182,49', '223,161,233', '249,251,50', '202,175,143', '197,198,197', '71,98,61', '138,131,97', '255,140,51', '84,198,39', '30,108,153', '152,79,136', '119,200,255', '255,192,142', '60,75,135', '124,44,71', '215,255,227', '143,63,28', '255,99,147', '31,155,121', '253,255,51']; + const _local_11 = k.split('='); + + if(_local_11.length > 1) + { + const _local_16 = _local_11[1].split('/'); + const _local_17 = _local_16[0]; + const _local_18 = _local_16[1]; + + if(_arg_3 === 'F') _local_7 = 10010; + else _local_7 = 10011; + + const _local_19 = _local_10.indexOf(_local_18); + + _local_6 = ((_local_8 + _local_19) + 1); + } + + return _arg_2 + ((((('.bds-10001-' + _local_5) + '.ss-') + _local_7) + '-') + _local_6); + } + + public get users(): UserMessageData[] + { + return this._users; + } +} diff --git a/packages/communication/src/messages/parser/room/unit/RoomUnitRemoveParser.ts b/packages/communication/src/messages/parser/room/unit/RoomUnitRemoveParser.ts new file mode 100644 index 0000000..8032a0a --- /dev/null +++ b/packages/communication/src/messages/parser/room/unit/RoomUnitRemoveParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomUnitRemoveParser implements IMessageParser +{ + private _unitId: number; + + public flush(): boolean + { + this._unitId = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._unitId = parseInt(wrapper.readString()); + + return true; + } + + public get unitId(): number + { + return this._unitId; + } +} diff --git a/packages/communication/src/messages/parser/room/unit/RoomUnitStatusAction.ts b/packages/communication/src/messages/parser/room/unit/RoomUnitStatusAction.ts new file mode 100644 index 0000000..f49e657 --- /dev/null +++ b/packages/communication/src/messages/parser/room/unit/RoomUnitStatusAction.ts @@ -0,0 +1,21 @@ +export class RoomUnitStatusAction +{ + private _action: string; + private _value: string; + + constructor(action: string, value: string) + { + this._action = action; + this._value = value; + } + + public get action(): string + { + return this._action; + } + + public get value(): string + { + return this._value; + } +} \ No newline at end of file diff --git a/packages/communication/src/messages/parser/room/unit/RoomUnitStatusMessage.ts b/packages/communication/src/messages/parser/room/unit/RoomUnitStatusMessage.ts new file mode 100644 index 0000000..5bc7d58 --- /dev/null +++ b/packages/communication/src/messages/parser/room/unit/RoomUnitStatusMessage.ts @@ -0,0 +1,100 @@ +import { RoomUnitStatusAction } from './RoomUnitStatusAction'; + +export class RoomUnitStatusMessage +{ + private _id: number; + private _x: number; + private _y: number; + private _z: number; + private _height: number; + private _headDirection: number; + private _direction: number; + private _targetX: number; + private _targetY: number; + private _targetZ: number; + private _didMove: boolean; + private _canStandUp: boolean; + private _actions: RoomUnitStatusAction[]; + + constructor(id: number, x: number, y: number, z: number, height: number, headDirection: number, direction: number, targetX: number = 0, targetY: number = 0, targetZ: number = 0, didMove: boolean, canStandUp: boolean, actions: RoomUnitStatusAction[]) + { + this._id = id; + this._x = x; + this._y = y; + this._z = z; + this._height = height; + this._headDirection = headDirection; + this._direction = direction; + this._targetX = targetX; + this._targetY = targetY; + this._targetZ = targetZ; + this._didMove = didMove; + this._canStandUp = canStandUp; + this._actions = actions || []; + } + + public get id(): number + { + return this._id; + } + + public get x(): number + { + return this._x; + } + + public get y(): number + { + return this._y; + } + + public get z(): number + { + return this._z; + } + + public get height(): number + { + return this._height; + } + + public get headDirection(): number + { + return this._headDirection; + } + + public get direction(): number + { + return this._direction; + } + + public get targetX(): number + { + return this._targetX; + } + + public get targetY(): number + { + return this._targetY; + } + + public get targetZ(): number + { + return this._targetZ; + } + + public get didMove(): boolean + { + return this._didMove; + } + + public get canStandUp(): boolean + { + return this._canStandUp; + } + + public get actions(): RoomUnitStatusAction[] + { + return this._actions; + } +} \ No newline at end of file diff --git a/packages/communication/src/messages/parser/room/unit/RoomUnitStatusParser.ts b/packages/communication/src/messages/parser/room/unit/RoomUnitStatusParser.ts new file mode 100644 index 0000000..3ba39e1 --- /dev/null +++ b/packages/communication/src/messages/parser/room/unit/RoomUnitStatusParser.ts @@ -0,0 +1,119 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { RoomUnitStatusAction } from './RoomUnitStatusAction'; +import { RoomUnitStatusMessage } from './RoomUnitStatusMessage'; + +export class RoomUnitStatusParser implements IMessageParser +{ + private _statuses: RoomUnitStatusMessage[]; + + public flush(): boolean + { + this._statuses = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalUnits = wrapper.readInt(); + + while(totalUnits > 0) + { + const status = this.parseStatus(wrapper); + + if(!status) + { + totalUnits--; + + continue; + } + + this._statuses.push(status); + + totalUnits--; + } + + return true; + } + + public parseStatus(wrapper: IMessageDataWrapper): RoomUnitStatusMessage + { + if(!wrapper) return null; + + const unitId = wrapper.readInt(); + const x = wrapper.readInt(); + const y = wrapper.readInt(); + const z = parseFloat(wrapper.readString()); + const headDirection = ((wrapper.readInt() % 8) * 45); + const direction = ((wrapper.readInt() % 8) * 45); + const actions = wrapper.readString(); + + let targetX = 0; + let targetY = 0; + let targetZ = 0; + let height = 0; + let canStandUp = false; + let didMove = false; + const isSlide = false; + + if(actions) + { + const actionParts = actions.split('/'); + const statusActions: RoomUnitStatusAction[] = []; + + for(const action of actionParts) + { + const parts = action.split(' '); + + if(parts[0] === '') continue; + + if(parts.length >= 2) + { + switch(parts[0]) + { + case 'mv': { + const values = parts[1].split(','); + + if(values.length >= 3) + { + targetX = parseInt(values[0]); + targetY = parseInt(values[1]); + targetZ = parseFloat(values[2]); + didMove = true; + } + + break; + } + case 'sit': { + const sitHeight = parseFloat(parts[1]); + + if(parts.length >= 3) canStandUp = (parts[2] === '1'); + + height = sitHeight; + + break; + } + case 'lay': { + const layHeight = parseFloat(parts[1]); + + height = Math.abs(layHeight); + + break; + } + } + + statusActions.push(new RoomUnitStatusAction(parts[0], parts[1])); + } + } + + this._statuses.push(new RoomUnitStatusMessage(unitId, x, y, z, height, headDirection, direction, targetX, targetY, targetZ, didMove, canStandUp, statusActions)); + } + } + + public get statuses(): RoomUnitStatusMessage[] + { + return this._statuses; + } +} diff --git a/packages/communication/src/messages/parser/room/unit/UserMessageData.ts b/packages/communication/src/messages/parser/room/unit/UserMessageData.ts new file mode 100644 index 0000000..b6a944d --- /dev/null +++ b/packages/communication/src/messages/parser/room/unit/UserMessageData.ts @@ -0,0 +1,412 @@ +export class UserMessageData +{ + public static M: string = 'M'; + public static F: string = 'F'; + + private _roomIndex: number = 0; + private _x: number = 0; + private _y: number = 0; + private _z: number = 0; + private _dir: number = 0; + private _name: string = ''; + private _userType: number = 0; + private _sex: string = ''; + private _figure: string = ''; + private _custom: string = ''; + private _activityPoints: number = 0; + private _webID: number = 0; + private _groupID: number = 0; + private _groupStatus: number = 0; + private _groupName: string = ''; + private _subType: string = ''; + private _ownerId: number = 0; + private _ownerName: string = ''; + private _rarityLevel: number = 0; + private _hasSaddle: boolean = false; + private _isRiding: boolean = false; + private _canBreed: boolean = false; + private _canHarvest: boolean = false; + private _canRevive: boolean = false; + private _hasBreedingPermission: boolean = false; + private _petLevel: number = 0; + private _petPosture: string = ''; + private _botSkills: number[] = []; + private _isModerator: boolean = false; + private _isReadOnly: boolean = false; + + constructor(k: number) + { + this._roomIndex = k; + } + + public setReadOnly(): void + { + this._isReadOnly = true; + } + + public get roomIndex(): number + { + return this._roomIndex; + } + + public get x(): number + { + return this._x; + } + + public set x(k: number) + { + if(!this._isReadOnly) + { + this._x = k; + } + } + + public get y(): number + { + return this._y; + } + + public set y(k: number) + { + if(!this._isReadOnly) + { + this._y = k; + } + } + + public get z(): number + { + return this._z; + } + + public set z(k: number) + { + if(!this._isReadOnly) + { + this._z = k; + } + } + + public get dir(): number + { + return this._dir; + } + + public set dir(k: number) + { + if(!this._isReadOnly) + { + this._dir = k; + } + } + + public get name(): string + { + return this._name; + } + + public set name(k: string) + { + if(!this._isReadOnly) + { + this._name = k; + } + } + + public get userType(): number + { + return this._userType; + } + + public set userType(k: number) + { + if(!this._isReadOnly) + { + this._userType = k; + } + } + + public get sex(): string + { + return this._sex; + } + + public set sex(k: string) + { + if(!this._isReadOnly) + { + this._sex = k; + } + } + + public get figure(): string + { + return this._figure; + } + + public set figure(k: string) + { + if(!this._isReadOnly) + { + this._figure = k; + } + } + + public get custom(): string + { + return this._custom; + } + + public set custom(k: string) + { + if(!this._isReadOnly) + { + this._custom = k; + } + } + + public get activityPoints(): number + { + return this._activityPoints; + } + + public set activityPoints(k: number) + { + if(!this._isReadOnly) + { + this._activityPoints = k; + } + } + + public get webID(): number + { + return this._webID; + } + + public set webID(k: number) + { + if(!this._isReadOnly) + { + this._webID = k; + } + } + + public get groupID(): number + { + return this._groupID; + } + + public set groupID(groupId: number) + { + if(!this._isReadOnly) + { + this._groupID = groupId; + } + } + + public get groupName(): string + { + return this._groupName; + } + + public set groupName(k: string) + { + if(!this._isReadOnly) + { + this._groupName = k; + } + } + + public get groupStatus(): number + { + return this._groupStatus; + } + + public set groupStatus(k: number) + { + if(!this._isReadOnly) + { + this._groupStatus = k; + } + } + + public get subType(): string + { + return this._subType; + } + + public set subType(k: string) + { + if(!this._isReadOnly) + { + this._subType = k; + } + } + + public get ownerId(): number + { + return this._ownerId; + } + + public set ownerId(k: number) + { + if(!this._isReadOnly) + { + this._ownerId = k; + } + } + + public get ownerName(): string + { + return this._ownerName; + } + + public set ownerName(k: string) + { + if(!this._isReadOnly) + { + this._ownerName = k; + } + } + + public get rarityLevel(): number + { + return this._rarityLevel; + } + + public set rarityLevel(k: number) + { + if(!this._isReadOnly) + { + this._rarityLevel = k; + } + } + + public get hasSaddle(): boolean + { + return this._hasSaddle; + } + + public set hasSaddle(k: boolean) + { + if(!this._isReadOnly) + { + this._hasSaddle = k; + } + } + + public get isRiding(): boolean + { + return this._isRiding; + } + + public set isRiding(k: boolean) + { + if(!this._isReadOnly) + { + this._isRiding = k; + } + } + + public get canBreed(): boolean + { + return this._canBreed; + } + + public set canBreed(k: boolean) + { + if(!this._isReadOnly) + { + this._canBreed = k; + } + } + + public get canHarvest(): boolean + { + return this._canHarvest; + } + + public set canHarvest(k: boolean) + { + if(!this._isReadOnly) + { + this._canHarvest = k; + } + } + + public get canRevive(): boolean + { + return this._canRevive; + } + + public set canRevive(k: boolean) + { + if(!this._isReadOnly) + { + this._canRevive = k; + } + } + + public get hasBreedingPermission(): boolean + { + return this._hasBreedingPermission; + } + + public set hasBreedingPermission(k: boolean) + { + if(!this._isReadOnly) + { + this._hasBreedingPermission = k; + } + } + + public get petLevel(): number + { + return this._petLevel; + } + + public set petLevel(k: number) + { + if(!this._isReadOnly) + { + this._petLevel = k; + } + } + + public get petPosture(): string + { + return this._petPosture; + } + + public set petPosture(k: string) + { + if(!this._isReadOnly) + { + this._petPosture = k; + } + } + + public get botSkills(): number[] + { + return this._botSkills; + } + + public set botSkills(k: number[]) + { + this._botSkills = k; + } + + public get isModerator(): boolean + { + return this._isModerator; + } + + public set isModerator(k: boolean) + { + if(!this._isReadOnly) + { + this._isModerator = k; + } + } +} diff --git a/packages/communication/src/messages/parser/room/unit/chat/FloodControlParser.ts b/packages/communication/src/messages/parser/room/unit/chat/FloodControlParser.ts new file mode 100644 index 0000000..a29e9f7 --- /dev/null +++ b/packages/communication/src/messages/parser/room/unit/chat/FloodControlParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FloodControlParser implements IMessageParser +{ + private _seconds: number; + + public flush(): boolean + { + this._seconds = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._seconds = wrapper.readInt(); + + return true; + } + + public get seconds(): number + { + return this._seconds; + } +} diff --git a/packages/communication/src/messages/parser/room/unit/chat/RemainingMuteParser.ts b/packages/communication/src/messages/parser/room/unit/chat/RemainingMuteParser.ts new file mode 100644 index 0000000..299ab5a --- /dev/null +++ b/packages/communication/src/messages/parser/room/unit/chat/RemainingMuteParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RemainingMuteParser implements IMessageParser +{ + private _seconds: number; + + public flush(): boolean + { + this._seconds = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._seconds = wrapper.readInt(); + + return true; + } + + public get seconds(): number + { + return this._seconds; + } +} diff --git a/packages/communication/src/messages/parser/room/unit/chat/RoomUnitChatParser.ts b/packages/communication/src/messages/parser/room/unit/chat/RoomUnitChatParser.ts new file mode 100644 index 0000000..571f9b9 --- /dev/null +++ b/packages/communication/src/messages/parser/room/unit/chat/RoomUnitChatParser.ts @@ -0,0 +1,87 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomUnitChatParser implements IMessageParser +{ + private _roomIndex: number; + private _message: string; + private _gesture: number; + private _bubble: number; + private _urls: string[]; + private _messageLength: number; + + public flush(): boolean + { + this._roomIndex = null; + this._message = null; + this._gesture = 0; + this._bubble = 0; + this._urls = []; + this._messageLength = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomIndex = wrapper.readInt(); + this._message = wrapper.readString(); + this._gesture = wrapper.readInt(); + this._bubble = wrapper.readInt(); + + this.parseUrls(wrapper); + + this._messageLength = wrapper.readInt(); + + return true; + } + + private parseUrls(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._urls = []; + + let totalUrls = wrapper.readInt(); + + while(totalUrls > 0) + { + this._urls.push(wrapper.readString()); + + totalUrls--; + } + + return true; + } + + public get roomIndex(): number + { + return this._roomIndex; + } + + public get message(): string + { + return this._message; + } + + public get gesture(): number + { + return this._gesture; + } + + public get bubble(): number + { + return this._bubble; + } + + public get urls(): string[] + { + return this._urls; + } + + public get messageLength(): number + { + return this._messageLength; + } +} diff --git a/packages/communication/src/messages/parser/room/unit/chat/RoomUnitTypingParser.ts b/packages/communication/src/messages/parser/room/unit/chat/RoomUnitTypingParser.ts new file mode 100644 index 0000000..1879fe4 --- /dev/null +++ b/packages/communication/src/messages/parser/room/unit/chat/RoomUnitTypingParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomUnitTypingParser implements IMessageParser +{ + private _unitId: number; + private _isTyping: boolean; + + public flush(): boolean + { + this._unitId = null; + this._isTyping = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._unitId = wrapper.readInt(); + this._isTyping = wrapper.readInt() === 1 ? true : false; + + return true; + } + + public get unitId(): number + { + return this._unitId; + } + + public get isTyping(): boolean + { + return this._isTyping; + } +} diff --git a/packages/communication/src/messages/parser/room/unit/chat/index.ts b/packages/communication/src/messages/parser/room/unit/chat/index.ts new file mode 100644 index 0000000..e9ab87f --- /dev/null +++ b/packages/communication/src/messages/parser/room/unit/chat/index.ts @@ -0,0 +1,4 @@ +export * from './FloodControlParser'; +export * from './RemainingMuteParser'; +export * from './RoomUnitChatParser'; +export * from './RoomUnitTypingParser'; diff --git a/packages/communication/src/messages/parser/room/unit/index.ts b/packages/communication/src/messages/parser/room/unit/index.ts new file mode 100644 index 0000000..9728961 --- /dev/null +++ b/packages/communication/src/messages/parser/room/unit/index.ts @@ -0,0 +1,15 @@ +export * from './chat'; +export * from './RoomUnitDanceParser'; +export * from './RoomUnitEffectParser'; +export * from './RoomUnitExpressionParser'; +export * from './RoomUnitHandItemParser'; +export * from './RoomUnitHandItemReceivedParser'; +export * from './RoomUnitIdleParser'; +export * from './RoomUnitInfoParser'; +export * from './RoomUnitNumberParser'; +export * from './RoomUnitParser'; +export * from './RoomUnitRemoveParser'; +export * from './RoomUnitStatusAction'; +export * from './RoomUnitStatusMessage'; +export * from './RoomUnitStatusParser'; +export * from './UserMessageData'; diff --git a/packages/communication/src/messages/parser/roomevents/ConditionDefinition.ts b/packages/communication/src/messages/parser/roomevents/ConditionDefinition.ts new file mode 100644 index 0000000..cc1b8dc --- /dev/null +++ b/packages/communication/src/messages/parser/roomevents/ConditionDefinition.ts @@ -0,0 +1,24 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { Triggerable } from './Triggerable'; + +export class ConditionDefinition extends Triggerable +{ + private _type: number; + + constructor(wrapper: IMessageDataWrapper) + { + super(wrapper); + + this._type = wrapper.readInt(); + } + + public get type(): number + { + return this._type; + } + + public get code(): number + { + return this._type; + } +} diff --git a/packages/communication/src/messages/parser/roomevents/TriggerDefinition.ts b/packages/communication/src/messages/parser/roomevents/TriggerDefinition.ts new file mode 100644 index 0000000..d2f8645 --- /dev/null +++ b/packages/communication/src/messages/parser/roomevents/TriggerDefinition.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { Triggerable } from './Triggerable'; + +export class TriggerDefinition extends Triggerable +{ + private _triggerConf: number; + private _conflictingActions: number[]; + + constructor(wrapper: IMessageDataWrapper) + { + super(wrapper); + + this._conflictingActions = []; + this._triggerConf = wrapper.readInt(); + + let count = wrapper.readInt(); + + while(count > 0) + { + this._conflictingActions.push(wrapper.readInt()); + + count--; + } + } + + public get code(): number + { + return this._triggerConf; + } + + public get conflictingActions(): number[] + { + return this._conflictingActions; + } +} diff --git a/packages/communication/src/messages/parser/roomevents/Triggerable.ts b/packages/communication/src/messages/parser/roomevents/Triggerable.ts new file mode 100644 index 0000000..705343b --- /dev/null +++ b/packages/communication/src/messages/parser/roomevents/Triggerable.ts @@ -0,0 +1,100 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class Triggerable +{ + private _stuffTypeSelectionEnabled: boolean; + private _furniLimit: number; + private _stuffIds: number[]; + private _id: number; + private _stringParam: string; + private _intParams: number[]; + private _stuffTypeId: number; + private _stuffTypeSelectionCode: number; + + constructor(wrapper: IMessageDataWrapper) + { + this._stuffIds = []; + this._intParams = []; + this._stuffTypeSelectionEnabled = wrapper.readBoolean(); + this._furniLimit = wrapper.readInt(); + + let count = wrapper.readInt(); + + while(count > 0) + { + this._stuffIds.push(wrapper.readInt()); + + count--; + } + + this._stuffTypeId = wrapper.readInt(); + this._id = wrapper.readInt(); + this._stringParam = wrapper.readString(); + + count = wrapper.readInt(); + + while(count > 0) + { + this._intParams.push(wrapper.readInt()); + + count--; + } + + this._stuffTypeSelectionCode = wrapper.readInt(); + } + + public getBoolean(index: number): boolean + { + return (this._intParams[index] === 1); + } + + public get stuffTypeSelectionEnabled(): boolean + { + return this._stuffTypeSelectionEnabled; + } + + public get stuffTypeSelectionCode(): number + { + return this._stuffTypeSelectionCode; + } + + public set stuffTypeSelectionCode(k: number) + { + this._stuffTypeSelectionCode = k; + } + + public get maximumItemSelectionCount(): number + { + return this._furniLimit; + } + + public get selectedItems(): number[] + { + return this._stuffIds; + } + + public get id(): number + { + return this._id; + } + + public get stringData(): string + { + return this._stringParam; + } + + public get intData(): number[] + { + return this._intParams; + } + + public get code(): number + { + return 0; + } + + public get spriteId(): number + { + return this._stuffTypeId; + } +} diff --git a/packages/communication/src/messages/parser/roomevents/WiredActionDefinition.ts b/packages/communication/src/messages/parser/roomevents/WiredActionDefinition.ts new file mode 100644 index 0000000..be1db47 --- /dev/null +++ b/packages/communication/src/messages/parser/roomevents/WiredActionDefinition.ts @@ -0,0 +1,47 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { Triggerable } from './Triggerable'; + +export class WiredActionDefinition extends Triggerable +{ + private _type: number; + private _delayInPulses: number; + private _conflictingTriggers: number[]; + + constructor(wrapper: IMessageDataWrapper) + { + super(wrapper); + + this._conflictingTriggers = []; + this._type = wrapper.readInt(); + this._delayInPulses = wrapper.readInt(); + + let count = wrapper.readInt(); + + while(count > 0) + { + this._conflictingTriggers.push(wrapper.readInt()); + + count--; + } + } + + public get type(): number + { + return this._type; + } + + public get code(): number + { + return this._type; + } + + public get delayInPulses(): number + { + return this._delayInPulses; + } + + public get conflictingTriggers(): number[] + { + return this._conflictingTriggers; + } +} diff --git a/packages/communication/src/messages/parser/roomevents/WiredFurniActionParser.ts b/packages/communication/src/messages/parser/roomevents/WiredFurniActionParser.ts new file mode 100644 index 0000000..6d7aa91 --- /dev/null +++ b/packages/communication/src/messages/parser/roomevents/WiredFurniActionParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { WiredActionDefinition } from './WiredActionDefinition'; + +export class WiredFurniActionParser implements IMessageParser +{ + private _definition: WiredActionDefinition; + + public flush(): boolean + { + this._definition = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._definition = new WiredActionDefinition(wrapper); + + return true; + } + + public get definition(): WiredActionDefinition + { + return this._definition; + } +} diff --git a/packages/communication/src/messages/parser/roomevents/WiredFurniConditionParser.ts b/packages/communication/src/messages/parser/roomevents/WiredFurniConditionParser.ts new file mode 100644 index 0000000..9470d6c --- /dev/null +++ b/packages/communication/src/messages/parser/roomevents/WiredFurniConditionParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { ConditionDefinition } from './ConditionDefinition'; + +export class WiredFurniConditionParser implements IMessageParser +{ + private _definition: ConditionDefinition; + + public flush(): boolean + { + this._definition = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._definition = new ConditionDefinition(wrapper); + + return true; + } + + public get definition(): ConditionDefinition + { + return this._definition; + } +} diff --git a/packages/communication/src/messages/parser/roomevents/WiredFurniTriggerParser.ts b/packages/communication/src/messages/parser/roomevents/WiredFurniTriggerParser.ts new file mode 100644 index 0000000..dc6c664 --- /dev/null +++ b/packages/communication/src/messages/parser/roomevents/WiredFurniTriggerParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { TriggerDefinition } from './TriggerDefinition'; + +export class WiredFurniTriggerParser implements IMessageParser +{ + private _definition: TriggerDefinition; + + public flush(): boolean + { + this._definition = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._definition = new TriggerDefinition(wrapper); + + return true; + } + + public get definition(): TriggerDefinition + { + return this._definition; + } +} diff --git a/packages/communication/src/messages/parser/roomevents/WiredOpenParser.ts b/packages/communication/src/messages/parser/roomevents/WiredOpenParser.ts new file mode 100644 index 0000000..8179cb1 --- /dev/null +++ b/packages/communication/src/messages/parser/roomevents/WiredOpenParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class WiredOpenParser implements IMessageParser +{ + private _stuffId: number; + + public flush(): boolean + { + this._stuffId = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._stuffId = wrapper.readInt(); + + return true; + } + + public get stuffId(): number + { + return this._stuffId; + } +} diff --git a/packages/communication/src/messages/parser/roomevents/WiredRewardResultMessageParser.ts b/packages/communication/src/messages/parser/roomevents/WiredRewardResultMessageParser.ts new file mode 100644 index 0000000..46be100 --- /dev/null +++ b/packages/communication/src/messages/parser/roomevents/WiredRewardResultMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class WiredRewardResultMessageParser implements IMessageParser +{ + private _reason: number; + + public flush(): boolean + { + this._reason = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._reason = wrapper.readInt(); + + return true; + } + + public get reason(): number + { + return this._reason; + } +} diff --git a/packages/communication/src/messages/parser/roomevents/WiredSaveSuccessParser.ts b/packages/communication/src/messages/parser/roomevents/WiredSaveSuccessParser.ts new file mode 100644 index 0000000..ef98439 --- /dev/null +++ b/packages/communication/src/messages/parser/roomevents/WiredSaveSuccessParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class WiredSaveSuccessParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/roomevents/WiredValidationErrorParser.ts b/packages/communication/src/messages/parser/roomevents/WiredValidationErrorParser.ts new file mode 100644 index 0000000..1a4ace0 --- /dev/null +++ b/packages/communication/src/messages/parser/roomevents/WiredValidationErrorParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class WiredValidationErrorParser implements IMessageParser +{ + private _info: string; + + public flush(): boolean + { + this._info = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._info = wrapper.readString(); + + return true; + } + + public get info(): string + { + return this._info; + } +} diff --git a/packages/communication/src/messages/parser/roomevents/index.ts b/packages/communication/src/messages/parser/roomevents/index.ts new file mode 100644 index 0000000..cca201e --- /dev/null +++ b/packages/communication/src/messages/parser/roomevents/index.ts @@ -0,0 +1,11 @@ +export * from './ConditionDefinition'; +export * from './Triggerable'; +export * from './TriggerDefinition'; +export * from './WiredActionDefinition'; +export * from './WiredFurniActionParser'; +export * from './WiredFurniConditionParser'; +export * from './WiredFurniTriggerParser'; +export * from './WiredOpenParser'; +export * from './WiredRewardResultMessageParser'; +export * from './WiredSaveSuccessParser'; +export * from './WiredValidationErrorParser'; diff --git a/packages/communication/src/messages/parser/roomsettings/BannedUserData.ts b/packages/communication/src/messages/parser/roomsettings/BannedUserData.ts new file mode 100644 index 0000000..8481cdc --- /dev/null +++ b/packages/communication/src/messages/parser/roomsettings/BannedUserData.ts @@ -0,0 +1,24 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { IFlatUser } from './IFlatUser'; + +export class BannedUserData implements IFlatUser +{ + private _userId: number; + private _userName: string; + + constructor(wrapper: IMessageDataWrapper) + { + this._userId = wrapper.readInt(); + this._userName = wrapper.readString(); + } + + public get userId(): number + { + return this._userId; + } + + public get userName(): string + { + return this._userName; + } +} diff --git a/packages/communication/src/messages/parser/roomsettings/BannedUsersFromRoomParser.ts b/packages/communication/src/messages/parser/roomsettings/BannedUsersFromRoomParser.ts new file mode 100644 index 0000000..528905e --- /dev/null +++ b/packages/communication/src/messages/parser/roomsettings/BannedUsersFromRoomParser.ts @@ -0,0 +1,44 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { BannedUserData } from './BannedUserData'; + +export class BannedUsersFromRoomParser implements IMessageParser +{ + private _roomId: number; + private _bannedUsers: BannedUserData[]; + + public flush(): boolean + { + this._roomId = 0; + this._bannedUsers = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomId = wrapper.readInt(); + + let totalBans = wrapper.readInt(); + + while(totalBans > 0) + { + this._bannedUsers.push(new BannedUserData(wrapper)); + + totalBans--; + } + + return true; + } + + public get roomId(): number + { + return this._roomId; + } + + public get bannedUsers(): BannedUserData[] + { + return this._bannedUsers; + } +} diff --git a/packages/communication/src/messages/parser/roomsettings/FlatControllerAddedParser.ts b/packages/communication/src/messages/parser/roomsettings/FlatControllerAddedParser.ts new file mode 100644 index 0000000..6c8e1c6 --- /dev/null +++ b/packages/communication/src/messages/parser/roomsettings/FlatControllerAddedParser.ts @@ -0,0 +1,36 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { FlatControllerData } from './FlatControllerData'; + +export class FlatControllerAddedParser implements IMessageParser +{ + private _roomId: number; + private _data: FlatControllerData; + + public flush(): boolean + { + this._roomId = 0; + this._data = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomId = wrapper.readInt(); + this._data = new FlatControllerData(wrapper); + + return true; + } + + public get roomId(): number + { + return this._roomId; + } + + public get data(): FlatControllerData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/roomsettings/FlatControllerData.ts b/packages/communication/src/messages/parser/roomsettings/FlatControllerData.ts new file mode 100644 index 0000000..d6df1bf --- /dev/null +++ b/packages/communication/src/messages/parser/roomsettings/FlatControllerData.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper } from '@nitrots/api'; +import { IFlatUser } from './IFlatUser'; + +export class FlatControllerData implements IFlatUser +{ + private _userId: number; + private _userName: string; + private _selected: boolean; + + constructor(wrapper: IMessageDataWrapper) + { + this._userId = wrapper.readInt(); + this._userName = wrapper.readString(); + } + + public get userId(): number + { + return this._userId; + } + + public get userName(): string + { + return this._userName; + } + + public get selected(): boolean + { + return this._selected; + } + + public set selected(selected: boolean) + { + this._selected = selected; + } +} diff --git a/packages/communication/src/messages/parser/roomsettings/FlatControllerRemovedParser.ts b/packages/communication/src/messages/parser/roomsettings/FlatControllerRemovedParser.ts new file mode 100644 index 0000000..a8af4cc --- /dev/null +++ b/packages/communication/src/messages/parser/roomsettings/FlatControllerRemovedParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FlatControllerRemovedParser implements IMessageParser +{ + private _roomId: number; + private _userId: number; + + public flush(): boolean + { + this._roomId = 0; + this._userId = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomId = wrapper.readInt(); + this._userId = wrapper.readInt(); + + return true; + } + + public get roomId(): number + { + return this._roomId; + } + + public get userId(): number + { + return this._userId; + } +} diff --git a/packages/communication/src/messages/parser/roomsettings/FlatControllersParser.ts b/packages/communication/src/messages/parser/roomsettings/FlatControllersParser.ts new file mode 100644 index 0000000..893b0f0 --- /dev/null +++ b/packages/communication/src/messages/parser/roomsettings/FlatControllersParser.ts @@ -0,0 +1,46 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class FlatControllersParser implements IMessageParser +{ + private _roomId: number; + private _users: Map; + + public flush(): boolean + { + this._roomId = 0; + this._users = new Map(); + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomId = wrapper.readInt(); + + let usersCount = wrapper.readInt(); + + while(usersCount > 0) + { + const id = wrapper.readInt(); + const name = wrapper.readString(); + + this._users.set(id, name); + + usersCount--; + } + + return true; + } + + public get roomId(): number + { + return this._roomId; + } + + public get users(): Map + { + return this._users; + } +} diff --git a/packages/communication/src/messages/parser/roomsettings/IFlatUser.ts b/packages/communication/src/messages/parser/roomsettings/IFlatUser.ts new file mode 100644 index 0000000..60c133d --- /dev/null +++ b/packages/communication/src/messages/parser/roomsettings/IFlatUser.ts @@ -0,0 +1,5 @@ +export interface IFlatUser +{ + userId: number; + userName: string; +} diff --git a/packages/communication/src/messages/parser/roomsettings/MuteAllInRoomParser.ts b/packages/communication/src/messages/parser/roomsettings/MuteAllInRoomParser.ts new file mode 100644 index 0000000..6b0508f --- /dev/null +++ b/packages/communication/src/messages/parser/roomsettings/MuteAllInRoomParser.ts @@ -0,0 +1,25 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class MuteAllInRoomParser implements IMessageParser +{ + private _isMuted: boolean; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._isMuted = wrapper.readBoolean(); + + return true; + } + + public get isMuted(): boolean + { + return this._isMuted; + } +} diff --git a/packages/communication/src/messages/parser/roomsettings/NoSuchFlatParser.ts b/packages/communication/src/messages/parser/roomsettings/NoSuchFlatParser.ts new file mode 100644 index 0000000..80c440c --- /dev/null +++ b/packages/communication/src/messages/parser/roomsettings/NoSuchFlatParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class NoSuchFlatParser implements IMessageParser +{ + private _roomId: number; + + public flush(): boolean + { + this._roomId = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomId = wrapper.readInt(); + + return true; + } + + public get roomId(): number + { + return this._roomId; + } +} diff --git a/packages/communication/src/messages/parser/roomsettings/RoomChatSettings.ts b/packages/communication/src/messages/parser/roomsettings/RoomChatSettings.ts new file mode 100644 index 0000000..fc3d1e5 --- /dev/null +++ b/packages/communication/src/messages/parser/roomsettings/RoomChatSettings.ts @@ -0,0 +1,57 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class RoomChatSettings +{ + public static CHAT_MODE_FREE_FLOW: number = 0; + public static CHAT_MODE_LINE_BY_LINE: number = 1; + public static CHAT_BUBBLE_WIDTH_WIDE: number = 0; + public static CHAT_BUBBLE_WIDTH_NORMAL: number = 1; + public static CHAT_BUBBLE_WIDTH_THIN: number = 2; + public static CHAT_SCROLL_SPEED_FAST: number = 0; + public static CHAT_SCROLL_SPEED_NORMAL: number = 1; + public static CHAT_SCROLL_SPEED_SLOW: number = 2; + public static FLOOD_FILTER_STRICT: number = 0; + public static FLOOD_FILTER_NORMAL: number = 1; + public static FLOOD_FILTER_LOOSE: number = 2; + + private _mode: number; + private _weight: number; + private _speed: number; + private _distance: number; + private _protection: number; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this._mode = wrapper.readInt(); + this._weight = wrapper.readInt(); + this._speed = wrapper.readInt(); + this._distance = wrapper.readInt(); + this._protection = wrapper.readInt(); + } + + public get mode(): number + { + return this._mode; + } + public get weight(): number + { + return this._weight; + } + + public get speed(): number + { + return this._speed; + } + + public get distance(): number + { + return this._distance; + } + + public get protection(): number + { + return this._protection; + } +} diff --git a/packages/communication/src/messages/parser/roomsettings/RoomModerationSettings.ts b/packages/communication/src/messages/parser/roomsettings/RoomModerationSettings.ts new file mode 100644 index 0000000..7b1cb09 --- /dev/null +++ b/packages/communication/src/messages/parser/roomsettings/RoomModerationSettings.ts @@ -0,0 +1,34 @@ +import { IMessageDataWrapper, IRoomModerationSettings } from '@nitrots/api'; + +export class RoomModerationSettings implements IRoomModerationSettings +{ + public static MODERATION_LEVEL_NONE: number = 0; + public static MODERATION_LEVEL_USER_WITH_RIGHTS: number = 1; + public static MODERATION_LEVEL_ALL: number = 2; + + private _allowMute: number; + private _allowKick: number; + private _allowBan: number; + + constructor(wrapper: IMessageDataWrapper) + { + this._allowMute = wrapper.readInt(); + this._allowKick = wrapper.readInt(); + this._allowBan = wrapper.readInt(); + } + + public get allowMute(): number + { + return this._allowMute; + } + + public get allowKick(): number + { + return this._allowKick; + } + + public get allowBan(): number + { + return this._allowBan; + } +} diff --git a/packages/communication/src/messages/parser/roomsettings/RoomSettingsData.ts b/packages/communication/src/messages/parser/roomsettings/RoomSettingsData.ts new file mode 100644 index 0000000..4384e5e --- /dev/null +++ b/packages/communication/src/messages/parser/roomsettings/RoomSettingsData.ts @@ -0,0 +1,332 @@ +import { BannedUserData } from './BannedUserData'; +import { FlatControllerData } from './FlatControllerData'; +import { RoomChatSettings } from './RoomChatSettings'; +import { RoomModerationSettings } from './RoomModerationSettings'; + +export class RoomSettingsData +{ + public static DOORMODE_OPEN: number = 0; + public static DOORMODE_CLOSED: number = 1; + public static DOORMODE_PASSWORD: number = 2; + public static DOORMODE_INVISIBLE: number = 3; + public static DOORMODE_NOOBS_ONLY: number = 4; + public static TRADEMODE_NOT_ALLOWED: number = 0; + public static TRADEMODE_WITH_CONTROLLER: number = 1; + public static TRADEMODE_ALLOWED: number = 2; + + private _roomId: number = -1; + private _name: string = null; + private _description: string = null; + private _doorMode: number = RoomSettingsData.DOORMODE_OPEN; + private _categoryId: number = -1; + private _maximumVisitors: number = 0; + private _maximumVisitorsLimit: number = 0; + private _tags: string[] = []; + private _tradeMode: number = RoomSettingsData.TRADEMODE_NOT_ALLOWED; + private _allowPets: boolean = false; + private _allowFoodConsume: boolean = false; + private _allowWalkThrough: boolean = false; + private _hideWalls: boolean = false; + private _wallThickness: number = 0; + private _floorThickness: number = 0; + private _controllersById: Map = new Map(); + private _controllerList: FlatControllerData[] = null; + private _highlightedUserId: number = -1; + private _bannedUsersById: Map = new Map(); + private _bannedUsersList: BannedUserData[] = null; + private _roomModerationSettings: RoomModerationSettings = null; + private _chatSettings: RoomChatSettings = null; + private _allowNavigatorDynamicCats: boolean = false; + + public static from(settings: RoomSettingsData) + { + const instance = new RoomSettingsData(); + + instance._roomId = settings._roomId; + instance._name = settings._name; + instance._description = settings._description; + instance._doorMode = settings._doorMode; + instance._categoryId = settings._categoryId; + instance._maximumVisitors = settings._maximumVisitors; + instance._maximumVisitorsLimit = settings._maximumVisitorsLimit; + instance._tags = settings._tags; + instance._tradeMode = settings._tradeMode; + instance._allowPets = settings._allowPets; + instance._allowFoodConsume = settings._allowFoodConsume; + instance._allowWalkThrough = settings._allowWalkThrough; + instance._hideWalls = settings._hideWalls; + instance._wallThickness = settings._wallThickness; + instance._floorThickness = settings._floorThickness; + instance._controllersById = settings._controllersById; + instance._controllerList = settings._controllerList; + instance._highlightedUserId = settings._highlightedUserId; + instance._bannedUsersById = settings._bannedUsersById; + instance._bannedUsersList = settings._bannedUsersList; + instance._roomModerationSettings = settings._roomModerationSettings; + instance._chatSettings = settings._chatSettings; + instance._allowNavigatorDynamicCats = settings._allowNavigatorDynamicCats; + + return instance; + } + + public static getDoorModeLocalizationKey(k: number): string + { + switch(k) + { + case RoomSettingsData.DOORMODE_OPEN: + return '${navigator.door.mode.open}'; + case RoomSettingsData.DOORMODE_CLOSED: + return '${navigator.door.mode.closed}'; + case RoomSettingsData.DOORMODE_PASSWORD: + return '${navigator.door.mode.password}'; + case RoomSettingsData.DOORMODE_INVISIBLE: + return '${navigator.door.mode.invisible}'; + case RoomSettingsData.DOORMODE_NOOBS_ONLY: + return '${navigator.door.mode.noobs_only}'; + } + return ''; + } + + public get tradeMode(): number + { + return this._tradeMode; + } + + public set tradeMode(mode: number) + { + this._tradeMode = mode; + } + + public get allowPets(): boolean + { + return this._allowPets; + } + + public set allowPets(flag: boolean) + { + this._allowPets = flag; + } + + public get allowFoodConsume(): boolean + { + return this._allowFoodConsume; + } + + public set allowFoodConsume(flag: boolean) + { + this._allowFoodConsume = flag; + } + + public get allowWalkThrough(): boolean + { + return this._allowWalkThrough; + } + + public set allowWalkThrough(flag: boolean) + { + this._allowWalkThrough = flag; + } + + public get hideWalls(): boolean + { + return this._hideWalls; + } + + public set hideWalls(flag: boolean) + { + this._hideWalls = flag; + } + + public get wallThickness(): number + { + return this._wallThickness; + } + + public set wallThickness(thickness: number) + { + this._wallThickness = thickness; + } + + public get floorThickness(): number + { + return this._floorThickness; + } + + public set floorThickness(thickness: number) + { + this._floorThickness = thickness; + } + + public get roomId(): number + { + return this._roomId; + } + + public set roomId(id: number) + { + this._roomId = id; + } + + public get name(): string + { + return this._name; + } + + public set name(name: string) + { + this._name = name; + } + + public get description(): string + { + return this._description; + } + + public set description(description: string) + { + this._description = description; + } + + public get doorMode(): number + { + return this._doorMode; + } + + public set doorMode(mode: number) + { + this._doorMode = mode; + } + + public get categoryId(): number + { + return this._categoryId; + } + + public set categoryId(id: number) + { + this._categoryId = id; + } + + public get maximumVisitors(): number + { + return this._maximumVisitors; + } + + public set maximumVisitors(max: number) + { + this._maximumVisitors = max; + } + + public get maximumVisitorsLimit(): number + { + return this._maximumVisitorsLimit; + } + + public set maximumVisitorsLimit(limit: number) + { + this._maximumVisitorsLimit = limit; + } + + public get tags(): string[] + { + return this._tags; + } + + public set tags(tags: string[]) + { + this._tags = tags; + } + + public setFlatController(id: number, data: FlatControllerData): void + { + this._controllersById.set(id, data); + + this._controllerList = null; + this._highlightedUserId = id; + } + + public get roomModerationSettings(): RoomModerationSettings + { + return this._roomModerationSettings; + } + + public set roomModerationSettings(settings: RoomModerationSettings) + { + this._roomModerationSettings = settings; + } + + public get controllersById(): Map + { + return this._controllersById; + } + + public set controllersById(controllers: Map) + { + this._controllersById = controllers; + } + + public get controllerList(): FlatControllerData[] + { + if(!this._controllerList) + { + this._controllerList = []; + + for(const controllerData of this._controllersById.values()) this._controllerList.push(controllerData); + + this._controllerList.sort((a, b) => a.userName.localeCompare(b.userName)); + } + + return this._controllerList; + } + + public get highlightedUserId(): number + { + return this._highlightedUserId; + } + + public setBannedUser(id: number, data: BannedUserData): void + { + this._bannedUsersById.set(id, data); + + this._bannedUsersList = null; + } + + public get bannedUsersById(): Map + { + return this._bannedUsersById; + } + + public get bannedUsersList(): BannedUserData[] + { + if(!this._bannedUsersList) + { + this._bannedUsersList = []; + + for(const bannedUserData of this._bannedUsersById.values()) this._bannedUsersList.push(bannedUserData); + + this._bannedUsersList.sort((a, b) => a.userName.localeCompare(b.userName)); + } + + return this._bannedUsersList; + } + + public get chatSettings(): RoomChatSettings + { + return this._chatSettings; + } + + public set chatSettings(settings: RoomChatSettings) + { + this._chatSettings = settings; + } + + public get allowNavigatorDynamicCats(): boolean + { + return this._allowNavigatorDynamicCats; + } + + public set allowNavigatorDynamicCats(flag: boolean) + { + this._allowNavigatorDynamicCats = flag; + } +} diff --git a/packages/communication/src/messages/parser/roomsettings/RoomSettingsDataParser.ts b/packages/communication/src/messages/parser/roomsettings/RoomSettingsDataParser.ts new file mode 100644 index 0000000..ed02587 --- /dev/null +++ b/packages/communication/src/messages/parser/roomsettings/RoomSettingsDataParser.ts @@ -0,0 +1,59 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { RoomChatSettings } from './RoomChatSettings'; +import { RoomModerationSettings } from './RoomModerationSettings'; +import { RoomSettingsData } from './RoomSettingsData'; + +export class RoomSettingsDataParser implements IMessageParser +{ + private _roomSettingsData: RoomSettingsData; + + public flush(): boolean + { + this._roomSettingsData = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomSettingsData = new RoomSettingsData(); + + this._roomSettingsData.roomId = wrapper.readInt(); + this._roomSettingsData.name = wrapper.readString(); + this._roomSettingsData.description = wrapper.readString(); + this._roomSettingsData.doorMode = wrapper.readInt(); + this._roomSettingsData.categoryId = wrapper.readInt(); + this._roomSettingsData.maximumVisitors = wrapper.readInt(); + this._roomSettingsData.maximumVisitorsLimit = wrapper.readInt(); + this._roomSettingsData.tags = []; + + let totalTags = wrapper.readInt(); + + while(totalTags > 0) + { + this._roomSettingsData.tags.push(wrapper.readString()); + + totalTags--; + } + + this._roomSettingsData.tradeMode = wrapper.readInt(); + this._roomSettingsData.allowPets = (wrapper.readInt() === 1); + this._roomSettingsData.allowFoodConsume = (wrapper.readInt() === 1); + this._roomSettingsData.allowWalkThrough = (wrapper.readInt() === 1); + this._roomSettingsData.hideWalls = (wrapper.readInt() === 1); + this._roomSettingsData.wallThickness = wrapper.readInt(); + this._roomSettingsData.floorThickness = wrapper.readInt(); + this._roomSettingsData.chatSettings = new RoomChatSettings(wrapper); + this._roomSettingsData.allowNavigatorDynamicCats = wrapper.readBoolean(); + this._roomSettingsData.roomModerationSettings = new RoomModerationSettings(wrapper); + + return true; + } + + public get data(): RoomSettingsData + { + return this._roomSettingsData; + } +} diff --git a/packages/communication/src/messages/parser/roomsettings/RoomSettingsErrorParser.ts b/packages/communication/src/messages/parser/roomsettings/RoomSettingsErrorParser.ts new file mode 100644 index 0000000..2e6723f --- /dev/null +++ b/packages/communication/src/messages/parser/roomsettings/RoomSettingsErrorParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomSettingsErrorParser implements IMessageParser +{ + private _roomId: number; + private _code: number; + + public flush(): boolean + { + this._roomId = 0; + this._code = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomId = wrapper.readInt(); + this._code = wrapper.readInt(); + + return true; + } + + public get roomId(): number + { + return this._roomId; + } + + public get code(): number + { + return this._code; + } +} diff --git a/packages/communication/src/messages/parser/roomsettings/RoomSettingsSaveErrorParser.ts b/packages/communication/src/messages/parser/roomsettings/RoomSettingsSaveErrorParser.ts new file mode 100644 index 0000000..aec5520 --- /dev/null +++ b/packages/communication/src/messages/parser/roomsettings/RoomSettingsSaveErrorParser.ts @@ -0,0 +1,57 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomSettingsSaveErrorParser implements IMessageParser +{ + public static ERROR_ROOM_NOT_FOUND: number = 1; + public static ERROR_NOT_OWNER: number = 2; + public static ERROR_INVALID_DOOR_MODE: number = 3; + public static ERROR_INVALID_USER_LIMIT: number = 4; + public static ERROR_INVALID_PASSWORD: number = 5; + public static ERROR_INVALID_CATEGORY: number = 6; + public static ERROR_INVALID_NAME: number = 7; + public static ERROR_UNACCEPTABLE_NAME: number = 8; + public static ERROR_INVALID_DESCRIPTION: number = 9; + public static ERROR_UNACCEPTABLE_DESCRIPTION: number = 10; + public static ERROR_INVALID_TAG: number = 11; + public static ERROR_NON_USER_CHOOSABLE_TAG: number = 12; + public static ERROR_TOO_MANY_CHARACTERS_IN_TAG: number = 13; + + private _roomId: number; + private _code: number; + private _message: string; + + public flush(): boolean + { + this._roomId = 0; + this._code = 0; + this._message = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomId = wrapper.readInt(); + this._code = wrapper.readInt(); + this._message = wrapper.readString(); + + return true; + } + + public get roomId(): number + { + return this._roomId; + } + + public get code(): number + { + return this._code; + } + + public get message(): string + { + return this._message; + } +} diff --git a/packages/communication/src/messages/parser/roomsettings/RoomSettingsSavedParser.ts b/packages/communication/src/messages/parser/roomsettings/RoomSettingsSavedParser.ts new file mode 100644 index 0000000..c8652a9 --- /dev/null +++ b/packages/communication/src/messages/parser/roomsettings/RoomSettingsSavedParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RoomSettingsSavedParser implements IMessageParser +{ + private _roomId: number; + + public flush(): boolean + { + this._roomId = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomId = wrapper.readInt(); + + return true; + } + + public get roomId(): number + { + return this._roomId; + } +} diff --git a/packages/communication/src/messages/parser/roomsettings/ShowEnforceRoomCategoryDialogParser.ts b/packages/communication/src/messages/parser/roomsettings/ShowEnforceRoomCategoryDialogParser.ts new file mode 100644 index 0000000..8d3a45a --- /dev/null +++ b/packages/communication/src/messages/parser/roomsettings/ShowEnforceRoomCategoryDialogParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ShowEnforceRoomCategoryDialogParser implements IMessageParser +{ + private _selectionType: number; + + public flush(): boolean + { + this._selectionType = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._selectionType = wrapper.readInt(); + + return true; + } + + public get selectionType(): number + { + return this._selectionType; + } +} diff --git a/packages/communication/src/messages/parser/roomsettings/UserUnbannedFromRoomParser.ts b/packages/communication/src/messages/parser/roomsettings/UserUnbannedFromRoomParser.ts new file mode 100644 index 0000000..54fece8 --- /dev/null +++ b/packages/communication/src/messages/parser/roomsettings/UserUnbannedFromRoomParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class UserUnbannedFromRoomParser implements IMessageParser +{ + private _roomId: number; + private _userId: number; + + public flush(): boolean + { + this._roomId = 0; + this._userId = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomId = wrapper.readInt(); + this._userId = wrapper.readInt(); + + return true; + } + + public get roomId(): number + { + return this._roomId; + } + + public get userId(): number + { + return this._userId; + } +} diff --git a/packages/communication/src/messages/parser/roomsettings/index.ts b/packages/communication/src/messages/parser/roomsettings/index.ts new file mode 100644 index 0000000..383ff7b --- /dev/null +++ b/packages/communication/src/messages/parser/roomsettings/index.ts @@ -0,0 +1,18 @@ +export * from './BannedUserData'; +export * from './BannedUsersFromRoomParser'; +export * from './FlatControllerAddedParser'; +export * from './FlatControllerData'; +export * from './FlatControllerRemovedParser'; +export * from './FlatControllersParser'; +export * from './IFlatUser'; +export * from './MuteAllInRoomParser'; +export * from './NoSuchFlatParser'; +export * from './RoomChatSettings'; +export * from './RoomModerationSettings'; +export * from './RoomSettingsData'; +export * from './RoomSettingsDataParser'; +export * from './RoomSettingsErrorParser'; +export * from './RoomSettingsSavedParser'; +export * from './RoomSettingsSaveErrorParser'; +export * from './ShowEnforceRoomCategoryDialogParser'; +export * from './UserUnbannedFromRoomParser'; diff --git a/packages/communication/src/messages/parser/security/AuthenticatedParser.ts b/packages/communication/src/messages/parser/security/AuthenticatedParser.ts new file mode 100644 index 0000000..12ec2d9 --- /dev/null +++ b/packages/communication/src/messages/parser/security/AuthenticatedParser.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class AuthenticatedParser implements IMessageParser +{ + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + return true; + } +} diff --git a/packages/communication/src/messages/parser/security/index.ts b/packages/communication/src/messages/parser/security/index.ts new file mode 100644 index 0000000..9ad83b5 --- /dev/null +++ b/packages/communication/src/messages/parser/security/index.ts @@ -0,0 +1 @@ +export * from './AuthenticatedParser'; diff --git a/packages/communication/src/messages/parser/sound/JukeboxPlayListFullMessageParser.ts b/packages/communication/src/messages/parser/sound/JukeboxPlayListFullMessageParser.ts new file mode 100644 index 0000000..53807ea --- /dev/null +++ b/packages/communication/src/messages/parser/sound/JukeboxPlayListFullMessageParser.ts @@ -0,0 +1,14 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class JukeboxPlayListFullMessageParser implements IMessageParser +{ + flush(): boolean + { + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + return true; + } +} diff --git a/packages/communication/src/messages/parser/sound/JukeboxSongDisksMessageParser.ts b/packages/communication/src/messages/parser/sound/JukeboxSongDisksMessageParser.ts new file mode 100644 index 0000000..83e306a --- /dev/null +++ b/packages/communication/src/messages/parser/sound/JukeboxSongDisksMessageParser.ts @@ -0,0 +1,38 @@ +import { IAdvancedMap, IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { AdvancedMap } from '@nitrots/utils'; + +export class JukeboxSongDisksMessageParser implements IMessageParser +{ + private _songDisks: IAdvancedMap = new AdvancedMap(); + private _maxLength: number; + + flush(): boolean + { + this._songDisks.reset(); + this._maxLength = 0; + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._maxLength = wrapper.readInt(); + const count = wrapper.readInt(); + + for(let i = 0; i < count; i++) + { + this._songDisks.add(wrapper.readInt(), wrapper.readInt()); + } + + return true; + } + + public get songDisks(): IAdvancedMap + { + return this._songDisks; + } + + public get maxLength(): number + { + return this._maxLength; + } +} diff --git a/packages/communication/src/messages/parser/sound/NowPlayingMessageParser.ts b/packages/communication/src/messages/parser/sound/NowPlayingMessageParser.ts new file mode 100644 index 0000000..963f595 --- /dev/null +++ b/packages/communication/src/messages/parser/sound/NowPlayingMessageParser.ts @@ -0,0 +1,56 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class NowPlayingMessageParser implements IMessageParser +{ + private _currentSongId: number; + private _currentPosition: number; + private _nextSongId: number; + private _nextPosition: number; + private _syncCount: number; + + flush(): boolean + { + this._currentSongId = -1; + this._currentPosition = -1; + this._nextSongId = -1; + this._nextPosition = -1; + this._syncCount = -1; + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._currentSongId = wrapper.readInt(); + this._currentPosition = wrapper.readInt(); + this._nextSongId = wrapper.readInt(); + this._nextPosition = wrapper.readInt(); + this._syncCount = wrapper.readInt(); + return true; + } + + public get currentSongId(): number + { + return this._currentSongId; + } + + public get currentPosition(): number + { + return this._currentPosition; + } + + public get nextSongId(): number + { + return this._nextSongId; + } + + public get nextPosition(): number + { + return this._nextPosition; + } + + public get syncCount(): number + { + return this._syncCount; + } + +} diff --git a/packages/communication/src/messages/parser/sound/OfficialSongIdMessageParser.ts b/packages/communication/src/messages/parser/sound/OfficialSongIdMessageParser.ts new file mode 100644 index 0000000..14d16b7 --- /dev/null +++ b/packages/communication/src/messages/parser/sound/OfficialSongIdMessageParser.ts @@ -0,0 +1,31 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class OfficialSongIdMessageParser implements IMessageParser +{ + private _songId: number; + private _officialSongId: string; + + flush(): boolean + { + this._songId = 0; + this._officialSongId = ''; + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._officialSongId = wrapper.readString(); + this._songId = wrapper.readInt(); + return true; + } + + public get songId(): number + { + return this._songId; + } + + public get officialSongId(): string + { + return this._officialSongId; + } +} diff --git a/packages/communication/src/messages/parser/sound/PlayListEntry.ts b/packages/communication/src/messages/parser/sound/PlayListEntry.ts new file mode 100644 index 0000000..6a0f447 --- /dev/null +++ b/packages/communication/src/messages/parser/sound/PlayListEntry.ts @@ -0,0 +1,46 @@ +export class PlayListEntry +{ + protected _id: number; + protected _length: number; + protected _name: string; + protected _creator: string; + private _startPlayHead: number = 0; + + constructor(id: number, length: number, name: string, creator: string) + { + this._id = id; + this._length = length; + this._name = name; + this._creator = creator; + } + + public get id(): number + { + return this._id; + } + + public get length(): number + { + return this._length; + } + + public get name(): string + { + return this._name; + } + + public get creator(): string + { + return this._creator; + } + + public get startPlayHeadPos(): number + { + return this._startPlayHead; + } + + public set startPlayHeadPos(k: number) + { + this._startPlayHead = k; + } +} diff --git a/packages/communication/src/messages/parser/sound/PlayListMessageParser.ts b/packages/communication/src/messages/parser/sound/PlayListMessageParser.ts new file mode 100644 index 0000000..4b8c63f --- /dev/null +++ b/packages/communication/src/messages/parser/sound/PlayListMessageParser.ts @@ -0,0 +1,40 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { PlayListEntry } from './PlayListEntry'; + +export class PlayListMessageParser implements IMessageParser +{ + private _synchronizationCount: number; + private _playlist: PlayListEntry[]; + + flush(): boolean + { + this._synchronizationCount = -1; + this._playlist = []; + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._synchronizationCount = wrapper.readInt(); + const count = wrapper.readInt(); + + for(let i = 0; i < count; i++) + { + this._playlist.push(new PlayListEntry( + wrapper.readInt(), wrapper.readInt(), wrapper.readString(), wrapper.readString() + )); + } + return true; + } + + public get synchronizationCount(): number + { + return this._synchronizationCount; + } + + public get playList(): PlayListEntry[] + { + return this._playlist; + } + +} diff --git a/packages/communication/src/messages/parser/sound/PlayListSongAddedMessageParser.ts b/packages/communication/src/messages/parser/sound/PlayListSongAddedMessageParser.ts new file mode 100644 index 0000000..42294d8 --- /dev/null +++ b/packages/communication/src/messages/parser/sound/PlayListSongAddedMessageParser.ts @@ -0,0 +1,24 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { PlayListEntry } from './PlayListEntry'; + +export class PlayListSongAddedMessageParser implements IMessageParser +{ + private _entry: PlayListEntry; + + flush(): boolean + { + this._entry = null; + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + this._entry = new PlayListEntry(wrapper.readInt(), wrapper.readInt(), wrapper.readString(), wrapper.readString()); + return true; + } + + public get entry(): PlayListEntry + { + return this._entry; + } +} diff --git a/packages/communication/src/messages/parser/sound/SongInfoEntry.ts b/packages/communication/src/messages/parser/sound/SongInfoEntry.ts new file mode 100644 index 0000000..0bef665 --- /dev/null +++ b/packages/communication/src/messages/parser/sound/SongInfoEntry.ts @@ -0,0 +1,17 @@ +import { PlayListEntry } from './PlayListEntry'; + +export class SongInfoEntry extends PlayListEntry +{ + private _data: string = ''; + + constructor(id: number, length: number, name: string, creator: string, data: string) + { + super(id, length, name, creator); + this._data = data; + } + + public get data(): string + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/sound/TraxSongInfoMessageParser.ts b/packages/communication/src/messages/parser/sound/TraxSongInfoMessageParser.ts new file mode 100644 index 0000000..cd51b32 --- /dev/null +++ b/packages/communication/src/messages/parser/sound/TraxSongInfoMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { SongInfoEntry } from './SongInfoEntry'; + +export class TraxSongInfoMessageParser implements IMessageParser +{ + private _songs: SongInfoEntry[]; + + flush(): boolean + { + this._songs = []; + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + const count = wrapper.readInt(); + for(let i = 0; i < count; i++) + { + const id = wrapper.readInt(); + const _local_3 = wrapper.readString(); + const name = wrapper.readString(); + const data = wrapper.readString(); + const length = wrapper.readInt(); + const creator = wrapper.readString(); + const _local_10 = new SongInfoEntry(id, length, name, creator, data); + this._songs.push(_local_10); + } + return true; + } + + public get songs(): SongInfoEntry[] + { + return this._songs; + } +} diff --git a/packages/communication/src/messages/parser/sound/UserSongDisksInventoryMessageParser.ts b/packages/communication/src/messages/parser/sound/UserSongDisksInventoryMessageParser.ts new file mode 100644 index 0000000..4d96630 --- /dev/null +++ b/packages/communication/src/messages/parser/sound/UserSongDisksInventoryMessageParser.ts @@ -0,0 +1,47 @@ +import { IAdvancedMap, IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { AdvancedMap } from '@nitrots/utils'; + +export class UserSongDisksInventoryMessageParser implements IMessageParser +{ + private _songDiskInventory: IAdvancedMap = new AdvancedMap(); + + flush(): boolean + { + this._songDiskInventory.reset(); + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + const count = wrapper.readInt(); + + for(let i = 0; i < count; i++) + { + this._songDiskInventory.add(wrapper.readInt(), wrapper.readInt()); + } + return true; + } + + public getDiskId(k: number): number + { + if(((k >= 0) && (k < this._songDiskInventory.length))) + { + return this._songDiskInventory.getKey(k); + } + return -1; + } + + public getSongId(k: number): number + { + if(((k >= 0) && (k < this._songDiskInventory.length))) + { + return this._songDiskInventory.getWithIndex(k); + } + return -1; + } + + public get songDiskCount(): number + { + return this._songDiskInventory.length; + } +} diff --git a/packages/communication/src/messages/parser/sound/index.ts b/packages/communication/src/messages/parser/sound/index.ts new file mode 100644 index 0000000..2fc0d7a --- /dev/null +++ b/packages/communication/src/messages/parser/sound/index.ts @@ -0,0 +1,10 @@ +export * from './JukeboxPlayListFullMessageParser'; +export * from './JukeboxSongDisksMessageParser'; +export * from './NowPlayingMessageParser'; +export * from './OfficialSongIdMessageParser'; +export * from './PlayListEntry'; +export * from './PlayListMessageParser'; +export * from './PlayListSongAddedMessageParser'; +export * from './SongInfoEntry'; +export * from './TraxSongInfoMessageParser'; +export * from './UserSongDisksInventoryMessageParser'; diff --git a/packages/communication/src/messages/parser/talent/TalentLevelUpMessageParser.ts b/packages/communication/src/messages/parser/talent/TalentLevelUpMessageParser.ts new file mode 100644 index 0000000..18a6130 --- /dev/null +++ b/packages/communication/src/messages/parser/talent/TalentLevelUpMessageParser.ts @@ -0,0 +1,75 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { TalentTrackRewardPerk } from './TalentTrackRewardPerk'; +import { TalentTrackRewardProduct } from './TalentTrackRewardProduct'; + +export class TalentLevelUpMessageParser implements IMessageParser +{ + private _talentTrackName: string; + private _level: number; + private _rewardPerks: TalentTrackRewardPerk[]; + private _rewardProducts: TalentTrackRewardProduct[]; + + public flush(): boolean + { + this._talentTrackName = null; + this._level = -1; + this._rewardPerks = []; + this._rewardProducts = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalRewards = 0; + + this._talentTrackName = wrapper.readString(); + this._level = wrapper.readInt(); + + const totalRewardsPerks = wrapper.readInt(); + + while(totalRewards < totalRewardsPerks) + { + this._rewardPerks.push(new TalentTrackRewardPerk(wrapper)); + totalRewards++; + } + + const totalRewardsProducts = wrapper.readInt(); + + if(totalRewards < totalRewardsProducts) + { + for(let i = 0; i < totalRewardsProducts; i++) + { + const name = wrapper.readString(); + const vipDays = wrapper.readInt(); + + this._rewardProducts.push(new TalentTrackRewardProduct(name, vipDays)); + totalRewards++; + } + } + + return true; + } + + public get talentTrackName(): string + { + return this._talentTrackName; + } + + public get level(): number + { + return this._level; + } + + public get rewardPerks(): TalentTrackRewardPerk[] + { + return this._rewardPerks; + } + + public get rewardProducts(): TalentTrackRewardProduct[] + { + return this._rewardProducts; + } +} diff --git a/packages/communication/src/messages/parser/talent/TalentTrackLevel.ts b/packages/communication/src/messages/parser/talent/TalentTrackLevel.ts new file mode 100644 index 0000000..03a6eb0 --- /dev/null +++ b/packages/communication/src/messages/parser/talent/TalentTrackLevel.ts @@ -0,0 +1,45 @@ +import { TalentTrackRewardProduct } from './TalentTrackRewardProduct'; +import { TalentTrackTask } from './TalentTrackTask'; + +export class TalentTrackLevel +{ + private _level: number; + private _state: number; + private _tasks: TalentTrackTask[]; + private _rewardPerks: string[]; + private _rewardProducts: TalentTrackRewardProduct[]; + + constructor(level: number, state: number, achievements: TalentTrackTask[], perks: string[], items: TalentTrackRewardProduct[]) + { + this._level = level; + this._state = state; + this._tasks = achievements; + this._rewardPerks = perks; + this._rewardProducts = items; + } + + public get level(): number + { + return this._level; + } + + public get state(): number + { + return this._state; + } + + public get tasks(): TalentTrackTask[] + { + return this._tasks; + } + + public get perks(): string[] + { + return this._rewardPerks; + } + + public get items(): TalentTrackRewardProduct[] + { + return this._rewardProducts; + } +} diff --git a/packages/communication/src/messages/parser/talent/TalentTrackLevelMessageParser.ts b/packages/communication/src/messages/parser/talent/TalentTrackLevelMessageParser.ts new file mode 100644 index 0000000..b8f6cc2 --- /dev/null +++ b/packages/communication/src/messages/parser/talent/TalentTrackLevelMessageParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class TalentTrackLevelMessageParser implements IMessageParser +{ + private _talentTrackName: string; + private _level: number; + private _maxLevel: number; + + public flush(): boolean + { + this._talentTrackName = null; + this._level = -1; + this._maxLevel = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._talentTrackName = wrapper.readString(); + this._level = wrapper.readInt(); + this._maxLevel = wrapper.readInt(); + + return true; + } + + public get talentTrackName(): string + { + return this._talentTrackName; + } + + public get level(): number + { + return this._level; + } + + public get maxLevel(): number + { + return this._maxLevel; + } +} diff --git a/packages/communication/src/messages/parser/talent/TalentTrackParser.ts b/packages/communication/src/messages/parser/talent/TalentTrackParser.ts new file mode 100644 index 0000000..06297d4 --- /dev/null +++ b/packages/communication/src/messages/parser/talent/TalentTrackParser.ts @@ -0,0 +1,79 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { TalentTrackLevel } from './TalentTrackLevel'; +import { TalentTrackRewardProduct } from './TalentTrackRewardProduct'; +import { TalentTrackTask } from './TalentTrackTask'; + +export class TalentTrackParser implements IMessageParser +{ + private _type: string; + private _levels: TalentTrackLevel[]; + + public flush(): boolean + { + this._type = null; + this._levels = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._type = wrapper.readString(); + + this._levels = []; + const levelsCount = wrapper.readInt(); + + for(let i = 0; i < levelsCount; i++) + { + const levelId = wrapper.readInt(); + const levelState = wrapper.readInt(); + + const levelAchievements: TalentTrackTask[] = []; + const achievementsCount = wrapper.readInt(); + + for(let j = 0; j < achievementsCount; j++) + { + const id = wrapper.readInt(); + const index = wrapper.readInt(); + const code = wrapper.readString(); + const state = wrapper.readInt(); + const progress = wrapper.readInt(); + const achievementProgress = wrapper.readInt(); + + levelAchievements.push(new TalentTrackTask(id, index, code, state, progress, achievementProgress)); + } + + const levelPerks: string[] = []; + const perksCount = wrapper.readInt(); + + for(let j = 0; j < perksCount; j++) levelPerks.push(wrapper.readString()); + + const levelItems: TalentTrackRewardProduct[] = []; + const itemsCount = wrapper.readInt(); + + for(let j = 0; j < itemsCount; j++) + { + const name = wrapper.readString(); + const unknownInt = wrapper.readInt(); + + levelItems.push(new TalentTrackRewardProduct(name, unknownInt)); + } + + this._levels.push(new TalentTrackLevel(levelId, levelState, levelAchievements, levelPerks, levelItems)); + } + + return true; + } + + public get type(): string + { + return this._type; + } + + public get levels(): TalentTrackLevel[] + { + return this._levels; + } +} diff --git a/packages/communication/src/messages/parser/talent/TalentTrackRewardPerk.ts b/packages/communication/src/messages/parser/talent/TalentTrackRewardPerk.ts new file mode 100644 index 0000000..9a0cbd5 --- /dev/null +++ b/packages/communication/src/messages/parser/talent/TalentTrackRewardPerk.ts @@ -0,0 +1,16 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class TalentTrackRewardPerk +{ + private _perkId: number; + + constructor(wrapper: IMessageDataWrapper) + { + this._perkId = wrapper.readInt(); + } + + public get perkId(): number + { + return this._perkId; + } +} diff --git a/packages/communication/src/messages/parser/talent/TalentTrackRewardProduct.ts b/packages/communication/src/messages/parser/talent/TalentTrackRewardProduct.ts new file mode 100644 index 0000000..d45c46d --- /dev/null +++ b/packages/communication/src/messages/parser/talent/TalentTrackRewardProduct.ts @@ -0,0 +1,21 @@ +export class TalentTrackRewardProduct +{ + private _productCode: string; + private _vipDays: number; + + constructor(name: string, vipDays: number) + { + this._productCode = name; + this._vipDays = vipDays; + } + + public get productCode(): string + { + return this._productCode; + } + + public get vipDays(): number + { + return this._vipDays; + } +} diff --git a/packages/communication/src/messages/parser/talent/TalentTrackTask.ts b/packages/communication/src/messages/parser/talent/TalentTrackTask.ts new file mode 100644 index 0000000..a249b11 --- /dev/null +++ b/packages/communication/src/messages/parser/talent/TalentTrackTask.ts @@ -0,0 +1,49 @@ +export class TalentTrackTask +{ + private _id: number; + private _requiredLevel: number; + private _badgeCode: string; + private _state: number; + private _currentScore: number; + private _totalScore: number; + + constructor(id: number, requiredLevel: number, badgeCode: string, state: number, currentScore: number, totalScore: number) + { + this._id = id; + this._requiredLevel = requiredLevel; + this._badgeCode = badgeCode; + this._state = state; + this._currentScore = currentScore; + this._totalScore = totalScore; + } + + public get id(): number + { + return this._id; + } + + public get requiredLevel(): number + { + return this._requiredLevel; + } + + public get badgeCode(): string + { + return this._badgeCode; + } + + public get state(): number + { + return this._state; + } + + public get currentScore(): number + { + return this._currentScore; + } + + public get totalScore(): number + { + return this._totalScore; + } +} diff --git a/packages/communication/src/messages/parser/talent/index.ts b/packages/communication/src/messages/parser/talent/index.ts new file mode 100644 index 0000000..d48e436 --- /dev/null +++ b/packages/communication/src/messages/parser/talent/index.ts @@ -0,0 +1,7 @@ +export * from './TalentLevelUpMessageParser'; +export * from './TalentTrackLevel'; +export * from './TalentTrackLevelMessageParser'; +export * from './TalentTrackParser'; +export * from './TalentTrackRewardPerk'; +export * from './TalentTrackRewardProduct'; +export * from './TalentTrackTask'; diff --git a/packages/communication/src/messages/parser/user/AccountSafetyLockStatusChangeParser.ts b/packages/communication/src/messages/parser/user/AccountSafetyLockStatusChangeParser.ts new file mode 100644 index 0000000..9c01c81 --- /dev/null +++ b/packages/communication/src/messages/parser/user/AccountSafetyLockStatusChangeParser.ts @@ -0,0 +1,28 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class AccountSafetyLockStatusChangeParser implements IMessageParser +{ + public static SAFETY_LOCK_STATUS_LOCKED: number = 0; + public static SAFETY_LOCK_STATUS_UNLOCKED: number = 1; + + private _status: number; + + public flush(): boolean + { + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._status = wrapper.readInt(); + + return true; + } + + public get status(): number + { + return this._status; + } +} diff --git a/packages/communication/src/messages/parser/user/ApproveNameResultParser.ts b/packages/communication/src/messages/parser/user/ApproveNameResultParser.ts new file mode 100644 index 0000000..6ca40ca --- /dev/null +++ b/packages/communication/src/messages/parser/user/ApproveNameResultParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ApproveNameResultParser implements IMessageParser +{ + private _result: number; + private _validationInfo: string; + + public flush(): boolean + { + this._result = -1; + this._validationInfo = ''; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._result = wrapper.readInt(); + this._validationInfo = wrapper.readString(); + + return true; + } + + public get result(): number + { + return this._result; + } + + public get validationInfo(): string + { + return this._validationInfo; + } +} diff --git a/packages/communication/src/messages/parser/user/ChangeEmailResultParser.ts b/packages/communication/src/messages/parser/user/ChangeEmailResultParser.ts new file mode 100644 index 0000000..3ac78fa --- /dev/null +++ b/packages/communication/src/messages/parser/user/ChangeEmailResultParser.ts @@ -0,0 +1,29 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ChangeEmailResultParser implements IMessageParser +{ + public static readonly EMAIL_STATUS_OK: number = 0; + + private _result: number; + + public flush(): boolean + { + this._result = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._result = wrapper.readInt(); + + return true; + } + + public get result(): number + { + return this._result; + } +} diff --git a/packages/communication/src/messages/parser/user/EmailStatusParser.ts b/packages/communication/src/messages/parser/user/EmailStatusParser.ts new file mode 100644 index 0000000..765b235 --- /dev/null +++ b/packages/communication/src/messages/parser/user/EmailStatusParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class EmailStatusParser implements IMessageParser +{ + private _email: string; + private _isVerified: boolean; + private _allowChange: boolean; + + public flush(): boolean + { + this._email = null; + this._isVerified = false; + this._allowChange = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._email = wrapper.readString(); + this._isVerified = wrapper.readBoolean(); + this._allowChange = wrapper.readBoolean(); + + return true; + } + + public get email(): string + { + return this._email; + } + + public get isVerified(): boolean + { + return this._isVerified; + } + + public get allowChange(): boolean + { + return this._allowChange; + } +} diff --git a/packages/communication/src/messages/parser/user/ExtendedProfileChangedMessageParser.ts b/packages/communication/src/messages/parser/user/ExtendedProfileChangedMessageParser.ts new file mode 100644 index 0000000..41a54e5 --- /dev/null +++ b/packages/communication/src/messages/parser/user/ExtendedProfileChangedMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class ExtendedProfileChangedMessageParser implements IMessageParser +{ + private _userId: number; + + public flush(): boolean + { + this._userId = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._userId = wrapper.readInt(); + + return true; + } + + public get userId(): number + { + return this._userId; + } +} diff --git a/packages/communication/src/messages/parser/user/GroupDetailsChangedMessageParser.ts b/packages/communication/src/messages/parser/user/GroupDetailsChangedMessageParser.ts new file mode 100644 index 0000000..adbe3b1 --- /dev/null +++ b/packages/communication/src/messages/parser/user/GroupDetailsChangedMessageParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GroupDetailsChangedMessageParser implements IMessageParser +{ + private _groupId: number; + + public flush(): boolean + { + this._groupId = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._groupId = wrapper.readInt(); + + return true; + } + + public get groupId(): number + { + return this._groupId; + } +} diff --git a/packages/communication/src/messages/parser/user/GroupMembershipRequestedMessageParser.ts b/packages/communication/src/messages/parser/user/GroupMembershipRequestedMessageParser.ts new file mode 100644 index 0000000..8140470 --- /dev/null +++ b/packages/communication/src/messages/parser/user/GroupMembershipRequestedMessageParser.ts @@ -0,0 +1,36 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { MemberData } from '../../incoming'; + +export class GroupMembershipRequestedMessageParser implements IMessageParser +{ + private _groupId: number; + private _requester: MemberData; + + public flush(): boolean + { + this._groupId = -1; + this._requester = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._groupId = wrapper.readInt(); + this._requester = new MemberData(wrapper); + + return true; + } + + public get groupId(): number + { + return this._groupId; + } + + public get requester(): MemberData + { + return this._requester; + } +} diff --git a/packages/communication/src/messages/parser/user/GuildEditFailedMessageParser.ts b/packages/communication/src/messages/parser/user/GuildEditFailedMessageParser.ts new file mode 100644 index 0000000..ba5af25 --- /dev/null +++ b/packages/communication/src/messages/parser/user/GuildEditFailedMessageParser.ts @@ -0,0 +1,29 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GuildEditFailedMessageParser implements IMessageParser +{ + public static readonly INSUFFICIENT_SUBSCRIPTION_LEVEL: number = 2; + + private _reason: number; + + public flush(): boolean + { + this._reason = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._reason = wrapper.readInt(); + + return true; + } + + public get reason(): number + { + return this._reason; + } +} diff --git a/packages/communication/src/messages/parser/user/GuildMemberMgmtFailedMessageParser.ts b/packages/communication/src/messages/parser/user/GuildMemberMgmtFailedMessageParser.ts new file mode 100644 index 0000000..cd206dc --- /dev/null +++ b/packages/communication/src/messages/parser/user/GuildMemberMgmtFailedMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class GuildMemberMgmtFailedMessageParser implements IMessageParser +{ + private _guildId: number; + private _reason: number; + + public flush(): boolean + { + this._guildId = -1; + this._reason = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._guildId = wrapper.readInt(); + this._reason = wrapper.readInt(); + + return true; + } + + public get guildId(): number + { + return this._guildId; + } + + public get reason(): number + { + return this._reason; + } +} diff --git a/packages/communication/src/messages/parser/user/GuildMembershipsMessageParser.ts b/packages/communication/src/messages/parser/user/GuildMembershipsMessageParser.ts new file mode 100644 index 0000000..6d73a9d --- /dev/null +++ b/packages/communication/src/messages/parser/user/GuildMembershipsMessageParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { HabboGroupEntryData } from './HabboGroupEntryData'; + +export class GuildMembershipsMessageParser implements IMessageParser +{ + private _groups: HabboGroupEntryData[]; + + public flush(): boolean + { + this._groups = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalOffers = wrapper.readInt(); + + while(totalOffers > 0) + { + this._groups.push(new HabboGroupEntryData(wrapper)); + + totalOffers--; + } + + return true; + } + + public get groups(): HabboGroupEntryData[] + { + return this._groups; + } +} diff --git a/packages/communication/src/messages/parser/user/HabboGroupBadgesMessageParser.ts b/packages/communication/src/messages/parser/user/HabboGroupBadgesMessageParser.ts new file mode 100644 index 0000000..aafef6d --- /dev/null +++ b/packages/communication/src/messages/parser/user/HabboGroupBadgesMessageParser.ts @@ -0,0 +1,36 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class HabboGroupBadgesMessageParser implements IMessageParser +{ + private _badges: Map; + + flush(): boolean + { + this._badges = new Map(); + + return true; + } + + parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let badgesCount = wrapper.readInt(); + + while(badgesCount > 0) + { + const id = wrapper.readInt(); + const badge = wrapper.readString(); + + this._badges.set(id, badge); + badgesCount--; + } + + return true; + } + + public get badges(): Map + { + return this._badges; + } +} diff --git a/packages/communication/src/messages/parser/user/HabboGroupEntryData.ts b/packages/communication/src/messages/parser/user/HabboGroupEntryData.ts new file mode 100644 index 0000000..9882f43 --- /dev/null +++ b/packages/communication/src/messages/parser/user/HabboGroupEntryData.ts @@ -0,0 +1,65 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class HabboGroupEntryData +{ + private _groupId: number; + private _groupName: string; + private _badgeCode: string; + private _colorA: string; + private _colorB: string; + private _favourite: boolean; + private _ownerId: number; + private _hasForum: boolean; + + constructor(wrapper: IMessageDataWrapper) + { + this._groupId = wrapper.readInt(); + this._groupName = wrapper.readString(); + this._badgeCode = wrapper.readString(); + this._colorA = wrapper.readString(); + this._colorB = wrapper.readString(); + this._favourite = wrapper.readBoolean(); + this._ownerId = wrapper.readInt(); + this._hasForum = wrapper.readBoolean(); + } + + public get groupId(): number + { + return this._groupId; + } + + public get groupName(): string + { + return this._groupName; + } + + public get badgeCode(): string + { + return this._badgeCode; + } + + public get colorA(): string + { + return this._colorA; + } + + public get colorB(): string + { + return this._colorB; + } + + public get favourite(): boolean + { + return this._favourite; + } + + public get ownerId(): number + { + return this._ownerId; + } + + public get hasForum(): boolean + { + return this._hasForum; + } +} diff --git a/packages/communication/src/messages/parser/user/HabboGroupJoinFailedMessageParser.ts b/packages/communication/src/messages/parser/user/HabboGroupJoinFailedMessageParser.ts new file mode 100644 index 0000000..62241b2 --- /dev/null +++ b/packages/communication/src/messages/parser/user/HabboGroupJoinFailedMessageParser.ts @@ -0,0 +1,29 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class HabboGroupJoinFailedMessageParser implements IMessageParser +{ + public static readonly INSUFFICIENT_SUBSCRIPTION_LEVEL: number = 4; + + private _reason: number; + + public flush(): boolean + { + this._reason = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._reason = wrapper.readInt(); + + return true; + } + + public get reason(): number + { + return this._reason; + } +} diff --git a/packages/communication/src/messages/parser/user/IgnoreResultParser.ts b/packages/communication/src/messages/parser/user/IgnoreResultParser.ts new file mode 100644 index 0000000..b180635 --- /dev/null +++ b/packages/communication/src/messages/parser/user/IgnoreResultParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class IgnoreResultParser implements IMessageParser +{ + private _result: number; + private _name: string; + + public flush(): boolean + { + this._result = -1; + this._name = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._result = wrapper.readInt(); + this._name = wrapper.readString(); + + return true; + } + + public get result(): number + { + return this._result; + } + + public get name(): string + { + return this._name; + } +} diff --git a/packages/communication/src/messages/parser/user/IgnoredUsersParser.ts b/packages/communication/src/messages/parser/user/IgnoredUsersParser.ts new file mode 100644 index 0000000..6420927 --- /dev/null +++ b/packages/communication/src/messages/parser/user/IgnoredUsersParser.ts @@ -0,0 +1,36 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class IgnoredUsersParser implements IMessageParser +{ + private _ignoredUsers: string[]; + + public flush(): boolean + { + this._ignoredUsers = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._ignoredUsers = []; + + let count = wrapper.readInt(); + + while(count > 0) + { + this._ignoredUsers.push(wrapper.readString()); + + count--; + } + + return true; + } + + public get ignoredUsers(): string[] + { + return this._ignoredUsers; + } +} diff --git a/packages/communication/src/messages/parser/user/InClientLinkParser.ts b/packages/communication/src/messages/parser/user/InClientLinkParser.ts new file mode 100644 index 0000000..e48f4b5 --- /dev/null +++ b/packages/communication/src/messages/parser/user/InClientLinkParser.ts @@ -0,0 +1,25 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class InClientLinkParser implements IMessageParser +{ + private _link: string; + + public flush(): boolean + { + this._link = null; + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._link = wrapper.readString(); + return true; + } + + public get link(): string + { + return this._link; + } +} diff --git a/packages/communication/src/messages/parser/user/PetRespectNotificationParser.ts b/packages/communication/src/messages/parser/user/PetRespectNotificationParser.ts new file mode 100644 index 0000000..631c851 --- /dev/null +++ b/packages/communication/src/messages/parser/user/PetRespectNotificationParser.ts @@ -0,0 +1,49 @@ +import { IMessageDataWrapper, IMessageParser, PetType } from '@nitrots/api'; +import { PetData } from '../inventory'; + +export class PetRespectNotificationParser implements IMessageParser +{ + private _respect: number; + private _petOwnerId: number; + private _petData: PetData; + + public flush(): boolean + { + this._respect = 0; + this._petOwnerId = 0; + this._petData = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._respect = wrapper.readInt(); + this._petOwnerId = wrapper.readInt(); + this._petData = new PetData(wrapper); + + return true; + } + + public get respect(): number + { + return this._respect; + } + + public get petOwnerId(): number + { + return this._petOwnerId; + } + + public get petData(): PetData + { + return this._petData; + } + + public get isTreat(): boolean + { + return (this._petData.typeId === PetType.MONSTERPLANT); + } +} diff --git a/packages/communication/src/messages/parser/user/PetSupplementTypeEnum.ts b/packages/communication/src/messages/parser/user/PetSupplementTypeEnum.ts new file mode 100644 index 0000000..d111209 --- /dev/null +++ b/packages/communication/src/messages/parser/user/PetSupplementTypeEnum.ts @@ -0,0 +1,8 @@ +export class PetSupplementTypeEnum +{ + public static WATER: number = 0; + public static LIGHT: number = 1; + public static REVIVE: number = 2; + public static REBREED_FERTILIZER: number = 3; + public static SPEED_FERTILIZER: number = 4; +} diff --git a/packages/communication/src/messages/parser/user/PetSupplementedNotificationParser.ts b/packages/communication/src/messages/parser/user/PetSupplementedNotificationParser.ts new file mode 100644 index 0000000..3c22f1d --- /dev/null +++ b/packages/communication/src/messages/parser/user/PetSupplementedNotificationParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class PetSupplementedNotificationParser implements IMessageParser +{ + private _petId: number; + private _userId: number; + private _supplementType: number; + + public flush(): boolean + { + this._petId = 0; + this._userId = 0; + this._supplementType = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._petId = wrapper.readInt(); + this._userId = wrapper.readInt(); + this._supplementType = wrapper.readInt(); + + return true; + } + + public get petId(): number + { + return this._petId; + } + + public get userId(): number + { + return this._userId; + } + + public get supplementType(): number + { + return this._supplementType; + } +} diff --git a/packages/communication/src/messages/parser/user/RespectReceivedParser.ts b/packages/communication/src/messages/parser/user/RespectReceivedParser.ts new file mode 100644 index 0000000..15527b4 --- /dev/null +++ b/packages/communication/src/messages/parser/user/RespectReceivedParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class RespectReceivedParser implements IMessageParser +{ + private _userId: number; + private _respectsReceived: number; + + public flush(): boolean + { + this._userId = 0; + this._respectsReceived = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._userId = wrapper.readInt(); + this._respectsReceived = wrapper.readInt(); + + return true; + } + + public get userId(): number + { + return this._userId; + } + + public get respectsReceived(): number + { + return this._respectsReceived; + } +} diff --git a/packages/communication/src/messages/parser/user/RoomEntryData.ts b/packages/communication/src/messages/parser/user/RoomEntryData.ts new file mode 100644 index 0000000..4f9ee0b --- /dev/null +++ b/packages/communication/src/messages/parser/user/RoomEntryData.ts @@ -0,0 +1,28 @@ +export class RoomEntryData +{ + private _roomId: number; + private _roomName: string; + private _hasControllers: boolean = false; + + constructor(roomId: number, roomName: string, hasControllers: boolean) + { + this._roomId = roomId; + this._roomName = roomName; + this._hasControllers = hasControllers; + } + + public get roomId(): number + { + return this._roomId; + } + + public get roomName(): string + { + return this._roomName; + } + + public get hasControllers(): boolean + { + return this._hasControllers; + } +} diff --git a/packages/communication/src/messages/parser/user/ScrKickbackData.ts b/packages/communication/src/messages/parser/user/ScrKickbackData.ts new file mode 100644 index 0000000..d95900d --- /dev/null +++ b/packages/communication/src/messages/parser/user/ScrKickbackData.ts @@ -0,0 +1,72 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class ScrKickbackData +{ + private _currentHcStreak: number; + private _firstSubscriptionDate: string; + private _kickbackPercentage: number; + private _totalCreditsMissed: number; + private _totalCreditsRewarded: number; + private _totalCreditsSpent: number; + private _creditRewardForStreakBonus: number; + private _creditRewardForMonthlySpent: number; + private _timeUntilPayday: number; + + constructor(k: IMessageDataWrapper) + { + this._currentHcStreak = k.readInt(); + this._firstSubscriptionDate = k.readString(); + this._kickbackPercentage = k.readDouble(); + this._totalCreditsMissed = k.readInt(); + this._totalCreditsRewarded = k.readInt(); + this._totalCreditsSpent = k.readInt(); + this._creditRewardForStreakBonus = k.readInt(); + this._creditRewardForMonthlySpent = k.readInt(); + this._timeUntilPayday = k.readInt(); + } + + public get currentHcStreak(): number + { + return this._currentHcStreak; + } + + public get firstSubscriptionDate(): string + { + return this._firstSubscriptionDate; + } + + public get kickbackPercentage(): number + { + return this._kickbackPercentage; + } + + public get totalCreditsMissed(): number + { + return this._totalCreditsMissed; + } + + public get totalCreditsRewarded(): number + { + return this._totalCreditsRewarded; + } + + public get totalCreditsSpent(): number + { + return this._totalCreditsSpent; + } + + public get creditRewardForStreakBonus(): number + { + return this._creditRewardForStreakBonus; + } + + public get creditRewardForMonthlySpent(): number + { + return this._creditRewardForMonthlySpent; + } + + public get timeUntilPayday(): number + { + return this._timeUntilPayday; + } +} diff --git a/packages/communication/src/messages/parser/user/ScrSendKickbackInfoMessageParser.ts b/packages/communication/src/messages/parser/user/ScrSendKickbackInfoMessageParser.ts new file mode 100644 index 0000000..0af2fa4 --- /dev/null +++ b/packages/communication/src/messages/parser/user/ScrSendKickbackInfoMessageParser.ts @@ -0,0 +1,23 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { ScrKickbackData } from './ScrKickbackData'; + +export class ScrSendKickbackInfoMessageParser implements IMessageParser +{ + private _data: ScrKickbackData; + + flush(): boolean + { + this._data = null; + return true; + } + parse(wrapper: IMessageDataWrapper): boolean + { + this._data = new ScrKickbackData(wrapper); + return true; + } + + public get data(): ScrKickbackData + { + return this._data; + } +} diff --git a/packages/communication/src/messages/parser/user/WelcomeGiftChangeEmailResultParser.ts b/packages/communication/src/messages/parser/user/WelcomeGiftChangeEmailResultParser.ts new file mode 100644 index 0000000..7167010 --- /dev/null +++ b/packages/communication/src/messages/parser/user/WelcomeGiftChangeEmailResultParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class WelcomeGiftChangeEmailResultParser implements IMessageParser +{ + private _result: number; + + public flush(): boolean + { + this._result = -1; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._result = wrapper.readInt(); + + return true; + } + + public get result(): number + { + return this._result; + } +} diff --git a/packages/communication/src/messages/parser/user/access/UserPermissionsParser.ts b/packages/communication/src/messages/parser/user/access/UserPermissionsParser.ts new file mode 100644 index 0000000..4f40f45 --- /dev/null +++ b/packages/communication/src/messages/parser/user/access/UserPermissionsParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class UserPermissionsParser implements IMessageParser +{ + private _clubLevel: number; + private _securityLevel: number; + private _isAmbassador: boolean; + + public flush(): boolean + { + this._clubLevel = 0; + this._securityLevel = 0; + this._isAmbassador = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._clubLevel = wrapper.readInt(); + this._securityLevel = wrapper.readInt(); + this._isAmbassador = wrapper.readBoolean(); + + return true; + } + + public get clubLevel(): number + { + return this._clubLevel; + } + + public get securityLevel(): number + { + return this._securityLevel; + } + + public get isAmbassador(): boolean + { + return this._isAmbassador; + } +} diff --git a/packages/communication/src/messages/parser/user/access/index.ts b/packages/communication/src/messages/parser/user/access/index.ts new file mode 100644 index 0000000..7cb9b64 --- /dev/null +++ b/packages/communication/src/messages/parser/user/access/index.ts @@ -0,0 +1 @@ +export * from './UserPermissionsParser'; diff --git a/packages/communication/src/messages/parser/user/data/RelationshipStatusInfo.ts b/packages/communication/src/messages/parser/user/data/RelationshipStatusInfo.ts new file mode 100644 index 0000000..f13baac --- /dev/null +++ b/packages/communication/src/messages/parser/user/data/RelationshipStatusInfo.ts @@ -0,0 +1,67 @@ +import { IMessageDataWrapper, RelationshipStatusEnum } from '@nitrots/api'; + +export class RelationshipStatusInfo +{ + private _relationshipStatusType: number; + private _friendCount: number; + private _randomFriendId: number; + private _randomFriendName: string; + private _randomFriendFigure: string; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this.flush(); + this.parse(wrapper); + } + + public flush(): boolean + { + this._relationshipStatusType = RelationshipStatusEnum.NONE; + this._friendCount = 0; + this._randomFriendId = 0; + this._randomFriendFigure = null; + this._randomFriendName = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._relationshipStatusType = wrapper.readInt(); + this._friendCount = wrapper.readInt(); + this._randomFriendId = wrapper.readInt(); + this._randomFriendName = wrapper.readString(); + this._randomFriendFigure = wrapper.readString(); + + return true; + } + + public get relationshipStatusType(): number + { + return this._relationshipStatusType; + } + + public get friendCount(): number + { + return this._friendCount; + } + + public get randomFriendId(): number + { + return this._randomFriendId; + } + + public get randomFriendName(): string + { + return this._randomFriendName; + } + + public get randomFriendFigure(): string + { + return this._randomFriendFigure; + } +} diff --git a/packages/communication/src/messages/parser/user/data/RelationshipStatusInfoMessageParser.ts b/packages/communication/src/messages/parser/user/data/RelationshipStatusInfoMessageParser.ts new file mode 100644 index 0000000..dda716a --- /dev/null +++ b/packages/communication/src/messages/parser/user/data/RelationshipStatusInfoMessageParser.ts @@ -0,0 +1,46 @@ +import { IAdvancedMap, IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { AdvancedMap } from '@nitrots/utils'; +import { RelationshipStatusInfo } from './RelationshipStatusInfo'; + +export class RelationshipStatusInfoMessageParser implements IMessageParser +{ + private _userId: number; + private _relationshipStatusMap: IAdvancedMap; + + public flush(): boolean + { + this._userId = 0; + this._relationshipStatusMap = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._userId = wrapper.readInt(); + this._relationshipStatusMap = new AdvancedMap(); + + const relationshipsCount = wrapper.readInt(); + + for(let i = 0; i < relationshipsCount; i++) + { + const relationship = new RelationshipStatusInfo(wrapper); + + this._relationshipStatusMap.add(relationship.relationshipStatusType, relationship); + } + + return true; + } + + public get userId(): number + { + return this._userId; + } + + public get relationshipStatusMap(): IAdvancedMap + { + return this._relationshipStatusMap; + } +} diff --git a/packages/communication/src/messages/parser/user/data/UserCurrentBadgesParser.ts b/packages/communication/src/messages/parser/user/data/UserCurrentBadgesParser.ts new file mode 100644 index 0000000..e794704 --- /dev/null +++ b/packages/communication/src/messages/parser/user/data/UserCurrentBadgesParser.ts @@ -0,0 +1,46 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class UserCurrentBadgesParser implements IMessageParser +{ + private _userId: number; + private _badges: string[]; + + public flush(): boolean + { + this._userId = null; + this._badges = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._userId = wrapper.readInt(); + + let totalBadges = wrapper.readInt(); + + while(totalBadges > 0) + { + const slotId = wrapper.readInt(); + const badgeCode = wrapper.readString(); + + this._badges.push(badgeCode); + + totalBadges--; + } + + return true; + } + + public get userId(): number + { + return this._userId; + } + + public get badges(): string[] + { + return this._badges; + } +} diff --git a/packages/communication/src/messages/parser/user/data/UserFigureParser.ts b/packages/communication/src/messages/parser/user/data/UserFigureParser.ts new file mode 100644 index 0000000..88a61a9 --- /dev/null +++ b/packages/communication/src/messages/parser/user/data/UserFigureParser.ts @@ -0,0 +1,35 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class UserFigureParser implements IMessageParser +{ + private _figure: string; + private _gender: string; + + public flush(): boolean + { + this._figure = null; + this._gender = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._figure = wrapper.readString(); + this._gender = wrapper.readString(); + + return true; + } + + public get figure(): string + { + return this._figure; + } + + public get gender(): string + { + return this._gender; + } +} diff --git a/packages/communication/src/messages/parser/user/data/UserInfoDataParser.ts b/packages/communication/src/messages/parser/user/data/UserInfoDataParser.ts new file mode 100644 index 0000000..559848e --- /dev/null +++ b/packages/communication/src/messages/parser/user/data/UserInfoDataParser.ts @@ -0,0 +1,139 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class UserInfoDataParser +{ + private _userId: number; + private _username: string; + private _figure: string; + private _gender: string; + private _motto: string; + private _realName: string; + private _directMail: boolean; + private _respectsReceived: number; + private _respectsRemaining: number; + private _respectsPetRemaining: number; + private _streamPublishingAllowed: boolean; + private _lastAccessDate: string; + private _canChangeName: boolean; + private _safetyLocked: boolean; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this.flush(); + this.parse(wrapper); + } + + public flush(): boolean + { + this._userId = 0; + this._username = null; + this._figure = null; + this._gender = null; + this._motto = null; + this._realName = null; + this._directMail = false; + this._respectsReceived = 0; + this._respectsRemaining = 0; + this._respectsPetRemaining = 0; + this._streamPublishingAllowed = false; + this._lastAccessDate = null; + this._canChangeName = false; + this._safetyLocked = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._userId = wrapper.readInt(); + this._username = wrapper.readString(); + this._figure = wrapper.readString(); + this._gender = wrapper.readString(); + this._motto = wrapper.readString(); + this._realName = wrapper.readString(); + this._directMail = wrapper.readBoolean(); + this._respectsReceived = wrapper.readInt(); + this._respectsRemaining = wrapper.readInt(); + this._respectsPetRemaining = wrapper.readInt(); + this._streamPublishingAllowed = wrapper.readBoolean(); + this._lastAccessDate = wrapper.readString(); + this._canChangeName = wrapper.readBoolean(); + this._safetyLocked = wrapper.readBoolean(); + + return true; + } + + public get userId(): number + { + return this._userId; + } + + public get username(): string + { + return this._username; + } + + public get figure(): string + { + return this._figure; + } + + public get gender(): string + { + return this._gender; + } + + public get motto(): string + { + return this._motto; + } + + public get realName(): string + { + return this._realName; + } + + public get directMail(): boolean + { + return this._directMail; + } + + public get respectsReceived(): number + { + return this._respectsReceived; + } + + public get respectsRemaining(): number + { + return this._respectsRemaining; + } + + public get respectsPetRemaining(): number + { + return this._respectsPetRemaining; + } + + public get streamPublishingAllowed(): boolean + { + return this._streamPublishingAllowed; + } + + public get lastAccessedDate(): string + { + return this._lastAccessDate; + } + + public get canChangeName(): boolean + { + return this._canChangeName; + } + + public get safetyLocked(): boolean + { + return this._safetyLocked; + } +} diff --git a/packages/communication/src/messages/parser/user/data/UserInfoParser.ts b/packages/communication/src/messages/parser/user/data/UserInfoParser.ts new file mode 100644 index 0000000..387d601 --- /dev/null +++ b/packages/communication/src/messages/parser/user/data/UserInfoParser.ts @@ -0,0 +1,30 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { UserInfoDataParser } from './UserInfoDataParser'; + +export class UserInfoParser implements IMessageParser +{ + private _userInfo: UserInfoDataParser; + + public flush(): boolean + { + this._userInfo = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._userInfo = new UserInfoDataParser(wrapper); + + if(!this._userInfo) return false; + + return true; + } + + public get userInfo(): UserInfoDataParser + { + return this._userInfo; + } +} diff --git a/packages/communication/src/messages/parser/user/data/UserNameChangeMessageParser.ts b/packages/communication/src/messages/parser/user/data/UserNameChangeMessageParser.ts new file mode 100644 index 0000000..33ce7eb --- /dev/null +++ b/packages/communication/src/messages/parser/user/data/UserNameChangeMessageParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class UserNameChangeMessageParser implements IMessageParser +{ + private _webId: number; + private _id: number; + private _newName: string; + + public flush(): boolean + { + this._webId = -1; + this._id = -1; + this._newName = ''; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._webId = wrapper.readInt(); + this._id = wrapper.readInt(); + this._newName = wrapper.readString(); + + return true; + } + + public get webId(): number + { + return this._webId; + } + + public get id(): number + { + return this._id; + } + + public get newName(): string + { + return this._newName; + } +} diff --git a/packages/communication/src/messages/parser/user/data/UserProfileParser.ts b/packages/communication/src/messages/parser/user/data/UserProfileParser.ts new file mode 100644 index 0000000..5abb303 --- /dev/null +++ b/packages/communication/src/messages/parser/user/data/UserProfileParser.ts @@ -0,0 +1,130 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { HabboGroupEntryData } from '../HabboGroupEntryData'; + +export class UserProfileParser implements IMessageParser +{ + private _id: number; + private _username: string; + private _figure: string; + private _motto: string; + private _registration: string; + private _achievementPoints: number; + private _friendsCount: number; + private _isMyFriend: boolean; + private _requestSent: boolean; + private _isOnline: boolean; + private _groups: HabboGroupEntryData[]; + private _secondsSinceLastVisit: number; + private _openProfileWindow: boolean; + + public flush(): boolean + { + this._id = 0; + this._username = null; + this._figure = null; + this._motto = null; + this._registration = null; + this._achievementPoints = 0; + this._friendsCount = 0; + this._isMyFriend = false; + this._requestSent = false; + this._isOnline = false; + this._groups = []; + this._secondsSinceLastVisit = 0; + this._openProfileWindow = false; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._id = wrapper.readInt(); + this._username = wrapper.readString(); + this._figure = wrapper.readString(); + this._motto = wrapper.readString(); + this._registration = wrapper.readString(); + this._achievementPoints = wrapper.readInt(); + this._friendsCount = wrapper.readInt(); + this._isMyFriend = wrapper.readBoolean(); + this._requestSent = wrapper.readBoolean(); + this._isOnline = wrapper.readBoolean(); + const groupsCount = wrapper.readInt(); + + for(let i = 0; i < groupsCount; i++) + { + this._groups.push(new HabboGroupEntryData(wrapper)); + } + + this._secondsSinceLastVisit = wrapper.readInt(); + this._openProfileWindow = wrapper.readBoolean(); + + return true; + } + + public get id(): number + { + return this._id; + } + + public get username(): string + { + return this._username; + } + + public get figure(): string + { + return this._figure; + } + + public get motto(): string + { + return this._motto; + } + + public get registration(): string + { + return this._registration; + } + + public get achievementPoints(): number + { + return this._achievementPoints; + } + + public get friendsCount(): number + { + return this._friendsCount; + } + + public get isMyFriend(): boolean + { + return this._isMyFriend; + } + + public get requestSent(): boolean + { + return this._requestSent; + } + + public get isOnline(): boolean + { + return this._isOnline; + } + + public get groups(): HabboGroupEntryData[] + { + return this._groups; + } + + public get secondsSinceLastVisit(): number + { + return this._secondsSinceLastVisit; + } + + public get openProfileWindow(): boolean + { + return this._openProfileWindow; + } +} diff --git a/packages/communication/src/messages/parser/user/data/UserSettingsParser.ts b/packages/communication/src/messages/parser/user/data/UserSettingsParser.ts new file mode 100644 index 0000000..8283e45 --- /dev/null +++ b/packages/communication/src/messages/parser/user/data/UserSettingsParser.ts @@ -0,0 +1,83 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class UserSettingsParser implements IMessageParser +{ + private _volumeSystem: number; + private _volumeFurni: number; + private _volumeTrax: number; + private _oldChat: boolean; + private _roomInvites: boolean; + private _cameraFollow: boolean; + private _flags: number; + private _chatType: number; + + public flush(): boolean + { + this._volumeSystem = 0; + this._volumeFurni = 0; + this._volumeTrax = 0; + this._oldChat = false; + this._roomInvites = false; + this._cameraFollow = false; + this._flags = 0; + this._chatType = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._volumeSystem = wrapper.readInt(); + this._volumeFurni = wrapper.readInt(); + this._volumeTrax = wrapper.readInt(); + this._oldChat = wrapper.readBoolean(); + this._roomInvites = wrapper.readBoolean(); + this._cameraFollow = wrapper.readBoolean(); + this._flags = wrapper.readInt(); + this._chatType = wrapper.readInt(); + + return true; + } + + public get volumeSystem(): number + { + return this._volumeSystem; + } + + public get volumeFurni(): number + { + return this._volumeFurni; + } + + public get volumeTrax(): number + { + return this._volumeTrax; + } + + public get oldChat(): boolean + { + return this._oldChat; + } + + public get roomInvites(): boolean + { + return this._roomInvites; + } + + public get cameraFollow(): boolean + { + return this._cameraFollow; + } + + public get flags(): number + { + return this._flags; + } + + public get chatType(): number + { + return this._chatType; + } +} diff --git a/packages/communication/src/messages/parser/user/data/UserTagsParser.ts b/packages/communication/src/messages/parser/user/data/UserTagsParser.ts new file mode 100644 index 0000000..188ebd4 --- /dev/null +++ b/packages/communication/src/messages/parser/user/data/UserTagsParser.ts @@ -0,0 +1,43 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class UserTagsParser implements IMessageParser +{ + private _roomUnitId: number; + private _tags: string[]; + + public flush(): boolean + { + this._roomUnitId = -1; + this._tags = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._roomUnitId = wrapper.readInt(); + + let totalTags = wrapper.readInt(); + + while(totalTags > 0) + { + this._tags.push(wrapper.readString()); + + totalTags--; + } + + return true; + } + + public get roomUnitId(): number + { + return this._roomUnitId; + } + + public get tags(): string[] + { + return this._tags; + } +} diff --git a/packages/communication/src/messages/parser/user/data/index.ts b/packages/communication/src/messages/parser/user/data/index.ts new file mode 100644 index 0000000..ad707bf --- /dev/null +++ b/packages/communication/src/messages/parser/user/data/index.ts @@ -0,0 +1,10 @@ +export * from './RelationshipStatusInfo'; +export * from './RelationshipStatusInfoMessageParser'; +export * from './UserCurrentBadgesParser'; +export * from './UserFigureParser'; +export * from './UserInfoDataParser'; +export * from './UserInfoParser'; +export * from './UserNameChangeMessageParser'; +export * from './UserProfileParser'; +export * from './UserSettingsParser'; +export * from './UserTagsParser'; diff --git a/packages/communication/src/messages/parser/user/index.ts b/packages/communication/src/messages/parser/user/index.ts new file mode 100644 index 0000000..82dfb33 --- /dev/null +++ b/packages/communication/src/messages/parser/user/index.ts @@ -0,0 +1,30 @@ +export * from './access'; +export * from './AccountSafetyLockStatusChangeParser'; +export * from './ApproveNameResultParser'; +export * from './ChangeEmailResultParser'; +export * from './data'; +export * from './EmailStatusParser'; +export * from './ExtendedProfileChangedMessageParser'; +export * from './GroupDetailsChangedMessageParser'; +export * from './GroupMembershipRequestedMessageParser'; +export * from './GuildEditFailedMessageParser'; +export * from './GuildMemberMgmtFailedMessageParser'; +export * from './GuildMembershipsMessageParser'; +export * from './HabboGroupBadgesMessageParser'; +export * from './HabboGroupEntryData'; +export * from './HabboGroupJoinFailedMessageParser'; +export * from './IgnoredUsersParser'; +export * from './IgnoreResultParser'; +export * from './InClientLinkParser'; +export * from './inventory'; +export * from './inventory/currency'; +export * from './inventory/subscription'; +export * from './PetRespectNotificationParser'; +export * from './PetSupplementedNotificationParser'; +export * from './PetSupplementTypeEnum'; +export * from './RespectReceivedParser'; +export * from './RoomEntryData'; +export * from './ScrKickbackData'; +export * from './ScrSendKickbackInfoMessageParser'; +export * from './wardrobe'; +export * from './WelcomeGiftChangeEmailResultParser'; diff --git a/packages/communication/src/messages/parser/user/inventory/currency/UserCreditsParser.ts b/packages/communication/src/messages/parser/user/inventory/currency/UserCreditsParser.ts new file mode 100644 index 0000000..c9ed9b1 --- /dev/null +++ b/packages/communication/src/messages/parser/user/inventory/currency/UserCreditsParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class UserCreditsParser implements IMessageParser +{ + private _credits: string; + + public flush(): boolean + { + this._credits = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._credits = wrapper.readString(); + + return true; + } + + public get credits(): string + { + return this._credits; + } +} diff --git a/packages/communication/src/messages/parser/user/inventory/currency/UserCurrencyParser.ts b/packages/communication/src/messages/parser/user/inventory/currency/UserCurrencyParser.ts new file mode 100644 index 0000000..38e8403 --- /dev/null +++ b/packages/communication/src/messages/parser/user/inventory/currency/UserCurrencyParser.ts @@ -0,0 +1,34 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class UserCurrencyParser implements IMessageParser +{ + private _currencies: Map; + + public flush(): boolean + { + this._currencies = new Map(); + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let totalCurrencies = wrapper.readInt(); + + while(totalCurrencies > 0) + { + this._currencies.set(wrapper.readInt(), wrapper.readInt()); + + totalCurrencies--; + } + + return true; + } + + public get currencies(): Map + { + return this._currencies; + } +} diff --git a/packages/communication/src/messages/parser/user/inventory/currency/index.ts b/packages/communication/src/messages/parser/user/inventory/currency/index.ts new file mode 100644 index 0000000..a6e0537 --- /dev/null +++ b/packages/communication/src/messages/parser/user/inventory/currency/index.ts @@ -0,0 +1,2 @@ +export * from './UserCreditsParser'; +export * from './UserCurrencyParser'; diff --git a/packages/communication/src/messages/parser/user/inventory/index.ts b/packages/communication/src/messages/parser/user/inventory/index.ts new file mode 100644 index 0000000..e25bf08 --- /dev/null +++ b/packages/communication/src/messages/parser/user/inventory/index.ts @@ -0,0 +1,2 @@ +export * from './currency'; +export * from './subscription'; diff --git a/packages/communication/src/messages/parser/user/inventory/subscription/UserSubscriptionParser.ts b/packages/communication/src/messages/parser/user/inventory/subscription/UserSubscriptionParser.ts new file mode 100644 index 0000000..34e8ed2 --- /dev/null +++ b/packages/communication/src/messages/parser/user/inventory/subscription/UserSubscriptionParser.ts @@ -0,0 +1,113 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class UserSubscriptionParser implements IMessageParser +{ + public static readonly RESPONSE_TYPE_LOGIN: number = 1; + public static readonly RESPONSE_TYPE_PURCHASE: number = 2; + public static readonly RESPONSE_TYPE_DISCOUNT_AVAILABLE: number = 3; + public static readonly RESPONSE_TYPE_CITIZENSHIP_DISCOUNT: number = 4; + + private _productName: string; + private _daysToPeriodEnd: number; + private _memberPeriods: number; + private _periodsSubscribedAhead: number; + private _responseType: number; + private _hasEverBeenMember: boolean; + private _isVip: boolean; + private _pastClubDays: number; + private _pastVipDays: number; + private _minutesUntilExpiration: number; + private _minutesSinceLastModified: number; + + public flush(): boolean + { + this._productName = null; + this._daysToPeriodEnd = 0; + this._memberPeriods = 0; + this._periodsSubscribedAhead = 0; + this._responseType = 0; + this._hasEverBeenMember = false; + this._isVip = false; + this._pastClubDays = 0; + this._pastVipDays = 0; + this._minutesUntilExpiration = 0; + this._minutesSinceLastModified = 0; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._productName = wrapper.readString(); + this._daysToPeriodEnd = wrapper.readInt(); + this._memberPeriods = wrapper.readInt(); + this._periodsSubscribedAhead = wrapper.readInt(); + this._responseType = wrapper.readInt(); + this._hasEverBeenMember = wrapper.readBoolean(); + this._isVip = wrapper.readBoolean(); + this._pastClubDays = wrapper.readInt(); + this._pastVipDays = wrapper.readInt(); + this._minutesUntilExpiration = wrapper.readInt(); + + if(wrapper.bytesAvailable) this._minutesSinceLastModified = wrapper.readInt(); + + return true; + } + + public get productName(): string + { + return this._productName; + } + + public get daysToPeriodEnd(): number + { + return this._daysToPeriodEnd; + } + + public get memberPeriods(): number + { + return this._memberPeriods; + } + + public get periodsSubscribedAhead(): number + { + return this._periodsSubscribedAhead; + } + + public get responseType(): number + { + return this._responseType; + } + + public get hasEverBeenMember(): boolean + { + return this._hasEverBeenMember; + } + + public get isVip(): boolean + { + return this._isVip; + } + + public get pastClubDays(): number + { + return this._pastClubDays; + } + + public get pastVipDays(): number + { + return this._pastVipDays; + } + + public get minutesUntilExpiration(): number + { + return this._minutesUntilExpiration; + } + + public get minutesSinceLastModified(): number + { + return this._minutesSinceLastModified; + } +} diff --git a/packages/communication/src/messages/parser/user/inventory/subscription/index.ts b/packages/communication/src/messages/parser/user/inventory/subscription/index.ts new file mode 100644 index 0000000..e88ac0d --- /dev/null +++ b/packages/communication/src/messages/parser/user/inventory/subscription/index.ts @@ -0,0 +1 @@ +export * from './UserSubscriptionParser'; diff --git a/packages/communication/src/messages/parser/user/wardrobe/UserWardrobePageParser.ts b/packages/communication/src/messages/parser/user/wardrobe/UserWardrobePageParser.ts new file mode 100644 index 0000000..d8762bb --- /dev/null +++ b/packages/communication/src/messages/parser/user/wardrobe/UserWardrobePageParser.ts @@ -0,0 +1,40 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class UserWardrobePageParser implements IMessageParser +{ + private _looks: Map; + + public flush(): boolean + { + this._looks = new Map(); + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + wrapper.readInt(); + + let totalLooks = wrapper.readInt(); + + while(totalLooks > 0) + { + const slotId = wrapper.readInt(); + const look = wrapper.readString(); + const gender = wrapper.readString(); + + this._looks.set(slotId, [look, gender]); + + totalLooks--; + } + + return true; + } + + public get looks(): Map + { + return this._looks; + } +} diff --git a/packages/communication/src/messages/parser/user/wardrobe/index.ts b/packages/communication/src/messages/parser/user/wardrobe/index.ts new file mode 100644 index 0000000..a2878b4 --- /dev/null +++ b/packages/communication/src/messages/parser/user/wardrobe/index.ts @@ -0,0 +1 @@ +export * from './UserWardrobePageParser'; diff --git a/packages/communication/src/messages/parser/userclassification/UserClassificationMessageParser.ts b/packages/communication/src/messages/parser/userclassification/UserClassificationMessageParser.ts new file mode 100644 index 0000000..0900b0f --- /dev/null +++ b/packages/communication/src/messages/parser/userclassification/UserClassificationMessageParser.ts @@ -0,0 +1,57 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class UserClassificationMessageParser implements IMessageParser +{ + private _classifiedUsersNames: Map; + private _classifiedUsersClass: Map; + + public flush(): boolean + { + if(this._classifiedUsersNames) + { + this._classifiedUsersNames = new Map(); + } + if(this._classifiedUsersClass) + { + this._classifiedUsersClass = new Map(); + } + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + let _local_3: number; + let _local_4: string; + let _local_5: string; + + let count: number = wrapper.readInt(); + + this._classifiedUsersNames = new Map(); + this._classifiedUsersClass = new Map(); + + while(count > 0) + { + _local_3 = wrapper.readInt(); + _local_4 = wrapper.readString(); + _local_5 = wrapper.readString(); + this._classifiedUsersNames.set(_local_3, _local_4); + this._classifiedUsersClass.set(_local_3, _local_5); + count--; + } + + return true; + } + + public get classifiedUsernameMap(): Map + { + return this._classifiedUsersNames; + } + + public get classifiedUserTypeMap(): Map + { + return this._classifiedUsersClass; + } +} diff --git a/packages/communication/src/messages/parser/userclassification/index.ts b/packages/communication/src/messages/parser/userclassification/index.ts new file mode 100644 index 0000000..8779e98 --- /dev/null +++ b/packages/communication/src/messages/parser/userclassification/index.ts @@ -0,0 +1 @@ +export * from './UserClassificationMessageParser'; diff --git a/packages/communication/tsconfig.json b/packages/communication/tsconfig.json new file mode 100644 index 0000000..5e8757d --- /dev/null +++ b/packages/communication/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./src", + "outDir": "./dist", + "sourceMap": false, + "declaration": true, + "experimentalDecorators": true, + "moduleResolution": "Node", + "esModuleInterop": true, + "importHelpers": true, + "isolatedModules": true, + "resolveJsonModule": true, + "downlevelIteration": true, + "allowSyntheticDefaultImports": true, + "allowJs": true, + "skipLibCheck": true, + "noEmit": true, + "strict": false, + "strictNullChecks": false, + "target": "ES6", + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "module": "ES6" + }, + "include": [ + "src" ] +} diff --git a/packages/configuration/.eslintrc.json b/packages/configuration/.eslintrc.json new file mode 100644 index 0000000..ad92133 --- /dev/null +++ b/packages/configuration/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": [ "@nitrots/eslint-config" ] +} diff --git a/packages/configuration/.gitignore b/packages/configuration/.gitignore new file mode 100644 index 0000000..1413af9 --- /dev/null +++ b/packages/configuration/.gitignore @@ -0,0 +1,51 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings +.git + +# System Files +.DS_Store +Thumbs.db + +*.zip +*.as +*.bin diff --git a/packages/configuration/index.ts b/packages/configuration/index.ts new file mode 100644 index 0000000..8420b10 --- /dev/null +++ b/packages/configuration/index.ts @@ -0,0 +1 @@ +export * from './src'; diff --git a/packages/configuration/package.json b/packages/configuration/package.json new file mode 100644 index 0000000..7cef9c2 --- /dev/null +++ b/packages/configuration/package.json @@ -0,0 +1,20 @@ +{ + "name": "@nitrots/configuration", + "description": "Nitro configuration module", + "version": "1.0.0", + "type": "module", + "license": "GPL-3.0", + "scripts": { + "compile": "tsc --project ./tsconfig.json --noEmit false", + "eslint": "eslint ./src --fix" + }, + "main": "./index", + "dependencies": { + "@nitrots/api": "1.0.0", + "@nitrots/eslint-config": "1.0.0", + "@nitrots/utils": "1.0.0" + }, + "devDependencies": { + "typescript": "~5.4.2" + } +} diff --git a/packages/configuration/src/ConfigurationManager.ts b/packages/configuration/src/ConfigurationManager.ts new file mode 100644 index 0000000..a72a04a --- /dev/null +++ b/packages/configuration/src/ConfigurationManager.ts @@ -0,0 +1,167 @@ +import { NitroLogger, NitroVersion } from '@nitrots/utils'; +import { IConfigurationManager } from './IConfigurationManager'; + +export class ConfigurationManager implements IConfigurationManager +{ + private _definitions: Map = new Map(); + private _config: any = {}; + private _missingKeys: string[] = []; + + constructor() + { + NitroVersion.sayHello(); + } + + public async init(): Promise + { + await this.reloadConfiguration(); + } + + public async reloadConfiguration(): Promise + { + try + { + this.resetConfiguration(); + this.parseConfiguration(this.getDefaultConfig(), true); + + const configurationUrls = this.getValue('config.urls').slice(); + + if(!configurationUrls || !configurationUrls.length) throw new Error('Invalid configuration urls'); + + for(const url of configurationUrls) + { + if(!url || !url.length) return; + + const response = await fetch(url); + + if(response.status !== 200) throw new Error('Invalid configuration file'); + + this.parseConfiguration(await response.json()); + } + } + + catch (err) + { + throw new Error(err); + } + } + + public resetConfiguration(): void + { + this._definitions.clear(); + this._config = {}; + this._missingKeys = []; + } + + public 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 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 removeInterpolateKey(value: string): string + { + return value.replace('${', '').replace('}', ''); + } + + public 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 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 getDefaultConfig(): { [index: string]: any } + { + return window.NitroConfig; + } + + public get definitions(): Map + { + return this._definitions; + } +} diff --git a/packages/configuration/src/GetConfiguration.ts b/packages/configuration/src/GetConfiguration.ts new file mode 100644 index 0000000..bcf539b --- /dev/null +++ b/packages/configuration/src/GetConfiguration.ts @@ -0,0 +1,6 @@ +import { ConfigurationManager } from './ConfigurationManager'; +import { IConfigurationManager } from './IConfigurationManager'; + +const configuration = new ConfigurationManager(); + +export const GetConfiguration = (): IConfigurationManager => configuration; diff --git a/packages/configuration/src/IConfigurationManager.ts b/packages/configuration/src/IConfigurationManager.ts new file mode 100644 index 0000000..0b2f5cc --- /dev/null +++ b/packages/configuration/src/IConfigurationManager.ts @@ -0,0 +1,12 @@ +export interface IConfigurationManager +{ + init(): Promise; + reloadConfiguration(): Promise; + resetConfiguration(): void; + parseConfiguration(data: { [index: string]: any }, overrides?: boolean): boolean; + interpolate(value: string, regex?: RegExp): string; + getValue(key: string, value?: T): T; + setValue(key: string, value: T): void; + getDefaultConfig(): { [index: string]: any }; + readonly definitions: Map; +} diff --git a/packages/configuration/src/index.ts b/packages/configuration/src/index.ts new file mode 100644 index 0000000..0f73df7 --- /dev/null +++ b/packages/configuration/src/index.ts @@ -0,0 +1,3 @@ +export * from './ConfigurationManager'; +export * from './GetConfiguration'; +export * from './IConfigurationManager'; diff --git a/packages/configuration/tsconfig.json b/packages/configuration/tsconfig.json new file mode 100644 index 0000000..5e8757d --- /dev/null +++ b/packages/configuration/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./src", + "outDir": "./dist", + "sourceMap": false, + "declaration": true, + "experimentalDecorators": true, + "moduleResolution": "Node", + "esModuleInterop": true, + "importHelpers": true, + "isolatedModules": true, + "resolveJsonModule": true, + "downlevelIteration": true, + "allowSyntheticDefaultImports": true, + "allowJs": true, + "skipLibCheck": true, + "noEmit": true, + "strict": false, + "strictNullChecks": false, + "target": "ES6", + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "module": "ES6" + }, + "include": [ + "src" ] +} diff --git a/packages/eslint-config/.eslintrc.json b/packages/eslint-config/.eslintrc.json new file mode 100644 index 0000000..1a4901d --- /dev/null +++ b/packages/eslint-config/.eslintrc.json @@ -0,0 +1,128 @@ +{ + "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/ban-types": [ + "error", + { + "types": + { + "String": true, + "Boolean": true, + "Number": true, + "Symbol": true, + "{}": false, + "Object": false, + "object": false, + "Function": false + }, + "extendDefaults": true + } + ] + } +} diff --git a/packages/eslint-config/.gitignore b/packages/eslint-config/.gitignore new file mode 100644 index 0000000..1413af9 --- /dev/null +++ b/packages/eslint-config/.gitignore @@ -0,0 +1,51 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings +.git + +# System Files +.DS_Store +Thumbs.db + +*.zip +*.as +*.bin diff --git a/packages/eslint-config/index.js b/packages/eslint-config/index.js new file mode 100644 index 0000000..3b07596 --- /dev/null +++ b/packages/eslint-config/index.js @@ -0,0 +1 @@ +module.exports = require('./.eslintrc.json'); diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json new file mode 100644 index 0000000..68d987d --- /dev/null +++ b/packages/eslint-config/package.json @@ -0,0 +1,15 @@ +{ + "name": "@nitrots/eslint-config", + "description": "Nitro eslint configs", + "version": "1.0.0", + "license": "GPL-3.0", + "main": "./index", + "dependencies": { + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^7.1.1", + "@typescript-eslint/parser": "^7.1.1", + "eslint": "^8.57.0" + } +} + \ No newline at end of file diff --git a/packages/events/.eslintrc.json b/packages/events/.eslintrc.json new file mode 100644 index 0000000..ad92133 --- /dev/null +++ b/packages/events/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": [ "@nitrots/eslint-config" ] +} diff --git a/packages/events/.gitignore b/packages/events/.gitignore new file mode 100644 index 0000000..1413af9 --- /dev/null +++ b/packages/events/.gitignore @@ -0,0 +1,51 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings +.git + +# System Files +.DS_Store +Thumbs.db + +*.zip +*.as +*.bin diff --git a/packages/events/index.ts b/packages/events/index.ts new file mode 100644 index 0000000..8420b10 --- /dev/null +++ b/packages/events/index.ts @@ -0,0 +1 @@ +export * from './src'; diff --git a/packages/events/package.json b/packages/events/package.json new file mode 100644 index 0000000..6fc7394 --- /dev/null +++ b/packages/events/package.json @@ -0,0 +1,21 @@ +{ + "name": "@nitrots/events", + "description": "Nitro events module", + "version": "1.0.0", + "type": "module", + "license": "GPL-3.0", + "scripts": { + "build": "vite build", + "compile": "tsc --project ./tsconfig.json --noEmit false", + "eslint": "eslint ./src --fix" + }, + "main": "./index", + "dependencies": { + "@nitrots/api": "1.0.0", + "@nitrots/eslint-config": "1.0.0", + "@nitrots/utils": "1.0.0" + }, + "devDependencies": { + "typescript": "~5.4.2" + } +} diff --git a/packages/events/src/EventDispatcher.ts b/packages/events/src/EventDispatcher.ts new file mode 100644 index 0000000..a3bdc84 --- /dev/null +++ b/packages/events/src/EventDispatcher.ts @@ -0,0 +1,97 @@ +import { IEventDispatcher, INitroEvent } from '@nitrots/api'; +import { NitroLogger } from '@nitrots/utils'; + +export class EventDispatcher implements IEventDispatcher +{ + private _listeners: Map = new Map(); + + public dispose(): void + { + this.removeAllListeners(); + } + + public addEventListener(type: string, callback: (event: T) => void): 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: Function): 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: T): boolean + { + if(!event) return false; + + NitroLogger.events('Dispatched Event', event.type); + + this.processEvent(event); + + return true; + } + + private processEvent(event: T): void + { + const existing = this._listeners.get(event.type); + + if(!existing || !existing.length) return; + + const callbacks: Function[] = []; + + for(const callback of existing) + { + if(!callback) continue; + + callbacks.push(callback); + } + + while(callbacks.length) + { + const callback = callbacks.shift(); + + try + { + (callback as Function)(event); + } + + catch (err) + { + NitroLogger.error(err.stack); + + return; + } + } + } + + public removeAllListeners(): void + { + this._listeners.clear(); + } +} diff --git a/packages/events/src/GetEventDispatcher.ts b/packages/events/src/GetEventDispatcher.ts new file mode 100644 index 0000000..a145158 --- /dev/null +++ b/packages/events/src/GetEventDispatcher.ts @@ -0,0 +1,5 @@ +import { EventDispatcher } from './EventDispatcher'; + +const eventDispatcher = new EventDispatcher(); + +export const GetEventDispatcher = () => eventDispatcher; diff --git a/packages/events/src/NitroEventType.ts b/packages/events/src/NitroEventType.ts new file mode 100644 index 0000000..563bcb7 --- /dev/null +++ b/packages/events/src/NitroEventType.ts @@ -0,0 +1,16 @@ +export class NitroEventType +{ + public static readonly CONFIG_LOADED = 'CONFIG_LOADED'; + public static readonly CONFIG_FAILED = 'CONFIG_FAILED'; + public static readonly LOCALIZATION_LOADED = 'LOCALIZATION_LOADED'; + public static readonly LOCALIZATION_FAILED = 'LOCALIZATION_FAILED'; + public static readonly SOCKET_OPENED = 'SOCKET_OPENED'; + public static readonly SOCKET_CLOSED = 'SOCKET_CLOSED'; + public static readonly SOCKET_ERROR = 'SOCKET_ERROR'; + public static readonly SOCKET_CONNECTED = 'SOCKET_CONNECTED'; + public static readonly AVATAR_ASSET_DOWNLOADED = 'AVATAR_ASSET_DOWNLOADED'; + public static readonly AVATAR_ASSET_LOADED = 'AVATAR_ASSET_LOADED'; + public static readonly AVATAR_EFFECT_DOWNLOADED = 'AVATAR_EFFECT_DOWNLOADED'; + public static readonly AVATAR_EFFECT_LOADED = 'AVATAR_EFFECT_LOADED'; + public static readonly FURNITURE_DATA_LOADED = 'FURNITURE_DATA_LOADED'; +} diff --git a/packages/events/src/NitroSettingsEvent.ts b/packages/events/src/NitroSettingsEvent.ts new file mode 100644 index 0000000..62635a0 --- /dev/null +++ b/packages/events/src/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/packages/events/src/NitroSoundEvent.ts b/packages/events/src/NitroSoundEvent.ts new file mode 100644 index 0000000..5e70223 --- /dev/null +++ b/packages/events/src/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/packages/events/src/NitroToolbarAnimateIconEvent.ts b/packages/events/src/NitroToolbarAnimateIconEvent.ts new file mode 100644 index 0000000..5aa3f7f --- /dev/null +++ b/packages/events/src/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/packages/events/src/NitroToolbarEvent.ts b/packages/events/src/NitroToolbarEvent.ts new file mode 100644 index 0000000..d9cbc63 --- /dev/null +++ b/packages/events/src/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/packages/events/src/avatar/AvatarRenderEffectLibraryEvent.ts b/packages/events/src/avatar/AvatarRenderEffectLibraryEvent.ts new file mode 100644 index 0000000..5b0e217 --- /dev/null +++ b/packages/events/src/avatar/AvatarRenderEffectLibraryEvent.ts @@ -0,0 +1,21 @@ +import { IEffectAssetDownloadLibrary } from '@nitrots/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/packages/events/src/avatar/AvatarRenderLibraryEvent.ts b/packages/events/src/avatar/AvatarRenderLibraryEvent.ts new file mode 100644 index 0000000..7fc1cb6 --- /dev/null +++ b/packages/events/src/avatar/AvatarRenderLibraryEvent.ts @@ -0,0 +1,21 @@ +import { IAvatarAssetDownloadLibrary } from '@nitrots/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/packages/events/src/avatar/index.ts b/packages/events/src/avatar/index.ts new file mode 100644 index 0000000..13a1468 --- /dev/null +++ b/packages/events/src/avatar/index.ts @@ -0,0 +1,2 @@ +export * from './AvatarRenderEffectLibraryEvent'; +export * from './AvatarRenderLibraryEvent'; diff --git a/packages/events/src/camera/RoomCameraWidgetManagerEvent.ts b/packages/events/src/camera/RoomCameraWidgetManagerEvent.ts new file mode 100644 index 0000000..5989627 --- /dev/null +++ b/packages/events/src/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/packages/events/src/camera/index.ts b/packages/events/src/camera/index.ts new file mode 100644 index 0000000..b6e32e2 --- /dev/null +++ b/packages/events/src/camera/index.ts @@ -0,0 +1 @@ +export * from './RoomCameraWidgetManagerEvent'; diff --git a/packages/events/src/communication/NitroCommunicationDemoEvent.ts b/packages/events/src/communication/NitroCommunicationDemoEvent.ts new file mode 100644 index 0000000..ca7a20d --- /dev/null +++ b/packages/events/src/communication/NitroCommunicationDemoEvent.ts @@ -0,0 +1,27 @@ +import { IConnection } from '@nitrots/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/packages/events/src/communication/index.ts b/packages/events/src/communication/index.ts new file mode 100644 index 0000000..d795b92 --- /dev/null +++ b/packages/events/src/communication/index.ts @@ -0,0 +1 @@ +export * from './NitroCommunicationDemoEvent'; diff --git a/packages/events/src/core/ConfigurationEvent.ts b/packages/events/src/core/ConfigurationEvent.ts new file mode 100644 index 0000000..b7edf79 --- /dev/null +++ b/packages/events/src/core/ConfigurationEvent.ts @@ -0,0 +1,12 @@ +import { NitroEvent } from './NitroEvent'; + +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/packages/events/src/core/MessageEvent.ts b/packages/events/src/core/MessageEvent.ts new file mode 100644 index 0000000..81d8694 --- /dev/null +++ b/packages/events/src/core/MessageEvent.ts @@ -0,0 +1,55 @@ +import { IConnection, IMessageEvent, IMessageParser } from '@nitrots/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/packages/events/src/core/NitroEvent.ts b/packages/events/src/core/NitroEvent.ts new file mode 100644 index 0000000..b65e5de --- /dev/null +++ b/packages/events/src/core/NitroEvent.ts @@ -0,0 +1,16 @@ +import { INitroEvent } from '@nitrots/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/packages/events/src/core/SocketConnectionEvent.ts b/packages/events/src/core/SocketConnectionEvent.ts new file mode 100644 index 0000000..a5e20f8 --- /dev/null +++ b/packages/events/src/core/SocketConnectionEvent.ts @@ -0,0 +1,31 @@ +import { IConnection } from '@nitrots/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/packages/events/src/core/index.ts b/packages/events/src/core/index.ts new file mode 100644 index 0000000..9a5d80e --- /dev/null +++ b/packages/events/src/core/index.ts @@ -0,0 +1,4 @@ +export * from './ConfigurationEvent'; +export * from './MessageEvent'; +export * from './NitroEvent'; +export * from './SocketConnectionEvent'; diff --git a/packages/events/src/index.ts b/packages/events/src/index.ts new file mode 100644 index 0000000..b5e8de3 --- /dev/null +++ b/packages/events/src/index.ts @@ -0,0 +1,14 @@ +export * from './EventDispatcher'; +export * from './GetEventDispatcher'; +export * from './NitroEventType'; +export * from './NitroSettingsEvent'; +export * from './NitroSoundEvent'; +export * from './NitroToolbarAnimateIconEvent'; +export * from './NitroToolbarEvent'; +export * from './avatar'; +export * from './camera'; +export * from './communication'; +export * from './core'; +export * from './room'; +export * from './session'; +export * from './sound'; diff --git a/packages/events/src/room/RoomBackgroundColorEvent.ts b/packages/events/src/room/RoomBackgroundColorEvent.ts new file mode 100644 index 0000000..03152df --- /dev/null +++ b/packages/events/src/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/packages/events/src/room/RoomContentLoadedEvent.ts b/packages/events/src/room/RoomContentLoadedEvent.ts new file mode 100644 index 0000000..1cdc9fb --- /dev/null +++ b/packages/events/src/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/packages/events/src/room/RoomDragEvent.ts b/packages/events/src/room/RoomDragEvent.ts new file mode 100644 index 0000000..e41931b --- /dev/null +++ b/packages/events/src/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/packages/events/src/room/RoomEngineDimmerStateEvent.ts b/packages/events/src/room/RoomEngineDimmerStateEvent.ts new file mode 100644 index 0000000..85ca480 --- /dev/null +++ b/packages/events/src/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/packages/events/src/room/RoomEngineEvent.ts b/packages/events/src/room/RoomEngineEvent.ts new file mode 100644 index 0000000..4d90867 --- /dev/null +++ b/packages/events/src/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/packages/events/src/room/RoomEngineObjectEvent.ts b/packages/events/src/room/RoomEngineObjectEvent.ts new file mode 100644 index 0000000..75ff09b --- /dev/null +++ b/packages/events/src/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/packages/events/src/room/RoomEngineObjectPlacedEvent.ts b/packages/events/src/room/RoomEngineObjectPlacedEvent.ts new file mode 100644 index 0000000..cd008df --- /dev/null +++ b/packages/events/src/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/packages/events/src/room/RoomEngineObjectPlacedOnUserEvent.ts b/packages/events/src/room/RoomEngineObjectPlacedOnUserEvent.ts new file mode 100644 index 0000000..0ccb087 --- /dev/null +++ b/packages/events/src/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/packages/events/src/room/RoomEngineObjectPlaySoundEvent.ts b/packages/events/src/room/RoomEngineObjectPlaySoundEvent.ts new file mode 100644 index 0000000..c5e39fd --- /dev/null +++ b/packages/events/src/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/packages/events/src/room/RoomEngineRoomAdEvent.ts b/packages/events/src/room/RoomEngineRoomAdEvent.ts new file mode 100644 index 0000000..3325373 --- /dev/null +++ b/packages/events/src/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/packages/events/src/room/RoomEngineSamplePlaybackEvent.ts b/packages/events/src/room/RoomEngineSamplePlaybackEvent.ts new file mode 100644 index 0000000..ba4e04e --- /dev/null +++ b/packages/events/src/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/packages/events/src/room/RoomEngineTriggerWidgetEvent.ts b/packages/events/src/room/RoomEngineTriggerWidgetEvent.ts new file mode 100644 index 0000000..ba1c8cb --- /dev/null +++ b/packages/events/src/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/packages/events/src/room/RoomEngineUseProductEvent.ts b/packages/events/src/room/RoomEngineUseProductEvent.ts new file mode 100644 index 0000000..c8e78aa --- /dev/null +++ b/packages/events/src/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/packages/events/src/room/RoomObjectBadgeAssetEvent.ts b/packages/events/src/room/RoomObjectBadgeAssetEvent.ts new file mode 100644 index 0000000..9734799 --- /dev/null +++ b/packages/events/src/room/RoomObjectBadgeAssetEvent.ts @@ -0,0 +1,28 @@ +import { IRoomObject } from '@nitrots/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/packages/events/src/room/RoomObjectDataRequestEvent.ts b/packages/events/src/room/RoomObjectDataRequestEvent.ts new file mode 100644 index 0000000..b0475a3 --- /dev/null +++ b/packages/events/src/room/RoomObjectDataRequestEvent.ts @@ -0,0 +1,13 @@ +import { IRoomObject } from '@nitrots/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/packages/events/src/room/RoomObjectDimmerStateUpdateEvent.ts b/packages/events/src/room/RoomObjectDimmerStateUpdateEvent.ts new file mode 100644 index 0000000..af60673 --- /dev/null +++ b/packages/events/src/room/RoomObjectDimmerStateUpdateEvent.ts @@ -0,0 +1,49 @@ +import { IRoomObject } from '@nitrots/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/packages/events/src/room/RoomObjectEvent.ts b/packages/events/src/room/RoomObjectEvent.ts new file mode 100644 index 0000000..c229648 --- /dev/null +++ b/packages/events/src/room/RoomObjectEvent.ts @@ -0,0 +1,33 @@ +import { IRoomObject } from '@nitrots/api'; +import { NitroEvent } from '../core'; + +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/packages/events/src/room/RoomObjectFloorHoleEvent.ts b/packages/events/src/room/RoomObjectFloorHoleEvent.ts new file mode 100644 index 0000000..cd51b89 --- /dev/null +++ b/packages/events/src/room/RoomObjectFloorHoleEvent.ts @@ -0,0 +1,13 @@ +import { IRoomObject } from '@nitrots/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/packages/events/src/room/RoomObjectFurnitureActionEvent.ts b/packages/events/src/room/RoomObjectFurnitureActionEvent.ts new file mode 100644 index 0000000..f338e8a --- /dev/null +++ b/packages/events/src/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/packages/events/src/room/RoomObjectHSLColorEnableEvent.ts b/packages/events/src/room/RoomObjectHSLColorEnableEvent.ts new file mode 100644 index 0000000..e00a4f3 --- /dev/null +++ b/packages/events/src/room/RoomObjectHSLColorEnableEvent.ts @@ -0,0 +1,42 @@ +import { IRoomObject } from '@nitrots/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/packages/events/src/room/RoomObjectHSLColorEnabledEvent.ts b/packages/events/src/room/RoomObjectHSLColorEnabledEvent.ts new file mode 100644 index 0000000..b4a3f9e --- /dev/null +++ b/packages/events/src/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/packages/events/src/room/RoomObjectMouseEvent.ts b/packages/events/src/room/RoomObjectMouseEvent.ts new file mode 100644 index 0000000..3c8c34f --- /dev/null +++ b/packages/events/src/room/RoomObjectMouseEvent.ts @@ -0,0 +1,100 @@ +import { IRoomObject } from '@nitrots/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/packages/events/src/room/RoomObjectMoveEvent.ts b/packages/events/src/room/RoomObjectMoveEvent.ts new file mode 100644 index 0000000..483b68b --- /dev/null +++ b/packages/events/src/room/RoomObjectMoveEvent.ts @@ -0,0 +1,13 @@ +import { IRoomObject } from '@nitrots/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/packages/events/src/room/RoomObjectPlaySoundIdEvent.ts b/packages/events/src/room/RoomObjectPlaySoundIdEvent.ts new file mode 100644 index 0000000..815f6c0 --- /dev/null +++ b/packages/events/src/room/RoomObjectPlaySoundIdEvent.ts @@ -0,0 +1,29 @@ +import { IRoomObject } from '@nitrots/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/packages/events/src/room/RoomObjectRoomAdEvent.ts b/packages/events/src/room/RoomObjectRoomAdEvent.ts new file mode 100644 index 0000000..ac8deaa --- /dev/null +++ b/packages/events/src/room/RoomObjectRoomAdEvent.ts @@ -0,0 +1,32 @@ +import { IRoomObject } from '@nitrots/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/packages/events/src/room/RoomObjectSamplePlaybackEvent.ts b/packages/events/src/room/RoomObjectSamplePlaybackEvent.ts new file mode 100644 index 0000000..77384ad --- /dev/null +++ b/packages/events/src/room/RoomObjectSamplePlaybackEvent.ts @@ -0,0 +1,31 @@ +import { IRoomObject } from '@nitrots/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/packages/events/src/room/RoomObjectSoundMachineEvent.ts b/packages/events/src/room/RoomObjectSoundMachineEvent.ts new file mode 100644 index 0000000..9576f1e --- /dev/null +++ b/packages/events/src/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/packages/events/src/room/RoomObjectStateChangedEvent.ts b/packages/events/src/room/RoomObjectStateChangedEvent.ts new file mode 100644 index 0000000..3f9a57a --- /dev/null +++ b/packages/events/src/room/RoomObjectStateChangedEvent.ts @@ -0,0 +1,22 @@ +import { IRoomObject } from '@nitrots/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/packages/events/src/room/RoomObjectTileMouseEvent.ts b/packages/events/src/room/RoomObjectTileMouseEvent.ts new file mode 100644 index 0000000..0de010c --- /dev/null +++ b/packages/events/src/room/RoomObjectTileMouseEvent.ts @@ -0,0 +1,48 @@ +import { IRoomObject } from '@nitrots/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/packages/events/src/room/RoomObjectWallMouseEvent.ts b/packages/events/src/room/RoomObjectWallMouseEvent.ts new file mode 100644 index 0000000..20ef87c --- /dev/null +++ b/packages/events/src/room/RoomObjectWallMouseEvent.ts @@ -0,0 +1,60 @@ +import { IRoomObject, IVector3D } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; +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/packages/events/src/room/RoomObjectWidgetRequestEvent.ts b/packages/events/src/room/RoomObjectWidgetRequestEvent.ts new file mode 100644 index 0000000..36d50d1 --- /dev/null +++ b/packages/events/src/room/RoomObjectWidgetRequestEvent.ts @@ -0,0 +1,48 @@ +import { IRoomObject } from '@nitrots/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/packages/events/src/room/RoomSpriteMouseEvent.ts b/packages/events/src/room/RoomSpriteMouseEvent.ts new file mode 100644 index 0000000..7a68609 --- /dev/null +++ b/packages/events/src/room/RoomSpriteMouseEvent.ts @@ -0,0 +1,117 @@ +import { IRoomSpriteMouseEvent } from '@nitrots/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/packages/events/src/room/RoomToObjectEvent.ts b/packages/events/src/room/RoomToObjectEvent.ts new file mode 100644 index 0000000..fbd5c53 --- /dev/null +++ b/packages/events/src/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/packages/events/src/room/RoomToObjectOwnAvatarMoveEvent.ts b/packages/events/src/room/RoomToObjectOwnAvatarMoveEvent.ts new file mode 100644 index 0000000..74883e8 --- /dev/null +++ b/packages/events/src/room/RoomToObjectOwnAvatarMoveEvent.ts @@ -0,0 +1,21 @@ +import { IVector3D } from '@nitrots/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/packages/events/src/room/RoomZoomEvent.ts b/packages/events/src/room/RoomZoomEvent.ts new file mode 100644 index 0000000..1119774 --- /dev/null +++ b/packages/events/src/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/packages/events/src/room/index.ts b/packages/events/src/room/index.ts new file mode 100644 index 0000000..6c25618 --- /dev/null +++ b/packages/events/src/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 './RoomObjectHSLColorEnableEvent'; +export * from './RoomObjectHSLColorEnabledEvent'; +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/packages/events/src/session/BadgeImageReadyEvent.ts b/packages/events/src/session/BadgeImageReadyEvent.ts new file mode 100644 index 0000000..b9dc8cf --- /dev/null +++ b/packages/events/src/session/BadgeImageReadyEvent.ts @@ -0,0 +1,28 @@ +import { Texture } from 'pixi.js'; +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/packages/events/src/session/MysteryBoxKeysUpdateEvent.ts b/packages/events/src/session/MysteryBoxKeysUpdateEvent.ts new file mode 100644 index 0000000..7f6a073 --- /dev/null +++ b/packages/events/src/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/packages/events/src/session/PerksUpdatedEvent.ts b/packages/events/src/session/PerksUpdatedEvent.ts new file mode 100644 index 0000000..e7b9679 --- /dev/null +++ b/packages/events/src/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/packages/events/src/session/RoomSessionChatEvent.ts b/packages/events/src/session/RoomSessionChatEvent.ts new file mode 100644 index 0000000..38d5435 --- /dev/null +++ b/packages/events/src/session/RoomSessionChatEvent.ts @@ -0,0 +1,69 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionConfirmPetBreedingEvent.ts b/packages/events/src/session/RoomSessionConfirmPetBreedingEvent.ts new file mode 100644 index 0000000..1292409 --- /dev/null +++ b/packages/events/src/session/RoomSessionConfirmPetBreedingEvent.ts @@ -0,0 +1,49 @@ +import { BreedingPetInfo, IRoomSession, RarityCategoryData } from '@nitrots/api'; +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/packages/events/src/session/RoomSessionConfirmPetBreedingResultEvent.ts b/packages/events/src/session/RoomSessionConfirmPetBreedingResultEvent.ts new file mode 100644 index 0000000..5e57886 --- /dev/null +++ b/packages/events/src/session/RoomSessionConfirmPetBreedingResultEvent.ts @@ -0,0 +1,28 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionDanceEvent.ts b/packages/events/src/session/RoomSessionDanceEvent.ts new file mode 100644 index 0000000..d7f7b28 --- /dev/null +++ b/packages/events/src/session/RoomSessionDanceEvent.ts @@ -0,0 +1,28 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionDimmerPresetsEvent.ts b/packages/events/src/session/RoomSessionDimmerPresetsEvent.ts new file mode 100644 index 0000000..86db244 --- /dev/null +++ b/packages/events/src/session/RoomSessionDimmerPresetsEvent.ts @@ -0,0 +1,45 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionDimmerPresetsEventPresetItem.ts b/packages/events/src/session/RoomSessionDimmerPresetsEventPresetItem.ts new file mode 100644 index 0000000..9a05be0 --- /dev/null +++ b/packages/events/src/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/packages/events/src/session/RoomSessionDoorbellEvent.ts b/packages/events/src/session/RoomSessionDoorbellEvent.ts new file mode 100644 index 0000000..ff6480b --- /dev/null +++ b/packages/events/src/session/RoomSessionDoorbellEvent.ts @@ -0,0 +1,23 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionErrorMessageEvent.ts b/packages/events/src/session/RoomSessionErrorMessageEvent.ts new file mode 100644 index 0000000..50f0630 --- /dev/null +++ b/packages/events/src/session/RoomSessionErrorMessageEvent.ts @@ -0,0 +1,32 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionEvent.ts b/packages/events/src/session/RoomSessionEvent.ts new file mode 100644 index 0000000..bf8bde9 --- /dev/null +++ b/packages/events/src/session/RoomSessionEvent.ts @@ -0,0 +1,31 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionFavoriteGroupUpdateEvent.ts b/packages/events/src/session/RoomSessionFavoriteGroupUpdateEvent.ts new file mode 100644 index 0000000..9f02357 --- /dev/null +++ b/packages/events/src/session/RoomSessionFavoriteGroupUpdateEvent.ts @@ -0,0 +1,42 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionFriendRequestEvent.ts b/packages/events/src/session/RoomSessionFriendRequestEvent.ts new file mode 100644 index 0000000..7b72482 --- /dev/null +++ b/packages/events/src/session/RoomSessionFriendRequestEvent.ts @@ -0,0 +1,35 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionNestBreedingSuccessEvent.ts b/packages/events/src/session/RoomSessionNestBreedingSuccessEvent.ts new file mode 100644 index 0000000..d65bb43 --- /dev/null +++ b/packages/events/src/session/RoomSessionNestBreedingSuccessEvent.ts @@ -0,0 +1,28 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionPetBreedingEvent.ts b/packages/events/src/session/RoomSessionPetBreedingEvent.ts new file mode 100644 index 0000000..5176a57 --- /dev/null +++ b/packages/events/src/session/RoomSessionPetBreedingEvent.ts @@ -0,0 +1,35 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionPetBreedingResultEvent.ts b/packages/events/src/session/RoomSessionPetBreedingResultEvent.ts new file mode 100644 index 0000000..99a1d2c --- /dev/null +++ b/packages/events/src/session/RoomSessionPetBreedingResultEvent.ts @@ -0,0 +1,28 @@ +import { IPetBreedingResultData, IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionPetCommandsUpdateEvent.ts b/packages/events/src/session/RoomSessionPetCommandsUpdateEvent.ts new file mode 100644 index 0000000..100d423 --- /dev/null +++ b/packages/events/src/session/RoomSessionPetCommandsUpdateEvent.ts @@ -0,0 +1,35 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionPetFigureUpdateEvent.ts b/packages/events/src/session/RoomSessionPetFigureUpdateEvent.ts new file mode 100644 index 0000000..2ba0fbb --- /dev/null +++ b/packages/events/src/session/RoomSessionPetFigureUpdateEvent.ts @@ -0,0 +1,28 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionPetInfoUpdateEvent.ts b/packages/events/src/session/RoomSessionPetInfoUpdateEvent.ts new file mode 100644 index 0000000..f9c2c28 --- /dev/null +++ b/packages/events/src/session/RoomSessionPetInfoUpdateEvent.ts @@ -0,0 +1,21 @@ +import { IRoomPetData, IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionPetLevelUpdateEvent.ts b/packages/events/src/session/RoomSessionPetLevelUpdateEvent.ts new file mode 100644 index 0000000..1f3745f --- /dev/null +++ b/packages/events/src/session/RoomSessionPetLevelUpdateEvent.ts @@ -0,0 +1,28 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionPetPackageEvent.ts b/packages/events/src/session/RoomSessionPetPackageEvent.ts new file mode 100644 index 0000000..8f751ea --- /dev/null +++ b/packages/events/src/session/RoomSessionPetPackageEvent.ts @@ -0,0 +1,43 @@ +import { IRoomSession, PetFigureData } from '@nitrots/api'; +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/packages/events/src/session/RoomSessionPetStatusUpdateEvent.ts b/packages/events/src/session/RoomSessionPetStatusUpdateEvent.ts new file mode 100644 index 0000000..45a805d --- /dev/null +++ b/packages/events/src/session/RoomSessionPetStatusUpdateEvent.ts @@ -0,0 +1,49 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionPollEvent.ts b/packages/events/src/session/RoomSessionPollEvent.ts new file mode 100644 index 0000000..935d2e8 --- /dev/null +++ b/packages/events/src/session/RoomSessionPollEvent.ts @@ -0,0 +1,100 @@ +import { IPollQuestion, IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionPresentEvent.ts b/packages/events/src/session/RoomSessionPresentEvent.ts new file mode 100644 index 0000000..ae6a954 --- /dev/null +++ b/packages/events/src/session/RoomSessionPresentEvent.ts @@ -0,0 +1,64 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionPropertyUpdateEvent.ts b/packages/events/src/session/RoomSessionPropertyUpdateEvent.ts new file mode 100644 index 0000000..e9281bb --- /dev/null +++ b/packages/events/src/session/RoomSessionPropertyUpdateEvent.ts @@ -0,0 +1,12 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionQueueEvent.ts b/packages/events/src/session/RoomSessionQueueEvent.ts new file mode 100644 index 0000000..0387f87 --- /dev/null +++ b/packages/events/src/session/RoomSessionQueueEvent.ts @@ -0,0 +1,57 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionSpectatorModeEvent.ts b/packages/events/src/session/RoomSessionSpectatorModeEvent.ts new file mode 100644 index 0000000..0e99623 --- /dev/null +++ b/packages/events/src/session/RoomSessionSpectatorModeEvent.ts @@ -0,0 +1,12 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionUserBadgesEvent.ts b/packages/events/src/session/RoomSessionUserBadgesEvent.ts new file mode 100644 index 0000000..bcae6bd --- /dev/null +++ b/packages/events/src/session/RoomSessionUserBadgesEvent.ts @@ -0,0 +1,29 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionUserDataUpdateEvent.ts b/packages/events/src/session/RoomSessionUserDataUpdateEvent.ts new file mode 100644 index 0000000..4ee8a13 --- /dev/null +++ b/packages/events/src/session/RoomSessionUserDataUpdateEvent.ts @@ -0,0 +1,21 @@ +import { IRoomSession, IRoomUserData } from '@nitrots/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/packages/events/src/session/RoomSessionUserFigureUpdateEvent.ts b/packages/events/src/session/RoomSessionUserFigureUpdateEvent.ts new file mode 100644 index 0000000..3b64a02 --- /dev/null +++ b/packages/events/src/session/RoomSessionUserFigureUpdateEvent.ts @@ -0,0 +1,49 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionUserTagsEvent.ts b/packages/events/src/session/RoomSessionUserTagsEvent.ts new file mode 100644 index 0000000..057b7bc --- /dev/null +++ b/packages/events/src/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/packages/events/src/session/RoomSessionVoteEvent.ts b/packages/events/src/session/RoomSessionVoteEvent.ts new file mode 100644 index 0000000..4437947 --- /dev/null +++ b/packages/events/src/session/RoomSessionVoteEvent.ts @@ -0,0 +1,50 @@ +import { IRoomSession } from '@nitrots/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/packages/events/src/session/RoomSessionWordQuizEvent.ts b/packages/events/src/session/RoomSessionWordQuizEvent.ts new file mode 100644 index 0000000..5fd629c --- /dev/null +++ b/packages/events/src/session/RoomSessionWordQuizEvent.ts @@ -0,0 +1,111 @@ +import { IQuestion, IRoomSession } from '@nitrots/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/packages/events/src/session/SessionDataPreferencesEvent.ts b/packages/events/src/session/SessionDataPreferencesEvent.ts new file mode 100644 index 0000000..7e362d9 --- /dev/null +++ b/packages/events/src/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/packages/events/src/session/UserNameUpdateEvent.ts b/packages/events/src/session/UserNameUpdateEvent.ts new file mode 100644 index 0000000..9b8051e --- /dev/null +++ b/packages/events/src/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/packages/events/src/session/index.ts b/packages/events/src/session/index.ts new file mode 100644 index 0000000..82421b0 --- /dev/null +++ b/packages/events/src/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/packages/events/src/sound/NotifyPlayedSongEvent.ts b/packages/events/src/sound/NotifyPlayedSongEvent.ts new file mode 100644 index 0000000..ef58c5d --- /dev/null +++ b/packages/events/src/sound/NotifyPlayedSongEvent.ts @@ -0,0 +1,27 @@ +import { NitroEvent } from '@nitrots/events'; + +export class NotifyPlayedSongEvent extends NitroEvent +{ + public static readonly NOTIFY_PLAYED_SONG = 'UIEW_NOTIFY_PLAYED_SONG'; + + private _name: string; + private _creator: string; + + constructor(name:string, creator:string) + { + super(NotifyPlayedSongEvent.NOTIFY_PLAYED_SONG); + + this._name = name; + this._creator = creator; + } + + public get name(): string + { + return this._name; + } + + public get creator(): string + { + return this._creator; + } +} diff --git a/packages/events/src/sound/NowPlayingEvent.ts b/packages/events/src/sound/NowPlayingEvent.ts new file mode 100644 index 0000000..0e0dd47 --- /dev/null +++ b/packages/events/src/sound/NowPlayingEvent.ts @@ -0,0 +1,35 @@ +import { NitroEvent } from '@nitrots/events'; + +export class NowPlayingEvent extends NitroEvent +{ + public static readonly NPE_USER_PLAY_SONG = 'NPE_USER_PLAY_SONG'; + public static readonly NPW_USER_STOP_SONG = 'NPW_USER_STOP_SONG'; + public static readonly NPE_SONG_CHANGED = 'NPE_SONG_CHANGED'; + + private _id:number; + private _position:number; + private _priority:number; + + constructor(k:string, priority:number, id:number, position:number) + { + super(k); + this._id = id; + this._position = position; + this._priority = priority; + } + + public get id():number + { + return this._id; + } + + public get position():number + { + return this._position; + } + + public get priority():number + { + return this._priority; + } +} diff --git a/packages/events/src/sound/PlayListStatusEvent.ts b/packages/events/src/sound/PlayListStatusEvent.ts new file mode 100644 index 0000000..8abe8fd --- /dev/null +++ b/packages/events/src/sound/PlayListStatusEvent.ts @@ -0,0 +1,12 @@ +import { NitroEvent } from '@nitrots/events'; + +export class PlayListStatusEvent extends NitroEvent +{ + public static readonly PLUE_PLAY_LIST_UPDATED = 'PLUE_PLAY_LIST_UPDATED'; + public static readonly PLUE_PLAY_LIST_FULL = 'PLUE_PLAY_LIST_FULL'; + + constructor(k:string) + { + super(k); + } +} diff --git a/packages/events/src/sound/SongDiskInventoryReceivedEvent.ts b/packages/events/src/sound/SongDiskInventoryReceivedEvent.ts new file mode 100644 index 0000000..76de576 --- /dev/null +++ b/packages/events/src/sound/SongDiskInventoryReceivedEvent.ts @@ -0,0 +1,11 @@ +import { NitroEvent } from '@nitrots/events'; + +export class SongDiskInventoryReceivedEvent extends NitroEvent +{ + public static readonly SDIR_SONG_DISK_INVENTORY_RECEIVENT_EVENT = 'SDIR_SONG_DISK_INVENTORY_RECEIVENT_EVENT'; + + constructor(k:string) + { + super(k); + } +} diff --git a/packages/events/src/sound/SongInfoReceivedEvent.ts b/packages/events/src/sound/SongInfoReceivedEvent.ts new file mode 100644 index 0000000..557c770 --- /dev/null +++ b/packages/events/src/sound/SongInfoReceivedEvent.ts @@ -0,0 +1,19 @@ +import { NitroEvent } from '@nitrots/events'; + +export class SongInfoReceivedEvent extends NitroEvent +{ + public static readonly SIR_TRAX_SONG_INFO_RECEIVED = 'SIR_TRAX_SONG_INFO_RECEIVED'; + + private _id:number; + + constructor(k:string, _arg_2:number) + { + super(k); + this._id = _arg_2; + } + + public get id():number + { + return this._id; + } +} diff --git a/packages/events/src/sound/SoundManagerEvent.ts b/packages/events/src/sound/SoundManagerEvent.ts new file mode 100644 index 0000000..115170a --- /dev/null +++ b/packages/events/src/sound/SoundManagerEvent.ts @@ -0,0 +1,19 @@ +import { NitroEvent } from '@nitrots/events'; + +export class SoundManagerEvent extends NitroEvent +{ + public static TRAX_SONG_COMPLETE: string = 'SME_TRAX_SONG_COMPLETE'; + + private _id: number; + + constructor(type: string, id: number) + { + super(type); + this._id = id; + } + + public get id(): number + { + return this._id; + } +} diff --git a/packages/events/src/sound/index.ts b/packages/events/src/sound/index.ts new file mode 100644 index 0000000..6ed30e6 --- /dev/null +++ b/packages/events/src/sound/index.ts @@ -0,0 +1,6 @@ +export * from './NotifyPlayedSongEvent'; +export * from './NowPlayingEvent'; +export * from './PlayListStatusEvent'; +export * from './SongDiskInventoryReceivedEvent'; +export * from './SongInfoReceivedEvent'; +export * from './SoundManagerEvent'; diff --git a/packages/events/tsconfig.json b/packages/events/tsconfig.json new file mode 100644 index 0000000..5e8757d --- /dev/null +++ b/packages/events/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./src", + "outDir": "./dist", + "sourceMap": false, + "declaration": true, + "experimentalDecorators": true, + "moduleResolution": "Node", + "esModuleInterop": true, + "importHelpers": true, + "isolatedModules": true, + "resolveJsonModule": true, + "downlevelIteration": true, + "allowSyntheticDefaultImports": true, + "allowJs": true, + "skipLibCheck": true, + "noEmit": true, + "strict": false, + "strictNullChecks": false, + "target": "ES6", + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "module": "ES6" + }, + "include": [ + "src" ] +} diff --git a/packages/localization/.eslintrc.json b/packages/localization/.eslintrc.json new file mode 100644 index 0000000..ad92133 --- /dev/null +++ b/packages/localization/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": [ "@nitrots/eslint-config" ] +} diff --git a/packages/localization/.gitignore b/packages/localization/.gitignore new file mode 100644 index 0000000..1413af9 --- /dev/null +++ b/packages/localization/.gitignore @@ -0,0 +1,51 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings +.git + +# System Files +.DS_Store +Thumbs.db + +*.zip +*.as +*.bin diff --git a/packages/localization/index.ts b/packages/localization/index.ts new file mode 100644 index 0000000..8420b10 --- /dev/null +++ b/packages/localization/index.ts @@ -0,0 +1 @@ +export * from './src'; diff --git a/packages/localization/package.json b/packages/localization/package.json new file mode 100644 index 0000000..2d0175a --- /dev/null +++ b/packages/localization/package.json @@ -0,0 +1,23 @@ +{ + "name": "@nitrots/localization", + "description": "Nitro localization module", + "version": "1.0.0", + "type": "module", + "license": "GPL-3.0", + "scripts": { + "compile": "tsc --project ./tsconfig.json --noEmit false", + "eslint": "eslint ./src --fix" + }, + "main": "./index", + "dependencies": { + "@nitrots/api": "1.0.0", + "@nitrots/communication": "1.0.0", + "@nitrots/configuration": "1.0.0", + "@nitrots/eslint-config": "1.0.0", + "@nitrots/events": "1.0.0", + "pixi.js": "^8.0.4" + }, + "devDependencies": { + "typescript": "~5.4.2" + } +} diff --git a/packages/localization/src/BadgeBaseAndLevel.ts b/packages/localization/src/BadgeBaseAndLevel.ts new file mode 100644 index 0000000..f5f7c90 --- /dev/null +++ b/packages/localization/src/BadgeBaseAndLevel.ts @@ -0,0 +1,53 @@ +export class BadgeBaseAndLevel +{ + private _badgeId: string = ''; + private _level: number = 1; + private _base: string = ''; + + constructor(badgeId: string) + { + this._badgeId = badgeId; + + this.parseText(); + } + + private parseText():void + { + let length = (this._badgeId.length - 1); + + while(length > 0 && this.isNumber(this._badgeId.charAt(length))) length--; + + this._base = this._badgeId.substr(0, (length + 1)); + + const level = this._badgeId.substr((length + 1), this._badgeId.length); + + if(level && (level !== '')) this._level = Number.parseInt(level); + } + + private isNumber(text: string): boolean + { + const char = text.charCodeAt(0); + + return (char >= 48 && char <= 57); + } + + public get level(): number + { + return this._level; + } + + public set level(k : number) + { + this._level = Math.max(1, k); + } + + public get getBadgeId(): string + { + return this._base + this._level; + } + + public get base(): string + { + return this._base; + } +} diff --git a/packages/localization/src/GetLocalization.ts b/packages/localization/src/GetLocalization.ts new file mode 100644 index 0000000..4322e28 --- /dev/null +++ b/packages/localization/src/GetLocalization.ts @@ -0,0 +1,5 @@ +import { LocalizationManager } from './LocalizationManager'; + +const localization = new LocalizationManager(); + +export const GetLocalizationManager = () => localization; diff --git a/packages/localization/src/LocalizationManager.ts b/packages/localization/src/LocalizationManager.ts new file mode 100644 index 0000000..e848953 --- /dev/null +++ b/packages/localization/src/LocalizationManager.ts @@ -0,0 +1,304 @@ +import { ILocalizationManager } from '@nitrots/api'; +import { BadgePointLimitsEvent, GetCommunication } from '@nitrots/communication'; +import { GetConfiguration } from '@nitrots/configuration'; +import { BadgeBaseAndLevel } from './BadgeBaseAndLevel'; + +export class LocalizationManager implements ILocalizationManager +{ + private _definitions: Map = new Map(); + private _parameters: Map> = new Map(); + private _badgePointLimits: Map = new Map(); + private _romanNumerals: string[] = [ 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XI', 'XII', 'XIII', 'XIV', 'XV', 'XVI', 'XVII', 'XVIII', 'XIX', 'XX', 'XXI', 'XXII', 'XXIII', 'XXIV', 'XXV', 'XXVI', 'XXVII', 'XXVIII', 'XXIX', 'XXX' ]; + + public async init(): Promise + { + try + { + const urls = GetConfiguration().getValue('external.texts.url').slice(); + + if(!urls || !urls.length) throw new Error('Invalid localization urls'); + + for(let url of urls) + { + if(!url || !url.length) return; + + url = GetConfiguration().interpolate(url); + + const response = await fetch(url); + + if(response.status !== 200) throw new Error('Invalid localization file'); + + this.parseLocalization(await response.json()); + } + + GetCommunication().registerMessageEvent(new BadgePointLimitsEvent(this.onBadgePointLimitsEvent.bind(this))); + } + + catch (err) + { + throw new Error(err); + } + } + + private parseLocalization(data: { [index: string]: any }): boolean + { + if(!data) return false; + + for(const key in data) this._definitions.set(key, data[key]); + + return true; + } + + private onBadgePointLimitsEvent(event: BadgePointLimitsEvent): void + { + const parser = event.getParser(); + + for(const data of parser.data) this.setBadgePointLimit(data.badgeId, data.limit); + } + + public getBadgePointLimit(badge: string): number + { + return (this._badgePointLimits.get(badge) || -1); + } + + public setBadgePointLimit(badge: string, point: number): void + { + this._badgePointLimits.set(badge, point); + } + + public getRomanNumeral(number: number): string + { + return this._romanNumerals[Math.max(0, (number - 1))]; + } + + public getPreviousLevelBadgeId(badgeName: string): string + { + const badge = new BadgeBaseAndLevel(badgeName); + + badge.level--; + + return badge.getBadgeId; + } + + public hasValue(key: string): boolean + { + return this._definitions.has(key); + } + + public getValue(key: string, doParams: boolean = true): string + { + if(!key || !key.length) return null; + + const keys = key.match(/\$\{.[^}]*\}/g); + + if(keys && keys.length) + { + for(const splitKey of keys) key = key.replace(splitKey, this.getValue(splitKey.slice(2, -1), doParams)); + } + + let value = (this._definitions.get(key) || null); + + if(!value) + { + value = (GetConfiguration().definitions.get(key) as any); + + if(value) return value; + } + + if(value && doParams) + { + const parameters = this._parameters.get(key); + + if(parameters) + { + for(const [parameter, replacement] of parameters) + { + value = value.replace('%' + parameter + '%', replacement); + } + } + } + + return (value || key); + } + + public getValueWithParameter(key: string, parameter: string, replacement: string): string + { + const value = this.getValue(key, false); + + const replacedValue = value.replace('%' + parameter + '%', replacement); + + if(value.startsWith('%{')) + { + // This adds support for multi-optioned texts like + // catalog.vip.item.header.months=%{NUM_MONTHS|0 months|1 month|%% months} + // It only checks for this multi-optioned thext if the value of the key starts with %{ + + // If it does, it will create a RegEx with the provided parameter, eg. NUM_DAYS or NUM_MONTS + // Then, based on the provided replacement it searches for the resultgroup based on the replacement. + // If the replacement is not either 0, 1 - it will be assumed it will be plural. (eg. Months) + const regex = new RegExp('%{' + parameter.toUpperCase() + '\\|([^|]*)\\|([^|]*)\\|([^|]*)}'); + const result = value.match(regex); + + if(!result) return replacedValue; + + let indexKey = -1; + const replacementAsNumber = Number.parseInt(replacement); + let replace = false; + + switch(replacementAsNumber) + { + case 0: + indexKey = 1; + break; + case 1: + indexKey = 2; + break; + default: + case 2: + indexKey = 3; + replace = true; + break; + } + + + if(indexKey == -1 || typeof result[indexKey] == 'undefined') + { + return replacedValue; + } + + const valueFromResults = result[indexKey]; + + if(valueFromResults) + { + return valueFromResults.replace('%%', replacement); + } + } + + return replacedValue; + } + + public getValueWithParameters(key: string, parameters: string[], replacements: string[]): string + { + let value = this.getValue(key, false); + + if(parameters) + { + for(let i = 0; i < parameters.length; i++) + { + const parameter = parameters[i]; + const replacement = replacements[i]; + + if(replacement === undefined) continue; + + value = value.replace('%' + parameter + '%', replacement); + + if(value.startsWith('%{')) + { + const regex = new RegExp('%{' + parameter.toUpperCase() + '\\|([^|]*)\\|([^|]*)\\|([^|]*)}'); + const result = value.match(regex); + + if(!result) continue; + + const replacementAsNumber = parseInt(replacement); + + let indexKey = -1; + let replace = false; + + switch(replacementAsNumber) + { + case 0: + indexKey = 1; + break; + case 1: + indexKey = 2; + break; + case 2: + default: + indexKey = 3; + replace = true; + break; + } + + + if((indexKey === -1) || (typeof result[indexKey] === 'undefined')) continue; + + const valueFromResults = result[indexKey]; + + if(valueFromResults) + { + value = valueFromResults.replace('%%', replacement); + } + } + } + } + + return value; + } + + public setValue(key: string, value: string): void + { + this._definitions.set(key, value); + } + + public registerParameter(key: string, parameter: string, value: string): void + { + if(!key || (key.length === 0) || !parameter || (parameter.length === 0)) return; + + let existing = this._parameters.get(key); + + if(!existing) + { + existing = new Map(); + + this._parameters.set(key, existing); + } + + existing.set(parameter, value); + } + + public getBadgeName(key: string): string + { + const badge = new BadgeBaseAndLevel(key); + const keys = ['badge_name_' + key, 'badge_name_' + badge.base]; + + let name = this.fixBadLocalization(this.getExistingKey(keys)); + + name = name.replace('%roman%', this.getRomanNumeral(badge.level)); + + return name; + } + + public getBadgeDesc(key: string): string + { + const badge = new BadgeBaseAndLevel(key); + const keys = ['badge_desc_' + key, 'badge_desc_' + badge.base]; + + let desc = this.fixBadLocalization(this.getExistingKey(keys)); + + const limit = this.getBadgePointLimit(key); + + if(limit > -1) desc = desc.replace('%limit%', limit.toString()); + + desc = desc.replace('%roman%', this.getRomanNumeral(badge.level)); + + return desc; + } + + private getExistingKey(keys: string[]): string + { + for(const entry of keys) + { + const item = this.getValue(entry); + if(item != entry) return item; + } + + return ''; + } + + private fixBadLocalization(k: string): string + { + return k.replace('${', '$') + .replace('{', '$') + .replace('}', '$'); + } +} diff --git a/packages/localization/src/index.ts b/packages/localization/src/index.ts new file mode 100644 index 0000000..6d87b92 --- /dev/null +++ b/packages/localization/src/index.ts @@ -0,0 +1,3 @@ +export * from './BadgeBaseAndLevel'; +export * from './GetLocalization'; +export * from './LocalizationManager'; diff --git a/packages/localization/tsconfig.json b/packages/localization/tsconfig.json new file mode 100644 index 0000000..5e8757d --- /dev/null +++ b/packages/localization/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./src", + "outDir": "./dist", + "sourceMap": false, + "declaration": true, + "experimentalDecorators": true, + "moduleResolution": "Node", + "esModuleInterop": true, + "importHelpers": true, + "isolatedModules": true, + "resolveJsonModule": true, + "downlevelIteration": true, + "allowSyntheticDefaultImports": true, + "allowJs": true, + "skipLibCheck": true, + "noEmit": true, + "strict": false, + "strictNullChecks": false, + "target": "ES6", + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "module": "ES6" + }, + "include": [ + "src" ] +} diff --git a/packages/room/.eslintrc.json b/packages/room/.eslintrc.json new file mode 100644 index 0000000..ad92133 --- /dev/null +++ b/packages/room/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": [ "@nitrots/eslint-config" ] +} diff --git a/packages/room/.gitignore b/packages/room/.gitignore new file mode 100644 index 0000000..1413af9 --- /dev/null +++ b/packages/room/.gitignore @@ -0,0 +1,51 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings +.git + +# System Files +.DS_Store +Thumbs.db + +*.zip +*.as +*.bin diff --git a/packages/room/index.ts b/packages/room/index.ts new file mode 100644 index 0000000..8420b10 --- /dev/null +++ b/packages/room/index.ts @@ -0,0 +1 @@ +export * from './src'; diff --git a/packages/room/package.json b/packages/room/package.json new file mode 100644 index 0000000..367a78d --- /dev/null +++ b/packages/room/package.json @@ -0,0 +1,26 @@ +{ + "name": "@nitrots/room", + "description": "Nitro room module", + "version": "1.0.0", + "type": "module", + "license": "GPL-3.0", + "scripts": { + "compile": "tsc --project ./tsconfig.json --noEmit false", + "eslint": "eslint ./src --fix" + }, + "main": "./index", + "dependencies": { + "@nitrots/api": "1.0.0", + "@nitrots/assets": "1.0.0", + "@nitrots/avatar": "1.0.0", + "@nitrots/communication": "1.0.0", + "@nitrots/configuration": "1.0.0", + "@nitrots/eslint-config": "1.0.0", + "@nitrots/events": "1.0.0", + "@nitrots/session": "1.0.0", + "pixi.js": "^8.0.4" + }, + "devDependencies": { + "typescript": "~5.4.2" + } +} diff --git a/packages/room/src/GetRoomContentLoader.ts b/packages/room/src/GetRoomContentLoader.ts new file mode 100644 index 0000000..e4b5a53 --- /dev/null +++ b/packages/room/src/GetRoomContentLoader.ts @@ -0,0 +1,5 @@ +import { RoomContentLoader } from './RoomContentLoader'; + +const roomContentLoader = new RoomContentLoader(); + +export const GetRoomContentLoader = () => roomContentLoader; diff --git a/packages/room/src/GetRoomEngine.ts b/packages/room/src/GetRoomEngine.ts new file mode 100644 index 0000000..559514d --- /dev/null +++ b/packages/room/src/GetRoomEngine.ts @@ -0,0 +1,5 @@ +import { RoomEngine } from './RoomEngine'; + +const roomEngine = new RoomEngine(); + +export const GetRoomEngine = () => roomEngine; diff --git a/packages/room/src/GetRoomManager.ts b/packages/room/src/GetRoomManager.ts new file mode 100644 index 0000000..48e6a6a --- /dev/null +++ b/packages/room/src/GetRoomManager.ts @@ -0,0 +1,5 @@ +import { RoomManager } from './RoomManager'; + +const roomManager = new RoomManager(); + +export const GetRoomManager = () => roomManager; diff --git a/packages/room/src/GetRoomMessageHandler.ts b/packages/room/src/GetRoomMessageHandler.ts new file mode 100644 index 0000000..0fc3531 --- /dev/null +++ b/packages/room/src/GetRoomMessageHandler.ts @@ -0,0 +1,5 @@ +import { RoomMessageHandler } from './RoomMessageHandler'; + +const roomMessageHandler = new RoomMessageHandler(); + +export const GetRoomMessageHandler = () => roomMessageHandler; diff --git a/packages/room/src/GetRoomObjectLogicFactory.ts b/packages/room/src/GetRoomObjectLogicFactory.ts new file mode 100644 index 0000000..ec62540 --- /dev/null +++ b/packages/room/src/GetRoomObjectLogicFactory.ts @@ -0,0 +1,5 @@ +import { RoomObjectLogicFactory } from './RoomObjectLogicFactory'; + +const roomObjectLogicFactory = new RoomObjectLogicFactory(); + +export const GetRoomObjectLogicFactory = () => roomObjectLogicFactory; diff --git a/packages/room/src/GetRoomObjectVisualizationFactory.ts b/packages/room/src/GetRoomObjectVisualizationFactory.ts new file mode 100644 index 0000000..167d4ca --- /dev/null +++ b/packages/room/src/GetRoomObjectVisualizationFactory.ts @@ -0,0 +1,5 @@ +import { RoomObjectVisualizationFactory } from './RoomObjectVisualizationFactory'; + +const roomObjectVisualizationFactory = new RoomObjectVisualizationFactory(); + +export const GetRoomObjectVisualizationFactory = () => roomObjectVisualizationFactory; diff --git a/packages/room/src/ImageResult.ts b/packages/room/src/ImageResult.ts new file mode 100644 index 0000000..26ac1f4 --- /dev/null +++ b/packages/room/src/ImageResult.ts @@ -0,0 +1,19 @@ +import { IImageResult } from '@nitrots/api'; +import { TextureUtils } from '@nitrots/utils'; +import { Texture } from 'pixi.js'; + +export class ImageResult implements IImageResult +{ + public id: number = 0; + public data: Texture = null; + public image: HTMLImageElement = null; + + public async getImage(): Promise + { + if(this.image) return this.image; + + if(!this.data) return null; + + return await TextureUtils.generateImage(this.data); + } +} diff --git a/packages/room/src/PetColorResult.ts b/packages/room/src/PetColorResult.ts new file mode 100644 index 0000000..178863a --- /dev/null +++ b/packages/room/src/PetColorResult.ts @@ -0,0 +1,61 @@ +import { IPetColorResult } from '@nitrots/api'; + +export class PetColorResult implements IPetColorResult +{ + private static COLOR_TAGS: string[] = ['Null', 'Black', 'White', 'Grey', 'Red', 'Orange', 'Pink', 'Green', 'Lime', 'Blue', 'Light-Blue', 'Dark-Blue', 'Yellow', 'Brown', 'Dark-Brown', 'Beige', 'Cyan', 'Purple', 'Gold']; + + private _breed: number; + private _tag: string; + private _id: string; + private _primaryColor: number; + private _secondaryColor: number; + private _isMaster: boolean; + private _layerTags: string[]; + + constructor(primaryColor: number, secondaryColor: number, breed: number, tag: number, id: string, isMaster: boolean, layerTags: string[]) + { + this._layerTags = []; + this._primaryColor = (primaryColor & 0xFFFFFF); + this._secondaryColor = (secondaryColor & 0xFFFFFF); + this._breed = breed; + this._tag = (((tag > -1) && (tag < PetColorResult.COLOR_TAGS.length)) ? PetColorResult.COLOR_TAGS[tag] : ''); + this._id = id; + this._isMaster = isMaster; + this._layerTags = layerTags; + } + + public get primaryColor(): number + { + return this._primaryColor; + } + + public get secondaryColor(): number + { + return this._secondaryColor; + } + + public get breed(): number + { + return this._breed; + } + + public get tag(): string + { + return this._tag; + } + + public get id(): string + { + return this._id; + } + + public get isMaster(): boolean + { + return this._isMaster; + } + + public get layerTags(): string[] + { + return this._layerTags; + } +} diff --git a/packages/room/src/RoomContentLoader.ts b/packages/room/src/RoomContentLoader.ts new file mode 100644 index 0000000..687d3c7 --- /dev/null +++ b/packages/room/src/RoomContentLoader.ts @@ -0,0 +1,512 @@ +import { FurnitureType, IEventDispatcher, IFurnitureData, IGraphicAssetCollection, IPetColorResult, IRoomContentListener, IRoomContentLoader, IRoomObject, RoomObjectCategory, RoomObjectUserType, RoomObjectVariable, RoomObjectVisualizationType } from '@nitrots/api'; +import { GetAssetManager } from '@nitrots/assets'; +import { GetConfiguration } from '@nitrots/configuration'; +import { GetEventDispatcher, RoomContentLoadedEvent } from '@nitrots/events'; +import { GetSessionDataManager } from '@nitrots/session'; +import { NitroLogger } from '@nitrots/utils'; +import { Texture } from 'pixi.js'; +import { PetColorResult } from './PetColorResult'; + +export class RoomContentLoader implements IRoomContentLoader +{ + private static PLACE_HOLDER: string = 'place_holder'; + private static PLACE_HOLDER_WALL: string = 'place_holder_wall'; + private static PLACE_HOLDER_PET: string = 'place_holder_pet'; + private static PLACE_HOLDER_DEFAULT: string = RoomContentLoader.PLACE_HOLDER; + private static ROOM: string = 'room'; + private static TILE_CURSOR: string = 'tile_cursor'; + private static SELECTION_ARROW: string = 'selection_arrow'; + + public static MANDATORY_LIBRARIES: string[] = [RoomContentLoader.PLACE_HOLDER, RoomContentLoader.PLACE_HOLDER_WALL, RoomContentLoader.PLACE_HOLDER_PET, RoomContentLoader.ROOM, RoomContentLoader.TILE_CURSOR, RoomContentLoader.SELECTION_ARROW]; + + private _iconListener: IRoomContentListener; + private _images: Map = new Map(); + + private _activeObjects: { [index: string]: number } = {}; + private _activeObjectTypes: Map = new Map(); + private _activeObjectTypeIds: Map = new Map(); + private _objectTypeAdUrls: Map = new Map(); + private _wallItems: { [index: string]: number } = {}; + private _wallItemTypes: Map = new Map(); + private _wallItemTypeIds: Map = new Map(); + private _furniRevisions: Map = new Map(); + private _pets: { [index: string]: number } = {}; + private _petColors: Map> = new Map(); + private _objectAliases: Map = new Map(); + private _objectOriginalNames: Map = new Map(); + + private _pendingContentTypes: string[] = []; + + public async init(): Promise + { + this.processFurnitureData(GetSessionDataManager().getAllFurnitureData()); + + for(const [index, name] of GetConfiguration().getValue('pet.types').entries()) this._pets[name] = index; + + await Promise.all(RoomContentLoader.MANDATORY_LIBRARIES.map(value => this.downloadAsset(value))); + } + + public processFurnitureData(furnitureData: IFurnitureData[]): void + { + if(!furnitureData) return; + + for(const furniture of furnitureData) + { + if(!furniture) continue; + + const id = furniture.id; + + let className = furniture.className; + + if(furniture.hasIndexedColor) className = ((className + '*') + furniture.colorIndex); + + const revision = furniture.revision; + const adUrl = furniture.adUrl; + + if(adUrl && adUrl.length > 0) this._objectTypeAdUrls.set(className, adUrl); + + let name = furniture.className; + + if(furniture.type === FurnitureType.FLOOR) + { + this._activeObjectTypes.set(id, className); + this._activeObjectTypeIds.set(className, id); + + if(!this._activeObjects[name]) this._activeObjects[name] = 1; + } + + else if(furniture.type === FurnitureType.WALL) + { + if(name === 'post.it') + { + className = 'post_it'; + name = 'post_it'; + } + + if(name === 'post.it.vd') + { + className = 'post_it_vd'; + name = 'post_id_vd'; + } + + this._wallItemTypes.set(id, className); + this._wallItemTypeIds.set(className, id); + + if(!this._wallItems[name]) this._wallItems[name] = 1; + } + + const existingRevision = this._furniRevisions.get(name); + + if(revision > existingRevision) + { + this._furniRevisions.delete(name); + this._furniRevisions.set(name, revision); + } + } + } + + public getFurnitureFloorNameForTypeId(typeId: number): string + { + const type = this._activeObjectTypes.get(typeId); + + return this.removeColorIndex(type); + } + + public getFurnitureWallNameForTypeId(typeId: number, extra: string = null): string + { + let type = this._wallItemTypes.get(typeId); + + if((type === 'poster') && (extra !== null)) type = (type + extra); + + return this.removeColorIndex(type); + } + + public getFurnitureFloorColorIndex(typeId: number): number + { + const type = this._activeObjectTypes.get(typeId); + + if(!type) return -1; + + return this.getColorIndexFromName(type); + } + + public getFurnitureWallColorIndex(typeId: number): number + { + const type = this._wallItemTypes.get(typeId); + + if(!type) return -1; + + return this.getColorIndexFromName(type); + } + + private getColorIndexFromName(name: string): number + { + if(!name) return -1; + + const index = name.indexOf('*'); + + if(index === -1) return 0; + + return parseInt(name.substr(index + 1)); + } + + private removeColorIndex(name: string): string + { + if(!name) return null; + + const index = name.indexOf('*'); + + if(index === -1) return name; + + return name.substr(0, index); + } + + public getRoomObjectAdUrl(type: string): string + { + const value = this._objectTypeAdUrls.get(type); + + if(!value) return ''; + + return value; + } + + public getPetColorResult(petIndex: number, paletteIndex: number): IPetColorResult + { + const colorResults = this._petColors.get(petIndex); + + if(!colorResults) return null; + + return colorResults.get(paletteIndex); + } + + public getPetColorResultsForTag(petIndex: number, tagName: string): IPetColorResult[] + { + const colorResults = this._petColors.get(petIndex); + const results: IPetColorResult[] = []; + + if(colorResults) + { + for(const result of colorResults.values()) + { + if(result.tag === tagName) results.push(result); + } + } + + return results; + } + + public getCollection(name: string): IGraphicAssetCollection + { + return GetAssetManager().getCollection(name); + } + + public getImage(name: string): HTMLImageElement + { + if(!name) return null; + + const existing = this._images.get(name); + + if(!existing) return null; + + const image = new Image(); + + image.src = existing.src; + + return image; + } + + public addAssetToCollection(collectionName: string, assetName: string, texture: Texture, override: boolean = true): boolean + { + return GetAssetManager().addAssetToCollection(collectionName, assetName, texture, override); + } + + public getPlaceholderName(type: string): string + { + const category = this.getCategoryForType(type); + + switch(category) + { + case RoomObjectCategory.FLOOR: + return RoomContentLoader.PLACE_HOLDER; + case RoomObjectCategory.WALL: + return RoomContentLoader.PLACE_HOLDER_WALL; + default: + if(this._pets[type] !== undefined) return RoomContentLoader.PLACE_HOLDER_PET; + + return RoomContentLoader.PLACE_HOLDER_DEFAULT; + } + } + + public getCategoryForType(type: string): number + { + if(!type) return RoomObjectCategory.MINIMUM; + + if(this._activeObjects[type] !== undefined) return RoomObjectCategory.FLOOR; + + if(this._wallItems[type] !== undefined) return RoomObjectCategory.WALL; + + if(this._pets[type] !== undefined) return RoomObjectCategory.UNIT; + + if(type.indexOf('poster') === 0) return RoomObjectCategory.WALL; + + if(type === 'room') return RoomObjectCategory.ROOM; + + if(type === RoomObjectUserType.USER) return RoomObjectCategory.UNIT; + + if(type === RoomObjectUserType.PET) return RoomObjectCategory.UNIT; + + if(type === RoomObjectUserType.BOT) return RoomObjectCategory.UNIT; + + if(type === RoomObjectUserType.RENTABLE_BOT) return RoomObjectCategory.UNIT; + + if((type === RoomContentLoader.TILE_CURSOR) || (type === RoomContentLoader.SELECTION_ARROW)) return RoomObjectCategory.CURSOR; + + return RoomObjectCategory.MINIMUM; + } + + public getPetNameForType(type: number): string + { + return GetConfiguration().getValue('pet.types')[type] || null; + } + + public isLoaderType(type: string): boolean + { + type = RoomObjectUserType.getRealType(type); + + if(type === RoomObjectVisualizationType.USER) return false; + + return true; + } + + public downloadImage(id: number, type: string, param: string, events: IEventDispatcher = null): boolean + { + let typeName: string = null; + let assetUrls: string[] = []; + + if(type && (type.indexOf(',') >= 0)) + { + typeName = type; + type = typeName.split(',')[0]; + } + + if(typeName) + { + assetUrls = this.getAssetUrls(typeName, param, true); + } + else + { + assetUrls = this.getAssetUrls(type, param, true); + } + + if(assetUrls && assetUrls.length) + { + const url = assetUrls[0]; + + const image = new Image(); + + image.src = url; + + image.onload = () => + { + image.onerror = null; + + this._images.set(([type, param].join('_')), image); + + this._iconListener.onRoomContentLoaded(id, [type, param].join('_'), true); + }; + + image.onerror = () => + { + image.onload = null; + + NitroLogger.error('Failed to download asset', url); + + this._iconListener.onRoomContentLoaded(id, [type, param].join('_'), false); + }; + + return true; + } + + return false; + } + + public async downloadAsset(type: string): Promise + { + const assetUrl: string = this.getAssetUrls(type)?.[0]; + + if(!assetUrl || !assetUrl.length) return; + + if((this._pendingContentTypes.indexOf(type) >= 0)) return; + + this._pendingContentTypes.push(type); + + if(!await GetAssetManager().downloadAsset(assetUrl)) + { + GetEventDispatcher().dispatchEvent(new RoomContentLoadedEvent(RoomContentLoadedEvent.RCLE_FAILURE, type)); + + return; + } + + const petIndex = this._pets[type]; + + if(petIndex !== undefined) + { + const collection = this.getCollection(type); + const keys = collection.getPaletteNames(); + const palettes: Map = new Map(); + + for(const key of keys) + { + const palette = collection.getPalette(key); + const paletteData = collection.data.palettes[key]; + + const primaryColor = palette.primaryColor; + const secondaryColor = palette.secondaryColor; + const breed = ((paletteData.breed !== undefined) ? paletteData.breed : 0); + const tag = ((paletteData.colorTag !== undefined) ? paletteData.colorTag : -1); + const master = ((paletteData.master !== undefined) ? paletteData.master : false); + const layerTags = ((paletteData.tags !== undefined) ? paletteData.tags : []); + + palettes.set(parseInt(key), new PetColorResult(primaryColor, secondaryColor, breed, tag, key, master, layerTags)); + } + + this._petColors.set(petIndex, palettes); + } + + GetEventDispatcher().dispatchEvent(new RoomContentLoadedEvent(RoomContentLoadedEvent.RCLE_SUCCESS, type)); + } + + public getAssetAliasName(name: string): string + { + const existing = this._objectAliases.get(name); + + if(!existing) return name; + + return existing; + } + + public setAssetAliasName(name: string, originalName: string): void + { + this._objectAliases.set(name, originalName); + this._objectOriginalNames.set(originalName, name); + } + + private getAssetOriginalName(name: string): string + { + const existing = this._objectOriginalNames.get(name); + + if(!existing) return name; + + return existing; + } + + public getAssetUrls(type: string, param: string = null, icon: boolean = false): string[] + { + switch(type) + { + case RoomContentLoader.PLACE_HOLDER: + return [this.getAssetUrlWithGenericBase(RoomContentLoader.PLACE_HOLDER)]; + case RoomContentLoader.PLACE_HOLDER_WALL: + return [this.getAssetUrlWithGenericBase(RoomContentLoader.PLACE_HOLDER_WALL)]; + case RoomContentLoader.PLACE_HOLDER_PET: + return [this.getAssetUrlWithGenericBase(RoomContentLoader.PLACE_HOLDER_PET)]; + case RoomContentLoader.ROOM: + return [this.getAssetUrlWithGenericBase('room')]; + case RoomContentLoader.TILE_CURSOR: + return [this.getAssetUrlWithGenericBase(RoomContentLoader.TILE_CURSOR)]; + case RoomContentLoader.SELECTION_ARROW: + return [this.getAssetUrlWithGenericBase(RoomContentLoader.SELECTION_ARROW)]; + default: { + const category = this.getCategoryForType(type); + + if((category === RoomObjectCategory.FLOOR) || (category === RoomObjectCategory.WALL)) + { + const name = this.getAssetAliasName(type); + + let assetUrl = (icon ? this.getAssetUrlWithFurniIconBase(name) : this.getAssetUrlWithFurniBase(type)); + + if(icon) + { + const active = (param && (param !== '') && (this._activeObjectTypeIds.has((name + '*' + param)))); + + assetUrl = (assetUrl.replace(/%param%/gi, (active ? ('_' + param) : ''))); + } + + return [assetUrl]; + } + + if(category === RoomObjectCategory.UNIT) + { + return [this.getAssetUrlWithPetBase(type)]; + } + + return null; + } + } + } + + public getAssetIconUrl(type: string, colorIndex: string): string + { + let assetName: string = null; + let assetUrls: string[] = []; + + if(type && (type.indexOf(',') >= 0)) + { + assetName = type; + + type = assetName.split(',')[0]; + } + + if(assetName) + { + assetUrls = this.getAssetUrls(assetName, colorIndex, true); + } + else + { + assetUrls = this.getAssetUrls(type, colorIndex, true); + } + + if(assetUrls && assetUrls.length) return assetUrls[0]; + + return null; + } + + private getAssetUrlWithGenericBase(assetName: string): string + { + return (GetConfiguration().getValue('generic.asset.url').replace(/%libname%/gi, assetName)); + } + + public getAssetUrlWithFurniBase(assetName: string): string + { + return (GetConfiguration().getValue('furni.asset.url').replace(/%libname%/gi, assetName)); + } + + public getAssetUrlWithFurniIconBase(assetName: string): string + { + return (GetConfiguration().getValue('furni.asset.icon.url').replace(/%libname%/gi, assetName)); + } + + public getAssetUrlWithPetBase(assetName: string): string + { + return (GetConfiguration().getValue('pet.asset.url').replace(/%libname%/gi, assetName)); + } + + public setRoomObjectRoomId(object: IRoomObject, roomId: string): void + { + const model = object && object.model; + + if(!model) return; + + model.setValue(RoomObjectVariable.OBJECT_ROOM_ID, roomId); + } + + public setIconListener(listener: IRoomContentListener): void + { + this._iconListener = listener; + } + + public get pets(): { [index: string]: number } + { + return this._pets; + } +} diff --git a/packages/room/src/RoomEngine.ts b/packages/room/src/RoomEngine.ts new file mode 100644 index 0000000..cbc58ef --- /dev/null +++ b/packages/room/src/RoomEngine.ts @@ -0,0 +1,3266 @@ +import { IFurnitureStackingHeightMap, IGetImageListener, IImageResult, ILegacyWallGeometry, IObjectData, IPetColorResult, IPetCustomPart, IRoomContentListener, IRoomContentLoader, IRoomCreator, IRoomEngine, IRoomEngineServices, IRoomGeometry, IRoomInstance, IRoomManager, IRoomManagerListener, IRoomObject, IRoomObjectController, IRoomRenderer, IRoomRenderingCanvas, IRoomSessionManager, ISelectedRoomObjectData, ISessionDataManager, ITileObjectMap, IUpdateReceiver, IVector3D, LegacyDataType, MouseEventType, ObjectDataFactory, PetFigureData, RoomControllerLevel, RoomObjectCategory, RoomObjectUserType, RoomObjectVariable, ToolbarIconEnum } from '@nitrots/api'; +import { GetCommunication, RenderRoomMessageComposer, RenderRoomThumbnailMessageComposer } from '@nitrots/communication'; +import { GetConfiguration } from '@nitrots/configuration'; +import { BadgeImageReadyEvent, GetEventDispatcher, NitroToolbarAnimateIconEvent, RoomBackgroundColorEvent, RoomDragEvent, RoomEngineEvent, RoomEngineObjectEvent, RoomObjectEvent, RoomObjectFurnitureActionEvent, RoomObjectMouseEvent, RoomSessionEvent, RoomToObjectOwnAvatarMoveEvent } from '@nitrots/events'; +import { GetRoomSessionManager, GetSessionDataManager } from '@nitrots/session'; +import { FurniId, GetTickerTime, NitroLogger, NumberBank, TextureUtils, Vector3d } from '@nitrots/utils'; +import { Container, Matrix, Point, Rectangle, RenderTexture, Sprite, Texture, Ticker } from 'pixi.js'; +import { GetRoomContentLoader } from './GetRoomContentLoader'; +import { GetRoomManager } from './GetRoomManager'; +import { GetRoomMessageHandler } from './GetRoomMessageHandler'; +import { GetRoomObjectLogicFactory } from './GetRoomObjectLogicFactory'; +import { ImageResult } from './ImageResult'; +import { RoomInstance } from './RoomInstance'; +import { RoomObjectEventHandler } from './RoomObjectEventHandler'; +import { RoomVariableEnum } from './RoomVariableEnum'; +import { ObjectAvatarCarryObjectUpdateMessage, ObjectAvatarChatUpdateMessage, ObjectAvatarDanceUpdateMessage, ObjectAvatarEffectUpdateMessage, ObjectAvatarExperienceUpdateMessage, ObjectAvatarExpressionUpdateMessage, ObjectAvatarFigureUpdateMessage, ObjectAvatarFlatControlUpdateMessage, ObjectAvatarGestureUpdateMessage, ObjectAvatarGuideStatusUpdateMessage, ObjectAvatarMutedUpdateMessage, ObjectAvatarOwnMessage, ObjectAvatarPetGestureUpdateMessage, ObjectAvatarPlayerValueUpdateMessage, ObjectAvatarPlayingGameUpdateMessage, ObjectAvatarPostureUpdateMessage, ObjectAvatarSignUpdateMessage, ObjectAvatarSleepUpdateMessage, ObjectAvatarTypingUpdateMessage, ObjectAvatarUpdateMessage, ObjectAvatarUseObjectUpdateMessage, ObjectDataUpdateMessage, ObjectGroupBadgeUpdateMessage, ObjectHeightUpdateMessage, ObjectItemDataUpdateMessage, ObjectModelDataUpdateMessage, ObjectMoveUpdateMessage, ObjectRoomColorUpdateMessage, ObjectRoomFloorHoleUpdateMessage, ObjectRoomMaskUpdateMessage, ObjectRoomPlanePropertyUpdateMessage, ObjectRoomPlaneVisibilityUpdateMessage, ObjectRoomUpdateMessage, ObjectStateUpdateMessage, RoomObjectUpdateMessage } from './messages'; +import { RoomLogic, RoomMapData } from './object'; +import { RoomRenderer } from './renderer'; +import { RoomCamera, RoomData, RoomEnterEffect, RoomFurnitureData, RoomGeometry, RoomInstanceData, RoomObjectBadgeImageAssetListener } from './utils'; + +export class RoomEngine implements IRoomEngine, IRoomCreator, IRoomEngineServices, IRoomManagerListener, IRoomContentListener, IUpdateReceiver +{ + public static ROOM_OBJECT_ID: number = -1; + public static ROOM_OBJECT_TYPE: string = 'room'; + + public static CURSOR_OBJECT_ID: number = -2; + public static CURSOR_OBJECT_TYPE: string = 'tile_cursor'; + + public static ARROW_OBJECT_ID: number = -3; + public static ARROW_OBJECT_TYPE: string = 'selection_arrow'; + + public static OVERLAY: string = 'overlay'; + public static OBJECT_ICON_SPRITE: string = 'object_icon_sprite'; + + private static DRAG_THRESHOLD: number = 15; + private static TEMPORARY_ROOM: string = 'temporary_room'; + + private _roomContentLoader: IRoomContentLoader = GetRoomContentLoader(); + private _roomSessionManager: IRoomSessionManager = GetRoomSessionManager(); + private _sessionDataManager: ISessionDataManager = GetSessionDataManager(); + private _roomManager: IRoomManager = GetRoomManager(); + + private _roomObjectEventHandler: RoomObjectEventHandler = new RoomObjectEventHandler(this); + private _imageObjectIdBank: NumberBank = new NumberBank(1000); + private _imageCallbacks: Map = new Map(); + private _thumbnailObjectIdBank: NumberBank = new NumberBank(1000); + private _thumbnailCallbacks: Map = new Map(); + private _activeRoomId: number = -1; + private _activeRoomActiveCanvas: number = -1; + private _activeRoomActiveCanvasMouseX: number = 0; + private _activeRoomActiveCanvasMouseY: number = 0; + private _activeRoomIsDragged: boolean = false; + private _activeRoomWasDragged: boolean = false; + private _activeRoomDragStartX: number = 0; + private _activeRoomDragStartY: number = 0; + private _activeRoomDragX: number = 0; + private _activeRoomDragY: number = 0; + private _roomDraggingAlwaysCenters: boolean = false; + private _roomAllowsDragging: boolean = true; + private _roomDatas: Map = new Map(); + private _roomInstanceDatas: Map = new Map(); + private _skipFurnitureCreationForNextFrame: boolean = false; + private _mouseCursorUpdate: boolean = false; + private _badgeListenerObjects: Map = new Map(); + + constructor() + { + this.onBadgeImageReadyEvent = this.onBadgeImageReadyEvent.bind(this); + } + + public async init(): Promise + { + GetRoomObjectLogicFactory().registerEventFunction(this.processRoomObjectEvent.bind(this)); + + GetEventDispatcher().addEventListener(RoomSessionEvent.STARTED, event => this.onRoomSessionEvent(event)); + GetEventDispatcher().addEventListener(RoomSessionEvent.ENDED, event => this.onRoomSessionEvent(event)); + + await GetRoomMessageHandler().init(); + await this._roomContentLoader.init(); + await this._roomManager.init(this); + + for(const roomData of this._roomDatas.values()) + { + if(!roomData) continue; + + this.createRoomInstance(roomData.roomId, roomData.data); + } + + this._roomContentLoader.setIconListener(this); + + this._roomManager.addUpdateCategory(RoomObjectCategory.FLOOR); + this._roomManager.addUpdateCategory(RoomObjectCategory.WALL); + this._roomManager.addUpdateCategory(RoomObjectCategory.UNIT); + this._roomManager.addUpdateCategory(RoomObjectCategory.CURSOR); + this._roomManager.addUpdateCategory(RoomObjectCategory.ROOM); + } + + private onRoomSessionEvent(event: RoomSessionEvent): void + { + if(!(event instanceof RoomSessionEvent)) return; + + switch(event.type) + { + case RoomSessionEvent.STARTED: + GetRoomMessageHandler().setRoomId(event.session.roomId); + return; + case RoomSessionEvent.ENDED: + GetRoomMessageHandler().clearRoomId(); + this.removeRoomInstance(event.session.roomId); + return; + } + } + + public setActiveRoomId(roomId: number): void + { + this._activeRoomId = roomId; + } + + public destroyRoom(roomId: number): void + { + this.removeRoomInstance(roomId); + } + + public getRoomInstance(roomId: number): IRoomInstance + { + return (this._roomManager && this._roomManager.getRoomInstance(this.getRoomId(roomId))) || null; + } + + public removeRoomInstance(roomId: number): void + { + const instance = this.getRoomInstance(roomId); + + if(instance) + { + this._roomManager && this._roomManager.removeRoomInstance(this.getRoomId(roomId)); + } + + const existing = this._roomInstanceDatas.get(roomId); + + if(existing) + { + this._roomInstanceDatas.delete(existing.roomId); + + existing.dispose(); + } + + GetEventDispatcher().dispatchEvent(new RoomEngineEvent(RoomEngineEvent.DISPOSED, roomId)); + } + + public createRoomInstance(roomId: number, roomMap: RoomMapData): void + { + let floorType = '111'; + let wallType = '201'; + let landscapeType = '1'; + + if(!roomMap) + { + NitroLogger.warn('Room property messages'); + + return; + } + + const data = this._roomDatas.get(roomId); + + if(data) + { + this._roomDatas.delete(roomId); + + if(data.floorType) floorType = data.floorType; + + if(data.wallType) wallType = data.wallType; + + if(data.landscapeType) landscapeType = data.landscapeType; + } + + const instance = this.setupRoomInstance(roomId, roomMap, floorType, wallType, landscapeType, this.getRoomInstanceModelName(roomId)); + + if(!instance) return; + + this._roomAllowsDragging = true; + + GetEventDispatcher().dispatchEvent(new RoomEngineEvent(RoomEngineEvent.INITIALIZED, roomId)); + } + + private setupRoomInstance(roomId: number, roomMap: RoomMapData, floorType: string, wallType: string, landscapeType: string, worldType: string): IRoomInstance + { + if(!this._roomManager) return; + + const instance = this._roomManager.createRoomInstance(this.getRoomId(roomId)); + + if(!instance) return null; + + const category = RoomObjectCategory.ROOM; + + const roomObject = instance.createRoomObjectAndInitalize(RoomEngine.ROOM_OBJECT_ID, RoomEngine.ROOM_OBJECT_TYPE, category) as IRoomObjectController; + + instance.model.setValue(RoomVariableEnum.ROOM_IS_PUBLIC, 0); + instance.model.setValue(RoomVariableEnum.ROOM_Z_SCALE, 1); + + if(roomMap) + { + const dimensions = roomMap.dimensions; + + if(dimensions) + { + const minX = roomMap.dimensions.minX; + const maxX = roomMap.dimensions.maxX; + const minY = roomMap.dimensions.minY; + const maxY = roomMap.dimensions.maxY; + + instance.model.setValue(RoomVariableEnum.ROOM_MIN_X, minX); + instance.model.setValue(RoomVariableEnum.ROOM_MAX_X, maxX); + instance.model.setValue(RoomVariableEnum.ROOM_MIN_Y, minY); + instance.model.setValue(RoomVariableEnum.ROOM_MAX_Y, maxY); + + const seed = Math.trunc((minX * 423) + (maxX * 671) + (minY * 913) + (maxY * 7509)); + + if(roomObject && roomObject.model) roomObject.model.setValue(RoomObjectVariable.ROOM_RANDOM_SEED, seed); + } + } + + const logic = (roomObject && roomObject.logic as RoomLogic) || null; + + if(logic) + { + logic.initialize(roomMap); + + if(floorType) + { + logic.processUpdateMessage(new ObjectRoomUpdateMessage(ObjectRoomUpdateMessage.ROOM_FLOOR_UPDATE, floorType)); + instance.model.setValue(RoomObjectVariable.ROOM_FLOOR_TYPE, floorType); + } + + if(wallType) + { + logic.processUpdateMessage(new ObjectRoomUpdateMessage(ObjectRoomUpdateMessage.ROOM_WALL_UPDATE, wallType)); + instance.model.setValue(RoomObjectVariable.ROOM_WALL_TYPE, wallType); + } + + if(landscapeType) + { + logic.processUpdateMessage(new ObjectRoomUpdateMessage(ObjectRoomUpdateMessage.ROOM_LANDSCAPE_UPDATE, landscapeType)); + instance.model.setValue(RoomObjectVariable.ROOM_LANDSCAPE_TYPE, landscapeType); + } + } + + if(roomMap && roomMap.doors.length) + { + let doorIndex = 0; + + while(doorIndex < roomMap.doors.length) + { + const door = roomMap.doors[doorIndex]; + + if(door) + { + const doorX = door.x; + const doorY = door.y; + const doorZ = door.z; + const doorDir = door.dir; + const maskType = ObjectRoomMaskUpdateMessage.DOOR; + const maskId = 'door_' + doorIndex; + const maskLocation = new Vector3d(doorX, doorY, doorZ); + + logic.processUpdateMessage(new ObjectRoomMaskUpdateMessage(ObjectRoomMaskUpdateMessage.ADD_MASK, maskId, maskType, maskLocation, ObjectRoomMaskUpdateMessage.HOLE)); + + if((doorDir === 90) || (doorDir === 180)) + { + if(doorDir === 90) + { + instance.model.setValue(RoomObjectVariable.ROOM_DOOR_X, (doorX - 0.5)); + instance.model.setValue(RoomObjectVariable.ROOM_DOOR_Y, doorY); + } + + if(doorDir === 180) + { + instance.model.setValue(RoomObjectVariable.ROOM_DOOR_X, doorX); + instance.model.setValue(RoomObjectVariable.ROOM_DOOR_Y, (doorY - 0.5)); + } + + instance.model.setValue(RoomObjectVariable.ROOM_DOOR_Z, doorZ); + instance.model.setValue(RoomObjectVariable.ROOM_DOOR_DIR, doorDir); + } + } + + doorIndex++; + } + } + + instance.createRoomObjectAndInitalize(RoomEngine.CURSOR_OBJECT_ID, RoomEngine.CURSOR_OBJECT_TYPE, RoomObjectCategory.CURSOR); + + if(GetConfiguration().getValue('enable.avatar.arrow', false)) instance.createRoomObjectAndInitalize(RoomEngine.ARROW_OBJECT_ID, RoomEngine.ARROW_OBJECT_TYPE, RoomObjectCategory.CURSOR); + + return instance; + } + + public getRoomInstanceDisplay(roomId: number, id: number, width: number, height: number, scale: number): Container + { + const instance = this.getRoomInstance(roomId); + + if(!instance) return null; + + let renderer = instance.renderer as IRoomRenderer; + + if(!renderer) + { + renderer = new RoomRenderer(); + + if(!renderer) return null; + } + + renderer.roomObjectVariableAccurateZ = RoomObjectVariable.OBJECT_ACCURATE_Z_VALUE; + + instance.setRenderer(renderer); + + const canvas = renderer.createCanvas(id, width, height, scale); + + if(!canvas) return null; + + canvas.setMouseListener(this._roomObjectEventHandler); + + if(canvas.geometry) + { + canvas.geometry.z_scale = instance.model.getValue(RoomVariableEnum.ROOM_Z_SCALE); + + const doorX = instance.model.getValue(RoomObjectVariable.ROOM_DOOR_X); + const doorY = instance.model.getValue(RoomObjectVariable.ROOM_DOOR_Y); + const doorZ = instance.model.getValue(RoomObjectVariable.ROOM_DOOR_Z); + const doorDirection = instance.model.getValue(RoomObjectVariable.ROOM_DOOR_DIR); + const vector = new Vector3d(doorX, doorY, doorZ); + + let direction: IVector3D = null; + + if(doorDirection === 90) direction = new Vector3d(-2000, 0, 0); + + if(doorDirection === 180) direction = new Vector3d(0, -2000, 0); + + canvas.geometry.setDisplacement(vector, direction); + + const displayObject = canvas.master; + + if(displayObject) + { + const overlay = new Container(); + + overlay.label = RoomEngine.OVERLAY; + + displayObject.addChild(overlay); + } + } + + return canvas.master; + } + + public setRoomInstanceRenderingCanvasMask(roomId: number, canvasId: number, flag: boolean): void + { + const roomCanvas = this.getRoomInstanceRenderingCanvas(roomId, canvasId); + + if(roomCanvas) roomCanvas.setMask(flag); + } + + public setRoomInstanceRenderingCanvasScale(roomId: number, canvasId: number, scale: number, point: Point = null, offsetPoint: Point = null, override: boolean = false, asDelta: boolean = false): void + { + const roomCanvas = this.getRoomInstanceRenderingCanvas(roomId, canvasId); + + if(roomCanvas) + { + roomCanvas.setScale(scale, point, offsetPoint, override, asDelta); + + GetEventDispatcher().dispatchEvent(new RoomEngineEvent(RoomEngineEvent.ROOM_ZOOMED, roomId)); + } + } + + public getRoomInstanceRenderingCanvas(roomId: number, canvasId: number = -1): IRoomRenderingCanvas + { + const instance = this.getRoomInstance(roomId); + + if(!instance) return null; + + const renderer = instance.renderer as IRoomRenderer; + + if(!renderer) return null; + + if(canvasId === -1) canvasId = this._activeRoomActiveCanvas; + + const canvas = renderer.getCanvas(canvasId); + + if(!canvas) return null; + + return canvas; + } + + public getActiveRoomInstanceRenderingCanvas(): IRoomRenderingCanvas + { + return this.getRoomInstanceRenderingCanvas(this._activeRoomId, this._activeRoomActiveCanvas); + } + + public getRoomInstanceRenderingCanvasOffset(roomId: number, canvasId: number = -1): Point + { + if(canvasId === -1) canvasId = this._activeRoomActiveCanvas; + + const renderingCanvas = this.getRoomInstanceRenderingCanvas(roomId, canvasId); + + if(!renderingCanvas) return null; + + return new Point(renderingCanvas.screenOffsetX, renderingCanvas.screenOffsetY); + } + + public setRoomInstanceRenderingCanvasOffset(roomId: number, canvasId: number, point: Point): boolean + { + const renderingCanvas = this.getRoomInstanceRenderingCanvas(roomId, canvasId); + + if(!renderingCanvas || !point) return false; + + const x = ~~(point.x); + const y = ~~(point.y); + + if((renderingCanvas.screenOffsetX === x) && (renderingCanvas.screenOffsetY === y)) return; + + GetEventDispatcher().dispatchEvent(new RoomDragEvent(roomId, -(renderingCanvas.screenOffsetX - x), -(renderingCanvas.screenOffsetY - y))); + + renderingCanvas.screenOffsetX = x; + renderingCanvas.screenOffsetY = y; + + return true; + } + + public getRoomInstanceRenderingCanvasScale(roomId: number = -1000, canvasId: number = -1): number + { + if(roomId === -1000) roomId = this._activeRoomId; + + if(canvasId === -1) canvasId = this._activeRoomActiveCanvas; + + const canvas = this.getRoomInstanceRenderingCanvas(roomId, canvasId); + + if(!canvas) return 1; + + return canvas.scale; + } + + public initializeRoomInstanceRenderingCanvas(roomId: number, canvasId: number, width: number, height: number): void + { + const canvas = this.getRoomInstanceRenderingCanvas(roomId, canvasId); + + if(!canvas) return; + + canvas.initialize(width, height); + } + + public getRoomInstanceGeometry(roomId: number, canvasId: number = -1): IRoomGeometry + { + const instance = this.getRoomInstance(roomId); + + if(!instance) return null; + + const renderer = instance.renderer as IRoomRenderer; + + if(!renderer) return null; + + if(canvasId === -1) canvasId = this._activeRoomActiveCanvas; + + const canvas = renderer.getCanvas(canvasId); + + if(!canvas) return null; + + return canvas.geometry; + } + + public getRoomInstanceVariable(roomId: number, key: string): T + { + const instance = this.getRoomInstance(roomId); + + if(!instance) return null; + + return ((instance.model && instance.model.getValue(key)) || null); + } + + public updateRoomInstancePlaneVisibility(roomId: number, wallVisible: boolean, floorVisible: boolean = true): boolean + { + const object = this.getRoomOwnObject(roomId); + + if(!object) return false; + + object.processUpdateMessage(new ObjectRoomPlaneVisibilityUpdateMessage(ObjectRoomPlaneVisibilityUpdateMessage.WALL_VISIBILITY, wallVisible)); + object.processUpdateMessage(new ObjectRoomPlaneVisibilityUpdateMessage(ObjectRoomPlaneVisibilityUpdateMessage.FLOOR_VISIBILITY, floorVisible)); + + return true; + } + + public updateRoomInstancePlaneThickness(roomId: number, wallThickness: number, floorThickness: number): boolean + { + const object = this.getRoomOwnObject(roomId); + + if(!object) return false; + + object.processUpdateMessage(new ObjectRoomPlanePropertyUpdateMessage(ObjectRoomPlanePropertyUpdateMessage.WALL_THICKNESS, wallThickness)); + object.processUpdateMessage(new ObjectRoomPlanePropertyUpdateMessage(ObjectRoomPlanePropertyUpdateMessage.FLOOR_THICKNESS, floorThickness)); + + return true; + } + + public updateRoomInstancePlaneType(roomId: number, floorType: string = null, wallType: string = null, landscapeType: string = null, _arg_5: boolean = false): boolean + { + const roomObject = this.getRoomOwnObject(roomId); + const roomInstance = this.getRoomInstance(roomId); + + if(!roomObject) + { + let roomData = this._roomDatas.get(roomId); + + if(!roomData) + { + roomData = new RoomData(roomId, null); + + this._roomDatas.set(roomId, roomData); + } + + if(floorType) roomData.floorType = floorType; + + if(wallType) roomData.wallType = wallType; + + if(landscapeType) roomData.landscapeType = landscapeType; + + return true; + } + + if(floorType) + { + if(roomInstance && !_arg_5) roomInstance.model.setValue(RoomObjectVariable.ROOM_FLOOR_TYPE, floorType); + + roomObject.processUpdateMessage(new ObjectRoomUpdateMessage(ObjectRoomUpdateMessage.ROOM_FLOOR_UPDATE, floorType)); + } + + if(wallType) + { + if(roomInstance && !_arg_5) roomInstance.model.setValue(RoomObjectVariable.ROOM_WALL_TYPE, wallType); + + roomObject.processUpdateMessage(new ObjectRoomUpdateMessage(ObjectRoomUpdateMessage.ROOM_WALL_UPDATE, wallType)); + } + + if(landscapeType) + { + if(roomInstance && !_arg_5) roomInstance.model.setValue(RoomObjectVariable.ROOM_LANDSCAPE_TYPE, landscapeType); + + roomObject.processUpdateMessage(new ObjectRoomUpdateMessage(ObjectRoomUpdateMessage.ROOM_LANDSCAPE_UPDATE, landscapeType)); + } + + return true; + } + + public updateObjectRoomColor(roomId: number, color: number, light: number, backgroundOnly: boolean): boolean + { + const roomObject = this.getRoomOwnObject(roomId); + + if(!roomObject || !roomObject.logic) return false; + + const event = new ObjectRoomColorUpdateMessage(ObjectRoomColorUpdateMessage.BACKGROUND_COLOR, color, light, backgroundOnly); + + roomObject.logic.processUpdateMessage(event); + + GetEventDispatcher().dispatchEvent(new RoomBackgroundColorEvent(roomId, color, light, backgroundOnly)); + + return true; + } + + public addRoomInstanceFloorHole(roomId: number, objectId: number): void + { + if(objectId < 0) return; + + const roomOwnObject = this.getRoomOwnObject(roomId); + const roomObject = this.getRoomObjectFloor(roomId, objectId); + + if(roomOwnObject && roomOwnObject.logic && roomObject && roomObject.model) + { + const location = roomObject.getLocation(); + const sizeX = roomObject.model.getValue(RoomObjectVariable.FURNITURE_SIZE_X); + const sizeY = roomObject.model.getValue(RoomObjectVariable.FURNITURE_SIZE_Y); + + roomOwnObject.processUpdateMessage(new ObjectRoomFloorHoleUpdateMessage(ObjectRoomFloorHoleUpdateMessage.ADD, objectId, location.x, location.y, sizeX, sizeY)); + } + } + + public removeRoomInstanceFloorHole(roomId: number, objectId: number): void + { + if(objectId < 0) return; + + const roomOwnObject = this.getRoomOwnObject(roomId); + + if(roomOwnObject) + { + roomOwnObject.processUpdateMessage(new ObjectRoomFloorHoleUpdateMessage(ObjectRoomFloorHoleUpdateMessage.REMOVE, objectId)); + } + } + + public setRoomEngineGameMode(roomId: number, isPlaying: boolean): void + { + const roomInstance = this.getRoomInstance(roomId); + + if(!roomInstance) return; + + const mode = isPlaying ? 1 : 0; + + roomInstance.model.setValue(RoomVariableEnum.IS_PLAYING_GAME, mode); + + if(mode === 0) + { + GetEventDispatcher().dispatchEvent(new RoomEngineEvent(RoomEngineEvent.NORMAL_MODE, roomId)); + } + else + { + GetEventDispatcher().dispatchEvent(new RoomEngineEvent(RoomEngineEvent.GAME_MODE, roomId)); + } + } + + public isRoomIdPlayingGame(roomId: number): boolean + { + const roomInstance = this.getRoomInstance(roomId); + + if(!roomInstance) return false; + + return (roomInstance.model.getValue(RoomVariableEnum.IS_PLAYING_GAME) > 0); + } + + public isPlayingGame(): boolean + { + return this.isRoomIdPlayingGame(this._activeRoomId); + } + + public update(ticker: Ticker): void + { + if(!this._roomManager) return; + + const time = ticker.lastTime; + const update = false; + + RoomEnterEffect.turnVisualizationOn(); + + this.processPendingFurniture(); + + this._roomManager.update(time, update); + + this.updateRoomCameras(time); + + if(this._mouseCursorUpdate) this.setPointer(); + + RoomEnterEffect.turnVisualizationOff(); + } + + private setPointer(): void + { + this._mouseCursorUpdate = false; + + const instanceData = this.getRoomInstanceData(this._activeRoomId); + + if(instanceData && instanceData.hasButtonMouseCursorOwners()) + { + document.body.style.cursor = 'pointer'; + } + else + { + document.body.style.cursor = 'auto'; + } + } + + private processPendingFurniture(): void + { + if(this._skipFurnitureCreationForNextFrame) + { + this._skipFurnitureCreationForNextFrame = false; + + return; + } + + const startTime = new Date().valueOf(); + const furniturePerTick = 5; + const hasTickLimit = true; + + for(const instanceData of this._roomInstanceDatas.values()) + { + if(!instanceData) continue; + + let pendingData: RoomFurnitureData = null; + let totalFurnitureAdded = 0; + let furnitureAdded = false; + + while((pendingData = instanceData.getNextPendingFurnitureFloor())) + { + furnitureAdded = this.processPendingFurnitureFloor(instanceData.roomId, pendingData.id, pendingData); + + if(hasTickLimit) + { + if(!(++totalFurnitureAdded % furniturePerTick)) + { + const time = new Date().valueOf(); + + if((time - startTime) >= 40) + { + this._skipFurnitureCreationForNextFrame = true; + + break; + } + } + } + } + + while(!this._skipFurnitureCreationForNextFrame && (pendingData = instanceData.getNextPendingFurnitureWall())) + { + furnitureAdded = this.processPendingFurnitureWall(instanceData.roomId, pendingData.id, pendingData); + + if(hasTickLimit) + { + if(!(++totalFurnitureAdded % furniturePerTick)) + { + const time = new Date().valueOf(); + + if((time - startTime) >= 40) + { + this._skipFurnitureCreationForNextFrame = true; + + break; + } + } + } + } + + if(furnitureAdded && this._roomManager) + { + const roomInstance = this._roomManager.getRoomInstance(this.getRoomId(instanceData.roomId)) as RoomInstance; + + if(!roomInstance.hasUninitializedObjects()) this.objectsInitialized(instanceData.roomId.toString()); + } + + if(this._skipFurnitureCreationForNextFrame) return; + } + } + + private processPendingFurnitureFloor(roomId: number, id: number, data: RoomFurnitureData): boolean + { + if(!data) + { + const instanceData = this.getRoomInstanceData(roomId); + + if(instanceData) data = instanceData.getPendingFurnitureFloor(id); + + if(!data) return false; + } + + let type = data.type; + let didLoad = false; + + if(!type) + { + type = this.getFurnitureFloorName(data.typeId); + didLoad = true; + + } + + const object = this.createRoomObjectFloor(roomId, id, type); + + if(!object) return false; + + const model = object.model; + + if(model) + { + model.setValue(RoomObjectVariable.FURNITURE_COLOR, this.getFurnitureFloorColorIndex(data.typeId)); + model.setValue(RoomObjectVariable.FURNITURE_TYPE_ID, data.typeId); + model.setValue(RoomObjectVariable.FURNITURE_AD_URL, this.getRoomObjectAdUrl(data.type)); + model.setValue(RoomObjectVariable.FURNITURE_REAL_ROOM_OBJECT, (data.realRoomObject ? 1 : 0)); + model.setValue(RoomObjectVariable.FURNITURE_EXPIRY_TIME, data.expiryTime); + model.setValue(RoomObjectVariable.FURNITURE_EXPIRTY_TIMESTAMP, GetTickerTime()); + model.setValue(RoomObjectVariable.FURNITURE_USAGE_POLICY, data.usagePolicy); + model.setValue(RoomObjectVariable.FURNITURE_OWNER_ID, data.ownerId); + model.setValue(RoomObjectVariable.FURNITURE_OWNER_NAME, data.ownerName); + } + + if(!this.updateRoomObjectFloor(roomId, id, data.location, data.direction, data.state, data.data, data.extra)) return false; + + if(data.sizeZ >= 0) + { + if(!this.updateRoomObjectFloorHeight(roomId, id, data.sizeZ)) return false; + } + + if(GetEventDispatcher()) GetEventDispatcher().dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.ADDED, roomId, id, RoomObjectCategory.FLOOR)); + + const selectedRoomObjectData = this.getPlacedRoomObjectData(roomId); + + if(selectedRoomObjectData && (selectedRoomObjectData.id === id) && (selectedRoomObjectData.category === RoomObjectCategory.FLOOR)) + { + this.selectRoomObject(roomId, id, RoomObjectCategory.FLOOR); + } + + if(object.isReady && data.synchronized) this.addObjectToTileMap(roomId, object); + + return true; + } + + private processPendingFurnitureWall(roomId: number, id: number, data: RoomFurnitureData): boolean + { + if(!data) + { + const instanceData = this.getRoomInstanceData(roomId); + + if(instanceData) data = instanceData.getPendingFurnitureWall(id); + + if(!data) return false; + } + + let extra = ''; + + if(data.data) extra = data.data.getLegacyString(); + + let type = this.getFurnitureWallName(data.typeId, extra); + + if(!type) type = ''; + + const object = this.createRoomObjectWall(roomId, id, type); + + if(!object) return false; + + const model = object.model; + + if(model) + { + model.setValue(RoomObjectVariable.FURNITURE_COLOR, this.getFurnitureWallColorIndex(data.typeId)); + model.setValue(RoomObjectVariable.FURNITURE_TYPE_ID, data.typeId); + model.setValue(RoomObjectVariable.FURNITURE_AD_URL, this.getRoomObjectAdUrl(data.type)); + model.setValue(RoomObjectVariable.FURNITURE_REAL_ROOM_OBJECT, (data.realRoomObject ? 1 : 0)); + model.setValue(RoomObjectVariable.OBJECT_ACCURATE_Z_VALUE, 1); + model.setValue(RoomObjectVariable.FURNITURE_EXPIRY_TIME, data.expiryTime); + model.setValue(RoomObjectVariable.FURNITURE_EXPIRTY_TIMESTAMP, GetTickerTime()); + model.setValue(RoomObjectVariable.FURNITURE_USAGE_POLICY, data.usagePolicy); + model.setValue(RoomObjectVariable.FURNITURE_OWNER_ID, data.ownerId); + model.setValue(RoomObjectVariable.FURNITURE_OWNER_NAME, data.ownerName); + } + + if(!this.updateRoomObjectWall(roomId, id, data.location, data.direction, data.state, extra)) return false; + + if(GetEventDispatcher()) GetEventDispatcher().dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.ADDED, roomId, id, RoomObjectCategory.WALL)); + + const selectedRoomObjectData = this.getPlacedRoomObjectData(roomId); + + if(selectedRoomObjectData && (Math.abs(selectedRoomObjectData.id) === id) && (selectedRoomObjectData.category === RoomObjectCategory.WALL)) + { + this.selectRoomObject(roomId, id, RoomObjectCategory.WALL); + } + + return true; + } + + public setRoomSessionOwnUser(roomId: number, objectId: number): void + { + const session = this._roomSessionManager.getSession(roomId); + + if(session) + { + session.setOwnRoomIndex(objectId); + } + + const camera = this.getRoomCamera(roomId); + + if(camera) + { + camera.targetId = objectId; + camera.targetCategory = RoomObjectCategory.UNIT; + + camera.activateFollowing(this.cameraFollowDuration); + } + } + + private get cameraFollowDuration(): number + { + return 1000; + //return (getBoolean("room.camera.follow_user")) ? 1000 : 0; + } + + private updateRoomCameras(time: number): void + { + for(const instanceData of this._roomInstanceDatas.values()) + { + if(!instanceData) continue; + + const camera = instanceData.roomCamera; + + if(!camera) continue; + + let location: IVector3D = null; + + const object = this.getRoomObject(instanceData.roomId, camera.targetId, camera.targetCategory); + + if(object) location = object.getLocation(); + + if(!location) continue; + + if((instanceData.roomId !== this._activeRoomId) || !this._activeRoomIsDragged) + { + this.updateRoomCamera(instanceData.roomId, 1, location, time); + } + } + + if(this._activeRoomWasDragged) + { + const renderingCanvas = this.getRoomInstanceRenderingCanvas(this._activeRoomId, 1); + + if(renderingCanvas) this.setRoomInstanceRenderingCanvasOffset(this._activeRoomId, 1, new Point((renderingCanvas.screenOffsetX + this._activeRoomDragX), (renderingCanvas.screenOffsetY + this._activeRoomDragY))); + + this._activeRoomDragX = 0; + this._activeRoomDragY = 0; + } + } + + private updateRoomCamera(roomId: number, canvasId: number, objectLocation: IVector3D, time: number): void + { + const renderingCanvas = this.getRoomInstanceRenderingCanvas(roomId, canvasId); + const instanceData = this.getRoomInstanceData(roomId); + + if(!renderingCanvas || !instanceData || (renderingCanvas.scale !== 1)) return; + + const roomGeometry = (renderingCanvas.geometry as RoomGeometry); + const roomCamera = instanceData.roomCamera; + const roomInstance = this.getRoomInstance(roomId); + + if(!roomGeometry || !roomCamera || !roomInstance) return; + + const canvasRectangle = this.getRoomCanvasRectangle(roomId, canvasId); + + if(!canvasRectangle) return; + + let _local_10 = (Math.floor(objectLocation.z) + 1); + const width = Math.round(canvasRectangle.width); + const height = Math.round(canvasRectangle.height); + const bounds = this.getCanvasBoundingRectangle(canvasId); + + if(bounds && ((bounds.right < 0) || (bounds.bottom < 0) || (bounds.left >= width) || (bounds.top >= height))) + { + roomCamera.reset(); + } + + if((roomCamera.screenWd !== width) || (roomCamera.screenHt !== height) || (roomCamera.scale !== roomGeometry.scale) || (roomCamera.geometryUpdateId !== roomGeometry.updateId) || !Vector3d.isEqual(objectLocation, roomCamera.targetObjectLoc) || roomCamera.isMoving) + { + roomCamera.targetObjectLoc = objectLocation; + + const _local_15 = new Vector3d(); + + _local_15.assign(objectLocation); + + _local_15.x = Math.round(_local_15.x); + _local_15.y = Math.round(_local_15.y); + + const _local_16 = (roomInstance.model.getValue(RoomVariableEnum.ROOM_MIN_X) - 0.5); + const _local_17 = (roomInstance.model.getValue(RoomVariableEnum.ROOM_MIN_Y) - 0.5); + const _local_18 = (roomInstance.model.getValue(RoomVariableEnum.ROOM_MAX_X) + 0.5); + const _local_19 = (roomInstance.model.getValue(RoomVariableEnum.ROOM_MAX_Y) + 0.5); + const _local_20 = Math.round(((_local_16 + _local_18) / 2)); + const _local_21 = Math.round(((_local_17 + _local_19) / 2)); + const _local_22 = 2; + let _local_23 = new Point((_local_15.x - _local_20), (_local_15.y - _local_21)); + const _local_24 = (roomGeometry.scale / Math.sqrt(2)); + const _local_25 = (_local_24 / 2); + const _local_26 = new Matrix(); + _local_26.rotate(((-(roomGeometry.direction.x + 90) / 180) * Math.PI)); + _local_23 = _local_26.apply(_local_23); + _local_23.y = (_local_23.y * (_local_25 / _local_24)); + const _local_27 = (((canvasRectangle.width / 2) / _local_24) - 1); + const _local_28 = (((canvasRectangle.height / 2) / _local_25) - 1); + + let _local_29 = 0; + let _local_30 = 0; + let _local_31 = 0; + let _local_32 = 0; + let _local_33 = roomGeometry.getScreenPoint(new Vector3d(_local_20, _local_21, _local_22)); + + if(!_local_33) return; + + _local_33.x = (_local_33.x + Math.round((canvasRectangle.width / 2))); + _local_33.y = (_local_33.y + Math.round((canvasRectangle.height / 2))); + + if(bounds) + { + bounds.x += -(renderingCanvas.screenOffsetX); + bounds.y += -(renderingCanvas.screenOffsetY); + + if(((bounds.width > 1) && (bounds.height > 1))) + { + _local_29 = (((bounds.left - _local_33.x) - (roomGeometry.scale * 0.25)) / _local_24); + _local_31 = (((bounds.right - _local_33.x) + (roomGeometry.scale * 0.25)) / _local_24); + _local_30 = (((bounds.top - _local_33.y) - (roomGeometry.scale * 0.5)) / _local_25); + _local_32 = (((bounds.bottom - _local_33.y) + (roomGeometry.scale * 0.5)) / _local_25); + } + else + { + roomGeometry.adjustLocation(new Vector3d(-30, -30), 25); + + return; + } + } + else + { + roomGeometry.adjustLocation(new Vector3d(0, 0), 25); + + return; + } + + let _local_34 = false; + let _local_35 = false; + let _local_36 = false; + let _local_37 = false; + const _local_38 = Math.round(((_local_31 - _local_29) * _local_24)); + + if(_local_38 < canvasRectangle.width) + { + _local_10 = 2; + _local_23.x = ((_local_31 + _local_29) / 2); + _local_36 = true; + } + else + { + if(_local_23.x > (_local_31 - _local_27)) + { + _local_23.x = (_local_31 - _local_27); + _local_34 = true; + } + if(_local_23.x < (_local_29 + _local_27)) + { + _local_23.x = (_local_29 + _local_27); + _local_34 = true; + } + } + const _local_39 = Math.round(((_local_32 - _local_30) * _local_25)); + if(_local_39 < canvasRectangle.height) + { + _local_10 = 2; + _local_23.y = ((_local_32 + _local_30) / 2); + _local_37 = true; + } + else + { + if(_local_23.y > (_local_32 - _local_28)) + { + _local_23.y = (_local_32 - _local_28); + _local_35 = true; + } + if(_local_23.y < (_local_30 + _local_28)) + { + _local_23.y = (_local_30 + _local_28); + _local_35 = true; + } + if(_local_35) + { + _local_23.y = (_local_23.y / (_local_25 / _local_24)); + } + } + _local_26.invert(); + _local_23 = _local_26.apply(_local_23); + _local_23.x = (_local_23.x + _local_20); + _local_23.y = (_local_23.y + _local_21); + let _local_40 = 0.35; + let _local_41 = 0.2; + let _local_42 = 0.2; + const _local_43 = 10; + const _local_44 = 10; + if((_local_42 * width) > 100) + { + _local_42 = (100 / width); + } + if((_local_40 * height) > 150) + { + _local_40 = (150 / height); + } + if((_local_41 * height) > 150) + { + _local_41 = (150 / height); + } + if((((roomCamera.limitedLocationX) && (roomCamera.screenWd == width)) && (roomCamera.screenHt == height))) + { + _local_42 = 0; + } + if((((roomCamera.limitedLocationY) && (roomCamera.screenWd == width)) && (roomCamera.screenHt == height))) + { + _local_40 = 0; + _local_41 = 0; + } + + canvasRectangle.width = (canvasRectangle.width * (1 - (_local_42 * 2))); + canvasRectangle.height = (canvasRectangle.height * (1 - (_local_40 + _local_41))); + + if(canvasRectangle.width < _local_43) + { + canvasRectangle.width = _local_43; + } + + if(canvasRectangle.height < _local_44) + { + canvasRectangle.height = _local_44; + } + + if((_local_40 + _local_41) > 0) + { + canvasRectangle.x += (-(canvasRectangle.width) / 2); + canvasRectangle.y += (-(canvasRectangle.height) * (_local_41 / (_local_40 + _local_41))); + } + else + { + canvasRectangle.x += (-(canvasRectangle.width) / 2); + canvasRectangle.y += (-(canvasRectangle.height) / 2); + } + + _local_33 = roomGeometry.getScreenPoint(_local_15); + + if(!_local_33) return; + + if(_local_33) + { + _local_33.x = (_local_33.x + renderingCanvas.screenOffsetX); + _local_33.y = (_local_33.y + renderingCanvas.screenOffsetY); + _local_15.z = _local_10; + _local_15.x = (Math.round((_local_23.x * 2)) / 2); + _local_15.y = (Math.round((_local_23.y * 2)) / 2); + if(!roomCamera.location) + { + roomGeometry.location = _local_15; + if(this.useOffsetScrolling) + { + roomCamera.initializeLocation(new Vector3d(0, 0, 0)); + } + else + { + roomCamera.initializeLocation(_local_15); + } + } + const _local_45 = roomGeometry.getScreenPoint(_local_15); + const _local_46 = new Vector3d(0, 0, 0); + if(_local_45) + { + _local_46.x = _local_45.x; + _local_46.y = _local_45.y; + } + if(((((((((_local_33.x < canvasRectangle.left) || (_local_33.x > canvasRectangle.right)) && (!(roomCamera.centeredLocX))) || (((_local_33.y < canvasRectangle.top) || (_local_33.y > canvasRectangle.bottom)) && (!(roomCamera.centeredLocY)))) || (((_local_36) && (!(roomCamera.centeredLocX))) && (!(roomCamera.screenWd == width)))) || (((_local_37) && (!(roomCamera.centeredLocY))) && (!(roomCamera.screenHt == height)))) || ((!(roomCamera.roomWd == bounds.width)) || (!(roomCamera.roomHt == bounds.height)))) || ((!(roomCamera.screenWd == width)) || (!(roomCamera.screenHt == height))))) + { + roomCamera.limitedLocationX = _local_34; + roomCamera.limitedLocationY = _local_35; + if(this.useOffsetScrolling) + { + roomCamera.target = _local_46; + } + else + { + roomCamera.target = _local_15; + } + } + else + { + if(!_local_34) roomCamera.limitedLocationX = false; + + if(!_local_35) roomCamera.limitedLocationY = false; + } + } + + roomCamera.centeredLocX = _local_36; + roomCamera.centeredLocY = _local_37; + roomCamera.screenWd = width; + roomCamera.screenHt = height; + roomCamera.scale = roomGeometry.scale; + roomCamera.geometryUpdateId = roomGeometry.updateId; + roomCamera.roomWd = bounds.width; + roomCamera.roomHt = bounds.height; + + if(!this._sessionDataManager.isCameraFollowDisabled) + { + if(this.useOffsetScrolling) + { + roomCamera.update(time, 8); + } + else + { + roomCamera.update(time, 0.5); + } + } + + if(this.useOffsetScrolling) + { + this.setRoomInstanceRenderingCanvasOffset(this.activeRoomId, 1, new Point(-(roomCamera.location.x), -(roomCamera.location.y))); + } + else + { + roomGeometry.adjustLocation(roomCamera.location, 25); + } + } + else + { + roomCamera.limitedLocationX = false; + roomCamera.limitedLocationY = false; + roomCamera.centeredLocX = false; + roomCamera.centeredLocY = false; + } + } + + private getRoomCanvasRectangle(roomId: number, canvasId: number): Rectangle + { + const canvas = this.getRoomInstanceRenderingCanvas(roomId, canvasId); + + if(!canvas) return null; + + return new Rectangle(0, 0, canvas.width, canvas.height); + } + + public getRoomObjectBoundingRectangle(roomId: number, objectId: number, category: number, canvasId: number): Rectangle + { + const geometry = this.getRoomInstanceGeometry(roomId, canvasId); + + if(!geometry) return null; + + const roomObject = this.getRoomObject(roomId, objectId, category); + + if(!roomObject) return null; + + const visualization = roomObject.visualization; + + if(!visualization) return null; + + const rectangle = visualization.getBoundingRectangle(); + const canvas = this.getRoomInstanceRenderingCanvas(roomId, canvasId); + const scale = ((canvas) ? canvas.scale : 1); + const screenPoint = geometry.getScreenPoint(roomObject.getLocation()); + + if(!screenPoint) return null; + + screenPoint.x = Math.round(screenPoint.x); + screenPoint.y = Math.round(screenPoint.y); + + rectangle.x = (rectangle.x * scale); + rectangle.y = (rectangle.y * scale); + rectangle.width = (rectangle.width * scale); + rectangle.height = (rectangle.height * scale); + + screenPoint.x = (screenPoint.x * scale); + screenPoint.y = (screenPoint.y * scale); + + rectangle.x += screenPoint.x; + rectangle.y += screenPoint.y; + + if(!canvas) return null; + + rectangle.x += (Math.round(canvas.width / 2) + canvas.screenOffsetX); + rectangle.y += (Math.round(canvas.height / 2) + canvas.screenOffsetY); + + return rectangle; + } + + public getCanvasBoundingRectangle(canvasId: number): Rectangle + { + return this.getRoomObjectBoundingRectangle(this._activeRoomId, RoomEngine.ROOM_OBJECT_ID, RoomObjectCategory.ROOM, canvasId); + } + + public getFurnitureFloorName(typeId: number): string + { + return this._roomContentLoader.getFurnitureFloorNameForTypeId(typeId); + } + + public getFurnitureWallName(typeId: number, extra: string = null): string + { + return this._roomContentLoader.getFurnitureWallNameForTypeId(typeId, extra); + } + + public getFurnitureFloorColorIndex(typeId: number): number + { + return this._roomContentLoader.getFurnitureFloorColorIndex(typeId); + } + + public getFurnitureWallColorIndex(typeId: number): number + { + return this._roomContentLoader.getFurnitureWallColorIndex(typeId); + } + + private getRoomInstanceData(roomId: number): RoomInstanceData + { + const existing = this._roomInstanceDatas.get(roomId); + + if(existing) return existing; + + const data = new RoomInstanceData(roomId); + + this._roomInstanceDatas.set(data.roomId, data); + + return data; + } + + public getRoomInstanceModelName(roomId: number): string + { + const instanceData = this.getRoomInstanceData(roomId); + + if(!instanceData) return null; + + return instanceData.modelName; + } + + public setRoomInstanceModelName(roomId: number, name: string): void + { + const instanceData = this.getRoomInstanceData(roomId); + + if(!instanceData) return; + + instanceData.setModelName(name); + } + + public getRoomTileObjectMap(k: number): ITileObjectMap + { + const roomInstance = this.getRoomInstanceData(k); + + if(!roomInstance) return null; + + return roomInstance.tileObjectMap; + } + + private getCurrentRoomCamera(): RoomCamera + { + return this.getRoomCamera(this._activeRoomId); + } + + private getRoomCamera(roomId: number): RoomCamera + { + const instanceData = this.getRoomInstanceData(roomId); + + if(!instanceData) return null; + + return instanceData.roomCamera; + } + + public getSelectedRoomObjectData(roomId: number): ISelectedRoomObjectData + { + const instanceData = this.getRoomInstanceData(roomId); + + if(!instanceData) return null; + + return instanceData.selectedObject; + } + + public setSelectedRoomObjectData(roomId: number, data: ISelectedRoomObjectData): void + { + const instanceData = this.getRoomInstanceData(roomId); + + if(!instanceData) return null; + + instanceData.setSelectedObject(data); + + if(data) instanceData.setPlacedObject(null); + } + + public getPlacedRoomObjectData(roomId: number): ISelectedRoomObjectData + { + const instanceData = this.getRoomInstanceData(roomId); + + if(!instanceData) return null; + + return instanceData.placedObject; + } + + public setPlacedRoomObjectData(roomId: number, data: ISelectedRoomObjectData): void + { + const instanceData = this.getRoomInstanceData(roomId); + + if(!instanceData) return null; + + instanceData.setPlacedObject(data); + } + + public cancelRoomObjectPlacement(): void + { + if(!this._roomObjectEventHandler) return; + + this._roomObjectEventHandler.cancelRoomObjectPlacement(this._activeRoomId); + } + + public getFurnitureStackingHeightMap(roomId: number): IFurnitureStackingHeightMap + { + const instanceData = this.getRoomInstanceData(roomId); + + if(!instanceData) return null; + + return instanceData.furnitureStackingHeightMap; + } + + public setFurnitureStackingHeightMap(roomId: number, heightMap: IFurnitureStackingHeightMap): void + { + const instanceData = this.getRoomInstanceData(roomId); + + if(!instanceData) return null; + + instanceData.setFurnitureStackingHeightMap(heightMap); + } + + public getLegacyWallGeometry(roomId: number): ILegacyWallGeometry + { + const instanceData = this.getRoomInstanceData(roomId); + + if(!instanceData) return null; + + return instanceData.legacyGeometry; + } + + private createRoomObjectAndInitialize(roomId: number, objectId: number, type: string, category: number): IRoomObjectController + { + const instance = this.getRoomInstance(roomId); + + if(!instance) return null; + + return instance.createRoomObjectAndInitalize(objectId, type, category) as IRoomObjectController; + } + + public getTotalObjectsForManager(roomId: number, category: number): number + { + const instance = this.getRoomInstance(roomId); + + if(!instance) return 0; + + return instance.getTotalObjectsForManager(category); + } + + public getRoomObject(roomId: number, objectId: number, category: number): IRoomObjectController + { + let roomIdString = this.getRoomId(roomId); + + if(roomId === 0) roomIdString = RoomEngine.TEMPORARY_ROOM; + + return this.getObject(roomIdString, objectId, category); + } + + public getObject(roomId: string, objectId: number, category: number): IRoomObjectController + { + let roomInstance: IRoomInstance = null; + + if(this._roomManager) roomInstance = this._roomManager.getRoomInstance(roomId); + + if(!roomInstance) return null; + + let roomObject = (roomInstance.getRoomObject(objectId, category) as IRoomObjectController); + + if(!roomObject) + { + switch(category) + { + case RoomObjectCategory.FLOOR: + this.processPendingFurnitureFloor(this.getRoomIdFromString(roomId), objectId, null); + + roomObject = (roomInstance.getRoomObject(objectId, category) as IRoomObjectController); + break; + case RoomObjectCategory.WALL: + this.processPendingFurnitureWall(this.getRoomIdFromString(roomId), objectId, null); + + roomObject = (roomInstance.getRoomObject(objectId, category) as IRoomObjectController); + break; + } + } + + return roomObject; + } + + public getRoomObjectByIndex(roomId: number, index: number, category: number): IRoomObjectController + { + const instance = this.getRoomInstance(roomId); + + if(!instance) return null; + + return instance.getRoomObjectByIndex(index, category) as IRoomObjectController; + } + + public getRoomObjectCategoryForType(type: string): number + { + return this._roomContentLoader.getCategoryForType(type); + } + + public getRoomObjectCursor(roomId: number): IRoomObjectController + { + return this.getObject(this.getRoomId(roomId), RoomEngine.CURSOR_OBJECT_ID, RoomObjectCategory.CURSOR); + } + + public getRoomObjectSelectionArrow(roomId: number): IRoomObjectController + { + return this.getObject(this.getRoomId(roomId), RoomEngine.ARROW_OBJECT_ID, RoomObjectCategory.CURSOR); + } + + public getRoomOwnObject(roomId: number): IRoomObjectController + { + return this.getObject(this.getRoomId(roomId), RoomEngine.ROOM_OBJECT_ID, RoomObjectCategory.ROOM); + } + + public getRoomObjectUser(roomId: number, objectId: number): IRoomObjectController + { + return this.getObject(this.getRoomId(roomId), objectId, RoomObjectCategory.UNIT); + } + + public removeRoomObjectUser(roomId: number, objectId: number): void + { + return this.removeRoomObject(roomId, objectId, RoomObjectCategory.UNIT); + } + + public createRoomObjectUser(roomId: number, objectId: number, type: string): IRoomObjectController + { + return this.createRoomObjectAndInitialize(roomId, objectId, type, RoomObjectCategory.UNIT); + } + + public getRoomObjectFloor(roomId: number, objectId: number): IRoomObjectController + { + return this.getObject(this.getRoomId(roomId), objectId, RoomObjectCategory.FLOOR); + } + + public createRoomObjectFloor(roomId: number, id: number, type: string): IRoomObjectController + { + return this.createRoomObjectAndInitialize(roomId, id, type, RoomObjectCategory.FLOOR); + } + + public removeRoomObjectFloor(roomId: number, objectId: number, userId: number = -1, _arg_4: boolean = false): void + { + const roomInstanceData = this.getRoomInstanceData(roomId); + + if(roomInstanceData) roomInstanceData.removePendingFunitureFloor(objectId); + + if((this._sessionDataManager.userId === userId) && !FurniId.isBuilderClubId(objectId)) + { + const roomObject = this.getRoomObject(roomId, objectId, RoomObjectCategory.FLOOR); + + if(roomObject) + { + const screenLocation = this.getRoomObjectScreenLocation(roomId, objectId, RoomObjectCategory.FLOOR, this._activeRoomActiveCanvas); + + if(screenLocation) + { + const disabledPickingAnimation = (roomObject.model.getValue(RoomObjectVariable.FURNITURE_DISABLE_PICKING_ANIMATION) === 1); + + if(!disabledPickingAnimation) + { + const typeId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); + const extras = roomObject.model.getValue(RoomObjectVariable.FURNITURE_EXTRAS); + const dataKey = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA_FORMAT); + const objectData = ObjectDataFactory.getData(dataKey); + const icon = this.getFurnitureFloorIcon(typeId, null, extras, objectData).data; + + if(icon) + { + (async () => + { + const image = await TextureUtils.generateImage(icon); + const event = new NitroToolbarAnimateIconEvent(image, screenLocation.x, screenLocation.y); + + event.iconName = ToolbarIconEnum.INVENTORY; + + GetEventDispatcher().dispatchEvent(event); + })(); + } + } + } + } + } + + this.removeRoomObject(roomId, objectId, RoomObjectCategory.FLOOR); + this.setMouseDefault(roomId, RoomObjectCategory.FLOOR, objectId); + + if(_arg_4) this.refreshTileObjectMap(roomId, 'RoomEngine.disposeObjectFurniture()'); + } + + public getRoomObjectWall(roomId: number, objectId: number): IRoomObjectController + { + return this.getObject(this.getRoomId(roomId), objectId, RoomObjectCategory.WALL); + } + + public removeRoomObjectWall(roomId: number, objectId: number, userId: number = -1): void + { + if((this._sessionDataManager.userId === userId) && !FurniId.isBuilderClubId(objectId)) + { + const roomObject = this.getRoomObject(roomId, objectId, RoomObjectCategory.WALL); + + if(roomObject && (roomObject.type.indexOf('post_it') === -1) && (roomObject.type.indexOf('external_image_wallitem') === -1)) + { + const screenLocation = this.getRoomObjectScreenLocation(roomId, objectId, RoomObjectCategory.WALL, this._activeRoomActiveCanvas); + + if(screenLocation) + { + const typeId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); + const objectData = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); + const icon = this.getFurnitureWallIcon(typeId, null, objectData).data; + + if(icon) + { + (async () => + { + const image = await TextureUtils.generateImage(icon); + + if(GetEventDispatcher()) + { + const event = new NitroToolbarAnimateIconEvent(image, screenLocation.x, screenLocation.y); + + event.iconName = ToolbarIconEnum.INVENTORY; + + GetEventDispatcher().dispatchEvent(event); + } + })(); + } + } + } + } + + this.removeRoomObject(roomId, objectId, RoomObjectCategory.WALL); + this.updateRoomObjectMask(roomId, objectId, false); + this.setMouseDefault(roomId, RoomObjectCategory.WALL, objectId); + } + + public createRoomObjectWall(roomId: number, id: number, type: string): IRoomObjectController + { + return this.createRoomObjectAndInitialize(roomId, id, type, RoomObjectCategory.WALL); + } + + private removeRoomObject(roomId: number, objectId: number, category: number): void + { + const instance = this.getRoomInstance(roomId); + + if(!instance) return null; + + instance.removeRoomObject(objectId, category); + + if(GetEventDispatcher()) GetEventDispatcher().dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.REMOVED, roomId, objectId, category)); + } + + public addFurnitureFloor(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra: number = NaN, expires: number = -1, usagePolicy: number = 0, ownerId: number = 0, ownerName: string = '', synchronized: boolean = true, realRoomObject: boolean = true, sizeZ: number = -1): boolean + { + const instanceData = this.getRoomInstanceData(roomId); + + if(!instanceData) return false; + + const furnitureData = new RoomFurnitureData(id, typeId, null, location, direction, state, objectData, extra, expires, usagePolicy, ownerId, ownerName, synchronized, realRoomObject, sizeZ); + + instanceData.addPendingFurnitureFloor(furnitureData); + + return true; + } + + public addFurnitureFloorByTypeName(roomId: number, id: number, typeName: string, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra: number = NaN, expires: number = -1, usagePolicy: number = 0, ownerId: number = 0, ownerName: string = '', synchronized: boolean = true, realRoomObject: boolean = true, sizeZ: number = -1): boolean + { + const instanceData = this.getRoomInstanceData(roomId); + + if(!instanceData) return false; + + const furnitureData = new RoomFurnitureData(id, 0, typeName, location, direction, state, objectData, extra, expires, usagePolicy, ownerId, ownerName, synchronized, realRoomObject, sizeZ); + + instanceData.addPendingFurnitureFloor(furnitureData); + + return true; + } + + public addFurnitureWall(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, extra: string, expires: number = -1, usagePolicy: number = 0, ownerId: number = 0, ownerName: string = '', realRoomObject: boolean = true): boolean + { + const instanceData = this.getRoomInstanceData(roomId); + + if(!instanceData) return false; + + const objectData = new LegacyDataType(); + + objectData.setString(extra); + + const furnitureData = new RoomFurnitureData(id, typeId, null, location, direction, state, objectData, NaN, expires, usagePolicy, ownerId, ownerName, true, realRoomObject); + + instanceData.addPendingFurnitureWall(furnitureData); + + return true; + } + + public updateRoomObjectFloor(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, state: number, data: IObjectData, extra: number = null): boolean + { + const object = this.getRoomObjectFloor(roomId, objectId); + + if(!object) return false; + + object.processUpdateMessage(new RoomObjectUpdateMessage(location, direction)); + object.processUpdateMessage(new ObjectDataUpdateMessage(state, data, extra)); + + return true; + } + + public updateRoomObjectWall(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, state: number, extra: string = null): boolean + { + const object = this.getRoomObjectWall(roomId, objectId); + + if(!object || !object.logic) return false; + + const updateMessage = new RoomObjectUpdateMessage(location, direction); + const data = new LegacyDataType(); + const dataUpdateMessage = new ObjectDataUpdateMessage(state, data); + + data.setString(extra); + + object.logic.processUpdateMessage(updateMessage); + object.logic.processUpdateMessage(dataUpdateMessage); + + this.updateRoomObjectMask(roomId, objectId); + + return true; + } + + public updateRoomObjectWallItemData(roomId: number, objectId: number, data: string): boolean + { + const object = this.getRoomObjectWall(roomId, objectId); + + if(!object || !object.logic) return false; + + object.logic.processUpdateMessage(new ObjectItemDataUpdateMessage(data)); + + return true; + } + + public updateRoomObjectFloorHeight(roomId: number, objectId: number, height: number): boolean + { + const object = this.getRoomObjectFloor(roomId, objectId); + + if(!object) return false; + + object.processUpdateMessage(new ObjectHeightUpdateMessage(null, null, height)); + + return true; + } + + public updateRoomObjectFloorExpiration(roomId: number, objectId: number, expires: number): boolean + { + const object = this.getRoomObjectFloor(roomId, objectId); + + if(!object) return false; + + object.model.setValue(RoomObjectVariable.FURNITURE_EXPIRY_TIME, expires); + object.model.setValue(RoomObjectVariable.FURNITURE_EXPIRTY_TIMESTAMP, GetTickerTime()); + + return true; + } + + public updateRoomObjectWallExpiration(roomId: number, objectId: number, expires: number): boolean + { + const object = this.getRoomObjectWall(roomId, objectId); + + if(!object) return false; + + object.model.setValue(RoomObjectVariable.FURNITURE_EXPIRY_TIME, expires); + object.model.setValue(RoomObjectVariable.FURNITURE_EXPIRTY_TIMESTAMP, GetTickerTime()); + + return true; + } + + public updateRoomObjectMask(roomId: number, objectId: number, _arg_3: boolean = true): void + { + const maskName = RoomObjectCategory.WALL + '_' + objectId; + const roomObject = this.getRoomObjectWall(roomId, objectId); + + let maskUpdate: ObjectRoomMaskUpdateMessage = null; + + if(roomObject && roomObject.model) + { + if(roomObject.model.getValue(RoomObjectVariable.FURNITURE_USES_PLANE_MASK) > 0) + { + const maskType = roomObject.model.getValue(RoomObjectVariable.FURNITURE_PLANE_MASK_TYPE); + const location = roomObject.getLocation(); + + if(_arg_3) maskUpdate = new ObjectRoomMaskUpdateMessage(ObjectRoomMaskUpdateMessage.ADD_MASK, maskName, maskType, location); + else maskUpdate = new ObjectRoomMaskUpdateMessage(ObjectRoomMaskUpdateMessage.REMOVE_MASK, maskName); + } + } + else + { + maskUpdate = new ObjectRoomMaskUpdateMessage(ObjectRoomMaskUpdateMessage.REMOVE_MASK, maskName); + } + + const roomOwnObject = this.getRoomOwnObject(roomId); + + if(roomOwnObject && roomOwnObject.logic && maskUpdate) roomOwnObject.logic.processUpdateMessage(maskUpdate); + } + + public rollRoomObjectFloor(roomId: number, objectId: number, location: IVector3D, targetLocation: IVector3D): void + { + const object = this.getRoomObjectFloor(roomId, objectId); + + if(!object) return; + + object.processUpdateMessage(new ObjectMoveUpdateMessage(location, targetLocation, null, !!targetLocation)); + } + + public updateRoomObjectWallLocation(roomId: number, objectId: number, location: IVector3D): boolean + { + const roomObject = this.getRoomObjectWall(roomId, objectId); + + if(!roomObject) return false; + + if(roomObject.logic) roomObject.logic.processUpdateMessage(new ObjectMoveUpdateMessage(location, null, null)); + + this.updateRoomObjectMask(roomId, objectId); + + return true; + } + + public addRoomObjectUser(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, headDirection: number, type: number, figure: string): boolean + { + const existing = this.getRoomObjectUser(roomId, objectId); + + if(existing) return false; + + let objectType = RoomObjectUserType.getTypeString(type); + + if(objectType === RoomObjectUserType.PET) objectType = this.getPetType(figure); + + const object = this.createRoomObjectUser(roomId, objectId, objectType); + + if(!object) return false; + + //object.model.setValue(RoomObjectVariable.FIGURE_HIGHLIGHT_ENABLE, 1); + + object.processUpdateMessage(new ObjectAvatarUpdateMessage(this.fixedUserLocation(roomId, location), null, direction, headDirection, false, 0)); + + if(figure) object.processUpdateMessage(new ObjectAvatarFigureUpdateMessage(figure)); + + if(GetEventDispatcher()) GetEventDispatcher().dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.ADDED, roomId, objectId, RoomObjectCategory.UNIT)); + + return true; + } + + public updateRoomObjectUserLocation(roomId: number, objectId: number, location: IVector3D, targetLocation: IVector3D, canStandUp: boolean = false, baseY: number = 0, direction: IVector3D = null, headDirection: number = NaN): boolean + { + const object = this.getRoomObjectUser(roomId, objectId); + + if(!object) return false; + + if(!location) location = object.getLocation(); + + if(!direction) direction = object.getDirection(); + + if(isNaN(headDirection)) headDirection = object.model.getValue(RoomObjectVariable.HEAD_DIRECTION); + + object.processUpdateMessage(new ObjectAvatarUpdateMessage(this.fixedUserLocation(roomId, location), this.fixedUserLocation(roomId, targetLocation), direction, headDirection, canStandUp, baseY)); + + const roomSession = this._roomSessionManager.getSession(roomId); + + if(roomSession && (roomSession.ownRoomIndex === objectId)) + { + GetEventDispatcher().dispatchEvent(new RoomToObjectOwnAvatarMoveEvent(RoomToObjectOwnAvatarMoveEvent.ROAME_MOVE_TO, targetLocation)); + } + + return true; + } + + private fixedUserLocation(roomId: number, location: IVector3D): IVector3D + { + if(!location) return null; + + const heightMap = this.getFurnitureStackingHeightMap(roomId); + const wallGeometry = this.getLegacyWallGeometry(roomId); + + if(!heightMap || !wallGeometry) return location; + + let _local_5 = location.z; + const _local_6 = heightMap.getTileHeight(location.x, location.y); + const _local_7 = wallGeometry.getHeight(location.x, location.y); + + if((Math.abs((_local_5 - _local_6)) < 0.1) && (Math.abs((_local_6 - _local_7)) < 0.1)) + { + _local_5 = wallGeometry.getFloorAltitude(location.x, location.y); + } + + return new Vector3d(location.x, location.y, _local_5); + } + + public updateRoomObjectUserAction(roomId: number, objectId: number, action: string, value: number, parameter: string = null): boolean + { + const object = this.getRoomObjectUser(roomId, objectId); + + if(!object) return false; + + let message: ObjectStateUpdateMessage = null; + + switch(action) + { + case RoomObjectVariable.FIGURE_TALK: + message = new ObjectAvatarChatUpdateMessage(value); + break; + case RoomObjectVariable.FIGURE_SLEEP: + message = new ObjectAvatarSleepUpdateMessage(value === 1); + break; + case RoomObjectVariable.FIGURE_IS_TYPING: + message = new ObjectAvatarTypingUpdateMessage(value === 1); + break; + case RoomObjectVariable.FIGURE_IS_MUTED: + message = new ObjectAvatarMutedUpdateMessage(value === 1); + break; + case RoomObjectVariable.FIGURE_CARRY_OBJECT: + message = new ObjectAvatarCarryObjectUpdateMessage(value, parameter); + break; + case RoomObjectVariable.FIGURE_USE_OBJECT: + message = new ObjectAvatarUseObjectUpdateMessage(value); + break; + case RoomObjectVariable.FIGURE_DANCE: + message = new ObjectAvatarDanceUpdateMessage(value); + break; + case RoomObjectVariable.FIGURE_GAINED_EXPERIENCE: + message = new ObjectAvatarExperienceUpdateMessage(value); + break; + case RoomObjectVariable.FIGURE_NUMBER_VALUE: + message = new ObjectAvatarPlayerValueUpdateMessage(value); + break; + case RoomObjectVariable.FIGURE_SIGN: + message = new ObjectAvatarSignUpdateMessage(value); + break; + case RoomObjectVariable.FIGURE_EXPRESSION: + message = new ObjectAvatarExpressionUpdateMessage(value); + break; + case RoomObjectVariable.FIGURE_IS_PLAYING_GAME: + message = new ObjectAvatarPlayingGameUpdateMessage(value === 1); + break; + case RoomObjectVariable.FIGURE_GUIDE_STATUS: + message = new ObjectAvatarGuideStatusUpdateMessage(value); + break; + } + + if(!message) return false; + + object.processUpdateMessage(message); + + return true; + } + + public updateRoomObjectUserFigure(roomId: number, objectId: number, figure: string, gender: string = null, subType: string = null, isRiding: boolean = false): boolean + { + const object = this.getRoomObjectUser(roomId, objectId); + + if(!object) return false; + + object.processUpdateMessage(new ObjectAvatarFigureUpdateMessage(figure, gender, subType, isRiding)); + + return true; + } + + public updateRoomObjectUserFlatControl(roomId: number, objectId: number, level: string): boolean + { + const object = this.getRoomObjectUser(roomId, objectId); + + if(!object) return false; + + object.processUpdateMessage(new ObjectAvatarFlatControlUpdateMessage(parseInt(level))); + + return true; + } + + public updateRoomObjectUserEffect(roomId: number, objectId: number, effectId: number, delay: number = 0): boolean + { + const object = this.getRoomObjectUser(roomId, objectId); + + if(!object) return false; + + object.processUpdateMessage(new ObjectAvatarEffectUpdateMessage(effectId, delay)); + + return true; + } + + public updateRoomObjectUserGesture(roomId: number, objectId: number, gestureId: number): boolean + { + const object = this.getRoomObjectUser(roomId, objectId); + + if(!object) return false; + + object.processUpdateMessage(new ObjectAvatarGestureUpdateMessage(gestureId)); + + return true; + } + + public updateRoomObjectUserPetGesture(roomId: number, objectId: number, gesture: string): boolean + { + const object = this.getRoomObjectUser(roomId, objectId); + + if(!object) return false; + + object.processUpdateMessage(new ObjectAvatarPetGestureUpdateMessage(gesture)); + + return true; + } + + public updateRoomObjectUserPosture(roomId: number, objectId: number, type: string, parameter: string = null): boolean + { + const object = this.getRoomObjectUser(roomId, objectId); + + if(!object) return false; + + object.processUpdateMessage(new ObjectAvatarPostureUpdateMessage(type, parameter)); + + return true; + } + + public updateRoomObjectUserOwn(roomId: number, objectId: number): void + { + const object = this.getRoomObjectUser(roomId, objectId); + + if(!object) return; + + object.processUpdateMessage(new ObjectAvatarOwnMessage()); + } + + public useRoomObject(objectId: number, category: number): boolean + { + const roomObject = this.getRoomObject(this._activeRoomId, objectId, category); + + if(roomObject) + { + const eventHandler = roomObject.logic; + + if(eventHandler) + { + eventHandler.useObject(); + + return true; + } + } + + return false; + } + + public objectInitialized(roomId: string, objectId: number, category: number): void + { + const id = this.getRoomIdFromString(roomId); + + if(category === RoomObjectCategory.WALL) + { + this.updateRoomObjectMask(id, objectId); + } + + const object = this.getRoomObject(id, objectId, category); + + if(object && object.model && object.logic) + { + const dataFormat = object.model.getValue(RoomObjectVariable.FURNITURE_DATA_FORMAT); + + if(!isNaN(dataFormat)) + { + const data = ObjectDataFactory.getData(dataFormat); + + data.initializeFromRoomObjectModel(object.model); + + object.processUpdateMessage(new ObjectDataUpdateMessage(object.getState(0), data)); + } + + GetEventDispatcher().dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.CONTENT_UPDATED, id, objectId, category)); + } + + if(roomId !== RoomEngine.TEMPORARY_ROOM) this.addObjectToTileMap(id, object); + } + + public changeObjectModelData(roomId: number, objectId: number, category: number, numberKey: string, numberValue: number): boolean + { + const roomObject = this.getObject(this.getRoomId(roomId), objectId, category); + + if(!roomObject || !roomObject.logic) return false; + + const message = new ObjectModelDataUpdateMessage(numberKey, numberValue); + + roomObject.processUpdateMessage(message); + + return true; + } + + public changeObjectState(roomId: number, objectId: number, category: number): void + { + const roomObject = this.getObject(this.getRoomId(roomId), objectId, category); + + if(!roomObject || !roomObject.model) return; + + let stateIndex = roomObject.model.getValue(RoomObjectVariable.FURNITURE_AUTOMATIC_STATE_INDEX); + + if(isNaN(stateIndex)) stateIndex = 1; + else stateIndex = (stateIndex + 1); + + roomObject.model.setValue(RoomObjectVariable.FURNITURE_AUTOMATIC_STATE_INDEX, stateIndex); + + const objectDataKey = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA_FORMAT); + const objectData = ObjectDataFactory.getData(objectDataKey); + + objectData.initializeFromRoomObjectModel(roomObject.model); + + if(roomObject.logic) roomObject.logic.processUpdateMessage(new ObjectDataUpdateMessage(stateIndex, objectData)); + } + + public loadRoomObjectBadgeImage(roomId: number, objectId: number, objectCategory: number, badgeId: string, groupBadge: boolean = true): void + { + let roomObject: IRoomObjectController = null; + + if(roomId === 0) + { + const room = this._roomManager.getRoomInstance(RoomEngine.TEMPORARY_ROOM); + + if(room) roomObject = (room.getRoomObject(objectId, objectCategory) as IRoomObjectController); + } + else + { + roomObject = this.getRoomObjectFloor(roomId, objectId); + } + + if(!roomObject || !roomObject.logic) return; + + let badgeName = (groupBadge) ? this._sessionDataManager.loadGroupBadgeImage(badgeId) : this._sessionDataManager.loadBadgeImage(badgeId); + + if(!badgeName) + { + badgeName = 'loading_icon'; + + if(!this._badgeListenerObjects) this._badgeListenerObjects = new Map(); + + if(!this._badgeListenerObjects.size) + { + GetEventDispatcher().addEventListener(BadgeImageReadyEvent.IMAGE_READY, this.onBadgeImageReadyEvent); + } + + let listeners = this._badgeListenerObjects.get(badgeId); + + if(!listeners) listeners = []; + + listeners.push(new RoomObjectBadgeImageAssetListener(roomObject, groupBadge)); + + this._badgeListenerObjects.set(badgeId, listeners); + } + else + { + this.putBadgeInObjectAssets(roomObject, badgeId, groupBadge); + } + + roomObject.logic.processUpdateMessage(new ObjectGroupBadgeUpdateMessage(badgeId, badgeName)); + } + + private onBadgeImageReadyEvent(k: BadgeImageReadyEvent): void + { + const listeners = this._badgeListenerObjects && this._badgeListenerObjects.get(k.badgeId); + + if(!listeners) return; + + for(const listener of listeners) + { + if(!listener) continue; + + this.putBadgeInObjectAssets(listener.object, k.badgeId, listener.groupBadge); + + const badgeName = (listener.groupBadge) ? this._sessionDataManager.loadGroupBadgeImage(k.badgeId) : this._sessionDataManager.loadBadgeImage(k.badgeId); + + if(listener.object && listener.object.logic) listener.object.logic.processUpdateMessage(new ObjectGroupBadgeUpdateMessage(k.badgeId, badgeName)); + } + + this._badgeListenerObjects.delete(k.badgeId); + + if(!this._badgeListenerObjects.size) + { + GetEventDispatcher().removeEventListener(BadgeImageReadyEvent.IMAGE_READY, this.onBadgeImageReadyEvent); + } + } + + private putBadgeInObjectAssets(object: IRoomObjectController, badgeId: string, groupBadge: boolean = false): void + { + const badgeName = (groupBadge) ? this._sessionDataManager.loadGroupBadgeImage(badgeId) : this._sessionDataManager.loadBadgeImage(badgeId); + const badgeImage = (groupBadge) ? this._sessionDataManager.getGroupBadgeImage(badgeId) : this._sessionDataManager.getBadgeImage(badgeId); + + if(badgeImage) this._roomContentLoader.addAssetToCollection(object.type, badgeName, badgeImage, false); + } + + public dispatchMouseEvent(canvasId: number, x: number, y: number, type: string, altKey: boolean, ctrlKey: boolean, shiftKey: boolean, buttonDown: boolean): void + { + const canvas = this.getRoomInstanceRenderingCanvas(this._activeRoomId, canvasId); + + if(!canvas) return; + + const overlay = this.getRenderingCanvasOverlay(canvas); + const sprite = this.getOverlayIconSprite(overlay, RoomEngine.OBJECT_ICON_SPRITE); + + if(sprite) + { + const rectangle = sprite.getLocalBounds(); + + sprite.x = (x - (rectangle.width / 2)); + sprite.y = (y - (rectangle.height / 2)); + } + + if(!this.handleRoomDragging(canvas, x, y, type, altKey, ctrlKey, shiftKey)) + { + if(!canvas.handleMouseEvent(x, y, type, altKey, ctrlKey, shiftKey, buttonDown)) + { + let eventType: string = null; + + if(type === MouseEventType.MOUSE_CLICK) + { + if(GetEventDispatcher()) + { + GetEventDispatcher().dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.DESELECTED, this._activeRoomId, -1, RoomObjectCategory.MINIMUM)); + } + + eventType = RoomObjectMouseEvent.CLICK; + } + else + { + if(type === MouseEventType.MOUSE_MOVE) eventType = RoomObjectMouseEvent.MOUSE_MOVE; + + else if(type === MouseEventType.MOUSE_DOWN) eventType = RoomObjectMouseEvent.MOUSE_DOWN; + + else if(type === MouseEventType.MOUSE_DOWN_LONG) eventType = RoomObjectMouseEvent.MOUSE_DOWN_LONG; + + else if(type === MouseEventType.MOUSE_UP) eventType = RoomObjectMouseEvent.MOUSE_UP; + } + + this._roomObjectEventHandler.handleRoomObjectEvent(new RoomObjectMouseEvent(eventType, this.getRoomObject(this._activeRoomId, RoomEngine.ROOM_OBJECT_ID, RoomObjectCategory.ROOM), null, altKey), this._activeRoomId); + } + } + + this._activeRoomActiveCanvas = canvasId; + this._activeRoomActiveCanvasMouseX = x; + this._activeRoomActiveCanvasMouseY = y; + } + + private handleRoomDragging(canvas: IRoomRenderingCanvas, x: number, y: number, type: string, altKey: boolean, ctrlKey: boolean, shiftKey: boolean): boolean + { + let offsetX = (x - this._activeRoomActiveCanvasMouseX); + let offsetY = (y - this._activeRoomActiveCanvasMouseY); + + if(type === MouseEventType.MOUSE_DOWN) + { + if(!altKey && !ctrlKey && !shiftKey && !this.isDecorating) + { + if(this._roomAllowsDragging) + { + this._activeRoomIsDragged = true; + this._activeRoomWasDragged = false; + this._activeRoomDragStartX = this._activeRoomActiveCanvasMouseX; + this._activeRoomDragStartY = this._activeRoomActiveCanvasMouseY; + } + } + } + + else if(type === MouseEventType.MOUSE_UP) + { + if(this._activeRoomIsDragged) + { + this._activeRoomIsDragged = false; + + if(this._activeRoomWasDragged) + { + const instanceData = this.getRoomInstanceData(this._activeRoomId); + + if(instanceData) + { + const camera = instanceData.roomCamera; + + if(camera) + { + if(this.useOffsetScrolling) + { + if(!camera.isMoving) + { + camera.centeredLocX = false; + camera.centeredLocY = false; + } + + camera.resetLocation(new Vector3d(-(canvas.screenOffsetX), -(canvas.screenOffsetY))); + } + + if(this._roomDraggingAlwaysCenters) camera.reset(); + } + } + } + } + } + + else if(type === MouseEventType.MOUSE_MOVE) + { + if(this._activeRoomIsDragged) + { + if(!this._activeRoomWasDragged) + { + offsetX = (x - this._activeRoomDragStartX); + offsetY = (y - this._activeRoomDragStartY); + + if(((((offsetX <= -(RoomEngine.DRAG_THRESHOLD)) || (offsetX >= RoomEngine.DRAG_THRESHOLD)) || (offsetY <= -(RoomEngine.DRAG_THRESHOLD))) || (offsetY >= RoomEngine.DRAG_THRESHOLD))) + { + this._activeRoomWasDragged = true; + } + + offsetX = 0; + offsetY = 0; + } + + if(((!(offsetX == 0)) || (!(offsetY == 0)))) + { + this._activeRoomDragX += offsetX; + this._activeRoomDragY += offsetY; + + this._activeRoomWasDragged = true; + } + } + } + + else if((type === MouseEventType.MOUSE_CLICK) || (type === MouseEventType.DOUBLE_CLICK)) + { + this._activeRoomIsDragged = false; + + if(this._activeRoomWasDragged) + { + this._activeRoomWasDragged = false; + + return true; + } + } + + return false; + } + + public updateMousePointer(type: string, objectId: number, objectType: string): void + { + const category = this.getRoomObjectCategoryForType(objectType); + + switch(type) + { + case RoomObjectFurnitureActionEvent.MOUSE_BUTTON: + this.setMouseButton(this._activeRoomId, category, objectId); + return; + default: + this.setMouseDefault(this._activeRoomId, category, objectId); + return; + } + } + + private setMouseButton(roomId: number, category: number, objectId: number): void + { + const session = this._roomSessionManager.getSession(roomId); + + if(!session) return; + + if(((category !== RoomObjectCategory.FLOOR) && (category !== RoomObjectCategory.WALL)) || ((session.controllerLevel >= RoomControllerLevel.GUEST))) + { + const instanceData = this.getRoomInstanceData(roomId); + + if(instanceData) + { + if(instanceData.addButtonMouseCursorOwner((category + '_' + objectId))) this._mouseCursorUpdate = true; + } + } + } + + private setMouseDefault(roomId: number, category: number, objectId: number): void + { + const instanceData = this.getRoomInstanceData(roomId); + + if(instanceData) + { + if(instanceData.removeButtonMouseCursorOwner((category + '_' + objectId))) this._mouseCursorUpdate = true; + } + } + + public processRoomObjectOperation(objectId: number, category: number, operation: string): boolean + { + if(!this._roomObjectEventHandler) return false; + + this._roomObjectEventHandler.modifyRoomObject(this._activeRoomId, objectId, category, operation); + } + + public modifyRoomObjectDataWithMap(objectId: number, category: number, operation: string, data: Map): boolean + { + if(!this._roomObjectEventHandler) return false; + + if(category !== RoomObjectCategory.FLOOR) return; + + this._roomObjectEventHandler.modifyRoomObjectDataWithMap(this._activeRoomId, objectId, category, operation, data); + } + + public modifyRoomObjectData(objectId: number, category: number, colorHex: string, data: string): boolean + { + if(!this._roomObjectEventHandler) return false; + + if(category !== RoomObjectCategory.WALL) return; + + this._roomObjectEventHandler.modifyWallItemData(this._activeRoomId, objectId, colorHex, data); + } + + private processRoomObjectEvent(event: RoomObjectEvent): void + { + if(!this._roomObjectEventHandler) return; + + const roomIdString = this.getRoomObjectRoomId(event.object); + + if(!roomIdString) return; + + const roomId = this.getRoomIdFromString(roomIdString); + + this._roomObjectEventHandler.handleRoomObjectEvent(event, roomId); + } + + public processRoomObjectPlacement(placementSource: string, id: number, category: number, typeId: number, extra: string = null, stuffData: IObjectData = null, state: number = -1, frameNumber: number = -1, posture: string = null): boolean + { + const roomInstance = this.getRoomInstance(this._activeRoomId); + + if(!roomInstance || (roomInstance.model.getValue(RoomVariableEnum.ROOM_IS_PUBLIC) !== 0)) return false; + + if(!this._roomObjectEventHandler) return false; + + return this._roomObjectEventHandler.processRoomObjectPlacement(placementSource, this._activeRoomId, id, category, typeId, extra, stuffData, state, frameNumber, posture); + } + + public getRoomObjectScreenLocation(roomId: number, objectId: number, objectType: number, canvasId: number = -1): Point + { + if(canvasId == -1) canvasId = this._activeRoomActiveCanvas; + + const geometry = this.getRoomInstanceGeometry(roomId, canvasId); + + if(!geometry) return null; + + const roomObject = this.getRoomObject(roomId, objectId, objectType); + + if(!roomObject) return null; + + const screenPoint = geometry.getScreenPoint(roomObject.getLocation()); + + if(!screenPoint) return null; + + const renderingCanvas = this.getRoomInstanceRenderingCanvas(roomId, canvasId); + + if(!renderingCanvas) return null; + + screenPoint.x = (screenPoint.x * renderingCanvas.scale); + screenPoint.y = (screenPoint.y * renderingCanvas.scale); + + screenPoint.x += ((renderingCanvas.width / 2) + renderingCanvas.screenOffsetX); + screenPoint.y += ((renderingCanvas.height / 2) + renderingCanvas.screenOffsetY); + + screenPoint.x = Math.round(screenPoint.x); + screenPoint.y = Math.round(screenPoint.y); + + return screenPoint; + } + + public selectRoomObject(roomId: number, objectId: number, objectCategory: number): void + { + if(!this._roomObjectEventHandler) return; + + this._roomObjectEventHandler.setSelectedObject(roomId, objectId, objectCategory); + } + + public setSelectedAvatar(roomId: number, objectId: number): void + { + if(this._roomObjectEventHandler) return; + + this._roomObjectEventHandler.setSelectedAvatar(roomId, objectId, true); + } + + public cancelRoomObjectInsert(): void + { + if(!this._roomObjectEventHandler) return; + + this._roomObjectEventHandler.cancelRoomObjectInsert(this._activeRoomId); + } + + private addOverlayIconSprite(container: Container, label: string, texture: Texture, scale: number = 1): Sprite + { + if(!container || !texture) return; + + let sprite = this.getOverlayIconSprite(container, label); + + if(sprite) return null; + + sprite = new Sprite(texture); + + sprite.label = label; + + sprite.scale.set(scale); + + container.addChild(sprite); + + return sprite; + } + + public onRoomContentLoaded(id: number, assetName: string, success: boolean): void + { + if(id === -1) return; + + this._thumbnailObjectIdBank.freeNumber((id - 1)); + + const listeners = this._thumbnailCallbacks.get(assetName); + + if(listeners) + { + this._thumbnailCallbacks.delete(assetName); + + const image = this._roomContentLoader.getImage(assetName); + + if(image) + { + for(const listener of listeners) + { + if(!listener) continue; + + listener.imageReady(id, null, image); + } + } + } + } + + public setObjectMoverIconSprite(objectId: number, category: number, _arg_3: boolean, instanceData: string = null, stuffData: IObjectData = null, state: number = -1, frameNumber: number = -1, posture: string = null): void + { + let type: string = null; + let colorIndex = 0; + let imageResult: IImageResult = null; + const scale = 1; + + if(_arg_3) + { + imageResult = this.getRoomObjectImage(this._activeRoomId, objectId, category, new Vector3d(), 1, null); + } + else + { + if(category === RoomObjectCategory.FLOOR) + { + type = this._roomContentLoader.getFurnitureFloorNameForTypeId(objectId); + colorIndex = this._roomContentLoader.getFurnitureFloorColorIndex(objectId); + } + + else if(category === RoomObjectCategory.WALL) + { + type = this._roomContentLoader.getFurnitureWallNameForTypeId(objectId, instanceData); + colorIndex = this._roomContentLoader.getFurnitureWallColorIndex(objectId); + } + + if(category === RoomObjectCategory.UNIT) + { + type = RoomObjectUserType.getTypeString(objectId); + + if(type === 'pet') + { + type = this.getPetType(instanceData); + + const petFigureData = new PetFigureData(instanceData); + + imageResult = this.getRoomObjectPetImage(petFigureData.typeId, petFigureData.paletteId, petFigureData.color, new Vector3d(180), 64, null, true, 0, petFigureData.customParts, posture); + } + else + { + imageResult = this.getGenericRoomObjectImage(type, instanceData, new Vector3d(180), 64, null, 0, null, stuffData, state, frameNumber, posture); + } + } + else + { + imageResult = this.getGenericRoomObjectImage(type, colorIndex.toString(), new Vector3d(), 1, null, 0, instanceData, stuffData, state, frameNumber, posture); + } + } + + if(!imageResult || !imageResult.data) return; + + const canvas = this.getActiveRoomInstanceRenderingCanvas(); + + if(!canvas) return; + + const overlay = this.getRenderingCanvasOverlay(canvas); + + this.removeOverlayIconSprite(overlay, RoomEngine.OBJECT_ICON_SPRITE); + + const _local_15 = this.addOverlayIconSprite(overlay, RoomEngine.OBJECT_ICON_SPRITE, imageResult.data, scale); + + if(_local_15) + { + _local_15.x = (this._activeRoomActiveCanvasMouseX - (imageResult.data.width / 2)); + _local_15.y = (this._activeRoomActiveCanvasMouseY - (imageResult.data.height / 2)); + } + } + + public getRoomObjectImage(roomId: number, objectId: number, category: number, direction: IVector3D, scale: number, listener: IGetImageListener, bgColor: number = 0): IImageResult + { + if(!this._roomManager) return null; + + let id = -1; + let type: string = null; + let data: IObjectData = null; + let color = ''; + let extras: string = null; + + const roomIdString = this.getRoomId(roomId); + const roomInstance = this._roomManager.getRoomInstance(roomIdString); + + if(roomInstance) + { + const roomObject = roomInstance.getRoomObject(objectId, category); + + if(roomObject && roomObject.model) + { + id = roomObject.id; + type = roomObject.type; + + switch(category) + { + case RoomObjectCategory.FLOOR: + case RoomObjectCategory.WALL: { + color = (roomObject.model.getValue(RoomObjectVariable.FURNITURE_COLOR).toString()); + extras = roomObject.model.getValue(RoomObjectVariable.FURNITURE_EXTRAS); + + const dataFormat = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA_FORMAT); + + if(dataFormat !== LegacyDataType.FORMAT_KEY) + { + data = ObjectDataFactory.getData(dataFormat); + + data.initializeFromRoomObjectModel(roomObject.model); + } + + break; + } + case RoomObjectCategory.UNIT: + color = roomObject.model.getValue(RoomObjectVariable.FIGURE); + break; + } + } + } + + return this.getGenericRoomObjectImage(type, color, direction, scale, listener, bgColor, extras, data, -1, -1, null, id); + } + + public getFurnitureFloorIconUrl(typeId: number): string + { + const type = this._roomContentLoader.getFurnitureFloorNameForTypeId(typeId); + const color = this._roomContentLoader.getFurnitureFloorColorIndex(typeId).toString(); + + return this._roomContentLoader.getAssetIconUrl(type, color); + } + + public getFurnitureFloorIcon(typeId: number, listener: IGetImageListener, extras: string = null, objectData: IObjectData = null): IImageResult + { + return this.getFurnitureFloorImage(typeId, new Vector3d(), 1, listener, 0, extras, -1, -1, objectData); + } + + public getFurnitureWallIconUrl(typeId: number, extra: string = null): string + { + const type: string = this._roomContentLoader.getFurnitureWallNameForTypeId(typeId, extra); + const color = this._roomContentLoader.getFurnitureWallColorIndex(typeId).toString(); + + return this._roomContentLoader.getAssetIconUrl(type, color); + } + + public getFurnitureWallIcon(typeId: number, listener: IGetImageListener, extras: string = null): IImageResult + { + return this.getFurnitureWallImage(typeId, new Vector3d(), 1, listener, 0, extras); + } + + public getFurnitureFloorImage(typeId: number, direction: IVector3D, scale: number, listener: IGetImageListener, bgColor: number = 0, extras: string = null, state: number = -1, frameCount: number = -1, objectData: IObjectData = null): IImageResult + { + const type: string = this._roomContentLoader.getFurnitureFloorNameForTypeId(typeId); + const color = this._roomContentLoader.getFurnitureFloorColorIndex(typeId).toString(); + + if((scale === 1) && listener) + { + return this.getGenericRoomObjectThumbnail(type, color, listener, extras, objectData); + } + + return this.getGenericRoomObjectImage(type, color, direction, scale, listener, bgColor, extras, objectData, state, frameCount); + } + + public getFurnitureWallImage(typeId: number, direction: IVector3D, scale: number, listener: IGetImageListener, bgColor: number = 0, extras: string = null, state: number = -1, frameCount: number = -1): IImageResult + { + const type: string = this._roomContentLoader.getFurnitureWallNameForTypeId(typeId); + const color = this._roomContentLoader.getFurnitureWallColorIndex(typeId).toString(); + + if((scale === 1) && listener) + { + return this.getGenericRoomObjectThumbnail(type, color, listener, extras, null); + } + + return this.getGenericRoomObjectImage(type, color, direction, scale, listener, bgColor, extras, null, state, frameCount); + } + + public getRoomObjectPetImage(typeId: number, paletteId: number, color: number, direction: IVector3D, scale: number, listener: IGetImageListener, headOnly: boolean = false, bgColor: number = 0, customParts: IPetCustomPart[] = null, posture: string = null): IImageResult + { + let type: string = null; + let value = ((((typeId + ' ') + paletteId) + ' ') + color.toString(16)); + + if(headOnly) value = (value + (' ' + 'head')); + + if(customParts) + { + value = (value + (' ' + customParts.length)); + + for(const _local_13 of customParts) + { + value = (value + (((((' ' + _local_13.layerId) + ' ') + _local_13.partId) + ' ') + _local_13.paletteId)); + } + } + + type = this._roomContentLoader.getPetNameForType(typeId); + + return this.getGenericRoomObjectImage(type, value, direction, scale, listener, bgColor, null, null, -1, -1, posture); + } + + public getGenericRoomObjectImage(type: string, value: string, direction: IVector3D, scale: number, listener: IGetImageListener, bgColor: number = 0, extras: string = null, objectData: IObjectData = null, state: number = -1, frameCount: number = -1, posture: string = null, originalId: number = -1): IImageResult + { + if(!this._roomManager) return null; + + const imageResult = new ImageResult(); + + imageResult.id = -1; + + if(!type) return imageResult; + + let roomInstance = this._roomManager.getRoomInstance(RoomEngine.TEMPORARY_ROOM); + + if(!roomInstance) + { + roomInstance = this._roomManager.createRoomInstance(RoomEngine.TEMPORARY_ROOM); + + if(!roomInstance) return imageResult; + } + + let objectId = this._imageObjectIdBank.reserveNumber(); + const objectCategory = this.getRoomObjectCategoryForType(type); + + if(objectId < 0) return imageResult; + + objectId++; + + const roomObject = (roomInstance.createRoomObjectAndInitalize(objectId, type, objectCategory) as IRoomObjectController); + + if(!roomObject || !roomObject.model || !roomObject.logic) return imageResult; + + const model = roomObject.model; + + switch(objectCategory) + { + case RoomObjectCategory.FLOOR: + case RoomObjectCategory.WALL: + model.setValue(RoomObjectVariable.FURNITURE_COLOR, parseInt(value)); + model.setValue(RoomObjectVariable.FURNITURE_EXTRAS, extras); + break; + case RoomObjectCategory.UNIT: + if((type === RoomObjectUserType.USER) || (type === RoomObjectUserType.BOT) || (type === RoomObjectUserType.RENTABLE_BOT) || (type === RoomObjectUserType.PET)) + { + model.setValue(RoomObjectVariable.FIGURE, value); + } + else + { + const figureData = new PetFigureData(value); + + model.setValue(RoomObjectVariable.PET_PALETTE_INDEX, figureData.paletteId); + model.setValue(RoomObjectVariable.PET_COLOR, figureData.color); + + if(figureData.headOnly) model.setValue(RoomObjectVariable.PET_HEAD_ONLY, 1); + + if(figureData.hasCustomParts) + { + model.setValue(RoomObjectVariable.PET_CUSTOM_LAYER_IDS, figureData.customLayerIds); + model.setValue(RoomObjectVariable.PET_CUSTOM_PARTS_IDS, figureData.customPartIds); + model.setValue(RoomObjectVariable.PET_CUSTOM_PALETTE_IDS, figureData.customPaletteIds); + } + + if(posture) model.setValue(RoomObjectVariable.FIGURE_POSTURE, posture); + } + break; + case RoomObjectCategory.ROOM: + break; + } + + roomObject.setDirection(direction); + + const visualization = roomObject.visualization; + + if(!visualization) + { + roomInstance.removeRoomObject(objectId, objectCategory); + + return imageResult; + } + + if((state > -1) || objectData) + { + if(objectData && (objectData.getLegacyString() !== '')) + { + roomObject.logic.processUpdateMessage(new ObjectDataUpdateMessage(parseInt(objectData.getLegacyString()), objectData)); + } + else + { + roomObject.logic.processUpdateMessage(new ObjectDataUpdateMessage(state, objectData)); + } + } + + const geometry = new RoomGeometry(scale, new Vector3d(-135, 30, 0), new Vector3d(11, 11, 5)); + + visualization.update(geometry, 0, true, false); + + if(frameCount > 0) + { + let i = 0; + + while(i < frameCount) + { + visualization.update(geometry, 0, true, false); + + i++; + } + } + + const texture = visualization.getImage(); + + imageResult.data = texture; + imageResult.id = objectId; + + if(!this.isRoomContentTypeLoaded(type) && listener) + { + let imageListeners = this._imageCallbacks.get(objectId.toString()); + + if(!imageListeners) + { + imageListeners = []; + + this._imageCallbacks.set(objectId.toString(), imageListeners); + } + + imageListeners.push(listener); + + model.setValue(RoomObjectVariable.IMAGE_QUERY_SCALE, scale); + } + else + { + roomInstance.removeRoomObject(objectId, objectCategory); + + this._imageObjectIdBank.freeNumber((objectId - 1)); + + imageResult.id = 0; + } + + geometry.dispose(); + + return imageResult; + } + + public getGenericRoomObjectThumbnail(type: string, param: string, listener: IGetImageListener, extraData: string = null, stuffData: IObjectData = null): IImageResult + { + if(!this._roomManager) return null; + + const imageResult = new ImageResult(); + + imageResult.id = -1; + + if(!type) return imageResult; + + let roomInstance = this._roomManager.getRoomInstance(RoomEngine.TEMPORARY_ROOM); + + if(!roomInstance) + { + roomInstance = this._roomManager.createRoomInstance(RoomEngine.TEMPORARY_ROOM); + + if(!roomInstance) return imageResult; + } + + let objectId = this._thumbnailObjectIdBank.reserveNumber(); + const objectCategory = this.getRoomObjectCategoryForType(type); + + if(objectId < 0) return imageResult; + + objectId++; + + imageResult.id = objectId; + imageResult.data = null; + imageResult.image = null; + + const assetName = [type, param].join('_'); + + const asset = this._roomContentLoader.getImage(assetName); + + if(!asset && listener) + { + let contentListeners = this._thumbnailCallbacks.get(assetName); + + if(!contentListeners) + { + contentListeners = []; + + this._thumbnailCallbacks.set(assetName, contentListeners); + + this._roomContentLoader.downloadImage(objectId, type, param, null); + } + + contentListeners.push(listener); + } + else + { + if(asset) + { + imageResult.image = asset; + } + + this._thumbnailObjectIdBank.freeNumber((objectId - 1)); + + imageResult.id = 0; + } + + return imageResult; + } + + public initalizeTemporaryObjectsByType(type: string, _arg_2: boolean): void + { + const roomInstance = this._roomManager.getRoomInstance(RoomEngine.TEMPORARY_ROOM); + + if(!roomInstance) return; + + const objectCategory = this._roomContentLoader.getCategoryForType(type); + const objectManager = roomInstance.getManager(objectCategory); + + let geometry: RoomGeometry = null; + let scale = 0; + + if(objectManager && objectManager.objects.length) + { + for(const roomObject of objectManager.objects.getValues()) + { + if(roomObject && roomObject.model && (roomObject.type === type)) + { + const objectId = roomObject.id; + const visualization = roomObject.visualization; + + let texture: Texture = null; + + if(visualization) + { + const imageScale = roomObject.model.getValue(RoomObjectVariable.IMAGE_QUERY_SCALE); + + if(geometry && (scale !== imageScale)) + { + geometry.dispose(); + + geometry = null; + } + + if(!geometry) + { + scale = imageScale; + + geometry = new RoomGeometry(imageScale, new Vector3d(-135, 30, 0), new Vector3d(11, 11, 5)); + } + + visualization.update(geometry, 0, true, false); + + texture = visualization.image; + } + + roomInstance.removeRoomObject(objectId, objectCategory); + + this._imageObjectIdBank.freeNumber((objectId - 1)); + + const imageListeners = this._imageCallbacks.get(objectId.toString()); + + if(imageListeners) + { + this._imageCallbacks.delete(objectId.toString()); + + for(const imageListener of imageListeners) + { + if(!imageListener) continue; + + if(texture) imageListener.imageReady(objectId, texture); + else imageListener.imageFailed(objectId); + } + } + } + } + } + + if(geometry) geometry.dispose(); + } + + public setObjectMoverIconSpriteVisible(k: boolean): void + { + const canvas = this.getActiveRoomInstanceRenderingCanvas(); + + if(!canvas) return; + + const overlay = this.getRenderingCanvasOverlay(canvas); + const sprite = this.getOverlayIconSprite(overlay, RoomEngine.OBJECT_ICON_SPRITE); + + if(sprite) + { + sprite.visible = k; + } + } + + public removeObjectMoverIconSprite(): void + { + const canvas = this.getActiveRoomInstanceRenderingCanvas(); + + if(!canvas) return; + + const overlayContainer = this.getRenderingCanvasOverlay(canvas); + + this.removeOverlayIconSprite(overlayContainer, RoomEngine.OBJECT_ICON_SPRITE); + } + + private getRenderingCanvasOverlay(canvas: IRoomRenderingCanvas): Container + { + if(!canvas) return null; + + const displayObject = canvas.master; + + if(!displayObject) return null; + + return displayObject.getChildByName(RoomEngine.OVERLAY) ?? null; + } + + private removeOverlayIconSprite(container: Container, label: string): boolean + { + if(!container) return false; + + let index = (container.children.length - 1); + + while(index >= 0) + { + const child = (container.getChildAt(index) as Sprite); + + if(child) + { + if(child.label === label) + { + container.removeChildAt(index); + + if(child.children.length) + { + const firstChild = (child.getChildAt(0) as Sprite); + + firstChild.parent.removeChild(firstChild); + + firstChild.destroy(); + } + + return true; + } + } + + index--; + } + + return false; + } + + private getOverlayIconSprite(container: Container, label: string): Sprite + { + if(!container) return null; + + let index = (container.children.length - 1); + + while(index >= 0) + { + const child = (container.getChildAt(index) as Sprite); + + if(child) + { + if(child.label === label) return child; + } + + index--; + } + + return null; + } + + public getRoomObjects(roomId: number, category: number): IRoomObject[] + { + const _local_3 = this.getRoomId(roomId); + const _local_4 = this._roomManager.getRoomInstance(_local_3); + + + if(_local_4) return _local_4.getRoomObjectsForCategory(category); + + return []; + } + + protected addObjectToTileMap(k: number, _arg_2: IRoomObject): void + { + const tileObjectMap = this.getRoomInstanceData(k).tileObjectMap; + + if(tileObjectMap) tileObjectMap.addRoomObject(_arg_2); + } + + public refreshTileObjectMap(k: number, _arg_2: string): void + { + const tileObjectMap = this.getRoomInstanceData(k).tileObjectMap; + + if(tileObjectMap) tileObjectMap.populate(this.getRoomObjects(k, RoomObjectCategory.FLOOR)); + } + + public createTextureFromRoom(roomId: number, canvasId: number = -1, bounds: Rectangle = null): Texture + { + let canvas: IRoomRenderingCanvas = null; + + if(canvasId > -1) + { + canvas = this.getRoomInstanceRenderingCanvas(this._activeRoomId, canvasId); + } + else + { + canvas = this.getActiveRoomInstanceRenderingCanvas(); + } + + let texture: Texture = null; + + if(bounds) + { + texture = TextureUtils.generateTexture({ + target: canvas.master, + frame: bounds + }); + } + else + { + texture = canvas.getDisplayAsTexture(); + } + + return texture; + } + + public async saveTextureAsScreenshot(texture: RenderTexture, saveAsThumbnail: boolean = false): Promise + { + let composer: RenderRoomMessageComposer = null; + + if(saveAsThumbnail) composer = new RenderRoomThumbnailMessageComposer(); + else composer = new RenderRoomMessageComposer(); + + await composer.assignBitmap(texture); + + GetCommunication().connection.send(composer); + } + + public saveBase64AsScreenshot(base64: string, saveAsThumbnail: boolean = false): void + { + let composer: RenderRoomMessageComposer = null; + + if(saveAsThumbnail) composer = new RenderRoomThumbnailMessageComposer(); + else composer = new RenderRoomMessageComposer(); + + composer.assignBase64(base64); + + GetCommunication().connection.send(composer); + } + + public objectsInitialized(k: string): void + { + const roomId = this.getRoomIdFromString(k); + + GetEventDispatcher().dispatchEvent(new RoomEngineEvent(RoomEngineEvent.OBJECTS_INITIALIZED, roomId)); + } + + public getRoomId(id: number): string + { + return (id.toString()); + } + + private getRoomIdFromString(roomId: string): number + { + if(!roomId) return -1; + + const split = roomId.split('_'); + + if(split.length <= 0) return -1; + + return (parseInt(split[0]) || 0); + } + + private getRoomObjectRoomId(object: IRoomObject): string + { + if(!object || !object.model) return null; + + return (object.model.getValue(RoomObjectVariable.OBJECT_ROOM_ID)); + } + + private getRoomObjectAdUrl(type: string): string + { + return this._roomContentLoader.getRoomObjectAdUrl(type); + } + + public getPetTypeId(figure: string): number + { + let type = -1; + + if(figure) + { + const parts = figure.split(' '); + + if(parts.length > 1) type = parseInt(parts[0]); + } + + return type; + } + + private getPetType(type: string): string + { + if(!type) return null; + + const parts = type.split(' '); + + if(parts.length > 1) + { + const typeId = parseInt(parts[0]); + + return this._roomContentLoader.getPetNameForType(typeId); + } + + return null; + } + + public isRoomContentTypeLoaded(name: string): boolean + { + return (this._roomContentLoader.getCollection(name) !== null); + } + + public getPetColorResult(petIndex: number, paletteIndex: number): IPetColorResult + { + return this._roomContentLoader.getPetColorResult(petIndex, paletteIndex); + } + + public getPetColorResultsForTag(petIndex: number, tagName: string): IPetColorResult[] + { + return this._roomContentLoader.getPetColorResultsForTag(petIndex, tagName); + } + + public deleteRoomObject(objectId: number, objectCategory: number): boolean + { + if(!this._roomObjectEventHandler || (objectCategory !== RoomObjectCategory.WALL)) return false; + + return this._roomObjectEventHandler.deleteWallItem(this._activeRoomId, objectId); + } + + public get roomManager(): IRoomManager + { + return this._roomManager; + } + + public set roomManager(manager: IRoomManager) + { + this._roomManager = manager; + } + + public get objectEventHandler(): RoomObjectEventHandler + { + return this._roomObjectEventHandler; + } + + public get activeRoomId(): number + { + return this._activeRoomId; + } + + public get isDecorating(): boolean + { + const session = this._roomSessionManager.getSession(this._activeRoomId); + + return (session && session.isDecorating) || false; + } + + private get useOffsetScrolling(): boolean + { + return true; + } + + public get selectedAvatarId(): number + { + if(!this._roomObjectEventHandler) return -1; + + return this._roomObjectEventHandler.selectedAvatarId; + } + + public getRoomObjectCount(roomId: number, categoryId: number): number + { + if(this._roomManager == null) return 0; + + return this._roomManager.getRoomInstance(roomId.toString()).getRoomObjectsForCategory(categoryId).length; + } +} diff --git a/packages/room/src/RoomInstance.ts b/packages/room/src/RoomInstance.ts new file mode 100644 index 0000000..2cbe78a --- /dev/null +++ b/packages/room/src/RoomInstance.ts @@ -0,0 +1,287 @@ +import { IRoomInstance, IRoomInstanceContainer, IRoomObject, IRoomObjectController, IRoomObjectManager, IRoomObjectModel, IRoomRendererBase } from '@nitrots/api'; +import { RoomObjectModel } from './object'; + +export class RoomInstance implements IRoomInstance +{ + private _id: string; + private _container: IRoomInstanceContainer; + private _renderer: IRoomRendererBase = null; + private _managers: Map = new Map(); + private _updateCategories: number[] = []; + private _model: IRoomObjectModel = new RoomObjectModel(); + + constructor(id: string, container: IRoomInstanceContainer) + { + this._id = id; + this._container = container; + } + + public dispose(): void + { + this.removeAllManagers(); + + this.destroyRenderer(); + + this._container = null; + + this._model.dispose(); + } + + public setRenderer(renderer: IRoomRendererBase): void + { + if(renderer === this._renderer) return; + + if(this._renderer) this.destroyRenderer(); + + this._renderer = renderer; + + if(!this._renderer) return; + + this._renderer.reset(); + + if(this._managers.size) + { + for(const manager of this._managers.values()) + { + if(!manager) continue; + + const objects = manager.objects; + + if(!objects.length) continue; + + for(const object of objects.getValues()) + { + if(!object) continue; + + this._renderer.addObject(object); + } + } + } + } + + private destroyRenderer(): void + { + if(!this._renderer) return; + + this._renderer.dispose(); + + this._renderer = null; + } + + public getManager(category: number): IRoomObjectManager + { + const manager = this._managers.get(category); + + if(!manager) return null; + + return manager; + } + + private getManagerOrCreate(category: number): IRoomObjectManager + { + let manager = this.getManager(category); + + if(manager) return manager; + + manager = this._container.createRoomObjectManager(category); + + if(!manager) return null; + + this._managers.set(category, manager); + + return manager; + } + + public getTotalObjectsForManager(category: number): number + { + const manager = this.getManager(category); + + if(!manager) return 0; + + return manager.totalObjects; + } + + public getRoomObject(id: number, category: number): IRoomObject + { + const manager = this.getManager(category); + + if(!manager) return null; + + const object = manager.getObject(id); + + if(!object) return null; + + return object; + } + + public getRoomObjectsForCategory(category: number): IRoomObject[] + { + const manager = this.getManager(category); + + return (manager ? manager.objects.getValues() : []); + } + + public getRoomObjectByIndex(index: number, category: number): IRoomObject + { + const manager = this.getManager(category); + + if(!manager) return null; + + const object = manager.getObjectByIndex(index); + + if(!object) return null; + + return object; + } + + public createRoomObject(id: number, stateCount: number, type: string, category: number): IRoomObjectController + { + const manager = this.getManagerOrCreate(category); + + if(!manager) return null; + + const object = manager.createObject(id, stateCount, type); + + if(!object) return null; + + if(this._renderer) this._renderer.addObject(object); + + return object; + } + + public createRoomObjectAndInitalize(objectId: number, type: string, category: number): IRoomObject + { + if(!this._container) return null; + + return this._container.createRoomObjectAndInitalize(this._id, objectId, type, category); + } + + public removeRoomObject(id: number, category: number): void + { + const manager = this.getManager(category); + + if(!manager) return; + + const object = manager.getObject(id); + + if(!object) return; + + object.tearDown(); + + if(this._renderer) this._renderer.removeObject(object); + + manager.removeObject(id); + } + + public removeAllManagers(): void + { + for(const manager of this._managers.values()) + { + if(!manager) continue; + + if(this._renderer) + { + const objects = manager.objects; + + if(objects.length) + { + for(const object of objects.getValues()) + { + if(!object) continue; + + this._renderer.removeObject(object); + } + } + } + + manager.dispose(); + } + + this._managers.clear(); + } + + public addUpdateCategory(category: number): void + { + const index = this._updateCategories.indexOf(category); + + if(index >= 0) return; + + this._updateCategories.push(category); + } + + public removeUpdateCategory(category: number): void + { + const index = this._updateCategories.indexOf(category); + + if(index === -1) return; + + this._updateCategories.splice(index, 1); + } + + public update(time: number, update: boolean = false): void + { + for(const category of this._updateCategories) + { + const manager = this.getManager(category); + + if(!manager) continue; + + const objects = manager.objects; + + if(!objects.length) continue; + + for(const object of objects.getValues()) + { + if(!object) continue; + + const logic = object.logic; + + (logic && logic.update(time)); + } + } + + this._renderer && this._renderer.update(time, update); + } + + public hasUninitializedObjects(): boolean + { + for(const manager of this._managers.values()) + { + if(!manager) continue; + + for(const object of manager.objects.getValues()) + { + if(!object) continue; + + if(!object.isReady) return true; + } + } + + return false; + } + + public get id(): string + { + return this._id; + } + + public get container(): IRoomInstanceContainer + { + return this._container; + } + + public get renderer(): IRoomRendererBase + { + return this._renderer; + } + + public get managers(): Map + { + return this._managers; + } + + public get model(): IRoomObjectModel + { + return this._model; + } +} diff --git a/packages/room/src/RoomManager.ts b/packages/room/src/RoomManager.ts new file mode 100644 index 0000000..c4f00bc --- /dev/null +++ b/packages/room/src/RoomManager.ts @@ -0,0 +1,308 @@ +import { IGraphicAssetCollection, IRoomInstance, IRoomInstanceContainer, IRoomManager, IRoomManagerListener, IRoomObject, IRoomObjectController, IRoomObjectManager } from '@nitrots/api'; +import { GetEventDispatcher, RoomContentLoadedEvent } from '@nitrots/events'; +import { NitroLogger } from '@nitrots/utils'; +import { GetRoomContentLoader } from './GetRoomContentLoader'; +import { GetRoomObjectLogicFactory } from './GetRoomObjectLogicFactory'; +import { GetRoomObjectVisualizationFactory } from './GetRoomObjectVisualizationFactory'; +import { RoomInstance } from './RoomInstance'; +import { RoomObjectManager } from './RoomObjectManager'; + +export class RoomManager implements IRoomManager, IRoomInstanceContainer +{ + private _rooms: Map = new Map(); + private _updateCategories: number[] = []; + + private _listener: IRoomManagerListener; + + private _pendingContentTypes: string[] = []; + private _skipContentProcessing: boolean = false; + + constructor() + { + this.onRoomContentLoadedEvent = this.onRoomContentLoadedEvent.bind(this); + } + + public async init(listener: IRoomManagerListener): Promise + { + this._listener = listener; + + GetEventDispatcher().addEventListener(RoomContentLoadedEvent.RCLE_SUCCESS, this.onRoomContentLoadedEvent); + GetEventDispatcher().addEventListener(RoomContentLoadedEvent.RCLE_FAILURE, this.onRoomContentLoadedEvent); + GetEventDispatcher().addEventListener(RoomContentLoadedEvent.RCLE_CANCEL, this.onRoomContentLoadedEvent); + } + + public getRoomInstance(roomId: string): IRoomInstance + { + const existing = this._rooms.get(roomId); + + if(!existing) return null; + + return existing; + } + + public createRoomInstance(roomId: string): IRoomInstance + { + if(this._rooms.get(roomId)) return null; + + const instance = new RoomInstance(roomId, this); + + this._rooms.set(instance.id, instance); + + if(this._updateCategories.length) + { + for(const category of this._updateCategories) + { + instance.addUpdateCategory(category); + } + } + + return instance; + } + + public removeRoomInstance(roomId: string): boolean + { + const existing = this._rooms.get(roomId); + + if(!existing) return false; + + this._rooms.delete(roomId); + + existing.dispose(); + + return true; + } + + public createRoomObjectAndInitalize(roomId: string, objectId: number, type: string, category: number): IRoomObject + { + const instance = this.getRoomInstance(roomId); + + if(!instance) return null; + + let visualization = type; + let logic = type; + let assetName = type; + let asset: IGraphicAssetCollection = null; + let isLoading = false; + + if(GetRoomContentLoader().isLoaderType(type)) + { + asset = GetRoomContentLoader().getCollection(type); + + if(!asset) + { + isLoading = true; + + GetRoomContentLoader().downloadAsset(type); + + assetName = GetRoomContentLoader().getPlaceholderName(type); + asset = GetRoomContentLoader().getCollection(assetName); + + if(!asset) return null; + } + + visualization = asset.data.visualizationType; + logic = asset.data.logicType; + } + + const object = (instance.createRoomObject(objectId, 1, type, category) as IRoomObjectController); + + if(!object) return null; + + const visualizationInstance = GetRoomObjectVisualizationFactory().getVisualization(visualization); + + if(!visualizationInstance) + { + instance.removeRoomObject(objectId, category); + + return null; + } + + visualizationInstance.asset = asset; + + const visualizationData = GetRoomObjectVisualizationFactory().getVisualizationData(assetName, visualization, ((asset && asset.data) || null)); + + if(!visualizationData || !visualizationInstance.initialize(visualizationData)) + { + instance.removeRoomObject(objectId, category); + + return null; + } + + object.setVisualization(visualizationInstance); + + const logicInstance = GetRoomObjectLogicFactory().getLogic(logic); + + object.setLogic(logicInstance); + + if(logicInstance) + { + logicInstance.initialize((asset && asset.data) || null); + } + + if(!isLoading) object.isReady = true; + + GetRoomContentLoader().setRoomObjectRoomId(object, roomId); + + return object; + } + + private reinitializeRoomObjectsByType(type: string): void + { + if(!type || !GetRoomContentLoader()) return; + + const asset = GetRoomContentLoader().getCollection(type); + + if(!asset) return; + + const visualization = asset.data.visualizationType; + const logic = asset.data.logicType; + const visualizationData = GetRoomObjectVisualizationFactory().getVisualizationData(type, visualization, asset.data); + + for(const room of this._rooms.values()) + { + if(!room) continue; + + for(const [category, manager] of room.managers.entries()) + { + if(!manager) continue; + + for(const object of manager.objects.getValues()) + { + if(!object || object.type !== type) continue; + + const visualizationInstance = GetRoomObjectVisualizationFactory().getVisualization(visualization); + + if(visualizationInstance) + { + visualizationInstance.asset = asset; + + if(!visualizationData || !visualizationInstance.initialize(visualizationData)) + { + manager.removeObject(object.id); + } + else + { + object.setVisualization(visualizationInstance); + + const logicInstance = GetRoomObjectLogicFactory().getLogic(logic); + + object.setLogic(logicInstance); + + if(logicInstance) + { + logicInstance.initialize(asset.data); + } + + object.isReady = true; + + if(this._listener) this._listener.objectInitialized(room.id, object.id, category); + } + } + else + { + manager.removeObject(object.id); + } + } + } + } + } + + public addUpdateCategory(category: number): void + { + const index = this._updateCategories.indexOf(category); + + if(index >= 0) return; + + this._updateCategories.push(category); + + if(!this._rooms.size) return; + + for(const room of this._rooms.values()) + { + if(!room) continue; + + room.addUpdateCategory(category); + } + } + + public removeUpdateCategory(category: number): void + { + const index = this._updateCategories.indexOf(category); + + if(index === -1) return; + + this._updateCategories.splice(index, 1); + + if(!this._rooms.size) return; + + for(const room of this._rooms.values()) + { + if(!room) continue; + + room.removeUpdateCategory(category); + } + } + + private processPendingContentTypes(time: number): void + { + if(this._skipContentProcessing) + { + this._skipContentProcessing = false; + + return; + } + + while(this._pendingContentTypes.length) + { + const type = this._pendingContentTypes.shift(); + + const collection = GetRoomContentLoader().getCollection(type); + + if(!collection) + { + if(this._listener) + { + this._listener.initalizeTemporaryObjectsByType(type, false); + } + + NitroLogger.log('Invalid Collection', type); + + continue; + } + + this.reinitializeRoomObjectsByType(type); + + if(this._listener) this._listener.initalizeTemporaryObjectsByType(type, true); + } + } + + private onRoomContentLoadedEvent(event: RoomContentLoadedEvent): void + { + if(!GetRoomContentLoader()) return; + + const contentType = event.contentType; + + if(this._pendingContentTypes.indexOf(contentType) >= 0) return; + + this._pendingContentTypes.push(contentType); + } + + public update(time: number, update: boolean = false): void + { + this.processPendingContentTypes(time); + + if(!this._rooms.size) return; + + for(const room of this._rooms.values()) room && room.update(time, update); + } + + public createRoomObjectManager(category: number): IRoomObjectManager + { + return new RoomObjectManager(); + } + + public get rooms(): Map + { + return this._rooms; + } +} diff --git a/packages/room/src/RoomMessageHandler.ts b/packages/room/src/RoomMessageHandler.ts new file mode 100644 index 0000000..246702b --- /dev/null +++ b/packages/room/src/RoomMessageHandler.ts @@ -0,0 +1,960 @@ +import { AvatarGuideStatus, IConnection, IRoomCreator, IVector3D, LegacyDataType, ObjectRolling, PetType, RoomObjectType, RoomObjectUserType, RoomObjectVariable } from '@nitrots/api'; +import { DiceValueMessageEvent, FloorHeightMapEvent, FurnitureAliasesComposer, FurnitureAliasesEvent, FurnitureDataEvent, FurnitureFloorAddEvent, FurnitureFloorDataParser, FurnitureFloorEvent, FurnitureFloorRemoveEvent, FurnitureFloorUpdateEvent, FurnitureWallAddEvent, FurnitureWallDataParser, FurnitureWallEvent, FurnitureWallRemoveEvent, FurnitureWallUpdateEvent, GetCommunication, GetRoomEntryDataMessageComposer, GuideSessionEndedMessageEvent, GuideSessionErrorMessageEvent, GuideSessionStartedMessageEvent, IgnoreResultEvent, ItemDataUpdateMessageEvent, ObjectsDataUpdateEvent, ObjectsRollingEvent, OneWayDoorStatusMessageEvent, PetExperienceEvent, PetFigureUpdateEvent, RoomEntryTileMessageEvent, RoomEntryTileMessageParser, RoomHeightMapEvent, RoomHeightMapUpdateEvent, RoomPaintEvent, RoomReadyMessageEvent, RoomUnitChatEvent, RoomUnitChatShoutEvent, RoomUnitChatWhisperEvent, RoomUnitDanceEvent, RoomUnitEffectEvent, RoomUnitEvent, RoomUnitExpressionEvent, RoomUnitHandItemEvent, RoomUnitIdleEvent, RoomUnitInfoEvent, RoomUnitNumberEvent, RoomUnitRemoveEvent, RoomUnitStatusEvent, RoomUnitTypingEvent, RoomVisualizationSettingsEvent, UserInfoEvent, YouArePlayingGameEvent } from '@nitrots/communication'; +import { GetRoomSessionManager, GetSessionDataManager } from '@nitrots/session'; +import { Vector3d } from '@nitrots/utils'; +import { GetRoomEngine } from './GetRoomEngine'; +import { RoomVariableEnum } from './RoomVariableEnum'; +import { RoomPlaneParser } from './object/RoomPlaneParser'; +import { FurnitureStackingHeightMap, LegacyWallGeometry } from './utils'; + +export class RoomMessageHandler +{ + private _connection: IConnection = null; + private _roomEngine: IRoomCreator = null; + private _planeParser = new RoomPlaneParser(); + private _latestEntryTileEvent: RoomEntryTileMessageEvent = null; + + private _currentRoomId: number = 0; + private _ownUserId: number = 0; + private _initialConnection: boolean = true; + private _guideId: number = -1; + private _requesterId: number = -1; + + public async init(): Promise + { + this._connection = GetCommunication().connection; + this._roomEngine = GetRoomEngine(); + + this._connection.addMessageEvent(new UserInfoEvent(this.onUserInfoEvent.bind(this))); + this._connection.addMessageEvent(new RoomReadyMessageEvent(this.onRoomReadyMessageEvent.bind(this))); + this._connection.addMessageEvent(new RoomPaintEvent(this.onRoomPaintEvent.bind(this))); + this._connection.addMessageEvent(new FloorHeightMapEvent(this.onRoomModelEvent.bind(this))); + this._connection.addMessageEvent(new RoomHeightMapEvent(this.onRoomHeightMapEvent.bind(this))); + this._connection.addMessageEvent(new RoomHeightMapUpdateEvent(this.onRoomHeightMapUpdateEvent.bind(this))); + this._connection.addMessageEvent(new RoomVisualizationSettingsEvent(this.onRoomThicknessEvent.bind(this))); + this._connection.addMessageEvent(new RoomEntryTileMessageEvent(this.onRoomDoorEvent.bind(this))); + this._connection.addMessageEvent(new ObjectsRollingEvent(this.onRoomRollingEvent.bind(this))); + this._connection.addMessageEvent(new ObjectsDataUpdateEvent(this.onObjectsDataUpdateEvent.bind(this))); + this._connection.addMessageEvent(new FurnitureAliasesEvent(this.onFurnitureAliasesEvent.bind(this))); + this._connection.addMessageEvent(new FurnitureFloorAddEvent(this.onFurnitureFloorAddEvent.bind(this))); + this._connection.addMessageEvent(new FurnitureFloorEvent(this.onFurnitureFloorEvent.bind(this))); + this._connection.addMessageEvent(new FurnitureFloorRemoveEvent(this.onFurnitureFloorRemoveEvent.bind(this))); + this._connection.addMessageEvent(new FurnitureFloorUpdateEvent(this.onFurnitureFloorUpdateEvent.bind(this))); + this._connection.addMessageEvent(new FurnitureWallAddEvent(this.onFurnitureWallAddEvent.bind(this))); + this._connection.addMessageEvent(new FurnitureWallEvent(this.onFurnitureWallEvent.bind(this))); + this._connection.addMessageEvent(new FurnitureWallRemoveEvent(this.onFurnitureWallRemoveEvent.bind(this))); + this._connection.addMessageEvent(new FurnitureWallUpdateEvent(this.onFurnitureWallUpdateEvent.bind(this))); + this._connection.addMessageEvent(new FurnitureDataEvent(this.onFurnitureDataEvent.bind(this))); + this._connection.addMessageEvent(new ItemDataUpdateMessageEvent(this.onItemDataUpdateMessageEvent.bind(this))); + this._connection.addMessageEvent(new OneWayDoorStatusMessageEvent(this.onOneWayDoorStatusMessageEvent.bind(this))); + this._connection.addMessageEvent(new RoomUnitDanceEvent(this.onRoomUnitDanceEvent.bind(this))); + this._connection.addMessageEvent(new RoomUnitEffectEvent(this.onRoomUnitEffectEvent.bind(this))); + this._connection.addMessageEvent(new RoomUnitEvent(this.onRoomUnitEvent.bind(this))); + this._connection.addMessageEvent(new RoomUnitExpressionEvent(this.onRoomUnitExpressionEvent.bind(this))); + this._connection.addMessageEvent(new RoomUnitHandItemEvent(this.onRoomUnitHandItemEvent.bind(this))); + this._connection.addMessageEvent(new RoomUnitIdleEvent(this.onRoomUnitIdleEvent.bind(this))); + this._connection.addMessageEvent(new RoomUnitInfoEvent(this.onRoomUnitInfoEvent.bind(this))); + this._connection.addMessageEvent(new RoomUnitNumberEvent(this.onRoomUnitNumberEvent.bind(this))); + this._connection.addMessageEvent(new RoomUnitRemoveEvent(this.onRoomUnitRemoveEvent.bind(this))); + this._connection.addMessageEvent(new RoomUnitStatusEvent(this.onRoomUnitStatusEvent.bind(this))); + this._connection.addMessageEvent(new RoomUnitChatEvent(this.onRoomUnitChatEvent.bind(this))); + this._connection.addMessageEvent(new RoomUnitChatShoutEvent(this.onRoomUnitChatEvent.bind(this))); + this._connection.addMessageEvent(new RoomUnitChatWhisperEvent(this.onRoomUnitChatEvent.bind(this))); + this._connection.addMessageEvent(new RoomUnitTypingEvent(this.onRoomUnitTypingEvent.bind(this))); + this._connection.addMessageEvent(new PetFigureUpdateEvent(this.onPetFigureUpdateEvent.bind(this))); + this._connection.addMessageEvent(new PetExperienceEvent(this.onPetExperienceEvent.bind(this))); + this._connection.addMessageEvent(new YouArePlayingGameEvent(this.onYouArePlayingGameEvent.bind(this))); + this._connection.addMessageEvent(new DiceValueMessageEvent(this.onDiceValueMessageEvent.bind(this))); + this._connection.addMessageEvent(new IgnoreResultEvent(this.onIgnoreResultEvent.bind(this))); + this._connection.addMessageEvent(new GuideSessionStartedMessageEvent(this.onGuideSessionStartedMessageEvent.bind(this))); + this._connection.addMessageEvent(new GuideSessionEndedMessageEvent(this.onGuideSessionEndedMessageEvent.bind(this))); + this._connection.addMessageEvent(new GuideSessionErrorMessageEvent(this.onGuideSessionErrorMessageEvent.bind(this))); + } + + public setRoomId(id: number): void + { + if(this._currentRoomId !== 0) + { + if(this._roomEngine) this._roomEngine.destroyRoom(this._currentRoomId); + } + + this._currentRoomId = id; + this._latestEntryTileEvent = null; + } + + public clearRoomId(): void + { + this._currentRoomId = 0; + this._latestEntryTileEvent = null; + } + + private onUserInfoEvent(event: UserInfoEvent): void + { + if(!(event instanceof UserInfoEvent) || !event.connection) return; + + const parser = event.getParser(); + + if(!parser) return; + + this._ownUserId = parser.userInfo.userId; + } + + private onRoomReadyMessageEvent(event: RoomReadyMessageEvent): void + { + const parser = event.getParser(); + + if(this._currentRoomId !== parser.roomId) + { + this.setRoomId(parser.roomId); + } + + if(this._roomEngine) + { + this._roomEngine.setRoomInstanceModelName(parser.roomId, parser.name); + } + + if(this._initialConnection) + { + event.connection.send(new FurnitureAliasesComposer()); + + this._initialConnection = false; + + return; + } + + event.connection.send(new GetRoomEntryDataMessageComposer()); + } + + private onRoomPaintEvent(event: RoomPaintEvent): void + { + if(!(event instanceof RoomPaintEvent)) return; + + const parser = event.getParser(); + + if(!parser) return; + + const floorType = parser.floorType; + const wallType = parser.wallType; + const landscapeType = parser.landscapeType; + + if(this._roomEngine) + { + this._roomEngine.updateRoomInstancePlaneType(this._currentRoomId, floorType, wallType, landscapeType); + } + } + + private onRoomModelEvent(event: FloorHeightMapEvent): void + { + if(!(event instanceof FloorHeightMapEvent) || !event.connection || !this._roomEngine) return; + + const parser = event.getParser(); + + if(!parser) return; + + const wallGeometry = this._roomEngine.getLegacyWallGeometry(this._currentRoomId); + + if(!wallGeometry) return; + + this._planeParser.reset(); + + const width = parser.width; + const height = parser.height; + + this._planeParser.initializeTileMap(width, height); + + let entryTile: RoomEntryTileMessageParser = null; + + if(this._latestEntryTileEvent) entryTile = this._latestEntryTileEvent.getParser(); + + let doorX = -1; + let doorY = -1; + let doorZ = 0; + let doorDirection = 0; + + let y = 0; + + while(y < height) + { + let x = 0; + + while(x < width) + { + const tileHeight = parser.getHeight(x, y); + + if(((((y > 0) && (y < (height - 1))) || ((x > 0) && (x < (width - 1)))) && (!(tileHeight == RoomPlaneParser.TILE_BLOCKED))) && ((entryTile == null) || ((x == entryTile.x) && (y == entryTile.y)))) + { + if(((parser.getHeight(x, (y - 1)) == RoomPlaneParser.TILE_BLOCKED) && (parser.getHeight((x - 1), y) == RoomPlaneParser.TILE_BLOCKED)) && (parser.getHeight(x, (y + 1)) == RoomPlaneParser.TILE_BLOCKED)) + { + doorX = (x + 0.5); + doorY = y; + doorZ = tileHeight; + doorDirection = 90; + } + + if(((parser.getHeight(x, (y - 1)) == RoomPlaneParser.TILE_BLOCKED) && (parser.getHeight((x - 1), y) == RoomPlaneParser.TILE_BLOCKED)) && (parser.getHeight((x + 1), y) == RoomPlaneParser.TILE_BLOCKED)) + { + doorX = x; + doorY = (y + 0.5); + doorZ = tileHeight; + doorDirection = 180; + } + } + + this._planeParser.setTileHeight(x, y, tileHeight); + + x++; + } + + y++; + } + + this._planeParser.setTileHeight(Math.floor(doorX), Math.floor(doorY), doorZ); + this._planeParser.initializeFromTileData(parser.wallHeight); + this._planeParser.setTileHeight(Math.floor(doorX), Math.floor(doorY), (doorZ + this._planeParser.wallHeight)); + + wallGeometry.scale = LegacyWallGeometry.DEFAULT_SCALE; + wallGeometry.initialize(width, height, this._planeParser.floorHeight); + + let heightIterator = (parser.height - 1); + + while(heightIterator >= 0) + { + let widthIterator = (parser.width - 1); + + while(widthIterator >= 0) + { + wallGeometry.setHeight(widthIterator, heightIterator, this._planeParser.getTileHeight(widthIterator, heightIterator)); + widthIterator--; + } + + heightIterator--; + } + + const roomMap = this._planeParser.getMapData(); + + roomMap.doors.push({ + x: doorX, + y: doorY, + z: doorZ, + dir: doorDirection + }); + + this._roomEngine.createRoomInstance(this._currentRoomId, roomMap); + } + + private onRoomHeightMapEvent(event: RoomHeightMapEvent): void + { + if(!(event instanceof RoomHeightMapEvent) || !event.connection || !this._roomEngine) return; + + const parser = event.getParser(); + + if(!parser) return; + + const width = parser.width; + const height = parser.height; + const heightMap = new FurnitureStackingHeightMap(width, height); + + let y = 0; + + while(y < height) + { + let x = 0; + + while(x < width) + { + heightMap.setTileHeight(x, y, parser.getTileHeight(x, y)); + heightMap.setStackingBlocked(x, y, parser.getStackingBlocked(x, y)); + heightMap.setIsRoomTile(x, y, parser.isRoomTile(x, y)); + + x++; + } + + y++; + } + + this._roomEngine.setFurnitureStackingHeightMap(this._currentRoomId, heightMap); + } + + private onRoomHeightMapUpdateEvent(event: RoomHeightMapUpdateEvent): void + { + if(!(event instanceof RoomHeightMapUpdateEvent) || !event.connection || !this._roomEngine) return; + + const parser = event.getParser(); + + if(!parser) return; + + const heightMap = this._roomEngine.getFurnitureStackingHeightMap(this._currentRoomId); + + if(!heightMap) return; + + while(parser.next()) + { + heightMap.setTileHeight(parser.x, parser.y, parser.tileHeight()); + heightMap.setStackingBlocked(parser.x, parser.y, parser.isStackingBlocked()); + heightMap.setIsRoomTile(parser.x, parser.y, parser.isRoomTile()); + } + + this._roomEngine.refreshTileObjectMap(this._currentRoomId, 'RoomMessageHandler.onRoomHeightMapUpdateEvent()'); + } + + private onRoomThicknessEvent(event: RoomVisualizationSettingsEvent): void + { + if(!(event instanceof RoomVisualizationSettingsEvent)) return; + + const parser = event.getParser(); + + if(!parser) return; + + const visibleWall = !parser.hideWalls; + const visibleFloor = true; + const thicknessWall = parser.thicknessWall; + const thicknessFloor = parser.thicknessFloor; + + if(this._roomEngine) + { + this._roomEngine.updateRoomInstancePlaneVisibility(this._currentRoomId, visibleWall, visibleFloor); + this._roomEngine.updateRoomInstancePlaneThickness(this._currentRoomId, thicknessWall, thicknessFloor); + } + } + + private onRoomDoorEvent(event: RoomEntryTileMessageEvent): void + { + if(!(event instanceof RoomEntryTileMessageEvent)) return; + + this._latestEntryTileEvent = event; + } + + private onRoomRollingEvent(event: ObjectsRollingEvent): void + { + if(!(event instanceof ObjectsRollingEvent) || !event.connection || !this._roomEngine) return; + + const parser = event.getParser(); + + this._roomEngine.updateRoomObjectFloor(this._currentRoomId, parser.rollerId, null, null, 1, null); + this._roomEngine.updateRoomObjectFloor(this._currentRoomId, parser.rollerId, null, null, 2, null); + + const furnitureRolling = parser.itemsRolling; + + if(furnitureRolling && furnitureRolling.length) + { + for(const rollData of furnitureRolling) + { + if(!rollData) continue; + + this._roomEngine.rollRoomObjectFloor(this._currentRoomId, rollData.id, rollData.location, rollData.targetLocation); + } + } + + const unitRollData = parser.unitRolling; + + if(unitRollData) + { + this._roomEngine.updateRoomObjectUserLocation(this._currentRoomId, unitRollData.id, unitRollData.location, unitRollData.targetLocation); + + const object = this._roomEngine.getRoomObjectUser(this._currentRoomId, unitRollData.id); + + if(object && object.type !== RoomObjectUserType.MONSTER_PLANT) + { + let posture = 'std'; + + switch(unitRollData.movementType) + { + case ObjectRolling.MOVE: + posture = 'mv'; + break; + case ObjectRolling.SLIDE: + posture = 'std'; + break; + } + + this._roomEngine.updateRoomObjectUserPosture(this._currentRoomId, unitRollData.id, posture); + } + } + } + + private onObjectsDataUpdateEvent(event: ObjectsDataUpdateEvent): void + { + if(!(event instanceof ObjectsDataUpdateEvent) || !event.connection || !this._roomEngine) return; + + const parser = event.getParser(); + + if(!parser) return; + + for(const object of parser.objects) + { + this._roomEngine.updateRoomObjectFloor(this._currentRoomId, object.id, null, null, object.state, object.data); + } + } + + private onFurnitureAliasesEvent(event: FurnitureAliasesEvent): void + { + if(!(event instanceof FurnitureAliasesEvent) || !event.connection || !this._roomEngine) return; + + const alises = event.getParser().aliases; + + this._connection.send(new GetRoomEntryDataMessageComposer()); + } + + private onFurnitureFloorAddEvent(event: FurnitureFloorAddEvent): void + { + if(!(event instanceof FurnitureFloorAddEvent) || !event.connection || !this._roomEngine) return; + + const item = event.getParser().item; + + if(!item) return; + + this.addRoomObjectFurnitureFloor(this._currentRoomId, item); + } + + private onFurnitureFloorEvent(event: FurnitureFloorEvent): void + { + if(!(event instanceof FurnitureFloorEvent) || !event.connection || !this._roomEngine) return; + + const parser = event.getParser(); + + if(!parser) return; + + const totalObjects = parser.items.length; + + let iterator = 0; + + while(iterator < totalObjects) + { + const object = parser.items[iterator]; + + if(object) this.addRoomObjectFurnitureFloor(this._currentRoomId, object); + + iterator++; + } + } + + private onFurnitureFloorRemoveEvent(event: FurnitureFloorRemoveEvent): void + { + if(!(event instanceof FurnitureFloorRemoveEvent) || !event.connection || !this._roomEngine) return; + + const parser = event.getParser(); + + if(!parser) return; + + if(parser.delay > 0) + { + setTimeout(() => + { + this._roomEngine.removeRoomObjectFloor(this._currentRoomId, parser.itemId, (parser.isExpired) ? -1 : parser.userId, true); + }, parser.delay); + } + else + { + this._roomEngine.removeRoomObjectFloor(this._currentRoomId, parser.itemId, (parser.isExpired) ? -1 : parser.userId, true); + } + } + + private onFurnitureFloorUpdateEvent(event: FurnitureFloorUpdateEvent): void + { + if(!(event instanceof FurnitureFloorUpdateEvent) || !event.connection || !this._roomEngine) return; + + const item = event.getParser().item; + + if(!item) return; + + const location: IVector3D = new Vector3d(item.x, item.y, item.z); + const direction: IVector3D = new Vector3d(item.direction); + + this._roomEngine.updateRoomObjectFloor(this._currentRoomId, item.itemId, location, direction, item.data.state, item.data, item.extra); + this._roomEngine.updateRoomObjectFloorHeight(this._currentRoomId, item.itemId, item.stackHeight); + this._roomEngine.updateRoomObjectFloorExpiration(this._currentRoomId, item.itemId, item.expires); + } + + private onFurnitureWallAddEvent(event: FurnitureWallAddEvent): void + { + if(!(event instanceof FurnitureWallAddEvent) || !event.connection || !this._roomEngine) return; + + const data = event.getParser().item; + + if(!data) return; + + this.addRoomObjectFurnitureWall(this._currentRoomId, data); + } + + private onFurnitureWallEvent(event: FurnitureWallEvent): void + { + if(!(event instanceof FurnitureWallEvent) || !event.connection || !this._roomEngine) return; + + const parser = event.getParser(); + + if(!parser) return; + + const totalObjects = parser.items.length; + + let iterator = 0; + + while(iterator < totalObjects) + { + const data = parser.items[iterator]; + + if(data) this.addRoomObjectFurnitureWall(this._currentRoomId, data); + + iterator++; + } + } + + private onFurnitureWallRemoveEvent(event: FurnitureWallRemoveEvent): void + { + if(!(event instanceof FurnitureWallRemoveEvent) || !event.connection || !this._roomEngine) return; + + const parser = event.getParser(); + + if(!parser) return; + + this._roomEngine.removeRoomObjectWall(this._currentRoomId, parser.itemId, parser.userId); + } + + private onFurnitureWallUpdateEvent(event: FurnitureWallUpdateEvent): void + { + if(!(event instanceof FurnitureWallUpdateEvent) || !event.connection || !this._roomEngine) return; + + const wallGeometry = this._roomEngine.getLegacyWallGeometry(this._currentRoomId); + + if(!wallGeometry) return; + + const item = event.getParser().item; + + if(!item) return; + + const location = wallGeometry.getLocation(item.width, item.height, item.localX, item.localY, item.direction); + const direction = new Vector3d(wallGeometry.getDirection(item.direction)); + + this._roomEngine.updateRoomObjectWall(this._currentRoomId, item.itemId, location, direction, item.state, item.stuffData); + this._roomEngine.updateRoomObjectWallExpiration(this._currentRoomId, item.itemId, item.secondsToExpiration); + } + + private onFurnitureDataEvent(event: FurnitureDataEvent): void + { + if(!(event instanceof FurnitureDataEvent) || !event.connection || !this._roomEngine) return; + + const parser = event.getParser(); + + this._roomEngine.updateRoomObjectFloor(this._currentRoomId, parser.furnitureId, null, null, parser.objectData.state, parser.objectData); + } + + private onItemDataUpdateMessageEvent(event: ItemDataUpdateMessageEvent): void + { + if(!(event instanceof ItemDataUpdateMessageEvent) || !event.connection || !this._roomEngine) return; + + const parser = event.getParser(); + + this._roomEngine.updateRoomObjectWallItemData(this._currentRoomId, parser.furnitureId, parser.data); + } + + private onOneWayDoorStatusMessageEvent(event: OneWayDoorStatusMessageEvent): void + { + if(!(event instanceof OneWayDoorStatusMessageEvent) || !event.connection || !this._roomEngine) return; + + const parser = event.getParser(); + + this._roomEngine.updateRoomObjectFloor(this._currentRoomId, parser.itemId, null, null, parser.state, new LegacyDataType()); + } + + private onDiceValueMessageEvent(event: DiceValueMessageEvent): void + { + if(!(event instanceof DiceValueMessageEvent) || !event.connection || !this._roomEngine) return; + + const parser = event.getParser(); + + this._roomEngine.updateRoomObjectFloor(this._currentRoomId, parser.itemId, null, null, parser.value, new LegacyDataType()); + } + + private onRoomUnitDanceEvent(event: RoomUnitDanceEvent): void + { + if(!(event instanceof RoomUnitDanceEvent) || !event.connection || !this._roomEngine) return; + + this._roomEngine.updateRoomObjectUserAction(this._currentRoomId, event.getParser().unitId, RoomObjectVariable.FIGURE_DANCE, event.getParser().danceId); + } + + private onRoomUnitEffectEvent(event: RoomUnitEffectEvent): void + { + if(!(event instanceof RoomUnitEffectEvent) || !event.connection || !this._roomEngine) return; + + this._roomEngine.updateRoomObjectUserEffect(this._currentRoomId, event.getParser().unitId, event.getParser().effectId, event.getParser().delay); + } + + private onRoomUnitEvent(event: RoomUnitEvent): void + { + if(!(event instanceof RoomUnitEvent) || !event.connection || !this._roomEngine) return; + + const users = event.getParser().users; + + if(!users || !users.length) return; + + for(const user of users) + { + if(!user) continue; + + const location = new Vector3d(user.x, user.y, user.z); + const direction = new Vector3d(user.dir); + + this._roomEngine.addRoomObjectUser(this._currentRoomId, user.roomIndex, location, direction, user.dir, user.userType, user.figure); + + if(user.webID === this._ownUserId) + { + this._roomEngine.setRoomSessionOwnUser(this._currentRoomId, user.roomIndex); + this._roomEngine.updateRoomObjectUserOwn(this._currentRoomId, user.roomIndex); + } + + this._roomEngine.updateRoomObjectUserFigure(this._currentRoomId, user.roomIndex, user.figure, user.sex, user.subType, user.isRiding); + + if(RoomObjectUserType.getTypeString(user.userType) === RoomObjectUserType.PET) + { + if(this._roomEngine.getPetTypeId(user.figure) === PetType.MONSTERPLANT) + { + this._roomEngine.updateRoomObjectUserPosture(this._currentRoomId, user.roomIndex, user.petPosture); + } + } + + this._roomEngine.updateRoomObjectUserAction(this._currentRoomId, user.roomIndex, RoomObjectVariable.FIGURE_IS_MUTED, (GetSessionDataManager().isUserIgnored(user.name) ? 1 : 0)); + } + + this.updateGuideMarker(); + } + + private onRoomUnitExpressionEvent(event: RoomUnitExpressionEvent): void + { + if(!(event instanceof RoomUnitExpressionEvent) || !event.connection || !this._roomEngine) return; + + this._roomEngine.updateRoomObjectUserAction(this._currentRoomId, event.getParser().unitId, RoomObjectVariable.FIGURE_EXPRESSION, event.getParser().expression); + } + + private onRoomUnitHandItemEvent(event: RoomUnitHandItemEvent): void + { + if(!(event instanceof RoomUnitHandItemEvent) || !event.connection || !this._roomEngine) return; + + this._roomEngine.updateRoomObjectUserAction(this._currentRoomId, event.getParser().unitId, RoomObjectVariable.FIGURE_CARRY_OBJECT, event.getParser().handId); + } + + private onRoomUnitIdleEvent(event: RoomUnitIdleEvent): void + { + if(!(event instanceof RoomUnitIdleEvent) || !event.connection || !this._roomEngine) return; + + this._roomEngine.updateRoomObjectUserAction(this._currentRoomId, event.getParser().unitId, RoomObjectVariable.FIGURE_SLEEP, (event.getParser().isIdle ? 1 : 0)); + } + + private onRoomUnitInfoEvent(event: RoomUnitInfoEvent): void + { + if(!(event instanceof RoomUnitInfoEvent) || !event.connection || !this._roomEngine) return; + + this._roomEngine.updateRoomObjectUserFigure(this._currentRoomId, event.getParser().unitId, event.getParser().figure, event.getParser().gender); + } + + private onRoomUnitNumberEvent(event: RoomUnitNumberEvent): void + { + if(!(event instanceof RoomUnitNumberEvent) || !event.connection || !this._roomEngine) return; + + const parser = event.getParser(); + + if(!parser) return; + + this._roomEngine.updateRoomObjectUserAction(this._currentRoomId, parser.unitId, RoomObjectVariable.FIGURE_NUMBER_VALUE, parser.value); + } + + private onRoomUnitRemoveEvent(event: RoomUnitRemoveEvent): void + { + if(!(event instanceof RoomUnitRemoveEvent) || !event.connection || !this._roomEngine) return; + + this._roomEngine.removeRoomObjectUser(this._currentRoomId, event.getParser().unitId); + + this.updateGuideMarker(); + } + + private onRoomUnitStatusEvent(event: RoomUnitStatusEvent): void + { + if(!(event instanceof RoomUnitStatusEvent) || !event.connection || !this._roomEngine) return; + + const statuses = event.getParser().statuses; + + if(!statuses || !statuses.length) return; + + const roomInstance = this._roomEngine.getRoomInstance(this._currentRoomId); + + if(!roomInstance) return; + + const zScale = (roomInstance.model.getValue(RoomVariableEnum.ROOM_Z_SCALE) || 1); + + for(const status of statuses) + { + if(!status) continue; + + let height = status.height; + + if(height) height = (height / zScale); + + const location = new Vector3d(status.x, status.y, (status.z + height)); + const direction = new Vector3d(status.direction); + + let goal: IVector3D = null; + + if(status.didMove) goal = new Vector3d(status.targetX, status.targetY, status.targetZ); + + this._roomEngine.updateRoomObjectUserLocation(this._currentRoomId, status.id, location, goal, status.canStandUp, height, direction, status.headDirection); + this._roomEngine.updateRoomObjectUserFlatControl(this._currentRoomId, status.id, null); + + let isPosture = true; + let postureUpdate = false; + let postureType = RoomObjectVariable.STD; + let parameter = ''; + + if(status.actions && status.actions.length) + { + for(const action of status.actions) + { + if(!action) continue; + + switch(action.action) + { + case 'flatctrl': + this._roomEngine.updateRoomObjectUserFlatControl(this._currentRoomId, status.id, action.value); + break; + case 'sign': + if(status.actions.length === 1) isPosture = false; + + this._roomEngine.updateRoomObjectUserAction(this._currentRoomId, status.id, RoomObjectVariable.FIGURE_SIGN, parseInt(action.value)); + break; + case 'gst': + if(status.actions.length === 1) isPosture = false; + + this._roomEngine.updateRoomObjectUserPetGesture(this._currentRoomId, status.id, action.value); + break; + case 'wav': + case 'mv': + postureUpdate = true; + postureType = action.action; + parameter = action.value; + break; + case 'trd': break; + default: + postureUpdate = true; + postureType = action.action; + parameter = action.value; + break; + } + } + } + + if(postureUpdate) this._roomEngine.updateRoomObjectUserPosture(this._currentRoomId, status.id, postureType, parameter); + else if(isPosture) this._roomEngine.updateRoomObjectUserPosture(this._currentRoomId, status.id, RoomObjectVariable.STD, ''); + } + + this.updateGuideMarker(); + } + + private onRoomUnitChatEvent(event: RoomUnitChatEvent): void + { + if(!event.connection || !this._roomEngine) return; + + const parser = event.getParser(); + + if(!parser) return; + + this._roomEngine.updateRoomObjectUserGesture(this._currentRoomId, parser.roomIndex, parser.gesture); + this._roomEngine.updateRoomObjectUserAction(this._currentRoomId, parser.roomIndex, RoomObjectVariable.FIGURE_TALK, (parser.message.length / 10)); + } + + private onRoomUnitTypingEvent(event: RoomUnitTypingEvent): void + { + if(!(event instanceof RoomUnitTypingEvent) || !event.connection || !this._roomEngine) return; + + this._roomEngine.updateRoomObjectUserAction(this._currentRoomId, event.getParser().unitId, RoomObjectVariable.FIGURE_IS_TYPING, event.getParser().isTyping ? 1 : 0); + } + + private onPetFigureUpdateEvent(event: PetFigureUpdateEvent): void + { + if(!(event instanceof PetFigureUpdateEvent) || !event.connection || !this._roomEngine) return; + + const parser = event.getParser(); + + if(!parser) return; + + this._roomEngine.updateRoomObjectUserFigure(this._currentRoomId, parser.roomIndex, parser.figureData.figuredata, '', '', parser.isRiding); + } + + private onPetExperienceEvent(event: PetExperienceEvent): void + { + const parser = event.getParser(); + + if(!parser) return; + + this._roomEngine.updateRoomObjectUserAction(this._currentRoomId, parser.roomIndex, RoomObjectVariable.FIGURE_GAINED_EXPERIENCE, parser.gainedExperience); + } + + private onYouArePlayingGameEvent(event: YouArePlayingGameEvent): void + { + if(!event) return; + + const parser = event.getParser(); + + if(!parser) return; + + this._roomEngine.setRoomEngineGameMode(this._currentRoomId, parser.isPlaying); + } + + private addRoomObjectFurnitureFloor(roomId: number, data: FurnitureFloorDataParser): void + { + if(!data || !this._roomEngine) return; + + const location = new Vector3d(data.x, data.y, data.z); + const direction = new Vector3d(data.direction); + + if(data.spriteName) + { + this._roomEngine.addFurnitureFloorByTypeName(roomId, data.itemId, data.spriteName, location, direction, data.state, data.data, data.extra, data.expires, data.usagePolicy, data.userId, data.username, true, true, data.stackHeight); + } + else + { + this._roomEngine.addFurnitureFloor(roomId, data.itemId, data.spriteId, location, direction, data.state, data.data, data.extra, data.expires, data.usagePolicy, data.userId, data.username, true, true, data.stackHeight); + } + } + + private addRoomObjectFurnitureWall(roomId: number, data: FurnitureWallDataParser): void + { + if(!data || !this._roomEngine) return; + + const wallGeometry = this._roomEngine.getLegacyWallGeometry(roomId); + + if(!wallGeometry) return; + + let location: IVector3D = null; + + if(!data.isOldFormat) + { + location = wallGeometry.getLocation(data.width, data.height, data.localX, data.localY, data.direction); + } + else + { + //location = wallGeometry.getLocationOldFormat(data.y, data.z, data.direction); + } + + const direction = new Vector3d(wallGeometry.getDirection(data.direction)); + + this._roomEngine.addFurnitureWall(roomId, data.itemId, data.spriteId, location, direction, data.state, data.stuffData, data.secondsToExpiration, data.usagePolicy, data.userId, data.username); + } + + private onIgnoreResultEvent(event: IgnoreResultEvent): void + { + if(!event) return; + + const parser = event.getParser(); + + if(!parser) return; + + const roomSession = GetRoomSessionManager().getSession(this._currentRoomId); + + if(!roomSession) return; + + const userData = roomSession.userDataManager.getUserDataByName(parser.name); + + if(!userData) return; + + switch(parser.result) + { + case 1: + case 2: + this._roomEngine.updateRoomObjectUserAction(this._currentRoomId, userData.roomIndex, RoomObjectVariable.FIGURE_IS_MUTED, 1); + return; + case 3: + this._roomEngine.updateRoomObjectUserAction(this._currentRoomId, userData.roomIndex, RoomObjectVariable.FIGURE_IS_MUTED, 0); + return; + } + } + + private onGuideSessionStartedMessageEvent(event: GuideSessionStartedMessageEvent): void + { + const parser = event.getParser(); + + this._guideId = parser.guideUserId; + this._requesterId = parser.requesterUserId; + + this.updateGuideMarker(); + } + + private onGuideSessionEndedMessageEvent(k: GuideSessionEndedMessageEvent): void + { + this.removeGuideMarker(); + } + + private onGuideSessionErrorMessageEvent(k: GuideSessionErrorMessageEvent): void + { + this.removeGuideMarker(); + } + + private updateGuideMarker(): void + { + const userId = GetSessionDataManager().userId; + + this.setUserGuideStatus(this._guideId, ((this._requesterId === userId) ? AvatarGuideStatus.GUIDE : AvatarGuideStatus.NONE)); + this.setUserGuideStatus(this._requesterId, ((this._guideId === userId) ? AvatarGuideStatus.REQUESTER : AvatarGuideStatus.NONE)); + } + + private removeGuideMarker(): void + { + this.setUserGuideStatus(this._guideId, AvatarGuideStatus.NONE); + this.setUserGuideStatus(this._requesterId, AvatarGuideStatus.NONE); + + this._guideId = -1; + this._requesterId = -1; + } + + private setUserGuideStatus(userId: number, status: number): void + { + const roomSession = GetRoomSessionManager().getSession(this._currentRoomId); + + if(!roomSession) return; + + const userData = roomSession.userDataManager.getDataByType(userId, RoomObjectType.USER); + + if(!userData) return; + + this._roomEngine.updateRoomObjectUserAction(this._currentRoomId, userData.roomIndex, RoomObjectVariable.FIGURE_GUIDE_STATUS, status); + } + + // public _SafeStr_10580(event:_SafeStr_2242): void + // { + // var arrayIndex: number; + // var discoColours:Array; + // var discoTimer:Timer; + // var eventParser:_SafeStr_4576 = (event.parser as _SafeStr_4576); + // switch (eventParser._SafeStr_7025) + // { + // case 0: + // _SafeStr_4588.init(250, 5000); + // _SafeStr_4588._SafeStr_6766(); + // return; + // case 1: + // _SafeStr_4231.init(250, 5000); + // _SafeStr_4231._SafeStr_6766(); + // return; + // case 2: + // NitroEventDispatcher.dispatchEvent(new _SafeStr_2821(this._SafeStr_10593, -1, true)); + // return; + // case 3: + // arrayIndex = 0; + // discoColours = [29371, 16731195, 16764980, 0x99FF00, 29371, 16731195, 16764980, 0x99FF00, 0]; + // discoTimer = new Timer(1000, (discoColours.length + 1)); + // discoTimer.addEventListener(TimerEvent.TIMER, function (k:TimerEvent): void + // { + // if (arrayIndex == discoColours.length) + // { + // _SafeStr_10592._SafeStr_21164(_SafeStr_10593, discoColours[arrayIndex++], 176, true); + // } else + // { + // _SafeStr_10592._SafeStr_21164(_SafeStr_10593, discoColours[arrayIndex++], 176, false); + // }; + // }); + // discoTimer.start(); + // return; + // }; + // } + + public get currentRoomId(): number + { + return this._currentRoomId; + } +} diff --git a/packages/room/src/RoomObjectEventHandler.ts b/packages/room/src/RoomObjectEventHandler.ts new file mode 100644 index 0000000..3a4c08b --- /dev/null +++ b/packages/room/src/RoomObjectEventHandler.ts @@ -0,0 +1,2190 @@ +import { IFurnitureStackingHeightMap, ILegacyWallGeometry, IObjectData, IRoomCanvasMouseListener, IRoomEngineServices, IRoomGeometry, IRoomObject, IRoomObjectController, IRoomObjectEventManager, ISelectedRoomObjectData, IVector3D, MouseEventType, RoomObjectCategory, RoomObjectOperationType, RoomObjectPlacementSource, RoomObjectType, RoomObjectUserType, RoomObjectVariable } from '@nitrots/api'; +import { BotPlaceComposer, FurnitureColorWheelComposer, FurnitureDiceActivateComposer, FurnitureDiceDeactivateComposer, FurnitureFloorUpdateComposer, FurnitureGroupInfoComposer, FurnitureMultiStateComposer, FurnitureOneWayDoorComposer, FurniturePickupComposer, FurniturePlaceComposer, FurniturePostItPlaceComposer, FurnitureRandomStateComposer, FurnitureWallMultiStateComposer, FurnitureWallUpdateComposer, GetCommunication, GetItemDataComposer, GetResolutionAchievementsMessageComposer, PetMoveComposer, PetPlaceComposer, RemoveWallItemComposer, RoomUnitLookComposer, RoomUnitWalkComposer, SetItemDataMessageComposer, SetObjectDataMessageComposer } from '@nitrots/communication'; +import { GetConfiguration } from '@nitrots/configuration'; +import { GetEventDispatcher, RoomEngineDimmerStateEvent, RoomEngineObjectEvent, RoomEngineObjectPlacedEvent, RoomEngineObjectPlacedOnUserEvent, RoomEngineObjectPlaySoundEvent, RoomEngineRoomAdEvent, RoomEngineSamplePlaybackEvent, RoomEngineTriggerWidgetEvent, RoomEngineUseProductEvent, RoomObjectBadgeAssetEvent, RoomObjectDataRequestEvent, RoomObjectDimmerStateUpdateEvent, RoomObjectEvent, RoomObjectFloorHoleEvent, RoomObjectFurnitureActionEvent, RoomObjectHSLColorEnableEvent, RoomObjectHSLColorEnabledEvent, RoomObjectMouseEvent, RoomObjectMoveEvent, RoomObjectPlaySoundIdEvent, RoomObjectRoomAdEvent, RoomObjectSamplePlaybackEvent, RoomObjectSoundMachineEvent, RoomObjectStateChangedEvent, RoomObjectTileMouseEvent, RoomObjectWallMouseEvent, RoomObjectWidgetRequestEvent, RoomSpriteMouseEvent } from '@nitrots/events'; +import { GetRoomSessionManager, GetSessionDataManager } from '@nitrots/session'; +import { CreateLinkEvent, NitroLogger, RoomId, Vector3d } from '@nitrots/utils'; +import { RoomEnterEffect, RoomObjectUpdateMessage } from '../../room'; +import { ObjectAvatarSelectedMessage, ObjectDataUpdateMessage, ObjectSelectedMessage, ObjectTileCursorUpdateMessage, ObjectVisibilityUpdateMessage } from './messages'; +import { SelectedRoomObjectData } from './utils'; + +export class RoomObjectEventHandler implements IRoomCanvasMouseListener, IRoomObjectEventManager +{ + private _eventIds: Map> = new Map(); + + private _selectedAvatarId: number = -1; + private _selectedObjectId: number = -1; + private _selectedObjectCategory: number = -2; + private _whereYouClickIsWhereYouGo: boolean = true; + private _objectPlacementSource: string = null; + + constructor( + private readonly _roomEngine: IRoomEngineServices) + { + GetEventDispatcher().addEventListener(RoomEngineObjectEvent.ADDED, event => this.onRoomEngineObjectEvent(event)); + } + + private onRoomEngineObjectEvent(event: RoomEngineObjectEvent): void + { + let selectedData = this.getSelectedRoomObjectData(event.roomId); + + if(!selectedData) return; + + if((selectedData.operation === RoomObjectOperationType.OBJECT_PLACE) && (selectedData.id === event.objectId)) + { + const roomObject = this._roomEngine.getRoomObject(event.roomId, selectedData.id, selectedData.category); + + if(roomObject && roomObject.model) + { + if(selectedData.category === RoomObjectCategory.FLOOR) + { + const allowedDirections = roomObject.model.getValue(RoomObjectVariable.FURNITURE_ALLOWED_DIRECTIONS); + + if(allowedDirections && allowedDirections.length) + { + const direction = new Vector3d(allowedDirections[0]); + + roomObject.setDirection(direction); + + this.updateSelectedObjectData(event.roomId, selectedData.id, selectedData.category, selectedData.loc, direction, selectedData.operation, selectedData.typeId, selectedData.instanceData, selectedData.stuffData, selectedData.state, selectedData.animFrame, selectedData.posture); + + selectedData = this.getSelectedRoomObjectData(event.roomId); + + if(!selectedData) return; + } + } + } + + this.setFurnitureAlphaMultiplier(roomObject, 0.5); + } + } + + public processRoomCanvasMouseEvent(event: RoomSpriteMouseEvent, object: IRoomObject, geometry: IRoomGeometry): void + { + if(!event || !object) return; + + if(RoomEnterEffect.isRunning()) return; + + const type = object.type; + + let category = this._roomEngine.getRoomObjectCategoryForType(type); + + if((category !== RoomObjectCategory.ROOM) && (!this._roomEngine.isPlayingGame() || category !== RoomObjectCategory.UNIT)) category = RoomObjectCategory.MINIMUM; + + const _local_7 = this.getMouseEventId(category, event.type); + + if(_local_7 === event.eventId) + { + if((event.type === MouseEventType.MOUSE_CLICK) || (event.type === MouseEventType.DOUBLE_CLICK) || (event.type === MouseEventType.MOUSE_DOWN) || (event.type === MouseEventType.MOUSE_UP) || (event.type === MouseEventType.MOUSE_MOVE)) return; + } + else + { + if(event.eventId) + { + this.setMouseEventId(category, event.type, event.eventId); + } + } + + if(object.mouseHandler) object.mouseHandler.mouseEvent(event, geometry); + } + + public processRoomObjectPlacement(placementSource: string, roomId: number, id: number, category: number, typeId: number, extra: string = null, stuffData: IObjectData = null, state: number = -1, frameNumber: number = -1, posture: string = null): boolean + { + this._objectPlacementSource = placementSource; + + const location = new Vector3d(-100, -100); + const direction = new Vector3d(0); + + this.setSelectedRoomObjectData(roomId, id, category, location, direction, RoomObjectOperationType.OBJECT_PLACE, typeId, extra, stuffData, state, frameNumber, posture); + + if(this._roomEngine) + { + this._roomEngine.setObjectMoverIconSprite(typeId, category, false, extra, stuffData, state, frameNumber, posture); + this._roomEngine.setObjectMoverIconSpriteVisible(false); + } + + return true; + } + + public cancelRoomObjectInsert(k: number): boolean + { + this.resetSelectedObjectData(k); + + return true; + } + + private getMouseEventId(k: number, _arg_2: string): string + { + const existing = this._eventIds.get(k); + + if(!existing) return null; + + return (existing.get(_arg_2) || null); + } + + private setMouseEventId(k: number, _arg_2: string, _arg_3: string): void + { + let existing = this._eventIds.get(k); + + if(!existing) + { + existing = new Map(); + + this._eventIds.set(k, existing); + } + + existing.delete(_arg_2); + existing.set(_arg_2, _arg_3); + } + + + public handleRoomObjectEvent(event: RoomObjectEvent, roomId: number): void + { + if(!event) return; + + if(event instanceof RoomObjectMouseEvent) + { + this.handleRoomObjectMouseEvent(event, roomId); + + return; + } + + switch(event.type) + { + case RoomObjectStateChangedEvent.STATE_CHANGE: + case RoomObjectStateChangedEvent.STATE_RANDOM: + this.onRoomObjectStateChangedEvent((event as RoomObjectStateChangedEvent), roomId); + return; + case RoomObjectDimmerStateUpdateEvent.DIMMER_STATE: + this.onRoomObjectDimmerStateUpdateEvent((event as RoomObjectDimmerStateUpdateEvent), roomId); + return; + case RoomObjectMoveEvent.POSITION_CHANGED: + case RoomObjectMoveEvent.OBJECT_REMOVED: + this.handleSelectedObjectRemove((event as RoomObjectMoveEvent), roomId); + return; + case RoomObjectWidgetRequestEvent.OPEN_WIDGET: + case RoomObjectWidgetRequestEvent.CLOSE_WIDGET: + case RoomObjectWidgetRequestEvent.OPEN_FURNI_CONTEXT_MENU: + case RoomObjectWidgetRequestEvent.CLOSE_FURNI_CONTEXT_MENU: + case RoomObjectWidgetRequestEvent.PLACEHOLDER: + case RoomObjectWidgetRequestEvent.CREDITFURNI: + case RoomObjectWidgetRequestEvent.STACK_HEIGHT: + case RoomObjectWidgetRequestEvent.EXTERNAL_IMAGE: + case RoomObjectWidgetRequestEvent.STICKIE: + case RoomObjectWidgetRequestEvent.PRESENT: + case RoomObjectWidgetRequestEvent.TROPHY: + case RoomObjectWidgetRequestEvent.TEASER: + case RoomObjectWidgetRequestEvent.ECOTRONBOX: + case RoomObjectWidgetRequestEvent.DIMMER: + case RoomObjectWidgetRequestEvent.WIDGET_REMOVE_DIMMER: + case RoomObjectWidgetRequestEvent.CLOTHING_CHANGE: + case RoomObjectWidgetRequestEvent.JUKEBOX_PLAYLIST_EDITOR: + case RoomObjectWidgetRequestEvent.MANNEQUIN: + case RoomObjectWidgetRequestEvent.PET_PRODUCT_MENU: + case RoomObjectWidgetRequestEvent.GUILD_FURNI_CONTEXT_MENU: + case RoomObjectWidgetRequestEvent.MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG: + case RoomObjectWidgetRequestEvent.PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG: + case RoomObjectWidgetRequestEvent.BACKGROUND_COLOR: + case RoomObjectWidgetRequestEvent.MYSTERYBOX_OPEN_DIALOG: + case RoomObjectWidgetRequestEvent.EFFECTBOX_OPEN_DIALOG: + case RoomObjectWidgetRequestEvent.MYSTERYTROPHY_OPEN_DIALOG: + case RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_OPEN: + case RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_ENGRAVING: + case RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_FAILED: + case RoomObjectWidgetRequestEvent.FRIEND_FURNITURE_CONFIRM: + case RoomObjectWidgetRequestEvent.FRIEND_FURNITURE_ENGRAVING: + case RoomObjectWidgetRequestEvent.BADGE_DISPLAY_ENGRAVING: + case RoomObjectWidgetRequestEvent.HIGH_SCORE_DISPLAY: + case RoomObjectWidgetRequestEvent.HIDE_HIGH_SCORE_DISPLAY: + case RoomObjectWidgetRequestEvent.INERNAL_LINK: + case RoomObjectWidgetRequestEvent.ROOM_LINK: + case RoomObjectWidgetRequestEvent.YOUTUBE: + this.onRoomObjectWidgetRequestEvent((event as RoomObjectWidgetRequestEvent), roomId); + return; + case RoomObjectFurnitureActionEvent.DICE_ACTIVATE: + case RoomObjectFurnitureActionEvent.DICE_OFF: + case RoomObjectFurnitureActionEvent.USE_HABBOWHEEL: + case RoomObjectFurnitureActionEvent.STICKIE: + case RoomObjectFurnitureActionEvent.ENTER_ONEWAYDOOR: + this.onRoomObjectFurnitureActionEvent((event as RoomObjectFurnitureActionEvent), roomId); + return; + case RoomObjectFurnitureActionEvent.SOUND_MACHINE_INIT: + case RoomObjectFurnitureActionEvent.SOUND_MACHINE_START: + case RoomObjectFurnitureActionEvent.SOUND_MACHINE_STOP: + case RoomObjectFurnitureActionEvent.SOUND_MACHINE_DISPOSE: + this.handleObjectSoundMachineEvent(event, roomId); + return; + case RoomObjectFurnitureActionEvent.JUKEBOX_INIT: + case RoomObjectFurnitureActionEvent.JUKEBOX_START: + case RoomObjectFurnitureActionEvent.JUKEBOX_MACHINE_STOP: + case RoomObjectFurnitureActionEvent.JUKEBOX_DISPOSE: + this.handleObjectJukeboxEvent(event, roomId); + return; + case RoomObjectFloorHoleEvent.ADD_HOLE: + case RoomObjectFloorHoleEvent.REMOVE_HOLE: + this.onRoomObjectFloorHoleEvent((event as RoomObjectFloorHoleEvent), roomId); + return; + case RoomObjectRoomAdEvent.ROOM_AD_FURNI_CLICK: + case RoomObjectRoomAdEvent.ROOM_AD_FURNI_DOUBLE_CLICK: + case RoomObjectRoomAdEvent.ROOM_AD_TOOLTIP_SHOW: + case RoomObjectRoomAdEvent.ROOM_AD_TOOLTIP_HIDE: + case RoomObjectRoomAdEvent.ROOM_AD_LOAD_IMAGE: + this.onRoomObjectRoomAdEvent((event as RoomObjectRoomAdEvent), roomId); + return; + case RoomObjectBadgeAssetEvent.LOAD_BADGE: + this.onRoomObjectBadgeAssetEvent((event as RoomObjectBadgeAssetEvent), roomId); + return; + case RoomObjectFurnitureActionEvent.MOUSE_ARROW: + case RoomObjectFurnitureActionEvent.MOUSE_BUTTON: + this.handleMousePointer((event as RoomObjectFurnitureActionEvent), roomId); + return; + case RoomObjectPlaySoundIdEvent.PLAY_SOUND: + case RoomObjectPlaySoundIdEvent.PLAY_SOUND_AT_PITCH: + this.handleRoomObjectPlaySoundEvent((event as RoomObjectPlaySoundIdEvent), roomId); + return; + case RoomObjectSamplePlaybackEvent.ROOM_OBJECT_INITIALIZED: + case RoomObjectSamplePlaybackEvent.ROOM_OBJECT_DISPOSED: + case RoomObjectSamplePlaybackEvent.PLAY_SAMPLE: + case RoomObjectSamplePlaybackEvent.CHANGE_PITCH: + this.handleRoomObjectSamplePlaybackEvent((event as RoomObjectSamplePlaybackEvent), roomId); + return; + case RoomObjectHSLColorEnableEvent.ROOM_BACKGROUND_COLOR: + this.onHSLColorEnableEvent((event as RoomObjectHSLColorEnableEvent), roomId); + return; + case RoomObjectDataRequestEvent.RODRE_CURRENT_USER_ID: + case RoomObjectDataRequestEvent.RODRE_URL_PREFIX: + this.onRoomObjectDataRequestEvent((event as RoomObjectDataRequestEvent), roomId); + return; + default: + NitroLogger.warn('Unhandled Event', event.constructor.name, 'Object ID', event.object.id); + return; + } + } + + private handleRoomObjectMouseEvent(event: RoomObjectMouseEvent, roomId: number): void + { + if(!event || !event.type) return; + + switch(event.type) + { + case RoomObjectMouseEvent.CLICK: + this.handleRoomObjectMouseClickEvent(event, roomId); + return; + case RoomObjectMouseEvent.DOUBLE_CLICK: + this.handleRoomObjectMouseDoubleClickEvent(event, roomId); + return; + case RoomObjectMouseEvent.MOUSE_MOVE: + this.handleRoomObjectMouseMoveEvent(event, roomId); + return; + case RoomObjectMouseEvent.MOUSE_DOWN: + this.handleRoomObjectMouseDownEvent(event, roomId); + return; + case RoomObjectMouseEvent.MOUSE_DOWN_LONG: + this.handleRoomObjectMouseDownLongEvent(event, roomId); + return; + case RoomObjectMouseEvent.MOUSE_ENTER: + this.handleRoomObjectMouseEnterEvent(event, roomId); + return; + case RoomObjectMouseEvent.MOUSE_LEAVE: + this.handleRoomObjectMouseLeaveEvent(event, roomId); + return; + } + } + + private handleRoomObjectMouseClickEvent(event: RoomObjectMouseEvent, roomId: number): void + { + if(!event) return; + + let operation = RoomObjectOperationType.OBJECT_UNDEFINED; + + const selectedData = this.getSelectedRoomObjectData(roomId); + + if(selectedData) operation = selectedData.operation; + + let didWalk = false; + let didMove = false; + + if(this._whereYouClickIsWhereYouGo) + { + if(!operation || (operation === RoomObjectOperationType.OBJECT_UNDEFINED)) + { + didWalk = this.handleMoveTargetFurni(roomId, event); + } + } + + const category = this._roomEngine.getRoomObjectCategoryForType(event.objectType); + + switch(operation) + { + case RoomObjectOperationType.OBJECT_MOVE: + if(category === RoomObjectCategory.ROOM) + { + if(selectedData) + { + this.modifyRoomObject(roomId, selectedData.id, selectedData.category, RoomObjectOperationType.OBJECT_MOVE_TO); + } + } + + else if(category === RoomObjectCategory.UNIT) + { + if(selectedData && (event.objectType === RoomObjectUserType.MONSTER_PLANT)) + { + this.modifyRoomObject(roomId, selectedData.id, selectedData.category, RoomObjectOperationType.OBJECT_MOVE_TO); + } + + if(event.eventId) this.setMouseEventId(RoomObjectCategory.ROOM, MouseEventType.MOUSE_CLICK, event.eventId); + + this.placeObjectOnUser(roomId, event.objectId, category); + } + + didMove = true; + + if(event.objectId !== -1) this.setSelectedObject(roomId, event.objectId, category); + + break; + case RoomObjectOperationType.OBJECT_PLACE: + if(category === RoomObjectCategory.ROOM) + { + this.placeObject(roomId, (event instanceof RoomObjectTileMouseEvent), (event instanceof RoomObjectWallMouseEvent)); + } + + else if(category === RoomObjectCategory.UNIT) + { + switch(event.objectType) + { + case RoomObjectUserType.MONSTER_PLANT: + case RoomObjectUserType.RENTABLE_BOT: + this.placeObject(roomId, (event instanceof RoomObjectTileMouseEvent), (event instanceof RoomObjectWallMouseEvent)); + break; + default: + if(event.eventId) + { + this.setMouseEventId(RoomObjectCategory.ROOM, MouseEventType.MOUSE_CLICK, event.eventId); + } + + this.placeObjectOnUser(roomId, event.objectId, category); + break; + } + } + break; + case RoomObjectOperationType.OBJECT_UNDEFINED: + if(category === RoomObjectCategory.ROOM) + { + if(!didWalk && (event instanceof RoomObjectTileMouseEvent)) this.onRoomObjectTileMouseEvent(roomId, event); + } + else + { + this.setSelectedObject(roomId, event.objectId, category); + + didMove = false; + + if(category === RoomObjectCategory.UNIT) + { + if(event.ctrlKey && !event.altKey && !event.shiftKey && (event.objectType === RoomObjectUserType.RENTABLE_BOT)) + { + this.modifyRoomObject(roomId, event.objectId, category, RoomObjectOperationType.OBJECT_PICKUP_BOT); + } + + else if(event.ctrlKey && !event.altKey && !event.shiftKey && (event.objectType === RoomObjectUserType.MONSTER_PLANT)) + { + this.modifyRoomObject(roomId, event.objectId, category, RoomObjectOperationType.OBJECT_PICKUP_PET); + } + + else if(!event.ctrlKey && !event.altKey && event.shiftKey && (event.objectType === RoomObjectUserType.MONSTER_PLANT)) + { + this.modifyRoomObject(roomId, event.objectId, category, RoomObjectOperationType.OBJECT_ROTATE_POSITIVE); + } + + if(!this._roomEngine.isPlayingGame()) + { + didWalk = true; + } + else + { + didMove = true; + } + } + + else if((category === RoomObjectCategory.FLOOR) || (category === RoomObjectCategory.WALL)) + { + if(event.altKey || event.ctrlKey || event.shiftKey) + { + if(!event.ctrlKey && !event.altKey && event.shiftKey) + { + if(category === RoomObjectCategory.FLOOR) + { + if(GetEventDispatcher()) + { + GetEventDispatcher().dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.REQUEST_ROTATE, roomId, event.objectId, category)); + } + } + } + + else if(event.ctrlKey && !event.altKey && !event.shiftKey) + { + this.modifyRoomObject(roomId, event.objectId, category, RoomObjectOperationType.OBJECT_PICKUP); + } + + if(!this._roomEngine.isPlayingGame()) + { + didWalk = true; + } + else + { + didMove = true; + } + } + } + + if(event.eventId) + { + if(didWalk) + { + this.setMouseEventId(RoomObjectCategory.ROOM, MouseEventType.MOUSE_CLICK, event.eventId); + } + + if(didMove) + { + this.setMouseEventId(RoomObjectCategory.MINIMUM, MouseEventType.MOUSE_CLICK, event.eventId); + } + } + } + break; + } + + if(category === RoomObjectCategory.ROOM) + { + const _local_15 = this.getMouseEventId(RoomObjectCategory.MINIMUM, MouseEventType.MOUSE_CLICK); + const _local_16 = this.getMouseEventId(RoomObjectCategory.UNIT, MouseEventType.MOUSE_CLICK); + + if((_local_15 !== event.eventId) && (_local_16 !== event.eventId) && !didMove) + { + this.deselectObject(roomId); + + if(GetEventDispatcher()) GetEventDispatcher().dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.DESELECTED, roomId, -1, RoomObjectCategory.MINIMUM)); + + this.setSelectedAvatar(roomId, 0, false); + } + } + } + + private handleRoomObjectMouseDoubleClickEvent(event: RoomObjectMouseEvent, roomId: number): void + { + const id = event.objectId; + const type = event.objectType; + const category = this._roomEngine.getRoomObjectCategoryForType(type); + + if(GetEventDispatcher()) + { + GetEventDispatcher().dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.DOUBLE_CLICK, roomId, id, category)); + } + } + + private handleRoomObjectMouseMoveEvent(event: RoomObjectMouseEvent, roomId: number): void + { + if(!event) return; + + let operation = RoomObjectOperationType.OBJECT_UNDEFINED; + + const selectedData = this.getSelectedRoomObjectData(roomId); + + if(selectedData) operation = selectedData.operation; + + const category = this._roomEngine.getRoomObjectCategoryForType(event.objectType); + + if(this._roomEngine) + { + const roomCursor = this._roomEngine.getRoomObjectCursor(roomId); + + if(roomCursor && roomCursor.logic) + { + let newEvent: ObjectTileCursorUpdateMessage = null; + + if(event instanceof RoomObjectTileMouseEvent) + { + newEvent = this.handleMouseOverTile(event, roomId); + } + + else if(event.object && (event.object.id !== -1)) + { + if(this._whereYouClickIsWhereYouGo) + { + newEvent = this.handleMouseOverObject(category, roomId, event); + } + } + + else + { + newEvent = new ObjectTileCursorUpdateMessage(null, 0, false, event.eventId); + } + + roomCursor.processUpdateMessage(newEvent); + } + } + + switch(operation) + { + case RoomObjectOperationType.OBJECT_MOVE: + if(category === RoomObjectCategory.ROOM) this.handleObjectMove(event, roomId); + + return; + case RoomObjectOperationType.OBJECT_PLACE: + if(category === RoomObjectCategory.ROOM) this.handleObjectPlace(event, roomId); + + return; + } + } + + private handleRoomObjectMouseDownEvent(event: RoomObjectMouseEvent, roomId: number): void + { + if(!event) return; + + let operation = RoomObjectOperationType.OBJECT_UNDEFINED; + + const selectedData = this.getSelectedRoomObjectData(roomId); + + if(selectedData) operation = selectedData.operation; + + const category = this._roomEngine.getRoomObjectCategoryForType(event.objectType); + + switch(operation) + { + case RoomObjectOperationType.OBJECT_UNDEFINED: + if((category === RoomObjectCategory.FLOOR) || (category === RoomObjectCategory.WALL) || (event.objectType === RoomObjectUserType.MONSTER_PLANT)) + { + if((event.altKey && !event.ctrlKey && !event.shiftKey) || this.decorateModeMove(event)) + { + if(GetEventDispatcher()) GetEventDispatcher().dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.REQUEST_MOVE, roomId, event.objectId, category)); + } + } + return; + } + } + + private handleRoomObjectMouseDownLongEvent(event: RoomObjectMouseEvent, roomId: number): void + { + if(!event) return; + + let operation = RoomObjectOperationType.OBJECT_UNDEFINED; + + const selectedData = this.getSelectedRoomObjectData(roomId); + + if(selectedData) operation = selectedData.operation; + + const category = this._roomEngine.getRoomObjectCategoryForType(event.objectType); + + switch(operation) + { + case RoomObjectOperationType.OBJECT_UNDEFINED: + if((category === RoomObjectCategory.FLOOR) || (category === RoomObjectCategory.WALL) || (event.objectType === RoomObjectUserType.MONSTER_PLANT)) + { + if((!event.ctrlKey && !event.shiftKey) || this.decorateModeMove(event)) + { + if(GetEventDispatcher()) GetEventDispatcher().dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.REQUEST_MANIPULATION, roomId, event.objectId, category)); + } + } + return; + } + } + + private handleRoomObjectMouseEnterEvent(event: RoomObjectMouseEvent, roomId: number): void + { + const id = event.objectId; + const type = event.objectType; + const category = this._roomEngine.getRoomObjectCategoryForType(type); + + if(GetEventDispatcher()) + { + GetEventDispatcher().dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.MOUSE_ENTER, roomId, id, category)); + } + } + + private handleRoomObjectMouseLeaveEvent(event: RoomObjectMouseEvent, roomId: number): void + { + const id = event.objectId; + const type = event.objectType; + const category = this._roomEngine.getRoomObjectCategoryForType(type); + + if(category !== RoomObjectCategory.ROOM) + { + if(category === RoomObjectCategory.UNIT) + { + const cursor = this._roomEngine.getRoomObjectCursor(roomId); + + if(cursor) cursor.processUpdateMessage(new ObjectDataUpdateMessage(0, null)); + } + } + + if(GetEventDispatcher()) + { + GetEventDispatcher().dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.MOUSE_LEAVE, roomId, id, category)); + } + + return; + } + + private onRoomObjectStateChangedEvent(event: RoomObjectStateChangedEvent, roomId: number): void + { + if(!event) return; + + switch(event.type) + { + case RoomObjectStateChangedEvent.STATE_CHANGE: + this.changeObjectState(roomId, event.object.id, event.object.type, event.state, false); + return; + case RoomObjectStateChangedEvent.STATE_RANDOM: + this.changeObjectState(roomId, event.object.id, event.object.type, event.state, true); + return; + } + } + + private onRoomObjectDimmerStateUpdateEvent(event: RoomObjectDimmerStateUpdateEvent, roomId: number): void + { + if(!event) return; + + switch(event.type) + { + case RoomObjectDimmerStateUpdateEvent.DIMMER_STATE: + GetEventDispatcher().dispatchEvent(new RoomEngineDimmerStateEvent(roomId, event.state, event.presetId, event.effectId, event.color, event.brightness)); + return; + } + } + + private handleSelectedObjectRemove(event: RoomObjectMoveEvent, roomId: number): void + { + if(!event || !this._roomEngine) return; + + switch(event.type) + { + case RoomObjectMoveEvent.POSITION_CHANGED: { + const objectId = event.objectId; + const objectType = event.objectType; + const objectCategory = this._roomEngine.getRoomObjectCategoryForType(objectType); + const object = this._roomEngine.getRoomObject(roomId, objectId, objectCategory); + const selectionArrow = this._roomEngine.getRoomObjectSelectionArrow(roomId); + + if(object && selectionArrow && selectionArrow.logic) + { + const location = object.getLocation(); + + selectionArrow.logic.processUpdateMessage(new RoomObjectUpdateMessage(location, null)); + } + return; + } + case RoomObjectMoveEvent.OBJECT_REMOVED: + this.setSelectedAvatar(roomId, 0, false); + return; + } + } + + private onRoomObjectWidgetRequestEvent(event: RoomObjectWidgetRequestEvent, roomId: number): void + { + if(!event || !this._roomEngine) return; + + const objectId = event.objectId; + const objectType = event.objectType; + const objectCategory = this._roomEngine.getRoomObjectCategoryForType(objectType); + + if(RoomId.isRoomPreviewerId(roomId)) return; + + switch(event.type) + { + case RoomObjectWidgetRequestEvent.OPEN_WIDGET: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.OPEN_WIDGET, roomId, objectId, objectCategory, ((event.object as IRoomObjectController).logic.widget))); + return; + case RoomObjectWidgetRequestEvent.CLOSE_WIDGET: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.CLOSE_WIDGET, roomId, objectId, objectCategory, ((event.object as IRoomObjectController).logic.widget))); + return; + case RoomObjectWidgetRequestEvent.OPEN_FURNI_CONTEXT_MENU: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.OPEN_FURNI_CONTEXT_MENU, roomId, objectId, objectCategory, ((event.object as IRoomObjectController).logic.contextMenu))); + return; + case RoomObjectWidgetRequestEvent.CLOSE_FURNI_CONTEXT_MENU: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.CLOSE_FURNI_CONTEXT_MENU, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.PLACEHOLDER: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_PLACEHOLDER, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.CREDITFURNI: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_CREDITFURNI, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.STACK_HEIGHT: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_STACK_HEIGHT, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.EXTERNAL_IMAGE: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_EXTERNAL_IMAGE, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.STICKIE: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_STICKIE, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.PRESENT: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_PRESENT, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.TROPHY: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_TROPHY, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.TEASER: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_TEASER, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.ECOTRONBOX: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_ECOTRONBOX, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.DIMMER: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_DIMMER, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.WIDGET_REMOVE_DIMMER: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REMOVE_DIMMER, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.CLOTHING_CHANGE: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_CLOTHING_CHANGE, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.JUKEBOX_PLAYLIST_EDITOR: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_PLAYLIST_EDITOR, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.MANNEQUIN: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_MANNEQUIN, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.PET_PRODUCT_MENU: + GetEventDispatcher().dispatchEvent(new RoomEngineUseProductEvent(RoomEngineUseProductEvent.USE_PRODUCT_FROM_ROOM, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.GUILD_FURNI_CONTEXT_MENU: + GetCommunication().connection.send(new FurnitureGroupInfoComposer(event.objectId, event.object.model.getValue(RoomObjectVariable.FURNITURE_GUILD_CUSTOMIZED_GUILD_ID))); + return; + case RoomObjectWidgetRequestEvent.MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.BACKGROUND_COLOR: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_BACKGROUND_COLOR, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.MYSTERYBOX_OPEN_DIALOG: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_MYSTERYBOX_OPEN_DIALOG, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.EFFECTBOX_OPEN_DIALOG: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_EFFECTBOX_OPEN_DIALOG, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.MYSTERYTROPHY_OPEN_DIALOG: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_MYSTERYTROPHY_OPEN_DIALOG, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_OPEN: + GetCommunication().connection.send(new GetResolutionAchievementsMessageComposer(event.objectId, 0)); + return; + case RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_ENGRAVING: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_FAILED: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_FAILED, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.FRIEND_FURNITURE_CONFIRM: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_FRIEND_FURNITURE_CONFIRM, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.FRIEND_FURNITURE_ENGRAVING: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_FRIEND_FURNITURE_ENGRAVING, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.BADGE_DISPLAY_ENGRAVING: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_BADGE_DISPLAY_ENGRAVING, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.HIGH_SCORE_DISPLAY: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIGH_SCORE_DISPLAY, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.HIDE_HIGH_SCORE_DISPLAY: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIDE_HIGH_SCORE_DISPLAY, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.INERNAL_LINK: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_INTERNAL_LINK, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.ROOM_LINK: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_ROOM_LINK, roomId, objectId, objectCategory)); + return; + case RoomObjectWidgetRequestEvent.YOUTUBE: + GetEventDispatcher().dispatchEvent(new RoomEngineTriggerWidgetEvent(RoomEngineTriggerWidgetEvent.REQUEST_YOUTUBE, roomId, objectId, objectCategory)); + return; + } + } + + private onRoomObjectFurnitureActionEvent(event: RoomObjectFurnitureActionEvent, roomId: number): void + { + if(!event) return; + + this.useObject(roomId, event.object.id, event.object.type, event.type); + } + + private handleObjectSoundMachineEvent(event: RoomObjectEvent, roomId: number): void + { + if(!event) return; + + const objectCategory = this._roomEngine.getRoomObjectCategoryForType(event.objectType); + const selectedData = this.getSelectedRoomObjectData(roomId); + + if(selectedData) + { + if((selectedData.category === objectCategory) && (selectedData.id === event.objectId)) + { + if(selectedData.operation === RoomObjectOperationType.OBJECT_PLACE) return; + } + } + + switch(event.type) + { + case RoomObjectFurnitureActionEvent.SOUND_MACHINE_INIT: + GetEventDispatcher().dispatchEvent(new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.SOUND_MACHINE_INIT, roomId, event.objectId, objectCategory)); + return; + case RoomObjectFurnitureActionEvent.SOUND_MACHINE_START: + GetEventDispatcher().dispatchEvent(new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.SOUND_MACHINE_SWITCHED_ON, roomId, event.objectId, objectCategory)); + return; + case RoomObjectFurnitureActionEvent.SOUND_MACHINE_STOP: + GetEventDispatcher().dispatchEvent(new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.SOUND_MACHINE_SWITCHED_OFF, roomId, event.objectId, objectCategory)); + return; + case RoomObjectFurnitureActionEvent.SOUND_MACHINE_DISPOSE: + GetEventDispatcher().dispatchEvent(new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.SOUND_MACHINE_DISPOSE, roomId, event.objectId, objectCategory)); + return; + } + } + + private handleObjectJukeboxEvent(event: RoomObjectEvent, roomId: number): void + { + if(!event) return; + + const objectCategory = this._roomEngine.getRoomObjectCategoryForType(event.objectType); + const selectedData = this.getSelectedRoomObjectData(roomId); + + if(selectedData) + { + if((selectedData.category === objectCategory) && (selectedData.id === event.objectId)) + { + if(selectedData.operation === RoomObjectOperationType.OBJECT_PLACE) return; + } + } + + switch(event.type) + { + case RoomObjectFurnitureActionEvent.JUKEBOX_INIT: + GetEventDispatcher().dispatchEvent(new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.JUKEBOX_INIT, roomId, event.objectId, objectCategory)); + return; + case RoomObjectFurnitureActionEvent.JUKEBOX_START: + GetEventDispatcher().dispatchEvent(new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.JUKEBOX_SWITCHED_ON, roomId, event.objectId, objectCategory)); + return; + case RoomObjectFurnitureActionEvent.JUKEBOX_MACHINE_STOP: + GetEventDispatcher().dispatchEvent(new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.JUKEBOX_SWITCHED_OFF, roomId, event.objectId, objectCategory)); + return; + case RoomObjectFurnitureActionEvent.JUKEBOX_DISPOSE: + GetEventDispatcher().dispatchEvent(new RoomObjectSoundMachineEvent(RoomObjectSoundMachineEvent.JUKEBOX_DISPOSE, roomId, event.objectId, objectCategory)); + return; + } + } + + private onRoomObjectFloorHoleEvent(event: RoomObjectFloorHoleEvent, roomId: number): void + { + if(!event) return; + + switch(event.type) + { + case RoomObjectFloorHoleEvent.ADD_HOLE: + this._roomEngine.addRoomInstanceFloorHole(roomId, event.objectId); + return; + case RoomObjectFloorHoleEvent.REMOVE_HOLE: + this._roomEngine.removeRoomInstanceFloorHole(roomId, event.objectId); + return; + } + } + + private onRoomObjectRoomAdEvent(event: RoomObjectRoomAdEvent, roomId: number): void + { + if(!event) return; + + let eventType: string = null; + + switch(event.type) + { + case RoomObjectRoomAdEvent.ROOM_AD_FURNI_CLICK: + GetEventDispatcher().dispatchEvent(event); + + if(event.clickUrl && (event.clickUrl.length > 0)) + { + CreateLinkEvent(event.clickUrl); + } + + eventType = RoomEngineRoomAdEvent.FURNI_CLICK; + break; + case RoomObjectRoomAdEvent.ROOM_AD_FURNI_DOUBLE_CLICK: + if(event.clickUrl && (event.clickUrl.length > 0)) + { + const catalogPage = 'CATALOG_PAGE'; + + if(event.clickUrl.indexOf(catalogPage) === 0) CreateLinkEvent(event.clickUrl.substr(catalogPage.length)); + } + + eventType = RoomEngineRoomAdEvent.FURNI_DOUBLE_CLICK; + break; + case RoomObjectRoomAdEvent.ROOM_AD_TOOLTIP_SHOW: + eventType = RoomEngineRoomAdEvent.TOOLTIP_SHOW; + break; + case RoomObjectRoomAdEvent.ROOM_AD_TOOLTIP_HIDE: + eventType = RoomEngineRoomAdEvent.TOOLTIP_HIDE; + break; + } + + if(eventType) GetEventDispatcher().dispatchEvent(new RoomEngineObjectEvent(eventType, roomId, event.objectId, this._roomEngine.getRoomObjectCategoryForType(event.objectType))); + } + + private onRoomObjectBadgeAssetEvent(event: RoomObjectBadgeAssetEvent, roomId: number): void + { + if(!event || !this._roomEngine) return; + + switch(event.type) + { + case RoomObjectBadgeAssetEvent.LOAD_BADGE: { + const objectId = event.objectId; + const objectType = event.objectType; + const objectCategory = this._roomEngine.getRoomObjectCategoryForType(objectType); + + this._roomEngine.loadRoomObjectBadgeImage(roomId, objectId, objectCategory, event.badgeId, event.groupBadge); + return; + } + } + } + + private handleMousePointer(event: RoomObjectFurnitureActionEvent, roomId: number): void + { + if(!event) return; + + this._roomEngine.updateMousePointer(event.type, event.objectId, event.objectType); + } + + private handleRoomObjectPlaySoundEvent(event: RoomObjectPlaySoundIdEvent, roomId: number): void + { + const objectCategory = this._roomEngine.getRoomObjectCategoryForType(event.objectType); + + switch(event.type) + { + case RoomObjectPlaySoundIdEvent.PLAY_SOUND: + GetEventDispatcher().dispatchEvent(new RoomEngineObjectPlaySoundEvent(RoomEngineObjectPlaySoundEvent.PLAY_SOUND, roomId, event.objectId, objectCategory, event.soundId, event.pitch)); + return; + case RoomObjectPlaySoundIdEvent.PLAY_SOUND_AT_PITCH: + GetEventDispatcher().dispatchEvent(new RoomEngineObjectPlaySoundEvent(RoomEngineObjectPlaySoundEvent.PLAY_SOUND_AT_PITCH, roomId, event.objectId, objectCategory, event.soundId, event.pitch)); + return; + } + } + + private handleRoomObjectSamplePlaybackEvent(event: RoomObjectSamplePlaybackEvent, roomId: number): void + { + if(!event) return; + + const objectCategory = this._roomEngine.getRoomObjectCategoryForType(event.objectType); + + switch(event.type) + { + case RoomObjectSamplePlaybackEvent.ROOM_OBJECT_INITIALIZED: + GetEventDispatcher().dispatchEvent(new RoomEngineSamplePlaybackEvent(RoomEngineSamplePlaybackEvent.ROOM_OBJECT_INITIALIZED, roomId, event.objectId, objectCategory, event.sampleId, event.pitch)); + break; + case RoomObjectSamplePlaybackEvent.ROOM_OBJECT_DISPOSED: + GetEventDispatcher().dispatchEvent(new RoomEngineSamplePlaybackEvent(RoomEngineSamplePlaybackEvent.ROOM_OBJECT_DISPOSED, roomId, event.objectId, objectCategory, event.sampleId, event.pitch)); + break; + case RoomObjectSamplePlaybackEvent.PLAY_SAMPLE: + GetEventDispatcher().dispatchEvent(new RoomEngineSamplePlaybackEvent(RoomEngineSamplePlaybackEvent.PLAY_SAMPLE, roomId, event.objectId, objectCategory, event.sampleId, event.pitch)); + break; + case RoomObjectSamplePlaybackEvent.CHANGE_PITCH: + GetEventDispatcher().dispatchEvent(new RoomEngineSamplePlaybackEvent(RoomEngineSamplePlaybackEvent.CHANGE_PITCH, roomId, event.objectId, objectCategory, event.sampleId, event.pitch)); + break; + } + } + + private onHSLColorEnableEvent(event: RoomObjectHSLColorEnableEvent, roomId: number): void + { + if(!event || !this._roomEngine) return; + + switch(event.type) + { + case RoomObjectHSLColorEnableEvent.ROOM_BACKGROUND_COLOR: + GetEventDispatcher().dispatchEvent(new RoomObjectHSLColorEnabledEvent(RoomObjectHSLColorEnabledEvent.ROOM_BACKGROUND_COLOR, roomId, event.enable, event.hue, event.saturation, event.lightness)); + return; + } + } + + private onRoomObjectDataRequestEvent(event: RoomObjectDataRequestEvent, roomId: number): void + { + if(!event || !this._roomEngine || !event.object) return; + + switch(event.type) + { + case RoomObjectDataRequestEvent.RODRE_CURRENT_USER_ID: + event.object.model.setValue(RoomObjectVariable.SESSION_CURRENT_USER_ID, GetSessionDataManager().userId); + return; + case RoomObjectDataRequestEvent.RODRE_URL_PREFIX: + event.object.model.setValue(RoomObjectVariable.SESSION_URL_PREFIX, GetConfiguration().getValue('url.prefix')); + return; + } + } + + private onRoomObjectTileMouseEvent(roomId: number, event: RoomObjectTileMouseEvent): void + { + const session = GetRoomSessionManager().getSession(roomId); + + if(!session || session.isSpectator) return; + + this.sendWalkUpdate(event.tileXAsInt, event.tileYAsInt); + } + + private handleObjectMove(event: RoomObjectMouseEvent, roomId: number): void + { + if(!event || !this._roomEngine) return; + + const eventDispatcher = GetEventDispatcher(); + + if(!eventDispatcher) return; + + const selectedData = this.getSelectedRoomObjectData(roomId); + + if(!selectedData) return; + + const roomObject = this._roomEngine.getRoomObject(roomId, selectedData.id, selectedData.category); + + if(!roomObject) return; + + let _local_6 = true; + + if((selectedData.category === RoomObjectCategory.FLOOR) || (selectedData.category === RoomObjectCategory.UNIT)) + { + const stackingHeightMap = this._roomEngine.getFurnitureStackingHeightMap(roomId); + + if(!(((event instanceof RoomObjectTileMouseEvent)) && (this.handleFurnitureMove(roomObject, selectedData, Math.trunc(event.tileX + 0.5), Math.trunc(event.tileY + 0.5), stackingHeightMap)))) + { + this.handleFurnitureMove(roomObject, selectedData, selectedData.loc.x, selectedData.loc.y, stackingHeightMap); + + _local_6 = false; + } + } + + else if((selectedData.category === RoomObjectCategory.WALL)) + { + _local_6 = false; + + if(event instanceof RoomObjectWallMouseEvent) + { + const _local_10 = event.wallLocation; + const _local_11 = event.wallWidth; + const _local_12 = event.wallHeight; + const _local_13 = event.x; + const _local_14 = event.y; + const _local_15 = event.direction; + + if(this.handleWallItemMove(roomObject, selectedData, _local_10, _local_11, _local_12, _local_13, _local_14, _local_15)) + { + _local_6 = true; + } + } + + if(!_local_6) + { + roomObject.setLocation(selectedData.loc); + roomObject.setDirection(selectedData.dir); + } + + this._roomEngine.updateRoomObjectMask(roomId, selectedData.id, _local_6); + } + + if(_local_6) + { + this.setFurnitureAlphaMultiplier(roomObject, 0.5); + + this._roomEngine.setObjectMoverIconSpriteVisible(false); + } + else + { + this.setFurnitureAlphaMultiplier(roomObject, 0); + + this._roomEngine.setObjectMoverIconSpriteVisible(true); + } + } + + private handleObjectPlace(event: RoomObjectMouseEvent, roomId: number): void + { + if(!event || !this._roomEngine) return; + + const eventDispatcher = GetEventDispatcher(); + + if(!eventDispatcher) return; + + let selectedData = this.getSelectedRoomObjectData(roomId); + + if(!selectedData) return; + + let roomObject = this._roomEngine.getRoomObject(roomId, selectedData.id, selectedData.category); + + if(!roomObject) + { + if(event instanceof RoomObjectTileMouseEvent) + { + if(selectedData.category === RoomObjectCategory.FLOOR) + { + this._roomEngine.addFurnitureFloor(roomId, selectedData.id, selectedData.typeId, selectedData.loc, selectedData.dir, 0, selectedData.stuffData, parseFloat(selectedData.instanceData), -1, 0, 0, '', false); + } + + else if(selectedData.category === RoomObjectCategory.UNIT) + { + this._roomEngine.addRoomObjectUser(roomId, selectedData.id, new Vector3d(), new Vector3d(180), 180, selectedData.typeId, selectedData.instanceData); + + const roomObject = this._roomEngine.getRoomObject(roomId, selectedData.id, selectedData.category); + + (roomObject && selectedData.posture && roomObject.model.setValue(RoomObjectVariable.FIGURE_POSTURE, selectedData.posture)); + } + } + + else if(event instanceof RoomObjectWallMouseEvent) + { + if(selectedData.category === RoomObjectCategory.WALL) + { + this._roomEngine.addFurnitureWall(roomId, selectedData.id, selectedData.typeId, selectedData.loc, selectedData.dir, 0, selectedData.instanceData, 0); + } + } + + roomObject = this._roomEngine.getRoomObject(roomId, selectedData.id, selectedData.category); + + if(roomObject) + { + if(selectedData.category === RoomObjectCategory.FLOOR) + { + const allowedDirections = roomObject.model.getValue(RoomObjectVariable.FURNITURE_ALLOWED_DIRECTIONS); + + if(allowedDirections && allowedDirections.length) + { + const direction = new Vector3d(allowedDirections[0]); + + roomObject.setDirection(direction); + + this.updateSelectedObjectData(roomId, selectedData.id, selectedData.category, selectedData.loc, direction, selectedData.operation, selectedData.typeId, selectedData.instanceData, selectedData.stuffData, selectedData.state, selectedData.animFrame, selectedData.posture); + + selectedData = this.getSelectedRoomObjectData(roomId); + + if(!selectedData) return; + } + } + } + + this.setFurnitureAlphaMultiplier(roomObject, 0.5); + this._roomEngine.setObjectMoverIconSpriteVisible(true); + } + + if(roomObject) + { + let _local_12 = true; + + const stackingHeightMap = this._roomEngine.getFurnitureStackingHeightMap(roomId); + + if(selectedData.category === RoomObjectCategory.FLOOR) + { + if(!((event instanceof RoomObjectTileMouseEvent) && this.handleFurnitureMove(roomObject, selectedData, Math.trunc(event.tileX + 0.5), Math.trunc(event.tileY + 0.5), stackingHeightMap))) + { + this._roomEngine.removeRoomObjectFloor(roomId, selectedData.id); + + _local_12 = false; + } + } + + else if(selectedData.category === RoomObjectCategory.WALL) + { + _local_12 = false; + + if(event instanceof RoomObjectWallMouseEvent) + { + const _local_14 = event.wallLocation; + const _local_15 = event.wallWidth; + const _local_16 = event.wallHeight; + const _local_17 = event.x; + const _local_18 = event.y; + const _local_19 = event.direction; + + if(this.handleWallItemMove(roomObject, selectedData, _local_14, _local_15, _local_16, _local_17, _local_18, _local_19)) + { + _local_12 = true; + } + } + + if(!_local_12) + { + this._roomEngine.removeRoomObjectWall(roomId, selectedData.id); + } + + this._roomEngine.updateRoomObjectMask(roomId, selectedData.id, _local_12); + } + + else if(selectedData.category === RoomObjectCategory.UNIT) + { + if(!((event instanceof RoomObjectTileMouseEvent) && this.handleUserPlace(roomObject, Math.trunc(event.tileX + 0.5), Math.trunc(event.tileY + 0.5), this._roomEngine.getLegacyWallGeometry(roomId)))) + { + this._roomEngine.removeRoomObjectUser(roomId, selectedData.id); + + _local_12 = false; + } + } + + this._roomEngine.setObjectMoverIconSpriteVisible(!_local_12); + } + } + + private handleFurnitureMove(roomObject: IRoomObjectController, selectedObjectData: ISelectedRoomObjectData, x: number, y: number, stackingHeightMap: IFurnitureStackingHeightMap): boolean + { + if(!roomObject || !selectedObjectData) return false; + + const _local_6 = new Vector3d(); + _local_6.assign(roomObject.getDirection()); + + roomObject.setDirection(selectedObjectData.dir); + + const _local_7 = new Vector3d(x, y, 0); + const _local_8 = new Vector3d(); + + _local_8.assign(roomObject.getDirection()); + + let _local_9 = this.validateFurnitureLocation(roomObject, _local_7, selectedObjectData.loc, selectedObjectData.dir, stackingHeightMap); + + if(!_local_9) + { + _local_8.x = this.getValidRoomObjectDirection(roomObject, true); + + roomObject.setDirection(_local_8); + + _local_9 = this.validateFurnitureLocation(roomObject, _local_7, selectedObjectData.loc, selectedObjectData.dir, stackingHeightMap); + } + + if(!_local_9) + { + roomObject.setDirection(_local_6); + + return false; + } + + roomObject.setLocation(_local_9); + + if(_local_8) roomObject.setDirection(_local_8); + + return true; + } + + private handleWallItemMove(k: IRoomObjectController, _arg_2: ISelectedRoomObjectData, _arg_3: IVector3D, _arg_4: IVector3D, _arg_5: IVector3D, _arg_6: number, _arg_7: number, _arg_8: number): boolean + { + if(!k || !_arg_2) return false; + + const _local_9 = new Vector3d(_arg_8); + const _local_10 = this.validateWallItemLocation(k, _arg_3, _arg_4, _arg_5, _arg_6, _arg_7, _arg_2); + + if(!_local_10) return false; + + k.setLocation(_local_10); + k.setDirection(_local_9); + + return true; + } + + private validateFurnitureLocation(k: IRoomObject, _arg_2: IVector3D, _arg_3: IVector3D, _arg_4: IVector3D, _arg_5: IFurnitureStackingHeightMap): Vector3d + { + if(!k || !k.model || !_arg_2) return null; + + let _local_15: Vector3d = null; + + const _local_6 = k.getDirection(); + + if(!_local_6) return null; + + if(!_arg_3 || !_arg_4) return null; + + if((_arg_2.x === _arg_3.x) && (_arg_2.y === _arg_3.y)) + { + if(_local_6.x === _arg_4.x) + { + _local_15 = new Vector3d(); + + _local_15.assign(_arg_3); + + return _local_15; + } + } + + let sizeX = k.model.getValue(RoomObjectVariable.FURNITURE_SIZE_X); + let sizeY = k.model.getValue(RoomObjectVariable.FURNITURE_SIZE_Y); + + if(sizeX < 1) sizeX = 1; + + if(sizeY < 1) sizeY = 1; + + const _local_9 = _arg_3.x; + const _local_10 = _arg_3.y; + let _local_11 = sizeX; + let _local_12 = sizeY; + let _local_13 = 0; + let _local_14 = (Math.trunc((Math.trunc(_local_6.x + 45) % 360) / 90)); + + if((_local_14 === 1) || (_local_14 === 3)) + { + _local_13 = sizeX; + + sizeX = sizeY; + sizeY = _local_13; + } + + _local_14 = Math.trunc((Math.trunc(_arg_4.x + 45) % 360) / 90); + + if((_local_14 === 1) || (_local_14 === 3)) + { + _local_13 = _local_11; + _local_11 = _local_12; + _local_12 = _local_13; + } + + if(_arg_5 && _arg_2) + { + const stackable = (k.model.getValue(RoomObjectVariable.FURNITURE_ALWAYS_STACKABLE) === 1); + + if(_arg_5.validateLocation(_arg_2.x, _arg_2.y, sizeX, sizeY, _local_9, _local_10, _local_11, _local_12, stackable)) + { + return new Vector3d(_arg_2.x, _arg_2.y, _arg_5.getTileHeight(_arg_2.x, _arg_2.y)); + } + + return null; + } + + return null; + } + + private validateWallItemLocation(k: IRoomObject, _arg_2: IVector3D, _arg_3: IVector3D, _arg_4: IVector3D, _arg_5: number, _arg_6: number, _arg_7: ISelectedRoomObjectData): Vector3d + { + if((((((k == null) || (k.model == null)) || (_arg_2 == null)) || (_arg_3 == null)) || (_arg_4 == null)) || (_arg_7 == null)) return null; + + const _local_8 = k.model.getValue(RoomObjectVariable.FURNITURE_SIZE_X); + const _local_9 = k.model.getValue(RoomObjectVariable.FURNITURE_SIZE_Z); + const _local_10 = k.model.getValue(RoomObjectVariable.FURNITURE_CENTER_Z); + + if((((_arg_5 < (_local_8 / 2)) || (_arg_5 > (_arg_3.length - (_local_8 / 2)))) || (_arg_6 < _local_10)) || (_arg_6 > (_arg_4.length - (_local_9 - _local_10)))) + { + if((_arg_5 < (_local_8 / 2)) && (_arg_5 <= (_arg_3.length - (_local_8 / 2)))) + { + _arg_5 = (_local_8 / 2); + } + else + { + if((_arg_5 >= (_local_8 / 2)) && (_arg_5 > (_arg_3.length - (_local_8 / 2)))) + { + _arg_5 = (_arg_3.length - (_local_8 / 2)); + } + } + + if((_arg_6 < _local_10) && (_arg_6 <= (_arg_4.length - (_local_9 - _local_10)))) + { + _arg_6 = _local_10; + } + else + { + if((_arg_6 >= _local_10) && (_arg_6 > (_arg_4.length - (_local_9 - _local_10)))) + { + _arg_6 = (_arg_4.length - (_local_9 - _local_10)); + } + } + } + + if((((_arg_5 < (_local_8 / 2)) || (_arg_5 > (_arg_3.length - (_local_8 / 2)))) || (_arg_6 < _local_10)) || (_arg_6 > (_arg_4.length - (_local_9 - _local_10)))) + { + return null; + } + + let _local_11 = Vector3d.sum(Vector3d.product(_arg_3, (_arg_5 / _arg_3.length)), Vector3d.product(_arg_4, (_arg_6 / _arg_4.length))); + + _local_11 = Vector3d.sum(_arg_2, _local_11); + + return _local_11; + } + + private changeObjectState(roomId: number, objectId: number, type: string, state: number, isRandom: boolean): void + { + const category = this._roomEngine.getRoomObjectCategoryForType(type); + + this.changeRoomObjectState(roomId, objectId, category, state, isRandom); + } + + private useObject(roomId: number, objectId: number, type: string, action: string): void + { + if(!this._roomEngine || !GetCommunication().connection) return; + switch(action) + { + case RoomObjectFurnitureActionEvent.DICE_ACTIVATE: + GetCommunication().connection.send(new FurnitureDiceActivateComposer(objectId)); + return; + case RoomObjectFurnitureActionEvent.DICE_OFF: + GetCommunication().connection.send(new FurnitureDiceDeactivateComposer(objectId)); + return; + case RoomObjectFurnitureActionEvent.USE_HABBOWHEEL: + GetCommunication().connection.send(new FurnitureColorWheelComposer(objectId)); + return; + case RoomObjectFurnitureActionEvent.STICKIE: + GetCommunication().connection.send(new GetItemDataComposer(objectId)); + return; + case RoomObjectFurnitureActionEvent.ENTER_ONEWAYDOOR: + GetCommunication().connection.send(new FurnitureOneWayDoorComposer(objectId)); + return; + } + } + + private changeRoomObjectState(roomId: number, objectId: number, category: number, state: number, isRandom: boolean): boolean + { + if(!this._roomEngine || !GetCommunication().connection) return true; + + if(category === RoomObjectCategory.FLOOR) + { + if(!isRandom) + { + GetCommunication().connection.send(new FurnitureMultiStateComposer(objectId, state)); + } + else + { + GetCommunication().connection.send(new FurnitureRandomStateComposer(objectId, state)); + } + } + + else if(category === RoomObjectCategory.WALL) + { + GetCommunication().connection.send(new FurnitureWallMultiStateComposer(objectId, state)); + } + + return true; + } + + private sendWalkUpdate(x: number, y: number): void + { + if(!this._roomEngine || !GetCommunication().connection) return; + + GetCommunication().connection.send(new RoomUnitWalkComposer(x, y)); + } + + private handleMouseOverObject(category: number, roomId: number, event: RoomObjectMouseEvent): ObjectTileCursorUpdateMessage + { + if(category !== RoomObjectCategory.FLOOR) return null; + + const roomObject = this._roomEngine.getRoomObject(roomId, event.objectId, RoomObjectCategory.FLOOR); + + if(!roomObject) return null; + + const location = this.getActiveSurfaceLocation(roomObject, event); + + if(!location) return null; + + const furnitureHeightMap = this._roomEngine.getFurnitureStackingHeightMap(roomId); + + if(!furnitureHeightMap) return null; + + const x = location.x; + const y = location.y; + const z = location.z; + + return new ObjectTileCursorUpdateMessage(new Vector3d(x, y, roomObject.getLocation().z), z, true, event.eventId); + } + + private handleMoveTargetFurni(k: number, _arg_2: RoomObjectMouseEvent): boolean + { + if((_arg_2.objectType === RoomObjectUserType.USER) || (_arg_2.objectType === RoomObjectUserType.PET) || (_arg_2.objectType === RoomObjectUserType.BOT) || (_arg_2.objectType === RoomObjectUserType.RENTABLE_BOT) || (_arg_2.objectType === RoomObjectUserType.MONSTER_PLANT)) return; + + const _local_3 = this._roomEngine.getRoomObject(k, _arg_2.objectId, RoomObjectCategory.FLOOR); + const _local_4 = this.getActiveSurfaceLocation(_local_3, _arg_2); + + if(_local_4) + { + this.sendWalkUpdate(_local_4.x, _local_4.y); + + return true; + } + + return false; + } + + private getActiveSurfaceLocation(k: IRoomObject, _arg_2: RoomObjectMouseEvent): Vector3d + { + if(!k || !_arg_2) return null; + + const furniData = GetSessionDataManager().getFloorItemDataByName(k.type); + + if(!furniData) return null; + + if(!furniData.canStandOn && !furniData.canSitOn && !furniData.canLayOn) return null; + + const model = k.model; + + if(!model) return null; + + const location = k.getLocation(); + const direction = k.getDirection(); + + let sizeX = model.getValue(RoomObjectVariable.FURNITURE_SIZE_X); + let sizeY = model.getValue(RoomObjectVariable.FURNITURE_SIZE_Y); + const sizeZ = model.getValue(RoomObjectVariable.FURNITURE_SIZE_Z); + + if((direction.x === 90) || (direction.x === 270)) [sizeX, sizeY] = [sizeY, sizeX]; + + if(sizeX < 1) sizeX = 1; + if(sizeY < 1) sizeY = 1; + + const renderingCanvas = this._roomEngine.getActiveRoomInstanceRenderingCanvas(); + + if(!renderingCanvas) return null; + + const scale = renderingCanvas.geometry.scale; + const _local_13 = furniData.canSitOn ? 0.5 : 0; + const _local_14 = ((((scale / 2) + _arg_2.spriteOffsetX) + _arg_2.localX) / (scale / 4)); + const _local_15 = (((_arg_2.spriteOffsetY + _arg_2.localY) + (((sizeZ - _local_13) * scale) / 2)) / (scale / 4)); + const _local_16 = ((_local_14 + (2 * _local_15)) / 4); + const _local_17 = ((_local_14 - (2 * _local_15)) / 4); + const _local_18 = Math.floor((location.x + _local_16)); + const _local_19 = Math.floor(((location.y - _local_17) + 1)); + + let _local_20 = false; + + if((_local_18 < location.x) || (_local_18 >= (location.x + sizeX))) _local_20 = true; + else if((_local_19 < location.y) || (_local_19 >= (location.y + sizeY))) _local_20 = true; + + const _local_21 = furniData.canSitOn ? (sizeZ - 0.5) : sizeZ; + + if(!_local_20) return new Vector3d(_local_18, _local_19, _local_21); + + return null; + } + + private handleMouseOverTile(k: RoomObjectTileMouseEvent, roomId: number): ObjectTileCursorUpdateMessage + { + if(this._whereYouClickIsWhereYouGo) + { + return new ObjectTileCursorUpdateMessage(new Vector3d(k.tileXAsInt, k.tileYAsInt, k.tileZAsInt), 0, true, k.eventId); + } + + const roomObject = this._roomEngine.getRoomObjectCursor(roomId); + + if(roomObject && roomObject.visualization) + { + const _local_4 = k.tileXAsInt; + const _local_5 = k.tileYAsInt; + const _local_6 = k.tileZAsInt; + const _local_7 = this._roomEngine.getRoomInstance(roomId); + + if(_local_7) + { + const _local_8 = this._roomEngine.getRoomTileObjectMap(roomId); + + if(_local_8) + { + const _local_9 = _local_8.getObjectIntTile(_local_4, _local_5); + const _local_10 = this._roomEngine.getFurnitureStackingHeightMap(roomId); + + if(_local_10) + { + if(_local_9 && _local_9.model && (_local_9.model.getValue(RoomObjectVariable.FURNITURE_IS_VARIABLE_HEIGHT) > 0)) + { + const _local_11 = _local_10.getTileHeight(_local_4, _local_5); + const _local_12 = this._roomEngine.getLegacyWallGeometry(roomId).getHeight(_local_4, _local_5); + + return new ObjectTileCursorUpdateMessage(new Vector3d(_local_4, _local_5, _local_6), (_local_11 - _local_12), true, k.eventId); + } + + return new ObjectTileCursorUpdateMessage(new Vector3d(_local_4, _local_5, _local_6), 0, true, k.eventId); + } + } + } + } + + return null; + } + + private placeObject(roomId: number, isTileEvent: boolean, isWallEvent: boolean): void + { + const selectedData = this.getSelectedRoomObjectData(roomId); + + if(!selectedData) return; + + let roomObject: IRoomObjectController = null; + let objectId = selectedData.id; + const category = selectedData.category; + + let x = 0; + let y = 0; + let z = 0; + let direction = 0; + let wallLocation = ''; + + if(this._roomEngine && GetCommunication().connection) + { + roomObject = this._roomEngine.getRoomObject(roomId, objectId, category); + + if(roomObject) + { + const location = roomObject.getLocation(); + + direction = roomObject.getDirection().x; + + if((category === RoomObjectCategory.FLOOR) || (category === RoomObjectCategory.UNIT)) + { + x = location.x; + y = location.y; + z = location.z; + } + + else if(category === RoomObjectCategory.WALL) + { + x = location.x; + y = location.y; + z = location.z; + + const wallGeometry = this._roomEngine.getLegacyWallGeometry(roomId); + + if(wallGeometry) wallLocation = wallGeometry.getOldLocationString(location, direction); + } + + direction = ((((direction / 45) % 8) + 8) % 8); + + if((objectId < 0) && (category === RoomObjectCategory.UNIT)) objectId = (objectId * -1); + + if(this._objectPlacementSource !== RoomObjectPlacementSource.CATALOG) + { + if(category === RoomObjectCategory.UNIT) + { + if(selectedData.typeId === RoomObjectType.PET) + { + GetCommunication().connection.send(new PetPlaceComposer(objectId, Math.trunc(x), Math.trunc(y))); + } + + else if(selectedData.typeId === RoomObjectType.RENTABLE_BOT) + { + GetCommunication().connection.send(new BotPlaceComposer(objectId, Math.trunc(x), Math.trunc(y))); + } + } + + else if(roomObject.model.getValue(RoomObjectVariable.FURNITURE_IS_STICKIE) !== undefined) + { + GetCommunication().connection.send(new FurniturePostItPlaceComposer(objectId, wallLocation)); + } + + else + { + GetCommunication().connection.send(new FurniturePlaceComposer(objectId, category, wallLocation, Math.trunc(x), Math.trunc(y), direction)); + } + } + } + } + + this._roomEngine.setPlacedRoomObjectData(roomId, new SelectedRoomObjectData(selectedData.id, selectedData.category, null, selectedData.dir, null)); + + this.resetSelectedObjectData(roomId); + + if(this._roomEngine && GetEventDispatcher()) + { + const placedInRoom = (roomObject && (roomObject.id === selectedData.id)); + + GetEventDispatcher().dispatchEvent(new RoomEngineObjectPlacedEvent(RoomEngineObjectEvent.PLACED, roomId, objectId, category, wallLocation, x, y, z, direction, placedInRoom, isTileEvent, isWallEvent, selectedData.instanceData)); + } + } + + public modifyRoomObject(roomId: number, objectId: number, category: number, operation: string): boolean + { + if(!this._roomEngine) return false; + + const roomObject = this._roomEngine.getRoomObject(roomId, objectId, category); + + if(!roomObject) return false; + + let _local_9 = true; + + switch(operation) + { + case RoomObjectOperationType.OBJECT_ROTATE_POSITIVE: + case RoomObjectOperationType.OBJECT_ROTATE_NEGATIVE: + if(GetCommunication().connection) + { + let direction = 0; + + if(operation == RoomObjectOperationType.OBJECT_ROTATE_NEGATIVE) + { + direction = this.getValidRoomObjectDirection(roomObject, false); + } + else + { + direction = this.getValidRoomObjectDirection(roomObject, true); + } + + const x = roomObject.getLocation().x; + const y = roomObject.getLocation().y; + + if(this.isValidLocation(roomObject, new Vector3d(direction), this._roomEngine.getFurnitureStackingHeightMap(roomId))) + { + direction = Math.trunc((direction / 45)); + + if(roomObject.type === RoomObjectUserType.MONSTER_PLANT) + { + const roomSession = GetRoomSessionManager().getSession(roomId); + + if(roomSession) + { + const userData = roomSession.userDataManager.getUserDataByIndex(objectId); + + if(userData) + { + GetCommunication().connection.send(new PetMoveComposer(userData.webID, Math.trunc(x), Math.trunc(y), direction)); + } + } + } + else + { + GetCommunication().connection.send(new FurnitureFloorUpdateComposer(objectId, x, y, direction)); + } + } + } + break; + case RoomObjectOperationType.OBJECT_EJECT: + case RoomObjectOperationType.OBJECT_PICKUP: + if(GetCommunication().connection) GetCommunication().connection.send(new FurniturePickupComposer(category, objectId)); + break; + case RoomObjectOperationType.OBJECT_PICKUP_PET: + if(GetCommunication().connection) + { + const session = GetRoomSessionManager().getSession(roomId); + + if(session) + { + const userData = session.userDataManager.getUserDataByIndex(objectId); + + session.pickupPet(userData.webID); + } + } + break; + case RoomObjectOperationType.OBJECT_PICKUP_BOT: + if(GetCommunication().connection) + { + const session = GetRoomSessionManager().getSession(roomId); + + if(session) + { + const userData = session.userDataManager.getUserDataByIndex(objectId); + + session.pickupBot(userData.webID); + } + } + break; + case RoomObjectOperationType.OBJECT_MOVE: + _local_9 = false; + this.setFurnitureAlphaMultiplier(roomObject, 0.5); + this.setSelectedRoomObjectData(roomId, roomObject.id, category, roomObject.getLocation(), roomObject.getDirection(), operation); + this._roomEngine.setObjectMoverIconSprite(roomObject.id, category, true); + this._roomEngine.setObjectMoverIconSpriteVisible(false); + break; + case RoomObjectOperationType.OBJECT_MOVE_TO: { + const selectedData = this.getSelectedRoomObjectData(roomId); + + this.updateSelectedObjectData(roomId, selectedData.id, selectedData.category, selectedData.loc, selectedData.dir, RoomObjectOperationType.OBJECT_MOVE_TO, selectedData.typeId, selectedData.instanceData, selectedData.stuffData, selectedData.state, selectedData.animFrame, selectedData.posture); + this.setFurnitureAlphaMultiplier(roomObject, 1); + this._roomEngine.removeObjectMoverIconSprite(); + + if(GetCommunication().connection) + { + if(category === RoomObjectCategory.FLOOR) + { + const angle = ((roomObject.getDirection().x) % 360); + const location = roomObject.getLocation(); + const direction = (angle / 45); + + GetCommunication().connection.send(new FurnitureFloorUpdateComposer(objectId, location.x, location.y, direction)); + } + + else if(category === RoomObjectCategory.WALL) + { + const angle = ((roomObject.getDirection().x) % 360); + const wallGeometry = this._roomEngine.getLegacyWallGeometry(roomId); + + if(wallGeometry) + { + const location = wallGeometry.getOldLocationString(roomObject.getLocation(), angle); + + if(location) GetCommunication().connection.send(new FurnitureWallUpdateComposer(objectId, location)); + } + } + + else if(category === RoomObjectCategory.UNIT) + { + const angle = ((roomObject.getDirection().x) % 360); + const location = roomObject.getLocation(); + const direction = (angle / 45); + const race = parseInt(roomObject.model.getValue(RoomObjectVariable.RACE)); + const roomSession = GetRoomSessionManager().getSession(roomId); + + if(roomSession) + { + const userData = roomSession.userDataManager.getUserDataByIndex(objectId); + + if(userData) GetCommunication().connection.send(new PetMoveComposer(userData.webID, location.x, location.y, direction)); + } + } + } + + break; + } + } + + if(_local_9) this.resetSelectedObjectData(roomId); + + return true; + } + + public modifyRoomObjectDataWithMap(roomId: number, objectId: number, category: number, operation: string, data: Map): boolean + { + if(!this._roomEngine) return false; + + const roomObject = this._roomEngine.getRoomObject(roomId, objectId, category); + + if(!roomObject) return false; + + switch(operation) + { + case RoomObjectOperationType.OBJECT_SAVE_STUFF_DATA: + if(GetCommunication().connection) + { + GetCommunication().connection.send(new SetObjectDataMessageComposer(objectId, data)); + } + break; + } + + return true; + } + + public modifyWallItemData(roomId: number, objectId: number, colorHex: string, text: string): boolean + { + if(!this._roomEngine || !GetCommunication().connection) return false; + + GetCommunication().connection.send(new SetItemDataMessageComposer(objectId, colorHex, text)); + + return true; + } + + public deleteWallItem(roomId: number, itemId: number): boolean + { + if(!this._roomEngine || !GetCommunication().connection) return false; + + GetCommunication().connection.send(new RemoveWallItemComposer(itemId)); + + return true; + } + + public getValidRoomObjectDirection(k: IRoomObjectController, _arg_2: boolean): number + { + if(!k || !k.model) return 0; + + let _local_6 = 0; + let _local_7 = 0; + let allowedDirections: number[] = []; + + if(k.type === RoomObjectUserType.MONSTER_PLANT) + { + allowedDirections = k.model.getValue(RoomObjectVariable.PET_ALLOWED_DIRECTIONS); + } + else + { + allowedDirections = k.model.getValue(RoomObjectVariable.FURNITURE_ALLOWED_DIRECTIONS); + } + + let direction = k.getDirection().x; + + if(allowedDirections && allowedDirections.length) + { + _local_6 = allowedDirections.indexOf(direction); + + if(_local_6 < 0) + { + _local_6 = 0; + _local_7 = 0; + + while(_local_7 < allowedDirections.length) + { + if(direction <= allowedDirections[_local_7]) break; + + _local_6++; + _local_7++; + } + + _local_6 = (_local_6 % allowedDirections.length); + } + + if(_arg_2) _local_6 = ((_local_6 + 1) % allowedDirections.length); + else _local_6 = (((_local_6 - 1) + allowedDirections.length) % allowedDirections.length); + + direction = allowedDirections[_local_6]; + } + + return direction; + } + + private isValidLocation(object: IRoomObject, goalDirection: IVector3D, stackingHeightMap: IFurnitureStackingHeightMap): boolean + { + if(!object || !object.model || !goalDirection) return false; + + const direction = object.getDirection(); + const location = object.getLocation(); + + if(!direction || !location) return false; + + if((direction.x % 180) === (goalDirection.x % 180)) return true; + + let sizeX = object.model.getValue(RoomObjectVariable.FURNITURE_SIZE_X); + let sizeY = object.model.getValue(RoomObjectVariable.FURNITURE_SIZE_Y); + + if(sizeX < 1) sizeX = 1; + + if(sizeY < 1) sizeY = 1; + + let _local_8 = sizeX; + let _local_9 = sizeY; + + let _local_11 = (Math.trunc((Math.trunc((goalDirection.x + 45)) % 360) / 90)); + + if((_local_11 === 1) || (_local_11 === 3)) [sizeX, sizeY] = [sizeY, sizeX]; + + _local_11 = (Math.trunc((Math.trunc((direction.x + 45)) % 360) / 90)); + + if(((_local_11 === 1) || (_local_11 === 3))) [_local_8, _local_9] = [_local_9, _local_8]; + + if(stackingHeightMap && location) + { + const alwaysStackable = (object.model.getValue(RoomObjectVariable.FURNITURE_ALWAYS_STACKABLE) === 1); + + if(stackingHeightMap.validateLocation(location.x, location.y, sizeX, sizeY, location.x, location.y, _local_8, _local_9, alwaysStackable, location.z)) return true; + } + + return false; + } + + private placeObjectOnUser(roomId: number, objectId: number, category: number): void + { + const _local_4 = this.getSelectedRoomObjectData(roomId); + + if(!_local_4) return; + + const _local_5 = (this._roomEngine.getRoomObject(roomId, objectId, category) as IRoomObjectController); + + if(!_local_5) return; + + if(!this._roomEngine || !GetEventDispatcher()) return; + + GetEventDispatcher().dispatchEvent(new RoomEngineObjectPlacedOnUserEvent(RoomEngineObjectEvent.PLACED_ON_USER, roomId, objectId, category, _local_4.id, _local_4.category)); + } + + public setSelectedObject(roomId: number, objectId: number, category: number): void + { + if(!this._roomEngine) return; + + const eventDispatcher = GetEventDispatcher(); + + if(!eventDispatcher) return; + + switch(category) + { + case RoomObjectCategory.UNIT: + case RoomObjectCategory.FLOOR: + case RoomObjectCategory.WALL: + if(category === RoomObjectCategory.UNIT) + { + this.deselectObject(roomId); + this.setSelectedAvatar(roomId, objectId, true); + } + else + { + this.setSelectedAvatar(roomId, 0, false); + + if(objectId !== this._selectedObjectId) + { + this.deselectObject(roomId); + + const roomObject = this._roomEngine.getRoomObject(roomId, objectId, category); + + if(roomObject && roomObject.logic) + { + roomObject.logic.processUpdateMessage(new ObjectSelectedMessage(true)); + + this._selectedObjectId = objectId; + this._selectedObjectCategory = category; + } + } + } + + GetEventDispatcher().dispatchEvent(new RoomEngineObjectEvent(RoomEngineObjectEvent.SELECTED, roomId, objectId, category)); + + return; + } + } + + private deselectObject(roomId: number): void + { + if(this._selectedObjectId === -1) return; + + const object = this._roomEngine.getRoomObject(roomId, this._selectedObjectId, this._selectedObjectCategory); + + if(object && object.logic) + { + object.logic.processUpdateMessage(new ObjectSelectedMessage(false)); + + this._selectedObjectId = -1; + this._selectedObjectCategory = RoomObjectCategory.MINIMUM; + } + } + + public setSelectedAvatar(k: number, _arg_2: number, _arg_3: boolean): void + { + if(!this._roomEngine) return; + + const _local_4 = RoomObjectCategory.UNIT; + const _local_5 = this._roomEngine.getRoomObject(k, this._selectedAvatarId, _local_4); + + if(_local_5 && _local_5.logic) + { + _local_5.logic.processUpdateMessage(new ObjectAvatarSelectedMessage(false)); + + this._selectedAvatarId = -1; + } + + let _local_6 = false; + + if(_arg_3) + { + const _local_5 = this._roomEngine.getRoomObject(k, _arg_2, _local_4); + + if(_local_5 && _local_5.logic) + { + _local_5.logic.processUpdateMessage(new ObjectAvatarSelectedMessage(true)); + + _local_6 = true; + + this._selectedAvatarId = _arg_2; + + const location = _local_5.getLocation(); + + if(location) GetCommunication().connection.send(new RoomUnitLookComposer(~~(location.x), ~~(location.y))); + } + } + + const selectionArrow = this._roomEngine.getRoomObjectSelectionArrow(k); + + if(selectionArrow && selectionArrow.logic) + { + if(_local_6 && !this._roomEngine.isPlayingGame()) selectionArrow.logic.processUpdateMessage(new ObjectVisibilityUpdateMessage(ObjectVisibilityUpdateMessage.ENABLED)); + else selectionArrow.logic.processUpdateMessage(new ObjectVisibilityUpdateMessage(ObjectVisibilityUpdateMessage.DISABLED)); + } + } + + private resetSelectedObjectData(roomId: number): void + { + if(!this._roomEngine) return; + + this._roomEngine.removeObjectMoverIconSprite(); + + const selectedData = this.getSelectedRoomObjectData(roomId); + + if(selectedData) + { + if((selectedData.operation === RoomObjectOperationType.OBJECT_MOVE) || (selectedData.operation === RoomObjectOperationType.OBJECT_MOVE_TO)) + { + const roomObject = this._roomEngine.getRoomObject(roomId, selectedData.id, selectedData.category); + + if(roomObject && (selectedData.operation !== RoomObjectOperationType.OBJECT_MOVE_TO)) + { + roomObject.setLocation(selectedData.loc); + roomObject.setDirection(selectedData.dir); + } + + this.setFurnitureAlphaMultiplier(roomObject, 1); + + if(selectedData.category === RoomObjectCategory.WALL) + { + this._roomEngine.updateRoomObjectMask(roomId, selectedData.id, true); + } + + this.updateSelectedObjectData(roomId, selectedData.id, selectedData.category, selectedData.loc, selectedData.dir, RoomObjectOperationType.OBJECT_MOVE, selectedData.typeId, selectedData.instanceData, selectedData.stuffData, selectedData.state, selectedData.animFrame, selectedData.posture); + } + + else if((selectedData.operation === RoomObjectOperationType.OBJECT_PLACE)) + { + const objectId = selectedData.id; + const category = selectedData.category; + + switch(category) + { + case RoomObjectCategory.FLOOR: + this._roomEngine.removeRoomObjectFloor(roomId, objectId); + break; + case RoomObjectCategory.WALL: + this._roomEngine.removeRoomObjectWall(roomId, objectId); + break; + case RoomObjectCategory.UNIT: + this._roomEngine.removeRoomObjectUser(roomId, objectId); + break; + } + } + + this._roomEngine.setSelectedRoomObjectData(roomId, null); + } + } + + private getSelectedRoomObjectData(roomId: number): ISelectedRoomObjectData + { + if(!this._roomEngine) return null; + + return this._roomEngine.getSelectedRoomObjectData(roomId); + } + + private setFurnitureAlphaMultiplier(object: IRoomObjectController, multiplier: number): void + { + if(!object || !object.model) return; + + object.model.setValue(RoomObjectVariable.FURNITURE_ALPHA_MULTIPLIER, multiplier); + } + + private decorateModeMove(event: RoomObjectMouseEvent): boolean + { + return (this._roomEngine.isDecorating) && (!(event.ctrlKey || event.shiftKey)); + } + + public cancelRoomObjectPlacement(roomId: number): boolean + { + this.resetSelectedObjectData(roomId); + + return true; + } + + private setSelectedRoomObjectData(roomId: number, id: number, category: number, location: IVector3D, direction: IVector3D, operation: string, typeId: number = 0, instanceData: string = null, stuffData: IObjectData = null, state: number = -1, frameNumber: number = -1, posture: string = null): void + { + this.resetSelectedObjectData(roomId); + + if(!this._roomEngine) return; + + const selectedData = new SelectedRoomObjectData(id, category, operation, location, direction, typeId, instanceData, stuffData, state, frameNumber, posture); + + this._roomEngine.setSelectedRoomObjectData(roomId, selectedData); + } + + private updateSelectedObjectData(roomId: number, id: number, category: number, location: IVector3D, direction: IVector3D, operation: string, typeId: number = 0, instanceData: string = null, stuffData: IObjectData = null, state: number = -1, frameNumber: number = -1, posture: string = null): void + { + if(!this._roomEngine) return null; + + const selectedData = new SelectedRoomObjectData(id, category, operation, location, direction, typeId, instanceData, stuffData, state, frameNumber, posture); + + this._roomEngine.setSelectedRoomObjectData(roomId, selectedData); + } + + private handleUserPlace(roomObject: IRoomObjectController, x: number, y: number, wallGeometry: ILegacyWallGeometry): boolean + { + if(!wallGeometry.isRoomTile(x, y)) return false; + + roomObject.setLocation(new Vector3d(x, y, wallGeometry.getHeight(x, y))); + + return true; + } + + public get engine(): IRoomEngineServices + { + return this._roomEngine; + } + + public get selectedAvatarId(): number + { + return this._selectedAvatarId; + } +} diff --git a/packages/room/src/RoomObjectLogicFactory.ts b/packages/room/src/RoomObjectLogicFactory.ts new file mode 100644 index 0000000..2678a57 --- /dev/null +++ b/packages/room/src/RoomObjectLogicFactory.ts @@ -0,0 +1,315 @@ +import { IEventDispatcher, IRoomObjectEventHandler, IRoomObjectLogicFactory, RoomObjectLogicType } from '@nitrots/api'; +import { GetEventDispatcher, RoomObjectEvent } from '@nitrots/events'; +import { NitroLogger } from '@nitrots/utils'; +import { RoomObjectLogicBase } from '../../room'; +import { AvatarLogic, FurnitureAchievementResolutionLogic, FurnitureBadgeDisplayLogic, FurnitureChangeStateWhenStepOnLogic, FurnitureClothingChangeLogic, FurnitureCounterClockLogic, FurnitureCrackableLogic, FurnitureCraftingGizmoLogic, FurnitureCreditLogic, FurnitureCuckooClockLogic, FurnitureCustomStackHeightLogic, FurnitureDiceLogic, FurnitureEcotronBoxLogic, FurnitureEditableInternalLinkLogic, FurnitureEditableRoomLinkLogic, FurnitureEffectBoxLogic, FurnitureExternalImageLogic, FurnitureFireworksLogic, FurnitureFloorHoleLogic, FurnitureGroupForumTerminalLogic, FurnitureGuildCustomizedLogic, FurnitureHabboWheelLogic, FurnitureHighScoreLogic, FurnitureHockeyScoreLogic, FurnitureHweenLovelockLogic, FurnitureIceStormLogic, FurnitureInternalLinkLogic, FurnitureJukeboxLogic, FurnitureLogic, FurnitureLoveLockLogic, FurnitureMannequinLogic, FurnitureMonsterplantSeedLogic, FurnitureMultiHeightLogic, FurnitureMultiStateLogic, FurnitureMysteryBoxLogic, FurnitureMysteryTrophyLogic, FurnitureOneWayDoorLogic, FurniturePetCustomizationLogic, FurniturePlaceholderLogic, FurniturePlanetSystemLogic, FurniturePresentLogic, FurniturePurchaseableClothingLogic, FurniturePushableLogic, FurnitureRandomStateLogic, FurnitureRandomTeleportLogic, FurnitureRentableSpaceLogic, FurnitureRoomBackgroundColorLogic, FurnitureRoomBackgroundLogic, FurnitureRoomBillboardLogic, FurnitureRoomDimmerLogic, FurnitureScoreLogic, FurnitureSongDiskLogic, FurnitureSoundBlockLogic, FurnitureSoundMachineLogic, FurnitureStickieLogic, FurnitureTrophyLogic, FurnitureVoteCounterLogic, FurnitureVoteMajorityLogic, FurnitureWelcomeGiftLogic, FurnitureWindowLogic, FurnitureYoutubeLogic, PetLogic, RoomLogic, SelectionArrowLogic, TileCursorLogic } from './object'; + +export class RoomObjectLogicFactory implements IRoomObjectLogicFactory +{ + private _events: IEventDispatcher = GetEventDispatcher(); + private _cachedEvents: Map = new Map(); + private _registeredEvents: Map = new Map(); + private _functions: ((event: RoomObjectEvent) => void)[] = []; + + public getLogic(type: string): IRoomObjectEventHandler + { + const logic = this.getLogicType(type); + + if(!logic) return null; + + const instance = (new logic() as IRoomObjectEventHandler); + + if(!instance) return null; + + instance.eventDispatcher = this._events; + + if(!this._cachedEvents.get(type)) + { + this._cachedEvents.set(type, true); + + const eventTypes = instance.getEventTypes(); + + for(const eventType of eventTypes) + { + if(!eventType) continue; + + this.registerEventType(eventType); + } + } + + return instance; + } + + private registerEventType(type: string): void + { + if(this._registeredEvents.get(type)) return; + + this._registeredEvents.set(type, true); + + for(const func of this._functions) + { + if(!func) continue; + + this._events.addEventListener(type, func); + } + } + + public registerEventFunction(func: (event: RoomObjectEvent) => void): void + { + if(!func) return; + + if(this._functions.indexOf(func) >= 0) return; + + this._functions.push(func); + + for(const eventType of this._registeredEvents.keys()) + { + if(!eventType) continue; + + this._events.addEventListener(eventType, func); + } + } + + public removeEventFunction(func: (event: RoomObjectEvent) => void): void + { + if(!func) return; + + const index = this._functions.indexOf(func); + + if(index === -1) return; + + this._functions.splice(index, 1); + + for(const event of this._registeredEvents.keys()) + { + if(!event) continue; + + this._events.removeEventListener(event, func); + } + } + + public getLogicType(type: string): typeof RoomObjectLogicBase + { + if(!type) return null; + + let logic: typeof RoomObjectLogicBase = null; + + switch(type) + { + case RoomObjectLogicType.ROOM: + logic = RoomLogic; + break; + case RoomObjectLogicType.TILE_CURSOR: + logic = TileCursorLogic; + break; + case RoomObjectLogicType.SELECTION_ARROW: + logic = SelectionArrowLogic; + break; + case RoomObjectLogicType.USER: + case RoomObjectLogicType.BOT: + case RoomObjectLogicType.RENTABLE_BOT: + logic = AvatarLogic; + break; + case RoomObjectLogicType.PET: + logic = PetLogic; + break; + case RoomObjectLogicType.FURNITURE_BASIC: + logic = FurnitureLogic; + break; + case RoomObjectLogicType.FURNITURE_BADGE_DISPLAY: + logic = FurnitureBadgeDisplayLogic; + break; + case RoomObjectLogicType.FURNITURE_CHANGE_STATE_WHEN_STEP_ON: + logic = FurnitureChangeStateWhenStepOnLogic; + break; + case RoomObjectLogicType.FURNITURE_COUNTER_CLOCK: + logic = FurnitureCounterClockLogic; + break; + case RoomObjectLogicType.FURNITURE_CRACKABLE: + logic = FurnitureCrackableLogic; + break; + case RoomObjectLogicType.FURNITURE_CREDIT: + logic = FurnitureCreditLogic; + break; + case RoomObjectLogicType.FURNITURE_CUSTOM_STACK_HEIGHT: + logic = FurnitureCustomStackHeightLogic; + break; + case RoomObjectLogicType.FURNITURE_DICE: + logic = FurnitureDiceLogic; + break; + case RoomObjectLogicType.FURNITURE_EDITABLE_INTERNAL_LINK: + logic = FurnitureEditableInternalLinkLogic; + break; + case RoomObjectLogicType.FURNITURE_EDITABLE_ROOM_LINK: + logic = FurnitureEditableRoomLinkLogic; + break; + case RoomObjectLogicType.FURNITURE_EXTERNAL_IMAGE_WALLITEM: + logic = FurnitureExternalImageLogic; + break; + case RoomObjectLogicType.FURNITURE_FIREWORKS: + logic = FurnitureFireworksLogic; + break; + case RoomObjectLogicType.FURNITURE_FLOOR_HOLE: + logic = FurnitureFloorHoleLogic; + break; + case RoomObjectLogicType.FURNITURE_GUILD_CUSTOMIZED: + logic = FurnitureGuildCustomizedLogic; + break; + case RoomObjectLogicType.FURNITURE_HIGH_SCORE: + logic = FurnitureHighScoreLogic; + break; + case RoomObjectLogicType.FURNITURE_HOCKEY_SCORE: + logic = FurnitureHockeyScoreLogic; + break; + case RoomObjectLogicType.FURNITURE_ES: + logic = FurnitureIceStormLogic; + break; + case RoomObjectLogicType.FURNITURE_MANNEQUIN: + logic = FurnitureMannequinLogic; + break; + case RoomObjectLogicType.FURNITURE_MULTIHEIGHT: + logic = FurnitureMultiHeightLogic; + break; + case RoomObjectLogicType.FURNITURE_MULTISTATE: + logic = FurnitureMultiStateLogic; + break; + case RoomObjectLogicType.FURNITURE_ONE_WAY_DOOR: + logic = FurnitureOneWayDoorLogic; + break; + case RoomObjectLogicType.FURNITURE_PET_CUSTOMIZATION: + logic = FurniturePetCustomizationLogic; + break; + case RoomObjectLogicType.FURNITURE_PRESENT: + logic = FurniturePresentLogic; + break; + case RoomObjectLogicType.FURNITURE_PURCHASABLE_CLOTHING: + logic = FurniturePurchaseableClothingLogic; + break; + case RoomObjectLogicType.FURNITURE_PUSHABLE: + logic = FurniturePushableLogic; + break; + case RoomObjectLogicType.FURNITURE_BACKGROUND_COLOR: + logic = FurnitureRoomBackgroundColorLogic; + break; + case RoomObjectLogicType.FURNITURE_BG: + logic = FurnitureRoomBackgroundLogic; + break; + case RoomObjectLogicType.FURNITURE_BB: + logic = FurnitureRoomBillboardLogic; + break; + case RoomObjectLogicType.FURNITURE_ROOMDIMMER: + logic = FurnitureRoomDimmerLogic; + break; + case RoomObjectLogicType.FURNITURE_SCORE: + logic = FurnitureScoreLogic; + break; + case RoomObjectLogicType.FURNITURE_SOUNDBLOCK: + logic = FurnitureSoundBlockLogic; + break; + case RoomObjectLogicType.FURNITURE_STICKIE: + logic = FurnitureStickieLogic; + break; + case RoomObjectLogicType.FURNITURE_TROPHY: + logic = FurnitureTrophyLogic; + break; + case RoomObjectLogicType.FURNITURE_VOTE_COUNTER: + logic = FurnitureVoteCounterLogic; + break; + case RoomObjectLogicType.FURNITURE_VOTE_MAJORITY: + logic = FurnitureVoteMajorityLogic; + break; + case RoomObjectLogicType.FURNITURE_WINDOW: + logic = FurnitureWindowLogic; + break; + case RoomObjectLogicType.FURNITURE_LOVELOCK: + logic = FurnitureLoveLockLogic; + break; + case RoomObjectLogicType.FURNITURE_YOUTUBE: + logic = FurnitureYoutubeLogic; + break; + case RoomObjectLogicType.FURNITURE_CRAFTING_GIZMO: + logic = FurnitureCraftingGizmoLogic; + break; + case RoomObjectLogicType.FURNITURE_RENTABLE_SPACE: + logic = FurnitureRentableSpaceLogic; + break; + case RoomObjectLogicType.FURNITURE_EFFECTBOX: + logic = FurnitureEffectBoxLogic; + break; + case RoomObjectLogicType.FURNITURE_MONSTERPLANT_SEED: + logic = FurnitureMonsterplantSeedLogic; + break; + case RoomObjectLogicType.FURNITURE_MYSTERYBOX: + logic = FurnitureMysteryBoxLogic; + break; + case RoomObjectLogicType.FURNITURE_MYSTERYTROPHY: + logic = FurnitureMysteryTrophyLogic; + break; + case RoomObjectLogicType.FURNITURE_RANDOM_TELEPORT: + logic = FurnitureRandomTeleportLogic; + break; + case RoomObjectLogicType.FURNITURE_CLOTHING_CHANGE: + logic = FurnitureClothingChangeLogic; + break; + case RoomObjectLogicType.FURNITURE_CUCKOO_CLOCK: + logic = FurnitureCuckooClockLogic; + break; + case RoomObjectLogicType.FURNITURE_ECOTRON_BOX: + logic = FurnitureEcotronBoxLogic; + break; + case RoomObjectLogicType.FURNITURE_GROUP_FORUM_TERMINAL: + logic = FurnitureGroupForumTerminalLogic; + break; + case RoomObjectLogicType.FURNITURE_HWEEN_LOVELOCK: + logic = FurnitureHweenLovelockLogic; + break; + case RoomObjectLogicType.FURNITURE_INTERNAL_LINK: + logic = FurnitureInternalLinkLogic; + break; + case RoomObjectLogicType.FURNITURE_JUKEBOX: + logic = FurnitureJukeboxLogic; + break; + case RoomObjectLogicType.FURNITURE_PLACEHOLDER: + logic = FurniturePlaceholderLogic; + break; + case RoomObjectLogicType.FURNITURE_PLANET_SYSTEM: + logic = FurniturePlanetSystemLogic; + break; + case RoomObjectLogicType.FURNITURE_RANDOMSTATE: + logic = FurnitureRandomStateLogic; + break; + case RoomObjectLogicType.FURNITURE_SONG_DISK: + logic = FurnitureSongDiskLogic; + break; + case RoomObjectLogicType.FURNITURE_SOUND_MACHINE: + logic = FurnitureSoundMachineLogic; + break; + case RoomObjectLogicType.FURNITURE_WELCOME_GIFT: + logic = FurnitureWelcomeGiftLogic; + break; + case RoomObjectLogicType.FURNITURE_ACHIEVEMENT_RESOLUTION: + logic = FurnitureAchievementResolutionLogic; + break; + case RoomObjectLogicType.FURNITURE_HABBOWHEEL: + logic = FurnitureHabboWheelLogic; + break; + default: + logic = FurnitureLogic; + break; + } + + if(!logic) + { + NitroLogger.warn('Unknown Logic', type); + + return null; + } + + return logic; + } + + public get events(): IEventDispatcher + { + return this._events; + } +} diff --git a/packages/room/src/RoomObjectManager.ts b/packages/room/src/RoomObjectManager.ts new file mode 100644 index 0000000..d4331b0 --- /dev/null +++ b/packages/room/src/RoomObjectManager.ts @@ -0,0 +1,130 @@ +import { IAdvancedMap, IRoomObjectController, IRoomObjectManager } from '@nitrots/api'; +import { AdvancedMap } from '@nitrots/utils'; +import { RoomObject } from './object'; + +export class RoomObjectManager implements IRoomObjectManager +{ + private _objects: IAdvancedMap; + private _objectsPerType: IAdvancedMap>; + + constructor() + { + this._objects = new AdvancedMap(); + this._objectsPerType = new AdvancedMap(); + } + + public dispose(): void + { + this.removeAllObjects(); + } + + public getObject(id: number): IRoomObjectController + { + const object = this._objects.getValue(id); + + if(!object) return null; + + return object; + } + + public getObjectByIndex(index: number): IRoomObjectController + { + const object = this._objects.getWithIndex(index); + + if(!object) return null; + + return object; + } + + public createObject(id: number, stateCount: number, type: string): IRoomObjectController + { + const object = new RoomObject(id, stateCount, type); + + return this.addObject(id, type, object); + } + + private addObject(id: number, type: string, object: IRoomObjectController): IRoomObjectController + { + if(this._objects.getValue(id)) + { + object.dispose(); + + return null; + } + + this._objects.add(id, object); + + const typeMap = this.getTypeMap(type); + + if(typeMap) typeMap.add(id, object); + + return object; + } + + public removeObject(id: number): void + { + const object = this._objects.remove(id); + + if(object) + { + const typeMap = this.getTypeMap(object.type); + + if(typeMap) typeMap.remove(object.id); + + object.dispose(); + } + } + + public removeAllObjects(): void + { + let i = 0; + + while(i < this._objects.length) + { + const object = this._objects.getWithIndex(i); + + if(object) object.dispose(); + + i++; + } + + this._objects.reset(); + + i = 0; + + while(i < this._objectsPerType.length) + { + const typeMap = this._objectsPerType.getWithIndex(i); + + if(typeMap) typeMap.dispose(); + + i++; + } + + this._objectsPerType.reset(); + } + + private getTypeMap(k: string, _arg_2: boolean = true): IAdvancedMap + { + let existing = this._objectsPerType.getValue(k); + + if(!existing && _arg_2) + { + existing = new AdvancedMap(); + + this._objectsPerType.add(k, existing); + } + + return existing; + } + + public get objects(): IAdvancedMap + { + return this._objects; + } + + public get totalObjects(): number + { + return this._objects.length; + } +} diff --git a/packages/room/src/RoomObjectVisualizationFactory.ts b/packages/room/src/RoomObjectVisualizationFactory.ts new file mode 100644 index 0000000..0fce7c3 --- /dev/null +++ b/packages/room/src/RoomObjectVisualizationFactory.ts @@ -0,0 +1,225 @@ +import { IAssetData, IObjectVisualizationData, IRoomObjectGraphicVisualization, IRoomObjectVisualizationFactory, RoomObjectVisualizationType } from '@nitrots/api'; +import { NitroLogger } from '@nitrots/utils'; +import { AvatarVisualization, AvatarVisualizationData, FurnitureAnimatedVisualization, FurnitureAnimatedVisualizationData, FurnitureBBVisualization, FurnitureBadgeDisplayVisualization, FurnitureBottleVisualization, FurnitureBuilderPlaceholderVisualization, FurnitureCounterClockVisualization, FurnitureCuboidVisualization, FurnitureExternalImageVisualization, FurnitureFireworksVisualization, FurnitureGiftWrappedFireworksVisualization, FurnitureGiftWrappedVisualization, FurnitureGuildCustomizedVisualization, FurnitureGuildIsometricBadgeVisualization, FurnitureHabboWheelVisualization, FurnitureIsometricBBVisualization, FurnitureMannequinVisualization, FurnitureMannequinVisualizationData, FurniturePartyBeamerVisualization, FurniturePlanetSystemVisualization, FurniturePosterVisualization, FurnitureQueueTileVisualization, FurnitureResettingAnimatedVisualization, FurnitureRoomBackgroundVisualization, FurnitureScoreBoardVisualization, FurnitureSoundBlockVisualization, FurnitureStickieVisualization, FurnitureValRandomizerVisualization, FurnitureVisualization, FurnitureVisualizationData, FurnitureVoteCounterVisualization, FurnitureVoteMajorityVisualization, FurnitureWaterAreaVisualization, FurnitureYoutubeVisualization, PetVisualization, PetVisualizationData, RoomObjectSpriteVisualization, RoomVisualization, RoomVisualizationData, TileCursorVisualization } from './object'; + +export class RoomObjectVisualizationFactory implements IRoomObjectVisualizationFactory +{ + private static CACHING_ENABLED: boolean = true; + + private _visualizationDatas: Map; + + constructor() + { + this._visualizationDatas = new Map(); + } + + public getVisualization(type: string): IRoomObjectGraphicVisualization + { + const visualization = this.getVisualizationType(type); + + if(!visualization) return null; + + return new visualization(); + } + + public getVisualizationType(type: string): typeof RoomObjectSpriteVisualization + { + if(!type) return null; + + let visualization: typeof RoomObjectSpriteVisualization = null; + + switch(type) + { + case RoomObjectVisualizationType.ROOM: + visualization = RoomVisualization; + break; + case RoomObjectVisualizationType.TILE_CURSOR: + visualization = TileCursorVisualization; + break; + case RoomObjectVisualizationType.USER: + case RoomObjectVisualizationType.BOT: + case RoomObjectVisualizationType.RENTABLE_BOT: + visualization = AvatarVisualization; + break; + case RoomObjectVisualizationType.PET_ANIMATED: + visualization = PetVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_STATIC: + visualization = FurnitureVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_ANIMATED: + visualization = FurnitureAnimatedVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_RESETTING_ANIMATED: + visualization = FurnitureResettingAnimatedVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_BADGE_DISPLAY: + visualization = FurnitureBadgeDisplayVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_BG: + visualization = FurnitureRoomBackgroundVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_BB: + visualization = FurnitureBBVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_ISOMETRIC_BB: + visualization = FurnitureIsometricBBVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_BOTTLE: + visualization = FurnitureBottleVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_BUILDER_PLACEHOLDER: + visualization = FurnitureBuilderPlaceholderVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_COUNTER_CLOCK: + visualization = FurnitureCounterClockVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_CUBOID: + visualization = FurnitureCuboidVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_EXTERNAL_IMAGE: + visualization = FurnitureExternalImageVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_FIREWORKS: + visualization = FurnitureFireworksVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_GIFT_WRAPPED_FIREWORKS: + visualization = FurnitureGiftWrappedFireworksVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_GIFT_WRAPPED: + visualization = FurnitureGiftWrappedVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_GUILD_CUSTOMIZED: + visualization = FurnitureGuildCustomizedVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_GUILD_ISOMETRIC_BADGE: + visualization = FurnitureGuildIsometricBadgeVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_HABBOWHEEL: + visualization = FurnitureHabboWheelVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_MANNEQUIN: + visualization = FurnitureMannequinVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_PARTY_BEAMER: + visualization = FurniturePartyBeamerVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_PLANET_SYSTEM: + visualization = FurniturePlanetSystemVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_POSTER: + visualization = FurniturePosterVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_QUEUE_TILE: + visualization = FurnitureQueueTileVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_SCORE_BOARD: + visualization = FurnitureScoreBoardVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_SOUNDBLOCK: + visualization = FurnitureSoundBlockVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_STICKIE: + visualization = FurnitureStickieVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_VAL_RANDOMIZER: + visualization = FurnitureValRandomizerVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_VOTE_COUNTER: + visualization = FurnitureVoteCounterVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_VOTE_MAJORITY: + visualization = FurnitureVoteMajorityVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_WATER_AREA: + visualization = FurnitureWaterAreaVisualization; + break; + case RoomObjectVisualizationType.FURNITURE_YOUTUBE: + visualization = FurnitureYoutubeVisualization; + break; + } + + if(!visualization) + { + NitroLogger.log('Unknown Visualization', type); + + return null; + } + + return visualization; + } + + public getVisualizationData(type: string, visualization: string, asset: IAssetData): IObjectVisualizationData + { + const existing = this._visualizationDatas.get(type); + + if(existing) return existing; + + let visualizationData: IObjectVisualizationData = null; + + switch(visualization) + { + case RoomObjectVisualizationType.FURNITURE_STATIC: + case RoomObjectVisualizationType.FURNITURE_GIFT_WRAPPED: + case RoomObjectVisualizationType.FURNITURE_BB: + case RoomObjectVisualizationType.FURNITURE_ISOMETRIC_BB: + case RoomObjectVisualizationType.FURNITURE_BG: + case RoomObjectVisualizationType.FURNITURE_STICKIE: + case RoomObjectVisualizationType.FURNITURE_BUILDER_PLACEHOLDER: + visualizationData = new FurnitureVisualizationData(); + break; + case RoomObjectVisualizationType.FURNITURE_ANIMATED: + case RoomObjectVisualizationType.FURNITURE_RESETTING_ANIMATED: + case RoomObjectVisualizationType.FURNITURE_POSTER: + case RoomObjectVisualizationType.FURNITURE_HABBOWHEEL: + case RoomObjectVisualizationType.FURNITURE_VAL_RANDOMIZER: + case RoomObjectVisualizationType.FURNITURE_BOTTLE: + case RoomObjectVisualizationType.FURNITURE_PLANET_SYSTEM: + case RoomObjectVisualizationType.FURNITURE_QUEUE_TILE: + case RoomObjectVisualizationType.FURNITURE_PARTY_BEAMER: + case RoomObjectVisualizationType.FURNITURE_COUNTER_CLOCK: + case RoomObjectVisualizationType.FURNITURE_WATER_AREA: + case RoomObjectVisualizationType.FURNITURE_SCORE_BOARD: + case RoomObjectVisualizationType.FURNITURE_FIREWORKS: + case RoomObjectVisualizationType.FURNITURE_GIFT_WRAPPED_FIREWORKS: + case RoomObjectVisualizationType.FURNITURE_GUILD_CUSTOMIZED: + case RoomObjectVisualizationType.FURNITURE_GUILD_ISOMETRIC_BADGE: + case RoomObjectVisualizationType.FURNITURE_VOTE_COUNTER: + case RoomObjectVisualizationType.FURNITURE_VOTE_MAJORITY: + case RoomObjectVisualizationType.FURNITURE_SOUNDBLOCK: + case RoomObjectVisualizationType.FURNITURE_BADGE_DISPLAY: + case RoomObjectVisualizationType.FURNITURE_EXTERNAL_IMAGE: + case RoomObjectVisualizationType.FURNITURE_YOUTUBE: + case RoomObjectVisualizationType.TILE_CURSOR: + visualizationData = new FurnitureAnimatedVisualizationData(); + break; + case RoomObjectVisualizationType.FURNITURE_MANNEQUIN: + visualizationData = new FurnitureMannequinVisualizationData(); + break; + case RoomObjectVisualizationType.ROOM: + visualizationData = new RoomVisualizationData(); + break; + case RoomObjectVisualizationType.USER: + case RoomObjectVisualizationType.BOT: + case RoomObjectVisualizationType.RENTABLE_BOT: + visualizationData = new AvatarVisualizationData(); + break; + case RoomObjectVisualizationType.PET_ANIMATED: + visualizationData = new PetVisualizationData(); + break; + } + + if(!visualizationData) return null; + + if(!visualizationData.initialize(asset)) + { + visualizationData.dispose(); + + return null; + } + + if(RoomObjectVisualizationFactory.CACHING_ENABLED) this._visualizationDatas.set(type, visualizationData); + + return visualizationData; + } +} diff --git a/packages/room/src/RoomPreviewer.ts b/packages/room/src/RoomPreviewer.ts new file mode 100644 index 0000000..c7c02da --- /dev/null +++ b/packages/room/src/RoomPreviewer.ts @@ -0,0 +1,858 @@ +import { IGetImageListener, IImageResult, IObjectData, IRoomEngine, IRoomObjectController, IRoomRenderingCanvas, IVector3D, LegacyDataType, RoomObjectCategory, RoomObjectUserType, RoomObjectVariable } from '@nitrots/api'; +import { FloorHeightMapMessageParser, RoomEntryTileMessageParser } from '@nitrots/communication'; +import { GetEventDispatcher, RoomEngineEvent, RoomEngineObjectEvent } from '@nitrots/events'; +import { GetTickerTime, RoomId, Vector3d } from '@nitrots/utils'; +import { Container, Point, Rectangle, Sprite, Texture } from 'pixi.js'; +import { RoomEngine } from './RoomEngine'; +import { ObjectRoomMapUpdateMessage } from './messages'; +import { RoomPlaneParser } from './object/RoomPlaneParser'; +import { LegacyWallGeometry } from './utils/LegacyWallGeometry'; + +export class RoomPreviewer +{ + public static SCALE_NORMAL: number = 64; + public static SCALE_SMALL: number = 32; + public static PREVIEW_COUNTER: number = 0; + public static PREVIEW_CANVAS_ID: number = 1; + public static PREVIEW_OBJECT_ID: number = 1; + public static PREVIEW_OBJECT_LOCATION_X: number = 2; + public static PREVIEW_OBJECT_LOCATION_Y: number = 2; + + private static ALLOWED_IMAGE_CUT: number = 0.25; + private static AUTOMATIC_STATE_CHANGE_INTERVAL: number = 2500; + private static ZOOM_ENABLED: boolean = true; + + private _roomEngine: IRoomEngine; + private _planeParser: RoomPlaneParser; + private _previewRoomId: number = 1; + private _currentPreviewObjectType: number = 0; + private _currentPreviewObjectCategory: number = 0; + private _currentPreviewObjectData: string = ''; + private _currentPreviewRectangle: Rectangle = null; + private _currentPreviewCanvasWidth: number = 0; + private _currentPreviewCanvasHeight: number = 0; + private _currentPreviewScale: number = 64; + private _currentPreviewNeedsZoomOut: boolean; + private _automaticStateChange: boolean; + private _previousAutomaticStateChangeTime: number; + private _addViewOffset: Point; + private _backgroundColor: number = 305148561; + private _backgroundSprite: Sprite = null; + private _disableUpdate: boolean = false; + + constructor(roomEngine: IRoomEngine, roomId: number = 1) + { + this._roomEngine = roomEngine; + this._planeParser = new RoomPlaneParser(); + this._previewRoomId = RoomId.makeRoomPreviewerId(roomId); + this._addViewOffset = new Point(0, 0); + + this.onRoomObjectAdded = this.onRoomObjectAdded.bind(this); + this.onRoomInitializedonRoomInitialized = this.onRoomInitializedonRoomInitialized.bind(this); + + if(this.isRoomEngineReady && GetEventDispatcher()) + { + GetEventDispatcher().addEventListener(RoomEngineObjectEvent.ADDED, this.onRoomObjectAdded); + GetEventDispatcher().addEventListener(RoomEngineObjectEvent.CONTENT_UPDATED, this.onRoomObjectAdded); + GetEventDispatcher().addEventListener(RoomEngineEvent.INITIALIZED, this.onRoomInitializedonRoomInitialized); + } + + this.createRoomForPreview(); + } + + public dispose(): void + { + this.reset(true); + + if(this.isRoomEngineReady && GetEventDispatcher()) + { + GetEventDispatcher().removeEventListener(RoomEngineObjectEvent.ADDED, this.onRoomObjectAdded); + GetEventDispatcher().removeEventListener(RoomEngineObjectEvent.CONTENT_UPDATED, this.onRoomObjectAdded); + GetEventDispatcher().removeEventListener(RoomEngineEvent.INITIALIZED, this.onRoomInitializedonRoomInitialized); + } + + if(this._backgroundSprite) + { + this._backgroundSprite.destroy(); + + this._backgroundSprite = null; + } + + if(this._planeParser) + { + this._planeParser.dispose(); + + this._planeParser = null; + } + } + + private createRoomForPreview(): void + { + if(this.isRoomEngineReady) + { + const size = 7; + + const planeParser = new RoomPlaneParser(); + + planeParser.initializeTileMap((size + 2), (size + 2)); + + let y = 1; + + while(y < (1 + size)) + { + let x = 1; + + while(x < (1 + size)) + { + planeParser.setTileHeight(x, y, 0); + + x++; + } + + y++; + } + + planeParser.initializeFromTileData(); + + this._roomEngine.createRoomInstance(this._previewRoomId, planeParser.getMapData()); + + planeParser.dispose(); + } + } + + public reset(k: boolean): void + { + if(this.isRoomEngineReady) + { + this._roomEngine.removeRoomObjectFloor(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID); + this._roomEngine.removeRoomObjectWall(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID); + this._roomEngine.removeRoomObjectUser(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID); + + if(!k) this.updatePreviewRoomView(); + } + + this._currentPreviewObjectCategory = RoomObjectCategory.MINIMUM; + } + + public updatePreviewModel(model: string, wallHeight: number, scale: boolean = true): void + { + const parser = new FloorHeightMapMessageParser(); + + parser.flush(); + parser.parseModel(model, wallHeight, scale); + + //@ts-ignore + const wallGeometry = (this._roomEngine as IRoomCreator).getLegacyWallGeometry(this._previewRoomId); + + if(!wallGeometry) return; + + this._planeParser.reset(); + + const width = parser.width; + const height = parser.height; + + this._planeParser.initializeTileMap(width, height); + + const entryTile: RoomEntryTileMessageParser = null; + + let doorX = -1; + let doorY = -1; + let doorZ = 0; + let doorDirection = 0; + + let y = 0; + + while(y < height) + { + let x = 0; + + while(x < width) + { + const tileHeight = parser.getHeight(x, y); + + if(((((y > 0) && (y < (height - 1))) || ((x > 0) && (x < (width - 1)))) && (!(tileHeight == RoomPlaneParser.TILE_BLOCKED))) && ((entryTile == null) || ((x == entryTile.x) && (y == entryTile.y)))) + { + if(((parser.getHeight(x, (y - 1)) == RoomPlaneParser.TILE_BLOCKED) && (parser.getHeight((x - 1), y) == RoomPlaneParser.TILE_BLOCKED)) && (parser.getHeight(x, (y + 1)) == RoomPlaneParser.TILE_BLOCKED)) + { + doorX = (x + 0.5); + doorY = y; + doorZ = tileHeight; + doorDirection = 90; + } + + if(((parser.getHeight(x, (y - 1)) == RoomPlaneParser.TILE_BLOCKED) && (parser.getHeight((x - 1), y) == RoomPlaneParser.TILE_BLOCKED)) && (parser.getHeight((x + 1), y) == RoomPlaneParser.TILE_BLOCKED)) + { + doorX = x; + doorY = (y + 0.5); + doorZ = tileHeight; + doorDirection = 180; + } + } + + this._planeParser.setTileHeight(x, y, tileHeight); + + x++; + } + + y++; + } + + this._planeParser.setTileHeight(Math.floor(doorX), Math.floor(doorY), doorZ); + this._planeParser.initializeFromTileData(parser.wallHeight); + this._planeParser.setTileHeight(Math.floor(doorX), Math.floor(doorY), (doorZ + this._planeParser.wallHeight)); + + wallGeometry.scale = LegacyWallGeometry.DEFAULT_SCALE; + wallGeometry.initialize(width, height, this._planeParser.floorHeight); + + let heightIterator = (parser.height - 1); + + while(heightIterator >= 0) + { + let widthIterator = (parser.width - 1); + + while(widthIterator >= 0) + { + wallGeometry.setHeight(widthIterator, heightIterator, this._planeParser.getTileHeight(widthIterator, heightIterator)); + widthIterator--; + } + + heightIterator--; + } + + const roomMap = this._planeParser.getMapData(); + + roomMap.doors.push({ + x: doorX, + y: doorY, + z: doorZ, + dir: doorDirection + }); + + const roomObject = this.getRoomPreviewOwnRoomObject(); + + if(roomObject) roomObject.processUpdateMessage(new ObjectRoomMapUpdateMessage(roomMap)); + } + + public addFurnitureIntoRoom(classId: number, direction: IVector3D, objectData: IObjectData = null, extra: string = null): number + { + if(!objectData) objectData = new LegacyDataType(); + + if(this.isRoomEngineReady) + { + this.reset(false); + + this._currentPreviewObjectType = classId; + this._currentPreviewObjectCategory = RoomObjectCategory.FLOOR; + this._currentPreviewObjectData = ''; + + if(this._roomEngine.addFurnitureFloor(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, classId, new Vector3d(RoomPreviewer.PREVIEW_OBJECT_LOCATION_X, RoomPreviewer.PREVIEW_OBJECT_LOCATION_Y, 0), direction, 0, objectData, NaN, -1, 0, -1, '', true, false)) + { + this._previousAutomaticStateChangeTime = GetTickerTime(); + this._automaticStateChange = true; + + const roomObject = this._roomEngine.getRoomObject(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, this._currentPreviewObjectCategory); + + if(roomObject && extra) roomObject.model.setValue(RoomObjectVariable.FURNITURE_EXTRAS, extra); + + this.updatePreviewRoomView(); + + return RoomPreviewer.PREVIEW_OBJECT_ID; + } + } + + return -1; + } + + public addWallItemIntoRoom(classId: number, direction: IVector3D, objectData: string): number + { + if(this.isRoomEngineReady) + { + if((this._currentPreviewObjectCategory === RoomObjectCategory.WALL) && (this._currentPreviewObjectType === classId) && (this._currentPreviewObjectData === objectData)) return RoomPreviewer.PREVIEW_OBJECT_ID; + + this.reset(false); + + this._currentPreviewObjectType = classId; + this._currentPreviewObjectCategory = RoomObjectCategory.WALL; + this._currentPreviewObjectData = objectData; + + if(this._roomEngine.addFurnitureWall(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, classId, new Vector3d(0.5, 2.3, 1.8), direction, 0, objectData, 0, 0, -1, '', false)) + { + this._previousAutomaticStateChangeTime = GetTickerTime(); + this._automaticStateChange = true; + + this.updatePreviewRoomView(); + + return RoomPreviewer.PREVIEW_OBJECT_ID; + } + } + + return -1; + } + + public addAvatarIntoRoom(figure: string, effect: number): number + { + if(this.isRoomEngineReady) + { + this.reset(false); + + this._currentPreviewObjectType = 1; + this._currentPreviewObjectCategory = RoomObjectCategory.UNIT; + this._currentPreviewObjectData = figure; + + if(this._roomEngine.addRoomObjectUser(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, new Vector3d(RoomPreviewer.PREVIEW_OBJECT_LOCATION_X, RoomPreviewer.PREVIEW_OBJECT_LOCATION_Y, 0), new Vector3d(90, 0, 0), 135, RoomObjectUserType.getTypeNumber(RoomObjectUserType.USER), figure)) + { + this._previousAutomaticStateChangeTime = GetTickerTime(); + this._automaticStateChange = true; + + this.updateUserGesture(1); + this.updateUserEffect(effect); + this.updateUserPosture('std'); + } + + this.updatePreviewRoomView(); + + return RoomPreviewer.PREVIEW_OBJECT_ID; + } + + return -1; + } + + public addPetIntoRoom(figure: string): number + { + if(this.isRoomEngineReady) + { + this.reset(false); + + this._currentPreviewObjectType = 1; + this._currentPreviewObjectCategory = RoomObjectCategory.UNIT; + this._currentPreviewObjectData = figure; + + if(this._roomEngine.addRoomObjectUser(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, new Vector3d(RoomPreviewer.PREVIEW_OBJECT_LOCATION_X, RoomPreviewer.PREVIEW_OBJECT_LOCATION_Y, 0), new Vector3d(90, 0, 0), 90, RoomObjectUserType.getTypeNumber(RoomObjectUserType.PET), figure)) + { + this._previousAutomaticStateChangeTime = GetTickerTime(); + this._automaticStateChange = false; + + this.updateUserGesture(1); + this.updateUserPosture('std'); + } + + this.updatePreviewRoomView(); + + return RoomPreviewer.PREVIEW_OBJECT_ID; + } + + return -1; + } + + public updateUserPosture(type: string, parameter: string = ''): void + { + if(this.isRoomEngineReady) this._roomEngine.updateRoomObjectUserPosture(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, type, parameter); + } + + public updateUserGesture(gestureId: number): void + { + if(this.isRoomEngineReady) this._roomEngine.updateRoomObjectUserGesture(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, gestureId); + } + + public updateUserEffect(effectId: number): void + { + if(this.isRoomEngineReady) this._roomEngine.updateRoomObjectUserEffect(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, effectId); + } + + public updateObjectUserFigure(figure: string, gender: string = null, subType: string = null, isRiding: boolean = false): boolean + { + if(this.isRoomEngineReady) return this._roomEngine.updateRoomObjectUserFigure(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, figure, gender, subType, isRiding); + + return false; + } + + public updateObjectUserAction(action: string, value: number, parameter: string = null): void + { + if(this.isRoomEngineReady) this._roomEngine.updateRoomObjectUserAction(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, action, value, parameter); + } + + public updateObjectStuffData(stuffData: IObjectData): void + { + if(this.isRoomEngineReady) this._roomEngine.updateRoomObjectFloor(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, null, null, stuffData.state, stuffData); + } + + public changeRoomObjectState(): void + { + if(this.isRoomEngineReady) + { + this._automaticStateChange = false; + + if(this._currentPreviewObjectCategory !== RoomObjectCategory.UNIT) this._roomEngine.changeObjectState(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, this._currentPreviewObjectCategory); + } + } + + public changeRoomObjectDirection(): void + { + if(this.isRoomEngineReady) + { + const roomObject = this._roomEngine.getRoomObject(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, this._currentPreviewObjectCategory); + + if(!roomObject) return; + + const direction = this._roomEngine.objectEventHandler.getValidRoomObjectDirection(roomObject, true); + + switch(this._currentPreviewObjectCategory) + { + case RoomObjectCategory.FLOOR: { + const floorLocation = new Vector3d(RoomPreviewer.PREVIEW_OBJECT_LOCATION_X, RoomPreviewer.PREVIEW_OBJECT_LOCATION_Y); + const floorDirection = new Vector3d(direction, direction, direction); + + this._roomEngine.updateRoomObjectFloor(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, floorLocation, floorDirection, null, null); + return; + } + case RoomObjectCategory.WALL: + //this._roomEngine.updateRoomObjectWall(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, null, direction, null, null); + return; + } + } + } + + private checkAutomaticRoomObjectStateChange(): void + { + if(this._automaticStateChange) + { + const time = GetTickerTime(); + + if(time > (this._previousAutomaticStateChangeTime + RoomPreviewer.AUTOMATIC_STATE_CHANGE_INTERVAL)) + { + this._previousAutomaticStateChangeTime = time; + + if(this.isRoomEngineReady) this._roomEngine.changeObjectState(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, this._currentPreviewObjectCategory); + } + } + } + + public getRoomCanvas(width: number, height: number): Container + { + if(this.isRoomEngineReady) + { + const displayObject = (this._roomEngine.getRoomInstanceDisplay(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID, width, height, this._currentPreviewScale) as Container); + + if(displayObject && (this._backgroundColor !== null)) + { + let backgroundSprite = this._backgroundSprite; + + if(!backgroundSprite) + { + backgroundSprite = new Sprite(Texture.WHITE); + + displayObject.addChildAt(backgroundSprite, 0); + } + + backgroundSprite.width = width; + backgroundSprite.height = height; + //backgroundSprite.tint = this._backgroundColor; + } + + this._roomEngine.setRoomInstanceRenderingCanvasMask(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID, true); + + const geometry = this._roomEngine.getRoomInstanceGeometry(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID); + + if(geometry) geometry.adjustLocation(new Vector3d(RoomPreviewer.PREVIEW_OBJECT_LOCATION_X, RoomPreviewer.PREVIEW_OBJECT_LOCATION_Y, 0), 30); + + this._currentPreviewCanvasWidth = width; + this._currentPreviewCanvasHeight = height; + + return displayObject; + } + + return null; + } + + public modifyRoomCanvas(width: number, height: number): void + { + if(this.isRoomEngineReady) + { + this._currentPreviewCanvasWidth = width; + this._currentPreviewCanvasHeight = height; + + if(this._backgroundSprite) + { + this._backgroundSprite.width = width; + this._backgroundSprite.height = height; + } + + this._roomEngine.initializeRoomInstanceRenderingCanvas(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID, width, height); + } + } + + public set addViewOffset(point: Point) + { + this._addViewOffset = point; + } + + public get addViewOffset(): Point + { + return this._addViewOffset; + } + + public updatePreviewObjectBoundingRectangle(point: Point = null): void + { + if(!point) point = new Point(0, 0); + + const objectBounds = this._roomEngine.getRoomObjectBoundingRectangle(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, this._currentPreviewObjectCategory, RoomPreviewer.PREVIEW_CANVAS_ID); + + if(objectBounds && point) + { + objectBounds.x += -(this._currentPreviewCanvasWidth >> 1); + objectBounds.y += -(this._currentPreviewCanvasHeight >> 1); + + objectBounds.x += -(point.x); + objectBounds.y += -(point.y); + + if(!this._currentPreviewRectangle) + { + this._currentPreviewRectangle = objectBounds; + } + else + { + const bounds = this._currentPreviewRectangle.clone().enlarge(objectBounds); + + if(((((bounds.width - this._currentPreviewRectangle.width) > ((this._currentPreviewCanvasWidth - this._currentPreviewRectangle.width) >> 1)) || ((bounds.height - this._currentPreviewRectangle.height) > ((this._currentPreviewCanvasHeight - this._currentPreviewRectangle.height) >> 1))) || (this._currentPreviewRectangle.width < 1)) || (this._currentPreviewRectangle.height < 1)) this._currentPreviewRectangle = bounds; + } + } + } + + private validatePreviewSize(point: Point): Point + { + if(((this._currentPreviewRectangle.width < 1) || (this._currentPreviewRectangle.height < 1))) + { + return point; + } + + if(this.isRoomEngineReady) + { + const geometry = this._roomEngine.getRoomInstanceGeometry(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID); + + if((this._currentPreviewRectangle.width > (this._currentPreviewCanvasWidth * (1 + RoomPreviewer.ALLOWED_IMAGE_CUT))) || (this._currentPreviewRectangle.height > (this._currentPreviewCanvasHeight * (1 + RoomPreviewer.ALLOWED_IMAGE_CUT)))) + { + if(RoomPreviewer.ZOOM_ENABLED) + { + if(this._roomEngine.getRoomInstanceRenderingCanvasScale(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID) !== 0.5) + { + this._roomEngine.setRoomInstanceRenderingCanvasScale(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID, 0.5, null, null); + + this._currentPreviewScale = RoomPreviewer.SCALE_SMALL; + this._currentPreviewNeedsZoomOut = true; + + point.x = (point.x >> 1); + point.y = (point.y >> 1); + + this._currentPreviewRectangle.x = (this._currentPreviewRectangle.x >> 2); + this._currentPreviewRectangle.y = (this._currentPreviewRectangle.y >> 2); + this._currentPreviewRectangle.width = (this._currentPreviewRectangle.width >> 2); + this._currentPreviewRectangle.height = (this._currentPreviewRectangle.height >> 2); + } + } + else + { + if(geometry.isZoomedIn()) + { + geometry.performZoomOut(); + + this._currentPreviewScale = RoomPreviewer.SCALE_SMALL; + this._currentPreviewNeedsZoomOut = true; + } + } + } + + else if(!this._currentPreviewNeedsZoomOut) + { + if(RoomPreviewer.ZOOM_ENABLED) + { + if(this._roomEngine.getRoomInstanceRenderingCanvasScale(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID) !== 1) + { + this._roomEngine.setRoomInstanceRenderingCanvasScale(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID, 1, null, null); + + this._currentPreviewScale = RoomPreviewer.SCALE_NORMAL; + } + } + else + { + if(!geometry.isZoomedIn()) + { + geometry.performZoomIn(); + + this._currentPreviewScale = RoomPreviewer.SCALE_NORMAL; + } + } + } + } + + return point; + } + + public zoomIn(): void + { + if(this.isRoomEngineReady) + { + if(RoomPreviewer.ZOOM_ENABLED) + { + this._roomEngine.setRoomInstanceRenderingCanvasScale(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID, 1); + } + else + { + const geometry = this._roomEngine.getRoomInstanceGeometry(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID); + + geometry.performZoomIn(); + } + } + + this._currentPreviewScale = RoomPreviewer.SCALE_NORMAL; + } + + public zoomOut(): void + { + if(this.isRoomEngineReady) + { + if(RoomPreviewer.ZOOM_ENABLED) + { + this._roomEngine.setRoomInstanceRenderingCanvasScale(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID, 0.5); + } + else + { + const geometry = this._roomEngine.getRoomInstanceGeometry(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID); + + geometry.performZoomOut(); + } + } + + this._currentPreviewScale = RoomPreviewer.SCALE_SMALL; + } + + public updateAvatarDirection(direction: number, headDirection: number): void + { + if(this.isRoomEngineReady) + { + this._roomEngine.updateRoomObjectUserLocation(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, new Vector3d(RoomPreviewer.PREVIEW_OBJECT_LOCATION_X, RoomPreviewer.PREVIEW_OBJECT_LOCATION_Y, 0), new Vector3d(RoomPreviewer.PREVIEW_OBJECT_LOCATION_X, RoomPreviewer.PREVIEW_OBJECT_LOCATION_Y, 0), false, 0, new Vector3d((direction * 45), 0, 0), (headDirection * 45)); + } + } + + public updateObjectRoom(floorType: string = null, wallType: string = null, landscapeType: string = null, _arg_4: boolean = false): boolean + { + if(this.isRoomEngineReady) return this._roomEngine.updateRoomInstancePlaneType(this._previewRoomId, floorType, wallType, landscapeType, _arg_4); + + return false; + } + + public updateRoomWallsAndFloorVisibility(wallsVisible: boolean, floorsVisible: boolean = true): void + { + if(this.isRoomEngineReady) this._roomEngine.updateRoomInstancePlaneVisibility(this._previewRoomId, wallsVisible, floorsVisible); + } + + private getCanvasOffset(point: Point): Point + { + if(((this._currentPreviewRectangle.width < 1) || (this._currentPreviewRectangle.height < 1))) return point; + + let x = (-(this._currentPreviewRectangle.left + this._currentPreviewRectangle.right) >> 1); + let y = (-(this._currentPreviewRectangle.top + this._currentPreviewRectangle.bottom) >> 1); + const height = ((this._currentPreviewCanvasHeight - this._currentPreviewRectangle.height) >> 1); + + if(height > 10) + { + y = (y + Math.min(15, (height - 10))); + } + else + { + if(this._currentPreviewObjectCategory !== RoomObjectCategory.UNIT) + { + y = (y + (5 - Math.max(0, (height / 2)))); + } + else + { + y = (y - (5 - Math.min(0, (height / 2)))); + } + } + + y = (y + this._addViewOffset.y); + x = (x + this._addViewOffset.x); + + const offsetX = (x - point.x); + const offsetY = (y - point.y); + + if((offsetX !== 0) || (offsetY !== 0)) + { + const _local_7 = Math.sqrt(((offsetX * offsetX) + (offsetY * offsetY))); + + if(_local_7 > 10) + { + x = (point.x + ((offsetX * 10) / _local_7)); + y = (point.y + ((offsetY * 10) / _local_7)); + } + + return new Point(x, y); + } + + return null; + } + + public updatePreviewRoomView(k: boolean = false): void + { + if(this._disableUpdate && !k) return; + + this.checkAutomaticRoomObjectStateChange(); + + if(this.isRoomEngineReady) + { + let offset = this._roomEngine.getRoomInstanceRenderingCanvasOffset(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID); + + if(offset) + { + this.updatePreviewObjectBoundingRectangle(offset); + + if(this._currentPreviewRectangle) + { + const scale = this._currentPreviewScale; + + offset = this.validatePreviewSize(offset); + + const canvasOffset = this.getCanvasOffset(offset); + + if(canvasOffset) + { + this._roomEngine.setRoomInstanceRenderingCanvasOffset(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID, canvasOffset); + } + + if(this._currentPreviewScale !== scale) this._currentPreviewRectangle = null; + } + } + } + } + + private onRoomInitializedonRoomInitialized(event: RoomEngineEvent): void + { + if(!event) return; + + switch(event.type) + { + case RoomEngineEvent.INITIALIZED: + if((event.roomId === this._previewRoomId) && this.isRoomEngineReady) + { + this._roomEngine.updateRoomInstancePlaneType(this._previewRoomId, '110', '99999'); + } + return; + } + } + + private onRoomObjectAdded(event: RoomEngineObjectEvent): void + { + if((event.roomId === this._previewRoomId) && (event.objectId === RoomPreviewer.PREVIEW_OBJECT_ID) && (event.category === this._currentPreviewObjectCategory)) + { + this._currentPreviewRectangle = null; + this._currentPreviewNeedsZoomOut = false; + + const roomObject = this._roomEngine.getRoomObject(event.roomId, event.objectId, event.category); + + if(roomObject && roomObject.model && (event.category === RoomObjectCategory.WALL)) + { + const sizeZ = roomObject.model.getValue(RoomObjectVariable.FURNITURE_SIZE_Z); + const centerZ = roomObject.model.getValue(RoomObjectVariable.FURNITURE_CENTER_Z); + + if((sizeZ !== null) || (centerZ !== null)) + { + this._roomEngine.updateRoomObjectWallLocation(event.roomId, event.objectId, new Vector3d(0.5, 2.3, (((3.6 - sizeZ) / 2) + centerZ))); + } + } + } + } + + public getRenderingCanvas(): IRoomRenderingCanvas + { + const renderingCanvas = this._roomEngine.getRoomInstanceRenderingCanvas(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID); + + if(!renderingCanvas) return null; + + return renderingCanvas; + } + + public getGenericRoomObjectImage(type: string, value: string, direction: IVector3D, scale: number, listener: IGetImageListener, bgColor: number = 0, extras: string = null, objectData: IObjectData = null, state: number = -1, frame: number = -1, posture: string = null): IImageResult + { + if(this.isRoomEngineReady) + { + return this._roomEngine.getGenericRoomObjectImage(type, value, direction, scale, listener, bgColor, extras, objectData, state, frame, posture); + } + + return null; + } + + public getRoomObjectImage(direction: IVector3D, scale: number, listener: IGetImageListener, bgColor: number = 0): IImageResult + { + if(this.isRoomEngineReady) + { + return this._roomEngine.getRoomObjectImage(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, this._currentPreviewObjectCategory, direction, scale, listener, bgColor); + } + + return null; + } + + public getRoomObjectCurrentImage(): Texture + { + if(this.isRoomEngineReady) + { + const roomObject = this._roomEngine.getRoomObject(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, this._currentPreviewObjectCategory); + + if(roomObject && roomObject.visualization) return roomObject.visualization.getImage(); + } + + return null; + } + + public getRoomPreviewObject(): IRoomObjectController + { + if(this.isRoomEngineReady) + { + const roomObject = this._roomEngine.getRoomObject(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, this._currentPreviewObjectCategory); + + if(roomObject) return roomObject; + } + + return null; + } + + public getRoomPreviewOwnRoomObject(): IRoomObjectController + { + if(this.isRoomEngineReady) + { + const roomObject = this._roomEngine.getRoomObject(this._previewRoomId, RoomEngine.ROOM_OBJECT_ID, RoomObjectCategory.ROOM); + + if(roomObject) return roomObject; + } + + return null; + } + + public get isRoomEngineReady(): boolean + { + return true; + } + + public get roomId(): number + { + return this._previewRoomId; + } + + public get backgroundColor(): number + { + return this._backgroundColor; + } + + public set backgroundColor(color: number) + { + this._backgroundColor = color; + } + + public get width(): number + { + return this._currentPreviewCanvasWidth; + } + + public get height(): number + { + return this._currentPreviewCanvasHeight; + } +} diff --git a/packages/room/src/RoomVariableEnum.ts b/packages/room/src/RoomVariableEnum.ts new file mode 100644 index 0000000..7fdc564 --- /dev/null +++ b/packages/room/src/RoomVariableEnum.ts @@ -0,0 +1,11 @@ +export class RoomVariableEnum +{ + public static ROOM_MIN_X: string = 'room_min_x'; + public static ROOM_MAX_X: string = 'room_max_x'; + public static ROOM_MIN_Y: string = 'room_min_y'; + public static ROOM_MAX_Y: string = 'room_max_y'; + public static ROOM_IS_PUBLIC: string = 'room_is_public'; + public static ROOM_Z_SCALE: string = 'room_z_scale'; + public static AD_DISPLAY_DELAY: string = 'ad_display_delay'; + public static IS_PLAYING_GAME: string = 'is_playing_game'; +} diff --git a/packages/room/src/index.ts b/packages/room/src/index.ts new file mode 100644 index 0000000..f09b10d --- /dev/null +++ b/packages/room/src/index.ts @@ -0,0 +1,36 @@ +export * from './GetRoomContentLoader'; +export * from './GetRoomEngine'; +export * from './GetRoomManager'; +export * from './GetRoomMessageHandler'; +export * from './GetRoomObjectLogicFactory'; +export * from './GetRoomObjectVisualizationFactory'; +export * from './ImageResult'; +export * from './PetColorResult'; +export * from './RoomContentLoader'; +export * from './RoomEngine'; +export * from './RoomInstance'; +export * from './RoomManager'; +export * from './RoomMessageHandler'; +export * from './RoomObjectEventHandler'; +export * from './RoomObjectLogicFactory'; +export * from './RoomObjectManager'; +export * from './RoomObjectVisualizationFactory'; +export * from './RoomPreviewer'; +export * from './RoomVariableEnum'; +export * from './messages'; +export * from './object'; +export * from './object/logic'; +export * from './object/logic/furniture'; +export * from './object/visualization'; +export * from './object/visualization/avatar'; +export * from './object/visualization/avatar/additions'; +export * from './object/visualization/data'; +export * from './object/visualization/furniture'; +export * from './object/visualization/pet'; +export * from './object/visualization/room'; +export * from './object/visualization/room/mask'; +export * from './object/visualization/room/utils'; +export * from './renderer'; +export * from './renderer/cache'; +export * from './renderer/utils'; +export * from './utils'; diff --git a/packages/room/src/messages/ObjectAdUpdateMessage.ts b/packages/room/src/messages/ObjectAdUpdateMessage.ts new file mode 100644 index 0000000..6edb597 --- /dev/null +++ b/packages/room/src/messages/ObjectAdUpdateMessage.ts @@ -0,0 +1,21 @@ +import { RoomObjectUpdateMessage } from './RoomObjectUpdateMessage'; + +export class ObjectAdUpdateMessage extends RoomObjectUpdateMessage +{ + public static IMAGE_LOADED: string = 'ROAUM_IMAGE_LOADED'; + public static IMAGE_LOADING_FAILED: string = 'ROAUM_IMAGE_FAILED'; + + private _type: string; + + constructor(type: string) + { + super(null, null); + + this._type = type; + } + + public get type(): string + { + return this._type; + } +} diff --git a/packages/room/src/messages/ObjectAvatarCarryObjectUpdateMessage.ts b/packages/room/src/messages/ObjectAvatarCarryObjectUpdateMessage.ts new file mode 100644 index 0000000..4671751 --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarCarryObjectUpdateMessage.ts @@ -0,0 +1,25 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarCarryObjectUpdateMessage extends ObjectStateUpdateMessage +{ + private _itemType: number; + private _itemName: string; + + constructor(itemType: number, itemName: string) + { + super(); + + this._itemType = itemType; + this._itemName = itemName; + } + + public get itemType(): number + { + return this._itemType; + } + + public get itemName(): string + { + return this._itemName; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectAvatarChatUpdateMessage.ts b/packages/room/src/messages/ObjectAvatarChatUpdateMessage.ts new file mode 100644 index 0000000..91b9834 --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarChatUpdateMessage.ts @@ -0,0 +1,18 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarChatUpdateMessage extends ObjectStateUpdateMessage +{ + private _numberOfWords: number; + + constructor(numberOfWords: number = 0) + { + super(); + + this._numberOfWords = numberOfWords; + } + + public get numberOfWords(): number + { + return this._numberOfWords; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectAvatarDanceUpdateMessage.ts b/packages/room/src/messages/ObjectAvatarDanceUpdateMessage.ts new file mode 100644 index 0000000..395739f --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarDanceUpdateMessage.ts @@ -0,0 +1,18 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarDanceUpdateMessage extends ObjectStateUpdateMessage +{ + private _danceStyle: number; + + constructor(danceStyle: number = 0) + { + super(); + + this._danceStyle = danceStyle; + } + + public get danceStyle(): number + { + return this._danceStyle; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectAvatarEffectUpdateMessage.ts b/packages/room/src/messages/ObjectAvatarEffectUpdateMessage.ts new file mode 100644 index 0000000..99c82a0 --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarEffectUpdateMessage.ts @@ -0,0 +1,25 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarEffectUpdateMessage extends ObjectStateUpdateMessage +{ + private _effect: number; + private _delayMilliseconds: number; + + constructor(effect: number, delayMilliseconds: number = 0) + { + super(); + + this._effect = effect; + this._delayMilliseconds = delayMilliseconds; + } + + public get effect(): number + { + return this._effect; + } + + public get delayMilliseconds(): number + { + return this._delayMilliseconds; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectAvatarExperienceUpdateMessage.ts b/packages/room/src/messages/ObjectAvatarExperienceUpdateMessage.ts new file mode 100644 index 0000000..ba082a9 --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarExperienceUpdateMessage.ts @@ -0,0 +1,18 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarExperienceUpdateMessage extends ObjectStateUpdateMessage +{ + private _gainedExperience: number; + + constructor(amount: number) + { + super(); + + this._gainedExperience = amount; + } + + public get gainedExperience(): number + { + return this._gainedExperience; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectAvatarExpressionUpdateMessage.ts b/packages/room/src/messages/ObjectAvatarExpressionUpdateMessage.ts new file mode 100644 index 0000000..8a33d15 --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarExpressionUpdateMessage.ts @@ -0,0 +1,18 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarExpressionUpdateMessage extends ObjectStateUpdateMessage +{ + private _expressionType: number; + + constructor(expressionType: number = 0) + { + super(); + + this._expressionType = expressionType; + } + + public get expressionType(): number + { + return this._expressionType; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectAvatarFigureUpdateMessage.ts b/packages/room/src/messages/ObjectAvatarFigureUpdateMessage.ts new file mode 100644 index 0000000..004e0ae --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarFigureUpdateMessage.ts @@ -0,0 +1,39 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarFigureUpdateMessage extends ObjectStateUpdateMessage +{ + private _figure: string; + private _gender: string; + private _subType: string; + private _isRiding: boolean; + + constructor(figure: string, gender: string = null, subType: string = null, isRiding: boolean = false) + { + super(); + + this._figure = figure; + this._gender = gender; + this._subType = subType; + this._isRiding = isRiding; + } + + public get figure(): string + { + return this._figure; + } + + public get gender(): string + { + return this._gender; + } + + public get subType(): string + { + return this._subType; + } + + public get isRiding(): boolean + { + return this._isRiding; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectAvatarFlatControlUpdateMessage.ts b/packages/room/src/messages/ObjectAvatarFlatControlUpdateMessage.ts new file mode 100644 index 0000000..5134488 --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarFlatControlUpdateMessage.ts @@ -0,0 +1,18 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarFlatControlUpdateMessage extends ObjectStateUpdateMessage +{ + private _level: number; + + constructor(level: number = 0) + { + super(); + + this._level = level; + } + + public get level(): number + { + return this._level; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectAvatarGestureUpdateMessage.ts b/packages/room/src/messages/ObjectAvatarGestureUpdateMessage.ts new file mode 100644 index 0000000..ad810f8 --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarGestureUpdateMessage.ts @@ -0,0 +1,18 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarGestureUpdateMessage extends ObjectStateUpdateMessage +{ + private _gesture: number; + + constructor(gesture: number = 0) + { + super(); + + this._gesture = gesture; + } + + public get gesture(): number + { + return this._gesture; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectAvatarGuideStatusUpdateMessage.ts b/packages/room/src/messages/ObjectAvatarGuideStatusUpdateMessage.ts new file mode 100644 index 0000000..bf5bd04 --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarGuideStatusUpdateMessage.ts @@ -0,0 +1,18 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarGuideStatusUpdateMessage extends ObjectStateUpdateMessage +{ + private _guideStatus: number; + + constructor(value: number) + { + super(); + + this._guideStatus = value; + } + + public get guideStatus(): number + { + return this._guideStatus; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectAvatarMutedUpdateMessage.ts b/packages/room/src/messages/ObjectAvatarMutedUpdateMessage.ts new file mode 100644 index 0000000..548aa16 --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarMutedUpdateMessage.ts @@ -0,0 +1,18 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarMutedUpdateMessage extends ObjectStateUpdateMessage +{ + private _isMuted: boolean; + + constructor(isMuted: boolean = false) + { + super(); + + this._isMuted = isMuted; + } + + public get isMuted(): boolean + { + return this._isMuted; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectAvatarOwnMessage.ts b/packages/room/src/messages/ObjectAvatarOwnMessage.ts new file mode 100644 index 0000000..cbdeeaf --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarOwnMessage.ts @@ -0,0 +1,4 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarOwnMessage extends ObjectStateUpdateMessage +{} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectAvatarPetGestureUpdateMessage.ts b/packages/room/src/messages/ObjectAvatarPetGestureUpdateMessage.ts new file mode 100644 index 0000000..c4f52da --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarPetGestureUpdateMessage.ts @@ -0,0 +1,18 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarPetGestureUpdateMessage extends ObjectStateUpdateMessage +{ + private _gesture: string; + + constructor(gesture: string) + { + super(); + + this._gesture = gesture; + } + + public get gesture(): string + { + return this._gesture; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectAvatarPlayerValueUpdateMessage.ts b/packages/room/src/messages/ObjectAvatarPlayerValueUpdateMessage.ts new file mode 100644 index 0000000..af74ee0 --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarPlayerValueUpdateMessage.ts @@ -0,0 +1,18 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarPlayerValueUpdateMessage extends ObjectStateUpdateMessage +{ + private _value: number; + + constructor(value: number) + { + super(); + + this._value = value; + } + + public get value(): number + { + return this._value; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectAvatarPlayingGameUpdateMessage.ts b/packages/room/src/messages/ObjectAvatarPlayingGameUpdateMessage.ts new file mode 100644 index 0000000..d18ff82 --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarPlayingGameUpdateMessage.ts @@ -0,0 +1,18 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarPlayingGameUpdateMessage extends ObjectStateUpdateMessage +{ + private _isPlayingGame: boolean; + + constructor(flag: boolean) + { + super(); + + this._isPlayingGame = flag; + } + + public get isPlayingGame(): boolean + { + return this._isPlayingGame; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectAvatarPostureUpdateMessage.ts b/packages/room/src/messages/ObjectAvatarPostureUpdateMessage.ts new file mode 100644 index 0000000..b7e5ec0 --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarPostureUpdateMessage.ts @@ -0,0 +1,25 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarPostureUpdateMessage extends ObjectStateUpdateMessage +{ + private _postureType: string; + private _parameter: string; + + constructor(postureType: string, parameter: string = '') + { + super(); + + this._postureType = postureType; + this._parameter = parameter; + } + + public get postureType(): string + { + return this._postureType; + } + + public get parameter(): string + { + return this._parameter; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectAvatarSelectedMessage.ts b/packages/room/src/messages/ObjectAvatarSelectedMessage.ts new file mode 100644 index 0000000..dc7ac65 --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarSelectedMessage.ts @@ -0,0 +1,18 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarSelectedMessage extends ObjectStateUpdateMessage +{ + private _selected: boolean; + + constructor(selected: boolean) + { + super(); + + this._selected = selected; + } + + public get selected(): boolean + { + return this._selected; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectAvatarSignUpdateMessage.ts b/packages/room/src/messages/ObjectAvatarSignUpdateMessage.ts new file mode 100644 index 0000000..bfb63b8 --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarSignUpdateMessage.ts @@ -0,0 +1,18 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarSignUpdateMessage extends ObjectStateUpdateMessage +{ + private _signType: number; + + constructor(signType: number = 0) + { + super(); + + this._signType = signType; + } + + public get signType(): number + { + return this._signType; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectAvatarSleepUpdateMessage.ts b/packages/room/src/messages/ObjectAvatarSleepUpdateMessage.ts new file mode 100644 index 0000000..747fd13 --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarSleepUpdateMessage.ts @@ -0,0 +1,18 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarSleepUpdateMessage extends ObjectStateUpdateMessage +{ + private _isSleeping: boolean; + + constructor(isSleeping: boolean = false) + { + super(); + + this._isSleeping = isSleeping; + } + + public get isSleeping(): boolean + { + return this._isSleeping; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectAvatarTypingUpdateMessage.ts b/packages/room/src/messages/ObjectAvatarTypingUpdateMessage.ts new file mode 100644 index 0000000..0038f76 --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarTypingUpdateMessage.ts @@ -0,0 +1,18 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarTypingUpdateMessage extends ObjectStateUpdateMessage +{ + private _isTyping: boolean; + + constructor(isTyping: boolean = false) + { + super(); + + this._isTyping = isTyping; + } + + public get isTyping(): boolean + { + return this._isTyping; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectAvatarUpdateMessage.ts b/packages/room/src/messages/ObjectAvatarUpdateMessage.ts new file mode 100644 index 0000000..a6fe8de --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarUpdateMessage.ts @@ -0,0 +1,33 @@ +import { IVector3D } from '@nitrots/api'; +import { ObjectMoveUpdateMessage } from './ObjectMoveUpdateMessage'; + +export class ObjectAvatarUpdateMessage extends ObjectMoveUpdateMessage +{ + private _headDirection: number; + private _canStandUp: boolean; + private _baseY: number; + + constructor(location: IVector3D, targetLocation: IVector3D, direction: IVector3D, headDirection: number, canStandUp: boolean, baseY: number) + { + super(location, targetLocation, direction); + + this._headDirection = headDirection; + this._canStandUp = canStandUp; + this._baseY = baseY; + } + + public get headDirection(): number + { + return this._headDirection; + } + + public get canStandUp(): boolean + { + return this._canStandUp; + } + + public get baseY(): number + { + return this._baseY; + } +} diff --git a/packages/room/src/messages/ObjectAvatarUseObjectUpdateMessage.ts b/packages/room/src/messages/ObjectAvatarUseObjectUpdateMessage.ts new file mode 100644 index 0000000..6997a70 --- /dev/null +++ b/packages/room/src/messages/ObjectAvatarUseObjectUpdateMessage.ts @@ -0,0 +1,18 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectAvatarUseObjectUpdateMessage extends ObjectStateUpdateMessage +{ + private _itemType: number; + + constructor(itemType: number) + { + super(); + + this._itemType = itemType; + } + + public get itemType(): number + { + return this._itemType; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectDataUpdateMessage.ts b/packages/room/src/messages/ObjectDataUpdateMessage.ts new file mode 100644 index 0000000..500c9ca --- /dev/null +++ b/packages/room/src/messages/ObjectDataUpdateMessage.ts @@ -0,0 +1,33 @@ +import { IObjectData } from '@nitrots/api'; +import { RoomObjectUpdateMessage } from './RoomObjectUpdateMessage'; + +export class ObjectDataUpdateMessage extends RoomObjectUpdateMessage +{ + private _state: number; + private _data: IObjectData; + private _extra: number; + + constructor(state: number, data: IObjectData, extra: number = null) + { + super(null, null); + + this._state = state; + this._data = data; + this._extra = extra; + } + + public get state(): number + { + return this._state; + } + + public get data(): IObjectData + { + return this._data; + } + + public get extra(): number + { + return this._extra; + } +} diff --git a/packages/room/src/messages/ObjectGroupBadgeUpdateMessage.ts b/packages/room/src/messages/ObjectGroupBadgeUpdateMessage.ts new file mode 100644 index 0000000..23aff3e --- /dev/null +++ b/packages/room/src/messages/ObjectGroupBadgeUpdateMessage.ts @@ -0,0 +1,27 @@ +import { RoomObjectUpdateMessage } from './RoomObjectUpdateMessage'; + +export class ObjectGroupBadgeUpdateMessage extends RoomObjectUpdateMessage +{ + public static BADGE_LOADED: string = 'ROGBUM_BADGE_LOADED'; + + private _badgeId: string; + private _assetName: string; + + constructor(badgeId: string, assetName: string) + { + super(null, null); + + this._badgeId = badgeId; + this._assetName = assetName; + } + + public get badgeId(): string + { + return this._badgeId; + } + + public get assetName(): string + { + return this._assetName; + } +} diff --git a/packages/room/src/messages/ObjectHeightUpdateMessage.ts b/packages/room/src/messages/ObjectHeightUpdateMessage.ts new file mode 100644 index 0000000..d781f20 --- /dev/null +++ b/packages/room/src/messages/ObjectHeightUpdateMessage.ts @@ -0,0 +1,19 @@ +import { IVector3D } from '@nitrots/api'; +import { RoomObjectUpdateMessage } from './RoomObjectUpdateMessage'; + +export class ObjectHeightUpdateMessage extends RoomObjectUpdateMessage +{ + private _height: number; + + constructor(location: IVector3D, direction: IVector3D, height: number) + { + super(location, direction); + + this._height = height; + } + + public get height(): number + { + return this._height; + } +} diff --git a/packages/room/src/messages/ObjectItemDataUpdateMessage.ts b/packages/room/src/messages/ObjectItemDataUpdateMessage.ts new file mode 100644 index 0000000..7017ed3 --- /dev/null +++ b/packages/room/src/messages/ObjectItemDataUpdateMessage.ts @@ -0,0 +1,18 @@ +import { RoomObjectUpdateMessage } from './RoomObjectUpdateMessage'; + +export class ObjectItemDataUpdateMessage extends RoomObjectUpdateMessage +{ + private _data: string; + + constructor(data: string) + { + super(null, null); + + this._data = data; + } + + public get data(): string + { + return this._data; + } +} diff --git a/packages/room/src/messages/ObjectModelDataUpdateMessage.ts b/packages/room/src/messages/ObjectModelDataUpdateMessage.ts new file mode 100644 index 0000000..ce61615 --- /dev/null +++ b/packages/room/src/messages/ObjectModelDataUpdateMessage.ts @@ -0,0 +1,25 @@ +import { RoomObjectUpdateMessage } from './RoomObjectUpdateMessage'; + +export class ObjectModelDataUpdateMessage extends RoomObjectUpdateMessage +{ + private _numberKey: string; + private _numberValue: number; + + constructor(numberKey: string, numberValue: number) + { + super(null, null); + + this._numberKey = numberKey; + this._numberValue = numberValue; + } + + public get numberKey(): string + { + return this._numberKey; + } + + public get numberValue(): number + { + return this._numberValue; + } +} diff --git a/packages/room/src/messages/ObjectMoveUpdateMessage.ts b/packages/room/src/messages/ObjectMoveUpdateMessage.ts new file mode 100644 index 0000000..c4fce0b --- /dev/null +++ b/packages/room/src/messages/ObjectMoveUpdateMessage.ts @@ -0,0 +1,28 @@ +import { IVector3D } from '@nitrots/api'; +import { RoomObjectUpdateMessage } from './RoomObjectUpdateMessage'; + +export class ObjectMoveUpdateMessage extends RoomObjectUpdateMessage +{ + private _targetLocation: IVector3D; + private _isSlide: boolean; + + constructor(location: IVector3D, targetLocation: IVector3D, direction: IVector3D, isSlide: boolean = false) + { + super(location, direction); + + this._targetLocation = targetLocation; + this._isSlide = isSlide; + } + + public get targetLocation(): IVector3D + { + if(!this._targetLocation) return this.location; + + return this._targetLocation; + } + + public get isSlide(): boolean + { + return this._isSlide; + } +} diff --git a/packages/room/src/messages/ObjectRoomColorUpdateMessage.ts b/packages/room/src/messages/ObjectRoomColorUpdateMessage.ts new file mode 100644 index 0000000..3387c0d --- /dev/null +++ b/packages/room/src/messages/ObjectRoomColorUpdateMessage.ts @@ -0,0 +1,41 @@ +import { RoomObjectUpdateMessage } from './RoomObjectUpdateMessage'; + +export class ObjectRoomColorUpdateMessage extends RoomObjectUpdateMessage +{ + public static BACKGROUND_COLOR: string = 'RORCUM_BACKGROUND_COLOR'; + + private _type: string; + private _color: number; + private _light: number; + private _backgroundOnly: boolean; + + constructor(type: string, color: number, light: number, backgroundOnly: boolean) + { + super(null, null); + + this._type = type; + this._color = color; + this._light = light; + this._backgroundOnly = backgroundOnly; + } + + public get type(): string + { + return this._type; + } + + public get color(): number + { + return this._color; + } + + public get light(): number + { + return this._light; + } + + public get backgroundOnly(): boolean + { + return this._backgroundOnly; + } +} diff --git a/packages/room/src/messages/ObjectRoomFloorHoleUpdateMessage.ts b/packages/room/src/messages/ObjectRoomFloorHoleUpdateMessage.ts new file mode 100644 index 0000000..4231678 --- /dev/null +++ b/packages/room/src/messages/ObjectRoomFloorHoleUpdateMessage.ts @@ -0,0 +1,56 @@ +import { RoomObjectUpdateMessage } from './RoomObjectUpdateMessage'; + +export class ObjectRoomFloorHoleUpdateMessage extends RoomObjectUpdateMessage +{ + public static ADD: string = 'ORPFHUM_ADD'; + public static REMOVE: string = 'ORPFHUM_REMOVE'; + + private _type: string; + private _id: number; + private _x: number; + private _y: number; + private _width: number; + private _height: number; + + constructor(type: string, id: number, x: number = 0, y: number = 0, width: number = 0, height: number = 0) + { + super(null, null); + + this._type = type; + this._id = id; + this._x = x; + this._y = y; + this._width = width; + this._height = height; + } + + public get type(): string + { + return this._type; + } + + public get id(): number + { + return this._id; + } + + public get x(): number + { + return this._x; + } + + public get y(): number + { + return this._y; + } + + public get width(): number + { + return this._width; + } + + public get height(): number + { + return this._height; + } +} diff --git a/packages/room/src/messages/ObjectRoomMapUpdateMessage.ts b/packages/room/src/messages/ObjectRoomMapUpdateMessage.ts new file mode 100644 index 0000000..2bd33a2 --- /dev/null +++ b/packages/room/src/messages/ObjectRoomMapUpdateMessage.ts @@ -0,0 +1,28 @@ +import { RoomMapData } from '../object'; +import { RoomObjectUpdateMessage } from './RoomObjectUpdateMessage'; + +export class ObjectRoomMapUpdateMessage extends RoomObjectUpdateMessage +{ + public static UPDATE_MAP: string = 'RORMUM_UPDATE_MAP'; + + private _type: string; + private _mapData: RoomMapData; + + constructor(mapData: RoomMapData) + { + super(null, null); + + this._type = ObjectRoomMapUpdateMessage.UPDATE_MAP; + this._mapData = mapData; + } + + public get type(): string + { + return this._type; + } + + public get mapData(): RoomMapData + { + return this._mapData; + } +} diff --git a/packages/room/src/messages/ObjectRoomMaskUpdateMessage.ts b/packages/room/src/messages/ObjectRoomMaskUpdateMessage.ts new file mode 100644 index 0000000..9ad096f --- /dev/null +++ b/packages/room/src/messages/ObjectRoomMaskUpdateMessage.ts @@ -0,0 +1,54 @@ +import { IVector3D } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; +import { RoomObjectUpdateMessage } from './RoomObjectUpdateMessage'; + +export class ObjectRoomMaskUpdateMessage extends RoomObjectUpdateMessage +{ + public static ADD_MASK: string = 'RORMUM_ADD_MASK'; + public static REMOVE_MASK: string = 'RORMUM_ADD_MASK'; + public static DOOR: string = 'door'; + public static WINDOW: string = 'window'; + public static HOLE: string = 'hole'; + + private _type: string; + private _maskId: string; + private _maskType: string; + private _maskLocation: IVector3D; + private _maskCategory: string; + + constructor(type: string, maskId: string, maskType: string = null, maskLocation: IVector3D = null, maskCategory: string = 'window') + { + super(null, null); + + this._type = type; + this._maskId = maskId; + this._maskType = maskType; + this._maskLocation = maskLocation ? new Vector3d(maskLocation.x, maskLocation.y, maskLocation.z) : null; + this._maskCategory = maskCategory; + } + + public get type(): string + { + return this._type; + } + + public get maskId(): string + { + return this._maskId; + } + + public get maskType(): string + { + return this._maskType; + } + + public get maskLocation(): IVector3D + { + return this._maskLocation; + } + + public get maskCategory(): string + { + return this._maskCategory; + } +} diff --git a/packages/room/src/messages/ObjectRoomPlanePropertyUpdateMessage.ts b/packages/room/src/messages/ObjectRoomPlanePropertyUpdateMessage.ts new file mode 100644 index 0000000..1d62f59 --- /dev/null +++ b/packages/room/src/messages/ObjectRoomPlanePropertyUpdateMessage.ts @@ -0,0 +1,28 @@ +import { RoomObjectUpdateMessage } from './RoomObjectUpdateMessage'; + +export class ObjectRoomPlanePropertyUpdateMessage extends RoomObjectUpdateMessage +{ + public static WALL_THICKNESS: string = 'RORPPUM_WALL_THICKNESS'; + public static FLOOR_THICKNESS: string = 'RORPVUM_FLOOR_THICKNESS'; + + private _type: string; + private _value: number; + + constructor(type: string, value: number) + { + super(null, null); + + this._type = type; + this._value = value; + } + + public get type(): string + { + return this._type; + } + + public get value(): number + { + return this._value; + } +} diff --git a/packages/room/src/messages/ObjectRoomPlaneVisibilityUpdateMessage.ts b/packages/room/src/messages/ObjectRoomPlaneVisibilityUpdateMessage.ts new file mode 100644 index 0000000..3bb79cd --- /dev/null +++ b/packages/room/src/messages/ObjectRoomPlaneVisibilityUpdateMessage.ts @@ -0,0 +1,28 @@ +import { RoomObjectUpdateMessage } from './RoomObjectUpdateMessage'; + +export class ObjectRoomPlaneVisibilityUpdateMessage extends RoomObjectUpdateMessage +{ + public static WALL_VISIBILITY: string = 'RORPVUM_WALL_VISIBILITY'; + public static FLOOR_VISIBILITY: string = 'RORPVUM_FLOOR_VISIBILITY'; + + private _type: string; + private _visible: boolean; + + constructor(type: string, visible: boolean) + { + super(null, null); + + this._type = type; + this._visible = visible; + } + + public get type(): string + { + return this._type; + } + + public get visible(): boolean + { + return this._visible; + } +} diff --git a/packages/room/src/messages/ObjectRoomUpdateMessage.ts b/packages/room/src/messages/ObjectRoomUpdateMessage.ts new file mode 100644 index 0000000..6d3607a --- /dev/null +++ b/packages/room/src/messages/ObjectRoomUpdateMessage.ts @@ -0,0 +1,29 @@ +import { RoomObjectUpdateMessage } from './RoomObjectUpdateMessage'; + +export class ObjectRoomUpdateMessage extends RoomObjectUpdateMessage +{ + public static ROOM_WALL_UPDATE: string = 'RORUM_ROOM_WALL_UPDATE'; + public static ROOM_FLOOR_UPDATE: string = 'RORUM_ROOM_FLOOR_UPDATE'; + public static ROOM_LANDSCAPE_UPDATE: string = 'RORUM_ROOM_LANDSCAPE_UPDATE'; + + private _type: string; + private _value: string; + + constructor(type: string, value: string) + { + super(null, null); + + this._type = type; + this._value = value; + } + + public get type(): string + { + return this._type; + } + + public get value(): string + { + return this._value; + } +} diff --git a/packages/room/src/messages/ObjectSelectedMessage.ts b/packages/room/src/messages/ObjectSelectedMessage.ts new file mode 100644 index 0000000..e807613 --- /dev/null +++ b/packages/room/src/messages/ObjectSelectedMessage.ts @@ -0,0 +1,18 @@ +import { ObjectStateUpdateMessage } from './ObjectStateUpdateMessage'; + +export class ObjectSelectedMessage extends ObjectStateUpdateMessage +{ + private _selected: boolean; + + constructor(selected: boolean) + { + super(); + + this._selected = selected; + } + + public get selected(): boolean + { + return this._selected; + } +} \ No newline at end of file diff --git a/packages/room/src/messages/ObjectStateUpdateMessage.ts b/packages/room/src/messages/ObjectStateUpdateMessage.ts new file mode 100644 index 0000000..a6db644 --- /dev/null +++ b/packages/room/src/messages/ObjectStateUpdateMessage.ts @@ -0,0 +1,9 @@ +import { RoomObjectUpdateMessage } from './RoomObjectUpdateMessage'; + +export class ObjectStateUpdateMessage extends RoomObjectUpdateMessage +{ + constructor() + { + super(null, null); + } +} diff --git a/packages/room/src/messages/ObjectTileCursorUpdateMessage.ts b/packages/room/src/messages/ObjectTileCursorUpdateMessage.ts new file mode 100644 index 0000000..dbfb724 --- /dev/null +++ b/packages/room/src/messages/ObjectTileCursorUpdateMessage.ts @@ -0,0 +1,40 @@ +import { IVector3D } from '@nitrots/api'; +import { RoomObjectUpdateMessage } from './RoomObjectUpdateMessage'; + +export class ObjectTileCursorUpdateMessage extends RoomObjectUpdateMessage +{ + private _height: number; + private _sourceEventId: string; + private _visible: boolean; + private _toggleVisibility: boolean; + + constructor(k: IVector3D, height: number, visible: boolean, sourceEventId: string, toggleVisibility: boolean = false) + { + super(k, null); + + this._height = height; + this._visible = visible; + this._sourceEventId = sourceEventId; + this._toggleVisibility = toggleVisibility; + } + + public get height(): number + { + return this._height; + } + + public get visible(): boolean + { + return this._visible; + } + + public get sourceEventId(): string + { + return this._sourceEventId; + } + + public get toggleVisibility(): boolean + { + return this._toggleVisibility; + } +} diff --git a/packages/room/src/messages/ObjectVisibilityUpdateMessage.ts b/packages/room/src/messages/ObjectVisibilityUpdateMessage.ts new file mode 100644 index 0000000..3d7c836 --- /dev/null +++ b/packages/room/src/messages/ObjectVisibilityUpdateMessage.ts @@ -0,0 +1,21 @@ +import { RoomObjectUpdateMessage } from './RoomObjectUpdateMessage'; + +export class ObjectVisibilityUpdateMessage extends RoomObjectUpdateMessage +{ + public static ENABLED: string = 'ROVUM_ENABLED'; + public static DISABLED: string = 'ROVUM_DISABLED'; + + private _type: string; + + constructor(type: string) + { + super(null, null); + + this._type = type; + } + + public get type(): string + { + return this._type; + } +} diff --git a/packages/room/src/messages/RoomObjectUpdateMessage.ts b/packages/room/src/messages/RoomObjectUpdateMessage.ts new file mode 100644 index 0000000..0dfe63d --- /dev/null +++ b/packages/room/src/messages/RoomObjectUpdateMessage.ts @@ -0,0 +1,23 @@ +import { IVector3D } from '@nitrots/api'; + +export class RoomObjectUpdateMessage +{ + private _location: IVector3D; + private _direction: IVector3D; + + constructor(location: IVector3D, direction: IVector3D) + { + this._location = location; + this._direction = direction; + } + + public get location(): IVector3D + { + return this._location; + } + + public get direction(): IVector3D + { + return this._direction; + } +} diff --git a/packages/room/src/messages/index.ts b/packages/room/src/messages/index.ts new file mode 100644 index 0000000..e4f6bd9 --- /dev/null +++ b/packages/room/src/messages/index.ts @@ -0,0 +1,41 @@ +export * from './ObjectAdUpdateMessage'; +export * from './ObjectAvatarCarryObjectUpdateMessage'; +export * from './ObjectAvatarChatUpdateMessage'; +export * from './ObjectAvatarDanceUpdateMessage'; +export * from './ObjectAvatarEffectUpdateMessage'; +export * from './ObjectAvatarExperienceUpdateMessage'; +export * from './ObjectAvatarExpressionUpdateMessage'; +export * from './ObjectAvatarFigureUpdateMessage'; +export * from './ObjectAvatarFlatControlUpdateMessage'; +export * from './ObjectAvatarGestureUpdateMessage'; +export * from './ObjectAvatarGuideStatusUpdateMessage'; +export * from './ObjectAvatarMutedUpdateMessage'; +export * from './ObjectAvatarOwnMessage'; +export * from './ObjectAvatarPetGestureUpdateMessage'; +export * from './ObjectAvatarPlayerValueUpdateMessage'; +export * from './ObjectAvatarPlayingGameUpdateMessage'; +export * from './ObjectAvatarPostureUpdateMessage'; +export * from './ObjectAvatarSelectedMessage'; +export * from './ObjectAvatarSignUpdateMessage'; +export * from './ObjectAvatarSleepUpdateMessage'; +export * from './ObjectAvatarTypingUpdateMessage'; +export * from './ObjectAvatarUpdateMessage'; +export * from './ObjectAvatarUseObjectUpdateMessage'; +export * from './ObjectDataUpdateMessage'; +export * from './ObjectGroupBadgeUpdateMessage'; +export * from './ObjectHeightUpdateMessage'; +export * from './ObjectItemDataUpdateMessage'; +export * from './ObjectModelDataUpdateMessage'; +export * from './ObjectMoveUpdateMessage'; +export * from './ObjectRoomColorUpdateMessage'; +export * from './ObjectRoomFloorHoleUpdateMessage'; +export * from './ObjectRoomMapUpdateMessage'; +export * from './ObjectRoomMaskUpdateMessage'; +export * from './ObjectRoomPlanePropertyUpdateMessage'; +export * from './ObjectRoomPlaneVisibilityUpdateMessage'; +export * from './ObjectRoomUpdateMessage'; +export * from './ObjectSelectedMessage'; +export * from './ObjectStateUpdateMessage'; +export * from './ObjectTileCursorUpdateMessage'; +export * from './ObjectVisibilityUpdateMessage'; +export * from './RoomObjectUpdateMessage'; diff --git a/packages/room/src/object/RoomFloorHole.ts b/packages/room/src/object/RoomFloorHole.ts new file mode 100644 index 0000000..456dfd5 --- /dev/null +++ b/packages/room/src/object/RoomFloorHole.ts @@ -0,0 +1,35 @@ +export class RoomFloorHole +{ + private _x: number; + private _y: number; + private _width: number; + private _height: number; + + constructor(x: number, y: number, width: number, height: number) + { + this._x = x; + this._y = y; + this._width = width; + this._height = height; + } + + public get x(): number + { + return this._x; + } + + public get y(): number + { + return this._y; + } + + public get width(): number + { + return this._width; + } + + public get height(): number + { + return this._height; + } +} \ No newline at end of file diff --git a/packages/room/src/object/RoomMapData.ts b/packages/room/src/object/RoomMapData.ts new file mode 100644 index 0000000..2013364 --- /dev/null +++ b/packages/room/src/object/RoomMapData.ts @@ -0,0 +1,90 @@ +import { IRoomMapData } from '@nitrots/api'; + +export class RoomMapData implements IRoomMapData +{ + private _width: number; + private _height: number; + private _wallHeight: number; + private _fixedWallsHeight: number; + private _tileMap: { height: number }[][]; + private _holeMap: { id: number, x: number, y: number, width: number, height: number }[]; + private _doors: { x: number, y: number, z: number, dir: number }[]; + private _dimensions: { minX: number, maxX: number, minY: number, maxY: number }; + + constructor() + { + this._width = 0; + this._height = 0; + this._wallHeight = 0; + this._fixedWallsHeight = 0; + this._tileMap = []; + this._holeMap = []; + this._doors = []; + this._dimensions = { + minX: 0, + maxX: 0, + minY: 0, + maxY: 0 + }; + } + + public get width(): number + { + return this._width; + } + + public set width(width: number) + { + this._width = width; + } + + public get height(): number + { + return this._height; + } + + public set height(height: number) + { + this._height = height; + } + + public get wallHeight(): number + { + return this._wallHeight; + } + + public set wallHeight(wallHeight: number) + { + this._wallHeight = wallHeight; + } + + public get fixedWallsHeight(): number + { + return this._fixedWallsHeight; + } + + public set fixedWallsHeight(fixedWallsHeight: number) + { + this._fixedWallsHeight = fixedWallsHeight; + } + + public get tileMap(): { height: number }[][] + { + return this._tileMap; + } + + public get holeMap(): { id: number, x: number, y: number, width: number, height: number }[] + { + return this._holeMap; + } + + public get doors(): { x: number, y: number, z: number, dir: number }[] + { + return this._doors; + } + + public get dimensions(): { minX: number, maxX: number, minY: number, maxY: number } + { + return this._dimensions; + } +} diff --git a/packages/room/src/object/RoomMapMaskData.ts b/packages/room/src/object/RoomMapMaskData.ts new file mode 100644 index 0000000..325d092 --- /dev/null +++ b/packages/room/src/object/RoomMapMaskData.ts @@ -0,0 +1,16 @@ +import { IVector3D } from '@nitrots/api'; + +export class RoomMapMaskData +{ + private _masks: { id: string, type: string, category: string, locations: IVector3D[] }[]; + + constructor() + { + this._masks = []; + } + + public get masks(): { id: string, type: string, category: string, locations: IVector3D[] }[] + { + return this._masks; + } +} diff --git a/packages/room/src/object/RoomObject.ts b/packages/room/src/object/RoomObject.ts new file mode 100644 index 0000000..55a2bfa --- /dev/null +++ b/packages/room/src/object/RoomObject.ts @@ -0,0 +1,229 @@ +import { IRoomObjectController, IRoomObjectEventHandler, IRoomObjectModel, IRoomObjectMouseHandler, IRoomObjectUpdateMessage, IRoomObjectVisualization, IVector3D } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; +import { RoomObjectModel } from './RoomObjectModel'; + +export class RoomObject implements IRoomObjectController +{ + private static OBJECT_COUNTER: number = 0; + + private _id: number; + private _instanceId: number; + private _type: string; + private _model: IRoomObjectModel = new RoomObjectModel(); + + private _location: IVector3D = new Vector3d(); + private _direction: IVector3D = new Vector3d(); + private _states: number[] = []; + + private _visualization: IRoomObjectVisualization = null; + private _logic: IRoomObjectEventHandler = null; + private _pendingLogicMessages: IRoomObjectUpdateMessage[] = []; + + private _updateCounter: number = 0; + private _isReady: boolean = false; + + constructor(id: number, stateCount: number, type: string) + { + this._id = id; + this._instanceId = RoomObject.OBJECT_COUNTER++; + this._type = type; + + let i = (stateCount - 1); + + while(i >= 0) + { + this._states[i] = 0; + + i--; + } + } + + public dispose(): void + { + this._pendingLogicMessages = []; + + this.setVisualization(null); + this.setLogic(null); + + if(this._model) this._model.dispose(); + } + + public getLocation(): IVector3D + { + return this._location; + } + + public setLocation(vector: IVector3D): void + { + if(!vector) return; + + if((vector.x === this._location.x) && (vector.y === this._location.y) && (vector.z === this._location.z)) return; + + this._location.x = vector.x; + this._location.y = vector.y; + this._location.z = vector.z; + + this._updateCounter++; + } + + public getDirection(): IVector3D + { + return this._direction; + } + + public setDirection(vector: IVector3D): void + { + if(!vector) return; + + if((vector.x === this._direction.x) && (vector.y === this._direction.y) && (vector.z === this._direction.z)) return; + + this._direction.x = (((vector.x % 360) + 360) % 360); + this._direction.y = (((vector.y % 360) + 360) % 360); + this._direction.z = (((vector.z % 360) + 360) % 360); + + this._updateCounter++; + } + + public getState(index: number = 0): number + { + if((index >= 0) && (index < this._states.length)) + { + return this._states[index]; + } + + return -1; + } + + public setState(state: number, index: number = 0): boolean + { + if((index >= 0) && (index < this._states.length)) + { + if(this._states[index] !== state) + { + this._states[index] = state; + + this._updateCounter++; + } + + return true; + } + + return false; + } + + public setVisualization(visualization: IRoomObjectVisualization): void + { + if(this._visualization === visualization) return; + + if(this._visualization) this._visualization.dispose(); + + this._visualization = visualization; + + if(this._visualization) this._visualization.object = this; + } + + public setLogic(logic: IRoomObjectEventHandler): void + { + if(this._logic === logic) return; + + const eventHandler = this._logic; + + if(eventHandler) + { + this._logic = null; + + eventHandler.setObject(null); + } + + this._logic = logic; + + if(this._logic) + { + this._logic.setObject(this); + + while(this._pendingLogicMessages.length) + { + const message = this._pendingLogicMessages.shift(); + + this._logic.processUpdateMessage(message); + } + } + } + + public processUpdateMessage(message: IRoomObjectUpdateMessage): void + { + if(this._logic) return this._logic.processUpdateMessage(message); + + this._pendingLogicMessages.push(message); + } + + public tearDown(): void + { + if(this._logic) this._logic.tearDown(); + } + + public get id(): number + { + return this._id; + } + + public get instanceId(): number + { + return this._instanceId; + } + + public get type(): string + { + return this._type; + } + + public get model(): IRoomObjectModel + { + return this._model; + } + + public get visualization(): IRoomObjectVisualization + { + return this._visualization; + } + + public get mouseHandler(): IRoomObjectMouseHandler + { + return this._logic as IRoomObjectMouseHandler; + } + + public get logic(): IRoomObjectEventHandler + { + return this._logic; + } + + public get location(): IVector3D + { + return this._location; + } + + public get direction(): IVector3D + { + return this._direction; + } + + public get updateCounter(): number + { + return this._updateCounter; + } + + public set updateCounter(count: number) + { + this._updateCounter = count; + } + + public get isReady(): boolean + { + return this._isReady; + } + + public set isReady(flag: boolean) + { + this._isReady = flag; + } +} diff --git a/packages/room/src/object/RoomObjectModel.ts b/packages/room/src/object/RoomObjectModel.ts new file mode 100644 index 0000000..bc7a2ff --- /dev/null +++ b/packages/room/src/object/RoomObjectModel.ts @@ -0,0 +1,47 @@ +import { IRoomObjectModel } from '@nitrots/api'; + +export class RoomObjectModel implements IRoomObjectModel +{ + private _map: Map = new Map(); + private _updateCounter: number = 0; + + public dispose(): void + { + this._map.clear(); + + this._updateCounter = 0; + } + + public getValue(key: string): T + { + const existing = this._map.get(key); + + return (existing as T); + } + + public setValue(key: string, value: T): void + { + if(this._map.has(key)) + { + if(this._map.get(key) === value) return; + } + + this._map.set(key, (value as T)); + + this._updateCounter++; + } + + public removeKey(key: string): void + { + if(!key) return; + + this._map.delete(key); + + this._updateCounter++; + } + + public get updateCounter(): number + { + return this._updateCounter; + } +} diff --git a/packages/room/src/object/RoomPlaneBitmapMaskData.ts b/packages/room/src/object/RoomPlaneBitmapMaskData.ts new file mode 100644 index 0000000..26599be --- /dev/null +++ b/packages/room/src/object/RoomPlaneBitmapMaskData.ts @@ -0,0 +1,56 @@ +import { IVector3D } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; + +export class RoomPlaneBitmapMaskData +{ + public static WINDOW: string = 'window'; + public static HOLE: string = 'hole'; + + private _loc: Vector3d; + private _type: string; + private _category: string; + + constructor(type: string, loc: IVector3D, category: string) + { + this.type = type; + this.loc = loc; + this.category = category; + } + + public get loc(): IVector3D + { + return this._loc; + } + + public set loc(k: IVector3D) + { + if(!this._loc) this._loc = new Vector3d(); + + this._loc.assign(k); + } + + public get type(): string + { + return this._type; + } + + public set type(type: string) + { + this._type = type; + } + + public get category(): string + { + return this._category; + } + + public set category(category: string) + { + this._category = category; + } + + public dispose(): void + { + this._loc = null; + } +} diff --git a/packages/room/src/object/RoomPlaneBitmapMaskParser.ts b/packages/room/src/object/RoomPlaneBitmapMaskParser.ts new file mode 100644 index 0000000..82a223d --- /dev/null +++ b/packages/room/src/object/RoomPlaneBitmapMaskParser.ts @@ -0,0 +1,147 @@ +import { IVector3D } from '@nitrots/api'; +import { RoomMapMaskData } from './RoomMapMaskData'; +import { RoomPlaneBitmapMaskData } from './RoomPlaneBitmapMaskData'; + +export class RoomPlaneBitmapMaskParser +{ + private _masks: Map; + + constructor() + { + this._masks = new Map(); + } + + public get maskCount(): number + { + return this._masks.size; + } + + public dispose(): void + { + if(this._masks) + { + this.reset(); + + this._masks = null; + } + } + + public initialize(k: RoomMapMaskData): boolean + { + if(!k) return false; + + this._masks.clear(); + + if(k.masks.length) + { + for(const mask of k.masks) + { + if(!mask) continue; + + const location = mask.locations.length ? mask.locations[0] : null; + + if(!location) continue; + + this._masks.set(mask.id, new RoomPlaneBitmapMaskData(mask.type, location, mask.category)); + } + } + + return true; + } + + public reset(): void + { + for(const mask of this._masks.values()) + { + if(!mask) continue; + + mask.dispose(); + } + + this._masks.clear(); + } + + public addMask(k: string, _arg_2: string, _arg_3: IVector3D, _arg_4: string): void + { + const mask = new RoomPlaneBitmapMaskData(_arg_2, _arg_3, _arg_4); + + this._masks.delete(k); + this._masks.set(k, mask); + } + + public removeMask(k: string): boolean + { + const existing = this._masks.get(k); + + if(existing) + { + this._masks.delete(k); + + existing.dispose(); + + return true; + } + + return false; + } + + public getXML(): RoomMapMaskData + { + const data = new RoomMapMaskData(); + + for(const [key, mask] of this._masks.entries()) + { + if(!mask) continue; + + const type = this.getMaskType(mask); + const category = this.getMaskCategory(mask); + const location = this.getMaskLocation(mask); + + if(type && category && location) + { + const newMask: any = { + id: key, + type: type, + category: category, + locations: [ + { + x: location.x, + y: location.y, + z: location.z + } + ] + }; + + data.masks.push(newMask); + } + } + + return data; + } + + public getMaskLocation(mask: RoomPlaneBitmapMaskData): IVector3D + { + if(!mask) return null; + + return mask.loc; + } + + public getMaskType(mask: RoomPlaneBitmapMaskData): string + { + if(!mask) return null; + + return mask.type; + } + + public getMaskCategory(mask: RoomPlaneBitmapMaskData): string + { + if(!mask) return null; + + return mask.category; + } + + public get masks(): Map + { + return this._masks; + } +} diff --git a/packages/room/src/object/RoomPlaneData.ts b/packages/room/src/object/RoomPlaneData.ts new file mode 100644 index 0000000..3f0cc4e --- /dev/null +++ b/packages/room/src/object/RoomPlaneData.ts @@ -0,0 +1,202 @@ +import { IVector3D } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; +import { RoomPlaneMaskData } from './RoomPlaneMaskData'; + +export class RoomPlaneData +{ + public static PLANE_UNDEFINED: number = 0; + public static PLANE_FLOOR: number = 1; + public static PLANE_WALL: number = 2; + public static PLANE_LANDSCAPE: number = 3; + public static PLANE_BILLBOARD: number = 4; + + private _type: number = 0; + private _loc: Vector3d = null; + private _leftSide: Vector3d = null; + private _rightSide: Vector3d = null; + private _normal: Vector3d = null; + private _normalDirection: Vector3d = null; + private _secondaryNormals: Vector3d[]; + private _masks: RoomPlaneMaskData[]; + + constructor(k: number, _arg_2: IVector3D, _arg_3: IVector3D, _arg_4: IVector3D, _arg_5: IVector3D[]) + { + let _local_6: number; + let _local_7: number; + let _local_8: number; + let _local_9: number; + let _local_10: number; + let _local_11: number; + let _local_12: IVector3D; + let _local_13: Vector3d; + this._secondaryNormals = []; + this._masks = []; + this._loc = new Vector3d(); + this._loc.assign(_arg_2); + this._leftSide = new Vector3d(); + this._leftSide.assign(_arg_3); + this._rightSide = new Vector3d(); + this._rightSide.assign(_arg_4); + this._type = k; + if(((!(_arg_3 == null)) && (!(_arg_4 == null)))) + { + this._normal = Vector3d.crossProduct(_arg_3, _arg_4); + _local_6 = 0; + _local_7 = 0; + _local_8 = 0; + _local_9 = 0; + _local_10 = 0; + if(((!(this.normal.x == 0)) || (!(this.normal.y == 0)))) + { + _local_9 = this.normal.x; + _local_10 = this.normal.y; + _local_6 = (360 + ((Math.atan2(_local_10, _local_9) / Math.PI) * 180)); + if(_local_6 >= 360) + { + _local_6 = (_local_6 - 360); + } + _local_9 = Math.sqrt(((this.normal.x * this.normal.x) + (this.normal.y * this.normal.y))); + _local_10 = this.normal.z; + _local_7 = (360 + ((Math.atan2(_local_10, _local_9) / Math.PI) * 180)); + if(_local_7 >= 360) + { + _local_7 = (_local_7 - 360); + } + } + else + { + if(this.normal.z < 0) + { + _local_7 = 90; + } + else + { + _local_7 = 270; + } + } + this._normalDirection = new Vector3d(_local_6, _local_7, _local_8); + } + if(((!(_arg_5 == null)) && (_arg_5.length > 0))) + { + _local_11 = 0; + while(_local_11 < _arg_5.length) + { + _local_12 = _arg_5[_local_11]; + if(((!(_local_12 == null)) && (_local_12.length > 0))) + { + _local_13 = new Vector3d(); + _local_13.assign(_local_12); + _local_13.multiply((1 / _local_13.length)); + this._secondaryNormals.push(_local_13); + } + _local_11++; + } + } + } + + public get type(): number + { + return this._type; + } + + public get loc(): IVector3D + { + return this._loc; + } + + public get leftSide(): IVector3D + { + return this._leftSide; + } + + public get rightSide(): IVector3D + { + return this._rightSide; + } + + public get normal(): IVector3D + { + return this._normal; + } + + public get normalDirection(): IVector3D + { + return this._normalDirection; + } + + public get secondaryNormalCount(): number + { + return this._secondaryNormals.length; + } + + public get maskCount(): number + { + return this._masks.length; + } + + public getSecondaryNormal(k: number): IVector3D + { + if(((k < 0) || (k >= this.secondaryNormalCount))) + { + return null; + } + const _local_2: Vector3d = new Vector3d(); + _local_2.assign((this._secondaryNormals[k] as IVector3D)); + return _local_2; + } + + public addMask(k: number, _arg_2: number, _arg_3: number, _arg_4: number): void + { + const _local_5: RoomPlaneMaskData = new RoomPlaneMaskData(k, _arg_2, _arg_3, _arg_4); + this._masks.push(_local_5); + } + + private getMask(k: number): RoomPlaneMaskData + { + if(((k < 0) || (k >= this.maskCount))) + { + return null; + } + return this._masks[k]; + } + + public getMaskLeftSideLoc(k: number): number + { + const _local_2: RoomPlaneMaskData = this.getMask(k); + if(_local_2 != null) + { + return _local_2.leftSideLoc; + } + return -1; + } + + public getMaskRightSideLoc(k: number): number + { + const _local_2: RoomPlaneMaskData = this.getMask(k); + if(_local_2 != null) + { + return _local_2.rightSideLoc; + } + return -1; + } + + public getMaskLeftSideLength(k: number): number + { + const _local_2: RoomPlaneMaskData = this.getMask(k); + if(_local_2 != null) + { + return _local_2.leftSideLength; + } + return -1; + } + + public getMaskRightSideLength(k: number): number + { + const _local_2: RoomPlaneMaskData = this.getMask(k); + if(_local_2 != null) + { + return _local_2.rightSideLength; + } + return -1; + } +} diff --git a/packages/room/src/object/RoomPlaneMaskData.ts b/packages/room/src/object/RoomPlaneMaskData.ts new file mode 100644 index 0000000..7baf59c --- /dev/null +++ b/packages/room/src/object/RoomPlaneMaskData.ts @@ -0,0 +1,35 @@ +export class RoomPlaneMaskData +{ + private _leftSideLoc: number = 0; + private _rightSideLoc: number = 0; + private _leftSideLength: number = 0; + private _rightSideLength: number = 0; + + constructor(k: number, _arg_2: number, _arg_3: number, _arg_4: number) + { + this._leftSideLoc = k; + this._rightSideLoc = _arg_2; + this._leftSideLength = _arg_3; + this._rightSideLength = _arg_4; + } + + public get leftSideLoc(): number + { + return this._leftSideLoc; + } + + public get rightSideLoc(): number + { + return this._rightSideLoc; + } + + public get leftSideLength(): number + { + return this._leftSideLength; + } + + public get rightSideLength(): number + { + return this._rightSideLength; + } +} diff --git a/packages/room/src/object/RoomPlaneParser.ts b/packages/room/src/object/RoomPlaneParser.ts new file mode 100644 index 0000000..da5602e --- /dev/null +++ b/packages/room/src/object/RoomPlaneParser.ts @@ -0,0 +1,1661 @@ +import { IVector3D } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; +import { Point } from 'pixi.js'; +import { RoomFloorHole } from './RoomFloorHole'; +import { RoomMapData } from './RoomMapData'; +import { RoomPlaneData } from './RoomPlaneData'; +import { RoomWallData } from './RoomWallData'; + +export class RoomPlaneParser +{ + private static FLOOR_THICKNESS: number = 0.25; + private static WALL_THICKNESS: number = 0.25; + private static MAX_WALL_ADDITIONAL_HEIGHT: number = 20; + + public static TILE_BLOCKED: number = -110; + public static TILE_HOLE: number = -100; + + private _tileMatrix: number[][]; + private _tileMatrixOriginal: number[][]; + private _width: number = 0; + private _height: number = 0; + private _minX: number = 0; + private _maxX: number = 0; + private _minY: number = 0; + private _maxY: number = 0; + private _planes: RoomPlaneData[]; + private _wallHeight: number; + private _wallThicknessMultiplier: number; + private _floorThicknessMultiplier: number; + private _fixedWallHeight: number = -1; + private _floorHeight: number = 0; + private _floorHoles: Map; + private _floorHoleMatrix: boolean[][]; + + constructor() + { + this._tileMatrix = []; + this._tileMatrixOriginal = []; + this._planes = []; + this._floorHoleMatrix = []; + this._wallHeight = 3.6; + this._wallThicknessMultiplier = 1; + this._floorThicknessMultiplier = 1; + this._floorHoles = new Map(); + } + + private static getFloorHeight(matricies: number[][]): number + { + const length = matricies.length; + + if(!length) return 0; + + let tileHeight = 0; + + let i = 0; + + while(i < length) + { + const matrix = matricies[i]; + + let j = 0; + + while(j < matrix.length) + { + const height = matrix[j]; + + if(height > tileHeight) tileHeight = height; + + j++; + } + + i++; + } + + return tileHeight; + } + + private static findEntranceTile(matricies: number[][]): Point + { + if(!matricies) return null; + + const length = matricies.length; + + if(!length) return null; + + const _local_6: number[] = []; + + let i = 0; + + while(i < length) + { + const matrix = matricies[i]; + + if(!matrix || !matrix.length) return null; + + let j = 0; + + while(j < matrix.length) + { + if(matrix[j] >= 0) + { + _local_6.push(j); + + break; + } + + j++; + } + + if(_local_6.length < (i + 1)) _local_6.push((matrix.length + 1)); + + i++; + } + + i = 1; + + while(i < (_local_6.length - 1)) + { + if(((Math.trunc(_local_6[i]) <= (Math.trunc(_local_6[(i - 1)]) - 1)) && (Math.trunc(_local_6[i]) <= (Math.trunc(_local_6[(i + 1)]) - 1)))) return new Point(Math.trunc((_local_6[i]) | 0), i); + + i++; + } + + return null; + } + + private static expandFloorTiles(k: number[][]): number[][] + { + let _local_5: number; + let _local_6: number; + let _local_7: number; + let _local_8: number; + let _local_10: number; + let _local_11: number; + let _local_12: number; + let _local_13: number; + let _local_14: number; + let _local_15: number; + let _local_16: number; + let _local_17: number; + const _local_2 = k.length; + const _local_3: number = k[0].length; + const _local_4: number[][] = []; + _local_6 = 0; + while(_local_6 < (_local_2 * 4)) + { + _local_4[_local_6] = []; + _local_6++; + } + let _local_9 = 0; + _local_6 = 0; + while(_local_6 < _local_2) + { + _local_10 = 0; + _local_5 = 0; + while(_local_5 < _local_3) + { + _local_11 = k[_local_6][_local_5]; + if(((_local_11 < 0) || (_local_11 <= 0xFF))) + { + _local_8 = 0; + while(_local_8 < 4) + { + _local_7 = 0; + while(_local_7 < 4) + { + if(_local_4[(_local_9 + _local_8)] === undefined) _local_4[(_local_9 + _local_8)] = []; + + _local_4[(_local_9 + _local_8)][(_local_10 + _local_7)] = ((_local_11 < 0) ? _local_11 : (_local_11 * 4)); + _local_7++; + } + _local_8++; + } + } + else + { + _local_12 = ((_local_11 & 0xFF) * 4); + _local_13 = (_local_12 + (((_local_11 >> 11) & 0x01) * 3)); + _local_14 = (_local_12 + (((_local_11 >> 10) & 0x01) * 3)); + _local_15 = (_local_12 + (((_local_11 >> 9) & 0x01) * 3)); + _local_16 = (_local_12 + (((_local_11 >> 8) & 0x01) * 3)); + _local_7 = 0; + while(_local_7 < 3) + { + _local_17 = (_local_7 + 1); + _local_4[_local_9][(_local_10 + _local_7)] = (((_local_13 * (3 - _local_7)) + (_local_14 * _local_7)) / 3); + _local_4[(_local_9 + 3)][(_local_10 + _local_17)] = (((_local_15 * (3 - _local_17)) + (_local_16 * _local_17)) / 3); + _local_4[(_local_9 + _local_17)][_local_10] = (((_local_13 * (3 - _local_17)) + (_local_15 * _local_17)) / 3); + _local_4[(_local_9 + _local_7)][(_local_10 + 3)] = (((_local_14 * (3 - _local_7)) + (_local_16 * _local_7)) / 3); + _local_7++; + } + _local_4[(_local_9 + 1)][(_local_10 + 1)] = ((_local_13 > _local_12) ? (_local_12 + 2) : (_local_12 + 1)); + _local_4[(_local_9 + 1)][(_local_10 + 2)] = ((_local_14 > _local_12) ? (_local_12 + 2) : (_local_12 + 1)); + _local_4[(_local_9 + 2)][(_local_10 + 1)] = ((_local_15 > _local_12) ? (_local_12 + 2) : (_local_12 + 1)); + _local_4[(_local_9 + 2)][(_local_10 + 2)] = ((_local_16 > _local_12) ? (_local_12 + 2) : (_local_12 + 1)); + } + _local_10 = (_local_10 + 4); + _local_5++; + } + _local_9 = (_local_9 + 4); + _local_6++; + } + return _local_4; + } + + private static addTileTypes(k: number[][]): void + { + let _local_4: number; + let _local_5: number; + let _local_6: number; + let _local_7: number; + let _local_8: number; + let _local_9: number; + let _local_10: number; + let _local_11: number; + let _local_12: number; + let _local_13: number; + let _local_14: number; + let _local_15: number; + let _local_16: number; + let _local_17: number; + const _local_2: number = (k.length - 1); + const _local_3: number = (k[0].length - 1); + _local_5 = 1; + while(_local_5 < _local_2) + { + _local_4 = 1; + while(_local_4 < _local_3) + { + _local_6 = k[_local_5][_local_4]; + if(_local_6 < 0) + { + // + } + else + { + _local_7 = (k[(_local_5 - 1)][(_local_4 - 1)] & 0xFF); + _local_8 = (k[(_local_5 - 1)][_local_4] & 0xFF); + _local_9 = (k[(_local_5 - 1)][(_local_4 + 1)] & 0xFF); + _local_10 = (k[_local_5][(_local_4 - 1)] & 0xFF); + _local_11 = (k[_local_5][(_local_4 + 1)] & 0xFF); + _local_12 = (k[(_local_5 + 1)][(_local_4 - 1)] & 0xFF); + _local_13 = (k[(_local_5 + 1)][_local_4] & 0xFF); + _local_14 = (k[(_local_5 + 1)][(_local_4 + 1)] & 0xFF); + _local_15 = (_local_6 + 1); + _local_16 = (_local_6 - 1); + _local_17 = (((((((_local_7 == _local_15) || (_local_8 == _local_15)) || (_local_10 == _local_15)) ? 8 : 0) | ((((_local_9 == _local_15) || (_local_8 == _local_15)) || (_local_11 == _local_15)) ? 4 : 0)) | ((((_local_12 == _local_15) || (_local_13 == _local_15)) || (_local_10 == _local_15)) ? 2 : 0)) | ((((_local_14 == _local_15) || (_local_13 == _local_15)) || (_local_11 == _local_15)) ? 1 : 0)); + if(_local_17 == 15) + { + _local_17 = 0; + } + k[_local_5][_local_4] = (_local_6 | (_local_17 << 8)); + } + _local_4++; + } + _local_5++; + } + } + + private static unpadHeightMap(k: number[][]): void + { + k.shift(); + k.pop(); + + for(const _local_2 of k) + { + _local_2.shift(); + _local_2.pop(); + } + } + + private static padHeightMap(k: number[][]): void + { + const _local_2: number[] = []; + const _local_3: number[] = []; + for(const _local_4 of k) + { + _local_4.push(RoomPlaneParser.TILE_BLOCKED); + _local_4.unshift(RoomPlaneParser.TILE_BLOCKED); + } + for(const _local_5 of k[0]) + { + _local_2.push(RoomPlaneParser.TILE_BLOCKED); + _local_3.push(RoomPlaneParser.TILE_BLOCKED); + } + k.push(_local_3); + k.unshift(_local_2); + } + + + public get minX(): number + { + return this._minX; + } + + public get maxX(): number + { + return this._maxX; + } + + public get minY(): number + { + return this._minY; + } + + public get maxY(): number + { + return this._maxY; + } + + public get tileMapWidth(): number + { + return this._width; + } + + public get tileMapHeight(): number + { + return this._height; + } + + public get planeCount(): number + { + return this._planes.length; + } + + public get floorHeight(): number + { + if(this._fixedWallHeight != -1) + { + return this._fixedWallHeight; + } + return this._floorHeight; + } + + public get wallHeight(): number + { + if(this._fixedWallHeight != -1) + { + return this._fixedWallHeight + 3.6; + } + return this._wallHeight; + } + + public set wallHeight(k: number) + { + if(k < 0) + { + k = 0; + } + this._wallHeight = k; + } + + public get wallThicknessMultiplier(): number + { + return this._wallThicknessMultiplier; + } + + public set wallThicknessMultiplier(k: number) + { + if(k < 0) + { + k = 0; + } + this._wallThicknessMultiplier = k; + } + + public get floorThicknessMultiplier(): number + { + return this._floorThicknessMultiplier; + } + + public set floorThicknessMultiplier(k: number) + { + if(k < 0) + { + k = 0; + } + this._floorThicknessMultiplier = k; + } + + public dispose(): void + { + this._planes = null; + this._tileMatrix = null; + this._tileMatrixOriginal = null; + this._floorHoleMatrix = null; + if(this._floorHoles != null) + { + this._floorHoles.clear(); + this._floorHoles = null; + } + } + + public reset(): void + { + this._planes = []; + this._tileMatrix = []; + this._tileMatrixOriginal = []; + this._width = 0; + this._height = 0; + this._minX = 0; + this._maxX = 0; + this._minY = 0; + this._maxY = 0; + this._floorHeight = 0; + this._floorHoleMatrix = []; + } + + public initializeTileMap(width: number, height: number): boolean + { + if(width < 0) width = 0; + + if(height < 0) height = 0; + + this._tileMatrix = []; + this._tileMatrixOriginal = []; + this._floorHoleMatrix = []; + + let y = 0; + + while(y < height) + { + const tileMatrix = []; + const tileMatrixOriginal = []; + const floorHoleMatrix = []; + + let x = 0; + + while(x < width) + { + tileMatrix[x] = RoomPlaneParser.TILE_BLOCKED; + tileMatrixOriginal[x] = RoomPlaneParser.TILE_BLOCKED; + floorHoleMatrix[x] = false; + + x++; + } + + this._tileMatrix.push(tileMatrix); + this._tileMatrixOriginal.push(tileMatrixOriginal); + this._floorHoleMatrix.push(floorHoleMatrix); + + y++; + } + + this._width = width; + this._height = height; + this._minX = this._width; + this._maxX = -1; + this._minY = this._height; + this._maxY = -1; + + return true; + } + + public setTileHeight(k: number, _arg_2: number, _arg_3: number): boolean + { + let _local_4: number[]; + let _local_5: boolean; + let _local_6: number; + let _local_7: boolean; + let _local_8: number; + if(((((k >= 0) && (k < this._width)) && (_arg_2 >= 0)) && (_arg_2 < this._height))) + { + _local_4 = this._tileMatrix[_arg_2]; + + _local_4[k] = _arg_3; + if(_arg_3 >= 0) + { + if(k < this._minX) + { + this._minX = k; + } + if(k > this._maxX) + { + this._maxX = k; + } + if(_arg_2 < this._minY) + { + this._minY = _arg_2; + } + if(_arg_2 > this._maxY) + { + this._maxY = _arg_2; + } + } + else + { + if(((k == this._minX) || (k == this._maxX))) + { + _local_5 = false; + _local_6 = this._minY; + while(_local_6 < this._maxY) + { + if(this.getTileHeightInternal(k, _local_6) >= 0) + { + _local_5 = true; + break; + } + _local_6++; + } + if(!_local_5) + { + if(k == this._minX) + { + this._minX++; + } + if(k == this._maxX) + { + this._maxX--; + } + } + } + if(((_arg_2 == this._minY) || (_arg_2 == this._maxY))) + { + _local_7 = false; + _local_8 = this._minX; + while(_local_8 < this._maxX) + { + if(this.getTileHeight(_local_8, _arg_2) >= 0) + { + _local_7 = true; + break; + } + _local_8++; + } + if(!_local_7) + { + if(_arg_2 == this._minY) + { + this._minY++; + } + if(_arg_2 == this._maxY) + { + this._maxY--; + } + } + } + } + return true; + } + return false; + } + + public getTileHeight(k: number, _arg_2: number): number + { + if(((((k < 0) || (k >= this._width)) || (_arg_2 < 0)) || (_arg_2 >= this._height))) + { + return RoomPlaneParser.TILE_BLOCKED; + } + + const _local_3 = this._tileMatrix[_arg_2]; + + if(_local_3[k] === undefined) return 0; + + return Math.abs(_local_3[k]); + } + + private getTileHeightOriginal(k: number, _arg_2: number): number + { + if(((((k < 0) || (k >= this._width)) || (_arg_2 < 0)) || (_arg_2 >= this._height))) + { + return RoomPlaneParser.TILE_BLOCKED; + } + if(this._floorHoleMatrix[_arg_2][k]) + { + return RoomPlaneParser.TILE_HOLE; + } + const _local_3 = this._tileMatrixOriginal[_arg_2]; + return _local_3[k]; + } + + private getTileHeightInternal(k: number, _arg_2: number): number + { + if(((((k < 0) || (k >= this._width)) || (_arg_2 < 0)) || (_arg_2 >= this._height))) + { + return RoomPlaneParser.TILE_BLOCKED; + } + const _local_3 = this._tileMatrix[_arg_2]; + return _local_3[k]; + } + + public initializeFromTileData(k: number = -1): boolean + { + let _local_2: number; + let _local_3: number; + this._fixedWallHeight = k; + _local_3 = 0; + while(_local_3 < this._height) + { + _local_2 = 0; + while(_local_2 < this._width) + { + if(this._tileMatrixOriginal[_local_3] === undefined) this._tileMatrixOriginal[_local_3] = []; + this._tileMatrixOriginal[_local_3][_local_2] = this._tileMatrix[_local_3][_local_2]; + _local_2++; + } + _local_3++; + } + const _local_4: Point = RoomPlaneParser.findEntranceTile(this._tileMatrix); + + _local_3 = 0; + while(_local_3 < this._height) + { + _local_2 = 0; + while(_local_2 < this._width) + { + if(this._floorHoleMatrix[_local_3] === undefined) this._floorHoleMatrix[_local_3] = []; + if(this._floorHoleMatrix[_local_3][_local_2]) + { + this.setTileHeight(_local_2, _local_3, RoomPlaneParser.TILE_HOLE); + } + _local_2++; + } + _local_3++; + } + + return this.initialize(_local_4); + } + + private initialize(k: Point): boolean + { + let _local_2 = 0; + if(k != null) + { + _local_2 = this.getTileHeight(k.x, k.y); + this.setTileHeight(k.x, k.y, RoomPlaneParser.TILE_BLOCKED); + } + this._floorHeight = RoomPlaneParser.getFloorHeight(this._tileMatrix); + this.createWallPlanes(); + const _local_3: number[][] = []; + + for(const _local_4 of this._tileMatrix) _local_3.push(_local_4.concat()); + + RoomPlaneParser.padHeightMap(_local_3); + RoomPlaneParser.addTileTypes(_local_3); + RoomPlaneParser.unpadHeightMap(_local_3); + const _local_5 = RoomPlaneParser.expandFloorTiles(_local_3); + this.extractPlanes(_local_5); + if(k != null) + { + this.setTileHeight(k.x, k.y, _local_2); + this.addFloor(new Vector3d((k.x + 0.5), (k.y + 0.5), _local_2), new Vector3d(-1, 0, 0), new Vector3d(0, -1, 0), false, false, false, false); + } + + return true; + } + + private generateWallData(k: Point, _arg_2: boolean): RoomWallData + { + let _local_8: boolean; + let _local_9: boolean; + let _local_10: number; + let _local_11: Point; + let _local_12: number; + const _local_3: RoomWallData = new RoomWallData(); + const _local_4: Function[] = [this.extractTopWall.bind(this), this.extractRightWall.bind(this), this.extractBottomWall.bind(this), this.extractLeftWall.bind(this)]; + let _local_5 = 0; + let _local_6: Point = new Point(k.x, k.y); + let _local_7 = 0; + while(_local_7++ < 1000) + { + _local_8 = false; + _local_9 = false; + _local_10 = _local_5; + if(((((_local_6.x < this.minX) || (_local_6.x > this.maxX)) || (_local_6.y < this.minY)) || (_local_6.y > this.maxY))) + { + _local_8 = true; + } + _local_11 = _local_4[_local_5](_local_6, _arg_2); + if(_local_11 == null) + { + return null; + } + _local_12 = (Math.abs((_local_11.x - _local_6.x)) + Math.abs((_local_11.y - _local_6.y))); + if(((_local_6.x == _local_11.x) || (_local_6.y == _local_11.y))) + { + _local_5 = (((_local_5 - 1) + _local_4.length) % _local_4.length); + _local_12 = (_local_12 + 1); + _local_9 = true; + } + else + { + _local_5 = ((_local_5 + 1) % _local_4.length); + _local_12--; + } + _local_3.addWall(_local_6, _local_10, _local_12, _local_8, _local_9); + if((((_local_11.x == k.x) && (_local_11.y == k.y)) && ((!(_local_11.x == _local_6.x)) || (!(_local_11.y == _local_6.y))))) + { + break; + } + _local_6 = _local_11; + } + if(_local_3.count == 0) + { + return null; + } + return _local_3; + } + + private hidePeninsulaWallChains(k: RoomWallData): void + { + let _local_5: number; + let _local_6: number; + let _local_7: boolean; + let _local_8: number; + let _local_2 = 0; + const _local_3: number = k.count; + while(_local_2 < _local_3) + { + const _local_4 = _local_2; + + _local_5 = _local_2; + _local_6 = 0; + _local_7 = false; + while(((!(k.getBorder(_local_2))) && (_local_2 < _local_3))) + { + if(k.getLeftTurn(_local_2)) + { + _local_6++; + } + else + { + if(_local_6 > 0) + { + _local_6--; + } + } + if(_local_6 > 1) + { + _local_7 = true; + } + _local_5 = _local_2; + _local_2++; + } + if(_local_7) + { + _local_8 = _local_4; + while(_local_8 <= _local_5) + { + k.setHideWall(_local_8, true); + _local_8++; + } + } + _local_2++; + } + } + + private updateWallsNextToHoles(k: RoomWallData): void + { + let _local_4: Point; + let _local_5: number; + let _local_6: number; + let _local_7: IVector3D; + let _local_8: IVector3D; + let _local_9: number; + let _local_10: number; + const _local_2: number = k.count; + let _local_3 = 0; + while(_local_3 < _local_2) + { + if(!k.getHideWall(_local_3)) + { + _local_4 = k.getCorner(_local_3); + _local_5 = k.getDirection(_local_3); + _local_6 = k.getLength(_local_3); + _local_7 = RoomWallData.WALL_DIRECTION_VECTORS[_local_5]; + _local_8 = RoomWallData.WALL_NORMAL_VECTORS[_local_5]; + _local_9 = 0; + _local_10 = 0; + while(_local_10 < _local_6) + { + if(this.getTileHeightInternal(((_local_4.x + (_local_10 * _local_7.x)) - _local_8.x), ((_local_4.y + (_local_10 * _local_7.y)) - _local_8.y)) == RoomPlaneParser.TILE_HOLE) + { + if(((_local_10 > 0) && (_local_9 == 0))) + { + k.setLength(_local_3, _local_10); + break; + } + _local_9++; + } + else + { + if(_local_9 > 0) + { + k.moveCorner(_local_3, _local_9); + break; + } + } + _local_10++; + } + if(_local_9 == _local_6) + { + k.setHideWall(_local_3, true); + } + } + _local_3++; + } + } + + private resolveOriginalWallIndex(k: Point, _arg_2: Point, _arg_3: RoomWallData): number + { + let _local_10: Point; + let _local_11: Point; + let _local_12: number; + let _local_13: number; + let _local_14: number; + let _local_15: number; + const _local_4: number = Math.min(k.y, _arg_2.y); + const _local_5: number = Math.max(k.y, _arg_2.y); + const _local_6: number = Math.min(k.x, _arg_2.x); + const _local_7: number = Math.max(k.x, _arg_2.x); + const _local_8: number = _arg_3.count; + let _local_9 = 0; + while(_local_9 < _local_8) + { + _local_10 = _arg_3.getCorner(_local_9); + _local_11 = _arg_3.getEndPoint(_local_9); + if(k.x == _arg_2.x) + { + if(((_local_10.x == k.x) && (_local_11.x == k.x))) + { + _local_12 = Math.min(_local_10.y, _local_11.y); + _local_13 = Math.max(_local_10.y, _local_11.y); + if(((_local_12 <= _local_4) && (_local_5 <= _local_13))) + { + return _local_9; + } + } + } + else + { + if(k.y == _arg_2.y) + { + if(((_local_10.y == k.y) && (_local_11.y == k.y))) + { + _local_14 = Math.min(_local_10.x, _local_11.x); + _local_15 = Math.max(_local_10.x, _local_11.x); + if(((_local_14 <= _local_6) && (_local_7 <= _local_15))) + { + return _local_9; + } + } + } + } + _local_9++; + } + return -1; + } + + private hideOriginallyHiddenWalls(k: RoomWallData, _arg_2: RoomWallData): void + { + let _local_5: Point; + let _local_6: Point; + let _local_7: IVector3D; + let _local_8: number; + let _local_9: number; + const _local_3: number = k.count; + let _local_4 = 0; + while(_local_4 < _local_3) + { + if(!k.getHideWall(_local_4)) + { + _local_5 = k.getCorner(_local_4); + _local_6 = new Point(_local_5.x, _local_5.y); + _local_7 = RoomWallData.WALL_DIRECTION_VECTORS[k.getDirection(_local_4)]; + _local_8 = k.getLength(_local_4); + _local_6.x = (_local_6.x + (_local_7.x * _local_8)); + _local_6.y = (_local_6.y + (_local_7.y * _local_8)); + _local_9 = this.resolveOriginalWallIndex(_local_5, _local_6, _arg_2); + if(_local_9 >= 0) + { + if(_arg_2.getHideWall(_local_9)) + { + k.setHideWall(_local_4, true); + } + } + else + { + k.setHideWall(_local_4, true); + } + } + _local_4++; + } + } + + private checkWallHiding(k: RoomWallData, _arg_2: RoomWallData): void + { + this.hidePeninsulaWallChains(_arg_2); + this.updateWallsNextToHoles(k); + this.hideOriginallyHiddenWalls(k, _arg_2); + } + + private addWalls(k: RoomWallData, _arg_2: RoomWallData): void + { + const _local_3 = k.count; + const _local_4 = _arg_2.count; + let _local_7 = 0; + + while(_local_7 < _local_3) + { + if(!k.getHideWall(_local_7)) + { + const _local_8 = k.getCorner(_local_7); + const _local_9 = k.getDirection(_local_7); + const _local_10 = k.getLength(_local_7); + const _local_11 = RoomWallData.WALL_DIRECTION_VECTORS[_local_9]; + const _local_12 = RoomWallData.WALL_NORMAL_VECTORS[_local_9]; + let _local_13 = -1; + let _local_14 = 0; + + while(_local_14 < _local_10) + { + const _local_27 = this.getTileHeightInternal(((_local_8.x + (_local_14 * _local_11.x)) + _local_12.x), ((_local_8.y + (_local_14 * _local_11.y)) + _local_12.y)); + + if(((_local_27 >= 0) && ((_local_27 < _local_13) || (_local_13 < 0)))) + { + _local_13 = _local_27; + } + + _local_14++; + } + + const _local_15 = _local_13; + + let _local_16 = new Vector3d(_local_8.x, _local_8.y, _local_15); + _local_16 = Vector3d.sum(_local_16, Vector3d.product(_local_12, 0.5)); + _local_16 = Vector3d.sum(_local_16, Vector3d.product(_local_11, -0.5)); + + const _local_17 = ((this.wallHeight + Math.min(RoomPlaneParser.MAX_WALL_ADDITIONAL_HEIGHT, this.floorHeight)) - _local_13); + const _local_18 = Vector3d.product(_local_11, -(_local_10)); + const _local_19 = new Vector3d(0, 0, _local_17); + + _local_16 = Vector3d.dif(_local_16, _local_18); + + const _local_20 = this.resolveOriginalWallIndex(_local_8, k.getEndPoint(_local_7), _arg_2); + + let _local_5 = 0; + let _local_6 = 0; + + if(_local_20 >= 0) + { + _local_5 = _arg_2.getDirection(((_local_20 + 1) % _local_4)); + _local_6 = _arg_2.getDirection((((_local_20 - 1) + _local_4) % _local_4)); + } + else + { + _local_5 = k.getDirection(((_local_7 + 1) % _local_3)); + _local_6 = k.getDirection((((_local_7 - 1) + _local_3) % _local_3)); + } + + let _local_21 = null; + + if((((_local_5 - _local_9) + 4) % 4) == 3) + { + _local_21 = RoomWallData.WALL_NORMAL_VECTORS[_local_5]; + } + else + { + if((((_local_9 - _local_6) + 4) % 4) == 3) + { + _local_21 = RoomWallData.WALL_NORMAL_VECTORS[_local_6]; + } + } + + const _local_22 = k.getLeftTurn(_local_7); + const _local_23 = k.getLeftTurn((((_local_7 - 1) + _local_3) % _local_3)); + const _local_24 = k.getHideWall(((_local_7 + 1) % _local_3)); + const _local_25 = k.getManuallyLeftCut(_local_7); + const _local_26 = k.getManuallyRightCut(_local_7); + + this.addWall(_local_16, _local_18, _local_19, _local_21, ((!(_local_23)) || (_local_25)), ((!(_local_22)) || (_local_26)), (!(_local_24))); + } + + _local_7++; + } + } + + private createWallPlanes(): boolean + { + let _local_13: number; + let _local_14: number; + const k = this._tileMatrix; + if(k == null) + { + return false; + } + let _local_2: number; + let _local_3: number; + let _local_4: number[]; + const _local_5: number = k.length; + let _local_6 = 0; + if(_local_5 == 0) + { + return false; + } + _local_2 = 0; + while(_local_2 < _local_5) + { + _local_4 = k[_local_2]; + if(((_local_4 == null) || (_local_4.length == 0))) + { + return false; + } + if(_local_6 > 0) + { + _local_6 = Math.min(_local_6, _local_4.length); + } + else + { + _local_6 = _local_4.length; + } + _local_2++; + } + const _local_7: number = Math.min(RoomPlaneParser.MAX_WALL_ADDITIONAL_HEIGHT, ((this._fixedWallHeight != -1) ? this._fixedWallHeight : RoomPlaneParser.getFloorHeight(k))); + const _local_8: number = this.minX; + let _local_9: number = this.minY; + _local_9 = this.minY; + while(_local_9 <= this.maxY) + { + if(this.getTileHeightInternal(_local_8, _local_9) > RoomPlaneParser.TILE_HOLE) + { + _local_9--; + break; + } + _local_9++; + } + if(_local_9 > this.maxY) + { + return false; + } + const _local_10: Point = new Point(_local_8, _local_9); + const _local_11: RoomWallData = this.generateWallData(_local_10, true); + const _local_12: RoomWallData = this.generateWallData(_local_10, false); + if(_local_11 != null) + { + _local_13 = _local_11.count; + _local_14 = _local_12.count; + this.checkWallHiding(_local_11, _local_12); + this.addWalls(_local_11, _local_12); + } + _local_3 = 0; + while(_local_3 < this.tileMapHeight) + { + _local_2 = 0; + while(_local_2 < this.tileMapWidth) + { + if(this.getTileHeightInternal(_local_2, _local_3) < 0) + { + this.setTileHeight(_local_2, _local_3, -(_local_7 + this.wallHeight)); + } + _local_2++; + } + _local_3++; + } + return true; + } + + private extractTopWall(k: Point, _arg_2: boolean): Point + { + if(k == null) + { + return null; + } + let _local_3 = 1; + let _local_4: number = RoomPlaneParser.TILE_HOLE; + if(!_arg_2) + { + _local_4 = RoomPlaneParser.TILE_BLOCKED; + } + while(_local_3 < 1000) + { + if(this.getTileHeightInternal((k.x + _local_3), k.y) > _local_4) + { + return new Point(((k.x + _local_3) - 1), k.y); + } + if(this.getTileHeightInternal((k.x + _local_3), (k.y + 1)) <= _local_4) + { + return new Point((k.x + _local_3), (k.y + 1)); + } + _local_3++; + } + return null; + } + + private extractRightWall(k: Point, _arg_2: boolean): Point + { + if(k == null) + { + return null; + } + let _local_3 = 1; + let _local_4: number = RoomPlaneParser.TILE_HOLE; + if(!_arg_2) + { + _local_4 = RoomPlaneParser.TILE_BLOCKED; + } + while(_local_3 < 1000) + { + if(this.getTileHeightInternal(k.x, (k.y + _local_3)) > _local_4) + { + return new Point(k.x, (k.y + (_local_3 - 1))); + } + if(this.getTileHeightInternal((k.x - 1), (k.y + _local_3)) <= _local_4) + { + return new Point((k.x - 1), (k.y + _local_3)); + } + _local_3++; + } + return null; + } + + private extractBottomWall(k: Point, _arg_2: boolean): Point + { + if(k == null) + { + return null; + } + let _local_3 = 1; + let _local_4: number = RoomPlaneParser.TILE_HOLE; + if(!_arg_2) + { + _local_4 = RoomPlaneParser.TILE_BLOCKED; + } + while(_local_3 < 1000) + { + if(this.getTileHeightInternal((k.x - _local_3), k.y) > _local_4) + { + return new Point((k.x - (_local_3 - 1)), k.y); + } + if(this.getTileHeightInternal((k.x - _local_3), (k.y - 1)) <= _local_4) + { + return new Point((k.x - _local_3), (k.y - 1)); + } + _local_3++; + } + return null; + } + + private extractLeftWall(k: Point, _arg_2: boolean): Point + { + if(k == null) + { + return null; + } + let _local_3 = 1; + let _local_4: number = RoomPlaneParser.TILE_HOLE; + if(!_arg_2) + { + _local_4 = RoomPlaneParser.TILE_BLOCKED; + } + while(_local_3 < 1000) + { + if(this.getTileHeightInternal(k.x, (k.y - _local_3)) > _local_4) + { + return new Point(k.x, (k.y - (_local_3 - 1))); + } + if(this.getTileHeightInternal((k.x + 1), (k.y - _local_3)) <= _local_4) + { + return new Point((k.x + 1), (k.y - _local_3)); + } + _local_3++; + } + return null; + } + + private addWall(k: IVector3D, _arg_2: IVector3D, _arg_3: IVector3D, _arg_4: IVector3D, _arg_5: boolean, _arg_6: boolean, _arg_7: boolean): void + { + this.addPlane(RoomPlaneData.PLANE_WALL, k, _arg_2, _arg_3, [_arg_4]); + this.addPlane(RoomPlaneData.PLANE_LANDSCAPE, k, _arg_2, _arg_3, [_arg_4]); + const _local_8: number = (RoomPlaneParser.WALL_THICKNESS * this._wallThicknessMultiplier); + const _local_9: number = (RoomPlaneParser.FLOOR_THICKNESS * this._floorThicknessMultiplier); + const _local_10: Vector3d = Vector3d.crossProduct(_arg_2, _arg_3); + const _local_11: Vector3d = Vector3d.product(_local_10, ((1 / _local_10.length) * -(_local_8))); + this.addPlane(RoomPlaneData.PLANE_WALL, Vector3d.sum(k, _arg_3), _arg_2, _local_11, [_local_10, _arg_4]); + if(_arg_5) + { + this.addPlane(RoomPlaneData.PLANE_WALL, Vector3d.sum(Vector3d.sum(k, _arg_2), _arg_3), Vector3d.product(_arg_3, (-(_arg_3.length + _local_9) / _arg_3.length)), _local_11, [_local_10, _arg_4]); + } + if(_arg_6) + { + this.addPlane(RoomPlaneData.PLANE_WALL, Vector3d.sum(k, Vector3d.product(_arg_3, (-(_local_9) / _arg_3.length))), Vector3d.product(_arg_3, ((_arg_3.length + _local_9) / _arg_3.length)), _local_11, [_local_10, _arg_4]); + if(_arg_7) + { + const _local_12 = Vector3d.product(_arg_2, (_local_8 / _arg_2.length)); + this.addPlane(RoomPlaneData.PLANE_WALL, Vector3d.sum(Vector3d.sum(k, _arg_3), Vector3d.product(_local_12, -1)), _local_12, _local_11, [_local_10, _arg_2, _arg_4]); + } + } + } + + private addFloor(k: IVector3D, _arg_2: IVector3D, _arg_3: IVector3D, _arg_4: boolean, _arg_5: boolean, _arg_6: boolean, _arg_7: boolean): void + { + let _local_9: number; + let _local_10: Vector3d; + let _local_11: Vector3d; + const _local_8: RoomPlaneData = this.addPlane(RoomPlaneData.PLANE_FLOOR, k, _arg_2, _arg_3); + if(_local_8 != null) + { + _local_9 = (RoomPlaneParser.FLOOR_THICKNESS * this._floorThicknessMultiplier); + _local_10 = new Vector3d(0, 0, _local_9); + _local_11 = Vector3d.dif(k, _local_10); + if(_arg_6) + { + this.addPlane(RoomPlaneData.PLANE_FLOOR, _local_11, _arg_2, _local_10); + } + if(_arg_7) + { + this.addPlane(RoomPlaneData.PLANE_FLOOR, Vector3d.sum(_local_11, Vector3d.sum(_arg_2, _arg_3)), Vector3d.product(_arg_2, -1), _local_10); + } + if(_arg_4) + { + this.addPlane(RoomPlaneData.PLANE_FLOOR, Vector3d.sum(_local_11, _arg_3), Vector3d.product(_arg_3, -1), _local_10); + } + if(_arg_5) + { + this.addPlane(RoomPlaneData.PLANE_FLOOR, Vector3d.sum(_local_11, _arg_2), _arg_3, _local_10); + } + } + } + + public initializeFromMapData(data: RoomMapData): boolean + { + if(!data) return false; + + this.reset(); + + this.resetFloorHoles(); + + const width = data.width; + const height = data.height; + const wallHeight = data.wallHeight; + const fixedWallsHeight = data.fixedWallsHeight; + + this.initializeTileMap(width, height); + + if(data.tileMap) + { + let y = 0; + + while(y < data.tileMap.length) + { + const row = data.tileMap[y]; + + if(row) + { + let x = 0; + + while(x < row.length) + { + const column = row[x]; + + if(column) this.setTileHeight(x, y, column.height); + + x++; + } + } + + y++; + } + } + + if(data.holeMap && data.holeMap.length) + { + let index = 0; + + while(index < data.holeMap.length) + { + const hole = data.holeMap[index]; + + if(!hole) continue; + + this.addFloorHole(hole.id, hole.x, hole.y, hole.width, hole.height); + + index++; + } + + this.initializeHoleMap(); + } + + this.wallHeight = wallHeight; + + this.initializeFromTileData(fixedWallsHeight); + + return true; + } + + private addPlane(k: number, _arg_2: IVector3D, _arg_3: IVector3D, _arg_4: IVector3D, _arg_5: IVector3D[] = null): RoomPlaneData + { + if(((_arg_3.length == 0) || (_arg_4.length == 0))) + { + return null; + } + const _local_6: RoomPlaneData = new RoomPlaneData(k, _arg_2, _arg_3, _arg_4, _arg_5); + this._planes.push(_local_6); + return _local_6; + } + + public getMapData(): RoomMapData + { + const data = new RoomMapData(); + + data.width = this._width; + data.height = this._height; + data.wallHeight = this._wallHeight; + data.fixedWallsHeight = this._fixedWallHeight; + data.dimensions.minX = this.minX; + data.dimensions.maxX = this.maxX; + data.dimensions.minY = this.minY; + data.dimensions.maxY = this.maxY; + + let y = 0; + + while(y < this._height) + { + const tileRow: { height: number }[] = []; + const tileMatrix = this._tileMatrixOriginal[y]; + + let x = 0; + + while(x < this._width) + { + const tileHeight = tileMatrix[x]; + + tileRow.push({ height: tileHeight }); + + x++; + } + + data.tileMap.push(tileRow); + + y++; + } + + for(const [holeId, holeData] of this._floorHoles.entries()) + { + if(!holeData) continue; + + data.holeMap.push({ + id: holeId, + x: holeData.x, + y: holeData.y, + width: holeData.width, + height: holeData.height + }); + } + + return data; + } + + public getPlaneLocation(k: number): IVector3D + { + if(((k < 0) || (k >= this.planeCount))) return null; + + const planeData = this._planes[k]; + + if(!planeData) return null; + + return planeData.loc; + } + + public getPlaneNormal(k: number): IVector3D + { + if(((k < 0) || (k >= this.planeCount))) return null; + + const planeData = this._planes[k]; + + if(!planeData) return null; + + return planeData.normal; + } + + public getPlaneLeftSide(k: number): IVector3D + { + if(((k < 0) || (k >= this.planeCount))) return null; + + const planeData = this._planes[k]; + + if(!planeData) return null; + + return planeData.leftSide; + } + + public getPlaneRightSide(k: number): IVector3D + { + if(((k < 0) || (k >= this.planeCount))) return null; + + const planeData = this._planes[k]; + + if(!planeData) return null; + + return planeData.rightSide; + } + + public getPlaneNormalDirection(k: number): IVector3D + { + if(((k < 0) || (k >= this.planeCount))) return null; + + const planeData = this._planes[k]; + + if(!planeData) return null; + + return planeData.normalDirection; + } + + public getPlaneSecondaryNormals(k: number): IVector3D[] + { + let _local_3: IVector3D[]; + let _local_4: number; + if(((k < 0) || (k >= this.planeCount))) + { + return null; + } + const _local_2: RoomPlaneData = (this._planes[k] as RoomPlaneData); + if(_local_2 != null) + { + _local_3 = []; + _local_4 = 0; + while(_local_4 < _local_2.secondaryNormalCount) + { + _local_3.push(_local_2.getSecondaryNormal(_local_4)); + _local_4++; + } + return _local_3; + } + return null; + } + + public getPlaneType(k: number): number + { + if(((k < 0) || (k >= this.planeCount))) return RoomPlaneData.PLANE_UNDEFINED; + + const planeData = this._planes[k]; + + if(!planeData) return RoomPlaneData.PLANE_UNDEFINED; + + return planeData.type; + } + + public getPlaneMaskCount(k: number): number + { + if(((k < 0) || (k >= this.planeCount))) return 0; + + const planeData = this._planes[k]; + + if(!planeData) return 0; + + return planeData.maskCount; + } + + public getPlaneMaskLeftSideLoc(k: number, _arg_2: number): number + { + if(((k < 0) || (k >= this.planeCount))) return -1; + + const planeData = this._planes[k]; + + if(!planeData) return -1; + + return planeData.getMaskLeftSideLoc(_arg_2); + } + + public getPlaneMaskRightSideLoc(k: number, _arg_2: number): number + { + if(((k < 0) || (k >= this.planeCount))) return -1; + + const planeData = this._planes[k]; + + if(!planeData) return -1; + + return planeData.getMaskRightSideLoc(_arg_2); + } + + public getPlaneMaskLeftSideLength(k: number, _arg_2: number): number + { + if(((k < 0) || (k >= this.planeCount))) return -1; + + const planeData = this._planes[k]; + + if(!planeData) return -1; + + return planeData.getMaskLeftSideLength(_arg_2); + } + + public getPlaneMaskRightSideLength(k: number, _arg_2: number): number + { + if(((k < 0) || (k >= this.planeCount))) return -1; + + const planeData = this._planes[k]; + + if(!planeData) return -1; + + return planeData.getMaskRightSideLength(_arg_2); + } + + public addFloorHole(k: number, _arg_2: number, _arg_3: number, _arg_4: number, _arg_5: number): void + { + this.removeFloorHole(k); + + this._floorHoles.set(k, new RoomFloorHole(_arg_2, _arg_3, _arg_4, _arg_5)); + } + + public removeFloorHole(k: number): void + { + this._floorHoles.delete(k); + } + + public resetFloorHoles(): void + { + this._floorHoles.clear(); + } + + private initializeHoleMap(): void + { + let k: number; + let _local_2: number; + let _local_3: boolean[]; + let _local_5: RoomFloorHole; + let _local_6: number; + let _local_7: number; + let _local_8: number; + let _local_9: number; + _local_2 = 0; + while(_local_2 < this._height) + { + _local_3 = this._floorHoleMatrix[_local_2]; + k = 0; + while(k < this._width) + { + _local_3[k] = false; + k++; + } + _local_2++; + } + for(const _local_4 of this._floorHoles.values()) + { + _local_5 = _local_4; + if(_local_5 != null) + { + _local_6 = _local_5.x; + _local_7 = ((_local_5.x + _local_5.width) - 1); + _local_8 = _local_5.y; + _local_9 = ((_local_5.y + _local_5.height) - 1); + _local_6 = ((_local_6 < 0) ? 0 : _local_6); + _local_7 = ((_local_7 >= this._width) ? (this._width - 1) : _local_7); + _local_8 = ((_local_8 < 0) ? 0 : _local_8); + _local_9 = ((_local_9 >= this._height) ? (this._height - 1) : _local_9); + _local_2 = _local_8; + while(_local_2 <= _local_9) + { + _local_3 = this._floorHoleMatrix[_local_2]; + k = _local_6; + while(k <= _local_7) + { + _local_3[k] = true; + k++; + } + _local_2++; + } + } + } + } + + private extractPlanes(k: number[][]): void + { + let _local_7: number; + let _local_8: number; + let _local_9: number; + let _local_10: number; + let _local_11: boolean; + let _local_12: boolean; + let _local_13: boolean; + let _local_14: boolean; + let _local_15: number; + let _local_16: number; + let _local_17: boolean; + let _local_18: number; + let _local_19: number; + let _local_20: number; + let _local_21: number; + + const _local_2 = k.length; + + const _local_3: number = k[0].length; + const _local_4: boolean[][] = []; + let _local_5 = 0; + while(_local_5 < _local_2) + { + _local_4[_local_5] = []; + _local_5++; + } + let _local_6 = 0; + while(_local_6 < _local_2) + { + _local_7 = 0; + while(_local_7 < _local_3) + { + _local_8 = k[_local_6][_local_7]; + if(((_local_8 < 0) || (_local_4[_local_6][_local_7]))) + { + // + } + else + { + _local_11 = ((_local_7 == 0) || (!(k[_local_6][(_local_7 - 1)] == _local_8))); + _local_12 = ((_local_6 == 0) || (!(k[(_local_6 - 1)][_local_7] == _local_8))); + _local_9 = (_local_7 + 1); + while(_local_9 < _local_3) + { + if((((!(k[_local_6][_local_9] == _local_8)) || (_local_4[_local_6][_local_9])) || ((_local_6 > 0) && ((k[(_local_6 - 1)][_local_9] == _local_8) == _local_12)))) + { + break; + } + _local_9++; + } + _local_13 = ((_local_9 == _local_3) || (!(k[_local_6][_local_9] == _local_8))); + _local_17 = false; + _local_10 = (_local_6 + 1); + while(((_local_10 < _local_2) && (!(_local_17)))) + { + _local_14 = (!(k[_local_10][_local_7] == _local_8)); + _local_17 = (((_local_14) || ((_local_7 > 0) && ((k[_local_10][(_local_7 - 1)] == _local_8) == _local_11))) || ((_local_9 < _local_3) && ((k[_local_10][_local_9] == _local_8) == _local_13))); + _local_15 = _local_7; + while(_local_15 < _local_9) + { + if((k[_local_10][_local_15] == _local_8) == _local_14) + { + _local_17 = true; + _local_9 = _local_15; + break; + } + _local_15++; + } + if(_local_17) + { + break; + } + _local_10++; + } + _local_14 = ((_local_14) || (_local_10 == _local_2)); + _local_13 = ((_local_9 == _local_3) || (!(k[_local_6][_local_9] == _local_8))); + _local_16 = _local_6; + while(_local_16 < _local_10) + { + _local_15 = _local_7; + while(_local_15 < _local_9) + { + _local_4[_local_16][_local_15] = true; + _local_15++; + } + _local_16++; + } + _local_18 = ((_local_7 / 4) - 0.5); + _local_19 = ((_local_6 / 4) - 0.5); + _local_20 = ((_local_9 - _local_7) / 4); + _local_21 = ((_local_10 - _local_6) / 4); + this.addFloor(new Vector3d((_local_18 + _local_20), (_local_19 + _local_21), (_local_8 / 4)), new Vector3d(-(_local_20), 0, 0), new Vector3d(0, -(_local_21), 0), _local_13, _local_11, _local_14, _local_12); + } + _local_7++; + } + _local_6++; + } + } +} diff --git a/packages/room/src/object/RoomWallData.ts b/packages/room/src/object/RoomWallData.ts new file mode 100644 index 0000000..2bb7aff --- /dev/null +++ b/packages/room/src/object/RoomWallData.ts @@ -0,0 +1,182 @@ +import { IVector3D } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; +import { Point } from 'pixi.js'; + +export class RoomWallData +{ + public static WALL_DIRECTION_VECTORS: Vector3d[] = [ + new Vector3d(1, 0, 0), + new Vector3d(0, 1, 0), + new Vector3d(-1, 0, 0), + new Vector3d(0, -1, 0) + ]; + + public static WALL_NORMAL_VECTORS: Vector3d[] = [ + new Vector3d(0, 1, 0), + new Vector3d(-1, 0, 0), + new Vector3d(0, -1, 0), + new Vector3d(1, 0, 0) + ]; + + private _corners: Point[]; + private _endPoints: Point[]; + private _directions: number[]; + private _lengths: number[]; + private _leftTurns: boolean[]; + private _borders: boolean[]; + private _hideWalls: boolean[]; + private _manuallyLeftCut: boolean[]; + private _manuallyRightCut: boolean[]; + private _addDuplicates: boolean; + private _count: number; + + constructor() + { + this._corners = []; + this._endPoints = []; + this._directions = []; + this._lengths = []; + this._leftTurns = []; + this._borders = []; + this._hideWalls = []; + this._manuallyLeftCut = []; + this._manuallyRightCut = []; + this._addDuplicates = false; + this._count = 0; + } + + public addWall(k: Point, _arg_2: number, _arg_3: number, _arg_4: boolean, _arg_5: boolean): void + { + if(((this._addDuplicates) || (this.checkIsNotDuplicate(k, _arg_2, _arg_3, _arg_4, _arg_5)))) + { + this._corners.push(k); + this._directions.push(_arg_2); + this._lengths.push(_arg_3); + this._borders.push(_arg_4); + this._leftTurns.push(_arg_5); + this._hideWalls.push(false); + this._manuallyLeftCut.push(false); + this._manuallyRightCut.push(false); + this._count++; + } + } + + private checkIsNotDuplicate(k: Point, _arg_2: number, _arg_3: number, _arg_4: boolean, _arg_5: boolean): boolean + { + let _local_6 = 0; + + while(_local_6 < this._count) + { + if(((((((this._corners[_local_6].x == k.x) && (this._corners[_local_6].y == k.y)) && (this._directions[_local_6] == _arg_2)) && (this._lengths[_local_6] == _arg_3)) && (this._borders[_local_6] == _arg_4)) && (this._leftTurns[_local_6] == _arg_5))) + { + return false; + } + _local_6++; + } + return true; + } + + public get count(): number + { + return this._count; + } + + public getCorner(k: number): Point + { + return this._corners[k]; + } + + public getEndPoint(k: number): Point + { + this.calculateWallEndPoints(); + return this._endPoints[k]; + } + + public getLength(k: number): number + { + return this._lengths[k]; + } + + public getDirection(k: number): number + { + return this._directions[k]; + } + + public getBorder(k: number): boolean + { + return this._borders[k]; + } + + public getHideWall(k: number): boolean + { + return this._hideWalls[k]; + } + + public getLeftTurn(k: number): boolean + { + return this._leftTurns[k]; + } + + public getManuallyLeftCut(k: number): boolean + { + return this._manuallyLeftCut[k]; + } + + public getManuallyRightCut(k: number): boolean + { + return this._manuallyRightCut[k]; + } + + public setHideWall(k: number, _arg_2: boolean): void + { + this._hideWalls[k] = _arg_2; + } + + public setLength(k: number, _arg_2: number): void + { + if(_arg_2 < this._lengths[k]) + { + this._lengths[k] = _arg_2; + this._manuallyRightCut[k] = true; + } + } + + public moveCorner(k: number, _arg_2: number): void + { + let _local_3: IVector3D; + if(((_arg_2 > 0) && (_arg_2 < this._lengths[k]))) + { + const corner = this._corners[k]; + + _local_3 = RoomWallData.WALL_DIRECTION_VECTORS[this.getDirection(k)]; + this._corners[k] = new Point((corner.x + (_arg_2 * _local_3.x)), (corner.y + (_arg_2 * _local_3.y))); + this._lengths[k] = (this._lengths[k] - _arg_2); + this._manuallyLeftCut[k] = true; + } + } + + private calculateWallEndPoints(): void + { + let k: number; + let _local_2: Point; + let _local_3: Point; + let _local_4: IVector3D; + let _local_5: number; + if(this._endPoints.length != this.count) + { + this._endPoints = []; + k = 0; + while(k < this.count) + { + _local_2 = this.getCorner(k); + _local_3 = new Point(_local_2.x, _local_2.y); + _local_4 = RoomWallData.WALL_DIRECTION_VECTORS[this.getDirection(k)]; + _local_5 = this.getLength(k); + _local_3.x = (_local_3.x + (_local_4.x * _local_5)); + _local_3.y = (_local_3.y + (_local_4.y * _local_5)); + this._endPoints.push(_local_3); + k++; + } + } + } +} diff --git a/packages/room/src/object/index.ts b/packages/room/src/object/index.ts new file mode 100644 index 0000000..ccc0001 --- /dev/null +++ b/packages/room/src/object/index.ts @@ -0,0 +1,22 @@ +export * from './RoomFloorHole'; +export * from './RoomMapData'; +export * from './RoomMapMaskData'; +export * from './RoomObject'; +export * from './RoomObjectModel'; +export * from './RoomPlaneBitmapMaskData'; +export * from './RoomPlaneBitmapMaskParser'; +export * from './RoomPlaneData'; +export * from './RoomPlaneMaskData'; +export * from './RoomPlaneParser'; +export * from './RoomWallData'; +export * from './logic'; +export * from './logic/furniture'; +export * from './visualization'; +export * from './visualization/avatar'; +export * from './visualization/avatar/additions'; +export * from './visualization/data'; +export * from './visualization/furniture'; +export * from './visualization/pet'; +export * from './visualization/room'; +export * from './visualization/room/mask'; +export * from './visualization/room/utils'; diff --git a/packages/room/src/object/logic/AvatarLogic.ts b/packages/room/src/object/logic/AvatarLogic.ts new file mode 100644 index 0000000..97e5589 --- /dev/null +++ b/packages/room/src/object/logic/AvatarLogic.ts @@ -0,0 +1,504 @@ + +import { AvatarAction, IRoomGeometry, IRoomObjectModel, IVector3D, MouseEventType, RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectFurnitureActionEvent, RoomObjectMouseEvent, RoomObjectMoveEvent, RoomSpriteMouseEvent } from '@nitrots/events'; +import { GetTickerTime, Vector3d } from '@nitrots/utils'; +import { ObjectAvatarCarryObjectUpdateMessage, ObjectAvatarChatUpdateMessage, ObjectAvatarDanceUpdateMessage, ObjectAvatarEffectUpdateMessage, ObjectAvatarExpressionUpdateMessage, ObjectAvatarFigureUpdateMessage, ObjectAvatarFlatControlUpdateMessage, ObjectAvatarGestureUpdateMessage, ObjectAvatarMutedUpdateMessage, ObjectAvatarOwnMessage, ObjectAvatarPlayerValueUpdateMessage, ObjectAvatarPlayingGameUpdateMessage, ObjectAvatarPostureUpdateMessage, ObjectAvatarSelectedMessage, ObjectAvatarSignUpdateMessage, ObjectAvatarSleepUpdateMessage, ObjectAvatarTypingUpdateMessage, ObjectAvatarUpdateMessage, ObjectAvatarUseObjectUpdateMessage, RoomObjectUpdateMessage } from '../../messages'; +import { MovingObjectLogic } from './MovingObjectLogic'; + +export class AvatarLogic extends MovingObjectLogic +{ + private static MAX_HAND_ID: number = 999999999; + private static MAX_HAND_USE_ID: number = 999; + private static EFFECT_TYPE_SPLASH: number = 28; + private static EFFECT_SPLASH_LENGTH: number = 500; + private static EFFECT_TYPE_SWIM: number = 29; + private static EFFECT_TYPE_SPLASH_DARK: number = 184; + private static EFFECT_TYPE_SWIM_DARK: number = 185; + + private _selected: boolean; + private _reportedLocation: IVector3D; + private _effectChangeTimeStamp: number; + private _newEffect: number; + private _blinkingStartTimestamp: number; + private _blinkingEndTimestamp: number; + private _talkingEndTimestamp: number; + private _talkingPauseStartTimestamp: number; + private _talkingPauseEndTimestamp: number; + private _carryObjectStartTimestamp: number; + private _carryObjectEndTimestamp: number; + private _allowUseCarryObject: boolean; + private _animationEndTimestamp: number; + private _signEndTimestamp: number; + private _gestureEndTimestamp: number; + private _numberValueEndTimestamp: number; + + constructor() + { + super(); + + this._selected = false; + this._reportedLocation = null; + this._effectChangeTimeStamp = 0; + this._newEffect = 0; + this._blinkingStartTimestamp = GetTickerTime() + this.randomBlinkStartTimestamp(); + this._blinkingEndTimestamp = 0; + this._talkingEndTimestamp = 0; + this._talkingPauseStartTimestamp = 0; + this._talkingPauseEndTimestamp = 0; + this._carryObjectStartTimestamp = 0; + this._carryObjectEndTimestamp = 0; + this._allowUseCarryObject = false; + this._animationEndTimestamp = 0; + this._signEndTimestamp = 0; + this._gestureEndTimestamp = 0; + this._numberValueEndTimestamp = 0; + } + + public getEventTypes(): string[] + { + const types = [RoomObjectMouseEvent.CLICK, RoomObjectMouseEvent.DOUBLE_CLICK, RoomObjectMoveEvent.POSITION_CHANGED, RoomObjectMouseEvent.MOUSE_ENTER, RoomObjectMouseEvent.MOUSE_LEAVE, RoomObjectFurnitureActionEvent.MOUSE_BUTTON, RoomObjectFurnitureActionEvent.MOUSE_ARROW]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public dispose(): void + { + if(this._selected && this.object) + { + if(this.eventDispatcher) this.eventDispatcher.dispatchEvent(new RoomObjectMoveEvent(RoomObjectMoveEvent.OBJECT_REMOVED, this.object)); + } + + super.dispose(); + + this._reportedLocation = null; + } + + public update(time: number): void + { + super.update(time); + + if(this._selected && this.object) + { + if(this.eventDispatcher) + { + const location = this.object.getLocation(); + + if(((!this._reportedLocation || (this._reportedLocation.x !== location.x)) || (this._reportedLocation.y !== location.y)) || (this._reportedLocation.z !== location.z)) + { + if(!this._reportedLocation) this._reportedLocation = new Vector3d(); + + this._reportedLocation.assign(location); + + this.eventDispatcher.dispatchEvent(new RoomObjectMoveEvent(RoomObjectMoveEvent.POSITION_CHANGED, this.object)); + } + } + } + + const model = this.object && this.object.model; + + if(model) this.updateModel(this.time, model); + } + + private updateModel(time: number, model: IRoomObjectModel): void + { + if(this._talkingEndTimestamp > 0) + { + if(time > this._talkingEndTimestamp) + { + model.setValue(RoomObjectVariable.FIGURE_TALK, 0); + + this._talkingEndTimestamp = 0; + this._talkingPauseStartTimestamp = 0; + this._talkingPauseEndTimestamp = 0; + } + else + { + if(!this._talkingPauseEndTimestamp && !this._talkingPauseStartTimestamp) + { + this._talkingPauseStartTimestamp = time + this.randomTalkingPauseStartTimestamp(); + this._talkingPauseEndTimestamp = this._talkingPauseStartTimestamp + this.randomTalkingPauseEndTimestamp(); + } + else + { + if((this._talkingPauseStartTimestamp > 0) && (time > this._talkingPauseStartTimestamp)) + { + model.setValue(RoomObjectVariable.FIGURE_TALK, 0); + + this._talkingPauseStartTimestamp = 0; + } + else + { + if((this._talkingPauseEndTimestamp > 0) && (time > this._talkingPauseEndTimestamp)) + { + model.setValue(RoomObjectVariable.FIGURE_TALK, 1); + + this._talkingPauseEndTimestamp = 0; + } + } + } + } + } + + if((this._animationEndTimestamp > 0) && (time > this._animationEndTimestamp)) + { + model.setValue(RoomObjectVariable.FIGURE_EXPRESSION, 0); + + this._animationEndTimestamp = 0; + } + + if((this._gestureEndTimestamp > 0) && (time > this._gestureEndTimestamp)) + { + model.setValue(RoomObjectVariable.FIGURE_GESTURE, 0); + + this._gestureEndTimestamp = 0; + } + + if((this._signEndTimestamp > 0) && (time > this._signEndTimestamp)) + { + model.setValue(RoomObjectVariable.FIGURE_SIGN, -1); + + this._signEndTimestamp = 0; + } + + if(this._carryObjectEndTimestamp > 0) + { + if(time > this._carryObjectEndTimestamp) + { + model.setValue(RoomObjectVariable.FIGURE_CARRY_OBJECT, 0); + model.setValue(RoomObjectVariable.FIGURE_USE_OBJECT, 0); + + this._carryObjectStartTimestamp = 0; + this._carryObjectEndTimestamp = 0; + this._allowUseCarryObject = false; + } + } + + if(this._allowUseCarryObject) + { + if((time - this._carryObjectStartTimestamp) > 5000) + { + if(((time - this._carryObjectStartTimestamp) % 10000) < 1000) + { + model.setValue(RoomObjectVariable.FIGURE_USE_OBJECT, 1); + } + else + { + model.setValue(RoomObjectVariable.FIGURE_USE_OBJECT, 0); + } + } + } + + if((this._blinkingStartTimestamp > -1) && (time > this._blinkingStartTimestamp)) + { + model.setValue(RoomObjectVariable.FIGURE_BLINK, 1); + + this._blinkingStartTimestamp = time + this.randomBlinkStartTimestamp(); + this._blinkingEndTimestamp = time + this.randomBlinkEndTimestamp(); + } + + if((this._blinkingEndTimestamp > 0) && (time > this._blinkingEndTimestamp)) + { + model.setValue(RoomObjectVariable.FIGURE_BLINK, 0); + + this._blinkingEndTimestamp = 0; + } + + if((this._effectChangeTimeStamp > 0) && (time > this._effectChangeTimeStamp)) + { + model.setValue(RoomObjectVariable.FIGURE_EFFECT, this._newEffect); + + this._effectChangeTimeStamp = 0; + } + + if((this._numberValueEndTimestamp > 0) && (time > this._numberValueEndTimestamp)) + { + model.setValue(RoomObjectVariable.FIGURE_NUMBER_VALUE, 0); + + this._numberValueEndTimestamp = 0; + } + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + if(!message || !this.object) return; + + super.processUpdateMessage(message); + + const model = this.object && this.object.model; + + if(!model) return; + + if(message instanceof ObjectAvatarPostureUpdateMessage) + { + model.setValue(RoomObjectVariable.FIGURE_POSTURE, message.postureType); + model.setValue(RoomObjectVariable.FIGURE_POSTURE_PARAMETER, message.parameter); + + return; + } + + if(message instanceof ObjectAvatarChatUpdateMessage) + { + model.setValue(RoomObjectVariable.FIGURE_TALK, 1); + + this._talkingEndTimestamp = (this.time + (message.numberOfWords * 1000)); + + return; + } + + if(message instanceof ObjectAvatarTypingUpdateMessage) + { + model.setValue(RoomObjectVariable.FIGURE_IS_TYPING, message.isTyping ? 1 : 0); + + return; + } + + if(message instanceof ObjectAvatarMutedUpdateMessage) + { + model.setValue(RoomObjectVariable.FIGURE_IS_MUTED, (message.isMuted ? 1 : 0)); + + return; + } + + if(message instanceof ObjectAvatarPlayingGameUpdateMessage) + { + model.setValue(RoomObjectVariable.FIGURE_IS_PLAYING_GAME, (message.isPlayingGame ? 1 : 0)); + + return; + } + + if(message instanceof ObjectAvatarUpdateMessage) + { + model.setValue(RoomObjectVariable.HEAD_DIRECTION, message.headDirection); + model.setValue(RoomObjectVariable.FIGURE_CAN_STAND_UP, message.canStandUp); + model.setValue(RoomObjectVariable.FIGURE_VERTICAL_OFFSET, message.baseY); + + return; + } + + if(message instanceof ObjectAvatarGestureUpdateMessage) + { + model.setValue(RoomObjectVariable.FIGURE_GESTURE, message.gesture); + + this._gestureEndTimestamp = (this.time + 3000); + + return; + } + + if(message instanceof ObjectAvatarExpressionUpdateMessage) + { + model.setValue(RoomObjectVariable.FIGURE_EXPRESSION, message.expressionType); + + this._animationEndTimestamp = AvatarAction.getExpressionTimeout(model.getValue(RoomObjectVariable.FIGURE_EXPRESSION)); + + if(this._animationEndTimestamp > -1) this._animationEndTimestamp += this.time; + + return; + } + + if(message instanceof ObjectAvatarDanceUpdateMessage) + { + model.setValue(RoomObjectVariable.FIGURE_DANCE, message.danceStyle); + + return; + } + + if(message instanceof ObjectAvatarSleepUpdateMessage) + { + model.setValue(RoomObjectVariable.FIGURE_SLEEP, message.isSleeping ? 1 : 0); + + if(message.isSleeping) this._blinkingStartTimestamp = -1; + else this._blinkingStartTimestamp = (this.time + this.randomBlinkStartTimestamp()); + + return; + } + + if(message instanceof ObjectAvatarPlayerValueUpdateMessage) + { + model.setValue(RoomObjectVariable.FIGURE_NUMBER_VALUE, message.value); + + this._numberValueEndTimestamp = (this.time + 3000); + + return; + } + + if(message instanceof ObjectAvatarEffectUpdateMessage) + { + this.updateAvatarEffect(message.effect, message.delayMilliseconds, model); + + return; + } + + if(message instanceof ObjectAvatarCarryObjectUpdateMessage) + { + model.setValue(RoomObjectVariable.FIGURE_CARRY_OBJECT, message.itemType); + model.setValue(RoomObjectVariable.FIGURE_USE_OBJECT, 0); + + if(message.itemType === 0) + { + this._carryObjectStartTimestamp = 0; + this._carryObjectEndTimestamp = 0; + this._allowUseCarryObject = false; + } + else + { + this._carryObjectStartTimestamp = this.time; + + if(message.itemType < AvatarLogic.MAX_HAND_ID) + { + this._carryObjectEndTimestamp = 0; + this._allowUseCarryObject = message.itemType <= AvatarLogic.MAX_HAND_USE_ID; + } + else + { + this._carryObjectEndTimestamp = this._carryObjectStartTimestamp + 1500; + this._allowUseCarryObject = false; + } + } + + return; + } + + if(message instanceof ObjectAvatarUseObjectUpdateMessage) + { + model.setValue(RoomObjectVariable.FIGURE_USE_OBJECT, message.itemType); + + return; + } + + if(message instanceof ObjectAvatarSignUpdateMessage) + { + model.setValue(RoomObjectVariable.FIGURE_SIGN, message.signType); + + this._signEndTimestamp = (this.time + 5000); + + return; + } + + if(message instanceof ObjectAvatarFlatControlUpdateMessage) + { + model.setValue(RoomObjectVariable.FIGURE_FLAT_CONTROL, message.level); + + return; + } + + if(message instanceof ObjectAvatarFigureUpdateMessage) + { + model.setValue(RoomObjectVariable.FIGURE, message.figure); + model.setValue(RoomObjectVariable.GENDER, message.gender); + + return; + } + + if(message instanceof ObjectAvatarSelectedMessage) + { + this._selected = message.selected; + this._reportedLocation = null; + + return; + } + + if(message instanceof ObjectAvatarOwnMessage) + { + model.setValue(RoomObjectVariable.OWN_USER, 1); + + return; + } + } + + private updateAvatarEffect(effect: number, delay: number, model: IRoomObjectModel): void + { + if(effect === AvatarLogic.EFFECT_TYPE_SPLASH) + { + this._effectChangeTimeStamp = (GetTickerTime() + AvatarLogic.EFFECT_SPLASH_LENGTH); + this._newEffect = AvatarLogic.EFFECT_TYPE_SWIM; + } + + else if(effect === AvatarLogic.EFFECT_TYPE_SPLASH_DARK) + { + this._effectChangeTimeStamp = (GetTickerTime() + AvatarLogic.EFFECT_SPLASH_LENGTH); + this._newEffect = AvatarLogic.EFFECT_TYPE_SWIM_DARK; + } + + else if(model.getValue(RoomObjectVariable.FIGURE_EFFECT) === AvatarLogic.EFFECT_TYPE_SWIM) + { + this._effectChangeTimeStamp = (GetTickerTime() + AvatarLogic.EFFECT_SPLASH_LENGTH); + this._newEffect = effect; + + effect = AvatarLogic.EFFECT_TYPE_SPLASH; + } + + else if(model.getValue(RoomObjectVariable.FIGURE_EFFECT) === AvatarLogic.EFFECT_TYPE_SWIM_DARK) + { + this._effectChangeTimeStamp = (GetTickerTime() + AvatarLogic.EFFECT_SPLASH_LENGTH); + this._newEffect = effect; + + effect = AvatarLogic.EFFECT_TYPE_SPLASH_DARK; + } + + else if(delay === 0) + { + this._effectChangeTimeStamp = 0; + } + + else + { + this._effectChangeTimeStamp = (GetTickerTime() + delay); + this._newEffect = effect; + + return; + } + + model.setValue(RoomObjectVariable.FIGURE_EFFECT, effect); + } + + public mouseEvent(event: RoomSpriteMouseEvent, geometry: IRoomGeometry): void + { + let eventType: string = null; + + switch(event.type) + { + case MouseEventType.MOUSE_CLICK: + eventType = RoomObjectMouseEvent.CLICK; + break; + case MouseEventType.DOUBLE_CLICK: + eventType = RoomObjectMouseEvent.DOUBLE_CLICK; + break; + case MouseEventType.ROLL_OVER: + eventType = RoomObjectMouseEvent.MOUSE_ENTER; + + if(this.object.model) this.object.model.setValue(RoomObjectVariable.FIGURE_HIGHLIGHT, 1); + + if(this.eventDispatcher) this.eventDispatcher.dispatchEvent(new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.MOUSE_BUTTON, this.object)); + break; + case MouseEventType.ROLL_OUT: + eventType = RoomObjectMouseEvent.MOUSE_LEAVE; + + if(this.object.model) this.object.model.setValue(RoomObjectVariable.FIGURE_HIGHLIGHT, 0); + + if(this.eventDispatcher) this.eventDispatcher.dispatchEvent(new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.MOUSE_ARROW, this.object)); + break; + } + + if(eventType && this.eventDispatcher) this.eventDispatcher.dispatchEvent(new RoomObjectMouseEvent(eventType, this.object, event.eventId, event.altKey, event.ctrlKey, event.shiftKey, event.buttonDown)); + } + + private randomTalkingPauseStartTimestamp(): number + { + return 100 + (Math.random() * 200); + } + + private randomTalkingPauseEndTimestamp(): number + { + return 75 + (Math.random() * 75); + } + + private randomBlinkStartTimestamp(): number + { + return 4500 + (Math.random() * 1000); + } + + private randomBlinkEndTimestamp(): number + { + return 50 + (Math.random() * 200); + } +} diff --git a/packages/room/src/object/logic/MovingObjectLogic.ts b/packages/room/src/object/logic/MovingObjectLogic.ts new file mode 100644 index 0000000..201d8f2 --- /dev/null +++ b/packages/room/src/object/logic/MovingObjectLogic.ts @@ -0,0 +1,148 @@ +import { IRoomObjectController, IRoomObjectUpdateMessage, IVector3D, RoomObjectVariable } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; +import { ObjectMoveUpdateMessage } from '../../messages'; +import { RoomObjectLogicBase } from './RoomObjectLogicBase'; + +export class MovingObjectLogic extends RoomObjectLogicBase +{ + public static DEFAULT_UPDATE_INTERVAL: number = 500; + private static TEMP_VECTOR: Vector3d = new Vector3d(); + + private _liftAmount: number; + + private _location: Vector3d; + private _locationDelta: Vector3d; + private _lastUpdateTime: number; + private _changeTime: number; + private _updateInterval: number; + + constructor() + { + super(); + + this._liftAmount = 0; + + this._location = new Vector3d(); + this._locationDelta = new Vector3d(); + this._lastUpdateTime = 0; + this._changeTime = 0; + this._updateInterval = MovingObjectLogic.DEFAULT_UPDATE_INTERVAL; + } + + public dispose(): void + { + this._liftAmount = 0; + + super.dispose(); + } + + public update(time: number): void + { + super.update(time); + + const locationOffset = this.getLocationOffset(); + const model = this.object && this.object.model; + + if(model) + { + if(locationOffset) + { + if(this._liftAmount !== locationOffset.z) + { + this._liftAmount = locationOffset.z; + + model.setValue(RoomObjectVariable.FURNITURE_LIFT_AMOUNT, this._liftAmount); + } + } + else + { + if(this._liftAmount !== 0) + { + this._liftAmount = 0; + + model.setValue(RoomObjectVariable.FURNITURE_LIFT_AMOUNT, this._liftAmount); + } + } + } + + if((this._locationDelta.length > 0) || locationOffset) + { + const vector = MovingObjectLogic.TEMP_VECTOR; + + let difference = (this.time - this._changeTime); + + if(difference === (this._updateInterval >> 1)) difference++; + + if(difference > this._updateInterval) difference = this._updateInterval; + + if(this._locationDelta.length > 0) + { + vector.assign(this._locationDelta); + vector.multiply((difference / this._updateInterval)); + vector.add(this._location); + } + else + { + vector.assign(this._location); + } + + if(locationOffset) vector.add(locationOffset); + + this.object.setLocation(vector); + + if(difference === this._updateInterval) + { + this._locationDelta.x = 0; + this._locationDelta.y = 0; + this._locationDelta.z = 0; + } + } + + this._lastUpdateTime = this.time; + } + + public setObject(object: IRoomObjectController): void + { + super.setObject(object); + + if(object) this._location.assign(object.getLocation()); + } + + public processUpdateMessage(message: IRoomObjectUpdateMessage): void + { + if(!message) return; + + super.processUpdateMessage(message); + + if(message.location) this._location.assign(message.location); + + if(message instanceof ObjectMoveUpdateMessage) return this.processMoveMessage(message); + } + + private processMoveMessage(message: ObjectMoveUpdateMessage): void + { + if(!message || !this.object || !message.location) return; + + this._changeTime = this._lastUpdateTime; + + this._locationDelta.assign(message.targetLocation); + this._locationDelta.subtract(this._location); + } + + protected getLocationOffset(): IVector3D + { + return null; + } + + protected get lastUpdateTime(): number + { + return this._lastUpdateTime; + } + + protected set updateInterval(interval: number) + { + if(interval <= 0) interval = 1; + + this._updateInterval = interval; + } +} diff --git a/packages/room/src/object/logic/PetLogic.ts b/packages/room/src/object/logic/PetLogic.ts new file mode 100644 index 0000000..2e13a05 --- /dev/null +++ b/packages/room/src/object/logic/PetLogic.ts @@ -0,0 +1,238 @@ +import { IAssetData, IRoomGeometry, IRoomObjectModel, IVector3D, MouseEventType, PetFigureData, PetType, RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectMouseEvent, RoomObjectMoveEvent, RoomSpriteMouseEvent } from '@nitrots/events'; +import { Vector3d } from '@nitrots/utils'; +import { ObjectAvatarChatUpdateMessage, ObjectAvatarExperienceUpdateMessage, ObjectAvatarFigureUpdateMessage, ObjectAvatarPetGestureUpdateMessage, ObjectAvatarPostureUpdateMessage, ObjectAvatarSelectedMessage, ObjectAvatarSleepUpdateMessage, ObjectAvatarUpdateMessage, RoomObjectUpdateMessage } from '../../messages'; +import { MovingObjectLogic } from './MovingObjectLogic'; + +export class PetLogic extends MovingObjectLogic +{ + private _selected: boolean; + private _reportedLocation: IVector3D; + private _postureIndex: number; + private _gestureIndex: number; + private _headDirectionDelta: number; + private _directions: number[]; + + private _talkingEndTimestamp: number; + private _gestureEndTimestamp: number; + private _expressionEndTimestamp: number; + + constructor() + { + super(); + + this._selected = false; + this._reportedLocation = null; + this._postureIndex = 0; + this._gestureIndex = 0; + this._headDirectionDelta = 0; + this._directions = []; + + this._talkingEndTimestamp = 0; + this._gestureEndTimestamp = 0; + this._expressionEndTimestamp = 0; + } + + public getEventTypes(): string[] + { + const types = [RoomObjectMouseEvent.CLICK, RoomObjectMoveEvent.POSITION_CHANGED]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public initialize(asset: IAssetData): void + { + if(!asset) return; + + const model = this.object && this.object.model; + + if(!model) return; + + if(asset.logic) + { + if(asset.logic.model) + { + const directions = asset.logic.model.directions; + + if(directions && directions.length) + { + for(const direction of directions) this._directions.push(direction); + + this._directions.sort(); + } + } + } + + model.setValue(RoomObjectVariable.PET_ALLOWED_DIRECTIONS, this._directions); + } + + public dispose(): void + { + if(this._selected && this.object) + { + if(this.eventDispatcher) this.eventDispatcher.dispatchEvent(new RoomObjectMoveEvent(RoomObjectMoveEvent.OBJECT_REMOVED, this.object)); + } + + this._directions = null; + this._reportedLocation = null; + } + + public update(totalTimeRunning: number): void + { + super.update(totalTimeRunning); + + if(this._selected && this.object) + { + if(this.eventDispatcher) + { + const location = this.object.getLocation(); + + if(((!this._reportedLocation || (this._reportedLocation.x !== location.x)) || (this._reportedLocation.y !== location.y)) || (this._reportedLocation.z !== location.z)) + { + if(!this._reportedLocation) this._reportedLocation = new Vector3d(); + + this._reportedLocation.assign(location); + + this.eventDispatcher.dispatchEvent(new RoomObjectMoveEvent(RoomObjectMoveEvent.POSITION_CHANGED, this.object)); + } + } + } + + if(this.object && this.object.model) this.updateModel(totalTimeRunning, this.object.model); + } + + private updateModel(time: number, model: IRoomObjectModel): void + { + if((this._gestureEndTimestamp > 0) && (time > this._gestureEndTimestamp)) + { + model.setValue(RoomObjectVariable.FIGURE_GESTURE, null); + + this._gestureEndTimestamp = 0; + } + + if(this._talkingEndTimestamp > 0) + { + if(time > this._talkingEndTimestamp) + { + model.setValue(RoomObjectVariable.FIGURE_TALK, 0); + + this._talkingEndTimestamp = 0; + } + } + + if((this._expressionEndTimestamp > 0) && (time > this._expressionEndTimestamp)) + { + model.setValue(RoomObjectVariable.FIGURE_EXPRESSION, 0); + + this._expressionEndTimestamp = 0; + } + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + if(!message || !this.object) return; + + super.processUpdateMessage(message); + + const model = this.object && this.object.model; + + if(!model) return; + + if(message instanceof ObjectAvatarUpdateMessage) + { + model.setValue(RoomObjectVariable.HEAD_DIRECTION, message.headDirection); + + return; + } + + if(message instanceof ObjectAvatarFigureUpdateMessage) + { + const petFigureData = new PetFigureData(message.figure); + + model.setValue(RoomObjectVariable.FIGURE, message.figure); + model.setValue(RoomObjectVariable.RACE, message.subType); + model.setValue(RoomObjectVariable.PET_PALETTE_INDEX, petFigureData.paletteId); + model.setValue(RoomObjectVariable.PET_COLOR, petFigureData.color); + model.setValue(RoomObjectVariable.PET_TYPE, petFigureData.typeId); + model.setValue(RoomObjectVariable.PET_CUSTOM_LAYER_IDS, petFigureData.customLayerIds); + model.setValue(RoomObjectVariable.PET_CUSTOM_PARTS_IDS, petFigureData.customPartIds); + model.setValue(RoomObjectVariable.PET_CUSTOM_PALETTE_IDS, petFigureData.customPaletteIds); + model.setValue(RoomObjectVariable.PET_IS_RIDING, (message.isRiding ? 1 : 0)); + + return; + } + + if(message instanceof ObjectAvatarPostureUpdateMessage) + { + model.setValue(RoomObjectVariable.FIGURE_POSTURE, message.postureType); + + return; + } + + if(message instanceof ObjectAvatarChatUpdateMessage) + { + model.setValue(RoomObjectVariable.FIGURE_TALK, 1); + + this._talkingEndTimestamp = this.time + (message.numberOfWords * 1000); + + return; + } + + if(message instanceof ObjectAvatarSleepUpdateMessage) + { + model.setValue(RoomObjectVariable.FIGURE_SLEEP, message.isSleeping ? 1 : 0); + + return; + } + + if(message instanceof ObjectAvatarPetGestureUpdateMessage) + { + model.setValue(RoomObjectVariable.FIGURE_GESTURE, message.gesture); + + this._gestureEndTimestamp = this.time + 3000; + + return; + } + + if(message instanceof ObjectAvatarSelectedMessage) + { + this._selected = message.selected; + this._reportedLocation = null; + + return; + } + + if(message instanceof ObjectAvatarExperienceUpdateMessage) + { + model.setValue(RoomObjectVariable.FIGURE_EXPERIENCE_TIMESTAMP, this.time); + model.setValue(RoomObjectVariable.FIGURE_GAINED_EXPERIENCE, message.gainedExperience); + + return; + } + } + + public mouseEvent(event: RoomSpriteMouseEvent, geometry: IRoomGeometry): void + { + let eventType: string = null; + + switch(event.type) + { + case MouseEventType.MOUSE_CLICK: + eventType = RoomObjectMouseEvent.CLICK; + break; + case MouseEventType.DOUBLE_CLICK: + break; + case MouseEventType.MOUSE_DOWN: { + const petType = this.object.model.getValue(RoomObjectVariable.PET_TYPE); + + if(petType === PetType.MONSTERPLANT) + { + if(this.eventDispatcher) this.eventDispatcher.dispatchEvent(new RoomObjectMouseEvent(RoomObjectMouseEvent.MOUSE_DOWN, this.object, event.eventId, event.altKey, event.ctrlKey, event.shiftKey, event.buttonDown)); + } + break; + } + } + + if(eventType && this.eventDispatcher) this.eventDispatcher.dispatchEvent(new RoomObjectMouseEvent(eventType, this.object, event.eventId, event.altKey, event.ctrlKey, event.shiftKey, event.buttonDown)); + } +} diff --git a/packages/room/src/object/logic/RoomLogic.ts b/packages/room/src/object/logic/RoomLogic.ts new file mode 100644 index 0000000..22c6835 --- /dev/null +++ b/packages/room/src/object/logic/RoomLogic.ts @@ -0,0 +1,453 @@ +import { IRoomGeometry, IRoomObjectModel, MouseEventType, RoomObjectVariable } from '@nitrots/api'; +import { GetConfiguration } from '@nitrots/configuration'; +import { RoomObjectEvent, RoomObjectMouseEvent, RoomObjectTileMouseEvent, RoomObjectWallMouseEvent, RoomSpriteMouseEvent } from '@nitrots/events'; +import { ColorConverter, Vector3d } from '@nitrots/utils'; +import { Point } from 'pixi.js'; +import { ObjectRoomColorUpdateMessage, ObjectRoomFloorHoleUpdateMessage, ObjectRoomMapUpdateMessage, ObjectRoomMaskUpdateMessage, ObjectRoomPlanePropertyUpdateMessage, ObjectRoomPlaneVisibilityUpdateMessage, ObjectRoomUpdateMessage, RoomObjectUpdateMessage } from '../../messages'; +import { RoomMapData } from '../RoomMapData'; +import { RoomPlaneBitmapMaskData } from '../RoomPlaneBitmapMaskData'; +import { RoomPlaneBitmapMaskParser } from '../RoomPlaneBitmapMaskParser'; +import { RoomPlaneData } from '../RoomPlaneData'; +import { RoomPlaneParser } from '../RoomPlaneParser'; +import { RoomObjectLogicBase } from './RoomObjectLogicBase'; + +export class RoomLogic extends RoomObjectLogicBase +{ + private _planeParser: RoomPlaneParser; + private _planeBitmapMaskParser: RoomPlaneBitmapMaskParser; + private _color: number; + private _light: number; + private _originalColor: number; + private _originalLight: number; + private _targetColor: number; + private _targetLight: number; + private _colorChangedTime: number; + private _colorTransitionLength: number; + private _lastHoleUpdate: number; + private _needsMapUpdate: boolean; + private _skipColorTransition: boolean; + + constructor() + { + super(); + + this._planeParser = new RoomPlaneParser(); + this._planeBitmapMaskParser = new RoomPlaneBitmapMaskParser(); + this._color = 0xFFFFFF; + this._light = 0xFF; + this._originalColor = 0xFFFFFF; + this._originalLight = 0xFF; + this._targetColor = 0xFFFFFF; + this._targetLight = 0xFF; + this._colorChangedTime = 0; + this._colorTransitionLength = 1500; + this._lastHoleUpdate = 0; + this._needsMapUpdate = false; + this._skipColorTransition = false; + } + + public getEventTypes(): string[] + { + const types = [RoomObjectMouseEvent.MOUSE_MOVE, RoomObjectMouseEvent.CLICK]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public dispose(): void + { + super.dispose(); + + if(this._planeParser) + { + this._planeParser.dispose(); + + this._planeParser = null; + } + + if(this._planeBitmapMaskParser) + { + this._planeBitmapMaskParser.dispose(); + + this._planeBitmapMaskParser = null; + } + } + + public initialize(roomMap: RoomMapData): void + { + if(!roomMap || !this.object) return; + + if(!(roomMap instanceof RoomMapData)) return; + + if(!this._planeParser.initializeFromMapData(roomMap)) return; + + this.object.model.setValue(RoomObjectVariable.ROOM_MAP_DATA, roomMap); + this.object.model.setValue(RoomObjectVariable.ROOM_BACKGROUND_COLOR, 0xFFFFFF); + this.object.model.setValue(RoomObjectVariable.ROOM_FLOOR_VISIBILITY, 1); + this.object.model.setValue(RoomObjectVariable.ROOM_WALL_VISIBILITY, 1); + this.object.model.setValue(RoomObjectVariable.ROOM_LANDSCAPE_VISIBILITY, 1); + + this._skipColorTransition = (GetConfiguration().getValue('room.color.skip.transition') === true); + } + + public update(time: number): void + { + super.update(time); + + this.updateBackgroundColor(time); + + if(this._needsMapUpdate) + { + if(this._lastHoleUpdate && (time - this._lastHoleUpdate) < 5) return; + + const model = this.object && this.object.model; + + if(model) + { + const mapData = this._planeParser.getMapData(); + + model.setValue(RoomObjectVariable.ROOM_MAP_DATA, mapData); + model.setValue(RoomObjectVariable.ROOM_FLOOR_HOLE_UPDATE_TIME, time); + + this._planeParser.initializeFromMapData(mapData); + } + + this._lastHoleUpdate = 0; + this._needsMapUpdate = false; + } + + } + + private updateBackgroundColor(k: number): void + { + if(!this.object || !this._colorChangedTime) return; + + let color = this._color; + let newColor = this._light; + + if((k - this._colorChangedTime) >= this._colorTransitionLength) + { + color = this._targetColor; + newColor = this._targetLight; + + this._colorChangedTime = 0; + } + else + { + let _local_7 = ((this._originalColor >> 16) & 0xFF); + let _local_8 = ((this._originalColor >> 8) & 0xFF); + let _local_9 = (this._originalColor & 0xFF); + + const _local_10 = ((this._targetColor >> 16) & 0xFF); + const _local_11 = ((this._targetColor >> 8) & 0xFF); + const _local_12 = (this._targetColor & 0xFF); + const _local_13 = ((k - this._colorChangedTime) / this._colorTransitionLength); + + _local_7 = (_local_7 + ((_local_10 - _local_7) * _local_13)); + _local_8 = (_local_8 + ((_local_11 - _local_8) * _local_13)); + _local_9 = (_local_9 + ((_local_12 - _local_9) * _local_13)); + + color = (((_local_7 << 16) + (_local_8 << 8)) + _local_9); + newColor = (this._originalLight + ((this._targetLight - this._originalLight) * _local_13)); + + this._color = color; + this._light = newColor; + } + + let _local_5 = ColorConverter.rgbToHSL(color); + + _local_5 = ((_local_5 & 0xFFFF00) + newColor); + color = ColorConverter.hslToRGB(_local_5); + + if(this.object.model) this.object.model.setValue(RoomObjectVariable.ROOM_BACKGROUND_COLOR, color); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + if(!message || !this.object) return; + + const model = this.object.model; + + if(!model) return; + + if(message instanceof ObjectRoomUpdateMessage) + { + this.onObjectRoomUpdateMessage(message, model); + + return; + } + + if(message instanceof ObjectRoomMaskUpdateMessage) + { + this.onObjectRoomMaskUpdateMessage(message, model); + + return; + } + + if(message instanceof ObjectRoomPlaneVisibilityUpdateMessage) + { + this.onObjectRoomPlaneVisibilityUpdateMessage(message, model); + + return; + } + + if(message instanceof ObjectRoomPlanePropertyUpdateMessage) + { + this.onObjectRoomPlanePropertyUpdateMessage(message, model); + + return; + } + + if(message instanceof ObjectRoomFloorHoleUpdateMessage) + { + this.onObjectRoomFloorHoleUpdateMessage(message, model); + + return; + } + + if(message instanceof ObjectRoomColorUpdateMessage) + { + this.onObjectRoomColorUpdateMessage(message, model); + + return; + } + + if(message instanceof ObjectRoomMapUpdateMessage) + { + this.onObjectRoomMapUpdateMessage(message); + } + } + + private onObjectRoomUpdateMessage(message: ObjectRoomUpdateMessage, model: IRoomObjectModel): void + { + switch(message.type) + { + case ObjectRoomUpdateMessage.ROOM_FLOOR_UPDATE: + model.setValue(RoomObjectVariable.ROOM_FLOOR_TYPE, message.value); + return; + case ObjectRoomUpdateMessage.ROOM_WALL_UPDATE: + model.setValue(RoomObjectVariable.ROOM_WALL_TYPE, message.value); + return; + case ObjectRoomUpdateMessage.ROOM_LANDSCAPE_UPDATE: + model.setValue(RoomObjectVariable.ROOM_LANDSCAPE_TYPE, message.value); + return; + } + } + + private onObjectRoomMaskUpdateMessage(message: ObjectRoomMaskUpdateMessage, _arg_2: IRoomObjectModel): void + { + let maskType: string = null; + let update = false; + + switch(message.type) + { + case ObjectRoomMaskUpdateMessage.ADD_MASK: + maskType = RoomPlaneBitmapMaskData.WINDOW; + + if(message.maskCategory === ObjectRoomMaskUpdateMessage.HOLE) maskType = RoomPlaneBitmapMaskData.HOLE; + + this._planeBitmapMaskParser.addMask(message.maskId, message.maskType, message.maskLocation, maskType); + + update = true; + break; + case ObjectRoomMaskUpdateMessage.REMOVE_MASK: + update = this._planeBitmapMaskParser.removeMask(message.maskId); + break; + + } + + if(update) _arg_2.setValue(RoomObjectVariable.ROOM_PLANE_MASK_XML, this._planeBitmapMaskParser.getXML()); + } + + private onObjectRoomPlaneVisibilityUpdateMessage(message: ObjectRoomPlaneVisibilityUpdateMessage, model: IRoomObjectModel): void + { + let visible = 0; + + if(message.visible) visible = 1; + + switch(message.type) + { + case ObjectRoomPlaneVisibilityUpdateMessage.FLOOR_VISIBILITY: + model.setValue(RoomObjectVariable.ROOM_FLOOR_VISIBILITY, visible); + return; + case ObjectRoomPlaneVisibilityUpdateMessage.WALL_VISIBILITY: + model.setValue(RoomObjectVariable.ROOM_WALL_VISIBILITY, visible); + model.setValue(RoomObjectVariable.ROOM_LANDSCAPE_VISIBILITY, visible); + return; + } + } + + private onObjectRoomPlanePropertyUpdateMessage(message: ObjectRoomPlanePropertyUpdateMessage, model: IRoomObjectModel): void + { + switch(message.type) + { + case ObjectRoomPlanePropertyUpdateMessage.FLOOR_THICKNESS: + model.setValue(RoomObjectVariable.ROOM_FLOOR_THICKNESS, message.value); + return; + case ObjectRoomPlanePropertyUpdateMessage.WALL_THICKNESS: + model.setValue(RoomObjectVariable.ROOM_WALL_THICKNESS, message.value); + return; + } + } + + private onObjectRoomFloorHoleUpdateMessage(message: ObjectRoomFloorHoleUpdateMessage, model: IRoomObjectModel): void + { + switch(message.type) + { + case ObjectRoomFloorHoleUpdateMessage.ADD: + this._planeParser.addFloorHole(message.id, message.x, message.y, message.width, message.height); + this._needsMapUpdate = true; + return; + case ObjectRoomFloorHoleUpdateMessage.REMOVE: + this._planeParser.removeFloorHole(message.id); + this._needsMapUpdate = true; + return; + } + + this._lastHoleUpdate = this.time; + } + + private onObjectRoomColorUpdateMessage(message: ObjectRoomColorUpdateMessage, model: IRoomObjectModel): void + { + if(!message || !model) return; + + this._originalColor = this._color; + this._originalLight = this._light; + this._targetColor = message.color; + this._targetLight = message.light; + this._colorChangedTime = this.time; + + if(this._skipColorTransition) + this._colorTransitionLength = 0; + else + this._colorTransitionLength = 1500; + + model.setValue(RoomObjectVariable.ROOM_COLORIZE_BG_ONLY, message.backgroundOnly); + } + + private onObjectRoomMapUpdateMessage(message: ObjectRoomMapUpdateMessage): void + { + if(!message || !message.mapData) return; + + this.object.model.setValue(RoomObjectVariable.ROOM_MAP_DATA, message.mapData); + this.object.model.setValue(RoomObjectVariable.ROOM_FLOOR_HOLE_UPDATE_TIME, this.time); + + this._planeParser.initializeFromMapData(message.mapData); + } + + public mouseEvent(event: RoomSpriteMouseEvent, geometry: IRoomGeometry): void + { + if(!event || !geometry || !this.object || !this.object.model) return; + + const tag = event.spriteTag; + + let planeId = 0; + + if(tag && (tag.indexOf('@') >= 0)) + { + planeId = parseInt(tag.substr(tag.indexOf('@') + 1)); + } + + if((planeId < 1) || (planeId > this._planeParser.planeCount)) + { + if(event.type === MouseEventType.ROLL_OUT) + { + this.object.model.setValue(RoomObjectVariable.ROOM_SELECTED_PLANE, 0); + } + + return; + } + + planeId--; + + let planePosition: Point = null; + + const planeLocation = this._planeParser.getPlaneLocation(planeId); + const planeLeftSide = this._planeParser.getPlaneLeftSide(planeId); + const planeRightSide = this._planeParser.getPlaneRightSide(planeId); + const planeNormalDirection = this._planeParser.getPlaneNormalDirection(planeId); + const planeType = this._planeParser.getPlaneType(planeId); + + if(((((planeLocation == null) || (planeLeftSide == null)) || (planeRightSide == null)) || (planeNormalDirection == null))) return; + + const leftSideLength = planeLeftSide.length; + const rightSideLength = planeRightSide.length; + + if(((leftSideLength == 0) || (rightSideLength == 0))) return; + + const screenX = event.screenX; + const screenY = event.screenY; + const screenPoint = new Point(screenX, screenY); + + planePosition = geometry.getPlanePosition(screenPoint, planeLocation, planeLeftSide, planeRightSide); + + if(!planePosition) + { + this.object.model.setValue(RoomObjectVariable.ROOM_SELECTED_PLANE, 0); + + return; + } + + const _local_18 = Vector3d.product(planeLeftSide, (planePosition.x / leftSideLength)); + + _local_18.add(Vector3d.product(planeRightSide, (planePosition.y / rightSideLength))); + _local_18.add(planeLocation); + + const tileX = _local_18.x; + const tileY = _local_18.y; + const tileZ = _local_18.z; + + if(((((planePosition.x >= 0) && (planePosition.x < leftSideLength)) && (planePosition.y >= 0)) && (planePosition.y < rightSideLength))) + { + this.object.model.setValue(RoomObjectVariable.ROOM_SELECTED_X, tileX); + this.object.model.setValue(RoomObjectVariable.ROOM_SELECTED_Y, tileY); + this.object.model.setValue(RoomObjectVariable.ROOM_SELECTED_Z, tileZ); + this.object.model.setValue(RoomObjectVariable.ROOM_SELECTED_PLANE, (planeId + 1)); + } + else + { + this.object.model.setValue(RoomObjectVariable.ROOM_SELECTED_PLANE, 0); + + return; + } + + let eventType: string = null; + + if((event.type === MouseEventType.MOUSE_MOVE) || (event.type === MouseEventType.ROLL_OVER)) eventType = RoomObjectMouseEvent.MOUSE_MOVE; + else if((event.type === MouseEventType.MOUSE_CLICK)) eventType = RoomObjectMouseEvent.CLICK; + + switch(event.type) + { + case MouseEventType.MOUSE_MOVE: + case MouseEventType.ROLL_OVER: + case MouseEventType.MOUSE_CLICK: { + let newEvent: RoomObjectEvent = null; + + if(planeType === RoomPlaneData.PLANE_FLOOR) + { + newEvent = new RoomObjectTileMouseEvent(eventType, this.object, event.eventId, tileX, tileY, tileZ, event.altKey, event.ctrlKey, event.shiftKey, event.buttonDown); + } + + else if((planeType === RoomPlaneData.PLANE_WALL) || (planeType === RoomPlaneData.PLANE_LANDSCAPE)) + { + let direction = 90; + + if(planeNormalDirection) + { + direction = (planeNormalDirection.x + 90); + + if(direction > 360) direction -= 360; + } + + const _local_27 = ((planeLeftSide.length * planePosition.x) / leftSideLength); + const _local_28 = ((planeRightSide.length * planePosition.y) / rightSideLength); + + newEvent = new RoomObjectWallMouseEvent(eventType, this.object, event.eventId, planeLocation, planeLeftSide, planeRightSide, _local_27, _local_28, direction, event.altKey, event.ctrlKey, event.shiftKey, event.buttonDown); + } + + if(this.eventDispatcher) this.eventDispatcher.dispatchEvent(newEvent); + + return; + } + } + } +} diff --git a/packages/room/src/object/logic/RoomObjectLogicBase.ts b/packages/room/src/object/logic/RoomObjectLogicBase.ts new file mode 100644 index 0000000..72e4a90 --- /dev/null +++ b/packages/room/src/object/logic/RoomObjectLogicBase.ts @@ -0,0 +1,120 @@ +import { IEventDispatcher, IRoomGeometry, IRoomObjectController, IRoomObjectEventHandler, IRoomObjectUpdateMessage } from '@nitrots/api'; +import { RoomSpriteMouseEvent } from '@nitrots/events'; + +export class RoomObjectLogicBase implements IRoomObjectEventHandler +{ + private _events: IEventDispatcher = null; + private _object: IRoomObjectController = null; + private _time: number = 0; + + public initialize(data: unknown): void + { + return; + } + + public dispose(): void + { + this._object = null; + } + + public update(time: number): void + { + this._time = time; + + return; + } + + public processUpdateMessage(message: IRoomObjectUpdateMessage): void + { + if(!message || !this._object) return; + + this._object.setLocation(message.location); + this._object.setDirection(message.direction); + } + + public getEventTypes(): string[] + { + return []; + } + + protected mergeTypes(k: string[], _arg_2: string[]): string[] + { + const types = k.concat(); + + for(const type of _arg_2) + { + if(!type || (types.indexOf(type) >= 0)) continue; + + types.push(type); + } + + return types; + } + + public mouseEvent(event: RoomSpriteMouseEvent, geometry: IRoomGeometry): void + { + return; + } + + public useObject(): void + { + return; + } + + public setObject(object: IRoomObjectController): void + { + if(this._object === object) return; + + if(this._object) + { + this._object.setLogic(null); + } + + if(!object) + { + this.dispose(); + + this._object = null; + + return; + } + + this._object = object; + this._object.setLogic(this); + } + + public tearDown(): void + { + return; + } + + public get object(): IRoomObjectController + { + return this._object; + } + + public get eventDispatcher(): IEventDispatcher + { + return this._events; + } + + public set eventDispatcher(events: IEventDispatcher) + { + this._events = events; + } + + public get widget(): string + { + return null; + } + + public get contextMenu(): string + { + return null; + } + + public get time(): number + { + return this._time; + } +} diff --git a/packages/room/src/object/logic/SelectionArrowLogic.ts b/packages/room/src/object/logic/SelectionArrowLogic.ts new file mode 100644 index 0000000..fb08533 --- /dev/null +++ b/packages/room/src/object/logic/SelectionArrowLogic.ts @@ -0,0 +1,35 @@ +import { IAssetData, RoomObjectVariable } from '@nitrots/api'; +import { ObjectVisibilityUpdateMessage, RoomObjectUpdateMessage } from '../../messages'; +import { RoomObjectLogicBase } from './RoomObjectLogicBase'; + +export class SelectionArrowLogic extends RoomObjectLogicBase +{ + public initialize(data: IAssetData): void + { + if(!this.object) return; + + this.object.model.setValue(RoomObjectVariable.FURNITURE_ALPHA_MULTIPLIER, 1); + + this.object.setState(1, 0); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(!(message instanceof ObjectVisibilityUpdateMessage)) return; + + if(this.object) + { + switch(message.type) + { + case ObjectVisibilityUpdateMessage.ENABLED: + this.object.setState(0, 0); + return; + case ObjectVisibilityUpdateMessage.DISABLED: + this.object.setState(1, 0); + return; + } + } + } +} diff --git a/packages/room/src/object/logic/TileCursorLogic.ts b/packages/room/src/object/logic/TileCursorLogic.ts new file mode 100644 index 0000000..165984d --- /dev/null +++ b/packages/room/src/object/logic/TileCursorLogic.ts @@ -0,0 +1,64 @@ +import { IAssetData, RoomObjectVariable } from '@nitrots/api'; +import { ObjectTileCursorUpdateMessage, RoomObjectUpdateMessage } from '../../messages'; +import { RoomObjectLogicBase } from './RoomObjectLogicBase'; + +export class TileCursorLogic extends RoomObjectLogicBase +{ + private static CURSOR_VISIBLE_STATE: number = 0; + private static CURSOR_HIDDEN_STATE: number = 1; + private static CURSOR_HEIGHT_STATE: number = 6; + + private _lastEventId: string; + private _isHidden: boolean; + + constructor() + { + super(); + + this._lastEventId = null; + this._isHidden = false; + } + + public initialize(data: IAssetData): void + { + if(!this.object) return; + + this.object.model.setValue(RoomObjectVariable.FURNITURE_ALPHA_MULTIPLIER, 1); + + this.object.setState(TileCursorLogic.CURSOR_HIDDEN_STATE, 0); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + if(!(message instanceof ObjectTileCursorUpdateMessage)) return; + + if(this._lastEventId && (this._lastEventId === message.sourceEventId)) return; + + if(message.toggleVisibility) this._isHidden = !this._isHidden; + + super.processUpdateMessage(message); + + if(this.object) + { + if(this._isHidden) + { + this.object.setState(TileCursorLogic.CURSOR_HIDDEN_STATE, 0); + } + else + { + if(!message.visible) + { + this.object.setState(TileCursorLogic.CURSOR_HIDDEN_STATE, 0); + } + else + { + this.object.model.setValue(RoomObjectVariable.TILE_CURSOR_HEIGHT, message.height); + + this.object.setState((message.height > 0.8) ? TileCursorLogic.CURSOR_HEIGHT_STATE : TileCursorLogic.CURSOR_VISIBLE_STATE); + } + } + } + + this._lastEventId = message.sourceEventId; + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureAchievementResolutionLogic.ts b/packages/room/src/object/logic/furniture/FurnitureAchievementResolutionLogic.ts new file mode 100644 index 0000000..f541684 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureAchievementResolutionLogic.ts @@ -0,0 +1,71 @@ +import { RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectBadgeAssetEvent, RoomObjectEvent, RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { ObjectGroupBadgeUpdateMessage, ObjectSelectedMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureBadgeDisplayLogic } from './FurnitureBadgeDisplayLogic'; + +export class FurnitureAchievementResolutionLogic extends FurnitureBadgeDisplayLogic +{ + public static STATE_RESOLUTION_NOT_STARTED: number = 0; + public static STATE_RESOLUTION_IN_PROGRESS: number = 1; + public static STATE_RESOLUTION_ACHIEVED: number = 2; + public static STATE_RESOLUTION_FAILED: number = 3; + private static ACH_NOT_SET: string = 'ach_0'; + private static BADGE_VISIBLE_IN_STATE: number = 2; + + public getEventTypes(): string[] + { + const types = [RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_OPEN, RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_ENGRAVING, RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_FAILED, RoomObjectBadgeAssetEvent.LOAD_BADGE]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(message instanceof ObjectGroupBadgeUpdateMessage) + { + if(message.assetName !== 'loading_icon') + { + this.object.model.setValue(RoomObjectVariable.FURNITURE_BADGE_VISIBLE_IN_STATE, FurnitureAchievementResolutionLogic.BADGE_VISIBLE_IN_STATE); + } + } + + if(message instanceof ObjectSelectedMessage) + { + if(!this.eventDispatcher || !this.object) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.CLOSE_FURNI_CONTEXT_MENU, this.object)); + } + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + let event: RoomObjectEvent = null; + + switch(this.object.getState(0)) + { + case FurnitureAchievementResolutionLogic.STATE_RESOLUTION_NOT_STARTED: + case FurnitureAchievementResolutionLogic.STATE_RESOLUTION_IN_PROGRESS: + event = new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_OPEN, this.object); + break; + case FurnitureAchievementResolutionLogic.STATE_RESOLUTION_ACHIEVED: + event = new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_ENGRAVING, this.object); + break; + case FurnitureAchievementResolutionLogic.STATE_RESOLUTION_FAILED: + event = new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.ACHIEVEMENT_RESOLUTION_FAILED, this.object); + break; + } + + if(event) this.eventDispatcher.dispatchEvent(event); + } + + protected updateBadge(badgeId: string): void + { + if(badgeId === FurnitureAchievementResolutionLogic.ACH_NOT_SET) return; + + super.updateBadge(badgeId); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureBadgeDisplayLogic.ts b/packages/room/src/object/logic/furniture/FurnitureBadgeDisplayLogic.ts new file mode 100644 index 0000000..9440268 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureBadgeDisplayLogic.ts @@ -0,0 +1,63 @@ +import { RoomObjectVariable, StringDataType } from '@nitrots/api'; +import { RoomObjectBadgeAssetEvent, RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { GetTickerTime } from '@nitrots/utils'; +import { ObjectDataUpdateMessage, ObjectGroupBadgeUpdateMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureBadgeDisplayLogic extends FurnitureLogic +{ + public getEventTypes(): string[] + { + const types = [RoomObjectWidgetRequestEvent.BADGE_DISPLAY_ENGRAVING, RoomObjectBadgeAssetEvent.LOAD_BADGE]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(!this.object) return; + + if(message instanceof ObjectDataUpdateMessage) + { + const data = message.data; + + if(data instanceof StringDataType) this.updateBadge(data.getValue(1)); + + return; + } + + if(message instanceof ObjectGroupBadgeUpdateMessage) + { + if(message.assetName !== 'loading_icon') + { + this.object.model.setValue(RoomObjectVariable.FURNITURE_BADGE_ASSET_NAME, message.assetName); + this.object.model.setValue(RoomObjectVariable.FURNITURE_BADGE_IMAGE_STATUS, 1); + + this.update(GetTickerTime()); + } + + return; + } + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.BADGE_DISPLAY_ENGRAVING, this.object)); + } + + protected updateBadge(badgeId: string): void + { + if(badgeId === '') return; + + if(this.eventDispatcher) + { + this.object.model.setValue(RoomObjectVariable.FURNITURE_BADGE_IMAGE_STATUS, -1); + + this.eventDispatcher.dispatchEvent(new RoomObjectBadgeAssetEvent(RoomObjectBadgeAssetEvent.LOAD_BADGE, this.object, badgeId, false)); + } + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureChangeStateWhenStepOnLogic.ts b/packages/room/src/object/logic/furniture/FurnitureChangeStateWhenStepOnLogic.ts new file mode 100644 index 0000000..ae776d6 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureChangeStateWhenStepOnLogic.ts @@ -0,0 +1,53 @@ +import { IAssetData, RoomObjectVariable } from '@nitrots/api'; +import { RoomToObjectOwnAvatarMoveEvent } from '@nitrots/events'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureChangeStateWhenStepOnLogic extends FurnitureLogic +{ + constructor() + { + super(); + + this.onRoomToObjectOwnAvatarMoveEvent = this.onRoomToObjectOwnAvatarMoveEvent.bind(this); + } + + public initialize(asset: IAssetData): void + { + super.initialize(asset); + + if(this.eventDispatcher) this.eventDispatcher.addEventListener(RoomToObjectOwnAvatarMoveEvent.ROAME_MOVE_TO, this.onRoomToObjectOwnAvatarMoveEvent); + } + + public tearDown(): void + { + if(this.eventDispatcher) this.eventDispatcher.removeEventListener(RoomToObjectOwnAvatarMoveEvent.ROAME_MOVE_TO, this.onRoomToObjectOwnAvatarMoveEvent); + + super.tearDown(); + } + + private onRoomToObjectOwnAvatarMoveEvent(event: RoomToObjectOwnAvatarMoveEvent): void + { + if(!event || !this.object) return; + + const location = this.object.getLocation(); + const targetLocation = event.targetLocation; + + if(!targetLocation) return; + + let sizeX = this.object.model.getValue(RoomObjectVariable.FURNITURE_SIZE_X); + let sizeY = this.object.model.getValue(RoomObjectVariable.FURNITURE_SIZE_Y); + + const direction = (((Math.floor(this.object.getDirection().x) + 45) % 360) / 90); + + if((direction === 1) || (direction === 3)) [sizeX, sizeY] = [sizeY, sizeX]; + + if(((targetLocation.x >= location.x) && (targetLocation.x < (location.x + sizeX))) && ((targetLocation.y >= location.y) && (targetLocation.y < (location.y + sizeY)))) + { + this.object.setState(1, 0); + } + else + { + this.object.setState(0, 0); + } + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureClothingChangeLogic.ts b/packages/room/src/object/logic/furniture/FurnitureClothingChangeLogic.ts new file mode 100644 index 0000000..6039d53 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureClothingChangeLogic.ts @@ -0,0 +1,47 @@ +import { IAssetData, RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { ObjectDataUpdateMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureClothingChangeLogic extends FurnitureLogic +{ + public getEventTypes(): string[] + { + const types = [RoomObjectWidgetRequestEvent.CLOTHING_CHANGE]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public initialize(asset: IAssetData): void + { + super.initialize(asset); + + const furniData = this.object.model.getValue(RoomObjectVariable.FURNITURE_DATA); + + this.updateClothingData(furniData); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(message instanceof ObjectDataUpdateMessage) message.data && this.updateClothingData(message.data.getLegacyString()); + } + + private updateClothingData(furnitureData: string): void + { + if(!furnitureData || !furnitureData.length) return; + + const [boyClothing, girlClothing] = furnitureData.split(','); + + if(boyClothing && boyClothing.length) this.object.model.setValue(RoomObjectVariable.FURNITURE_CLOTHING_BOY, boyClothing); + if(girlClothing && girlClothing.length) this.object.model.setValue(RoomObjectVariable.FURNITURE_CLOTHING_GIRL, girlClothing); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.CLOTHING_CHANGE, this.object)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureCounterClockLogic.ts b/packages/room/src/object/logic/furniture/FurnitureCounterClockLogic.ts new file mode 100644 index 0000000..b996377 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureCounterClockLogic.ts @@ -0,0 +1,51 @@ +import { IRoomGeometry, MouseEventType } from '@nitrots/api'; +import { RoomObjectEvent, RoomObjectStateChangedEvent, RoomSpriteMouseEvent } from '@nitrots/events'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureCounterClockLogic extends FurnitureLogic +{ + public getEventTypes(): string[] + { + const types = [RoomObjectStateChangedEvent.STATE_CHANGE]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public mouseEvent(event: RoomSpriteMouseEvent, geometry: IRoomGeometry): void + { + if(!event || !geometry || !this.object) return; + + let objectEvent: RoomObjectEvent = null; + + switch(event.type) + { + case MouseEventType.DOUBLE_CLICK: + switch(event.spriteTag) + { + case 'start_stop': + objectEvent = new RoomObjectStateChangedEvent(RoomObjectStateChangedEvent.STATE_CHANGE, this.object, 1); + break; + case 'reset': + objectEvent = new RoomObjectStateChangedEvent(RoomObjectStateChangedEvent.STATE_CHANGE, this.object, 2); + break; + } + + if(this.eventDispatcher && objectEvent) + { + this.eventDispatcher.dispatchEvent(objectEvent); + + return; + } + break; + } + + super.mouseEvent(event, geometry); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectStateChangedEvent(RoomObjectStateChangedEvent.STATE_CHANGE, this.object, 1)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureCrackableLogic.ts b/packages/room/src/object/logic/furniture/FurnitureCrackableLogic.ts new file mode 100644 index 0000000..b6677be --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureCrackableLogic.ts @@ -0,0 +1,18 @@ +import { RoomObjectVariable, RoomWidgetEnumItemExtradataParameter } from '@nitrots/api'; +import { RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureCrackableLogic extends FurnitureLogic +{ + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(!this.object) return; + + if(this.object.model.getValue(RoomObjectVariable.FURNITURE_REAL_ROOM_OBJECT) === 1) + { + this.object.model.setValue(RoomWidgetEnumItemExtradataParameter.INFOSTAND_EXTRA_PARAM, RoomWidgetEnumItemExtradataParameter.CRACKABLE_FURNI); + } + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureCraftingGizmoLogic.ts b/packages/room/src/object/logic/furniture/FurnitureCraftingGizmoLogic.ts new file mode 100644 index 0000000..bc05b93 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureCraftingGizmoLogic.ts @@ -0,0 +1,10 @@ +import { RoomWidgetEnum } from '@nitrots/api'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureCraftingGizmoLogic extends FurnitureLogic +{ + public get widget(): string + { + return RoomWidgetEnum.CRAFTING; + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureCreditLogic.ts b/packages/room/src/object/logic/furniture/FurnitureCreditLogic.ts new file mode 100644 index 0000000..8414fe3 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureCreditLogic.ts @@ -0,0 +1,38 @@ +import { IAssetData, RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureCreditLogic extends FurnitureLogic +{ + public getEventTypes(): string[] + { + const types = [ + RoomObjectWidgetRequestEvent.CREDITFURNI + ]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public initialize(asset: IAssetData): void + { + super.initialize(asset); + + let creditValue = 0; + + if(asset.logic) + { + if(asset.logic.credits && (asset.logic.credits !== '') && (asset.logic.credits.length > 0)) creditValue = parseInt(asset.logic.credits); + } + + this.object.model.setValue(RoomObjectVariable.FURNITURE_CREDIT_VALUE, creditValue); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.CREDITFURNI, this.object)); + + super.useObject(); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureCuckooClockLogic.ts b/packages/room/src/object/logic/furniture/FurnitureCuckooClockLogic.ts new file mode 100644 index 0000000..45f1f62 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureCuckooClockLogic.ts @@ -0,0 +1,37 @@ +import { RoomObjectPlaySoundIdEvent } from '@nitrots/events'; +import { ObjectDataUpdateMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurnitureCuckooClockLogic extends FurnitureMultiStateLogic +{ + private _state: number = 1; + + public getEventTypes(): string[] + { + const types = [RoomObjectPlaySoundIdEvent.PLAY_SOUND_AT_PITCH]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(message instanceof ObjectDataUpdateMessage) + { + if((this._state !== -1) && (message.state !== this._state)) + { + this.dispatchSoundEvent(this.object.location.z); + } + + this._state = message.state; + } + } + + private dispatchSoundEvent(height: number): void + { + const pitch = Math.pow(2, (height - 1.2)); + + this.eventDispatcher.dispatchEvent(new RoomObjectPlaySoundIdEvent(RoomObjectPlaySoundIdEvent.PLAY_SOUND_AT_PITCH, this.object, 'FURNITURE_cuckoo_clock', pitch)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureCustomStackHeightLogic.ts b/packages/room/src/object/logic/furniture/FurnitureCustomStackHeightLogic.ts new file mode 100644 index 0000000..cdf44af --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureCustomStackHeightLogic.ts @@ -0,0 +1,31 @@ +import { IAssetData, RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurnitureCustomStackHeightLogic extends FurnitureMultiStateLogic +{ + public getEventTypes(): string[] + { + const types = [ + RoomObjectWidgetRequestEvent.STACK_HEIGHT + ]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public initialize(asset: IAssetData): void + { + super.initialize(asset); + + if(this.object && this.object.model) this.object.model.setValue(RoomObjectVariable.FURNITURE_ALWAYS_STACKABLE, 1); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.STACK_HEIGHT, this.object)); + + super.useObject(); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureDiceLogic.ts b/packages/room/src/object/logic/furniture/FurnitureDiceLogic.ts new file mode 100644 index 0000000..281238c --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureDiceLogic.ts @@ -0,0 +1,69 @@ +import { IRoomGeometry, MouseEventType } from '@nitrots/api'; +import { RoomObjectEvent, RoomObjectFurnitureActionEvent, RoomSpriteMouseEvent } from '@nitrots/events'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureDiceLogic extends FurnitureLogic +{ + private _noTags: boolean; + private _noTagsLastStateActivate: boolean; + + constructor() + { + super(); + + this._noTags = false; + this._noTagsLastStateActivate = false; + } + + public getEventTypes(): string[] + { + const types = [RoomObjectFurnitureActionEvent.DICE_ACTIVATE, RoomObjectFurnitureActionEvent.DICE_OFF]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public mouseEvent(event: RoomSpriteMouseEvent, geometry: IRoomGeometry): void + { + if(!event || !geometry || !this.object) return; + + let objectEvent: RoomObjectEvent = null; + + switch(event.type) + { + case MouseEventType.DOUBLE_CLICK: + if(this._noTags) + { + if(((!(this._noTagsLastStateActivate)) || (this.object.getState(0) === 0)) || (this.object.getState(0) === 100)) + { + objectEvent = new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.DICE_ACTIVATE, this.object); + + this._noTagsLastStateActivate = true; + } + else + { + objectEvent = new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.DICE_OFF, this.object); + + this._noTagsLastStateActivate = false; + } + } + else + { + if(((event.spriteTag === 'activate') || (this.object.getState(0) === 0)) || (this.object.getState(0) === 100)) + { + objectEvent = new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.DICE_ACTIVATE, this.object); + } + + else if(event.spriteTag === 'deactivate') + { + objectEvent = new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.DICE_OFF, this.object); + } + } + + if(objectEvent && this.eventDispatcher) this.eventDispatcher.dispatchEvent(objectEvent); + + return; + } + + super.mouseEvent(event, geometry); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureEcotronBoxLogic.ts b/packages/room/src/object/logic/furniture/FurnitureEcotronBoxLogic.ts new file mode 100644 index 0000000..6dd5ea1 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureEcotronBoxLogic.ts @@ -0,0 +1,21 @@ +import { RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureEcotronBoxLogic extends FurnitureLogic +{ + public getEventTypes(): string[] + { + const types = [ + RoomObjectWidgetRequestEvent.ECOTRONBOX + ]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.ECOTRONBOX, this.object)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureEditableInternalLinkLogic.ts b/packages/room/src/object/logic/furniture/FurnitureEditableInternalLinkLogic.ts new file mode 100644 index 0000000..58fb2e2 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureEditableInternalLinkLogic.ts @@ -0,0 +1,82 @@ +import { IAssetData, IRoomGeometry, MouseEventType, RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectWidgetRequestEvent, RoomSpriteMouseEvent } from '@nitrots/events'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureEditableInternalLinkLogic extends FurnitureLogic +{ + private _showStateOnceRendered: boolean; + private _updateCount: number; + + constructor() + { + super(); + + this._showStateOnceRendered = false; + this._updateCount = 0; + } + + public getEventTypes(): string[] + { + const types = [RoomObjectWidgetRequestEvent.INERNAL_LINK]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public initialize(asset: IAssetData): void + { + super.initialize(asset); + + if(asset.logic) + { + if(asset.logic.action) + { + if(asset.logic.action.startState === 1) this._showStateOnceRendered = true; + } + } + } + + public update(time: number): void + { + super.update(time); + + if(!this._showStateOnceRendered) return; + + this._updateCount++; + + if(this._showStateOnceRendered && (this._updateCount > 20)) + { + this.setAutomaticStateIndex(1); + + this._showStateOnceRendered = false; + } + } + + private setAutomaticStateIndex(state: number): void + { + if(!this.object) return; + + if(this.object.model) + { + this.object.model.setValue(RoomObjectVariable.FURNITURE_AUTOMATIC_STATE_INDEX, state); + } + } + + public mouseEvent(event: RoomSpriteMouseEvent, geometry: IRoomGeometry): void + { + if(!event || !geometry) return; + + if(event.type === MouseEventType.DOUBLE_CLICK) + { + this.setAutomaticStateIndex(0); + } + + super.mouseEvent(event, geometry); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.INERNAL_LINK, this.object)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureEditableRoomLinkLogic.ts b/packages/room/src/object/logic/furniture/FurnitureEditableRoomLinkLogic.ts new file mode 100644 index 0000000..1b3c67e --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureEditableRoomLinkLogic.ts @@ -0,0 +1,76 @@ +import { IAssetData, RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureEditableRoomLinkLogic extends FurnitureLogic +{ + private _timer: any; + + public getEventTypes(): string[] + { + const types = [RoomObjectWidgetRequestEvent.ROOM_LINK]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public initialize(asset: IAssetData): void + { + super.initialize(asset); + + if(asset.logic) + { + if(asset.logic.action) + { + if(asset.logic.action.link && (asset.logic.action.link !== '') && (asset.logic.action.link.length > 0)) + { + (this.object && this.object.model && this.object.model.setValue(RoomObjectVariable.FURNITURE_INTERNAL_LINK, asset.logic.action.link)); + } + } + } + } + + public dispose(): void + { + if(this._timer) + { + clearTimeout(this._timer); + + this._timer = null; + } + + super.dispose(); + } + + private setAutomaticStateIndex(state: number): void + { + if(!this.object) return; + + if(this.object.model) + { + this.object.model.setValue(RoomObjectVariable.FURNITURE_AUTOMATIC_STATE_INDEX, state); + } + } + + public useObject(): void + { + this.setAutomaticStateIndex(1); + + if(this._timer) + { + clearTimeout(this._timer); + + this._timer = null; + } + + this._timer = setTimeout(() => + { + this.setAutomaticStateIndex(0); + + this._timer = null; + }, 2500); + + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.ROOM_LINK, this.object)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureEffectBoxLogic.ts b/packages/room/src/object/logic/furniture/FurnitureEffectBoxLogic.ts new file mode 100644 index 0000000..512a33e --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureEffectBoxLogic.ts @@ -0,0 +1,27 @@ +import { ContextMenuEnum } from '@nitrots/api'; +import { RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureEffectBoxLogic extends FurnitureLogic +{ + private _timer: any; + + public getEventTypes(): string[] + { + const types = [RoomObjectWidgetRequestEvent.EFFECTBOX_OPEN_DIALOG]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.EFFECTBOX_OPEN_DIALOG, this.object)); + } + + public get contextMenu(): string + { + return ContextMenuEnum.EFFECT_BOX; + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureExternalImageLogic.ts b/packages/room/src/object/logic/furniture/FurnitureExternalImageLogic.ts new file mode 100644 index 0000000..b93c557 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureExternalImageLogic.ts @@ -0,0 +1,44 @@ +import { IAssetData, RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurnitureExternalImageLogic extends FurnitureMultiStateLogic +{ + public getEventTypes(): string[] + { + const types = [ + RoomObjectWidgetRequestEvent.EXTERNAL_IMAGE + ]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public initialize(asset: IAssetData): void + { + super.initialize(asset); + + if(!asset) return; + + if(this.object && this.object.model) + { + let maskType = ''; + + if(asset.logic) + { + if(asset.logic.maskType && (asset.logic.maskType !== '') && (asset.logic.maskType.length > 0)) maskType = asset.logic.maskType; + } + + this.object.model.setValue(RoomObjectVariable.FURNITURE_USES_PLANE_MASK, 0); + this.object.model.setValue(RoomObjectVariable.FURNITURE_PLANE_MASK_TYPE, maskType); + } + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.EXTERNAL_IMAGE, this.object)); + + super.useObject(); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureFireworksLogic.ts b/packages/room/src/object/logic/furniture/FurnitureFireworksLogic.ts new file mode 100644 index 0000000..8ca82e3 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureFireworksLogic.ts @@ -0,0 +1,64 @@ +import { IAssetData, IParticleSystem, IRoomGeometry, MouseEventType, RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectEvent, RoomObjectStateChangedEvent, RoomSpriteMouseEvent } from '@nitrots/events'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureFireworksLogic extends FurnitureLogic +{ + public getEventTypes(): string[] + { + const types = [RoomObjectStateChangedEvent.STATE_CHANGE]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public initialize(asset: IAssetData): void + { + super.initialize(asset); + + if(asset.logic) + { + if(asset.logic.particleSystems && asset.logic.particleSystems.length) + { + this.object.model.setValue(RoomObjectVariable.FURNITURE_FIREWORKS_DATA, asset.logic.particleSystems); + } + } + } + + public mouseEvent(event: RoomSpriteMouseEvent, geometry: IRoomGeometry): void + { + if(!event || !geometry || !this.object) return; + + let objectEvent: RoomObjectEvent = null; + + switch(event.type) + { + case MouseEventType.DOUBLE_CLICK: + switch(event.spriteTag) + { + case 'start_stop': + objectEvent = new RoomObjectStateChangedEvent(RoomObjectStateChangedEvent.STATE_CHANGE, this.object, 1); + break; + case 'reset': + objectEvent = new RoomObjectStateChangedEvent(RoomObjectStateChangedEvent.STATE_CHANGE, this.object, 2); + break; + } + + if(this.eventDispatcher && objectEvent) + { + this.eventDispatcher.dispatchEvent(objectEvent); + + return; + } + break; + } + + super.mouseEvent(event, geometry); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectStateChangedEvent(RoomObjectStateChangedEvent.STATE_CHANGE, this.object, 0)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureFloorHoleLogic.ts b/packages/room/src/object/logic/furniture/FurnitureFloorHoleLogic.ts new file mode 100644 index 0000000..0df04c2 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureFloorHoleLogic.ts @@ -0,0 +1,109 @@ +import { RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectFloorHoleEvent } from '@nitrots/events'; +import { Vector3d } from '@nitrots/utils'; +import { ObjectDataUpdateMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurnitureFloorHoleLogic extends FurnitureMultiStateLogic +{ + private static STATE_HOLE: number = 0; + + private _currentState: number; + private _currentLocation: Vector3d; + + constructor() + { + super(); + + this._currentState = -1; + this._currentLocation = null; + } + + public getEventTypes(): string[] + { + const types = [RoomObjectFloorHoleEvent.ADD_HOLE, RoomObjectFloorHoleEvent.REMOVE_HOLE]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public dispose(): void + { + if(this._currentState === FurnitureFloorHoleLogic.STATE_HOLE) + { + this.eventDispatcher.dispatchEvent(new RoomObjectFloorHoleEvent(RoomObjectFloorHoleEvent.REMOVE_HOLE, this.object)); + } + + super.dispose(); + } + + public update(time: number): void + { + super.update(time); + + this.handleAutomaticStateUpdate(); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(!this.object) return; + + if(message instanceof ObjectDataUpdateMessage) + { + this.handleStateUpdate(this.object.getState(0)); + } + + const location = this.object.getLocation(); + + if(!this._currentLocation) + { + this._currentLocation = new Vector3d(); + } + else + { + if((location.x !== this._currentLocation.x) || (location.y !== this._currentLocation.y)) + { + if(this._currentState === FurnitureFloorHoleLogic.STATE_HOLE) + { + if(this.eventDispatcher) this.eventDispatcher.dispatchEvent(new RoomObjectFloorHoleEvent(RoomObjectFloorHoleEvent.ADD_HOLE, this.object)); + } + } + } + + this._currentLocation.assign(location); + } + + private handleStateUpdate(state: number): void + { + if(state === this._currentState) return; + + if(this.eventDispatcher) + { + if(state === FurnitureFloorHoleLogic.STATE_HOLE) + { + this.eventDispatcher.dispatchEvent(new RoomObjectFloorHoleEvent(RoomObjectFloorHoleEvent.ADD_HOLE, this.object)); + } + + else if(this._currentState === FurnitureFloorHoleLogic.STATE_HOLE) + { + this.eventDispatcher.dispatchEvent(new RoomObjectFloorHoleEvent(RoomObjectFloorHoleEvent.REMOVE_HOLE, this.object)); + } + } + + this._currentState = state; + } + + private handleAutomaticStateUpdate(): void + { + if(!this.object) return; + + const model = this.object.model; + + if(!model) return; + + const stateIndex = model.getValue(RoomObjectVariable.FURNITURE_AUTOMATIC_STATE_INDEX); + + if(!isNaN(stateIndex)) this.handleStateUpdate((stateIndex % 2)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureFriendFurniLogic.ts b/packages/room/src/object/logic/furniture/FurnitureFriendFurniLogic.ts new file mode 100644 index 0000000..2acd5c9 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureFriendFurniLogic.ts @@ -0,0 +1,70 @@ +import { ContextMenuEnum, IAssetData, RoomObjectVariable, StringDataType } from '@nitrots/api'; +import { RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { ObjectDataUpdateMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurnitureFriendFurniLogic extends FurnitureMultiStateLogic +{ + private static readonly STATE_UNINITIALIZED: number = -1; + private static readonly STATE_UNLOCKED: number = 0; + private static readonly STATE_LOCKED: number = 1; + + private _state: number = -1; + + public initialize(asset: IAssetData): void + { + super.initialize(asset); + + if(this.object) this.object.model.setValue(RoomObjectVariable.FURNITURE_FRIENDFURNI_ENGRAVING, this.engravingDialogType); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + if(message instanceof ObjectDataUpdateMessage) + { + const data = (message.data as StringDataType); + + if(data) + { + this._state = data.state; + } + else + { + this._state = message.state; + } + } + + super.processUpdateMessage(message); + } + + public getEventTypes(): string[] + { + const types = [RoomObjectWidgetRequestEvent.FRIEND_FURNITURE_ENGRAVING]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + if(this._state === FurnitureFriendFurniLogic.STATE_LOCKED) + { + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.FRIEND_FURNITURE_ENGRAVING, this.object)); + } + else + { + super.useObject(); + } + } + + public get engravingDialogType(): number + { + return 0; + } + + public get contextMenu(): string + { + return ((this._state === FurnitureFriendFurniLogic.STATE_UNLOCKED) ? ContextMenuEnum.FRIEND_FURNITURE : ContextMenuEnum.DUMMY); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureGroupForumTerminalLogic.ts b/packages/room/src/object/logic/furniture/FurnitureGroupForumTerminalLogic.ts new file mode 100644 index 0000000..1cd55f4 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureGroupForumTerminalLogic.ts @@ -0,0 +1,31 @@ +import { RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { FurnitureGuildCustomizedLogic } from './FurnitureGuildCustomizedLogic'; + +export class FurnitureGroupForumTerminalLogic extends FurnitureGuildCustomizedLogic +{ + public getEventTypes(): string[] + { + const types = [ + RoomObjectWidgetRequestEvent.INERNAL_LINK + ]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + protected updateGroupId(id: string): void + { + super.updateGroupId(id); + + this.object.model.setValue(RoomObjectVariable.FURNITURE_INTERNAL_LINK, `groupforum/${id}`); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.INERNAL_LINK, this.object)); + + super.useObject(); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureGuildCustomizedLogic.ts b/packages/room/src/object/logic/furniture/FurnitureGuildCustomizedLogic.ts new file mode 100644 index 0000000..92628df --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureGuildCustomizedLogic.ts @@ -0,0 +1,93 @@ +import { IRoomGeometry, MouseEventType, RoomObjectVariable, StringDataType } from '@nitrots/api'; +import { RoomObjectBadgeAssetEvent, RoomObjectWidgetRequestEvent, RoomSpriteMouseEvent } from '@nitrots/events'; +import { GetTickerTime } from '@nitrots/utils'; +import { ObjectDataUpdateMessage, ObjectGroupBadgeUpdateMessage, ObjectSelectedMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurnitureGuildCustomizedLogic extends FurnitureMultiStateLogic +{ + public static GROUPID_KEY: number = 1; + public static BADGE_KEY: number = 2; + public static COLOR1_KEY: number = 3; + public static COLOR2_KEY: number = 4; + + public getEventTypes(): string[] + { + const types = [ + RoomObjectBadgeAssetEvent.LOAD_BADGE, + RoomObjectWidgetRequestEvent.GUILD_FURNI_CONTEXT_MENU, + RoomObjectWidgetRequestEvent.CLOSE_FURNI_CONTEXT_MENU + ]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(message instanceof ObjectDataUpdateMessage) + { + const data = message.data; + + if(data instanceof StringDataType) + { + this.updateGroupId(data.getValue(FurnitureGuildCustomizedLogic.GROUPID_KEY)); + this.updateBadge(data.getValue(FurnitureGuildCustomizedLogic.BADGE_KEY)); + this.updateColors(data.getValue(FurnitureGuildCustomizedLogic.COLOR1_KEY), data.getValue(FurnitureGuildCustomizedLogic.COLOR2_KEY)); + } + } + + else if(message instanceof ObjectGroupBadgeUpdateMessage) + { + if(message.assetName !== 'loading_icon') + { + this.object.model.setValue(RoomObjectVariable.FURNITURE_GUILD_CUSTOMIZED_ASSET_NAME, message.assetName); + + this.update(GetTickerTime()); + } + } + + else if(message instanceof ObjectSelectedMessage) + { + if(!message.selected) + { + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.CLOSE_FURNI_CONTEXT_MENU, this.object)); + } + } + } + + protected updateGroupId(id: string): void + { + this.object.model.setValue(RoomObjectVariable.FURNITURE_GUILD_CUSTOMIZED_GUILD_ID, parseInt(id)); + } + + private updateBadge(badge: string): void + { + this.eventDispatcher.dispatchEvent(new RoomObjectBadgeAssetEvent(RoomObjectBadgeAssetEvent.LOAD_BADGE, this.object, badge, true)); + } + + public updateColors(color1: string, color2: string): void + { + this.object.model.setValue(RoomObjectVariable.FURNITURE_GUILD_CUSTOMIZED_COLOR_1, parseInt(color1, 16)); + this.object.model.setValue(RoomObjectVariable.FURNITURE_GUILD_CUSTOMIZED_COLOR_2, parseInt(color2, 16)); + } + + public mouseEvent(event: RoomSpriteMouseEvent, geometry: IRoomGeometry): void + { + if(!event || !geometry || !this.object) return; + + switch(event.type) + { + case MouseEventType.MOUSE_CLICK: + this.openContextMenu(); + } + + super.mouseEvent(event, geometry); + } + + private openContextMenu(): void + { + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.GUILD_FURNI_CONTEXT_MENU, this.object)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureHabboWheelLogic.ts b/packages/room/src/object/logic/furniture/FurnitureHabboWheelLogic.ts new file mode 100644 index 0000000..6395481 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureHabboWheelLogic.ts @@ -0,0 +1,19 @@ +import { RoomObjectFurnitureActionEvent } from '@nitrots/events'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureHabboWheelLogic extends FurnitureLogic +{ + public getEventTypes(): string[] + { + const types = [RoomObjectFurnitureActionEvent.USE_HABBOWHEEL]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.USE_HABBOWHEEL, this.object)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureHighScoreLogic.ts b/packages/room/src/object/logic/furniture/FurnitureHighScoreLogic.ts new file mode 100644 index 0000000..f56f55f --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureHighScoreLogic.ts @@ -0,0 +1,47 @@ +import { RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { ObjectDataUpdateMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureHighScoreLogic extends FurnitureLogic +{ + private static SHOW_WIDGET_IN_STATE = 1; + + private _state = -1; + + public getEventTypes(): string[] + { + return [RoomObjectWidgetRequestEvent.HIGH_SCORE_DISPLAY, RoomObjectWidgetRequestEvent.HIDE_HIGH_SCORE_DISPLAY]; + } + + public tearDown(): void + { + if(this.object.model.getValue(RoomObjectVariable.FURNITURE_REAL_ROOM_OBJECT) === 1) + { + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.HIDE_HIGH_SCORE_DISPLAY, this.object)); + } + + super.tearDown(); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(this.object.model.getValue(RoomObjectVariable.FURNITURE_REAL_ROOM_OBJECT) !== 1) return; + + if(message instanceof ObjectDataUpdateMessage) + { + if(message.state === FurnitureHighScoreLogic.SHOW_WIDGET_IN_STATE) + { + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.HIGH_SCORE_DISPLAY, this.object)); + } + else + { + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.HIDE_HIGH_SCORE_DISPLAY, this.object)); + } + + this._state = message.state; + } + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureHockeyScoreLogic.ts b/packages/room/src/object/logic/furniture/FurnitureHockeyScoreLogic.ts new file mode 100644 index 0000000..ac19ab1 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureHockeyScoreLogic.ts @@ -0,0 +1,59 @@ +import { IRoomGeometry, MouseEventType } from '@nitrots/api'; +import { RoomObjectEvent, RoomObjectStateChangedEvent, RoomSpriteMouseEvent } from '@nitrots/events'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureHockeyScoreLogic extends FurnitureLogic +{ + public getEventTypes(): string[] + { + const types = [RoomObjectStateChangedEvent.STATE_CHANGE]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public mouseEvent(event: RoomSpriteMouseEvent, geometry: IRoomGeometry): void + { + if(!event || !geometry || !this.object) return; + + let objectEvent: RoomObjectEvent = null; + + switch(event.type) + { + case MouseEventType.DOUBLE_CLICK: + switch(event.spriteTag) + { + case 'off': + objectEvent = new RoomObjectStateChangedEvent(RoomObjectStateChangedEvent.STATE_CHANGE, this.object, 3); + break; + } + break; + case MouseEventType.MOUSE_CLICK: + switch(event.spriteTag) + { + case 'inc': + objectEvent = new RoomObjectStateChangedEvent(RoomObjectStateChangedEvent.STATE_CHANGE, this.object, 2); + break; + case 'dec': + objectEvent = new RoomObjectStateChangedEvent(RoomObjectStateChangedEvent.STATE_CHANGE, this.object, 1); + break; + } + break; + } + + if(this.eventDispatcher && objectEvent) + { + this.eventDispatcher.dispatchEvent(objectEvent); + + return; + } + + super.mouseEvent(event, geometry); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectStateChangedEvent(RoomObjectStateChangedEvent.STATE_CHANGE, this.object, 3)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureHweenLovelockLogic.ts b/packages/room/src/object/logic/furniture/FurnitureHweenLovelockLogic.ts new file mode 100644 index 0000000..c33af14 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureHweenLovelockLogic.ts @@ -0,0 +1,10 @@ +import { FriendFurniEngravingWidgetType } from '@nitrots/api'; +import { FurnitureFriendFurniLogic } from './FurnitureFriendFurniLogic'; + +export class FurnitureHweenLovelockLogic extends FurnitureFriendFurniLogic +{ + public get engravingDialogType(): number + { + return FriendFurniEngravingWidgetType.HABBOWEEN; + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureIceStormLogic.ts b/packages/room/src/object/logic/furniture/FurnitureIceStormLogic.ts new file mode 100644 index 0000000..3f81d5c --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureIceStormLogic.ts @@ -0,0 +1,71 @@ +import { LegacyDataType } from '@nitrots/api'; +import { ObjectDataUpdateMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurnitureIceStormLogic extends FurnitureMultiStateLogic +{ + private _nextState: number; + private _nextStateExtra: number; + private _nextStateTimestamp: number; + + constructor() + { + super(); + + this._nextState = 0; + this._nextStateTimestamp = 0; + } + + public update(totalTimeRunning: number): void + { + if((this._nextStateTimestamp > 0) && (totalTimeRunning >= this._nextStateTimestamp)) + { + this._nextStateTimestamp = 0; + + const data = new LegacyDataType(); + + data.setString(this._nextState.toString()); + + super.processUpdateMessage(new ObjectDataUpdateMessage(this._nextState, data, this._nextStateExtra)); + } + + super.update(totalTimeRunning); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + if(message instanceof ObjectDataUpdateMessage) + { + this.processUpdate(message); + + return; + } + + super.processUpdateMessage(message); + } + + private processUpdate(message: ObjectDataUpdateMessage): void + { + if(!message) return; + + const state = ~~(message.state / 1000); + const time = ~~(message.state % 1000); + + if(!time) + { + this._nextStateTimestamp = 0; + + const data = new LegacyDataType(); + + data.setString(state.toString()); + + super.processUpdateMessage(new ObjectDataUpdateMessage(state, data, message.extra)); + } + else + { + this._nextState = state; + this._nextStateExtra = message.extra; + this._nextStateTimestamp = this.time + time; + } + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureInternalLinkLogic.ts b/packages/room/src/object/logic/furniture/FurnitureInternalLinkLogic.ts new file mode 100644 index 0000000..b1652ae --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureInternalLinkLogic.ts @@ -0,0 +1,78 @@ +import { IAssetData, IRoomGeometry, MouseEventType, RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectWidgetRequestEvent, RoomSpriteMouseEvent } from '@nitrots/events'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureInternalLinkLogic extends FurnitureLogic +{ + private _showStateOnceRendered: boolean = false; + private _updateCount: number = 0; + + public getEventTypes(): string[] + { + const types = [ + RoomObjectWidgetRequestEvent.INERNAL_LINK + ]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public initialize(asset: IAssetData): void + { + super.initialize(asset); + + if(asset.logic) + { + if(asset.logic.action) + { + this.object.model.setValue(RoomObjectVariable.FURNITURE_INTERNAL_LINK, asset.logic.action.link); + + if(asset.logic.action.startState === 1) this._showStateOnceRendered = true; + } + } + } + + public update(time: number): void + { + super.update(time); + + if(!this._showStateOnceRendered) return; + + this._updateCount++; + + if(this._showStateOnceRendered && (this._updateCount === 20)) + { + this.setAutomaticStateIndex(1); + + this._showStateOnceRendered = false; + } + } + + private setAutomaticStateIndex(state: number): void + { + if(!this.object) return; + + if(this.object.model) + { + this.object.model.setValue(RoomObjectVariable.FURNITURE_AUTOMATIC_STATE_INDEX, state); + } + } + + public mouseEvent(event: RoomSpriteMouseEvent, geometry: IRoomGeometry): void + { + if(!event || !geometry) return; + + if((event.type === MouseEventType.DOUBLE_CLICK) && this._showStateOnceRendered) + { + this.setAutomaticStateIndex(0); + } + + super.mouseEvent(event, geometry); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.INERNAL_LINK, this.object)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureJukeboxLogic.ts b/packages/room/src/object/logic/furniture/FurnitureJukeboxLogic.ts new file mode 100644 index 0000000..61133c1 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureJukeboxLogic.ts @@ -0,0 +1,97 @@ +import { RoomObjectVariable, RoomWidgetEnumItemExtradataParameter } from '@nitrots/api'; +import { RoomObjectFurnitureActionEvent, RoomObjectStateChangedEvent, RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { ObjectDataUpdateMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurnitureJukeboxLogic extends FurnitureMultiStateLogic +{ + private _disposeEventsAllowed: boolean = false; + private _isInitialized: boolean = false; + private _currentState: number = -1; + + public getEventTypes(): string[] + { + const types = [ + RoomObjectFurnitureActionEvent.JUKEBOX_START, + RoomObjectFurnitureActionEvent.JUKEBOX_MACHINE_STOP, + RoomObjectFurnitureActionEvent.JUKEBOX_DISPOSE, + RoomObjectFurnitureActionEvent.JUKEBOX_INIT, + RoomObjectWidgetRequestEvent.JUKEBOX_PLAYLIST_EDITOR + ]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public dispose(): void + { + this.requestDispose(); + + super.dispose(); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(this.object.model.getValue(RoomObjectVariable.FURNITURE_REAL_ROOM_OBJECT) !== 1) return; + + if(!this._isInitialized) this.requestInit(); + + this.object.model.setValue(RoomWidgetEnumItemExtradataParameter.INFOSTAND_EXTRA_PARAM, RoomWidgetEnumItemExtradataParameter.JUKEBOX); + + if(message instanceof ObjectDataUpdateMessage) + { + const state = this.object.getState(0); + + if(state !== this._currentState) + { + this._currentState = state; + + if(state === 1) this.requestPlayList(); + else if(state === 0) this.requestStopPlaying(); + } + } + } + + private requestInit(): void + { + if(!this.object || !this.eventDispatcher) return; + + this._disposeEventsAllowed = true; + + this.eventDispatcher.dispatchEvent(new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.JUKEBOX_INIT, this.object)); + + this._isInitialized = true; + } + + private requestPlayList(): void + { + if(!this.object || !this.eventDispatcher) return; + + this._disposeEventsAllowed = true; + + this.eventDispatcher.dispatchEvent(new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.JUKEBOX_START, this.object)); + } + + private requestStopPlaying(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.JUKEBOX_MACHINE_STOP, this.object)); + } + + private requestDispose(): void + { + if(!this._disposeEventsAllowed || !this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.JUKEBOX_DISPOSE, this.object)); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.JUKEBOX_PLAYLIST_EDITOR, this.object)); + this.eventDispatcher.dispatchEvent(new RoomObjectStateChangedEvent(RoomObjectStateChangedEvent.STATE_CHANGE, this.object, -1)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureLogic.ts b/packages/room/src/object/logic/furniture/FurnitureLogic.ts new file mode 100644 index 0000000..c2d8f46 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureLogic.ts @@ -0,0 +1,424 @@ +import { IAssetData, IRoomGeometry, IRoomObjectController, IRoomObjectModel, IVector3D, MouseEventType, RoomObjectVariable } from '@nitrots/api'; +import { GetConfiguration } from '@nitrots/configuration'; +import { RoomObjectMouseEvent, RoomObjectRoomAdEvent, RoomObjectStateChangedEvent, RoomObjectWidgetRequestEvent, RoomSpriteMouseEvent } from '@nitrots/events'; +import { Vector3d } from '@nitrots/utils'; +import { ObjectDataUpdateMessage, ObjectHeightUpdateMessage, ObjectItemDataUpdateMessage, ObjectMoveUpdateMessage, ObjectSelectedMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { MovingObjectLogic } from '../MovingObjectLogic'; + +export class FurnitureLogic extends MovingObjectLogic +{ + private static BOUNCING_STEPS: number = -1; + private static BOUNCING_Z: number = -1; + + private _sizeX: number; + private _sizeY: number; + private _sizeZ: number; + private _centerX: number; + private _centerY: number; + private _centerZ: number; + + private _directions: number[]; + + private _mouseOver: boolean; + + private _locationOffset: IVector3D; + private _bouncingStep: number; + private _storedRotateMessage: RoomObjectUpdateMessage; + private _directionInitialized: boolean; + + constructor() + { + super(); + + this._sizeX = 0; + this._sizeY = 0; + this._sizeZ = 0; + this._centerX = 0; + this._centerY = 0; + this._centerZ = 0; + + this._directions = []; + + this._mouseOver = false; + + this._locationOffset = new Vector3d(); + this._bouncingStep = 0; + this._storedRotateMessage = null; + this._directionInitialized = false; + + if(FurnitureLogic.BOUNCING_STEPS === -1) + { + FurnitureLogic.BOUNCING_STEPS = GetConfiguration().getValue('furni.rotation.bounce.steps', 8); + } + + if(FurnitureLogic.BOUNCING_Z === -1) + { + FurnitureLogic.BOUNCING_Z = GetConfiguration().getValue('furni.rotation.bounce.height', 0.0625); + } + } + + public getEventTypes(): string[] + { + const types = [ + RoomObjectStateChangedEvent.STATE_CHANGE, + RoomObjectMouseEvent.CLICK, + RoomObjectMouseEvent.MOUSE_DOWN, + RoomObjectMouseEvent.MOUSE_DOWN_LONG, + RoomObjectRoomAdEvent.ROOM_AD_TOOLTIP_SHOW, + RoomObjectRoomAdEvent.ROOM_AD_TOOLTIP_HIDE, + RoomObjectRoomAdEvent.ROOM_AD_FURNI_DOUBLE_CLICK, + RoomObjectRoomAdEvent.ROOM_AD_FURNI_CLICK]; + + if(this.widget) types.push(RoomObjectWidgetRequestEvent.OPEN_WIDGET, RoomObjectWidgetRequestEvent.CLOSE_WIDGET); + + if(this.contextMenu) types.push(RoomObjectWidgetRequestEvent.OPEN_FURNI_CONTEXT_MENU, RoomObjectWidgetRequestEvent.CLOSE_FURNI_CONTEXT_MENU); + + return this.mergeTypes(super.getEventTypes(), types); + } + + public initialize(asset: IAssetData): void + { + if(!asset) return; + + const model = this.object && this.object.model; + + if(!model) return; + + if(asset.logic) + { + if(asset.logic.model) + { + const dimensions = asset.logic.model.dimensions; + + if(dimensions) + { + this._sizeX = dimensions.x; + this._sizeY = dimensions.y; + this._sizeZ = dimensions.z; + + this._centerX = (this._sizeX / 2); + this._centerY = (this._sizeY / 2); + this._centerZ = (this._sizeZ / 2); + } + + const directions = asset.logic.model.directions; + + if(directions && directions.length) + { + for(const direction of directions) this._directions.push(direction); + + this._directions.sort((a, b) => (a - b)); + } + } + + if(asset.logic.customVars) + { + const variables = asset.logic.customVars.variables; + + if(variables && variables.length) + { + model.setValue(RoomObjectVariable.FURNITURE_CUSTOM_VARIABLES, variables); + } + } + } + + model.setValue(RoomObjectVariable.FURNITURE_SIZE_X, this._sizeX); + model.setValue(RoomObjectVariable.FURNITURE_SIZE_Y, this._sizeY); + model.setValue(RoomObjectVariable.FURNITURE_SIZE_Z, this._sizeZ); + model.setValue(RoomObjectVariable.FURNITURE_CENTER_X, this._centerX); + model.setValue(RoomObjectVariable.FURNITURE_CENTER_Y, this._centerY); + model.setValue(RoomObjectVariable.FURNITURE_CENTER_Z, this._centerZ); + model.setValue(RoomObjectVariable.FURNITURE_ALLOWED_DIRECTIONS, this._directions); + model.setValue(RoomObjectVariable.FURNITURE_ALPHA_MULTIPLIER, 1); + } + + public dispose(): void + { + this._storedRotateMessage = null; + this._directions = null; + + super.dispose(); + } + + public setObject(object: IRoomObjectController): void + { + super.setObject(object); + + if(object && object.getLocation().length) this._directionInitialized = true; + } + + protected getAdClickUrl(model: IRoomObjectModel): string + { + return model.getValue(RoomObjectVariable.FURNITURE_AD_URL); + } + + protected handleAdClick(objectId: number, objectType: string, clickUrl: string): void + { + if(!this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectRoomAdEvent(RoomObjectRoomAdEvent.ROOM_AD_FURNI_CLICK, this.object)); + } + + public update(time: number): void + { + super.update(time); + + if(this._bouncingStep > 0) + { + this._bouncingStep++; + + if(this._bouncingStep > FurnitureLogic.BOUNCING_STEPS) this._bouncingStep = 0; + } + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + if(message instanceof ObjectDataUpdateMessage) + { + this.processDataUpdateMessage(message); + + return; + } + + if(message instanceof ObjectHeightUpdateMessage) + { + this.processObjectHeightUpdateMessage(message); + + return; + } + + if(message instanceof ObjectItemDataUpdateMessage) + { + this.processItemDataUpdateMessage(message); + + return; + } + + this._mouseOver = false; + + if(message.location && message.direction) + { + if(!(message instanceof ObjectMoveUpdateMessage)) + { + const direction = this.object.getDirection(); + const location = this.object.getLocation(); + + if((direction.x !== message.direction.x) && this._directionInitialized) + { + if((location.x === message.location.x) && (location.y === message.location.y) && (location.z === message.location.z)) + { + this._bouncingStep = 1; + this._storedRotateMessage = new RoomObjectUpdateMessage(message.location, message.direction); + + message = null; + } + } + } + + this._directionInitialized = true; + } + + if(message instanceof ObjectSelectedMessage) + { + if(this.contextMenu && this.eventDispatcher && this.object) + { + const eventType = (message.selected) ? RoomObjectWidgetRequestEvent.OPEN_FURNI_CONTEXT_MENU : RoomObjectWidgetRequestEvent.CLOSE_FURNI_CONTEXT_MENU; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(eventType, this.object)); + } + } + + super.processUpdateMessage(message); + } + + private processDataUpdateMessage(message: ObjectDataUpdateMessage): void + { + if(!message) return; + + this.object.setState(message.state, 0); + + if(message.data) message.data.writeRoomObjectModel(this.object.model); + + if(message.extra !== null) this.object.model.setValue(RoomObjectVariable.FURNITURE_EXTRAS, message.extra.toString()); + + this.object.model.setValue(RoomObjectVariable.FURNITURE_STATE_UPDATE_TIME, this.lastUpdateTime); + } + + private processObjectHeightUpdateMessage(message: ObjectHeightUpdateMessage): void + { + if(!message) return; + + this.object.model.setValue(RoomObjectVariable.FURNITURE_SIZE_Z, message.height); + } + + private processItemDataUpdateMessage(message: ObjectItemDataUpdateMessage): void + { + if(!message) return; + + this.object.model.setValue(RoomObjectVariable.FURNITURE_ITEMDATA, message.data); + } + + public mouseEvent(event: RoomSpriteMouseEvent, geometry: IRoomGeometry): void + { + const adUrl = this.getAdClickUrl(this.object.model); + + switch(event.type) + { + case MouseEventType.MOUSE_MOVE: + if(this.eventDispatcher) + { + const mouseEvent = new RoomObjectMouseEvent(RoomObjectMouseEvent.MOUSE_MOVE, this.object, event.eventId, event.altKey, event.ctrlKey, event.shiftKey, event.buttonDown); + + mouseEvent.localX = event.localX; + mouseEvent.localY = event.localY; + mouseEvent.spriteOffsetX = event.spriteOffsetX; + mouseEvent.spriteOffsetY = event.spriteOffsetY; + + this.eventDispatcher.dispatchEvent(mouseEvent); + } + return; + case MouseEventType.ROLL_OVER: + if(!this._mouseOver) + { + if(this.eventDispatcher) + { + if(adUrl && (adUrl.indexOf('http') === 0)) + { + this.eventDispatcher.dispatchEvent(new RoomObjectRoomAdEvent(RoomObjectRoomAdEvent.ROOM_AD_TOOLTIP_SHOW, this.object)); + } + + const mouseEvent = new RoomObjectMouseEvent(RoomObjectMouseEvent.MOUSE_ENTER, this.object, event.eventId, event.altKey, event.ctrlKey, event.shiftKey, event.buttonDown); + + mouseEvent.localX = event.localX; + mouseEvent.localY = event.localY; + mouseEvent.spriteOffsetX = event.spriteOffsetX; + mouseEvent.spriteOffsetY = event.spriteOffsetY; + + this.eventDispatcher.dispatchEvent(mouseEvent); + } + + this._mouseOver = true; + } + return; + case MouseEventType.ROLL_OUT: + if(this._mouseOver) + { + if(this.eventDispatcher) + { + if(adUrl && (adUrl.indexOf('http') === 0)) + { + this.eventDispatcher.dispatchEvent(new RoomObjectRoomAdEvent(RoomObjectRoomAdEvent.ROOM_AD_TOOLTIP_HIDE, this.object)); + } + + const mouseEvent = new RoomObjectMouseEvent(RoomObjectMouseEvent.MOUSE_LEAVE, this.object, event.eventId, event.altKey, event.ctrlKey, event.shiftKey, event.buttonDown); + + mouseEvent.localX = event.localX; + mouseEvent.localY = event.localY; + mouseEvent.spriteOffsetX = event.spriteOffsetX; + mouseEvent.spriteOffsetY = event.spriteOffsetY; + + this.eventDispatcher.dispatchEvent(mouseEvent); + } + + this._mouseOver = false; + } + return; + case MouseEventType.DOUBLE_CLICK: + this.useObject(); + return; + case MouseEventType.MOUSE_CLICK: + if(this.eventDispatcher) + { + const mouseEvent = new RoomObjectMouseEvent(RoomObjectMouseEvent.CLICK, this.object, event.eventId, event.altKey, event.ctrlKey, event.shiftKey, event.buttonDown); + + mouseEvent.localX = event.localX; + mouseEvent.localY = event.localY; + mouseEvent.spriteOffsetX = event.spriteOffsetX; + mouseEvent.spriteOffsetY = event.spriteOffsetY; + + this.eventDispatcher.dispatchEvent(mouseEvent); + + if(adUrl && (adUrl.indexOf('http') === 0)) + { + this.eventDispatcher.dispatchEvent(new RoomObjectRoomAdEvent(RoomObjectRoomAdEvent.ROOM_AD_TOOLTIP_HIDE, this.object)); + } + + if(adUrl && adUrl.length) this.handleAdClick(this.object.id, this.object.type, adUrl); + } + return; + case MouseEventType.MOUSE_DOWN: + if(this.eventDispatcher) + { + const mouseEvent = new RoomObjectMouseEvent(RoomObjectMouseEvent.MOUSE_DOWN, this.object, event.eventId, event.altKey, event.ctrlKey, event.shiftKey, event.buttonDown); + + this.eventDispatcher.dispatchEvent(mouseEvent); + } + return; + case MouseEventType.MOUSE_DOWN_LONG: + if(this.eventDispatcher) + { + const mouseEvent = new RoomObjectMouseEvent(RoomObjectMouseEvent.MOUSE_DOWN_LONG, this.object, event.eventId, event.altKey, event.ctrlKey, event.shiftKey, event.buttonDown); + + this.eventDispatcher.dispatchEvent(mouseEvent); + } + return; + } + } + + protected getLocationOffset(): IVector3D + { + if(this._bouncingStep <= 0) return null; + + this._locationOffset.x = 0; + this._locationOffset.y = 0; + + if(this._bouncingStep <= (FurnitureLogic.BOUNCING_STEPS / 2)) + { + this._locationOffset.z = FurnitureLogic.BOUNCING_Z * this._bouncingStep; + } + else + { + if(this._bouncingStep <= FurnitureLogic.BOUNCING_STEPS) + { + if(this._storedRotateMessage) + { + super.processUpdateMessage(this._storedRotateMessage); + + this._storedRotateMessage = null; + } + + this._locationOffset.z = FurnitureLogic.BOUNCING_Z * (FurnitureLogic.BOUNCING_STEPS - this._bouncingStep); + } + } + + return this._locationOffset; + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + const clickUrl = this.getAdClickUrl(this.object.model); + + if(clickUrl && clickUrl.length) + { + this.eventDispatcher.dispatchEvent(new RoomObjectRoomAdEvent(RoomObjectRoomAdEvent.ROOM_AD_FURNI_DOUBLE_CLICK, this.object, null, clickUrl)); + } + + if(this.widget) this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.OPEN_WIDGET, this.object)); + + this.eventDispatcher.dispatchEvent(new RoomObjectStateChangedEvent(RoomObjectStateChangedEvent.STATE_CHANGE, this.object)); + } + + public tearDown(): void + { + if(this.object.model.getValue(RoomObjectVariable.FURNITURE_REAL_ROOM_OBJECT) === 1) + { + if(this.widget) this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.CLOSE_WIDGET, this.object)); + + if(this.contextMenu) this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.CLOSE_FURNI_CONTEXT_MENU, this.object)); + } + + super.tearDown(); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureLoveLockLogic.ts b/packages/room/src/object/logic/furniture/FurnitureLoveLockLogic.ts new file mode 100644 index 0000000..c91418f --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureLoveLockLogic.ts @@ -0,0 +1,10 @@ +import { FriendFurniEngravingWidgetType } from '@nitrots/api'; +import { FurnitureFriendFurniLogic } from './FurnitureFriendFurniLogic'; + +export class FurnitureLoveLockLogic extends FurnitureFriendFurniLogic +{ + public get engravingDialogType(): number + { + return FriendFurniEngravingWidgetType.LOVE_LOCK; + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureMannequinLogic.ts b/packages/room/src/object/logic/furniture/FurnitureMannequinLogic.ts new file mode 100644 index 0000000..e64c9ea --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureMannequinLogic.ts @@ -0,0 +1,50 @@ +import { MapDataType, RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { ObjectDataUpdateMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureMannequinLogic extends FurnitureLogic +{ + private static GENDER: string = 'GENDER'; + private static FIGURE: string = 'FIGURE'; + private static OUTFIT_NAME: string = 'OUTFIT_NAME'; + + public getEventTypes(): string[] + { + const types = [RoomObjectWidgetRequestEvent.MANNEQUIN]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(message instanceof ObjectDataUpdateMessage) + { + message.data.writeRoomObjectModel(this.object.model); + + this.processObjectData(); + } + } + + private processObjectData(): void + { + if(!this.object || !this.object.model) return; + + const data = new MapDataType(); + + data.initializeFromRoomObjectModel(this.object.model); + + this.object.model.setValue(RoomObjectVariable.FURNITURE_MANNEQUIN_GENDER, data.getValue(FurnitureMannequinLogic.GENDER)); + this.object.model.setValue(RoomObjectVariable.FURNITURE_MANNEQUIN_FIGURE, data.getValue(FurnitureMannequinLogic.FIGURE)); + this.object.model.setValue(RoomObjectVariable.FURNITURE_MANNEQUIN_NAME, data.getValue(FurnitureMannequinLogic.OUTFIT_NAME)); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.MANNEQUIN, this.object)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureMonsterplantSeedLogic.ts b/packages/room/src/object/logic/furniture/FurnitureMonsterplantSeedLogic.ts new file mode 100644 index 0000000..bd431fb --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureMonsterplantSeedLogic.ts @@ -0,0 +1,25 @@ +import { ContextMenuEnum } from '@nitrots/api'; +import { RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurnitureMonsterplantSeedLogic extends FurnitureMultiStateLogic +{ + public getEventTypes(): string[] + { + const types = [RoomObjectWidgetRequestEvent.MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG, this.object)); + } + + public get contextMenu(): string + { + return ContextMenuEnum.MONSTERPLANT_SEED; + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureMultiHeightLogic.ts b/packages/room/src/object/logic/furniture/FurnitureMultiHeightLogic.ts new file mode 100644 index 0000000..0aae0e0 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureMultiHeightLogic.ts @@ -0,0 +1,12 @@ +import { IAssetData, RoomObjectVariable } from '@nitrots/api'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurnitureMultiHeightLogic extends FurnitureMultiStateLogic +{ + public initialize(asset: IAssetData): void + { + super.initialize(asset); + + if(this.object && this.object.model) this.object.model.setValue(RoomObjectVariable.FURNITURE_IS_VARIABLE_HEIGHT, 1); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureMultiStateLogic.ts b/packages/room/src/object/logic/furniture/FurnitureMultiStateLogic.ts new file mode 100644 index 0000000..b130baf --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureMultiStateLogic.ts @@ -0,0 +1,30 @@ +import { IRoomGeometry, MouseEventType } from '@nitrots/api'; +import { RoomObjectFurnitureActionEvent, RoomSpriteMouseEvent } from '@nitrots/events'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureMultiStateLogic extends FurnitureLogic +{ + public getEventTypes(): string[] + { + const types = [RoomObjectFurnitureActionEvent.MOUSE_BUTTON, RoomObjectFurnitureActionEvent.MOUSE_ARROW]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public mouseEvent(event: RoomSpriteMouseEvent, geometry: IRoomGeometry): void + { + if(!event || !geometry || !this.object) return; + + switch(event.type) + { + case MouseEventType.ROLL_OVER: + this.eventDispatcher && this.eventDispatcher.dispatchEvent(new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.MOUSE_BUTTON, this.object)); + break; + case MouseEventType.ROLL_OUT: + this.eventDispatcher && this.eventDispatcher.dispatchEvent(new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.MOUSE_ARROW, this.object)); + break; + } + + super.mouseEvent(event, geometry); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureMysteryBoxLogic.ts b/packages/room/src/object/logic/furniture/FurnitureMysteryBoxLogic.ts new file mode 100644 index 0000000..a9e57f8 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureMysteryBoxLogic.ts @@ -0,0 +1,25 @@ +import { ContextMenuEnum } from '@nitrots/api'; +import { RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurnitureMysteryBoxLogic extends FurnitureMultiStateLogic +{ + public getEventTypes(): string[] + { + const types = [RoomObjectWidgetRequestEvent.MYSTERYBOX_OPEN_DIALOG]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.MYSTERYBOX_OPEN_DIALOG, this.object)); + } + + public get contextMenu(): string + { + return ContextMenuEnum.MYSTERY_BOX; + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureMysteryTrophyLogic.ts b/packages/room/src/object/logic/furniture/FurnitureMysteryTrophyLogic.ts new file mode 100644 index 0000000..cefb75d --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureMysteryTrophyLogic.ts @@ -0,0 +1,25 @@ +import { ContextMenuEnum } from '@nitrots/api'; +import { RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurnitureMysteryTrophyLogic extends FurnitureMultiStateLogic +{ + public getEventTypes(): string[] + { + const types = [RoomObjectWidgetRequestEvent.MYSTERYTROPHY_OPEN_DIALOG]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.MYSTERYTROPHY_OPEN_DIALOG, this.object)); + } + + public get contextMenu(): string + { + return ContextMenuEnum.MYSTERY_TROPHY; + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureOneWayDoorLogic.ts b/packages/room/src/object/logic/furniture/FurnitureOneWayDoorLogic.ts new file mode 100644 index 0000000..a841e10 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureOneWayDoorLogic.ts @@ -0,0 +1,19 @@ +import { RoomObjectFurnitureActionEvent } from '@nitrots/events'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureOneWayDoorLogic extends FurnitureLogic +{ + public getEventTypes(): string[] + { + const types = [RoomObjectFurnitureActionEvent.ENTER_ONEWAYDOOR]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.ENTER_ONEWAYDOOR, this.object)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurniturePetCustomizationLogic.ts b/packages/room/src/object/logic/furniture/FurniturePetCustomizationLogic.ts new file mode 100644 index 0000000..dbaafd1 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurniturePetCustomizationLogic.ts @@ -0,0 +1,33 @@ +import { RoomObjectVariable, RoomWidgetEnumItemExtradataParameter } from '@nitrots/api'; +import { RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurniturePetCustomizationLogic extends FurnitureLogic +{ + public getEventTypes(): string[] + { + const types = [RoomObjectWidgetRequestEvent.PET_PRODUCT_MENU]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(!this.object) return; + + if(this.object.model.getValue(RoomObjectVariable.FURNITURE_REAL_ROOM_OBJECT) === 1) + { + this.object.model.setValue(RoomWidgetEnumItemExtradataParameter.INFOSTAND_EXTRA_PARAM, RoomWidgetEnumItemExtradataParameter.USABLE_PRODUCT); + } + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.PET_PRODUCT_MENU, this.object)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurniturePlaceholderLogic.ts b/packages/room/src/object/logic/furniture/FurniturePlaceholderLogic.ts new file mode 100644 index 0000000..18ec0e7 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurniturePlaceholderLogic.ts @@ -0,0 +1,21 @@ +import { RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurniturePlaceholderLogic extends FurnitureLogic +{ + public getEventTypes(): string[] + { + const types = [ + RoomObjectWidgetRequestEvent.PLACEHOLDER + ]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.PLACEHOLDER, this.object)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurniturePlanetSystemLogic.ts b/packages/room/src/object/logic/furniture/FurniturePlanetSystemLogic.ts new file mode 100644 index 0000000..e52d818 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurniturePlanetSystemLogic.ts @@ -0,0 +1,18 @@ +import { IAssetData, IAssetLogicPlanetSystem, RoomObjectVariable } from '@nitrots/api'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurniturePlanetSystemLogic extends FurnitureLogic +{ + public initialize(asset: IAssetData): void + { + super.initialize(asset); + + if(asset.logic) + { + if(asset.logic.planetSystems) + { + this.object.model.setValue(RoomObjectVariable.FURNITURE_PLANETSYSTEM_DATA, asset.logic.planetSystems); + } + } + } +} diff --git a/packages/room/src/object/logic/furniture/FurniturePresentLogic.ts b/packages/room/src/object/logic/furniture/FurniturePresentLogic.ts new file mode 100644 index 0000000..e7244b3 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurniturePresentLogic.ts @@ -0,0 +1,111 @@ +import { IAssetData, IParticleSystem, IRoomGeometry, MapDataType, MouseEventType, RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectFurnitureActionEvent, RoomObjectWidgetRequestEvent, RoomSpriteMouseEvent } from '@nitrots/events'; +import { ObjectDataUpdateMessage, ObjectModelDataUpdateMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurniturePresentLogic extends FurnitureLogic +{ + private static MESSAGE: string = 'MESSAGE'; + private static PRODUCT_CODE: string = 'PRODUCT_CODE'; + private static EXTRA_PARAM: string = 'EXTRA_PARAM'; + private static PURCHASER_NAME: string = 'PURCHASER_NAME'; + private static PURCHASER_FIGURE: string = 'PURCHASER_FIGURE'; + + public getEventTypes(): string[] + { + const types = [ + RoomObjectWidgetRequestEvent.PRESENT + ]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public initialize(asset: IAssetData): void + { + super.initialize(asset); + + if(asset.logic) + { + if(asset.logic.particleSystems && asset.logic.particleSystems.length) + { + this.object.model.setValue(RoomObjectVariable.FURNITURE_FIREWORKS_DATA, asset.logic.particleSystems); + } + } + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(message instanceof ObjectDataUpdateMessage) + { + message.data.writeRoomObjectModel(this.object.model); + + this.updateStuffData(); + } + + if(message instanceof ObjectModelDataUpdateMessage) + { + if(message.numberKey === RoomObjectVariable.FURNITURE_DISABLE_PICKING_ANIMATION) + { + this.object.model.setValue(RoomObjectVariable.FURNITURE_DISABLE_PICKING_ANIMATION, message.numberValue); + } + } + } + + private updateStuffData(): void + { + if(!this.object || !this.object.model) return; + + const stuffData = new MapDataType(); + + stuffData.initializeFromRoomObjectModel(this.object.model); + + const message = stuffData.getValue(FurniturePresentLogic.MESSAGE); + const data = this.object.model.getValue(RoomObjectVariable.FURNITURE_DATA); + + if(!message && (typeof data === 'string')) + { + this.object.model.setValue(RoomObjectVariable.FURNITURE_DATA, data.substr(1)); + } + else + { + this.object.model.setValue(RoomObjectVariable.FURNITURE_DATA, stuffData.getValue(FurniturePresentLogic.MESSAGE)); + } + + this.writeToModel(RoomObjectVariable.FURNITURE_TYPE_ID, stuffData.getValue(FurniturePresentLogic.PRODUCT_CODE)); + this.writeToModel(RoomObjectVariable.FURNITURE_PURCHASER_NAME, stuffData.getValue(FurniturePresentLogic.PURCHASER_NAME)); + this.writeToModel(RoomObjectVariable.FURNITURE_PURCHASER_FIGURE, stuffData.getValue(FurniturePresentLogic.PURCHASER_FIGURE)); + } + + private writeToModel(key: string, value: string): void + { + if(!value) return; + + this.object.model.setValue(key, value); + } + + public mouseEvent(event: RoomSpriteMouseEvent, geometry: IRoomGeometry): void + { + if(!event || !geometry || !this.object) return; + + switch(event.type) + { + case MouseEventType.ROLL_OVER: + this.eventDispatcher.dispatchEvent(new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.MOUSE_BUTTON, this.object)); + break; + case MouseEventType.ROLL_OUT: + this.eventDispatcher.dispatchEvent(new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.MOUSE_ARROW, this.object)); + break; + } + + super.mouseEvent(event, geometry); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.PRESENT, this.object)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurniturePurchaseableClothingLogic.ts b/packages/room/src/object/logic/furniture/FurniturePurchaseableClothingLogic.ts new file mode 100644 index 0000000..e606f02 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurniturePurchaseableClothingLogic.ts @@ -0,0 +1,28 @@ +import { ContextMenuEnum } from '@nitrots/api'; +import { RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurniturePurchaseableClothingLogic extends FurnitureMultiStateLogic +{ + + public getEventTypes(): string[] + { + const types = [ + RoomObjectWidgetRequestEvent.PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG, + ]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG, this.object)); + } + + public get contextMenu(): string + { + return ContextMenuEnum.PURCHASABLE_CLOTHING; + } +} diff --git a/packages/room/src/object/logic/furniture/FurniturePushableLogic.ts b/packages/room/src/object/logic/furniture/FurniturePushableLogic.ts new file mode 100644 index 0000000..f7317c9 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurniturePushableLogic.ts @@ -0,0 +1,113 @@ +import { LegacyDataType } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; +import { ObjectDataUpdateMessage, ObjectMoveUpdateMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { MovingObjectLogic } from '../MovingObjectLogic'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurniturePushableLogic extends FurnitureMultiStateLogic +{ + private static ANIMATION_NOT_MOVING: number = 0; + private static ANIMATION_MOVING: number = 1; + private static MAX_ANIMATION_COUNT: number = 10; + + private _oldLocation: Vector3d; + + constructor() + { + super(); + + this.updateInterval = MovingObjectLogic.DEFAULT_UPDATE_INTERVAL; + this._oldLocation = new Vector3d(); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + if(!message) return; + + const isMoveMessage = (message instanceof ObjectMoveUpdateMessage); + + if(this.object && !isMoveMessage && message.location) + { + const location = this.object.getLocation(); + const difference = Vector3d.dif(message.location, location); + + if(difference) + { + if((Math.abs(difference.x) < 2) && (Math.abs(difference.y) < 2)) + { + let prevLocation = location; + + if((Math.abs(difference.x) > 1) || (Math.abs(difference.y) > 1)) + { + prevLocation = Vector3d.sum(location, Vector3d.product(difference, 0.5)); + } + + super.processUpdateMessage(new ObjectMoveUpdateMessage(prevLocation, message.location, message.direction)); + + return; + } + } + } + + if(message.location && !isMoveMessage) super.processUpdateMessage(new ObjectMoveUpdateMessage(message.location, message.location, message.direction)); + + if(message instanceof ObjectDataUpdateMessage) + { + if(message.state > 0) + { + this.updateInterval = MovingObjectLogic.DEFAULT_UPDATE_INTERVAL / this.getUpdateIntervalValue(message.state); + } + else + { + this.updateInterval = 1; + } + + this.handleDataUpdate(message); + + return; + } + + if(isMoveMessage && message.isSlide) this.updateInterval = MovingObjectLogic.DEFAULT_UPDATE_INTERVAL; + + super.processUpdateMessage(message); + } + + protected getUpdateIntervalValue(value: number) + { + return (value / FurniturePushableLogic.MAX_ANIMATION_COUNT); + } + + protected getAnimationValue(value: number) + { + return (value % FurniturePushableLogic.MAX_ANIMATION_COUNT); + } + + private handleDataUpdate(message: ObjectDataUpdateMessage): void + { + const animation = this.getAnimationValue(message.state); + + if(animation !== message.state) + { + const legacyStuff = new LegacyDataType(); + + legacyStuff.setString(animation.toString()); + + message = new ObjectDataUpdateMessage(animation, legacyStuff, message.extra); + } + + super.processUpdateMessage(message); + } + + public update(time: number): void + { + if(!this.object) return; + + this._oldLocation.assign(this.object.getLocation()); + + super.update(time); + + if(Vector3d.dif(this.object.getLocation(), this._oldLocation).length !== 0) return; + + if(this.object.getState(0) !== FurniturePushableLogic.ANIMATION_NOT_MOVING) this.object.setState(FurniturePushableLogic.ANIMATION_NOT_MOVING, 0); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureRandomStateLogic.ts b/packages/room/src/object/logic/furniture/FurnitureRandomStateLogic.ts new file mode 100644 index 0000000..1303834 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureRandomStateLogic.ts @@ -0,0 +1,21 @@ +import { RoomObjectStateChangedEvent } from '@nitrots/events'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureRandomStateLogic extends FurnitureLogic +{ + public getEventTypes(): string[] + { + const types = [ + RoomObjectStateChangedEvent.STATE_RANDOM + ]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectStateChangedEvent(RoomObjectStateChangedEvent.STATE_RANDOM, this.object)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureRandomTeleportLogic.ts b/packages/room/src/object/logic/furniture/FurnitureRandomTeleportLogic.ts new file mode 100644 index 0000000..6407ac5 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureRandomTeleportLogic.ts @@ -0,0 +1,10 @@ +import { ContextMenuEnum } from '@nitrots/api'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurnitureRandomTeleportLogic extends FurnitureMultiStateLogic +{ + public get contextMenu(): string + { + return ContextMenuEnum.RANDOM_TELEPORT; + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureRentableSpaceLogic.ts b/packages/room/src/object/logic/furniture/FurnitureRentableSpaceLogic.ts new file mode 100644 index 0000000..ed64256 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureRentableSpaceLogic.ts @@ -0,0 +1,46 @@ +import { RoomObjectVariable, RoomWidgetEnum } from '@nitrots/api'; +import { RoomObjectDataRequestEvent } from '@nitrots/events'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureRentableSpaceLogic extends FurnitureLogic +{ + public getEventTypes(): string[] + { + const types = [ + RoomObjectDataRequestEvent.RODRE_CURRENT_USER_ID, + ]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public update(time: number): void + { + super.update(time); + + if(this.object && this.object.model) + { + if(!this.object.model.getValue(RoomObjectVariable.SESSION_CURRENT_USER_ID)) + { + this.eventDispatcher.dispatchEvent(new RoomObjectDataRequestEvent(RoomObjectDataRequestEvent.RODRE_CURRENT_USER_ID, this.object)); + } + + const renterId = this.object.model.getValue(RoomObjectVariable.FURNITURE_DATA)['renterId']; + const userId = this.object.model.getValue(RoomObjectVariable.SESSION_CURRENT_USER_ID); + + if(renterId) + { + if(parseInt(renterId) === userId) this.object.setState(2, 0); + else this.object.setState(1, 0); + } + else + { + this.object.setState(0, 0); + } + } + } + + public get widget(): string + { + return RoomWidgetEnum.RENTABLESPACE; + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureRoomBackgroundColorLogic.ts b/packages/room/src/object/logic/furniture/FurnitureRoomBackgroundColorLogic.ts new file mode 100644 index 0000000..0a419c0 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureRoomBackgroundColorLogic.ts @@ -0,0 +1,105 @@ +import { IRoomGeometry, MouseEventType, NumberDataType, RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectHSLColorEnableEvent, RoomObjectWidgetRequestEvent, RoomSpriteMouseEvent } from '@nitrots/events'; +import { ObjectDataUpdateMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurnitureRoomBackgroundColorLogic extends FurnitureMultiStateLogic +{ + + private _roomColorUpdated: boolean; + + constructor() + { + super(); + + this._roomColorUpdated = false; + } + + public getEventTypes(): string[] + { + const types = [ + RoomObjectWidgetRequestEvent.BACKGROUND_COLOR, + RoomObjectHSLColorEnableEvent.ROOM_BACKGROUND_COLOR + ]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public dispose(): void + { + if(this._roomColorUpdated) + { + if(this.eventDispatcher && this.object) + { + const realRoomObject = this.object.model.getValue(RoomObjectVariable.FURNITURE_REAL_ROOM_OBJECT); + + if(realRoomObject === 1) + { + this.eventDispatcher.dispatchEvent(new RoomObjectHSLColorEnableEvent(RoomObjectHSLColorEnableEvent.ROOM_BACKGROUND_COLOR, this.object, false, 0, 0, 0)); + } + } + + this._roomColorUpdated = false; + } + + super.dispose(); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(message instanceof ObjectDataUpdateMessage) + { + message.data.writeRoomObjectModel(this.object.model); + + const realRoomObject = this.object.model.getValue(RoomObjectVariable.FURNITURE_REAL_ROOM_OBJECT); + + if(realRoomObject === 1) this.processColorUpdate(); + } + } + + private processColorUpdate(): void + { + if(!this.object || !this.object.model) return; + + const numberData = new NumberDataType(); + + numberData.initializeFromRoomObjectModel(this.object.model); + + const state = numberData.getValue(0); + const hue = numberData.getValue(1); + const saturation = numberData.getValue(2); + const lightness = numberData.getValue(3); + + if((state > -1) && (hue > -1) && (saturation > -1) && (lightness > -1)) + { + this.object.model.setValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_HUE, hue); + this.object.model.setValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_SATURATION, saturation); + this.object.model.setValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_LIGHTNESS, lightness); + + this.object.setState(state, 0); + + if(this.eventDispatcher) + { + this.eventDispatcher.dispatchEvent(new RoomObjectHSLColorEnableEvent(RoomObjectHSLColorEnableEvent.ROOM_BACKGROUND_COLOR, this.object, (state === 1), hue, saturation, lightness)); + } + + this._roomColorUpdated = true; + } + } + + public mouseEvent(event: RoomSpriteMouseEvent, geometry: IRoomGeometry): void + { + if(!event || !geometry || !this.object) return; + + switch(event.type) + { + case MouseEventType.DOUBLE_CLICK: + (this.eventDispatcher && this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.BACKGROUND_COLOR, this.object))); + return; + } + + super.mouseEvent(event, geometry); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureRoomBackgroundLogic.ts b/packages/room/src/object/logic/furniture/FurnitureRoomBackgroundLogic.ts new file mode 100644 index 0000000..f20d371 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureRoomBackgroundLogic.ts @@ -0,0 +1,10 @@ +import { IRoomObjectModel } from '@nitrots/api'; +import { FurnitureRoomBrandingLogic } from './FurnitureRoomBrandingLogic'; + +export class FurnitureRoomBackgroundLogic extends FurnitureRoomBrandingLogic +{ + protected getAdClickUrl(model: IRoomObjectModel): string + { + return null; + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureRoomBillboardLogic.ts b/packages/room/src/object/logic/furniture/FurnitureRoomBillboardLogic.ts new file mode 100644 index 0000000..8320293 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureRoomBillboardLogic.ts @@ -0,0 +1,31 @@ +import { IRoomObjectModel, RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectRoomAdEvent } from '@nitrots/events'; +import { HabboWebTools } from '@nitrots/utils'; +import { FurnitureRoomBrandingLogic } from './FurnitureRoomBrandingLogic'; + +export class FurnitureRoomBillboardLogic extends FurnitureRoomBrandingLogic +{ + constructor() + { + super(); + + this._hasClickUrl = true; + } + + protected getAdClickUrl(model: IRoomObjectModel): string + { + return model.getValue(RoomObjectVariable.FURNITURE_BRANDING_URL); + } + + protected handleAdClick(objectId: number, objectType: string, clickUrl: string): void + { + if(clickUrl.indexOf('http') === 0) + { + HabboWebTools.openWebPage(clickUrl); + + return; + } + + if(this.eventDispatcher) this.eventDispatcher.dispatchEvent(new RoomObjectRoomAdEvent(RoomObjectRoomAdEvent.ROOM_AD_FURNI_CLICK, this.object, '', clickUrl)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureRoomBrandingLogic.ts b/packages/room/src/object/logic/furniture/FurnitureRoomBrandingLogic.ts new file mode 100644 index 0000000..cf935da --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureRoomBrandingLogic.ts @@ -0,0 +1,162 @@ +import { IAssetData, IRoomGeometry, MapDataType, MouseEventType, RoomObjectVariable, RoomWidgetEnumItemExtradataParameter } from '@nitrots/api'; +import { GetAssetManager } from '@nitrots/assets'; +import { RoomObjectRoomAdEvent, RoomSpriteMouseEvent } from '@nitrots/events'; +import { ObjectAdUpdateMessage, ObjectDataUpdateMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureRoomBrandingLogic extends FurnitureLogic +{ + public static STATE: string = 'state'; + public static IMAGEURL_KEY: string = 'imageUrl'; + public static CLICKURL_KEY: string = 'clickUrl'; + public static OFFSETX_KEY: string = 'offsetX'; + public static OFFSETY_KEY: string = 'offsetY'; + public static OFFSETZ_KEY: string = 'offsetZ'; + + protected _disableFurnitureSelection: boolean; + protected _hasClickUrl: boolean; + + constructor() + { + super(); + + this._disableFurnitureSelection = true; + this._hasClickUrl = false; + } + + public getEventTypes(): string[] + { + const types = [RoomObjectRoomAdEvent.ROOM_AD_LOAD_IMAGE]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public initialize(asset: IAssetData): void + { + super.initialize(asset); + + if(this._disableFurnitureSelection) + { + this.object.model.setValue(RoomObjectVariable.FURNITURE_SELECTION_DISABLED, 1); + } + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(message instanceof ObjectDataUpdateMessage) this.processAdDataUpdateMessage(message); + + if(message instanceof ObjectAdUpdateMessage) this.processAdUpdate(message); + } + + private processAdDataUpdateMessage(message: ObjectDataUpdateMessage): void + { + if(!message) return; + + const objectData = new MapDataType(); + + objectData.initializeFromRoomObjectModel(this.object.model); + + const state = parseInt(objectData.getValue(FurnitureRoomBrandingLogic.STATE)); + + if(!isNaN(state) && (this.object.getState(0) !== state)) this.object.setState(state, 0); + + const imageUrl = objectData.getValue(FurnitureRoomBrandingLogic.IMAGEURL_KEY); + const existingUrl = this.object.model.getValue(RoomObjectVariable.FURNITURE_BRANDING_IMAGE_URL); + + if(!existingUrl || (existingUrl !== imageUrl)) + { + this.object.model.setValue(RoomObjectVariable.FURNITURE_BRANDING_IMAGE_URL, imageUrl); + this.object.model.setValue(RoomObjectVariable.FURNITURE_BRANDING_IMAGE_STATUS, 0); + + this.downloadBackground(); + } + + const clickUrl = objectData.getValue(FurnitureRoomBrandingLogic.CLICKURL_KEY); + + if(clickUrl) + { + const existingUrl = this.object.model.getValue(RoomObjectVariable.FURNITURE_BRANDING_URL); + + if(!existingUrl || existingUrl !== clickUrl) + { + if(this.object.model) this.object.model.setValue(RoomObjectVariable.FURNITURE_BRANDING_URL, clickUrl); + } + } + + const offsetX = parseInt(objectData.getValue(FurnitureRoomBrandingLogic.OFFSETX_KEY)); + const offsetY = parseInt(objectData.getValue(FurnitureRoomBrandingLogic.OFFSETY_KEY)); + const offsetZ = parseInt(objectData.getValue(FurnitureRoomBrandingLogic.OFFSETZ_KEY)); + + if(!isNaN(offsetX)) this.object.model.setValue(RoomObjectVariable.FURNITURE_BRANDING_OFFSET_X, offsetX); + if(!isNaN(offsetY)) this.object.model.setValue(RoomObjectVariable.FURNITURE_BRANDING_OFFSET_Y, offsetY); + if(!isNaN(offsetZ)) this.object.model.setValue(RoomObjectVariable.FURNITURE_BRANDING_OFFSET_Z, offsetZ); + + let options = (((FurnitureRoomBrandingLogic.IMAGEURL_KEY + '=') + ((imageUrl !== null) ? imageUrl : '')) + '\t'); + + if(this._hasClickUrl) options = (options + (((FurnitureRoomBrandingLogic.CLICKURL_KEY + '=') + ((clickUrl !== null) ? clickUrl : '')) + '\t')); + + options = (options + (((FurnitureRoomBrandingLogic.OFFSETX_KEY + '=') + offsetX) + '\t')); + options = (options + (((FurnitureRoomBrandingLogic.OFFSETY_KEY + '=') + offsetY) + '\t')); + options = (options + (((FurnitureRoomBrandingLogic.OFFSETZ_KEY + '=') + offsetZ) + '\t')); + + this.object.model.setValue(RoomWidgetEnumItemExtradataParameter.INFOSTAND_EXTRA_PARAM, (RoomWidgetEnumItemExtradataParameter.BRANDING_OPTIONS + options)); + } + + private processAdUpdate(message: ObjectAdUpdateMessage): void + { + if(!message || !this.object) return; + + switch(message.type) + { + case ObjectAdUpdateMessage.IMAGE_LOADED: + this.object.model.setValue(RoomObjectVariable.FURNITURE_BRANDING_IMAGE_STATUS, 1); + break; + case ObjectAdUpdateMessage.IMAGE_LOADING_FAILED: + this.object.model.setValue(RoomObjectVariable.FURNITURE_BRANDING_IMAGE_STATUS, -1); + break; + } + } + + public mouseEvent(event: RoomSpriteMouseEvent, geometry: IRoomGeometry): void + { + if(!event || !geometry) return; + + if((event.type === MouseEventType.MOUSE_MOVE) || (event.type === MouseEventType.DOUBLE_CLICK)) return; + + super.mouseEvent(event, geometry); + } + + private async downloadBackground(): Promise + { + const model = this.object && this.object.model; + + if(!model) return; + + const imageUrl = model.getValue(RoomObjectVariable.FURNITURE_BRANDING_IMAGE_URL); + const imageStatus = model.getValue(RoomObjectVariable.FURNITURE_BRANDING_IMAGE_STATUS); + + if(!imageUrl || (imageUrl === '') || (imageStatus === 1)) return; + + const asset = GetAssetManager(); + + if(!asset) return; + + const texture = asset.getTexture(imageUrl); + + if(!texture) + { + const status = await asset.downloadAsset(imageUrl); + + if(!status) + { + this.processUpdateMessage(new ObjectAdUpdateMessage(ObjectAdUpdateMessage.IMAGE_LOADING_FAILED)); + + return; + } + } + + this.processUpdateMessage(new ObjectAdUpdateMessage(ObjectAdUpdateMessage.IMAGE_LOADED)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureRoomDimmerLogic.ts b/packages/room/src/object/logic/furniture/FurnitureRoomDimmerLogic.ts new file mode 100644 index 0000000..24f7355 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureRoomDimmerLogic.ts @@ -0,0 +1,140 @@ +import { RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectDimmerStateUpdateEvent, RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { ObjectDataUpdateMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureRoomDimmerLogic extends FurnitureLogic +{ + private _roomColorUpdated: boolean; + + constructor() + { + super(); + + this._roomColorUpdated = false; + } + + public getEventTypes(): string[] + { + const types = [ + RoomObjectWidgetRequestEvent.DIMMER, + RoomObjectWidgetRequestEvent.WIDGET_REMOVE_DIMMER, + RoomObjectDimmerStateUpdateEvent.DIMMER_STATE + ]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public dispose(): void + { + if(this._roomColorUpdated) + { + if(this.eventDispatcher && this.object) + { + const realRoomObject = this.object.model.getValue(RoomObjectVariable.FURNITURE_REAL_ROOM_OBJECT); + + if(realRoomObject === 1) + { + this.eventDispatcher.dispatchEvent(new RoomObjectDimmerStateUpdateEvent(this.object, 0, 1, 1, 0xFFFFFF, 0xFF)); + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.WIDGET_REMOVE_DIMMER, this.object)); + } + + this._roomColorUpdated = false; + } + } + + super.dispose(); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + if(message instanceof ObjectDataUpdateMessage) + { + if(message.data) + { + const extra = message.data.getLegacyString(); + + const realRoomObject = this.object.model.getValue(RoomObjectVariable.FURNITURE_REAL_ROOM_OBJECT); + + if(realRoomObject === 1) this.processDimmerData(extra); + + super.processUpdateMessage(new ObjectDataUpdateMessage(this.getStateFromDimmerData(extra), message.data)); + } + + return; + } + + super.processUpdateMessage(message); + } + + private getStateFromDimmerData(data: string): number + { + if(!data) return 0; + + const parts = data.split(','); + + if(parts.length >= 5) return (parseInt(parts[0]) - 1); + + return 0; + } + + private processDimmerData(data: string): void + { + if(!data) return; + + const parts = data.split(','); + + if(parts.length >= 5) + { + const state = this.getStateFromDimmerData(data); + const presetId = parseInt(parts[1]); + const effectId = parseInt(parts[2]); + const color = parts[3]; + + let colorCode = parseInt(color.substr(1), 16); + let brightness = parseInt(parts[4]); + + if(!state) + { + colorCode = 0xFFFFFF; + brightness = 0xFF; + } + + if(this.eventDispatcher && this.object) + { + this.eventDispatcher.dispatchEvent(new RoomObjectDimmerStateUpdateEvent(this.object, state, presetId, effectId, colorCode, brightness)); + + this._roomColorUpdated = true; + } + } + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.DIMMER, this.object)); + } + + public update(time: number): void + { + super.update(time); + + // if(this.object && this.object.model) + // { + // const realRoomObject = this.object.model.getValue(RoomObjectVariable.FURNITURE_REAL_ROOM_OBJECT); + + // if(realRoomObject === 1) + // { + // const data = this.object.model.getValue(RoomObjectVariable.FURNITURE_DATA); + + // if(data && data.length > 0) + // { + // this.object.model.setValue(RoomObjectVariable.FURNITURE_DATA, ''); + + // this.processDimmerData(data); + // } + // } + // } + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureScoreLogic.ts b/packages/room/src/object/logic/furniture/FurnitureScoreLogic.ts new file mode 100644 index 0000000..28fd078 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureScoreLogic.ts @@ -0,0 +1,70 @@ +import { GetTickerTime } from '@nitrots/utils'; +import { ObjectDataUpdateMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureScoreLogic extends FurnitureLogic +{ + private static UPDATE_INTERVAL: number = 50; + private static MAX_UPDATE_TIME: number = 3000; + + private _score: number; + private _scoreIncreaser: number; + private _scoreTimer: number; + + constructor() + { + super(); + + this._score = 0; + this._scoreIncreaser = 50; + this._scoreTimer = 0; + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + if(message instanceof ObjectDataUpdateMessage) return this.updateScore(message.state); + + super.processUpdateMessage(message); + } + + private updateScore(count: number): void + { + this._score = count; + + const currentScore = this.object.getState(0); + + if(this._score !== currentScore) + { + let difference = (this._score - currentScore); + + if(difference < 0) difference = -(difference); + + if((difference * FurnitureScoreLogic.UPDATE_INTERVAL) > FurnitureScoreLogic.MAX_UPDATE_TIME) this._scoreIncreaser = (FurnitureScoreLogic.MAX_UPDATE_TIME / difference); + else this._scoreIncreaser = FurnitureScoreLogic.UPDATE_INTERVAL; + + this._scoreTimer = GetTickerTime(); + } + } + + public update(time: number): void + { + super.update(time); + + const currentScore = this.object.getState(0); + + if((currentScore !== this._score) && (time >= (this._scoreTimer + this._scoreIncreaser))) + { + const _local_3 = (time - this._scoreTimer); + let _local_4 = (_local_3 / this._scoreIncreaser); + let _local_5 = 1; + + if(this._score < currentScore) _local_5 = -1; + + if(_local_4 > (_local_5 * (this._score - currentScore))) _local_4 = (_local_5 * (this._score - currentScore)); + + this.object.setState((currentScore + (_local_5 * _local_4)), 0); + + this._scoreTimer = (time - (_local_3 - (_local_4 * this._scoreIncreaser))); + } + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureSongDiskLogic.ts b/packages/room/src/object/logic/furniture/FurnitureSongDiskLogic.ts new file mode 100644 index 0000000..13497ef --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureSongDiskLogic.ts @@ -0,0 +1,19 @@ +import { RoomObjectVariable, RoomWidgetEnumItemExtradataParameter } from '@nitrots/api'; +import { RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureSongDiskLogic extends FurnitureLogic +{ + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(this.object.model.getValue(RoomObjectVariable.FURNITURE_REAL_ROOM_OBJECT) === 1) + { + const extras = this.object.model.getValue(RoomObjectVariable.FURNITURE_EXTRAS); + const diskId = parseInt(extras); + + this.object.model.setValue(RoomWidgetEnumItemExtradataParameter.INFOSTAND_EXTRA_PARAM, (RoomWidgetEnumItemExtradataParameter.SONGDISK + diskId)); + } + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureSoundBlockLogic.ts b/packages/room/src/object/logic/furniture/FurnitureSoundBlockLogic.ts new file mode 100644 index 0000000..9e38c28 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureSoundBlockLogic.ts @@ -0,0 +1,119 @@ +import { IAssetData, RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectSamplePlaybackEvent } from '@nitrots/events'; +import { ObjectDataUpdateMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurnitureSoundBlockLogic extends FurnitureMultiStateLogic +{ + private static HIGHEST_SEMITONE: number = 12; + private static LOWEST_SEMITONE: number = -12; + private static STATE_UNINITIALIZED: number = -1; + + private _state: number = -1; + private _sampleId: number = -1; + private _noPitch: boolean = false; + private _lastLocZ: number = 0; + + public getEventTypes(): string[] + { + const types = [ + RoomObjectSamplePlaybackEvent.ROOM_OBJECT_INITIALIZED, + RoomObjectSamplePlaybackEvent.ROOM_OBJECT_DISPOSED, + RoomObjectSamplePlaybackEvent.PLAY_SAMPLE, + RoomObjectSamplePlaybackEvent.CHANGE_PITCH + ]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public initialize(asset: IAssetData): void + { + super.initialize(asset); + + if(asset.logic) + { + if(asset.logic.soundSample) + { + this._sampleId = asset.logic.soundSample.id; + this._noPitch = asset.logic.soundSample.noPitch; + } + } + + this.object.model.setValue(RoomObjectVariable.FURNITURE_SOUNDBLOCK_RELATIVE_ANIMATION_SPEED, 1); + } + + public dispose(): void + { + if(this._state !== FurnitureSoundBlockLogic.STATE_UNINITIALIZED) + { + this.eventDispatcher.dispatchEvent(new RoomObjectSamplePlaybackEvent(RoomObjectSamplePlaybackEvent.ROOM_OBJECT_DISPOSED, this.object, this._sampleId)); + } + + super.dispose(); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(message instanceof ObjectDataUpdateMessage) this.updateSoundBlockMessage(message); + } + + private updateSoundBlockMessage(message: ObjectDataUpdateMessage): void + { + if(!message) return; + + const model = this.object && this.object.model; + const location = this.object && this.object.location; + + if(!model || !location) return; + + if(this._state === FurnitureSoundBlockLogic.STATE_UNINITIALIZED && model.getValue(RoomObjectVariable.FURNITURE_REAL_ROOM_OBJECT) === 1) + { + this._lastLocZ = location.z; + this.eventDispatcher.dispatchEvent(new RoomObjectSamplePlaybackEvent(RoomObjectSamplePlaybackEvent.ROOM_OBJECT_INITIALIZED, this.object, this._sampleId, this.getPitchForHeight(location.z))); + } + + if(this._state !== FurnitureSoundBlockLogic.STATE_UNINITIALIZED && model.getValue(RoomObjectVariable.FURNITURE_REAL_ROOM_OBJECT) === 1) + { + if(this._lastLocZ !== location.z) + { + this._lastLocZ = location.z; + this.eventDispatcher.dispatchEvent(new RoomObjectSamplePlaybackEvent(RoomObjectSamplePlaybackEvent.CHANGE_PITCH, this.object, this._sampleId, this.getPitchForHeight(location.z))); + } + + } + + if(this._state !== FurnitureSoundBlockLogic.STATE_UNINITIALIZED && message.state !== this._state) + { + this.playSoundAt(location.z); + } + + this._state = message.state; + } + + private playSoundAt(height: number): void + { + if(!this.object) return; + + const pitch: number = this.getPitchForHeight(height); + + this.object.model.setValue(RoomObjectVariable.FURNITURE_SOUNDBLOCK_RELATIVE_ANIMATION_SPEED, pitch); + + this.eventDispatcher.dispatchEvent(new RoomObjectSamplePlaybackEvent(RoomObjectSamplePlaybackEvent.PLAY_SAMPLE, this.object, this._sampleId, pitch)); + } + + private getPitchForHeight(height: number): number + { + if(this._noPitch) return 1; + + let heightScaled: number = (height * 2); + + if(heightScaled > FurnitureSoundBlockLogic.HIGHEST_SEMITONE) + { + heightScaled = Math.min(0, (FurnitureSoundBlockLogic.LOWEST_SEMITONE + ((heightScaled - FurnitureSoundBlockLogic.HIGHEST_SEMITONE) - 1))); + } + + return Math.pow(2, (heightScaled / 12)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureSoundMachineLogic.ts b/packages/room/src/object/logic/furniture/FurnitureSoundMachineLogic.ts new file mode 100644 index 0000000..630c621 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureSoundMachineLogic.ts @@ -0,0 +1,88 @@ +import { RoomObjectVariable, RoomWidgetEnumItemExtradataParameter } from '@nitrots/api'; +import { RoomObjectFurnitureActionEvent } from '@nitrots/events'; +import { ObjectDataUpdateMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurnitureSoundMachineLogic extends FurnitureMultiStateLogic +{ + private _disposeEventsAllowed: boolean = false; + private _isInitialized: boolean = false; + private _currentState: number = -1; + + public getEventTypes(): string[] + { + const types = [ + RoomObjectFurnitureActionEvent.SOUND_MACHINE_START, + RoomObjectFurnitureActionEvent.SOUND_MACHINE_STOP, + RoomObjectFurnitureActionEvent.SOUND_MACHINE_DISPOSE, + RoomObjectFurnitureActionEvent.SOUND_MACHINE_INIT + ]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public dispose(): void + { + this.requestDispose(); + + super.dispose(); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(this.object.model.getValue(RoomObjectVariable.FURNITURE_REAL_ROOM_OBJECT) !== 1) return; + + if(!this._isInitialized) this.requestInit(); + + this.object.model.setValue(RoomWidgetEnumItemExtradataParameter.INFOSTAND_EXTRA_PARAM, RoomWidgetEnumItemExtradataParameter.JUKEBOX); + + if(message instanceof ObjectDataUpdateMessage) + { + const state = this.object.getState(0); + + if(state !== this._currentState) + { + this._currentState = state; + + if(state === 1) this.requestPlayList(); + else if(state === 0) this.requestStopPlaying(); + } + } + } + + private requestInit(): void + { + if(!this.object || !this.eventDispatcher) return; + + this._disposeEventsAllowed = true; + + this.eventDispatcher.dispatchEvent(new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.SOUND_MACHINE_INIT, this.object)); + + this._isInitialized = true; + } + + private requestPlayList(): void + { + if(!this.object || !this.eventDispatcher) return; + + this._disposeEventsAllowed = true; + + this.eventDispatcher.dispatchEvent(new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.SOUND_MACHINE_START, this.object)); + } + + private requestStopPlaying(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.SOUND_MACHINE_STOP, this.object)); + } + + private requestDispose(): void + { + if(!this._disposeEventsAllowed || !this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.SOUND_MACHINE_DISPOSE, this.object)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureStickieLogic.ts b/packages/room/src/object/logic/furniture/FurnitureStickieLogic.ts new file mode 100644 index 0000000..041149d --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureStickieLogic.ts @@ -0,0 +1,60 @@ +import { IAssetData, RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectFurnitureActionEvent, RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { ObjectItemDataUpdateMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureStickieLogic extends FurnitureLogic +{ + private static STICKIE_COLORS: string[] = ['9CCEFF', 'FF9CFF', '9CFF9C', 'FFFF33']; + + public getEventTypes(): string[] + { + const types = [ + RoomObjectWidgetRequestEvent.STICKIE, + RoomObjectFurnitureActionEvent.STICKIE + ]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public initialize(asset: IAssetData): void + { + super.initialize(asset); + + this.updateColor(); + + if(this.object) this.object.model.setValue(RoomObjectVariable.FURNITURE_IS_STICKIE, ''); + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(message instanceof ObjectItemDataUpdateMessage) + { + this.eventDispatcher && this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.STICKIE, this.object)); + } + + this.updateColor(); + } + + protected updateColor(): void + { + if(!this.object) return; + + const furnitureData = this.object.model.getValue(RoomObjectVariable.FURNITURE_DATA); + + let colorIndex = FurnitureStickieLogic.STICKIE_COLORS.indexOf(furnitureData); + + if(colorIndex < 0) colorIndex = 3; + + this.object.model.setValue(RoomObjectVariable.FURNITURE_COLOR, (colorIndex + 1)); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectFurnitureActionEvent(RoomObjectFurnitureActionEvent.STICKIE, this.object)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureTrophyLogic.ts b/packages/room/src/object/logic/furniture/FurnitureTrophyLogic.ts new file mode 100644 index 0000000..48ff5ad --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureTrophyLogic.ts @@ -0,0 +1,19 @@ +import { RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureTrophyLogic extends FurnitureLogic +{ + public getEventTypes(): string[] + { + const types = [RoomObjectWidgetRequestEvent.TROPHY]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.TROPHY, this.object)); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureVoteCounterLogic.ts b/packages/room/src/object/logic/furniture/FurnitureVoteCounterLogic.ts new file mode 100644 index 0000000..5a5a7b8 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureVoteCounterLogic.ts @@ -0,0 +1,95 @@ +import { RoomObjectVariable, VoteDataType } from '@nitrots/api'; +import { GetTickerTime } from '@nitrots/utils'; +import { ObjectDataUpdateMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurnitureVoteCounterLogic extends FurnitureMultiStateLogic +{ + private static UPDATE_INTERVAL: number = 33; + private static MAX_UPDATE_TIME: number = 1000; + + private _total: number; + private _lastUpdate: number; + private _interval: number; + + constructor() + { + super(); + + this._total = 0; + this._lastUpdate = 0; + this._interval = 33; + } + + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(message instanceof ObjectDataUpdateMessage) + { + const stuffData = (message.data as VoteDataType); + + if(!stuffData) return; + + this.updateTotal(stuffData.result); + } + } + + private updateTotal(k: number): void + { + this._total = k; + + if(!this._lastUpdate) + { + this.object.model.setValue(RoomObjectVariable.FURNITURE_VOTE_COUNTER_COUNT, k); + + this._lastUpdate = GetTickerTime(); + + return; + } + + if(this._total !== this.currentTotal) + { + const difference = Math.abs((this._total - this.currentTotal)); + + if((difference * FurnitureVoteCounterLogic.UPDATE_INTERVAL) > FurnitureVoteCounterLogic.MAX_UPDATE_TIME) + { + this._interval = (FurnitureVoteCounterLogic.MAX_UPDATE_TIME / difference); + } + else + { + this._interval = FurnitureVoteCounterLogic.UPDATE_INTERVAL; + } + + this._lastUpdate = GetTickerTime(); + } + } + + public update(time: number): void + { + super.update(time); + + if(this.object) + { + if((this.currentTotal !== this._total) && (time >= (this._lastUpdate + this._interval))) + { + const _local_2 = (time - this._lastUpdate); + let _local_3 = (_local_2 / this._interval); + let _local_4 = 1; + + if(this._total < this.currentTotal) _local_4 = -1; + + if(_local_3 > (_local_4 * (this._total - this.currentTotal))) _local_3 = (_local_4 * (this._total - this.currentTotal)); + + this.object.model.setValue(RoomObjectVariable.FURNITURE_VOTE_COUNTER_COUNT, (this.currentTotal + (_local_4 * _local_3))); + + this._lastUpdate = (time - (_local_2 - (_local_3 * this._interval))); + } + } + } + + private get currentTotal(): number + { + return this.object.model.getValue(RoomObjectVariable.FURNITURE_VOTE_COUNTER_COUNT); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureVoteMajorityLogic.ts b/packages/room/src/object/logic/furniture/FurnitureVoteMajorityLogic.ts new file mode 100644 index 0000000..0e61372 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureVoteMajorityLogic.ts @@ -0,0 +1,20 @@ +import { RoomObjectVariable, VoteDataType } from '@nitrots/api'; +import { ObjectDataUpdateMessage, RoomObjectUpdateMessage } from '../../../messages'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurnitureVoteMajorityLogic extends FurnitureMultiStateLogic +{ + public processUpdateMessage(message: RoomObjectUpdateMessage): void + { + super.processUpdateMessage(message); + + if(!this.object) return; + + if(message instanceof ObjectDataUpdateMessage) + { + const data = message.data; + + if(data instanceof VoteDataType) this.object.model.setValue(RoomObjectVariable.FURNITURE_VOTE_MAJORITY_RESULT, data.result); + } + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureWelcomeGiftLogic.ts b/packages/room/src/object/logic/furniture/FurnitureWelcomeGiftLogic.ts new file mode 100644 index 0000000..98093a2 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureWelcomeGiftLogic.ts @@ -0,0 +1,18 @@ +import { IRoomGeometry, MouseEventType } from '@nitrots/api'; +import { RoomObjectStateChangedEvent, RoomSpriteMouseEvent } from '@nitrots/events'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurnitureWelcomeGiftLogic extends FurnitureMultiStateLogic +{ + public mouseEvent(event: RoomSpriteMouseEvent, geometry: IRoomGeometry): void + { + if(!event || !geometry) return; + + if(event.type === MouseEventType.DOUBLE_CLICK) + { + if(this.eventDispatcher) this.eventDispatcher.dispatchEvent(new RoomObjectStateChangedEvent(RoomObjectStateChangedEvent.STATE_CHANGE, this.object)); + } + + super.mouseEvent(event, geometry); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureWindowLogic.ts b/packages/room/src/object/logic/furniture/FurnitureWindowLogic.ts new file mode 100644 index 0000000..1260007 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureWindowLogic.ts @@ -0,0 +1,20 @@ +import { IAssetData, RoomObjectVariable } from '@nitrots/api'; +import { FurnitureMultiStateLogic } from './FurnitureMultiStateLogic'; + +export class FurnitureWindowLogic extends FurnitureMultiStateLogic +{ + public initialize(asset: IAssetData): void + { + super.initialize(asset); + + let maskType = ''; + + if(asset.logic) + { + if(asset.logic.maskType && (asset.logic.maskType !== '') && (asset.logic.maskType.length > 0)) maskType = asset.logic.maskType; + } + + this.object.model.setValue(RoomObjectVariable.FURNITURE_USES_PLANE_MASK, 1); + this.object.model.setValue(RoomObjectVariable.FURNITURE_PLANE_MASK_TYPE, maskType); + } +} diff --git a/packages/room/src/object/logic/furniture/FurnitureYoutubeLogic.ts b/packages/room/src/object/logic/furniture/FurnitureYoutubeLogic.ts new file mode 100644 index 0000000..0814e74 --- /dev/null +++ b/packages/room/src/object/logic/furniture/FurnitureYoutubeLogic.ts @@ -0,0 +1,33 @@ +import { RoomObjectVariable } from '@nitrots/api'; +import { RoomObjectDataRequestEvent, RoomObjectWidgetRequestEvent } from '@nitrots/events'; +import { FurnitureLogic } from './FurnitureLogic'; + +export class FurnitureYoutubeLogic extends FurnitureLogic +{ + public getEventTypes(): string[] + { + const types = [ + RoomObjectWidgetRequestEvent.YOUTUBE, + RoomObjectDataRequestEvent.RODRE_URL_PREFIX + ]; + + return this.mergeTypes(super.getEventTypes(), types); + } + + public update(time: number): void + { + super.update(time); + + if(!this.object.model.getValue(RoomObjectVariable.SESSION_URL_PREFIX)) + { + this.eventDispatcher.dispatchEvent(new RoomObjectDataRequestEvent(RoomObjectDataRequestEvent.RODRE_URL_PREFIX, this.object)); + } + } + + public useObject(): void + { + if(!this.object || !this.eventDispatcher) return; + + this.eventDispatcher.dispatchEvent(new RoomObjectWidgetRequestEvent(RoomObjectWidgetRequestEvent.YOUTUBE, this.object)); + } +} diff --git a/packages/room/src/object/logic/furniture/index.ts b/packages/room/src/object/logic/furniture/index.ts new file mode 100644 index 0000000..d548e94 --- /dev/null +++ b/packages/room/src/object/logic/furniture/index.ts @@ -0,0 +1,62 @@ +export * from './FurnitureAchievementResolutionLogic'; +export * from './FurnitureBadgeDisplayLogic'; +export * from './FurnitureChangeStateWhenStepOnLogic'; +export * from './FurnitureClothingChangeLogic'; +export * from './FurnitureCounterClockLogic'; +export * from './FurnitureCrackableLogic'; +export * from './FurnitureCraftingGizmoLogic'; +export * from './FurnitureCreditLogic'; +export * from './FurnitureCuckooClockLogic'; +export * from './FurnitureCustomStackHeightLogic'; +export * from './FurnitureDiceLogic'; +export * from './FurnitureEcotronBoxLogic'; +export * from './FurnitureEditableInternalLinkLogic'; +export * from './FurnitureEditableRoomLinkLogic'; +export * from './FurnitureEffectBoxLogic'; +export * from './FurnitureExternalImageLogic'; +export * from './FurnitureFireworksLogic'; +export * from './FurnitureFloorHoleLogic'; +export * from './FurnitureFriendFurniLogic'; +export * from './FurnitureGroupForumTerminalLogic'; +export * from './FurnitureGuildCustomizedLogic'; +export * from './FurnitureHabboWheelLogic'; +export * from './FurnitureHighScoreLogic'; +export * from './FurnitureHockeyScoreLogic'; +export * from './FurnitureHweenLovelockLogic'; +export * from './FurnitureIceStormLogic'; +export * from './FurnitureInternalLinkLogic'; +export * from './FurnitureJukeboxLogic'; +export * from './FurnitureLogic'; +export * from './FurnitureLoveLockLogic'; +export * from './FurnitureMannequinLogic'; +export * from './FurnitureMonsterplantSeedLogic'; +export * from './FurnitureMultiHeightLogic'; +export * from './FurnitureMultiStateLogic'; +export * from './FurnitureMysteryBoxLogic'; +export * from './FurnitureMysteryTrophyLogic'; +export * from './FurnitureOneWayDoorLogic'; +export * from './FurniturePetCustomizationLogic'; +export * from './FurniturePlaceholderLogic'; +export * from './FurniturePlanetSystemLogic'; +export * from './FurniturePresentLogic'; +export * from './FurniturePurchaseableClothingLogic'; +export * from './FurniturePushableLogic'; +export * from './FurnitureRandomStateLogic'; +export * from './FurnitureRandomTeleportLogic'; +export * from './FurnitureRentableSpaceLogic'; +export * from './FurnitureRoomBackgroundColorLogic'; +export * from './FurnitureRoomBackgroundLogic'; +export * from './FurnitureRoomBillboardLogic'; +export * from './FurnitureRoomBrandingLogic'; +export * from './FurnitureRoomDimmerLogic'; +export * from './FurnitureScoreLogic'; +export * from './FurnitureSongDiskLogic'; +export * from './FurnitureSoundBlockLogic'; +export * from './FurnitureSoundMachineLogic'; +export * from './FurnitureStickieLogic'; +export * from './FurnitureTrophyLogic'; +export * from './FurnitureVoteCounterLogic'; +export * from './FurnitureVoteMajorityLogic'; +export * from './FurnitureWelcomeGiftLogic'; +export * from './FurnitureWindowLogic'; +export * from './FurnitureYoutubeLogic'; diff --git a/packages/room/src/object/logic/index.ts b/packages/room/src/object/logic/index.ts new file mode 100644 index 0000000..3b6c256 --- /dev/null +++ b/packages/room/src/object/logic/index.ts @@ -0,0 +1,8 @@ +export * from './AvatarLogic'; +export * from './MovingObjectLogic'; +export * from './PetLogic'; +export * from './RoomLogic'; +export * from './RoomObjectLogicBase'; +export * from './SelectionArrowLogic'; +export * from './TileCursorLogic'; +export * from './furniture'; diff --git a/packages/room/src/object/visualization/RoomObjectSprite.ts b/packages/room/src/object/visualization/RoomObjectSprite.ts new file mode 100644 index 0000000..51b8796 --- /dev/null +++ b/packages/room/src/object/visualization/RoomObjectSprite.ts @@ -0,0 +1,355 @@ +import { AlphaTolerance, IRoomObjectSprite, RoomObjectSpriteType } from '@nitrots/api'; +import { BLEND_MODES, Filter, Texture } from 'pixi.js'; + +export class RoomObjectSprite implements IRoomObjectSprite +{ + private static SPRITE_COUNTER: number = 0; + + private _id: number = RoomObjectSprite.SPRITE_COUNTER++; + private _name: string = ''; + private _type: string = ''; + private _spriteType: number = RoomObjectSpriteType.DEFAULT; + private _texture: Texture = null; + + private _width: number = 0; + private _height: number = 0; + private _offsetX: number = 0; + private _offsetY: number = 0; + private _flipH: boolean = false; + private _flipV: boolean = false; + private _direction: number = 0; + + private _alpha: number = 255; + private _blendMode: BLEND_MODES = 'normal'; + private _color: number = 0xFFFFFF; + private _relativeDepth: number = 0; + private _varyingDepth: boolean = false; + private _libraryAssetName: string = ''; + private _clickHandling: boolean = false; + private _visible: boolean = true; + private _tag: string = ''; + private _posture: string = null; + private _alphaTolerance: number = AlphaTolerance.MATCH_OPAQUE_PIXELS; + private _filters: Filter[] = []; + + private _updateCounter: number = 0; + + public dispose(): void + { + this._texture = null; + this._width = 0; + this._height = 0; + } + + public increaseUpdateCounter(): void + { + this._updateCounter++; + } + + public get id(): number + { + return this._id; + } + + public set id(id: number) + { + this._id = id; + } + + public get name(): string + { + return this._name; + } + + public set name(name: string) + { + if(this._name === name) return; + + this._name = name; + + this._updateCounter++; + } + + public get type(): string + { + return this._type; + } + + public set type(type: string) + { + this._type = type; + } + + public get spriteType(): number + { + return this._spriteType; + } + + public set spriteType(type: number) + { + this._spriteType = type; + } + + public get texture(): Texture + { + return this._texture; + } + + public set texture(texture: Texture) + { + if(this._texture === texture) return; + + if(texture) + { + this._width = texture.width; + this._height = texture.height; + } + + this._texture = texture; + + this._updateCounter++; + } + + public get width(): number + { + return this._width; + } + + public get height(): number + { + return this._height; + } + + public get offsetX(): number + { + return this._offsetX; + } + + public set offsetX(x: number) + { + if(this._offsetX === x) return; + + this._offsetX = x; + + this._updateCounter++; + } + + public get offsetY(): number + { + return this._offsetY; + } + + public set offsetY(y: number) + { + if(this._offsetY === y) return; + + this._offsetY = y; + + this._updateCounter++; + } + + public get flipH(): boolean + { + return this._flipH; + } + + public set flipH(flip: boolean) + { + if(this._flipH === flip) return; + + this._flipH = flip; + + this._updateCounter++; + } + + public get flipV(): boolean + { + return this._flipV; + } + + public set flipV(flip: boolean) + { + if(this._flipV === flip) return; + + this._flipV = flip; + + this._updateCounter++; + } + + public get direction(): number + { + return this._direction; + } + + public set direction(direction: number) + { + this._direction = direction; + } + + public get alpha(): number + { + return this._alpha; + } + + public set alpha(alpha: number) + { + alpha = (alpha & 0xFF); + + if(this._alpha === alpha) return; + + this._alpha = alpha; + + this._updateCounter++; + } + + public get blendMode(): BLEND_MODES + { + return this._blendMode; + } + + public set blendMode(blend: BLEND_MODES) + { + if(this._blendMode === blend) return; + + this._blendMode = blend; + + this._updateCounter++; + } + + public get color(): number + { + return this._color; + } + + public set color(color: number) + { + color = (color & 0xFFFFFF); + + if(this._color === color) return; + + this._color = color; + + this._updateCounter++; + } + + public get relativeDepth(): number + { + return this._relativeDepth; + } + + public set relativeDepth(depth: number) + { + if(this._relativeDepth === depth) return; + + this._relativeDepth = depth; + + this._updateCounter++; + } + + public get varyingDepth(): boolean + { + return this._varyingDepth; + } + + public set varyingDepth(flag: boolean) + { + if(flag === this._varyingDepth) return; + + this._varyingDepth = flag; + + this._updateCounter++; + } + + public get libraryAssetName(): string + { + return this._libraryAssetName; + } + + public set libraryAssetName(value: string) + { + this._libraryAssetName = value; + } + + public get clickHandling(): boolean + { + return this._clickHandling; + } + + public set clickHandling(flag: boolean) + { + this._clickHandling = flag; + } + + public get visible(): boolean + { + return this._visible; + } + + public set visible(visible: boolean) + { + if(this._visible === visible) return; + + this._visible = visible; + + this._updateCounter++; + } + + public get tag(): string + { + return this._tag; + } + + public set tag(tag: string) + { + if(this._tag === tag) return; + + this._tag = tag; + + this._updateCounter++; + } + + public get posture(): string + { + return this._posture; + } + + public set posture(posture: string) + { + if(this._posture === posture) return; + + this._posture = posture; + + this._updateCounter++; + } + + public get alphaTolerance(): number + { + return this._alphaTolerance; + } + + public set alphaTolerance(tolerance: number) + { + if(this._alphaTolerance === tolerance) return; + + this._alphaTolerance = tolerance; + + this._updateCounter++; + } + + public get filters(): Filter[] + { + return this._filters; + } + + public set filters(filters: Filter[]) + { + this._filters = filters; + + this._updateCounter++; + } + + public get updateCounter(): number + { + return this._updateCounter; + } +} diff --git a/packages/room/src/object/visualization/RoomObjectSpriteVisualization.ts b/packages/room/src/object/visualization/RoomObjectSpriteVisualization.ts new file mode 100644 index 0000000..4a6315b --- /dev/null +++ b/packages/room/src/object/visualization/RoomObjectSpriteVisualization.ts @@ -0,0 +1,286 @@ +import { IGraphicAssetCollection, IObjectVisualizationData, IRoomGeometry, IRoomObjectController, IRoomObjectSprite, IRoomObjectSpriteVisualization, RoomObjectSpriteData } from '@nitrots/api'; +import { TextureUtils } from '@nitrots/utils'; +import { Container, Point, Rectangle, Sprite, Texture } from 'pixi.js'; +import { RoomObjectSprite } from './RoomObjectSprite'; + +export class RoomObjectSpriteVisualization implements IRoomObjectSpriteVisualization +{ + private static VISUALIZATION_COUNTER: number = 0; + + private _id: number = RoomObjectSpriteVisualization.VISUALIZATION_COUNTER++; + private _object: IRoomObjectController = null; + private _asset: IGraphicAssetCollection = null; + private _sprites: IRoomObjectSprite[] = []; + + protected _scale: number = -1; + + private _updateObjectCounter: number = -1; + private _updateModelCounter: number = -1; + private _updateSpriteCounter: number = -1; + + public initialize(data: IObjectVisualizationData): boolean + { + return false; + } + + public update(geometry: IRoomGeometry, time: number, update: boolean, skipUpdate: boolean): void + { + return; + } + + protected reset(): void + { + this._scale = -1; + } + + public dispose(): void + { + if(this._sprites) + { + while(this._sprites.length) + { + const sprite = (this._sprites[0] as RoomObjectSprite); + + if(sprite) sprite.dispose(); + + this._sprites.shift(); + } + + this._sprites = null; + } + + this._object = null; + this._asset = null; + } + + public getSprite(index: number): IRoomObjectSprite + { + if((index >= 0) && (index < this._sprites.length)) return this._sprites[index]; + + return null; + } + + public getSpriteList(): RoomObjectSpriteData[] + { + return null; + } + + public createSprite(): IRoomObjectSprite + { + return this.createSpriteAtIndex(this._sprites.length); + } + + public createSpriteAtIndex(index: number): IRoomObjectSprite + { + const sprite = new RoomObjectSprite(); + + if(index >= this._sprites.length) + { + this._sprites.push(sprite); + } + else + { + this._sprites.splice(index, 0, sprite); + } + + return sprite; + } + + protected createSprites(count: number): void + { + while(this._sprites.length > count) + { + const sprite = this._sprites[(this._sprites.length - 1)] as RoomObjectSprite; + + if(sprite) sprite.dispose(); + + this._sprites.pop(); + } + + while(this._sprites.length < count) + { + this._sprites.push(new RoomObjectSprite()); + } + } + + public get image(): Texture + { + return this.getImage(); + } + + public getImage(): Texture + { + const boundingRectangle = this.getBoundingRectangle(); + + if((boundingRectangle.width * boundingRectangle.height) === 0) return null; + + const spriteCount = this.totalSprites; + const spriteList: IRoomObjectSprite[] = []; + + let index = 0; + + while(index < spriteCount) + { + const objectSprite = this.getSprite(index); + + if(objectSprite && objectSprite.visible && objectSprite.texture) spriteList.push(objectSprite); + + index++; + } + + spriteList.sort((a, b) => + { + return b.relativeDepth - a.relativeDepth; + }); + + const container = new Container(); + + index = 0; + + while(index < spriteList.length) + { + const objectSprite = spriteList[index]; + const texture = objectSprite.texture; + + if(texture) + { + const sprite = new Sprite(texture); + + sprite.alpha = (objectSprite.alpha / 255); + sprite.tint = objectSprite.color; + sprite.x = objectSprite.offsetX; + sprite.y = objectSprite.offsetY; + sprite.blendMode = objectSprite.blendMode; + sprite.filters = objectSprite.filters; + + if(objectSprite.flipH) sprite.scale.x = -1; + + if(objectSprite.flipV) sprite.scale.y = -1; + + container.addChild(sprite); + } + + index++; + } + + return TextureUtils.generateTexture({ + target: container + }); + } + + public getBoundingRectangle(): Rectangle + { + const totalSprites = this.totalSprites; + const rectangle = new Rectangle(); + + let iterator = 0; + + while(iterator < totalSprites) + { + const sprite = this.getSprite(iterator); + + if(sprite && sprite.texture && sprite.visible) + { + const offsetX = ((sprite.flipH) ? (-(sprite.width) + sprite.offsetX) : sprite.offsetX); + const offsetY = ((sprite.flipV) ? (-(sprite.height) + sprite.offsetY) : sprite.offsetY); + const point = new Point(offsetX, offsetY); + + if(iterator === 0) + { + rectangle.x = point.x; + rectangle.y = point.y; + rectangle.width = sprite.width; + rectangle.height = sprite.height; + } + else + { + if(point.x < rectangle.x) rectangle.x = point.x; + + if(point.y < rectangle.y) rectangle.y = point.y; + + if((point.x + sprite.width) > rectangle.right) rectangle.width = ((point.x + sprite.width) - rectangle.x); + + if((point.y + sprite.height) > rectangle.bottom) rectangle.height = ((point.y + sprite.height) - rectangle.y); + } + } + + iterator++; + } + + return rectangle; + } + + public get instanceId(): number + { + return this._id; + } + + public get object(): IRoomObjectController + { + return this._object; + } + + public set object(object: IRoomObjectController) + { + this._object = object; + } + + public get asset(): IGraphicAssetCollection + { + return this._asset; + } + + public set asset(asset: IGraphicAssetCollection) + { + if(this._asset) this._asset.removeReference(); + + this._asset = asset; + + if(this._asset) this._asset.addReference(); + } + + public get sprites(): IRoomObjectSprite[] + { + return this._sprites; + } + + public get totalSprites(): number + { + return this._sprites.length; + } + + public get updateObjectCounter(): number + { + return this._updateObjectCounter; + } + + public set updateObjectCounter(count: number) + { + this._updateObjectCounter = count; + } + + public get updateModelCounter(): number + { + return this._updateModelCounter; + } + + public set updateModelCounter(count: number) + { + this._updateModelCounter = count; + } + + public get updateSpriteCounter(): number + { + return this._updateSpriteCounter; + } + + public set updateSpriteCounter(count: number) + { + this._updateSpriteCounter = count; + } + + public get spriteCount(): number + { + return this._sprites.length; + } +} diff --git a/packages/room/src/object/visualization/avatar/AvatarVisualization.ts b/packages/room/src/object/visualization/avatar/AvatarVisualization.ts new file mode 100644 index 0000000..ff09f41 --- /dev/null +++ b/packages/room/src/object/visualization/avatar/AvatarVisualization.ts @@ -0,0 +1,1130 @@ +import { AlphaTolerance, AvatarAction, AvatarGuideStatus, AvatarSetType, IAdvancedMap, IAvatarEffectListener, IAvatarImage, IAvatarImageListener, IGraphicAsset, IObjectVisualizationData, IRoomGeometry, IRoomObject, IRoomObjectModel, RoomObjectSpriteType, RoomObjectVariable } from '@nitrots/api'; +import { GetAssetManager } from '@nitrots/assets'; +import { AdvancedMap } from '@nitrots/utils'; +import { Texture } from 'pixi.js'; +import { RoomObjectSpriteVisualization } from '../RoomObjectSpriteVisualization'; +import { AvatarVisualizationData } from './AvatarVisualizationData'; +import { ExpressionAdditionFactory, FloatingIdleZAddition, GameClickTargetAddition, GuideStatusBubbleAddition, IAvatarAddition, MutedBubbleAddition, NumberBubbleAddition, TypingBubbleAddition } from './additions'; + +export class AvatarVisualization extends RoomObjectSpriteVisualization implements IAvatarImageListener, IAvatarEffectListener +{ + private static AVATAR: string = 'avatar'; + private static FLOATING_IDLE_Z_ID: number = 1; + private static TYPING_BUBBLE_ID: number = 2; + private static EXPRESSION_ID: number = 3; + private static NUMBER_BUBBLE_ID: number = 4; + private static GAME_CLICK_TARGET_ID: number = 5; + private static MUTED_BUBBLE_ID: number = 6; + private static GUIDE_BUBBLE_ID: number = 7; + private static OWN_USER_ID: number = 4; + private static UPDATE_TIME_INCREASER: number = 41; + private static AVATAR_LAYER_ID: number = 0; + private static SHADOW_LAYER_ID: number = 1; + private static SNOWBOARDING_EFFECT: number = 97; + private static INITIAL_RESERVED_SPRITES: number = 2; + private static ANIMATION_FRAME_UPDATE_INTERVAL: number = 2; + private static DEFAULT_CANVAS_OFFSETS: number[] = [0, 0, 0]; + private static MAX_EFFECT_CACHE: number = 2; + private static SPRITE_INDEX_AVATAR: number = 0; + private static BASE_Y_SCALE: number = 1000; + private static AVATAR_SPRITE_DEFAULT_DEPTH: number = -0.01; + private static AVATAR_OWN_DEPTH_ADJUST: number = 0.001; + private static AVATAR_SPRITE_LAYING_DEPTH: number = -0.409; + + protected _data: AvatarVisualizationData; + + private _avatarImage: IAvatarImage; + private _cachedAvatars: IAdvancedMap; + private _cachedAvatarEffects: IAdvancedMap; + private _shadow: IGraphicAsset; + private _lastUpdate: number; + private _disposed: boolean; + + private _figure: string; + private _gender: string; + private _direction: number; + private _headDirection: number; + private _posture: string; + private _postureParameter: string; + private _canStandUp: boolean; + private _postureOffset: number; + private _verticalOffset: number; + private _angle: number; + private _headAngle: number; + private _talk: boolean; + private _expression: number; + private _sleep: boolean; + private _blink: boolean; + private _gesture: number; + private _sign: number; + private _highlightEnabled: boolean; + private _highlight: boolean; + private _dance: number; + private _effect: number; + private _carryObject: number; + private _useObject: number; + private _ownUser: boolean; + + private _isLaying: boolean; + private _layInside: boolean; + private _isAnimating: boolean; + private _extraSpritesStartIndex: number; + private _forcedAnimFrames: number; + private _updatesUntilFrameUpdate: number; + + private _isAvatarReady: boolean; + private _needsUpdate: boolean; + private _geometryUpdateCounter: number; + + private _additions: Map; + + constructor() + { + super(); + + this._data = null; + + this._avatarImage = null; + this._cachedAvatars = new AdvancedMap(); + this._cachedAvatarEffects = new AdvancedMap(); + this._shadow = null; + this._lastUpdate = -1000; + this._disposed = false; + + this._figure = null; + this._gender = null; + this._direction = -1; + this._headDirection = -1; + this._posture = ''; + this._postureParameter = ''; + this._canStandUp = false; + this._postureOffset = 0; + this._verticalOffset = 0; + this._angle = -1; + this._headAngle = -1; + this._talk = false; + this._expression = 0; + this._sleep = false; + this._blink = false; + this._gesture = 0; + this._sign = -1; + this._highlightEnabled = false; + this._highlight = false; + this._dance = 0; + this._effect = 0; + this._carryObject = 0; + this._useObject = 0; + this._ownUser = false; + + this._isLaying = false; + this._layInside = false; + this._isAnimating = false; + this._extraSpritesStartIndex = 2; + this._forcedAnimFrames = 0; + this._updatesUntilFrameUpdate = 0; + + this._isAvatarReady = false; + this._needsUpdate = false; + this._geometryUpdateCounter = -1; + + this._additions = new Map(); + } + + public initialize(data: IObjectVisualizationData): boolean + { + if(!(data instanceof AvatarVisualizationData)) return false; + + this._data = data; + + this.createSprites(AvatarVisualization.INITIAL_RESERVED_SPRITES); + + super.initialize(data); + + return true; + } + + public dispose(): void + { + if(this._disposed) return; + + super.dispose(); + + if(this._avatarImage) this._avatarImage.dispose(); + + this._shadow = null; + this._disposed = true; + } + + public update(geometry: IRoomGeometry, time: number, update: boolean, skipUpdate: boolean): void + { + if(!this.object || !geometry || !this._data) return; + + if(time < (this._lastUpdate + AvatarVisualization.UPDATE_TIME_INCREASER)) return; + + this._lastUpdate += AvatarVisualization.UPDATE_TIME_INCREASER; + + if((this._lastUpdate + AvatarVisualization.UPDATE_TIME_INCREASER) < time) this._lastUpdate = (time - AvatarVisualization.UPDATE_TIME_INCREASER); + + const model = this.object.model; + const scale = geometry.scale; + const effect = this._effect; + + let didScaleUpdate = false; + let didEffectUpdate = false; + let otherUpdate = false; + let objectUpdate = false; + + const updateModel = this.updateModel(model, scale); + + if((updateModel || (scale !== this._scale)) || !this._avatarImage) + { + if(scale !== this._scale) + { + didScaleUpdate = true; + + this.updateScale(scale); + } + + if(effect !== this._effect) didEffectUpdate = true; + + if(didScaleUpdate || !this._avatarImage || didEffectUpdate) + { + this._avatarImage = this.createAvatarImage(scale, this._effect); + + if(!this._avatarImage) return; + + otherUpdate = true; + + const sprite = this.getSprite(AvatarVisualization.AVATAR_LAYER_ID); + + if((sprite && this._avatarImage) && this._avatarImage.isPlaceholder()) + { + sprite.alpha = 150; + } + + else if(sprite) + { + sprite.alpha = 255; + } + } + + if(!this._avatarImage) return; + + if(didEffectUpdate && this._avatarImage.animationHasResetOnToggle) this._avatarImage.resetAnimationFrameCounter(); + + this.updateShadow(scale); + + objectUpdate = this.updateObject(this.object, geometry, update, true); + + this.processActionsForAvatar(this._avatarImage); + + if(this._additions) + { + let index = this._extraSpritesStartIndex; + + for(const addition of this._additions.values()) + { + addition.update(this.getSprite(index++), scale); + } + } + + this._scale = scale; + } + else + { + objectUpdate = this.updateObject(this.object, geometry, update); + } + + if(this._additions) + { + let index = this._extraSpritesStartIndex; + + for(const addition of this._additions.values()) + { + if(addition.animate(this.getSprite(index++))) this.updateSpriteCounter++; + } + } + + const update1 = (objectUpdate || updateModel || didScaleUpdate); + const update2 = ((this._isAnimating || (this._forcedAnimFrames > 0)) && update); + + if(update1) this._forcedAnimFrames = AvatarVisualization.ANIMATION_FRAME_UPDATE_INTERVAL; + + if(update1 || update2) + { + this.updateSpriteCounter++; + + this._forcedAnimFrames--; + this._updatesUntilFrameUpdate--; + + if((((this._updatesUntilFrameUpdate <= 0) || didScaleUpdate) || updateModel) || otherUpdate) + { + this._avatarImage.updateAnimationByFrames(1); + + this._updatesUntilFrameUpdate = AvatarVisualization.ANIMATION_FRAME_UPDATE_INTERVAL; + } + else + { + return; + } + + let _local_20 = this._avatarImage.getCanvasOffsets(); + + if(!_local_20 || (_local_20.length < 3)) _local_20 = AvatarVisualization.DEFAULT_CANVAS_OFFSETS; + + const sprite = this.getSprite(AvatarVisualization.SPRITE_INDEX_AVATAR); + + if(sprite) + { + const highlightEnabled = ((this.object.model.getValue(RoomObjectVariable.FIGURE_HIGHLIGHT_ENABLE) === 1) && (this.object.model.getValue(RoomObjectVariable.FIGURE_HIGHLIGHT) === 1)); + const avatarImage = this._avatarImage.processAsTexture(AvatarSetType.FULL, highlightEnabled); + + if(avatarImage) + { + sprite.texture = avatarImage; + + if(highlightEnabled) + { + // sprite.filters = [ + // new GlowFilter({ + // color: 0xFFFFFF, + // distance: 6 + // }) + // ]; + } + else + { + sprite.filters = []; + } + } + + if(sprite.texture) + { + sprite.offsetX = ((((-1 * scale) / 2) + _local_20[0]) - ((sprite.texture.width - scale) / 2)); + sprite.offsetY = (((-(sprite.texture.height) + (scale / 4)) + _local_20[1]) + this._postureOffset); + } + + if(this._isLaying) + { + if(this._layInside) sprite.relativeDepth = -0.5; + else sprite.relativeDepth = (AvatarVisualization.AVATAR_SPRITE_LAYING_DEPTH + _local_20[2]); + } + else + { + sprite.relativeDepth = (AvatarVisualization.AVATAR_SPRITE_DEFAULT_DEPTH + _local_20[2]); + } + + if(this._ownUser) + { + sprite.relativeDepth -= AvatarVisualization.AVATAR_OWN_DEPTH_ADJUST; + sprite.spriteType = RoomObjectSpriteType.AVATAR_OWN; + } + else + { + sprite.spriteType = RoomObjectSpriteType.AVATAR; + } + } + + const typingBubble = this.getAddition(AvatarVisualization.TYPING_BUBBLE_ID) as TypingBubbleAddition; + + if(typingBubble) + { + if(!this._isLaying) typingBubble.relativeDepth = ((AvatarVisualization.AVATAR_SPRITE_DEFAULT_DEPTH - 0.01) + _local_20[2]); + else typingBubble.relativeDepth = ((AvatarVisualization.AVATAR_SPRITE_LAYING_DEPTH - 0.01) + _local_20[2]); + } + + this._isAnimating = this._avatarImage.isAnimating(); + + let _local_21 = AvatarVisualization.INITIAL_RESERVED_SPRITES; + const direction = this._avatarImage.getDirection(); + + for(const spriteData of this._avatarImage.getSprites()) + { + if(spriteData.id === AvatarVisualization.AVATAR) + { + const sprite = this.getSprite(AvatarVisualization.SPRITE_INDEX_AVATAR); + + if(sprite) + { + const layerData = this._avatarImage.getLayerData(spriteData); + + let offsetX = spriteData.getDirectionOffsetX(direction); + let offsetY = spriteData.getDirectionOffsetY(direction); + + if(layerData) + { + offsetX += layerData.dx; + offsetY += layerData.dy; + } + + if(scale < 48) + { + offsetX /= 2; + offsetY /= 2; + } + + if(!this._canStandUp) + { + sprite.offsetX += offsetX; + sprite.offsetY += offsetY; + } + } + } + else + { + const sprite = this.getSprite(_local_21); + + if(sprite) + { + sprite.alphaTolerance = AlphaTolerance.MATCH_NOTHING; + sprite.visible = true; + + const layerData = this._avatarImage.getLayerData(spriteData); + + let frameNumber = 0; + let offsetX = spriteData.getDirectionOffsetX(direction); + let offsetY = spriteData.getDirectionOffsetY(direction); + const offsetZ = spriteData.getDirectionOffsetZ(direction); + let dd = 0; + + if(spriteData.hasDirections) dd = direction; + + if(layerData) + { + frameNumber = layerData.animationFrame; + offsetX += layerData.dx; + offsetY += layerData.dy; + dd += layerData.dd; + } + + if(scale < 48) + { + offsetX /= 2; + offsetY /= 2; + } + + if(dd < 0) dd += 8; + else + { + if(dd > 7) dd -= 8; + } + + const assetName = ((((((this._avatarImage.getScale() + '_') + spriteData.member) + '_') + dd) + '_') + frameNumber); + + const asset = GetAssetManager().getAsset(assetName); + + if(!asset) continue; + + sprite.texture = asset.texture; + sprite.offsetX = ((asset.offsetX - (scale / 2)) + offsetX); + sprite.offsetY = (asset.offsetY + offsetY); + sprite.flipH = asset.flipH; + + if(spriteData.hasStaticY) + { + sprite.offsetY += ((this._verticalOffset * scale) / (2 * AvatarVisualization.BASE_Y_SCALE)); + } + else + { + sprite.offsetY += this._postureOffset; + } + + if(this._isLaying) + { + sprite.relativeDepth = (AvatarVisualization.AVATAR_SPRITE_LAYING_DEPTH - ((0.001 * this.totalSprites) * offsetZ)); + } + else + { + sprite.relativeDepth = (AvatarVisualization.AVATAR_SPRITE_DEFAULT_DEPTH - ((0.001 * this.totalSprites) * offsetZ)); + } + + if(spriteData.ink === 33) sprite.blendMode = 'add'; + else sprite.blendMode = 'normal'; + } + + _local_21++; + } + } + } + } + + private createAvatarImage(scale: number, effectId: number): IAvatarImage + { + let cachedImage: IAvatarImage = null; + let imageName = 'avatarImage' + scale.toString(); + + if(!effectId) + { + cachedImage = this._cachedAvatars.getValue(imageName); + } + else + { + imageName += '-' + effectId; + + cachedImage = this._cachedAvatarEffects.getValue(imageName); + } + + if(!cachedImage) + { + cachedImage = this._data.createAvatarImage(this._figure, scale, this._gender, this, this); + + if(cachedImage) + { + if(!effectId) + { + this._cachedAvatars.add(imageName, cachedImage); + } + + else + { + if(this._cachedAvatarEffects.length >= AvatarVisualization.MAX_EFFECT_CACHE) + { + const cached = this._cachedAvatarEffects.remove(this._cachedAvatarEffects.getKey(0)); + + if(cached) cached.dispose(); + } + + this._cachedAvatarEffects.add(imageName, cachedImage); + } + } + } + + return cachedImage; + } + + protected updateObject(object: IRoomObject, geometry: IRoomGeometry, update: boolean, _arg_4: boolean = false): boolean + { + if((!_arg_4 && (this.updateObjectCounter === object.updateCounter)) && (this._geometryUpdateCounter === geometry.updateId)) return false; + + let direction = (object.getDirection().x - geometry.direction.x); + let headDirection = (this._headDirection - geometry.direction.x); + + if(this._posture === 'float') headDirection = direction; + + direction = (((direction % 360) + 360) % 360); + headDirection = (((headDirection % 360) + 360) % 360); + + if((this._posture === 'sit') && this._canStandUp) + { + direction -= ((direction % 90) - 45); + headDirection -= ((headDirection % 90) - 45); + } + + if((direction !== this._angle) || _arg_4) + { + update = true; + + this._angle = direction; + + direction = (direction - (135 - 22.5)); + direction = ((direction + 360) % 360); + + this._avatarImage.setDirectionAngle(AvatarSetType.FULL, direction); + } + + if((headDirection !== this._headAngle) || _arg_4) + { + update = true; + + this._headAngle = headDirection; + + if(this._headAngle !== this._angle) + { + headDirection = (headDirection - (135 - 22.5)); + headDirection = ((headDirection + 360) % 360); + + this._avatarImage.setDirectionAngle(AvatarSetType.HEAD, headDirection); + } + } + + this._geometryUpdateCounter = geometry.updateId; + + this.updateObjectCounter = this.object.updateCounter; + + return update; + } + + protected updateModel(model: IRoomObjectModel, scale: number): boolean + { + if(!model) return false; + + if(this.updateModelCounter === model.updateCounter) return false; + + let needsUpdate = false; + + const talk = (model.getValue(RoomObjectVariable.FIGURE_TALK) > 0); + + if(talk !== this._talk) + { + this._talk = talk; + + needsUpdate = true; + } + + const expression = model.getValue(RoomObjectVariable.FIGURE_EXPRESSION); + + if(expression !== this._expression) + { + this._expression = expression; + + needsUpdate = true; + } + + const sleep = (model.getValue(RoomObjectVariable.FIGURE_SLEEP) > 0); + + if(sleep !== this._sleep) + { + this._sleep = sleep; + + needsUpdate = true; + } + + const blink = (model.getValue(RoomObjectVariable.FIGURE_BLINK) > 0); + + if(blink !== this._blink) + { + this._blink = blink; + + needsUpdate = true; + } + + const gesture = (model.getValue(RoomObjectVariable.FIGURE_GESTURE) || 0); + + if(gesture !== this._gesture) + { + this._gesture = gesture; + + needsUpdate = true; + } + + const posture = model.getValue(RoomObjectVariable.FIGURE_POSTURE); + + if(posture !== this._posture) + { + this._posture = posture; + + needsUpdate = true; + } + + const postureParameter = model.getValue(RoomObjectVariable.FIGURE_POSTURE_PARAMETER); + + if(postureParameter !== this._postureParameter) + { + this._postureParameter = postureParameter; + + needsUpdate = true; + } + + const canStandUp = model.getValue(RoomObjectVariable.FIGURE_CAN_STAND_UP); + + if(canStandUp !== this._canStandUp) + { + this._canStandUp = canStandUp; + + needsUpdate = true; + } + + const verticalOffset = (model.getValue(RoomObjectVariable.FIGURE_VERTICAL_OFFSET) * AvatarVisualization.BASE_Y_SCALE); + + if(verticalOffset !== this._verticalOffset) + { + this._verticalOffset = verticalOffset; + + needsUpdate = true; + } + + const dance = (model.getValue(RoomObjectVariable.FIGURE_DANCE) || 0); + + if(dance !== this._dance) + { + this._dance = dance; + + needsUpdate = true; + } + + const effect = (model.getValue(RoomObjectVariable.FIGURE_EFFECT) || 0); + + if(effect !== this._effect) + { + this._effect = effect; + + needsUpdate = true; + } + + const carryObject = (model.getValue(RoomObjectVariable.FIGURE_CARRY_OBJECT) || 0); + + if(carryObject !== this._carryObject) + { + this._carryObject = carryObject; + + needsUpdate = true; + } + + const useObject = (model.getValue(RoomObjectVariable.FIGURE_USE_OBJECT) || 0); + + if(useObject !== this._useObject) + { + this._useObject = useObject; + + needsUpdate = true; + } + + const headDirection = model.getValue(RoomObjectVariable.HEAD_DIRECTION); + + if(headDirection !== this._headDirection) + { + this._headDirection = headDirection; + + needsUpdate = true; + } + + if((this._carryObject > 0) && (useObject > 0)) + { + if(this._useObject !== this._carryObject) + { + this._useObject = this._carryObject; + + needsUpdate = true; + } + } + else + { + if(this._useObject !== 0) + { + this._useObject = 0; + + needsUpdate = true; + } + } + + let idleAddition = this.getAddition(AvatarVisualization.FLOATING_IDLE_Z_ID); + + if(this._sleep) + { + if(!idleAddition) idleAddition = this.addAddition(new FloatingIdleZAddition(AvatarVisualization.FLOATING_IDLE_Z_ID, this)); + + needsUpdate = true; + } + else + { + if(idleAddition) this.removeAddition(AvatarVisualization.FLOATING_IDLE_Z_ID); + } + + const isMuted = (model.getValue(RoomObjectVariable.FIGURE_IS_MUTED) > 0); + + let mutedAddition = this.getAddition(AvatarVisualization.MUTED_BUBBLE_ID); + + if(isMuted) + { + if(!mutedAddition) mutedAddition = this.addAddition(new MutedBubbleAddition(AvatarVisualization.MUTED_BUBBLE_ID, this)); + + needsUpdate = true; + } + else + { + if(mutedAddition) + { + this.removeAddition(AvatarVisualization.MUTED_BUBBLE_ID); + + needsUpdate = true; + } + + const isTyping = (model.getValue(RoomObjectVariable.FIGURE_IS_TYPING) > 0); + + let typingAddition = this.getAddition(AvatarVisualization.TYPING_BUBBLE_ID); + + if(isTyping) + { + if(!typingAddition) typingAddition = this.addAddition(new TypingBubbleAddition(AvatarVisualization.TYPING_BUBBLE_ID, this)); + + needsUpdate = true; + } + else + { + if(typingAddition) + { + this.removeAddition(AvatarVisualization.TYPING_BUBBLE_ID); + + needsUpdate = true; + } + } + } + + const guideStatusValue = (model.getValue(RoomObjectVariable.FIGURE_GUIDE_STATUS) || 0); + + if(guideStatusValue !== AvatarGuideStatus.NONE) + { + this.removeAddition(AvatarVisualization.GUIDE_BUBBLE_ID); + this.addAddition(new GuideStatusBubbleAddition(AvatarVisualization.GUIDE_BUBBLE_ID, this, guideStatusValue)); + + needsUpdate = true; + } + else + { + if(this.getAddition(AvatarVisualization.GUIDE_BUBBLE_ID)) + { + this.removeAddition(AvatarVisualization.GUIDE_BUBBLE_ID); + + needsUpdate = true; + } + } + + const isPlayingGame = (model.getValue(RoomObjectVariable.FIGURE_IS_PLAYING_GAME) > 0); + + let gameClickAddition = this.getAddition(AvatarVisualization.GAME_CLICK_TARGET_ID); + + if(isPlayingGame) + { + if(!gameClickAddition) gameClickAddition = this.addAddition(new GameClickTargetAddition(AvatarVisualization.GAME_CLICK_TARGET_ID)); + + needsUpdate = true; + } + else + { + if(gameClickAddition) this.removeAddition(AvatarVisualization.GAME_CLICK_TARGET_ID); + } + + const numberValue = model.getValue(RoomObjectVariable.FIGURE_NUMBER_VALUE); + + let numberAddition = this.getAddition(AvatarVisualization.NUMBER_BUBBLE_ID); + + if(numberValue > 0) + { + if(!numberAddition) numberAddition = this.addAddition(new NumberBubbleAddition(AvatarVisualization.NUMBER_BUBBLE_ID, numberValue, this)); + + needsUpdate = true; + } + else + { + if(numberAddition) this.removeAddition(AvatarVisualization.NUMBER_BUBBLE_ID); + } + + let expressionAddition = this.getAddition(AvatarVisualization.EXPRESSION_ID); + + if(this._expression > 0) + { + if(!expressionAddition) + { + expressionAddition = ExpressionAdditionFactory.getExpressionAddition(AvatarVisualization.EXPRESSION_ID, this._expression, this); + + if(expressionAddition) this.addAddition(expressionAddition); + } + } + else + { + if(expressionAddition) this.removeAddition(AvatarVisualization.EXPRESSION_ID); + } + + this.updateScale(scale); + + const gender = model.getValue(RoomObjectVariable.GENDER); + + if(gender !== this._gender) + { + this._gender = gender; + + needsUpdate = true; + } + + if(this.updateFigure(model.getValue(RoomObjectVariable.FIGURE))) needsUpdate = true; + + let sign = model.getValue(RoomObjectVariable.FIGURE_SIGN); + + if(sign === null) sign = -1; + + if(this._sign !== sign) + { + this._sign = sign; + + needsUpdate = true; + } + + const highlightEnabled = (model.getValue(RoomObjectVariable.FIGURE_HIGHLIGHT_ENABLE) > 0); + + if(highlightEnabled !== this._highlightEnabled) + { + this._highlightEnabled = highlightEnabled; + + needsUpdate = true; + } + + if(this._highlightEnabled) + { + const highlight = (model.getValue(RoomObjectVariable.FIGURE_HIGHLIGHT) > 0); + + if(highlight !== this._highlight) + { + this._highlight = highlight; + + needsUpdate = true; + } + } + + const ownUser = (model.getValue(RoomObjectVariable.OWN_USER) > 0); + + if(ownUser !== this._ownUser) + { + this._ownUser = ownUser; + + needsUpdate = true; + } + + this.updateModelCounter = model.updateCounter; + + return needsUpdate; + } + + protected setDirection(direction: number): void + { + if(this._direction === direction) return; + + this._direction = direction; + + this._needsUpdate = true; + } + + private updateScale(scale: number): void + { + if(scale < 48) this._blink = false; + + if((this._posture === 'sit') || (this._posture === 'lay')) + { + this._postureOffset = (scale / 2); + } + else + { + this._postureOffset = 0; + } + + this._layInside = false; + this._isLaying = false; + + if(this._posture === 'lay') + { + this._isLaying = true; + + const _local_2 = parseInt(this._postureParameter); + + if(_local_2 < 0) this._layInside = true; + } + } + + private processActionsForAvatar(avatar: IAvatarImage): void + { + if(!avatar) return; + + avatar.initActionAppends(); + + avatar.appendAction(AvatarAction.POSTURE, this._posture, this._postureParameter); + + if(this._gesture > 0) this._avatarImage.appendAction(AvatarAction.GESTURE, AvatarAction.getGesture(this._gesture)); + + if(this._dance > 0) this._avatarImage.appendAction(AvatarAction.DANCE, this._dance); + + if(this._sign > -1) this._avatarImage.appendAction(AvatarAction.SIGN, this._sign); + + if(this._carryObject > 0) this._avatarImage.appendAction(AvatarAction.CARRY_OBJECT, this._carryObject); + + if(this._useObject > 0) this._avatarImage.appendAction(AvatarAction.USE_OBJECT, this._useObject); + + if(this._talk) this._avatarImage.appendAction(AvatarAction.TALK); + + if(this._sleep || this._blink) this._avatarImage.appendAction(AvatarAction.SLEEP); + + if(this._expression > 0) + { + const expression = AvatarAction.getExpression(this._expression); + + if(expression !== '') + { + switch(expression) + { + case AvatarAction.DANCE: + this._avatarImage.appendAction(AvatarAction.DANCE, 2); + break; + default: + this._avatarImage.appendAction(expression); + break; + } + } + } + + if(this._effect > 0) this._avatarImage.appendAction(AvatarAction.EFFECT, this._effect); + + avatar.endActionAppends(); + + this._isAnimating = avatar.isAnimating(); + + let spriteCount = AvatarVisualization.INITIAL_RESERVED_SPRITES; + + for(const sprite of this._avatarImage.getSprites()) + { + if(sprite.id !== AvatarVisualization.AVATAR) spriteCount++; + } + + if(spriteCount !== this.totalSprites) this.createSprites(spriteCount); + + this._extraSpritesStartIndex = spriteCount; + + if(this._additions) + { + for(const addition of this._additions.values()) this.createSprite(); + } + } + + private updateFigure(figure: string): boolean + { + if(this._figure === figure) return false; + + this._figure = figure; + + this.clearAvatar(); + + return true; + } + + public resetFigure(figure: string): void + { + this.clearAvatar(); + } + + public resetEffect(effect: number): void + { + this.clearAvatar(); + } + + private clearAvatar(): void + { + const sprite = this.getSprite(AvatarVisualization.AVATAR_LAYER_ID); + + if(sprite) + { + sprite.texture = Texture.EMPTY; + sprite.alpha = 255; + } + + for(const avatar of this._cachedAvatars.getValues()) avatar && avatar.dispose(); + + for(const avatar of this._cachedAvatarEffects.getValues()) avatar && avatar.dispose(); + + this._cachedAvatars.reset(); + this._cachedAvatarEffects.reset(); + + this._avatarImage = null; + } + + private getAddition(id: number): IAvatarAddition + { + if(!this._additions) return null; + + const existing = this._additions.get(id); + + if(!existing) return null; + + return existing; + } + + private addAddition(addition: IAvatarAddition): IAvatarAddition + { + const existing = this.getAddition(addition.id); + + if(existing) return; + + this._additions.set(addition.id, addition); + + return addition; + } + + private removeAddition(id: number): void + { + const addition = this.getAddition(id); + + if(!addition) return; + + this._additions.delete(addition.id); + + addition.dispose(); + } + + private updateShadow(scale: number): void + { + this._shadow = null; + + const sprite = this.getSprite(AvatarVisualization.SHADOW_LAYER_ID); + + if(!sprite) return; + + let hasShadow = (((this._posture === 'mv') || (this._posture === 'std')) || ((this._posture === 'sit') && this._canStandUp)); + + if(this._effect === AvatarVisualization.SNOWBOARDING_EFFECT) hasShadow = false; + + if(hasShadow) + { + sprite.visible = true; + + if(!this._shadow || (scale !== this._scale)) + { + let offsetX = 0; + let offsetY = 0; + + if(scale < 48) + { + sprite.libraryAssetName = 'sh_std_sd_1_0_0'; + + this._shadow = GetAssetManager().getAsset(sprite.libraryAssetName); + + offsetX = -8; + offsetY = ((this._canStandUp) ? 6 : -3); + } + else + { + sprite.libraryAssetName = 'h_std_sd_1_0_0'; + + this._shadow = GetAssetManager().getAsset(sprite.libraryAssetName); + + offsetX = -17; + offsetY = ((this._canStandUp) ? 10 : -7); + } + + if(this._shadow) + { + sprite.texture = this._shadow.texture; + sprite.offsetX = offsetX; + sprite.offsetY = offsetY; + sprite.alpha = 50; + sprite.relativeDepth = 1; + } + else + { + sprite.visible = false; + } + } + } + else + { + this._shadow = null; + + sprite.visible = false; + } + } + + public get direction(): number + { + return this._direction; + } + + public get posture(): string + { + return this._posture; + } + + public get angle(): number + { + return this._angle; + } + + public get disposed(): boolean + { + return this._disposed; + } +} diff --git a/packages/room/src/object/visualization/avatar/AvatarVisualizationData.ts b/packages/room/src/object/visualization/avatar/AvatarVisualizationData.ts new file mode 100644 index 0000000..ec4b769 --- /dev/null +++ b/packages/room/src/object/visualization/avatar/AvatarVisualizationData.ts @@ -0,0 +1,29 @@ +import { AvatarScaleType, IAssetData, IAvatarEffectListener, IAvatarImage, IAvatarImageListener, IObjectVisualizationData } from '@nitrots/api'; +import { GetAvatarRenderManager } from '@nitrots/avatar'; + +export class AvatarVisualizationData implements IObjectVisualizationData +{ + public initialize(asset: IAssetData): boolean + { + return true; + } + + public dispose(): void + { + } + + public createAvatarImage(figure: string, size: number, gender: string = null, avatarListener: IAvatarImageListener = null, effectListener: IAvatarEffectListener = null): IAvatarImage + { + let avatarImage: IAvatarImage = null; + + if(size > 48) avatarImage = GetAvatarRenderManager().createAvatarImage(figure, AvatarScaleType.LARGE, gender, avatarListener, effectListener); + else avatarImage = GetAvatarRenderManager().createAvatarImage(figure, AvatarScaleType.SMALL, gender, avatarListener, effectListener); + + return avatarImage; + } + + public get layerCount(): number + { + return 0; + } +} diff --git a/packages/room/src/object/visualization/avatar/additions/ExpressionAddition.ts b/packages/room/src/object/visualization/avatar/additions/ExpressionAddition.ts new file mode 100644 index 0000000..cc54267 --- /dev/null +++ b/packages/room/src/object/visualization/avatar/additions/ExpressionAddition.ts @@ -0,0 +1,42 @@ +import { IRoomObjectSprite } from '@nitrots/api'; +import { AvatarVisualization } from '../AvatarVisualization'; +import { IExpressionAddition } from './IExpressionAddition'; + +export class ExpressionAddition implements IExpressionAddition +{ + constructor( + private _id: number, + private _type: number, + private _visualization: AvatarVisualization) + {} + + public dispose(): void + { + this._visualization = null; + } + + public update(sprite: IRoomObjectSprite, scale: number): void + { + return; + } + + public animate(sprite: IRoomObjectSprite): boolean + { + return false; + } + + public get id(): number + { + return this._id; + } + + public get type(): number + { + return this._type; + } + + public get visualization(): AvatarVisualization + { + return this._visualization; + } +} diff --git a/packages/room/src/object/visualization/avatar/additions/ExpressionAdditionFactory.ts b/packages/room/src/object/visualization/avatar/additions/ExpressionAdditionFactory.ts new file mode 100644 index 0000000..7276544 --- /dev/null +++ b/packages/room/src/object/visualization/avatar/additions/ExpressionAdditionFactory.ts @@ -0,0 +1,22 @@ +import { AvatarVisualization } from '../AvatarVisualization'; +import { ExpressionAddition } from './ExpressionAddition'; +import { FloatingHeartAddition } from './FloatingHeartAddition'; +import { IExpressionAddition } from './IExpressionAddition'; + +export class ExpressionAdditionFactory +{ + public static WAVE: number = 1; + public static BLOW: number = 2; + public static LAUGH: number = 3; + public static CRY: number = 4; + public static IDLE: number = 5; + + public static getExpressionAddition(id: number, type: number, visualization: AvatarVisualization): IExpressionAddition + { + switch(type) + { + case this.BLOW: return new FloatingHeartAddition(id, this.BLOW, visualization); + default: return new ExpressionAddition(id, type, visualization); + } + } +} \ No newline at end of file diff --git a/packages/room/src/object/visualization/avatar/additions/FloatingHeartAddition.ts b/packages/room/src/object/visualization/avatar/additions/FloatingHeartAddition.ts new file mode 100644 index 0000000..3de2568 --- /dev/null +++ b/packages/room/src/object/visualization/avatar/additions/FloatingHeartAddition.ts @@ -0,0 +1,157 @@ +import { AvatarAction, IRoomObjectSprite } from '@nitrots/api'; +import { GetAssetManager } from '@nitrots/assets'; +import { GetTickerTime } from '@nitrots/utils'; +import { Texture } from 'pixi.js'; +import { ExpressionAddition } from './ExpressionAddition'; + +export class FloatingHeartAddition extends ExpressionAddition +{ + private static DELAY_BEFORE_ANIMATION: number = 300; + private static STATE_DELAY: number = 0; + private static STATE_FADE_IN: number = 1; + private static STATE_FLOAT: number = 2; + private static STATE_COMPLETE: number = 3; + + private _asset: Texture = null; + private _startTime: number = GetTickerTime(); + private _delta: number = 0; + private _offsetY: number = 0; + private _scale: number = 0; + private _state: number = 0; + + public update(sprite: IRoomObjectSprite, scale: number): void + { + if(!sprite) return; + + this._scale = scale; + + let additionScale = 64; + let offsetX = 0; + + if(scale < 48) + { + this._asset = GetAssetManager().getTexture('avatar_addition_user_blowkiss_small'); + + if((this.visualization.angle === 90) || (this.visualization.angle === 270)) + { + offsetX = 0; + } + + else if((this.visualization.angle === 135) || (this.visualization.angle === 180) || (this.visualization.angle === 225)) + { + offsetX = 6; + } + + else offsetX = -6; + + this._offsetY = -38; + + additionScale = 32; + } + else + { + this._asset = GetAssetManager().getTexture('avatar_addition_user_blowkiss'); + + if((this.visualization.angle === 90) || (this.visualization.angle === 270)) + { + offsetX = -3; + } + + else if((this.visualization.angle === 135) || (this.visualization.angle === 180) || (this.visualization.angle === 225)) + { + offsetX = 22; + } + + else offsetX = -30; + + this._offsetY = -70; + } + + if(this.visualization.posture === AvatarAction.POSTURE_SIT) + { + this._offsetY += (additionScale / 2); + } + + else if(this.visualization.posture === AvatarAction.POSTURE_LAY) + { + this._offsetY += additionScale; + } + + if(this._asset) + { + sprite.texture = this._asset; + sprite.offsetX = offsetX; + sprite.offsetY = this._offsetY; + sprite.relativeDepth = -0.02; + sprite.alpha = 0; + + const delta = this._delta; + + this.animate(sprite); + + this._delta = delta; + } + } + + public animate(sprite: IRoomObjectSprite): boolean + { + if(!sprite) return false; + + if(this._asset) sprite.texture = this._asset; + + if(this._state === FloatingHeartAddition.STATE_DELAY) + { + if((GetTickerTime() - this._startTime) < FloatingHeartAddition.DELAY_BEFORE_ANIMATION) return false; + + this._state = FloatingHeartAddition.STATE_FADE_IN; + + sprite.alpha = 0; + sprite.visible = true; + + this._delta = 0; + + return true; + } + + if(this._state === FloatingHeartAddition.STATE_FADE_IN) + { + this._delta += 0.1; + + sprite.offsetY = this._offsetY; + sprite.alpha = (Math.pow(this._delta, 0.9) * 255); + + if(this._delta >= 1) + { + sprite.alpha = 255; + + this._delta = 0; + this._state = FloatingHeartAddition.STATE_FLOAT; + } + + return true; + } + + if(this._state === FloatingHeartAddition.STATE_FLOAT) + { + const alpha = Math.pow(this._delta, 0.9); + + this._delta += 0.05; + + const offset = ((this._scale < 48) ? -30 : -40); + + sprite.offsetY = (this._offsetY + (((this._delta < 1) ? alpha : 1) * offset)); + sprite.alpha = ((1 - alpha) * 255); + + if(sprite.alpha <= 0) + { + sprite.visible = false; + + this._state = FloatingHeartAddition.STATE_COMPLETE; + } + + return true; + } + + return false; + } +} diff --git a/packages/room/src/object/visualization/avatar/additions/FloatingIdleZAddition.ts b/packages/room/src/object/visualization/avatar/additions/FloatingIdleZAddition.ts new file mode 100644 index 0000000..820b8a6 --- /dev/null +++ b/packages/room/src/object/visualization/avatar/additions/FloatingIdleZAddition.ts @@ -0,0 +1,155 @@ +import { AvatarAction, IRoomObjectSprite } from '@nitrots/api'; +import { GetAssetManager } from '@nitrots/assets'; +import { GetTickerTime } from '@nitrots/utils'; +import { Texture } from 'pixi.js'; +import { AvatarVisualization } from '../AvatarVisualization'; +import { IAvatarAddition } from './IAvatarAddition'; + +export class FloatingIdleZAddition implements IAvatarAddition +{ + private static DELAY_BEFORE_ANIMATION: number = 2000; + private static DELAY_PER_FRAME: number = 2000; + private static STATE_DELAY: number = 0; + private static STATE_FRAME_A: number = 1; + private static STATE_FRAME_B: number = 2; + + private _asset: Texture = null; + private _startTime: number = GetTickerTime(); + private _offsetY: number = 0; + private _scale: number = 0; + private _state: number = 0; + + constructor( + private _id: number, + private _visualization: AvatarVisualization) + {} + + public dispose(): void + { + this._visualization = null; + this._asset = null; + } + + private getSpriteAssetName(state: number): string + { + let side = 'left'; + + if((this._visualization.angle === 135) || (this._visualization.angle === 180) || (this._visualization.angle === 225) || (this._visualization.angle === 270)) side = 'right'; + + return ('avatar_addition_user_idle_' + side + '_' + state + ((this._scale < 48) ? '_small' : '')); + } + + public update(sprite: IRoomObjectSprite, scale: number): void + { + if(!sprite) return; + + this._scale = scale; + this._asset = GetAssetManager().getTexture(this.getSpriteAssetName((this._state === FloatingIdleZAddition.STATE_FRAME_A) ? 1 : 2)); + + let additionScale = 64; + let offsetX = 0; + + if(scale < 48) + { + if((this._visualization.angle === 135) || (this._visualization.angle === 180) || (this._visualization.angle === 225) || (this._visualization.angle === 270)) + { + offsetX = 10; + } + else + { + offsetX = -16; + } + + this._offsetY = -38; + + additionScale = 32; + } + else + { + if((this._visualization.angle === 135) || (this._visualization.angle === 180) || (this._visualization.angle === 225) || (this._visualization.angle === 270)) + { + offsetX = 22; + } + else + { + offsetX = -30; + } + + this._offsetY = -70; + } + + if(this._visualization.posture === AvatarAction.POSTURE_SIT) + { + this._offsetY += (additionScale / 2); + } + + else if(this._visualization.posture === AvatarAction.POSTURE_LAY) + { + this._offsetY += (additionScale - (0.3 * additionScale)); + } + + if(this._asset) + { + sprite.texture = this._asset; + sprite.offsetX = offsetX; + sprite.offsetY = this._offsetY; + sprite.relativeDepth = -0.02; + sprite.alpha = 0; + } + } + + public animate(sprite: IRoomObjectSprite): boolean + { + if(!sprite) return false; + + const totalTimeRunning = GetTickerTime(); + + if(this._state === FloatingIdleZAddition.STATE_DELAY) + { + if((totalTimeRunning - this._startTime) >= FloatingIdleZAddition.DELAY_BEFORE_ANIMATION) + { + this._state = FloatingIdleZAddition.STATE_FRAME_A; + this._startTime = totalTimeRunning; + this._asset = GetAssetManager().getTexture(this.getSpriteAssetName(1)); + } + } + + if(this._state === FloatingIdleZAddition.STATE_FRAME_A) + { + if((totalTimeRunning - this._startTime) >= FloatingIdleZAddition.DELAY_PER_FRAME) + { + this._state = FloatingIdleZAddition.STATE_FRAME_B; + this._startTime = totalTimeRunning; + this._asset = GetAssetManager().getTexture(this.getSpriteAssetName(2)); + } + } + + if(this._state === FloatingIdleZAddition.STATE_FRAME_B) + { + if((totalTimeRunning - this._startTime) >= FloatingIdleZAddition.DELAY_PER_FRAME) + { + this._state = FloatingIdleZAddition.STATE_FRAME_A; + this._startTime = totalTimeRunning; + this._asset = GetAssetManager().getTexture(this.getSpriteAssetName(1)); + } + } + + if(this._asset) + { + sprite.texture = this._asset; + sprite.alpha = 255; + sprite.visible = true; + } + else + { + sprite.visible = false; + } + + return false; + } + + public get id(): number + { + return this._id; + } +} diff --git a/packages/room/src/object/visualization/avatar/additions/GameClickTargetAddition.ts b/packages/room/src/object/visualization/avatar/additions/GameClickTargetAddition.ts new file mode 100644 index 0000000..6ff9cce --- /dev/null +++ b/packages/room/src/object/visualization/avatar/additions/GameClickTargetAddition.ts @@ -0,0 +1,51 @@ +import { AlphaTolerance, IRoomObjectSprite } from '@nitrots/api'; +import { GetTexturePool } from '@nitrots/utils'; +import { Texture } from 'pixi.js'; +import { IAvatarAddition } from './IAvatarAddition'; + +export class GameClickTargetAddition implements IAvatarAddition +{ + private static WIDTH: number = 46; + private static HEIGHT: number = 60; + private static OFFSET_X: number = -23; + private static OFFSET_Y: number = -48; + + private _asset: Texture = null; + + constructor( + private _id: number) + {} + + public dispose(): void + { + if(this._asset) + { + GetTexturePool().putTexture(this._asset); + + this._asset = null; + } + } + + public update(sprite: IRoomObjectSprite, scale: number): void + { + if(!sprite) return; + + if(!this._asset) this._asset = GetTexturePool().getTexture(GameClickTargetAddition.WIDTH, GameClickTargetAddition.HEIGHT); + + sprite.visible = true; + sprite.texture = this._asset; + sprite.offsetX = GameClickTargetAddition.OFFSET_X; + sprite.offsetY = GameClickTargetAddition.OFFSET_Y; + sprite.alphaTolerance = AlphaTolerance.MATCH_ALL_PIXELS; + } + + public animate(sprite: IRoomObjectSprite): boolean + { + return false; + } + + public get id(): number + { + return this._id; + } +} diff --git a/packages/room/src/object/visualization/avatar/additions/GuideStatusBubbleAddition.ts b/packages/room/src/object/visualization/avatar/additions/GuideStatusBubbleAddition.ts new file mode 100644 index 0000000..0613b4d --- /dev/null +++ b/packages/room/src/object/visualization/avatar/additions/GuideStatusBubbleAddition.ts @@ -0,0 +1,93 @@ +import { AvatarAction, AvatarGuideStatus, IRoomObjectSprite } from '@nitrots/api'; +import { GetAssetManager } from '@nitrots/assets'; +import { Texture } from 'pixi.js'; +import { AvatarVisualization } from '../AvatarVisualization'; +import { IAvatarAddition } from './IAvatarAddition'; + +export class GuideStatusBubbleAddition implements IAvatarAddition +{ + private _asset: Texture = null; + private _relativeDepth: number = 0; + + constructor( + private _id: number, + private _visualization: AvatarVisualization, + private _status: number) + {} + + public dispose(): void + { + this._visualization = null; + this._asset = null; + } + + public update(sprite: IRoomObjectSprite, scale: number): void + { + if(!sprite) return; + + sprite.visible = true; + sprite.relativeDepth = this._relativeDepth; + sprite.alpha = 255; + + let additionScale = 64; + let offsetX = 0; + let offsetY = 0; + + this._asset = GetAssetManager().getTexture((this._status === AvatarGuideStatus.GUIDE) ? 'avatar_addition_user_guide_bubble' : 'avatar_addition_user_guide_requester_bubble'); + + if(scale < 48) + { + offsetX = -19; + offsetY = -80; + additionScale = 32; + } + else + { + offsetX = -19; + offsetY = -120; + } + + if(this._visualization.posture === AvatarAction.POSTURE_SIT) + { + offsetY += (additionScale / 2); + } + + else if(this._visualization.posture === AvatarAction.POSTURE_LAY) + { + offsetY += scale; + } + + if(this._asset) + { + sprite.texture = this._asset; + sprite.offsetX = offsetX; + sprite.offsetY = offsetY; + sprite.relativeDepth = (-0.02 + 0); + } + } + + public animate(sprite: IRoomObjectSprite): boolean + { + if(this._asset && sprite) + { + sprite.texture = this._asset; + } + + return false; + } + + public get id(): number + { + return this._id; + } + + public get relativeDepth(): number + { + return this._relativeDepth; + } + + public set relativeDepth(depth: number) + { + this._relativeDepth = depth; + } +} diff --git a/packages/room/src/object/visualization/avatar/additions/IAvatarAddition.ts b/packages/room/src/object/visualization/avatar/additions/IAvatarAddition.ts new file mode 100644 index 0000000..061b75c --- /dev/null +++ b/packages/room/src/object/visualization/avatar/additions/IAvatarAddition.ts @@ -0,0 +1,9 @@ +import { IRoomObjectSprite } from '@nitrots/api'; + +export interface IAvatarAddition +{ + dispose(): void; + update(sprite: IRoomObjectSprite, scale: number): void; + animate(sprite: IRoomObjectSprite): boolean; + id: number; +} diff --git a/packages/room/src/object/visualization/avatar/additions/IExpressionAddition.ts b/packages/room/src/object/visualization/avatar/additions/IExpressionAddition.ts new file mode 100644 index 0000000..d13225c --- /dev/null +++ b/packages/room/src/object/visualization/avatar/additions/IExpressionAddition.ts @@ -0,0 +1,6 @@ +import { IAvatarAddition } from './IAvatarAddition'; + +export interface IExpressionAddition extends IAvatarAddition +{ + type: number; +} \ No newline at end of file diff --git a/packages/room/src/object/visualization/avatar/additions/MutedBubbleAddition.ts b/packages/room/src/object/visualization/avatar/additions/MutedBubbleAddition.ts new file mode 100644 index 0000000..84e9401 --- /dev/null +++ b/packages/room/src/object/visualization/avatar/additions/MutedBubbleAddition.ts @@ -0,0 +1,77 @@ +import { AvatarAction, IRoomObjectSprite } from '@nitrots/api'; +import { GetAssetManager } from '@nitrots/assets'; +import { Texture } from 'pixi.js'; +import { AvatarVisualization } from '../AvatarVisualization'; +import { IAvatarAddition } from './IAvatarAddition'; + +export class MutedBubbleAddition implements IAvatarAddition +{ + private _asset: Texture = null; + + constructor( + private _id: number, + private _visualization: AvatarVisualization) + {} + + public dispose(): void + { + this._visualization = null; + this._asset = null; + } + + public update(sprite: IRoomObjectSprite, scale: number): void + { + if(!sprite) return; + + let additionScale = 64; + let offsetX = 0; + let offsetY = 0; + + if(scale < 48) + { + this._asset = GetAssetManager().getTexture('avatar_addition_user_muted_small'); + + additionScale = 32; + offsetX = -12; + offsetY = -66; + } + else + { + this._asset = GetAssetManager().getTexture('avatar_addition_user_muted'); + + offsetX = -15; + offsetY = -110; + } + + if(this._visualization.posture === AvatarAction.POSTURE_SIT) offsetY += (additionScale / 2); + else if(this._visualization.posture === AvatarAction.POSTURE_LAY) offsetY += scale; + + if(this._asset) + { + sprite.visible = true; + sprite.texture = this._asset; + sprite.offsetX = offsetX; + sprite.offsetY = offsetY; + sprite.relativeDepth = -0.02; + } + else + { + sprite.visible = false; + } + } + + public animate(sprite: IRoomObjectSprite): boolean + { + if(this._asset && sprite) + { + sprite.texture = this._asset; + } + + return false; + } + + public get id(): number + { + return this._id; + } +} diff --git a/packages/room/src/object/visualization/avatar/additions/NumberBubbleAddition.ts b/packages/room/src/object/visualization/avatar/additions/NumberBubbleAddition.ts new file mode 100644 index 0000000..1d6853a --- /dev/null +++ b/packages/room/src/object/visualization/avatar/additions/NumberBubbleAddition.ts @@ -0,0 +1,175 @@ +import { AvatarAction, IRoomObjectSprite } from '@nitrots/api'; +import { GetAssetManager } from '@nitrots/assets'; +import { Texture } from 'pixi.js'; +import { AvatarVisualization } from '../AvatarVisualization'; +import { IAvatarAddition } from './IAvatarAddition'; + +export class NumberBubbleAddition implements IAvatarAddition +{ + private _asset: Texture = null; + private _scale: number = 0; + private _numberValueFadeDirection: number = 0; + private _numberValueMoving: boolean = false; + private _numberValueMoveCounter: number = 0; + + constructor( + private _id: number, + private _number: number, + private _visualization: AvatarVisualization) + {} + + public dispose(): void + { + this._visualization = null; + this._asset = null; + } + + public update(sprite: IRoomObjectSprite, scale: number): void + { + if(!sprite) return; + + this._scale = scale; + + let additionScale = 64; + let offsetX = 0; + let offsetY = 0; + + if(this._number > 0) + { + if(scale < 48) + { + this._asset = GetAssetManager().getTexture('avatar_addition_number_' + this._number + '_small'); + + additionScale = 32; + offsetX = -6; + offsetY = -52; + } + else + { + this._asset = GetAssetManager().getTexture('avatar_addition_number_' + this._number); + + offsetX = -8; + offsetY = -105; + } + + if(this._visualization.posture === AvatarAction.POSTURE_SIT) + { + offsetY += (additionScale / 2); + } + + else if(this._visualization.posture === AvatarAction.POSTURE_LAY) + { + offsetY += scale; + } + + if(this._asset) + { + sprite.visible = true; + sprite.texture = this._asset; + sprite.offsetX = offsetX; + sprite.offsetY = offsetY; + sprite.relativeDepth = -0.01; + sprite.alpha = 0; + + this._numberValueFadeDirection = 1; + this._numberValueMoving = true; + this._numberValueMoveCounter = 0; + } + else + { + sprite.visible = false; + } + } + else + { + if(sprite.visible) this._numberValueFadeDirection = -1; + } + } + + public animate(sprite: IRoomObjectSprite): boolean + { + if(!sprite) return false; + + if(this._asset) + { + sprite.texture = this._asset; + } + + let alpha = sprite.alpha; + let didAnimate = false; + + if(this._numberValueMoving) + { + this._numberValueMoveCounter++; + + if(this._numberValueMoveCounter < 10) return false; + + if(this._numberValueFadeDirection < 0) + { + if(this._scale < 48) + { + sprite.offsetY -= 2; + } + else + { + sprite.offsetY -= 4; + } + } + else + { + let count = 4; + + if(this._scale < 48) count = 8; + + if(!(this._numberValueMoveCounter % count)) + { + sprite.offsetY--; + + didAnimate = true; + } + } + } + + if(this._numberValueFadeDirection > 0) + { + if(alpha < 255) alpha += 32; + + if(alpha >= 255) + { + alpha = 255; + + this._numberValueFadeDirection = 0; + } + + sprite.alpha = alpha; + + return true; + } + + if(this._numberValueFadeDirection < 0) + { + if(alpha >= 0) alpha -= 32; + + if(alpha <= 0) + { + this._numberValueFadeDirection = 0; + this._numberValueMoving = false; + + alpha = 0; + + sprite.visible = false; + } + + sprite.alpha = alpha; + + return true; + } + + return didAnimate; + } + + public get id(): number + { + return this._id; + } +} diff --git a/packages/room/src/object/visualization/avatar/additions/TypingBubbleAddition.ts b/packages/room/src/object/visualization/avatar/additions/TypingBubbleAddition.ts new file mode 100644 index 0000000..8028340 --- /dev/null +++ b/packages/room/src/object/visualization/avatar/additions/TypingBubbleAddition.ts @@ -0,0 +1,95 @@ +import { AvatarAction, IRoomObjectSprite } from '@nitrots/api'; +import { GetAssetManager } from '@nitrots/assets'; +import { Texture } from 'pixi.js'; +import { AvatarVisualization } from '../AvatarVisualization'; +import { IAvatarAddition } from './IAvatarAddition'; + +export class TypingBubbleAddition implements IAvatarAddition +{ + private _asset: Texture = null; + private _relativeDepth: number = 0; + + constructor( + private _id: number, + private _visualization: AvatarVisualization) + {} + + public dispose(): void + { + this._visualization = null; + this._asset = null; + } + + public update(sprite: IRoomObjectSprite, scale: number): void + { + if(!sprite) return; + + sprite.visible = true; + sprite.relativeDepth = this._relativeDepth; + sprite.alpha = 255; + + let additionScale = 64; + let offsetX = 0; + let offsetY = 0; + + if(scale < 48) + { + this._asset = GetAssetManager().getTexture('avatar_addition_user_typing_small'); + + offsetX = 3; + offsetY = -42; + + additionScale = 32; + } + else + { + this._asset = GetAssetManager().getTexture('avatar_addition_user_typing'); + + offsetX = 14; + offsetY = -83; + } + + if(this._visualization.posture === AvatarAction.POSTURE_SIT) + { + offsetY += (additionScale / 2); + } + + else if(this._visualization.posture === AvatarAction.POSTURE_LAY) + { + offsetY += scale; + } + + if(this._asset) + { + sprite.texture = this._asset; + sprite.offsetX = offsetX; + sprite.offsetY = offsetY; + sprite.relativeDepth = (-0.02 + 0); + } + } + + public animate(sprite: IRoomObjectSprite): boolean + { + if(this._asset && sprite) + { + sprite.texture = this._asset; + } + + return false; + } + + public get id(): number + { + return this._id; + } + + public get relativeDepth(): number + { + return this._relativeDepth; + } + + public set relativeDepth(depth: number) + { + this._relativeDepth = depth; + } +} diff --git a/packages/room/src/object/visualization/avatar/additions/index.ts b/packages/room/src/object/visualization/avatar/additions/index.ts new file mode 100644 index 0000000..b2e5dda --- /dev/null +++ b/packages/room/src/object/visualization/avatar/additions/index.ts @@ -0,0 +1,11 @@ +export * from './ExpressionAddition'; +export * from './ExpressionAdditionFactory'; +export * from './FloatingHeartAddition'; +export * from './FloatingIdleZAddition'; +export * from './GameClickTargetAddition'; +export * from './GuideStatusBubbleAddition'; +export * from './IAvatarAddition'; +export * from './IExpressionAddition'; +export * from './MutedBubbleAddition'; +export * from './NumberBubbleAddition'; +export * from './TypingBubbleAddition'; diff --git a/packages/room/src/object/visualization/avatar/index.ts b/packages/room/src/object/visualization/avatar/index.ts new file mode 100644 index 0000000..6801a02 --- /dev/null +++ b/packages/room/src/object/visualization/avatar/index.ts @@ -0,0 +1,3 @@ +export * from './AvatarVisualization'; +export * from './AvatarVisualizationData'; +export * from './additions'; diff --git a/packages/room/src/object/visualization/data/AnimationData.ts b/packages/room/src/object/visualization/data/AnimationData.ts new file mode 100644 index 0000000..c1d4308 --- /dev/null +++ b/packages/room/src/object/visualization/data/AnimationData.ts @@ -0,0 +1,191 @@ +import { IAssetVisualAnimation, IAssetVisualAnimationLayer, IAssetVisualAnimationSequenceFrame } from '@nitrots/api'; +import { AnimationFrame } from './AnimationFrame'; +import { AnimationLayerData } from './AnimationLayerData'; +import { DirectionalOffsetData } from './DirectionalOffsetData'; + +export class AnimationData +{ + private static TRANSITION_TO_ANIMATION_OFFSET: number = 1000000; + private static TRANSITION_FROM_ANIMATION_OFFSET: number = 2000000; + + public static DEFAULT_FRAME_NUMBER: number = 0; + + private _layers: Map; + private _frameCount: number; + private _randomStart: boolean; + private _immediateChanges: number[]; + + constructor() + { + this._layers = new Map(); + this._frameCount = -1; + this._randomStart = false; + this._immediateChanges = null; + } + + public static getTransitionToAnimationId(animationId: number): number + { + return AnimationData.TRANSITION_TO_ANIMATION_OFFSET + animationId; + } + + public static getTransitionFromAnimationId(animationId: number): number + { + return AnimationData.TRANSITION_FROM_ANIMATION_OFFSET + animationId; + } + + public static isTransitionToAnimation(animationId: number): boolean + { + return (animationId >= AnimationData.TRANSITION_TO_ANIMATION_OFFSET) && (animationId < AnimationData.TRANSITION_FROM_ANIMATION_OFFSET); + } + + public static isTransitionFromAnimation(animationId: number): boolean + { + return animationId >= AnimationData.TRANSITION_FROM_ANIMATION_OFFSET; + } + + public dispose(): void + { + for(const layer of this._layers.values()) + { + if(!layer) continue; + + layer.dispose(); + } + + this._layers.clear(); + + this._immediateChanges = null; + } + + public setImmediateChanges(k: number[]): void + { + this._immediateChanges = k; + } + + public isImmediateChange(k: number): boolean + { + if(!this._immediateChanges || (this._immediateChanges.indexOf(k) === -1)) return false; + + return true; + } + + public getStartFrame(direction: number): number + { + if(!this._randomStart) return 0; + + return Math.random() * this._frameCount; + } + + public initialize(k: IAssetVisualAnimation): boolean + { + if(k.randomStart) this._randomStart = true; + + if(k.layers) + { + for(const key in k.layers) + { + const layer = k.layers[key]; + + if(!layer) return false; + + const animationId = parseInt(key); + + const loopCount = (layer.loopCount !== undefined) ? layer.loopCount : 1; + const frameRepeat = (layer.frameRepeat !== undefined) ? layer.frameRepeat : 1; + const isRandom = ((layer.random !== undefined) && (layer.random !== 0)) ? true : false; + + if(!this.addLayer(animationId, loopCount, frameRepeat, isRandom, layer)) return false; + } + } + + return true; + } + + private addLayer(animationId: number, loopCount: number, frameRepeat: number, isRandom: boolean, layer: IAssetVisualAnimationLayer): boolean + { + const layerData = new AnimationLayerData(loopCount, frameRepeat, isRandom); + + if(layer.frameSequences) + { + for(const key in layer.frameSequences) + { + const animationSequence = layer.frameSequences[key]; + + if(!animationSequence) continue; + + const loopCount = (animationSequence.loopCount !== undefined) ? animationSequence.loopCount : 1; + const isSequenceRandom = ((animationSequence.random !== undefined) && (animationSequence.random !== 0)) ? true : false; + + const frame = layerData.addFrameSequence(loopCount, isSequenceRandom); + + if(animationSequence.frames) + { + for(const key in animationSequence.frames) + { + const animationFrame = animationSequence.frames[key]; + + if(!animationFrame) + { + layerData.dispose(); + + return false; + } + + frame.addFrame(animationFrame.id, (animationFrame.x || 0), (animationFrame.y || 0), (animationFrame.randomX || 0), (animationFrame.randomY || 0), this.readDirectionalOffsets(animationFrame)); + } + } + + frame.initialize(); + } + } + + layerData.calculateLength(); + + this._layers.set(animationId, layerData); + + const frameCount: number = layerData.frameCount; + + if(frameCount > this._frameCount) this._frameCount = frameCount; + + return true; + } + + private readDirectionalOffsets(frame: IAssetVisualAnimationSequenceFrame): DirectionalOffsetData + { + let directionalOffset: DirectionalOffsetData = null; + + if(frame && frame.offsets) + { + for(const directionId in frame.offsets) + { + const offset = frame.offsets[directionId]; + + if(!offset) continue; + + if(!directionalOffset) directionalOffset = new DirectionalOffsetData(); + + directionalOffset.setDirection(offset.direction, offset.x, offset.y); + } + } + + return directionalOffset; + } + + public getFrame(direction: number, layerId: number, frameCount: number): AnimationFrame + { + const layer = this._layers.get(layerId); + + if(!layer) return null; + + return layer.getFrame(direction, frameCount); + } + + public getFrameFromSequence(direction: number, layerId: number, sequenceId: number, offset: number, frameCount: number): AnimationFrame + { + const layer = this._layers.get(layerId); + + if(!layer) return null; + + return layer.getFrameFromSequence(direction, sequenceId, offset, frameCount); + } +} diff --git a/packages/room/src/object/visualization/data/AnimationFrame.ts b/packages/room/src/object/visualization/data/AnimationFrame.ts new file mode 100644 index 0000000..615c7fb --- /dev/null +++ b/packages/room/src/object/visualization/data/AnimationFrame.ts @@ -0,0 +1,117 @@ +export class AnimationFrame +{ + public static FRAME_REPEAT_FOREVER: number = -1; + public static SEQUENCE_NOT_DEFINED: number = -1; + + private static POOL_SIZE_LIMIT: number = 3000; + private static POOL: AnimationFrame[] = []; + + private _id: number; + private _x: number; + private _y: number; + private _repeats: number; + private _frameRepeats: number; + private _remainingFrameRepeats: number; + private _activeSequence: number; + private _activeSequenceOffset: number; + private _isLastFrame: boolean; + private _isRecycled: boolean; + + public static allocate(id: number, x: number, y: number, repeats: number, frameRepeats: number, isLastFrame: boolean, activeSequence: number = -1, sequenceOffset: number = 0): AnimationFrame + { + const frame = (AnimationFrame.POOL.length) ? AnimationFrame.POOL.pop() : new AnimationFrame(); + + if(repeats < 1) repeats = 1; + + if(frameRepeats < 0) frameRepeats = AnimationFrame.FRAME_REPEAT_FOREVER; + + frame._id = id; + frame._x = x || 0; + frame._y = y || 0; + frame._repeats = repeats; + frame._frameRepeats = frameRepeats; + frame._remainingFrameRepeats = frameRepeats; + frame._isLastFrame = isLastFrame; + frame._isRecycled = false; + + if(activeSequence >= 0) + { + frame._activeSequence = activeSequence; + frame._activeSequenceOffset = sequenceOffset; + } + else + { + frame._activeSequence = -1; + frame._activeSequenceOffset = 0; + } + + return frame; + } + + public get id(): number + { + if(this._id >= 0) return this._id; + + return -(this._id) * Math.random(); + } + + public get x(): number + { + return this._x; + } + + public get y(): number + { + return this._y; + } + + public get repeats(): number + { + return this._repeats; + } + + public get frameRepeats(): number + { + return this._frameRepeats; + } + + public get isLastFrame(): boolean + { + return this._isLastFrame; + } + + public get remainingFrameRepeats(): number + { + if(this._frameRepeats < 0) return AnimationFrame.FRAME_REPEAT_FOREVER; + + return this._remainingFrameRepeats; + } + + public set remainingFrameRepeats(k: number) + { + if(k < 0) k = 0; + + if((this._frameRepeats > 0) && (k > this._frameRepeats)) k = this._frameRepeats; + + this._remainingFrameRepeats = k; + } + + public get activeSequence(): number + { + return this._activeSequence; + } + + public get activeSequenceOffset(): number + { + return this._activeSequenceOffset; + } + + public recycle(): void + { + if(this._isRecycled) return; + + this._isRecycled = true; + + if(AnimationFrame.POOL.length < AnimationFrame.POOL_SIZE_LIMIT) AnimationFrame.POOL.push(this); + } +} diff --git a/packages/room/src/object/visualization/data/AnimationFrameData.ts b/packages/room/src/object/visualization/data/AnimationFrameData.ts new file mode 100644 index 0000000..6f7b799 --- /dev/null +++ b/packages/room/src/object/visualization/data/AnimationFrameData.ts @@ -0,0 +1,64 @@ +export class AnimationFrameData +{ + private _id: number = 0; + private _x: number = 0; + private _y: number = 0; + private _randomX: number = 0; + private _randomY: number = 0; + private _repeats: number = 1; + + constructor(id: number, x: number, y: number, randomX: number, randomY: number, repeats: number) + { + this._id = id; + this._x = x; + this._y = y; + this._randomX = randomX; + this._randomY = randomY; + this._repeats = repeats; + } + + public get id(): number + { + return this._id; + } + + public hasDirectionalOffsets(): boolean + { + return false; + } + + public getX(k: number): number + { + return this._x; + } + + public getY(k: number): number + { + return this._y; + } + + public get x(): number + { + return this._x; + } + + public get y(): number + { + return this._x; + } + + public get randomX(): number + { + return this._randomX; + } + + public get randomY(): number + { + return this._randomY; + } + + public get repeats(): number + { + return this._repeats; + } +} \ No newline at end of file diff --git a/packages/room/src/object/visualization/data/AnimationFrameDirectionalData.ts b/packages/room/src/object/visualization/data/AnimationFrameDirectionalData.ts new file mode 100644 index 0000000..79f5df9 --- /dev/null +++ b/packages/room/src/object/visualization/data/AnimationFrameDirectionalData.ts @@ -0,0 +1,33 @@ +import { AnimationFrameData } from './AnimationFrameData'; +import { DirectionalOffsetData } from './DirectionalOffsetData'; + +export class AnimationFrameDirectionalData extends AnimationFrameData +{ + private _directionalOffsets: DirectionalOffsetData; + + constructor(id: number, x: number, y: number, randomX: number, randomY: number, offsets: DirectionalOffsetData, repeats: number) + { + super(id, x, y, randomX, randomY, repeats); + + this._directionalOffsets = offsets; + } + + public hasDirectionalOffsets(): boolean + { + return this._directionalOffsets !== null; + } + + public getX(direction: number): number + { + if(!this._directionalOffsets) return super.getX(direction); + + return this._directionalOffsets.getXOffset(direction, super.getX(direction)); + } + + public getY(direction: number): number + { + if(!this._directionalOffsets) return super.getY(direction); + + return this._directionalOffsets.getYOffset(direction, super.getY(direction)); + } +} \ No newline at end of file diff --git a/packages/room/src/object/visualization/data/AnimationFrameSequenceData.ts b/packages/room/src/object/visualization/data/AnimationFrameSequenceData.ts new file mode 100644 index 0000000..5522587 --- /dev/null +++ b/packages/room/src/object/visualization/data/AnimationFrameSequenceData.ts @@ -0,0 +1,111 @@ +import { AnimationFrameData } from './AnimationFrameData'; +import { AnimationFrameDirectionalData } from './AnimationFrameDirectionalData'; +import { DirectionalOffsetData } from './DirectionalOffsetData'; + +export class AnimationFrameSequenceData +{ + private _frames: AnimationFrameData[]; + private _frameIndexes: number[]; + private _frameRepeats: number[]; + private _isRandom: boolean; + private _loopCount: number; + + constructor(loopCount: number, isRandom: boolean) + { + this._frames = []; + this._frameIndexes = []; + this._frameRepeats = []; + this._isRandom = isRandom; + this._loopCount = (loopCount < 1) ? 1 : loopCount; + } + + public get isRandom(): boolean + { + return this._isRandom; + } + + public get frameCount(): number + { + return (this._frameIndexes.length * this._loopCount); + } + + public dispose(): void + { + this._frames = []; + } + + public initialize(): void + { + let frameIndex: number = (this._frameIndexes.length - 1); + let realIndex = -1; + let nextIndex = 1; + + while(frameIndex >= 0) + { + if(this._frameIndexes[frameIndex] === realIndex) + { + nextIndex++; + } + else + { + realIndex = this._frameIndexes[frameIndex]; + nextIndex = 1; + } + + this._frameRepeats[frameIndex] = nextIndex; + + frameIndex--; + } + } + + public addFrame(id: number, x: number, y: number, randomX: number, randomY: number, directionalOffset: DirectionalOffsetData): void + { + let repeats = 1; + + if(this._frames.length > 0) + { + const frame = this._frames[(this._frames.length - 1)]; + + if((((((((frame.id === id) && (!(frame.hasDirectionalOffsets()))) && (frame.x === x)) && (frame.y === y)) && (frame.randomX === randomX)) && (randomX === 0)) && (frame.randomY === randomY)) && (randomY === 0)) + { + repeats += frame.repeats; + + this._frames.pop(); + } + } + + const frame = (directionalOffset) ? new AnimationFrameDirectionalData(id, x, y, randomX, randomY, directionalOffset, repeats) : new AnimationFrameData(id, x, y, randomX, randomY, repeats); + + this._frames.push(frame); + this._frameIndexes.push((this._frames.length - 1)); + this._frameRepeats.push(1); + } + + public getFrame(frameCount: number): AnimationFrameData + { + if((!this._frames.length || (frameCount < 0)) || (frameCount >= this.frameCount)) return null; + + return this._frames[this._frameIndexes[(frameCount % this._frameIndexes.length)]]; + } + + public getFrameIndex(frameCount: number): number + { + if(((frameCount < 0) || (frameCount >= this.frameCount))) return -1; + + if(this._isRandom) + { + frameCount = Math.round((Math.random() * this._frameIndexes.length)); + + if(frameCount === this._frameIndexes.length) frameCount--; + } + + return frameCount; + } + + public getRepeats(frameCount: number): number + { + if(((frameCount < 0) || (frameCount >= this.frameCount))) return 0; + + return this._frameRepeats[(frameCount % this._frameRepeats.length)]; + } +} \ No newline at end of file diff --git a/packages/room/src/object/visualization/data/AnimationLayerData.ts b/packages/room/src/object/visualization/data/AnimationLayerData.ts new file mode 100644 index 0000000..6271524 --- /dev/null +++ b/packages/room/src/object/visualization/data/AnimationLayerData.ts @@ -0,0 +1,156 @@ +import { AnimationFrame } from './AnimationFrame'; +import { AnimationFrameSequenceData } from './AnimationFrameSequenceData'; + +export class AnimationLayerData +{ + private _frameSequences: AnimationFrameSequenceData[]; + private _frameCount: number; + private _loopCount: number; + private _frameRepeat: number; + private _isRandom: boolean; + + constructor(loopCount: number, frameRepeat: number, isRandom: boolean) + { + this._frameSequences = []; + this._frameCount = -1; + this._loopCount = (loopCount < 0) ? 0 : loopCount; + this._frameRepeat = (frameRepeat < 1) ? 1 : frameRepeat; + this._isRandom = isRandom; + } + + public get frameCount(): number + { + if(this._frameCount < 0) this.calculateLength(); + + return this._frameCount; + } + + public dispose(): void + { + if(!this._frameSequences || !this._frameSequences.length) return; + + for(const sequence of this._frameSequences) + { + if(!sequence) continue; + + sequence.dispose(); + } + + this._frameSequences = []; + } + + public addFrameSequence(loopCount: number, isRandom: boolean): AnimationFrameSequenceData + { + const sequence = new AnimationFrameSequenceData(loopCount, isRandom); + + this._frameSequences.push(sequence); + + return sequence; + } + + public calculateLength(): void + { + this._frameCount = 0; + + for(const sequence of this._frameSequences) + { + if(!sequence) continue; + + this._frameCount += sequence.frameCount; + } + } + + public getFrame(direction: number, frameCount: number): AnimationFrame + { + if(this._frameCount < 1) return null; + + frameCount = (frameCount / this._frameRepeat); + + if(!this._isRandom) + { + const count = Math.floor(frameCount / this._frameCount); + frameCount = Math.floor(frameCount % this._frameCount); + + let doesRepeat = false; + let sequence: AnimationFrameSequenceData = null; + + if(((this._loopCount > 0) && (count >= this._loopCount)) || ((this._loopCount <= 0) && (this._frameCount === 1))) + { + frameCount = (this._frameCount - 1); + doesRepeat = true; + } + + let sequenceFrameCount = 0; + let sequenceId = 0; + + while(sequenceId < this._frameSequences.length) + { + sequence = this._frameSequences[sequenceId]; + + if(sequence) + { + if(frameCount < (sequenceFrameCount + sequence.frameCount)) break; + + sequenceFrameCount += sequence.frameCount; + } + + sequenceId++; + } + + return this.getFrameFromSpecificSequence(direction, sequence, sequenceId, (frameCount - sequenceFrameCount), doesRepeat); + } + + const sequenceId = Math.trunc(this._frameSequences.length * Math.random()); + const sequence = this._frameSequences[sequenceId]; + + if(sequence.frameCount < 1) return null; + + return this.getFrameFromSpecificSequence(direction, sequence, sequenceId, 0, false); + } + + public getFrameFromSequence(direction: number, sequenceId: number, offset: number, frameCount: number): AnimationFrame + { + if((sequenceId < 0) || (sequenceId >= this._frameSequences.length)) return null; + + const sequence = this._frameSequences[sequenceId]; + + if(!sequence) return null; + + if(offset >= sequence.frameCount) return this.getFrame(direction, frameCount); + + return this.getFrameFromSpecificSequence(direction, sequence, sequenceId, offset, false); + } + + private getFrameFromSpecificSequence(direction: number, sequence: AnimationFrameSequenceData, sequenceId: number, offset: number, doesRepeat: boolean): AnimationFrame + { + if(!sequence) return null; + + const frameIndex = sequence.getFrameIndex(offset); + const frame = sequence.getFrame(frameIndex); + + if(!frame) return null; + + let x = frame.getX(direction); + let y = frame.getY(direction); + const randomX = frame.randomX; + const randomY = frame.randomY; + let repeats = frame.repeats; + let isLastFrame = false; + + if(randomX) x = Math.trunc(x + randomX * Math.random()); + if(randomY) y = Math.trunc(y + randomY * Math.random()); + + if(repeats > 1) repeats = sequence.getRepeats(frameIndex); + + let frameRepeats = (this._frameRepeat * repeats); + + if(doesRepeat) frameRepeats = AnimationFrame.FRAME_REPEAT_FOREVER; + + if(!this._isRandom && !sequence.isRandom) + { + if((sequenceId === (this._frameSequences.length - 1)) && (offset === (sequence.frameCount - 1))) isLastFrame = true; + } + + return AnimationFrame.allocate(frame.id, x, y, repeats, frameRepeats, isLastFrame, sequenceId, offset); + } +} \ No newline at end of file diff --git a/packages/room/src/object/visualization/data/AnimationSizeData.ts b/packages/room/src/object/visualization/data/AnimationSizeData.ts new file mode 100644 index 0000000..190ccc8 --- /dev/null +++ b/packages/room/src/object/visualization/data/AnimationSizeData.ts @@ -0,0 +1,158 @@ +import { IAssetVisualAnimation } from '@nitrots/api'; +import { AnimationData } from './AnimationData'; +import { AnimationFrame } from './AnimationFrame'; +import { SizeData } from './SizeData'; + +export class AnimationSizeData extends SizeData +{ + private _animations: Map; + private _animationIds: number[]; + + constructor(layerCount: number, angle: number) + { + super(layerCount, angle); + + this._animations = new Map(); + this._animationIds = []; + } + + public dispose(): void + { + super.dispose(); + + for(const animation of this._animations.values()) + { + if(!animation) continue; + + animation.dispose(); + } + + this._animations.clear(); + + this._animationIds = []; + } + + public defineAnimations(animations: { [index: string]: IAssetVisualAnimation }): boolean + { + if(!animations) return true; + + for(const key in animations) + { + const animation = animations[key]; + + if(!animation) return false; + + let animationId = parseInt(key.split('_')[0]); + let isTransition = false; + + const transitionTo = animation.transitionTo; + const transitionFrom = animation.transitionFrom; + + if(transitionTo !== undefined) + { + animationId = AnimationData.getTransitionToAnimationId(transitionTo); + isTransition = true; + } + + if(transitionFrom !== undefined) + { + animationId = AnimationData.getTransitionFromAnimationId(transitionFrom); + isTransition = true; + } + + const animationData = this.createAnimationData(); + + if(!animationData.initialize(animation)) + { + animationData.dispose(); + + return false; + } + + const immediateChangeFrom = animation.immediateChangeFrom; + + if(immediateChangeFrom !== undefined) + { + const changes = immediateChangeFrom.split(','); + const changeIds = []; + + for(const change of changes) + { + const changeId = parseInt(change); + + if(changeIds.indexOf(changeId) === -1) changeIds.push(changeId); + } + + animationData.setImmediateChanges(changeIds); + } + + this._animations.set(animationId, animationData); + + if(!isTransition) this._animationIds.push(animationId); + } + + return true; + } + + protected createAnimationData(): AnimationData + { + return new AnimationData(); + } + + public hasAnimation(animationId: number): boolean + { + if(!this._animations.get(animationId)) return false; + + return true; + } + + public getAnimationCount(): number + { + return this._animationIds.length || 0; + } + + public getAnimationId(animationId: number): number + { + const totalAnimations = this.getAnimationCount(); + + if((animationId < 0) || (totalAnimations <= 0)) return 0; + + return this._animationIds[(animationId % totalAnimations)]; + } + + public isImmediateChange(animationId: number, _arg_2: number): boolean + { + const animation = this._animations.get(animationId); + + if(!animation) return false; + + return animation.isImmediateChange(_arg_2); + } + + public getStartFrame(animationId: number, direction: number): number + { + const animation = this._animations.get(animationId); + + if(!animation) return 0; + + return animation.getStartFrame(direction); + } + + public getFrame(animationId: number, direction: number, layerId: number, frameCount: number): AnimationFrame + { + const animation = this._animations.get(animationId); + + if(!animation) return null; + + return animation.getFrame(direction, layerId, frameCount); + } + + public getFrameFromSequence(animationId: number, direction: number, layerId: number, sequenceId: number, offset: number, frameCount: number): AnimationFrame + { + const animation = this._animations.get(animationId); + + if(!animation) return null; + + return animation.getFrameFromSequence(direction, layerId, sequenceId, offset, frameCount); + } +} diff --git a/packages/room/src/object/visualization/data/AnimationStateData.ts b/packages/room/src/object/visualization/data/AnimationStateData.ts new file mode 100644 index 0000000..ad7a13e --- /dev/null +++ b/packages/room/src/object/visualization/data/AnimationStateData.ts @@ -0,0 +1,184 @@ +import { AnimationFrame } from './AnimationFrame'; + +export class AnimationStateData +{ + private _animationId: number; + private _animationAfterTransitionId: number; + private _animationOver: boolean; + private _frameCounter: number; + private _frames: AnimationFrame[]; + private _lastFramePlayed: boolean[]; + private _animationPlayed: boolean[]; + private _layerCount: number; + + constructor() + { + this._animationId = -1; + this._animationAfterTransitionId = 0; + this._animationOver = false; + this._frameCounter = 0; + this._frames = []; + this._lastFramePlayed = []; + this._animationPlayed = []; + this._layerCount = 0; + } + + public get animationOver(): boolean + { + return this._animationOver; + } + + public set animationOver(k: boolean) + { + this._animationOver = k; + } + + public get frameCounter(): number + { + return this._frameCounter; + } + + public set frameCounter(k: number) + { + this._frameCounter = k; + } + + public get animationId(): number + { + return this._animationId; + } + + public set animationId(animationId: number) + { + if(animationId === this._animationId) return; + + this._animationId = animationId; + + this.resetAnimationFrames(false); + } + + public get animationAfterTransitionId(): number + { + return this._animationAfterTransitionId; + } + + public set animationAfterTransitionId(k: number) + { + this._animationAfterTransitionId = k; + } + + public dispose(): void + { + this.recycleFrames(); + + this._frames = null; + this._lastFramePlayed = null; + this._animationPlayed = null; + } + + public setLayerCount(k: number): void + { + this._layerCount = k; + + this.resetAnimationFrames(); + } + + public resetAnimationFrames(k: boolean = true): void + { + if(k || (!this._frames)) + { + this.recycleFrames(); + + this._frames = []; + } + + this._lastFramePlayed = []; + this._animationPlayed = []; + this._animationOver = false; + this._frameCounter = 0; + + let layerId = 0; + + while(layerId < this._layerCount) + { + if(k || (this._frames.length <= layerId)) + { + this._frames[layerId] = null; + } + else + { + const frame = this._frames[layerId]; + + if(frame) + { + frame.recycle(); + + this._frames[layerId] = AnimationFrame.allocate(frame.id, frame.x, frame.y, frame.repeats, 0, frame.isLastFrame); + } + } + + this._lastFramePlayed[layerId] = false; + this._animationPlayed[layerId] = false; + + layerId++; + } + } + + private recycleFrames(): void + { + if(!this._frames || !this._frames.length) return; + + for(const frame of this._frames) + { + if(!frame) continue; + + frame.recycle(); + } + } + + public getFrame(layerId: number): AnimationFrame + { + if((layerId < 0) || (layerId >= this._layerCount)) return null; + + return this._frames[layerId]; + } + + public setFrame(layerId: number, frame: AnimationFrame): void + { + if((layerId < 0) || (layerId >= this._layerCount)) return; + + const existingFrame = this._frames[layerId]; + + if(existingFrame) existingFrame.recycle(); + + this._frames[layerId] = frame; + } + + public getAnimationPlayed(layerId: number): boolean + { + if((layerId < 0) || (layerId >= this._layerCount)) return true; + + return this._animationPlayed[layerId]; + } + + public setAnimationPlayed(layerId: number, flag: boolean): void + { + if((layerId < 0) || (layerId >= this._layerCount)) return; + + this._animationPlayed[layerId] = flag; + } + + public getLastFramePlayed(layerId: number): boolean + { + if((layerId < 0) || (layerId >= this._layerCount)) return true; + + return this._lastFramePlayed[layerId]; + } + + public setLastFramePlayed(layerId: number, flag: boolean): void + { + if((layerId < 0) || (layerId >= this._layerCount)) return; + + this._lastFramePlayed[layerId] = flag; + } +} \ No newline at end of file diff --git a/packages/room/src/object/visualization/data/ColorData.ts b/packages/room/src/object/visualization/data/ColorData.ts new file mode 100644 index 0000000..05978b5 --- /dev/null +++ b/packages/room/src/object/visualization/data/ColorData.ts @@ -0,0 +1,43 @@ +export class ColorData +{ + public static DEFAULT_COLOR: number = 0xFFFFFF; + + private _colors: number[]; + + constructor(layerCount: number) + { + this._colors = []; + + this.createColors(layerCount); + } + + private createColors(count: number): void + { + if(!count) return; + + for(let i = 0; i < count; i++) this._colors.push(ColorData.DEFAULT_COLOR); + } + + public dispose(): void + { + this._colors = []; + } + + public getLayerColor(layerId: number): number + { + const existing = this._colors[layerId]; + + if(!existing) return ColorData.DEFAULT_COLOR; + + return existing; + } + + public setColorLayer(layerId: number, color: number): void + { + const existing = this._colors[layerId]; + + if(!existing) return; + + this._colors[layerId] = color; + } +} \ No newline at end of file diff --git a/packages/room/src/object/visualization/data/DirectionData.ts b/packages/room/src/object/visualization/data/DirectionData.ts new file mode 100644 index 0000000..130b548 --- /dev/null +++ b/packages/room/src/object/visualization/data/DirectionData.ts @@ -0,0 +1,197 @@ +import { BLEND_MODES } from 'pixi.js'; +import { LayerData } from './LayerData'; + +export class DirectionData +{ + public static USE_DEFAULT_DIRECTION: number = -1; + + private _layers: LayerData[]; + + constructor(layerCount: number) + { + this._layers = []; + + this.createLayers(layerCount); + } + + private createLayers(count: number): void + { + if(!count) return; + + for(let i = 0; i < count; i++) this._layers.push(new LayerData()); + } + + public dispose(): void + { + this._layers = []; + } + + public setFromDirection(directionData: DirectionData): void + { + if(!directionData) return; + + const totalLayers = this.layerCount; + + if(totalLayers !== directionData.layerCount) return; + + for(let i = 0; i < totalLayers; i++) + { + const localLayer = this.getLayer(i); + const directionLayer = directionData.getLayer(i); + + if(!localLayer) continue; + + localLayer.setFromLayer(directionLayer); + } + } + + public getLayer(layerId: number): LayerData + { + const existing = this._layers[layerId]; + + if(!existing) return null; + + return existing; + } + + public getLayerTag(layerId: number): string + { + const existing = this.getLayer(layerId); + + if(!existing) return LayerData.DEFAULT_TAG; + + return existing.tag; + } + + public setLayerTag(layerId: number, tag: string): void + { + const existing = this.getLayer(layerId); + + if(!existing) return; + + existing.tag = tag; + } + + public getLayerBlendMode(layerId: number): BLEND_MODES + { + const existing = this.getLayer(layerId); + + if(!existing) return LayerData.DEFAULT_BLEND_MODE; + + return existing.blendMode; + } + + public setLayerBlendMode(layerId: number, blendMode: BLEND_MODES): void + { + const existing = this.getLayer(layerId); + + if(!existing) return; + + if(!blendMode || !blendMode.length) return; + + existing.blendMode = blendMode; + } + + public getLayerAlpha(layerId: number): number + { + const existing = this.getLayer(layerId); + + if(!existing) return LayerData.DEFAULT_ALPHA; + + return existing.alpha; + } + + public setLayerAlpha(layerId: number, alpha: number): void + { + const existing = this.getLayer(layerId); + + if(!existing) return; + + if(isNaN(alpha)) return; + + existing.alpha = alpha; + } + + public getLayerIgnoreMouse(layerId: number): boolean + { + const existing = this.getLayer(layerId); + + if(!existing) return LayerData.DEFAULT_IGNORE_MOUSE; + + return existing.ignoreMouse; + } + + public setLayerIgnoreMouse(layerId: number, flag: boolean): void + { + const existing = this.getLayer(layerId); + + if(!existing) return; + + existing.ignoreMouse = flag || false; + } + + public getLayerXOffset(layerId: number): number + { + const existing = this.getLayer(layerId); + + if(!existing) return LayerData.DEFAULT_XOFFSET; + + return existing.xOffset; + } + + public setLayerXOffset(layerId: number, offset: number): void + { + const existing = this.getLayer(layerId); + + if(!existing) return; + + if(isNaN(offset)) return; + + existing.xOffset = offset; + } + + public getLayerYOffset(layerId: number): number + { + const existing = this.getLayer(layerId); + + if(!existing) return LayerData.DEFAULT_YOFFSET; + + return existing.yOffset; + } + + public setLayerYOffset(layerId: number, offset: number): void + { + const existing = this.getLayer(layerId); + + if(!existing) return; + + if(isNaN(offset)) return; + + existing.yOffset = offset; + } + + public getLayerZOffset(layerId: number): number + { + const existing = this.getLayer(layerId); + + if(!existing) return LayerData.DEFAULT_ZOFFSET; + + return existing.zOffset; + } + + public setLayerZOffset(layerId: number, offset: number): void + { + const existing = this.getLayer(layerId); + + if(!existing) return; + + if(isNaN(offset)) return; + + existing.zOffset = offset; + } + + public get layerCount(): number + { + return this._layers.length; + } +} diff --git a/packages/room/src/object/visualization/data/DirectionalOffsetData.ts b/packages/room/src/object/visualization/data/DirectionalOffsetData.ts new file mode 100644 index 0000000..6d1993d --- /dev/null +++ b/packages/room/src/object/visualization/data/DirectionalOffsetData.ts @@ -0,0 +1,35 @@ +export class DirectionalOffsetData +{ + private _offsetX: Map; + private _offsetY: Map; + + constructor() + { + this._offsetX = new Map(); + this._offsetY = new Map(); + } + + public getXOffset(direction: number, defaultX: number): number + { + const existing = this._offsetX.get(direction); + + if(existing === undefined || existing === null) return defaultX; + + return existing; + } + + public getYOffset(direction: number, defaultY: number): number + { + const existing = this._offsetY.get(direction); + + if(existing === undefined || existing === null) return defaultY; + + return existing; + } + + public setDirection(direction: number, offsetX: number, offsetY: number): void + { + this._offsetX.set(direction, offsetX); + this._offsetY.set(direction, offsetY); + } +} \ No newline at end of file diff --git a/packages/room/src/object/visualization/data/LayerData.ts b/packages/room/src/object/visualization/data/LayerData.ts new file mode 100644 index 0000000..88ce0b1 --- /dev/null +++ b/packages/room/src/object/visualization/data/LayerData.ts @@ -0,0 +1,105 @@ +import { BLEND_MODES } from 'pixi.js'; + +export class LayerData +{ + public static DEFAULT_COUNT: number = 0; + public static DEFAULT_DIRECTION: number = 0; + public static DEFAULT_TAG: string = ''; + public static DEFAULT_BLEND_MODE: BLEND_MODES = 'normal'; + public static DEFAULT_ALPHA: number = 255; + public static DEFAULT_IGNORE_MOUSE: boolean = false; + public static DEFAULT_XOFFSET: number = 0; + public static DEFAULT_YOFFSET: number = 0; + public static DEFAULT_ZOFFSET: number = 0; + + private _tag: string = LayerData.DEFAULT_TAG; + private _blendMode: BLEND_MODES = LayerData.DEFAULT_BLEND_MODE; + private _alpha: number = LayerData.DEFAULT_ALPHA; + private _ignoreMouse: boolean = LayerData.DEFAULT_IGNORE_MOUSE; + private _xOffset: number = LayerData.DEFAULT_XOFFSET; + private _yOffset: number = LayerData.DEFAULT_YOFFSET; + private _zOffset: number = LayerData.DEFAULT_ZOFFSET; + + public setFromLayer(layer: LayerData): void + { + if(!layer) return; + + this._tag = layer.tag; + this._blendMode = layer.blendMode; + this._alpha = layer.alpha; + this._ignoreMouse = layer.ignoreMouse; + this._xOffset = layer.xOffset; + this._yOffset = layer.yOffset; + this._zOffset = layer.zOffset; + } + + public get tag(): string + { + return this._tag; + } + + public set tag(tag: string) + { + this._tag = tag; + } + + public get blendMode(): BLEND_MODES + { + return this._blendMode; + } + + public set blendMode(value: BLEND_MODES) + { + this._blendMode = value; + } + + public get alpha(): number + { + return this._alpha; + } + + public set alpha(alpha: number) + { + this._alpha = alpha; + } + + public get ignoreMouse(): boolean + { + return this._ignoreMouse; + } + + public set ignoreMouse(flag: boolean) + { + this._ignoreMouse = flag; + } + + public get xOffset(): number + { + return this._xOffset; + } + + public set xOffset(offset: number) + { + this._xOffset = offset; + } + + public get yOffset(): number + { + return this._yOffset; + } + + public set yOffset(offset: number) + { + this._yOffset = offset; + } + + public get zOffset(): number + { + return this._zOffset; + } + + public set zOffset(offset: number) + { + this._zOffset = offset; + } +} diff --git a/packages/room/src/object/visualization/data/ParticleSystemParticle.ts b/packages/room/src/object/visualization/data/ParticleSystemParticle.ts new file mode 100644 index 0000000..2378519 --- /dev/null +++ b/packages/room/src/object/visualization/data/ParticleSystemParticle.ts @@ -0,0 +1,9 @@ +import { IGraphicAsset } from '@nitrots/api'; + +export interface ParticleSystemParticle +{ + isEmitter?: boolean; + lifeTime?: number; + fade?: boolean; + frames?: IGraphicAsset[]; +} diff --git a/packages/room/src/object/visualization/data/PetSizeData.ts b/packages/room/src/object/visualization/data/PetSizeData.ts new file mode 100644 index 0000000..eb2b16f --- /dev/null +++ b/packages/room/src/object/visualization/data/PetSizeData.ts @@ -0,0 +1,130 @@ +import { IAssetGesture, IAssetPosture } from '@nitrots/api'; +import { AnimationSizeData } from './AnimationSizeData'; + +export class PetSizeData extends AnimationSizeData +{ + public static DEFAULT: number = -1; + + private _posturesToAnimations: Map = new Map(); + private _gesturesToAnimations: Map = new Map(); + private _defaultPosture: string = null; + + public processPostures(postures: { defaultPosture?: string, postures: IAssetPosture[] }): boolean + { + if(!postures) return false; + + if(postures.defaultPosture && postures.defaultPosture.length) this._defaultPosture = postures.defaultPosture; + + if(!postures.postures) return false; + + for(const posture of postures.postures) + { + if(this._posturesToAnimations.get(posture.id)) continue; + + if(this._defaultPosture === null) this._defaultPosture = posture.id; + + this._posturesToAnimations.set(posture.id, posture.animationId); + } + + if(this._posturesToAnimations.get(this._defaultPosture) === undefined) return false; + + return true; + } + + public processGestures(gestures: IAssetGesture[]): boolean + { + if(!gestures) return false; + + for(const gesture of gestures) + { + if(this._gesturesToAnimations.get(gesture.id)) continue; + + this._gesturesToAnimations.set(gesture.id, gesture.animationId); + } + + return true; + } + + public postureToAnimation(posture: string): number + { + if(!this._posturesToAnimations.get(posture)) posture = this._defaultPosture; + + return this._posturesToAnimations.get(posture); + } + + public getGestureDisabled(k: string): boolean + { + if(k === 'ded') return true; + + return false; + } + + public gestureToAnimation(gesture: string): number + { + if(!this._gesturesToAnimations.get(gesture)) return PetSizeData.DEFAULT; + + return this._gesturesToAnimations.get(gesture); + } + + public animationToPosture(k: number, _arg_2: boolean): string + { + if((k >= 0) && (k < this._posturesToAnimations.size)) + { + const keys = this._posturesToAnimations.keys(); + + for(; ;) + { + const key = keys.next(); + + if(key.done) return null; + + if(k <= 0) return key.value; + + --k; + } + } + + return (_arg_2) ? this._defaultPosture : null; + } + + public animationToGesture(index: number): string + { + if((index >= 0) && (index < this._gesturesToAnimations.size)) + { + const keys = this._gesturesToAnimations.keys(); + + for(; ;) + { + const key = keys.next(); + + if(key.done) return null; + + if(index <= 0) return key.value; + + --index; + } + } + + return null; + } + + public getGestureForAnimationId(k: number): string + { + for(const _local_2 of this._gesturesToAnimations.keys()) + { + if(this._gesturesToAnimations.get(_local_2) === k) return _local_2; + } + + return null; + } + + public get totalPostures(): number + { + return this._posturesToAnimations.size; + } + + public get totalGestures(): number + { + return this._gesturesToAnimations.size; + } +} diff --git a/packages/room/src/object/visualization/data/SizeData.ts b/packages/room/src/object/visualization/data/SizeData.ts new file mode 100644 index 0000000..bfd1953 --- /dev/null +++ b/packages/room/src/object/visualization/data/SizeData.ts @@ -0,0 +1,285 @@ +import { IAssetColor, IAssetVisualizationDirection, IAssetVisualizationLayer } from '@nitrots/api'; +import { BLEND_MODES } from 'pixi.js'; +import { ColorData } from './ColorData'; +import { DirectionData } from './DirectionData'; +import { LayerData } from './LayerData'; + +export class SizeData +{ + public static MAX_LAYERS: number = 26; + + private _layerCount: number; + private _angle: number; + + private _defaultDirection: DirectionData; + private _directions: Map; + private _colors: ColorData[]; + private _lastDirectionData: DirectionData; + private _lastDirection: number; + + constructor(layerCount: number, angle: number) + { + this._layerCount = ((layerCount < 0) ? 0 : ((layerCount > SizeData.MAX_LAYERS) ? SizeData.MAX_LAYERS : layerCount)); + this._angle = angle < 1 ? 1 : angle > 360 ? 360 : angle; + + this._defaultDirection = new DirectionData(this._layerCount); + this._directions = new Map(); + this._colors = []; + this._lastDirectionData = null; + this._lastDirection = -1; + } + + public dispose(): void + { + if(this._defaultDirection) this._defaultDirection.dispose(); + + for(const direction of this._directions.values()) + { + if(!direction) continue; + + direction.dispose(); + } + + for(const color of this._colors) + { + if(!color) continue; + + color.dispose(); + } + + this.reset(); + } + + protected reset(): void + { + this._defaultDirection = null; + this._colors = []; + this._lastDirectionData = null; + this._lastDirection = -1; + + this._directions.clear(); + } + + public processLayers(layers: { [index: string]: IAssetVisualizationLayer }): boolean + { + if(!layers) return false; + + return this.setDirectionLayers(this._defaultDirection, layers); + } + + public processDirections(directions: { [index: string]: IAssetVisualizationDirection }): boolean + { + if(!directions) return false; + + for(const key in directions) + { + const direction = directions[key]; + + if(!direction) continue; + + const directionNumber = parseInt(key); + + if(this._directions.get(directionNumber)) return false; + + const directionData = new DirectionData(this._layerCount); + + directionData.setFromDirection(this._defaultDirection); + + this.setDirectionLayers(directionData, direction.layers); + + this._directions.set(directionNumber, directionData); + + this._lastDirectionData = null; + this._lastDirection = -1; + } + + return true; + } + + public processColors(colors: { [index: string]: IAssetColor }): boolean + { + if(!colors) return false; + + for(const key in colors) + { + const color = colors[key]; + + if(!color) continue; + + const colorNumber = parseInt(key); + + if(this._colors[colorNumber]) return false; + + const colorData = new ColorData(this._layerCount); + + for(const layer in color.layers) + { + const colorLayer = color.layers[layer]; + + if(!colorLayer) continue; + + const layerId = parseInt(layer); + const colorId = colorLayer.color; + + colorData.setColorLayer(layerId, colorId); + } + + this._colors[colorNumber] = colorData; + } + + return true; + } + + private setDirectionLayers(directionData: DirectionData, layers: { [index: string]: IAssetVisualizationLayer }): boolean + { + if(!directionData || !layers) return false; + + for(const key in layers) + { + const layer = layers[key]; + + if(!layer) continue; + + const layerId = parseInt(key); + + if(layerId < 0 || (layerId >= this._layerCount)) return false; + + // TODO: check the .nitro files for inks + if(layer.ink !== undefined) directionData.setLayerBlendMode(layerId, (layer.ink?.toLowerCase() as BLEND_MODES)); + + if(layer.tag !== undefined) directionData.setLayerTag(layerId, layer.tag); + + if(layer.alpha !== undefined) directionData.setLayerAlpha(layerId, layer.alpha); + + if(layer.ignoreMouse !== undefined) directionData.setLayerIgnoreMouse(layerId, layer.ignoreMouse); + + if(layer.x !== undefined) directionData.setLayerXOffset(layerId, layer.x); + + if(layer.y !== undefined) directionData.setLayerYOffset(layerId, layer.y); + + if(layer.z !== undefined) directionData.setLayerZOffset(layerId, (layer.z / -1000)); + } + + return true; + } + + public getValidDirection(direction: number): number + { + const existing = this._directions.get(direction); + + if(existing) return direction; + + direction = (((direction % 360) + 360) % 360); + + let currentAngle = -1; + let validDirection = -1; + + for(const key of this._directions.keys()) + { + let angle = ((((key * this._angle) - direction) + 360) % 360); + + if(angle > 180) angle = (360 - angle); + + if((angle < currentAngle) || (currentAngle < 0)) + { + currentAngle = angle; + validDirection = key; + } + } + + if(validDirection >= 0) return Math.trunc(validDirection); + + return 0; + } + + public getDirectionData(direction: number): DirectionData + { + if(direction === this._lastDirection && this._lastDirectionData) return this._lastDirectionData; + + let directionData = this._directions.get(direction); + + if(!directionData) directionData = this._defaultDirection; + + this._lastDirection = direction; + this._lastDirectionData = directionData; + + return this._lastDirectionData; + } + + public getLayerTag(direction: number, layerId: number): string + { + const directionData = this.getDirectionData(direction); + + if(!directionData) return LayerData.DEFAULT_TAG; + + return directionData.getLayerTag(layerId); + } + + public getLayerBlendMode(direction: number, layerId: number): BLEND_MODES + { + const directionData = this.getDirectionData(direction); + + if(!directionData) return LayerData.DEFAULT_BLEND_MODE; + + return directionData.getLayerBlendMode(layerId); + } + + public getLayerAlpha(direction: number, layerId: number): number + { + const directionData = this.getDirectionData(direction); + + if(!directionData) return LayerData.DEFAULT_ALPHA; + + return directionData.getLayerAlpha(layerId); + } + + public getLayerColor(layerId: number, colorId: number): number + { + const existing = this._colors[colorId] as ColorData; + + if(!existing) return ColorData.DEFAULT_COLOR; + + return existing.getLayerColor(layerId); + } + + public getLayerIgnoreMouse(direction: number, layerId: number): boolean + { + const directionData = this.getDirectionData(direction); + + if(!directionData) return LayerData.DEFAULT_IGNORE_MOUSE; + + return directionData.getLayerIgnoreMouse(layerId); + } + + public getLayerXOffset(direction: number, layerId: number): number + { + const directionData = this.getDirectionData(direction); + + if(!directionData) return LayerData.DEFAULT_XOFFSET; + + return directionData.getLayerXOffset(layerId); + } + + public getLayerYOffset(direction: number, layerId: number): number + { + const directionData = this.getDirectionData(direction); + + if(!directionData) return LayerData.DEFAULT_YOFFSET; + + return directionData.getLayerYOffset(layerId); + } + + public getLayerZOffset(direction: number, layerId: number): number + { + const directionData = this.getDirectionData(direction); + + if(!directionData) return LayerData.DEFAULT_ZOFFSET; + + return directionData.getLayerZOffset(layerId); + } + + public get layerCount(): number + { + return this._layerCount; + } +} diff --git a/packages/room/src/object/visualization/data/index.ts b/packages/room/src/object/visualization/data/index.ts new file mode 100644 index 0000000..1fda26a --- /dev/null +++ b/packages/room/src/object/visualization/data/index.ts @@ -0,0 +1,15 @@ +export * from './AnimationData'; +export * from './AnimationFrame'; +export * from './AnimationFrameData'; +export * from './AnimationFrameDirectionalData'; +export * from './AnimationFrameSequenceData'; +export * from './AnimationLayerData'; +export * from './AnimationSizeData'; +export * from './AnimationStateData'; +export * from './ColorData'; +export * from './DirectionData'; +export * from './DirectionalOffsetData'; +export * from './LayerData'; +export * from './ParticleSystemParticle'; +export * from './PetSizeData'; +export * from './SizeData'; diff --git a/packages/room/src/object/visualization/furniture/FurnitureAnimatedVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureAnimatedVisualization.ts new file mode 100644 index 0000000..ef8420d --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureAnimatedVisualization.ts @@ -0,0 +1,398 @@ +import { IObjectVisualizationData, RoomObjectVariable, RoomObjectVisualizationType } from '@nitrots/api'; +import { AnimationData, AnimationFrame, AnimationStateData } from '../data'; +import { FurnitureAnimatedVisualizationData } from './FurnitureAnimatedVisualizationData'; +import { FurnitureVisualization } from './FurnitureVisualization'; + +export class FurnitureAnimatedVisualization extends FurnitureVisualization +{ + public static TYPE: string = RoomObjectVisualizationType.FURNITURE_ANIMATED; + public static DEFAULT_ANIMATION_ID: number = 0; + + protected _state: number = -1; + protected _frameIncrease: number = 1; + private _animationData: AnimationStateData = new AnimationStateData(); + private _animationScale: number = 0; + private _animationChangeTime: number = 0; + private _animatedLayerCount: number = 0; + private _directionChanged: boolean = false; + + public initialize(data: IObjectVisualizationData): boolean + { + if(!(data instanceof FurnitureAnimatedVisualizationData)) return false; + + return super.initialize(data); + } + + public dispose(): void + { + super.dispose(); + + if(this._animationData) + { + this._animationData.dispose(); + + this._animationData = null; + } + } + + protected get animatedLayerCount(): number + { + return this._animatedLayerCount; + } + + public get animationId(): number + { + return this._animationData.animationId; + } + + protected getAnimationId(animationData: AnimationStateData): number + { + if((this.animationId !== FurnitureAnimatedVisualization.DEFAULT_ANIMATION_ID) && this.data.hasAnimation(this._animationScale, this.animationId)) return this.animationId; + + return FurnitureAnimatedVisualization.DEFAULT_ANIMATION_ID; + } + + protected updateObject(scale: number, direction: number): boolean + { + if(super.updateObject(scale, direction)) + { + const state = this.object.getState(0); + + if(state !== this._state) + { + this.setAnimation(state); + + this._state = state; + + this._animationChangeTime = (this.object.model.getValue(RoomObjectVariable.FURNITURE_STATE_UPDATE_TIME) || 0); + } + + return true; + } + + return false; + } + + protected updateModel(scale: number): boolean + { + if(super.updateModel(scale)) + { + if(this.usesAnimationResetting()) + { + const updateTime = this.object.model.getValue(RoomObjectVariable.FURNITURE_STATE_UPDATE_TIME); + + if(updateTime > this._animationChangeTime) + { + this._animationChangeTime = updateTime; + + this.setAnimation(this._state); + } + } + + const state = this.object.model.getValue(RoomObjectVariable.FURNITURE_AUTOMATIC_STATE_INDEX); + + if(!isNaN(state)) + { + const animationId = this.data.getAnimationId(this._animationScale, state); + + this.setAnimation(animationId); + } + + return true; + } + + return false; + } + + private isPlayingTransition(animationData: AnimationStateData, animationId: number): boolean + { + if(!AnimationData.isTransitionFromAnimation(animationData.animationId) && !AnimationData.isTransitionToAnimation(animationData.animationId)) return false; + + if(animationId !== animationData.animationAfterTransitionId) return false; + + if(animationData.animationOver) return false; + + return true; + } + + private getCurrentState(animationData: AnimationStateData): number + { + const animationId = animationData.animationId; + + if(!AnimationData.isTransitionFromAnimation(animationId) && !AnimationData.isTransitionToAnimation(animationId)) return animationId; + + return animationData.animationAfterTransitionId; + } + + protected setAnimation(animationId: number): void + { + if(!this.data) return; + + this.setSubAnimation(this._animationData, animationId, (this._state >= 0)); + } + + protected setSubAnimation(animationData: AnimationStateData, animationId: number, _arg_3: boolean = true): boolean + { + const currentAnimation = animationData.animationId; + + if(_arg_3) + { + if(this.isPlayingTransition(animationData, animationId)) return false; + + const state = this.getCurrentState(animationData); + + if(animationId !== state) + { + if(!this.data.isImmediateChange(this._animationScale, animationId, state)) + { + let transition = AnimationData.getTransitionFromAnimationId(state); + + if(this.data.hasAnimation(this._animationScale, transition)) + { + animationData.animationAfterTransitionId = animationId; + animationId = transition; + } + else + { + transition = AnimationData.getTransitionToAnimationId(animationId); + + if(this.data.hasAnimation(this._animationScale, transition)) + { + animationData.animationAfterTransitionId = animationId; + animationId = transition; + } + } + } + } + else + { + if(AnimationData.isTransitionFromAnimation(animationData.animationId)) + { + const transition = AnimationData.getTransitionToAnimationId(animationId); + + if(this.data.hasAnimation(this._animationScale, transition)) + { + animationData.animationAfterTransitionId = animationId; + animationId = transition; + } + } + + else if(!AnimationData.isTransitionToAnimation(animationData.animationId)) + { + if(this.usesAnimationResetting()) + { + const transition = AnimationData.getTransitionFromAnimationId(state); + + if(this.data.hasAnimation(this._animationScale, transition)) + { + animationData.animationAfterTransitionId = animationId; + animationId = transition; + } + else + { + const transition = AnimationData.getTransitionToAnimationId(animationId); + + if(this.data.hasAnimation(this._animationScale, transition)) + { + animationData.animationAfterTransitionId = animationId; + animationId = transition; + } + } + } + } + } + } + + if(currentAnimation !== animationId) + { + animationData.animationId = animationId; + + return true; + } + + return false; + } + + protected getLastFramePlayed(layerId: number): boolean + { + return this._animationData.getLastFramePlayed(layerId); + } + + protected resetAllAnimationFrames(): void + { + if(!this._animationData) return; + + this._animationData.setLayerCount(this._animatedLayerCount); + } + + protected updateAnimation(scale: number): number + { + if(!this.data) return 0; + + if(scale !== this._animationScale) + { + this._animationScale = scale; + this._animatedLayerCount = this.data.getLayerCount(scale); + + this.resetAllAnimationFrames(); + } + + const update = this.updateAnimations(scale); + + this._directionChanged = false; + + return update; + } + + protected updateAnimations(scale: number): number + { + if(this._animationData.animationOver && !this._directionChanged) return 0; + + const update = this.updateFramesForAnimation(this._animationData, scale); + + if(this._animationData.animationOver) + { + if((AnimationData.isTransitionFromAnimation(this._animationData.animationId)) || (AnimationData.isTransitionToAnimation(this._animationData.animationId))) + { + this.setAnimation(this._animationData.animationAfterTransitionId); + this._animationData.animationOver = false; + } + } + + return update; + } + + protected updateFramesForAnimation(animationData: AnimationStateData, scale: number): number + { + if(animationData.animationOver && !this._directionChanged) return 0; + + const animationId = this.getAnimationId(animationData); + let frameCount = animationData.frameCounter; + + if(!frameCount) frameCount = this.data.getStartFrame(scale, animationId, this._direction); + + frameCount += this.frameIncrease; + animationData.frameCounter = frameCount; + animationData.animationOver = true; + + let animationPlayed = false; + let layerId = (this._animatedLayerCount - 1); + let update = 0; + let layerUpdate = (1 << (this._animatedLayerCount - 1)); + + while(layerId >= 0) + { + let sequenceId = 0; + + animationPlayed = animationData.getAnimationPlayed(layerId); + + if(!animationPlayed || this._directionChanged) + { + let lastFramePlayed = animationData.getLastFramePlayed(layerId); + let frame = animationData.getFrame(layerId); + + if(frame) + { + if(frame.isLastFrame && (frame.remainingFrameRepeats <= this.frameIncrease)) + { + lastFramePlayed = true; + } + } + + if((this._directionChanged || !frame) || ((frame.remainingFrameRepeats >= 0) && ((frame.remainingFrameRepeats = (frame.remainingFrameRepeats - this.frameIncrease)) <= 0))) + { + sequenceId = AnimationFrame.SEQUENCE_NOT_DEFINED; + + if(frame) sequenceId = frame.activeSequence; + + if(sequenceId === AnimationFrame.SEQUENCE_NOT_DEFINED) + { + frame = this.data.getFrame(scale, animationId, this._direction, layerId, frameCount); + } + else + { + frame = this.data.getFrameFromSequence(scale, animationId, this._direction, layerId, sequenceId, (frame.activeSequenceOffset + frame.repeats), frameCount); + } + + animationData.setFrame(layerId, frame); + + update = (update | layerUpdate); + } + + if(!frame || (frame.remainingFrameRepeats == AnimationFrame.FRAME_REPEAT_FOREVER)) + { + lastFramePlayed = true; + animationPlayed = true; + } + else + { + animationData.animationOver = false; + } + + animationData.setLastFramePlayed(layerId, lastFramePlayed); + animationData.setAnimationPlayed(layerId, animationPlayed); + } + + layerUpdate = (layerUpdate >> 1); + + layerId--; + } + + return update; + } + + protected getFrameNumber(scale: number, layerId: number): number + { + const currentFrame = this._animationData.getFrame(layerId); + + if(!currentFrame) return super.getFrameNumber(scale, layerId); + + return currentFrame.id; + } + + protected getLayerXOffset(scale: number, direction: number, layerId: number): number + { + const offset = super.getLayerXOffset(scale, direction, layerId); + + const currentFrame = this._animationData.getFrame(layerId); + + if(!currentFrame) return offset; + + return (offset + currentFrame.x); + } + + protected getLayerYOffset(scale: number, direction: number, layerId: number): number + { + const offset = super.getLayerYOffset(scale, direction, layerId); + + const currentFrame = this._animationData.getFrame(layerId); + + if(!currentFrame) return offset; + + return (offset + currentFrame.y); + } + + protected usesAnimationResetting(): boolean + { + return false; + } + + protected setDirection(direction: number): void + { + if(this._direction === direction) return; + + super.setDirection(direction); + + this._directionChanged = true; + } + + protected get frameIncrease(): number + { + return this._frameIncrease; + } + + protected get data(): FurnitureAnimatedVisualizationData + { + return this._data as FurnitureAnimatedVisualizationData; + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureAnimatedVisualizationData.ts b/packages/room/src/object/visualization/furniture/FurnitureAnimatedVisualizationData.ts new file mode 100644 index 0000000..675d19b --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureAnimatedVisualizationData.ts @@ -0,0 +1,90 @@ +import { AnimationFrame, AnimationSizeData, SizeData } from '../data'; +import { FurnitureVisualizationData } from './FurnitureVisualizationData'; + +export class FurnitureAnimatedVisualizationData extends FurnitureVisualizationData +{ + protected createSizeData(scale: number, layerCount: number, angle: number): SizeData + { + return new AnimationSizeData(layerCount, angle); + } + + protected processVisualElement(sizeData: SizeData, key: string, data: any): boolean + { + if(!sizeData || !key || !data) return false; + + switch(key) + { + case 'animations': + if(!(sizeData instanceof AnimationSizeData) || !sizeData.defineAnimations(data)) return false; + break; + default: + if(!super.processVisualElement(sizeData, key, data)) return false; + break; + } + + return true; + } + + public hasAnimation(scale: number, animationId: number): boolean + { + const size = this.getSizeData(scale) as AnimationSizeData; + + if(!size) return null; + + return size.hasAnimation(animationId); + } + + public getAnimationCount(scale: number): number + { + const size = this.getSizeData(scale) as AnimationSizeData; + + if(!size) return null; + + return size.getAnimationCount(); + } + + public getAnimationId(scale: number, animationId: number): number + { + const size = this.getSizeData(scale) as AnimationSizeData; + + if(!size) return null; + + return size.getAnimationId(animationId); + } + + public isImmediateChange(scale: number, animationId: number, _arg_3: number): boolean + { + const size = this.getSizeData(scale) as AnimationSizeData; + + if(!size) return null; + + return size.isImmediateChange(animationId, _arg_3); + } + + public getStartFrame(scale: number, animationId: number, direction: number): number + { + const size = this.getSizeData(scale) as AnimationSizeData; + + if(!size) return null; + + return size.getStartFrame(animationId, direction); + } + + public getFrame(scale: number, animationId: number, direction: number, layerId: number, frameCount: number): AnimationFrame + { + const size = this.getSizeData(scale) as AnimationSizeData; + + if(!size) return null; + + return size.getFrame(animationId, direction, layerId, frameCount); + } + + public getFrameFromSequence(scale: number, animationId: number, direction: number, layerId: number, sequenceId: number, offset: number, frameCount: number): AnimationFrame + { + const size = this.getSizeData(scale) as AnimationSizeData; + + if(!size) return null; + + return size.getFrameFromSequence(animationId, direction, layerId, sequenceId, offset, frameCount); + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureBBVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureBBVisualization.ts new file mode 100644 index 0000000..b534565 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureBBVisualization.ts @@ -0,0 +1,19 @@ +import { FurnitureBrandedImageVisualization } from './FurnitureBrandedImageVisualization'; + +export class FurnitureBBVisualization extends FurnitureBrandedImageVisualization +{ + protected getLayerXOffset(scale: number, direction: number, layerId: number): number + { + return super.getLayerXOffset(scale, direction, layerId) + this._offsetX; + } + + protected getLayerYOffset(scale: number, direction: number, layerId: number): number + { + return super.getLayerYOffset(scale, direction, layerId) + this._offsetY; + } + + protected getLayerZOffset(scale: number, direction: number, layerId: number): number + { + return super.getLayerZOffset(scale, direction, layerId) + this._offsetZ; + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureBadgeDisplayVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureBadgeDisplayVisualization.ts new file mode 100644 index 0000000..67a6c36 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureBadgeDisplayVisualization.ts @@ -0,0 +1,89 @@ +import { RoomObjectVariable } from '@nitrots/api'; +import { FurnitureAnimatedVisualization } from './FurnitureAnimatedVisualization'; + +export class FurnitureBadgeDisplayVisualization extends FurnitureAnimatedVisualization +{ + private static BADGE: string = 'BADGE'; + + private _badgeId: string = ''; + private _badgeAssetNameNormalScale: string = ''; + private _badgeAssetNameSmallScale: string = ''; + private _badgeVisibleInState: number = -1; + + protected updateModel(scale: number): boolean + { + let updateModel = super.updateModel(scale); + + const badgeStatus = this.object.model.getValue(RoomObjectVariable.FURNITURE_BADGE_IMAGE_STATUS); + const badgeId = this.object.model.getValue(RoomObjectVariable.FURNITURE_BADGE_ASSET_NAME); + + if(badgeStatus === -1) + { + this._badgeAssetNameNormalScale = ''; + this._badgeAssetNameSmallScale = ''; + } + + else if((badgeStatus === 1) && (badgeId !== this._badgeId)) + { + this._badgeId = badgeId; + this._badgeAssetNameNormalScale = this._badgeId; + + if(this._badgeAssetNameSmallScale === '') this._badgeAssetNameSmallScale = this._badgeAssetNameNormalScale + '_32'; + + const visibleInState = this.object.model.getValue(RoomObjectVariable.FURNITURE_BADGE_VISIBLE_IN_STATE); + + if(!isNaN(visibleInState)) this._badgeVisibleInState = visibleInState; + + updateModel = true; + } + + return updateModel; + } + + protected getSpriteAssetName(scale: number, layerId: number): string + { + const tag = this.getLayerTag(scale, this.direction, layerId); + + if((tag !== FurnitureBadgeDisplayVisualization.BADGE) || ((this._badgeVisibleInState !== -1) && (this.object.getState(0) !== this._badgeVisibleInState))) return super.getSpriteAssetName(scale, layerId); + + if(scale === 32) return this._badgeAssetNameSmallScale; + + return this._badgeAssetNameNormalScale; + } + + protected getLayerXOffset(scale: number, direction: number, layerId: number): number + { + let offset = super.getLayerXOffset(scale, direction, layerId); + + if(this.getLayerTag(scale, direction, layerId) === FurnitureBadgeDisplayVisualization.BADGE) + { + const asset = this.getAsset(((scale === 32) ? this._badgeAssetNameSmallScale : this._badgeAssetNameNormalScale), layerId); + + if(asset) + { + if(scale === 64) offset += ((40 - asset.width) / 2); + else offset += ((20 - asset.width) / 2); + } + } + + return offset; + } + + protected getLayerYOffset(scale: number, direction: number, layerId: number): number + { + let offset = super.getLayerYOffset(scale, direction, layerId); + + if(this.getLayerTag(scale, direction, layerId) === FurnitureBadgeDisplayVisualization.BADGE) + { + const asset = this.getAsset(((scale === 32) ? this._badgeAssetNameSmallScale : this._badgeAssetNameNormalScale), layerId); + + if(asset) + { + if(scale === 64) offset += ((40 - asset.height) / 2); + else offset += ((20 - asset.height) / 2); + } + } + + return offset; + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureBottleVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureBottleVisualization.ts new file mode 100644 index 0000000..344eefe --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureBottleVisualization.ts @@ -0,0 +1,62 @@ +import { FurnitureAnimatedVisualization } from './FurnitureAnimatedVisualization'; + +export class FurnitureBottleVisualization extends FurnitureAnimatedVisualization +{ + private static ANIMATION_ID_OFFSET_SLOW1: number = 20; + private static ANIMATION_ID_OFFSET_SLOW2: number = 9; + private static ANIMATION_ID_ROLL: number = -1; + + private _stateQueue: number[]; + private _running: boolean; + + constructor() + { + super(); + + this._stateQueue = []; + this._running = false; + } + + protected setAnimation(animationId: number): void + { + if(animationId === -1) + { + if(!this._running) + { + this._running = true; + this._stateQueue = []; + + this._stateQueue.push(FurnitureBottleVisualization.ANIMATION_ID_ROLL); + + return; + } + } + + if((animationId >= 0) && (animationId <= 7)) + { + if(this._running) + { + this._running = false; + this._stateQueue = []; + + this._stateQueue.push(FurnitureBottleVisualization.ANIMATION_ID_OFFSET_SLOW1); + this._stateQueue.push(FurnitureBottleVisualization.ANIMATION_ID_OFFSET_SLOW2 + animationId); + this._stateQueue.push(animationId); + + return; + } + + super.setAnimation(animationId); + } + } + + protected updateAnimation(scale: number): number + { + if(this.getLastFramePlayed(0)) + { + if(this._stateQueue.length) super.setAnimation(this._stateQueue.shift()); + } + + return super.updateAnimation(scale); + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureBrandedImageVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureBrandedImageVisualization.ts new file mode 100644 index 0000000..5c312be --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureBrandedImageVisualization.ts @@ -0,0 +1,210 @@ +import { RoomObjectVariable } from '@nitrots/api'; +import { GetAssetManager } from '@nitrots/assets'; +import { Texture } from 'pixi.js'; +import { FurnitureVisualization } from './FurnitureVisualization'; + +export class FurnitureBrandedImageVisualization extends FurnitureVisualization +{ + protected static BRANDED_IMAGE: string = 'branded_image'; + protected static STATE_0: number = 0; + protected static STATE_1: number = 1; + protected static STATE_2: number = 2; + protected static STATE_3: number = 3; + + protected _imageUrl: string; + protected _shortUrl: string; + protected _imageReady: boolean; + + protected _offsetX: number; + protected _offsetY: number; + protected _offsetZ: number; + protected _currentFrame: number; + protected _totalFrames: number; + + constructor() + { + super(); + + this._imageUrl = null; + this._shortUrl = null; + this._imageReady = false; + + this._offsetX = 0; + this._offsetY = 0; + this._offsetZ = 0; + this._currentFrame = -1; + this._totalFrames = -1; + } + + public dispose(): void + { + super.dispose(); + + if(this._imageUrl) + { + (this.asset && this.asset.disposeAsset(this._imageUrl)); + // dispose all + } + } + + protected updateObject(scale: number, direction: number): boolean + { + if(!super.updateObject(scale, direction)) return false; + + if(this._imageReady) this.checkAndCreateImageForCurrentState(); + + return true; + } + + protected updateModel(scale: number): boolean + { + const flag = super.updateModel(scale); + + if(flag) + { + this._offsetX = (this.object.model.getValue(RoomObjectVariable.FURNITURE_BRANDING_OFFSET_X) || 0); + this._offsetY = (this.object.model.getValue(RoomObjectVariable.FURNITURE_BRANDING_OFFSET_Y) || 0); + this._offsetZ = (this.object.model.getValue(RoomObjectVariable.FURNITURE_BRANDING_OFFSET_Z) || 0); + } + + if(!this._imageReady) + { + this._imageReady = this.checkIfImageReady(); + + if(this._imageReady) + { + this.checkAndCreateImageForCurrentState(); + + return true; + } + } + else + { + if(this.checkIfImageChanged()) + { + this._imageReady = false; + this._imageUrl = null; + + return true; + } + } + + return flag; + } + + private checkIfImageChanged(): boolean + { + const imageUrl = this.object.model.getValue(RoomObjectVariable.FURNITURE_BRANDING_IMAGE_URL); + + if(imageUrl && (imageUrl === this._imageUrl)) return false; + + (this.asset && this.asset.disposeAsset(this._imageUrl)); + + return true; + } + + protected checkIfImageReady(): boolean + { + const model = this.object && this.object.model; + + if(!model) return false; + + const imageUrl = this.object.model.getValue(RoomObjectVariable.FURNITURE_BRANDING_IMAGE_URL); + + if(!imageUrl) return false; + + if(this._imageUrl && (this._imageUrl === imageUrl)) return false; + + const imageStatus = this.object.model.getValue(RoomObjectVariable.FURNITURE_BRANDING_IMAGE_STATUS); + + if(imageStatus === 1) + { + let texture: Texture = null; + + texture = GetAssetManager().getTexture(imageUrl); + + if(!texture) return false; + + this.imageReady(texture, imageUrl); + + return true; + } + + return false; + } + + protected imageReady(texture: Texture, imageUrl: string): void + { + if(!texture) + { + this._imageUrl = null; + + return; + } + + this._imageUrl = imageUrl; + } + + protected checkAndCreateImageForCurrentState(): void + { + if(!this._imageUrl) return; + + const texture = GetAssetManager().getTexture(this._imageUrl); + + if(!texture) return; + + const state = this.object.getState(0); + + this.addBackgroundAsset(texture, state, 0); + } + + protected addBackgroundAsset(texture: Texture, state: number, frame: number): void + { + let x = 0; + let y = 0; + let flipH = false; + let flipV = false; + + switch(state) + { + case FurnitureBrandedImageVisualization.STATE_0: + x = 0; + y = 0; + flipH = false; + flipV = false; + break; + case FurnitureBrandedImageVisualization.STATE_1: + x = -(texture.width); + y = 0; + flipH = true; + flipV = false; + break; + case FurnitureBrandedImageVisualization.STATE_2: + x = -(texture.width); + y = -(texture.height); + flipH = true; + flipV = true; + break; + case FurnitureBrandedImageVisualization.STATE_3: + x = 0; + y = -(texture.height); + flipH = false; + flipV = true; + break; + } + + this.asset.addAsset(`${this._imageUrl}_${frame}`, texture, true, x, y, flipH, flipV); + } + + protected getSpriteAssetName(scale: number, layerId: number): string + { + const tag = this.getLayerTag(scale, this._direction, layerId); + + if((tag === FurnitureBrandedImageVisualization.BRANDED_IMAGE) && this._imageUrl) + { + return `${this._imageUrl}_${this.getFrameNumber(scale, layerId)}`; + } + + return super.getSpriteAssetName(scale, layerId); + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureBuilderPlaceholderVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureBuilderPlaceholderVisualization.ts new file mode 100644 index 0000000..ce769c0 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureBuilderPlaceholderVisualization.ts @@ -0,0 +1,6 @@ +import { FurnitureVisualization } from './FurnitureVisualization'; + +export class FurnitureBuilderPlaceholderVisualization extends FurnitureVisualization +{ + +} \ No newline at end of file diff --git a/packages/room/src/object/visualization/furniture/FurnitureCounterClockVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureCounterClockVisualization.ts new file mode 100644 index 0000000..22ca401 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureCounterClockVisualization.ts @@ -0,0 +1,29 @@ +import { FurnitureAnimatedVisualization } from './FurnitureAnimatedVisualization'; + +export class FurnitureCounterClockVisualization extends FurnitureAnimatedVisualization +{ + private static SECONDS_SPRITE: string = 'seconds_sprite'; + private static TEN_SECONDS_SPRITE: string = 'ten_seconds_sprite'; + private static MINUTES_SPRITE: string = 'minutes_sprite'; + private static TEN_MINUTES_SPRITE: string = 'ten_minutes_sprite'; + + protected getFrameNumber(scale: number, layerId: number): number + { + const tag = this.getLayerTag(scale, this.direction, layerId); + const animation = this.object.getState(0); + + switch(tag) + { + case FurnitureCounterClockVisualization.SECONDS_SPRITE: return Math.floor((animation % 60) % 10); + case FurnitureCounterClockVisualization.TEN_SECONDS_SPRITE: return Math.floor((animation % 60) / 10); + case FurnitureCounterClockVisualization.MINUTES_SPRITE: return Math.floor((animation / 60) % 10); + case FurnitureCounterClockVisualization.TEN_MINUTES_SPRITE: return Math.floor(((animation / 60) / 10) % 10); + default: return super.getFrameNumber(scale, layerId); + } + } + + public get animationId(): number + { + return 0; + } +} \ No newline at end of file diff --git a/packages/room/src/object/visualization/furniture/FurnitureCuboidVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureCuboidVisualization.ts new file mode 100644 index 0000000..6aea624 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureCuboidVisualization.ts @@ -0,0 +1,6 @@ +import { RoomObjectSpriteVisualization } from '../RoomObjectSpriteVisualization'; + +export class FurnitureCuboidVisualization extends RoomObjectSpriteVisualization +{ + +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureDynamicThumbnailVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureDynamicThumbnailVisualization.ts new file mode 100644 index 0000000..b6f4566 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureDynamicThumbnailVisualization.ts @@ -0,0 +1,56 @@ +import { Texture } from 'pixi.js'; +import { IsometricImageFurniVisualization } from './IsometricImageFurniVisualization'; + +export class FurnitureDynamicThumbnailVisualization extends IsometricImageFurniVisualization +{ + private _cachedUrl: string; + + constructor() + { + super(); + + this._cachedUrl = null; + this._hasOutline = true; + } + + protected updateModel(scale: number): boolean + { + if(this.object) + { + const thumbnailUrl = this.getThumbnailURL(); + + if(this._cachedUrl !== thumbnailUrl) + { + this._cachedUrl = thumbnailUrl; + + if(this._cachedUrl && (this._cachedUrl !== '')) + { + const image = new Image(); + + image.src = thumbnailUrl; + image.crossOrigin = '*'; + + image.onload = () => + { + const texture = Texture.from(image); + + texture.source.scaleMode = 'linear'; + + this.setThumbnailImages(texture); + }; + } + else + { + this.setThumbnailImages(null); + } + } + } + + return super.updateModel(scale); + } + + protected getThumbnailURL(): string + { + throw (new Error('This method must be overridden!')); + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureExternalImageVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureExternalImageVisualization.ts new file mode 100644 index 0000000..1261ff7 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureExternalImageVisualization.ts @@ -0,0 +1,51 @@ +import { RoomObjectVariable } from '@nitrots/api'; +import { FurnitureDynamicThumbnailVisualization } from './FurnitureDynamicThumbnailVisualization'; + +export class FurnitureExternalImageVisualization extends FurnitureDynamicThumbnailVisualization +{ + private _url: string; + private _typePrefix: string; + + constructor() + { + super(); + + this._url = null; + this._typePrefix = null; + } + + protected getThumbnailURL(): string + { + if(!this.object) return null; + + if(this._url) return this._url; + + const jsonString = this.object.model.getValue(RoomObjectVariable.FURNITURE_DATA); + + if(!jsonString || jsonString === '') return null; + + if(this.object.type.indexOf('') >= 0) + { + this._typePrefix = (this.object.type.indexOf('') >= 0) ? '' : 'postcards/selfie/'; + } + + const json = JSON.parse(jsonString); + + let url = (json.w || ''); + + url = this.buildThumbnailUrl(url); + + this._url = url; + + return this._url; + } + + private buildThumbnailUrl(url: string): string + { + url = url.replace('.png', '_small.png'); + + if(url.indexOf('.png') === -1) url = (url + '_small.png'); + + return url; + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureFireworksVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureFireworksVisualization.ts new file mode 100644 index 0000000..1521060 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureFireworksVisualization.ts @@ -0,0 +1,110 @@ +import { IAdvancedMap, IParticleSystem, RoomObjectVariable } from '@nitrots/api'; +import { AdvancedMap, NitroLogger } from '@nitrots/utils'; +import { FurnitureAnimatedVisualization } from './FurnitureAnimatedVisualization'; +import { FurnitureParticleSystem } from './FurnitureParticleSystem'; + +export class FurnitureFireworksVisualization extends FurnitureAnimatedVisualization +{ + private _particleSystems: IAdvancedMap; + private _currentParticleSystem: FurnitureParticleSystem; + + public dispose(): void + { + super.dispose(); + + this._currentParticleSystem = null; + + if(this._particleSystems) + { + for(const particleSystem of this._particleSystems.getValues()) particleSystem.dispose(); + + this._particleSystems = null; + } + } + + protected updateObject(scale: number, direction: number): boolean + { + if(super.updateObject(scale, direction)) + { + if(!this._particleSystems) + { + this.readDefinition(); + + if(this._particleSystems) this._currentParticleSystem = this._particleSystems.getValue(scale); + + else NitroLogger.log('ERROR Particle systems could not be read!', this.object.type); + } + else + { + if((scale !== this._scale) || (this._particleSystems.getValue(scale) !== this._currentParticleSystem)) + { + const particleSystem = this._particleSystems.getValue(scale); + + particleSystem.copyStateFrom(this._currentParticleSystem); + + if(this._currentParticleSystem) this._currentParticleSystem.reset(); + + this._currentParticleSystem = particleSystem; + } + } + + return true; + } + + return false; + } + + protected updateSprites(scale: number, update: boolean, animation: number): void + { + super.updateSprites(scale, update, animation); + + if(this._currentParticleSystem) this._currentParticleSystem.updateSprites(); + } + + protected updateAnimation(scale: number): number + { + if(this._currentParticleSystem) this._currentParticleSystem.updateAnimation(); + + return super.updateAnimation(scale); + } + + protected setAnimation(id: number): void + { + if(this._currentParticleSystem) this._currentParticleSystem.setAnimation(id); + + super.setAnimation(id); + } + + protected getLayerYOffset(scale: number, direction: number, layerId: number): number + { + if(this._currentParticleSystem && this._currentParticleSystem.controlsSprite(layerId)) + { + return this._currentParticleSystem.getLayerYOffset(scale, direction, layerId); + } + + return super.getLayerYOffset(scale, direction, layerId); + } + + private readDefinition(): boolean + { + if(!this.object || !this.object.model) return false; + + const fireworksData = this.object.model.getValue(RoomObjectVariable.FURNITURE_FIREWORKS_DATA); + + if(!fireworksData || !fireworksData.length) return false; + + this._particleSystems = new AdvancedMap(); + + for(const particleData of fireworksData) + { + const size = particleData.size; + const particleSystem = new FurnitureParticleSystem(this); + + particleSystem.parseData(particleData); + + this._particleSystems.add(size, particleSystem); + } + + return true; + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureGiftWrappedFireworksVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureGiftWrappedFireworksVisualization.ts new file mode 100644 index 0000000..586ef49 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureGiftWrappedFireworksVisualization.ts @@ -0,0 +1,78 @@ +import { IRoomGeometry, RoomObjectVariable } from '@nitrots/api'; +import { FurnitureFireworksVisualization } from './FurnitureFireworksVisualization'; + +export class FurnitureGiftWrappedFireworksVisualization extends FurnitureFireworksVisualization +{ + private static PRESENT_DEFAULT_STATE: number = 0; + private static MAX_PACKET_TYPE_VALUE: number = 9; + private static MAX_RIBBON_TYPE_VALUE: number = 11; + + private _packetType: number = 0; + private _ribbonType: number = 0; + private _lastAnimationId: number = 0; + + public update(geometry: IRoomGeometry, time: number, update: boolean, skipUpdate: boolean) + { + this.updatePresentWrap(); + + super.update(geometry, time, update, skipUpdate); + } + + private updatePresentWrap(): void + { + if(!this.object) return; + + const local3 = 1000; + const extras = this.object.model.getValue(RoomObjectVariable.FURNITURE_EXTRAS); + + const typeIndex = parseInt(extras); + const packetType = Math.floor((typeIndex / local3)); + const ribbonType = (typeIndex % local3); + + this._packetType = ((packetType > FurnitureGiftWrappedFireworksVisualization.MAX_PACKET_TYPE_VALUE) ? 0 : packetType); + this._ribbonType = ((ribbonType > FurnitureGiftWrappedFireworksVisualization.MAX_RIBBON_TYPE_VALUE) ? 0 : ribbonType); + } + + public getFrameNumber(scale: number, layerId: number): number + { + if(this._lastAnimationId === FurnitureGiftWrappedFireworksVisualization.PRESENT_DEFAULT_STATE) + { + if(layerId <= 1) return this._packetType; + + if(layerId === 2) return this._ribbonType; + } + + return super.getFrameNumber(scale, layerId); + } + + public getSpriteAssetName(scale: number, layerId: number): string + { + const size = this.getValidSize(scale); + + let assetName = this._type; + let layerCode = ''; + + if(layerId < (this.spriteCount - 1)) + { + layerCode = String.fromCharCode(('a'.charCodeAt(0) + layerId)); + } + else + { + layerCode = 'sd'; + } + + const frameNumber = this.getFrameNumber(scale, layerId); + + assetName = (assetName + ((((('_' + size) + '_') + layerCode) + '_') + this.direction)); + assetName = (assetName + ('_' + frameNumber)); + + return assetName; + } + + protected setAnimation(animationId: number): void + { + this._lastAnimationId = animationId; + + super.setAnimation(animationId); + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureGiftWrappedVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureGiftWrappedVisualization.ts new file mode 100644 index 0000000..abdb9ae --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureGiftWrappedVisualization.ts @@ -0,0 +1,60 @@ +import { IRoomGeometry, RoomObjectVariable } from '@nitrots/api'; +import { FurnitureVisualization } from './FurnitureVisualization'; + +export class FurnitureGiftWrappedVisualization extends FurnitureVisualization +{ + private _packetType: number = 0; + private _ribbonType: number = 0; + + public update(geometry: IRoomGeometry, time: number, update: boolean, skipUpdate: boolean): void + { + this.updatePresentWrap(); + + super.update(geometry, time, update, skipUpdate); + } + + private updatePresentWrap(): void + { + if(!this.object) return; + + const extras = this.object.model.getValue(RoomObjectVariable.FURNITURE_EXTRAS); + + const local3 = 1000; + const typeIndex = parseInt(extras); + + this._packetType = Math.floor((typeIndex / local3)); + this._ribbonType = (typeIndex % local3); + } + + public getFrameNumber(scale: number, layerId: number): number + { + if(layerId <= 1) return this._packetType; + + return this._ribbonType; + } + + public getSpriteAssetName(scale: number, layerId: number): string + { + const size = this.getValidSize(scale); + + let assetName = this._type; + let layerCode = ''; + + if(layerId < (this.spriteCount - 1)) + { + layerCode = String.fromCharCode(('a'.charCodeAt(0) + layerId)); + } + else + { + layerCode = 'sd'; + } + + const frameNumber = this.getFrameNumber(scale, layerId); + + assetName = (assetName + ((((('_' + size) + '_') + layerCode) + '_') + this.direction)); + assetName = (assetName + ('_' + frameNumber)); + + return assetName; + + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureGuildCustomizedVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureGuildCustomizedVisualization.ts new file mode 100644 index 0000000..802253d --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureGuildCustomizedVisualization.ts @@ -0,0 +1,89 @@ +import { IGraphicAsset, IRoomObjectSprite, RoomObjectVariable } from '@nitrots/api'; +import { FurnitureAnimatedVisualization } from './FurnitureAnimatedVisualization'; + +export class FurnitureGuildCustomizedVisualization extends FurnitureAnimatedVisualization +{ + public static PRIMARY_COLOUR_SPRITE_TAG: string = 'COLOR1'; + public static SECONDARY_COLOUR_SPRITE_TAG: string = 'COLOR2'; + public static BADGE: string = 'BADGE'; + public static DEFAULT_COLOR_1: number = 0xEEEEEE; + public static DEFAULT_COLOR_2: number = 0x4B4B4B; + + private _color1: number; + private _color2: number; + private _badgeAssetNameNormalScale: string; + private _badgeAssetNameSmallScale: string; + + constructor() + { + super(); + + this._color1 = FurnitureGuildCustomizedVisualization.DEFAULT_COLOR_1; + this._color2 = FurnitureGuildCustomizedVisualization.DEFAULT_COLOR_2; + this._badgeAssetNameNormalScale = ''; + this._badgeAssetNameSmallScale = ''; + } + + protected updateModel(scale: number): boolean + { + const flag = super.updateModel(scale); + + if(this._badgeAssetNameNormalScale === '') + { + const assetName = this.object.model.getValue(RoomObjectVariable.FURNITURE_GUILD_CUSTOMIZED_ASSET_NAME); + + if(assetName) + { + this._badgeAssetNameNormalScale = assetName; + this._badgeAssetNameSmallScale = (this._badgeAssetNameNormalScale + '_32'); + } + } + + const color1 = this.object.model.getValue(RoomObjectVariable.FURNITURE_GUILD_CUSTOMIZED_COLOR_1); + + this._color1 = color1 ? color1 : FurnitureGuildCustomizedVisualization.DEFAULT_COLOR_1; + + const color2 = this.object.model.getValue(RoomObjectVariable.FURNITURE_GUILD_CUSTOMIZED_COLOR_2); + + this._color2 = color2 ? color2 : FurnitureGuildCustomizedVisualization.DEFAULT_COLOR_2; + + return flag; + } + + protected getLayerColor(scale: number, layerId: number, colorId: number): number + { + const tag = this.getLayerTag(scale, this._direction, layerId); + + switch(tag) + { + case FurnitureGuildCustomizedVisualization.PRIMARY_COLOUR_SPRITE_TAG: return this._color1; + case FurnitureGuildCustomizedVisualization.SECONDARY_COLOUR_SPRITE_TAG: return this._color2; + } + + return super.getLayerColor(scale, layerId, colorId); + } + + public getSpriteAssetName(scale: number, layerId: number): string + { + const tag = this.getLayerTag(scale, this._direction, layerId); + + if(tag === FurnitureGuildCustomizedVisualization.BADGE) + { + if(scale === 32) return this._badgeAssetNameSmallScale; + + return this._badgeAssetNameNormalScale; + } + + return super.getSpriteAssetName(scale, layerId); + } + + protected getLibraryAssetNameForSprite(asset: IGraphicAsset, sprite: IRoomObjectSprite): string + { + if(sprite.tag === FurnitureGuildCustomizedVisualization.BADGE) + { + return '%group.badge.url%' + sprite.libraryAssetName.replace('badge_', ''); + } + + return super.getLibraryAssetNameForSprite(asset, sprite); + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureGuildIsometricBadgeVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureGuildIsometricBadgeVisualization.ts new file mode 100644 index 0000000..57403bd --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureGuildIsometricBadgeVisualization.ts @@ -0,0 +1,144 @@ +import { IGraphicAsset, IRoomObjectSprite, RoomObjectVariable } from '@nitrots/api'; +import { TextureUtils } from '@nitrots/utils'; +import { Matrix, Sprite, Texture } from 'pixi.js'; +import { IsometricImageFurniVisualization } from './IsometricImageFurniVisualization'; + +export class FurnitureGuildIsometricBadgeVisualization extends IsometricImageFurniVisualization +{ + public static PRIMARY_COLOUR_SPRITE_TAG: string = 'COLOR1'; + public static SECONDARY_COLOUR_SPRITE_TAG: string = 'COLOR2'; + public static DEFAULT_COLOR_1: number = 0xEEEEEE; + public static DEFAULT_COLOR_2: number = 0x4B4B4B; + + private _color1: number; + private _color2: number; + + protected updateModel(scale: number): boolean + { + const flag = super.updateModel(scale); + + if(!this.hasThumbnailImage) + { + const assetName = this.object.model.getValue(RoomObjectVariable.FURNITURE_GUILD_CUSTOMIZED_ASSET_NAME); + + if(assetName && assetName.length) this.setThumbnailImages(this.getBitmapAsset(assetName)); + } + + const color1 = this.object.model.getValue(RoomObjectVariable.FURNITURE_GUILD_CUSTOMIZED_COLOR_1); + + this._color1 = color1 ? color1 : FurnitureGuildIsometricBadgeVisualization.DEFAULT_COLOR_1; + + const color2 = this.object.model.getValue(RoomObjectVariable.FURNITURE_GUILD_CUSTOMIZED_COLOR_2); + + this._color2 = color2 ? color2 : FurnitureGuildIsometricBadgeVisualization.DEFAULT_COLOR_2; + + return flag; + } + + protected generateTransformedThumbnail(texture: Texture, asset: IGraphicAsset): Texture + { + const scale = 1.1; + const matrix = new Matrix(); + const difference = (asset.width / texture.width); + + switch(this.direction) + { + case 2: + matrix.a = difference; + matrix.b = (-0.5 * difference); + matrix.c = 0; + matrix.d = (difference * scale); + matrix.tx = 0; + matrix.ty = ((0.5 * difference) * texture.width); + break; + case 0: + case 4: + matrix.a = difference; + matrix.b = (0.5 * difference); + matrix.c = 0; + matrix.d = (difference * scale); + matrix.tx = 0; + matrix.ty = 0; + break; + default: + matrix.a = difference; + matrix.b = 0; + matrix.c = 0; + matrix.d = difference; + matrix.tx = 0; + matrix.ty = 0; + } + + const sprite = new Sprite(texture); + + sprite.setFromMatrix(matrix); + + sprite.position.set(0); + + return TextureUtils.generateTexture(sprite); + + /* const renderTexture = RenderTexture.create({ + width: asset.width, + height: asset.height + }); + + PixiApplicationProxy.instance.renderer.render(sprite, { + renderTexture, + clear: true, + }); + + return renderTexture; */ + + /* const sprite = new NitroSprite(texture); + + const renderTexture = RenderTexture.create({ + width: (asset.width + matrix.tx), + height: (asset.height + matrix.ty) + }); + + sprite.position.set(0) + + PixiApplicationProxy.instance.renderer.render(sprite, { + renderTexture, + clear: true, + transform: matrix + }); + + return renderTexture; */ + } + + protected getLayerColor(scale: number, layerId: number, colorId: number): number + { + const tag = this.getLayerTag(scale, this._direction, layerId); + + switch(tag) + { + case FurnitureGuildIsometricBadgeVisualization.PRIMARY_COLOUR_SPRITE_TAG: return this._color1; + case FurnitureGuildIsometricBadgeVisualization.SECONDARY_COLOUR_SPRITE_TAG: return this._color2; + } + + return super.getLayerColor(scale, layerId, colorId); + } + + protected getLibraryAssetNameForSprite(asset: IGraphicAsset, sprite: IRoomObjectSprite): string + { + if(sprite.tag === FurnitureGuildIsometricBadgeVisualization.THUMBNAIL) + { + if(this.object && this.object.model.getValue(RoomObjectVariable.FURNITURE_GUILD_CUSTOMIZED_ASSET_NAME)) + { + return '%group.badge.url%' + this.object.model.getValue(RoomObjectVariable.FURNITURE_GUILD_CUSTOMIZED_ASSET_NAME); + } + } + + return super.getLibraryAssetNameForSprite(asset, sprite); + } + + private getBitmapAsset(name: string) + { + const asset = this.asset.getAsset(name); + + if(!asset || !asset.texture) return null; + + return asset.texture; + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureHabboWheelVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureHabboWheelVisualization.ts new file mode 100644 index 0000000..628d811 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureHabboWheelVisualization.ts @@ -0,0 +1,64 @@ +import { FurnitureAnimatedVisualization } from './FurnitureAnimatedVisualization'; + +export class FurnitureHabboWheelVisualization extends FurnitureAnimatedVisualization +{ + private static ANIMATION_ID_OFFSET_SLOW1: number = 10; + private static ANIMATION_ID_OFFSET_SLOW2: number = 20; + private static ANIMATION_ID_START_ROLL: number = 31; + private static ANIMATION_ID_ROLL: number = 32; + + private _stateQueue: number[]; + private _running: boolean; + + constructor() + { + super(); + + this._stateQueue = []; + this._running = false; + } + + protected setAnimation(animationId: number): void + { + if(animationId === -1) + { + if(!this._running) + { + this._running = true; + this._stateQueue = []; + + this._stateQueue.push(FurnitureHabboWheelVisualization.ANIMATION_ID_START_ROLL); + this._stateQueue.push(FurnitureHabboWheelVisualization.ANIMATION_ID_ROLL); + + return; + } + } + + if((animationId > 0) && (animationId <= FurnitureHabboWheelVisualization.ANIMATION_ID_OFFSET_SLOW1)) + { + if(this._running) + { + this._running = false; + this._stateQueue = []; + + this._stateQueue.push(FurnitureHabboWheelVisualization.ANIMATION_ID_OFFSET_SLOW1 + animationId); + this._stateQueue.push(FurnitureHabboWheelVisualization.ANIMATION_ID_OFFSET_SLOW2 + animationId); + this._stateQueue.push(animationId); + + return; + } + + super.setAnimation(animationId); + } + } + + protected updateAnimation(scale: number): number + { + if(this.getLastFramePlayed(1) && this.getLastFramePlayed(2) && this.getLastFramePlayed(3)) + { + if(this._stateQueue.length) super.setAnimation(this._stateQueue.shift()); + } + + return super.updateAnimation(scale); + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureIsometricBBVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureIsometricBBVisualization.ts new file mode 100644 index 0000000..7cc55f7 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureIsometricBBVisualization.ts @@ -0,0 +1,75 @@ +import { IGraphicAsset } from '@nitrots/api'; +import { GetAssetManager } from '@nitrots/assets'; +import { TextureUtils } from '@nitrots/utils'; +import { Matrix, Sprite, Texture } from 'pixi.js'; +import { FurnitureBBVisualization } from './FurnitureBBVisualization'; +import { FurnitureBrandedImageVisualization } from './FurnitureBrandedImageVisualization'; + +export class FurnitureIsometricBBVisualization extends FurnitureBBVisualization +{ + private _needsTransform: boolean = true; + + protected generateTransformedImage(texture: Texture, asset: IGraphicAsset): void + { + const scale = 1.1; + const matrix = new Matrix(); + const difference = (asset.width / texture.width); + + switch(this.direction) + { + case 2: + matrix.a = difference; + matrix.b = (-0.5 * difference); + matrix.c = 0; + matrix.d = (difference * scale); + matrix.tx = 0; + matrix.ty = ((0.5 * difference) * texture.width); + break; + case 0: + case 4: + matrix.a = difference; + matrix.b = (0.5 * difference); + matrix.c = 0; + matrix.d = (difference * scale); + matrix.tx = 0; + matrix.ty = 0; + break; + default: + matrix.a = difference; + matrix.b = 0; + matrix.c = 0; + matrix.d = difference; + matrix.tx = 0; + matrix.ty = 0; + } + + const sprite = new Sprite(texture); + const newTexture = TextureUtils.createAndWriteRenderTexture((asset.width + matrix.tx), (asset.height + matrix.ty), sprite, matrix); + + this.asset.disposeAsset(`${this._imageUrl}_0`); + this.asset.addAsset(`${this._imageUrl}_0`, newTexture, true, sprite.x, sprite.y, asset.flipH, asset.flipV); + + this._needsTransform = false; + } + + protected checkAndCreateImageForCurrentState(): void + { + super.checkAndCreateImageForCurrentState(); + + this._needsTransform = true; + } + + protected getSpriteAssetName(scale: number, layerId: number): string + { + const tag = this.getLayerTag(scale, this._direction, layerId); + + if((tag === FurnitureBrandedImageVisualization.BRANDED_IMAGE) && this._imageUrl) + { + if(this._needsTransform) this.generateTransformedImage(GetAssetManager().getTexture(this._imageUrl), this.getAsset(super.getSpriteAssetName(scale, layerId))); + + return `${this._imageUrl}_${this.getFrameNumber(scale, layerId)}`; + } + + return super.getSpriteAssetName(scale, layerId); + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureMannequinVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureMannequinVisualization.ts new file mode 100644 index 0000000..7574dca --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureMannequinVisualization.ts @@ -0,0 +1,143 @@ +import { AvatarSetType, IAvatarImage, IAvatarImageListener, IGraphicAsset, IObjectVisualizationData, RoomObjectVariable } from '@nitrots/api'; +import { Texture } from 'pixi.js'; +import { FurnitureMannequinVisualizationData } from './FurnitureMannequinVisualizationData'; +import { FurnitureVisualization } from './FurnitureVisualization'; +export class FurnitureMannequinVisualization extends FurnitureVisualization implements IAvatarImageListener +{ + private static AVATAR_IMAGE_SPRITE_TAG: string = 'avatar_image'; + + private _mannequinScale: number = -1; + private _figure: string = null; + private _gender: string = null; + private _avatarImage: IAvatarImage = null; + private _avatarWidth: number = 90; + private _avatarHeight: number = 130; + private _needsUpdate: boolean = false; + private _placeHolderFigure: string = 'hd-99999-99998'; + private _disposed: boolean = false; + + public initialize(data: IObjectVisualizationData): boolean + { + if(!(data instanceof FurnitureMannequinVisualizationData)) return false; + + return super.initialize(data); + } + + public dispose(): void + { + if(this._disposed) return; + + this._disposed = true; + + if(this._avatarImage) + { + this._avatarImage.dispose(); + + this._avatarImage = null; + } + + super.dispose(); + } + + protected updateObject(scale: number, direction: number): boolean + { + const updateObject = super.updateObject(scale, direction); + + if(updateObject) + { + if(this._mannequinScale !== scale) + { + this._mannequinScale = scale; + + this.updateAvatar(); + } + } + + return updateObject; + } + + protected updateModel(scale: number): boolean + { + let updateModel = super.updateModel(scale); + + if(updateModel) + { + const figure = (this.object.model.getValue(RoomObjectVariable.FURNITURE_MANNEQUIN_FIGURE) || null); + + if(figure) + { + this._figure = `${ figure }.${ this._placeHolderFigure }`; + this._gender = (this.object.model.getValue(RoomObjectVariable.FURNITURE_MANNEQUIN_GENDER) || null); + + this.updateAvatar(); + } + } + + updateModel = (updateModel || this._needsUpdate); + + this._needsUpdate = false; + + return updateModel; + } + + private updateAvatar(): void + { + if(this._avatarImage) + { + this._avatarImage.dispose(); + + this._avatarImage = null; + } + + this._avatarImage = this.data.createAvatarImage(this._figure, this._mannequinScale, this._gender, this); + } + + public resetFigure(figure: string): void + { + this.updateAvatar(); + + this._needsUpdate = true; + } + + protected getLayerXOffset(scale: number, direction: number, layerId: number): number + { + const tag = this.getLayerTag(scale, direction, layerId); + + if((tag === FurnitureMannequinVisualization.AVATAR_IMAGE_SPRITE_TAG) && this._avatarImage) return (-(this._avatarWidth) / 3); + + return super.getLayerXOffset(scale, direction, layerId); + } + + protected getLayerYOffset(scale: number, direction: number, layerId: number): number + { + const tag = this.getLayerTag(scale, direction, layerId); + + if((tag === FurnitureMannequinVisualization.AVATAR_IMAGE_SPRITE_TAG) && this._avatarImage) return (-(this._avatarHeight) / 3); + + return super.getLayerYOffset(scale, direction, layerId); + } + + public getTexture(scale: number, layerId: number, asset: IGraphicAsset): Texture + { + const tag = this.getLayerTag(scale, this.direction, layerId); + + if((tag === FurnitureMannequinVisualization.AVATAR_IMAGE_SPRITE_TAG) && this._avatarImage) + { + this._avatarImage.setDirection(AvatarSetType.FULL, this.direction); + + return this._avatarImage.processAsTexture(AvatarSetType.FULL, false); + } + + return super.getTexture(scale, layerId, asset); + } + + public get disposed(): boolean + { + return this._disposed; + } + + protected get data(): FurnitureMannequinVisualizationData + { + return this._data as FurnitureMannequinVisualizationData; + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureMannequinVisualizationData.ts b/packages/room/src/object/visualization/furniture/FurnitureMannequinVisualizationData.ts new file mode 100644 index 0000000..a9c43e3 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureMannequinVisualizationData.ts @@ -0,0 +1,32 @@ +import { IAvatarEffectListener, IAvatarImage, IAvatarImageListener } from '@nitrots/api'; +import { AvatarVisualizationData } from '../avatar'; +import { FurnitureVisualizationData } from './FurnitureVisualizationData'; + +export class FurnitureMannequinVisualizationData extends FurnitureVisualizationData +{ + private _avatarData: AvatarVisualizationData; + + constructor() + { + super(); + + this._avatarData = new AvatarVisualizationData(); + } + + public dispose(): void + { + super.dispose(); + + if(this._avatarData) + { + this._avatarData.dispose(); + + this._avatarData = null; + } + } + + public createAvatarImage(figure: string, size: number, gender: string = null, avatarListener: IAvatarImageListener = null, effectListener: IAvatarEffectListener = null): IAvatarImage + { + return this._avatarData.createAvatarImage(figure, size, gender, avatarListener, effectListener); + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureParticleSystem.ts b/packages/room/src/object/visualization/furniture/FurnitureParticleSystem.ts new file mode 100644 index 0000000..15d0d69 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureParticleSystem.ts @@ -0,0 +1,313 @@ +import { IAdvancedMap, IGraphicAsset, IParticleSystem, IRoomObjectSprite } from '@nitrots/api'; +import { AdvancedMap, TextureUtils, Vector3d } from '@nitrots/utils'; +import { AlphaFilter, Graphics, Matrix, Point, Sprite, Texture } from 'pixi.js'; +import { FurnitureAnimatedVisualization } from './FurnitureAnimatedVisualization'; +import { FurnitureParticleSystemEmitter } from './FurnitureParticleSystemEmitter'; + +export class FurnitureParticleSystem +{ + private _emitters: IAdvancedMap; + private _visualization: FurnitureAnimatedVisualization; + private _size: number; + private _canvasId: number = -1; + private _offsetY: number; + private _currentEmitter: FurnitureParticleSystemEmitter; + private _canvasTexture: Texture; + private _roomSprite: IRoomObjectSprite; + private _hasIgnited: boolean = false; + private _centerX: number = 0; + private _centerY: number = 0; + private _scaleMultiplier: number = 1; + private _blackOverlay: Graphics; + private _blackOverlayAlphaTransform: AlphaFilter; + private _particleColorTransform: AlphaFilter; + private _identityMatrix: Matrix; + private _translationMatrix: Matrix; + private _blend: number = 1; + private _bgColor: number = 0xFF000000; + private _emptySprite: Sprite; + private _isDone: boolean = false; + + constructor(visualization: FurnitureAnimatedVisualization) + { + this._emitters = new AdvancedMap(); + this._visualization = visualization; + this._blackOverlayAlphaTransform = new AlphaFilter(); + this._blackOverlayAlphaTransform.alpha = 1; + this._particleColorTransform = new AlphaFilter(); + this._identityMatrix = new Matrix(); + this._translationMatrix = new Matrix(); + } + + public dispose(): void + { + for(const emitter of this._emitters.getValues()) emitter.dispose(); + + this._emitters = null; + + if(this._canvasTexture) + { + this._canvasTexture.destroy(); + this._canvasTexture = null; + } + + if(this._blackOverlay) + { + this._blackOverlay.destroy(); + this._blackOverlay = null; + } + + if(this._emptySprite) + { + this._emptySprite.destroy(); + this._emptySprite = null; + } + + this._blackOverlayAlphaTransform = null; + this._particleColorTransform = null; + this._identityMatrix = null; + this._translationMatrix = null; + } + + public reset(): void + { + if(this._currentEmitter) this._currentEmitter.reset(); + + this._currentEmitter = null; + this._hasIgnited = false; + this._isDone = false; + + this.updateCanvas(); + } + + public setAnimation(id: number): void + { + if(this._currentEmitter) this._currentEmitter.reset(); + + this._currentEmitter = this._emitters.getValue(id); + this._hasIgnited = false; + this._isDone = false; + + this.updateCanvas(); + } + + private updateCanvas(): void + { + if(!this._currentEmitter || (this._canvasId === -1)) return; + + this._roomSprite = this._visualization.getSprite(this._canvasId); + + if(this._roomSprite && this._roomSprite.texture) + { + if((this._roomSprite.width <= 1) || (this._roomSprite.height <= 1)) return; + + if(this._canvasTexture && ((this._canvasTexture.width !== this._roomSprite.width) || (this._canvasTexture.height !== this._roomSprite.height))) this._canvasTexture = null; + + this.clearCanvas(); + + this._centerX = -(this._roomSprite.offsetX); + this._centerY = -(this._roomSprite.offsetY); + this._roomSprite.texture = this._canvasTexture; + } + } + + public getLayerYOffset(scale: number, direction: number, layerId: number): number + { + if(this._currentEmitter && (this._currentEmitter.roomObjectSpriteId === layerId)) + { + return this._currentEmitter.y * this._scaleMultiplier; + } + + return 0; + } + + public controlsSprite(k: number): boolean + { + if(this._currentEmitter) return this._currentEmitter.roomObjectSpriteId == k; + + return false; + } + + public updateSprites(): void + { + if(!this._currentEmitter || !this._roomSprite) return; + + if(this._canvasTexture && (this._roomSprite.texture !== this._canvasTexture)) + { + this._roomSprite.texture = this._canvasTexture; + } + + if(this._hasIgnited) + { + if(this._currentEmitter.roomObjectSpriteId >= 0) this._visualization.getSprite(this._currentEmitter.roomObjectSpriteId).visible = false; + } + } + + public updateAnimation(): void + { + if(!this._currentEmitter || !this._roomSprite || this._isDone) return; + + const k = 10; + + if(!this._hasIgnited && this._currentEmitter.hasIgnited) this._hasIgnited = true; + + const offsetY = (this._offsetY * this._scaleMultiplier); + + this._currentEmitter.update(); + + if(this._hasIgnited) + { + if(this._currentEmitter.roomObjectSpriteId >= 0) + { + this._visualization.getSprite(this._currentEmitter.roomObjectSpriteId).visible = false; + } + + if(!this._canvasTexture) this.updateCanvas(); + + this.clearCanvas(); + + for(const particle of this._currentEmitter.particles) + { + const tx = (this._centerX + ((((particle.x - particle.z) * k) / 10) * this._scaleMultiplier)); + const ty = ((this._centerY - offsetY) + ((((particle.y + ((particle.x + particle.z) / 2)) * k) / 10) * this._scaleMultiplier)); + const asset = particle.getAsset(); + + if(asset && asset.texture) + { + if(particle.fade && (particle.alphaMultiplier < 1)) + { + this._translationMatrix.identity(); + this._translationMatrix.translate((tx + asset.offsetX), (ty + asset.offsetY)); + + const sprite = new Sprite(asset.texture); + + this._particleColorTransform.alpha = particle.alphaMultiplier; + + sprite.filters = [this._particleColorTransform]; + + TextureUtils.writeToTexture(sprite, this._canvasTexture, false, this._translationMatrix); + } + else + { + const point = new Point((tx + asset.offsetX), (ty + asset.offsetY)); + const sprite = new Sprite(asset.texture); + + sprite.x = point.x; + sprite.y = point.y; + + TextureUtils.writeToTexture(sprite, this._canvasTexture, false); + } + } + else + { + const sprite = new Sprite(Texture.WHITE); + + sprite.tint = 0xFFFFFF; + sprite.x = (tx - 1); + sprite.y = (ty - 1); + sprite.width = 2; + sprite.height = 2; + + TextureUtils.writeToTexture(sprite, this._canvasTexture, false); + } + } + + if(!this._currentEmitter.particles.length) + { + this._isDone = true; + + return; + } + } + } + + public parseData(particleSystem: IParticleSystem): void + { + this._size = particleSystem.size; + this._canvasId = ((particleSystem.canvasId !== undefined) ? particleSystem.canvasId : -1); + this._offsetY = ((particleSystem.offsetY !== undefined) ? particleSystem.offsetY : 10); + this._scaleMultiplier = (this._size / 64); + this._blend = ((particleSystem.blend !== undefined) ? particleSystem.blend : 1); + this._blend = Math.min(this._blend, 1); + + this._blackOverlayAlphaTransform.alpha = this._blend; + + const bgColor = ((particleSystem.bgColor !== undefined) ? particleSystem.bgColor : '0'); + + this._bgColor = (parseInt(bgColor, 16) || 0x000000); + + if(!particleSystem.emitters || !particleSystem.emitters.length) return; + + for(const emitter of particleSystem.emitters) + { + const emitterId = emitter.id; + const emitterName = emitter.name; + const emitterSpriteId = emitter.spriteId; + + const particleEmitter = new FurnitureParticleSystemEmitter(emitterName, emitterSpriteId); + + this._emitters.add(emitterId, particleEmitter); + + const maxNumParticles = emitter.maxNumParticles; + const particlesPerFrame = emitter.particlesPerFrame; + const burstPulse = ((emitter.burstPulse !== undefined) ? emitter.burstPulse : 1); + const fuseTime = emitter.fuseTime; + const simulationForce = emitter.simulation.force; + const simulationDirection = emitter.simulation.direction; + const simulationGravity = emitter.simulation.gravity; + const simulationAirFriction = emitter.simulation.airFriction; + const simulationShape = emitter.simulation.shape; + const simulationEnergy = emitter.simulation.energy; + + for(const particle of emitter.particles) + { + const lifeTime = particle.lifeTime; + const isEmitter = (particle.isEmitter || false); + const fade = (particle.fade || false); + + const frames: IGraphicAsset[] = []; + + for(const name of particle.frames) frames.push(this._visualization.asset.getAsset(name)); + + particleEmitter.configureParticle(lifeTime, isEmitter, frames, fade); + } + + particleEmitter.setup(maxNumParticles, particlesPerFrame, simulationForce, new Vector3d(0, simulationDirection, 0), simulationGravity, simulationAirFriction, simulationShape, simulationEnergy, fuseTime, burstPulse); + } + } + + public copyStateFrom(particleSystem: FurnitureParticleSystem): void + { + let emitterId = 0; + + if(particleSystem._emitters && particleSystem._currentEmitter) + { + emitterId = particleSystem._emitters.getKey(particleSystem._emitters.getValues().indexOf(particleSystem._currentEmitter)); + } + + this.setAnimation(emitterId); + + if(this._currentEmitter) this._currentEmitter.copyStateFrom(particleSystem._currentEmitter, (particleSystem._size / this._size)); + + this._canvasTexture = null; + } + + private clearCanvas(): void + { + if(!this._emptySprite) + { + this._emptySprite = new Sprite(Texture.EMPTY); + + this._emptySprite.alpha = 0; + } + + if(!this._canvasTexture) + { + this._canvasTexture = TextureUtils.createRenderTexture(this._roomSprite.width, this._roomSprite.height); + } + else + { + TextureUtils.writeToTexture(this._emptySprite, this._canvasTexture, true); + } + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureParticleSystemEmitter.ts b/packages/room/src/object/visualization/furniture/FurnitureParticleSystemEmitter.ts new file mode 100644 index 0000000..43b8ea1 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureParticleSystemEmitter.ts @@ -0,0 +1,277 @@ +import { IGraphicAsset, IVector3D } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; +import { ParticleSystemParticle } from '../data'; +import { FurnitureParticleSystemParticle } from './FurnitureParticleSystemParticle'; + +export class FurnitureParticleSystemEmitter extends FurnitureParticleSystemParticle +{ + public static CONE: string = 'cone'; + public static PLANE: string = 'plane'; + public static SPHERE: string = 'sphere'; + + private _name: string; + private _roomObjectSpriteId: number = -1; + private _force: number; + private _timeStep: number = 0.1; + private _gravity: number; + private _airFriction: number; + private _explosionShape: string; + private _particleConfigurations: ParticleSystemParticle[]; + private _particles: FurnitureParticleSystemParticle[]; + private _maxNumberOfParticles: number; + private _particlesPerFrame: number; + private _emittedParticles: number; + private _fuseTime: number = 10; + private _energy: number = 1; + private _hasIgnited: boolean = false; + private _burstPulse: number = 1; + private _emitterDirection: IVector3D; + + constructor(name: string = '', spriteId: number = -1) + { + super(); + + this._particles = []; + this._name = name; + this._roomObjectSpriteId = spriteId; + this._particleConfigurations = []; + } + + public dispose(): void + { + for(const k of this._particles) k.dispose(); + + this._particles = null; + this._particleConfigurations = null; + + super.dispose(); + } + + public setup(maxNumOfParticles: number, particlesPerFrame: number, force: number, direction: IVector3D, gravity: number, airFriction: number, explosionShape: string, energy: number, fuseTime: number, burstPulse: number): void + { + this._maxNumberOfParticles = maxNumOfParticles; + this._particlesPerFrame = particlesPerFrame; + this._force = force; + this._emitterDirection = direction; + this._emitterDirection.normalize(); + this._gravity = gravity; + this._airFriction = airFriction; + this._explosionShape = explosionShape; + this._fuseTime = fuseTime; + this._energy = energy; + this._burstPulse = burstPulse; + this.reset(); + } + + public reset(): void + { + for(const particle of this._particles) particle.dispose(); + + this._particles = []; + this._emittedParticles = 0; + this._hasIgnited = false; + + this.init(0, 0, 0, this._emitterDirection, this._force, this._timeStep, this._fuseTime, true); + } + + public copyStateFrom(emitter: FurnitureParticleSystemEmitter, scale: number): void + { + super.copy(emitter, scale); + + this._force = emitter._force; + this._emitterDirection = emitter._emitterDirection; + this._gravity = emitter._gravity; + this._airFriction = emitter._airFriction; + this._explosionShape = emitter._explosionShape; + this._fuseTime = emitter._fuseTime; + this._energy = emitter._energy; + this._burstPulse = emitter._burstPulse; + this._timeStep = emitter._timeStep; + this._hasIgnited = emitter._hasIgnited; + } + + public configureParticle(lifeTIme: number, isEmitter: boolean, frames: IGraphicAsset[], fade: boolean): void + { + const particle: ParticleSystemParticle = {}; + + particle.lifeTime = lifeTIme; + particle.isEmitter = isEmitter; + particle.frames = frames; + particle.fade = fade; + + this._particleConfigurations.push(particle); + } + + protected ignite(): void + { + this._hasIgnited = true; + + if(this._emittedParticles < this._maxNumberOfParticles) + { + if(this.age > 1) this.releaseParticles(this, this.direction); + } + } + + private releaseParticles(particle: FurnitureParticleSystemParticle, direction: IVector3D = null): void + { + if(!direction) direction = new Vector3d(); + + const newDirection = new Vector3d(); + const randomParticle = this.getRandomParticleConfiguration(); + + let i = 0; + + while(i < this._particlesPerFrame) + { + switch(this._explosionShape) + { + case FurnitureParticleSystemEmitter.CONE: + newDirection.x = ((this.randomBoolean(0.5)) ? Math.random() : -(Math.random())); + newDirection.y = -(Math.random() + 1); + newDirection.z = ((this.randomBoolean(0.5)) ? Math.random() : -(Math.random())); + break; + case FurnitureParticleSystemEmitter.PLANE: + newDirection.x = ((this.randomBoolean(0.5)) ? Math.random() : -(Math.random())); + newDirection.y = 0; + newDirection.z = ((this.randomBoolean(0.5)) ? Math.random() : -(Math.random())); + break; + case FurnitureParticleSystemEmitter.SPHERE: + newDirection.x = ((this.randomBoolean(0.5)) ? Math.random() : -(Math.random())); + newDirection.y = ((this.randomBoolean(0.5)) ? Math.random() : -(Math.random())); + newDirection.z = ((this.randomBoolean(0.5)) ? Math.random() : -(Math.random())); + break; + } + + newDirection.normalize(); + + const newParticle = new FurnitureParticleSystemParticle(); + + let lifeTime = 0; + let isEmitter = false; + let fade = false; + let frames: IGraphicAsset[] = []; + + if(randomParticle) + { + lifeTime = Math.floor(((Math.random() * randomParticle.lifeTime) + 10)); + isEmitter = randomParticle.isEmitter; + frames = randomParticle.frames; + fade = randomParticle.fade; + } + else + { + lifeTime = Math.trunc(Math.floor(((Math.random() * 20) + 10))); + isEmitter = false; + frames = []; + } + + newParticle.init(particle.x, particle.y, particle.z, newDirection, this._energy, this._timeStep, lifeTime, isEmitter, frames, fade); + + this._particles.push(newParticle); + this._emittedParticles++; + + i++; + } + } + + private getRandomParticleConfiguration(): ParticleSystemParticle + { + const index: number = Math.trunc(Math.floor((Math.random() * this._particleConfigurations.length))); + + return this._particleConfigurations[index]; + } + + public update(): void + { + super.update(); + + this.accumulateForces(); + this.verlet(); + this.satisfyConstraints(); + + if(!this.isAlive && (this._emittedParticles < this._maxNumberOfParticles)) + { + if((this.age % this._burstPulse) === 0) this.releaseParticles(this, this.direction); + } + } + + public verlet(): void + { + if(this.isAlive || (this._emittedParticles < this._maxNumberOfParticles)) + { + const x = this.x; + const y = this.y; + const z = this.z; + + this.x = (((2 - this._airFriction) * this.x) - ((1 - this._airFriction) * this.lastX)); + this.y = ((((2 - this._airFriction) * this.y) - ((1 - this._airFriction) * this.lastY)) + ((this._gravity * this._timeStep) * this._timeStep)); + this.z = (((2 - this._airFriction) * this.z) - ((1 - this._airFriction) * this.lastZ)); + this.lastX = x; + this.lastY = y; + this.lastZ = z; + } + + const particles: FurnitureParticleSystemParticle[] = []; + + for(const particle of this._particles) + { + particle.update(); + + const x = particle.x; + const y = particle.y; + const z = particle.z; + particle.x = (((2 - this._airFriction) * particle.x) - ((1 - this._airFriction) * particle.lastX)); + particle.y = ((((2 - this._airFriction) * particle.y) - ((1 - this._airFriction) * particle.lastY)) + ((this._gravity * this._timeStep) * this._timeStep)); + particle.z = (((2 - this._airFriction) * particle.z) - ((1 - this._airFriction) * particle.lastZ)); + particle.lastX = x; + particle.lastY = y; + particle.lastZ = z; + + if((particle.y > 10) || !particle.isAlive) particles.push(particle); + } + + for(const particle of particles) + { + if(particle.isEmitter) + { + // + } + + this._particles.splice(this._particles.indexOf(particle), 1); + + particle.dispose(); + } + } + + private satisfyConstraints(): void + { + } + + private accumulateForces(): void + { + for(const k of this._particles) + { + // + } + } + + public get particles(): FurnitureParticleSystemParticle[] + { + return this._particles; + } + + public get hasIgnited(): boolean + { + return this._hasIgnited; + } + + private randomBoolean(k: number): boolean + { + return Math.random() < k; + } + + public get roomObjectSpriteId(): number + { + return this._roomObjectSpriteId; + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureParticleSystemParticle.ts b/packages/room/src/object/visualization/furniture/FurnitureParticleSystemParticle.ts new file mode 100644 index 0000000..4620ce4 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureParticleSystemParticle.ts @@ -0,0 +1,196 @@ +import { IGraphicAsset, IVector3D } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; + +export class FurnitureParticleSystemParticle +{ + private _x: number; + private _y: number; + private _z: number; + private _lastX: number; + private _lastY: number; + private _lastZ: number; + private _hasMoved: boolean = false; + private _particleDirection: IVector3D; + private _age: number = 0; + private _lifeTime: number; + private _isEmitter: boolean = false; + private _fade: boolean = false; + private _fadeTime: number; + private _alphaMultiplier: number = 1; + private _frames: IGraphicAsset[]; + + public init(x: number, y: number, z: number, direction: IVector3D, energy: number, timeStep: number, lifeTime: number, isEmitter: boolean = false, frames: IGraphicAsset[] = null, fade: boolean = false): void + { + this._x = x; + this._y = y; + this._z = z; + this._particleDirection = new Vector3d(direction.x, direction.y, direction.z); + this._particleDirection.multiply(energy); + + this._lastX = (this._x - (this._particleDirection.x * timeStep)); + this._lastY = (this._y - (this._particleDirection.y * timeStep)); + this._lastZ = (this._z - (this._particleDirection.z * timeStep)); + this._age = 0; + this._hasMoved = false; + this._lifeTime = lifeTime; + this._isEmitter = isEmitter; + this._frames = frames; + this._fade = fade; + this._alphaMultiplier = 1; + this._fadeTime = (0.5 + (Math.random() * 0.5)); + } + + public dispose(): void + { + this._particleDirection = null; + } + + public update(): void + { + this._age++; + + if(this._age === this._lifeTime) this.ignite(); + + if(this._fade) + { + if((this._age / this._lifeTime) > this._fadeTime) + { + this._alphaMultiplier = ((this._lifeTime - this._age) / (this._lifeTime * (1 - this._fadeTime))); + } + } + } + + public getAsset(): IGraphicAsset + { + if(((this._frames) && (this._frames.length > 0))) + { + return this._frames[(this._age % this._frames.length)]; + } + return null; + } + + protected ignite(): void + { + } + + public get fade(): boolean + { + return this._fade; + } + + public get alphaMultiplier(): number + { + return this._alphaMultiplier; + } + + public get direction(): IVector3D + { + return this._particleDirection; + } + + public get age(): number + { + return this._age; + } + + public get isEmitter(): boolean + { + return this._isEmitter; + } + + public get isAlive(): boolean + { + return this._age <= this._lifeTime; + } + + public get x(): number + { + return this._x; + } + + public set x(x: number) + { + this._x = x; + } + + public get y(): number + { + return this._y; + } + + public set y(y: number) + { + this._y = y; + } + + public get z(): number + { + return this._z; + } + + public set z(z: number) + { + this._z = z; + } + + public get lastX(): number + { + return this._lastX; + } + + public set lastX(y: number) + { + this._hasMoved = true; + this._lastX = y; + } + + public get lastY(): number + { + return this._lastY; + } + + public set lastY(k: number) + { + this._hasMoved = true; + this._lastY = k; + } + + public get lastZ(): number + { + return this._lastZ; + } + + public set lastZ(z: number) + { + this._hasMoved = true; + this._lastZ = z; + } + + public get hasMoved(): boolean + { + return this._hasMoved; + } + + public toString(): string + { + return [this._x, this._y, this._z].toString(); + } + + public copy(particle: FurnitureParticleSystemParticle, scale: number): void + { + this._x = (particle._x * scale); + this._y = (particle._y * scale); + this._z = (particle._z * scale); + this._lastX = (particle._lastX * scale); + this._lastY = (particle._lastY * scale); + this._lastZ = (particle._lastZ * scale); + this._hasMoved = particle.hasMoved; + this._particleDirection = particle._particleDirection; + this._age = particle._age; + this._lifeTime = particle._lifeTime; + this._isEmitter = particle._isEmitter; + this._fade = particle._fade; + this._fadeTime = particle._fadeTime; + this._alphaMultiplier = particle._alphaMultiplier; + } +} diff --git a/packages/room/src/object/visualization/furniture/FurniturePartyBeamerVisualization.ts b/packages/room/src/object/visualization/furniture/FurniturePartyBeamerVisualization.ts new file mode 100644 index 0000000..12fbf26 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurniturePartyBeamerVisualization.ts @@ -0,0 +1,160 @@ +import { Point } from 'pixi.js'; +import { FurnitureAnimatedVisualization } from './FurnitureAnimatedVisualization'; + +export class FurniturePartyBeamerVisualization extends FurnitureAnimatedVisualization +{ + private static UPDATE_INTERVAL: number = 2; + private static AREA_DIAMETER_SMALL: number = 15; + private static AREA_DIAMETER_LARGE: number = 31; + private static ANIM_SPEED_FAST: number = 2; + private static ANIM_SPEED_SLOW: number = 1; + + private _animPhaseIndex: number[]; + private _animDirectionIndex: number[]; + private _animSpeedIndex: number[]; + private _animFactorIndex: number[]; + private _animOffsetIndex: Point[]; + + constructor() + { + super(); + + this._animOffsetIndex = []; + } + + protected updateAnimation(scale: number): number + { + if(!this._animSpeedIndex) this.initItems(scale); + + let sprite = this.getSprite(2); + + if(sprite) this._animOffsetIndex[0] = this.getNewPoint(scale, 0); + + sprite = this.getSprite(3); + + if(sprite) this._animOffsetIndex[1] = this.getNewPoint(scale, 1); + + return super.updateAnimation(scale); + } + + private getNewPoint(scale: number, layerId: number): Point + { + let diameter = 0; + + let animationPhase: number = this._animPhaseIndex[layerId]; + let animationDirection: number = this._animDirectionIndex[layerId]; + + const animationSpeed: number = this._animSpeedIndex[layerId]; + const animationFactor: number = this._animFactorIndex[layerId]; + + let _local_7 = 1; + + if(scale == 32) + { + diameter = FurniturePartyBeamerVisualization.AREA_DIAMETER_SMALL; + _local_7 = 0.5; + } + else + { + diameter = FurniturePartyBeamerVisualization.AREA_DIAMETER_LARGE; + } + + const _local_9: number = (animationPhase + (animationDirection * animationSpeed)); + + if(Math.abs(_local_9) >= diameter) + { + if(animationDirection > 0) + { + animationPhase = (animationPhase - (_local_9 - diameter)); + } + else + { + animationPhase = (animationPhase + (-(diameter) - _local_9)); + } + + animationDirection = -(animationDirection); + + this._animDirectionIndex[layerId] = animationDirection; + } + + const _local_10: number = ((diameter - Math.abs(animationPhase)) * animationFactor); + + let _local_11: number = ((animationDirection * Math.sin(Math.abs((animationPhase / 4)))) * _local_10); + + if(animationDirection > 0) + { + _local_11 = (_local_11 - _local_10); + } + else + { + _local_11 = (_local_11 + _local_10); + } + + animationPhase = (animationPhase + ((animationDirection * animationSpeed) * _local_7)); + + this._animPhaseIndex[layerId] = animationPhase; + + if(Math.trunc(_local_11) == 0) this._animFactorIndex[layerId] = this.getRandomAmplitudeFactor(); + + return new Point(animationPhase, _local_11); + } + + private initItems(scale: number): void + { + let diameter: number; + + if(scale === 32) + { + diameter = FurniturePartyBeamerVisualization.AREA_DIAMETER_SMALL; + } + else + { + diameter = FurniturePartyBeamerVisualization.AREA_DIAMETER_LARGE; + } + + this._animPhaseIndex = []; + this._animPhaseIndex.push(((Math.random() * diameter) * 1.5)); + this._animPhaseIndex.push(((Math.random() * diameter) * 1.5)); + + this._animDirectionIndex = []; + this._animDirectionIndex.push(1); + this._animDirectionIndex.push(-1); + + this._animSpeedIndex = []; + this._animSpeedIndex.push(FurniturePartyBeamerVisualization.ANIM_SPEED_FAST); + this._animSpeedIndex.push(FurniturePartyBeamerVisualization.ANIM_SPEED_SLOW); + + this._animFactorIndex = []; + this._animFactorIndex.push(this.getRandomAmplitudeFactor()); + this._animFactorIndex.push(this.getRandomAmplitudeFactor()); + } + + protected getLayerXOffset(scale: number, direction: number, layerId: number): number + { + if((layerId === 2) || (layerId === 3)) + { + if(this._animOffsetIndex.length == 2) + { + return this._animOffsetIndex[(layerId - 2)].x; + } + } + return super.getLayerXOffset(scale, direction, layerId); + } + + protected getLayerYOffset(scale: number, direction: number, layerId: number): number + { + if((layerId === 2) || (layerId === 3)) + { + if(this._animOffsetIndex.length == 2) + { + return this._animOffsetIndex[(layerId - 2)].y; + } + } + return super.getLayerYOffset(scale, direction, layerId); + } + + private getRandomAmplitudeFactor(): number + { + return ((Math.random() * 30) / 100) + 0.15; + } +} diff --git a/packages/room/src/object/visualization/furniture/FurniturePlanetSystemVisualization.ts b/packages/room/src/object/visualization/furniture/FurniturePlanetSystemVisualization.ts new file mode 100644 index 0000000..9386b9f --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurniturePlanetSystemVisualization.ts @@ -0,0 +1,134 @@ +import { IAssetLogicPlanetSystem, IVector3D, RoomObjectVariable } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; +import { FurnitureAnimatedVisualization } from './FurnitureAnimatedVisualization'; +import { FurniturePlanetSystemVisualizationPlanetObject } from './FurniturePlanetSystemVisualizationPlanetObject'; + +export class FurniturePlanetSystemVisualization extends FurnitureAnimatedVisualization +{ + private _planetIndex: FurniturePlanetSystemVisualizationPlanetObject[]; + private _planetNameIndex: string[]; + private _offsetArray: IVector3D[]; + private _rootPosition: IVector3D; + + constructor() + { + super(); + + this._offsetArray = []; + this._rootPosition = new Vector3d(); + } + + public dispose(): void + { + if(this._planetIndex) + { + while(this._planetIndex.length > 0) + { + const planet = this._planetIndex.shift(); + + planet.dispose(); + } + } + + this._planetIndex = null; + this._planetNameIndex = null; + } + + protected updateAnimation(scale: number): number + { + if(!this._planetIndex && (this.spriteCount > 0)) + { + if(!this.processPlanets()) return 0; + } + + if(this._planetIndex) + { + for(const planet of this._planetIndex) planet.update(this._offsetArray, this._rootPosition, scale); + + return super.updateAnimation(scale); + } + + return 0; + } + + protected getLayerXOffset(scale: number, direction: number, layerId: number): number + { + if(this._offsetArray[layerId]) + { + return this._offsetArray[layerId].x; + } + + return super.getLayerXOffset(scale, direction, layerId); + } + + protected getLayerYOffset(scale: number, direction: number, layerId: number): number + { + if(this._offsetArray[layerId]) + { + return this._offsetArray[layerId].y; + } + + return super.getLayerYOffset(scale, direction, layerId); + } + + protected getLayerZOffset(scale: number, direction: number, layerId: number): number + { + if(this._offsetArray[layerId]) + { + return this._offsetArray[layerId].z; + } + + return super.getLayerZOffset(scale, direction, layerId); + } + + private processPlanets(): boolean + { + if(!this.object || !this.object.model) return; + + const planetSystems = this.object.model.getValue(RoomObjectVariable.FURNITURE_PLANETSYSTEM_DATA); + + if(!planetSystems) return false; + + this._planetIndex = []; + this._planetNameIndex = []; + + for(const planet of planetSystems) + { + const sprite = this.getSprite(planet.id); + + if(sprite) + { + this.addPlanet(planet.name, planet.id, planet.parent, (planet.radius || 0), (planet.arcSpeed || 0), (planet.arcOffset || 0), (planet.height || 0)); + } + } + + return true; + } + + private addPlanet(name: string, index: number, parentName: string, radius: number, arcSpeed: number, arcOffset: number, height: number): void + { + if(!this._planetIndex) return; + + const planet = new FurniturePlanetSystemVisualizationPlanetObject(name, index, radius, arcSpeed, arcOffset, height); + const existingPlanet = this.getPlanet(parentName); + + if(existingPlanet) existingPlanet.addChild(planet); + else + { + this._planetIndex.push(planet); + this._planetNameIndex.push(name); + } + } + + private getPlanet(name: string): FurniturePlanetSystemVisualizationPlanetObject + { + for(const planet of this._planetIndex) + { + if(planet.name === name) return planet; + + if(planet.hasChild(name)) return planet.getChild(name); + } + + return null; + } +} diff --git a/packages/room/src/object/visualization/furniture/FurniturePlanetSystemVisualizationPlanetObject.ts b/packages/room/src/object/visualization/furniture/FurniturePlanetSystemVisualizationPlanetObject.ts new file mode 100644 index 0000000..3c5187c --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurniturePlanetSystemVisualizationPlanetObject.ts @@ -0,0 +1,92 @@ +import { IVector3D } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; + +export class FurniturePlanetSystemVisualizationPlanetObject +{ + private static SYSTEM_TEMPO: number = 30; + + private _name: string; + private _index: number; + private _radius: number; + private _arcSpeed: number; + private _arcOffset: number; + private _height: number; + private _position: number; + private _positionVector: IVector3D; + private _children: FurniturePlanetSystemVisualizationPlanetObject[]; + + constructor(name: string, index: number, radius: number, arcSpeed: number, arcOffset: number, height: number) + { + this._name = name; + this._index = index; + this._radius = radius; + this._arcSpeed = (((arcSpeed * Math.PI) * 2) / 360); + this._arcOffset = (((arcOffset * Math.PI) * 2) / 360); + this._height = height; + this._position = 0; + this._positionVector = new Vector3d(0, 0, 0); + this._children = []; + } + + public dispose(): void + { + while(this._children.length > 0) + { + const child = this._children.shift(); + + child.dispose(); + } + } + + public update(offsets: IVector3D[], rootPosition: IVector3D, scale: number): void + { + this._position = (this._position + (this._arcSpeed / FurniturePlanetSystemVisualizationPlanetObject.SYSTEM_TEMPO)); + + offsets[this._index] = this.getPositionVector(rootPosition, scale); + + for(const child of this._children) child.update(offsets, this._positionVector, scale); + } + + public getPositionVector(position: IVector3D, scale: number): IVector3D + { + const cos = (this._radius * Math.cos((this._position + this._arcOffset))); + const sine = (this._radius * Math.sin((this._position + this._arcOffset))); + + this._positionVector.x = ((cos - sine) * (scale / 2)); + this._positionVector.y = ((((sine + cos) * (scale / 2)) * 0.5) - (this._height * (scale / 2))); + this._positionVector.z = -(Math.trunc(((4 * (cos + sine)) - 0.7))); + + if(position) this._positionVector.add(position); + + return this._positionVector; + } + + public addChild(planetObject: FurniturePlanetSystemVisualizationPlanetObject): void + { + if(this._children.indexOf(planetObject) >= 0) return; + + this._children.push(planetObject); + } + + public hasChild(name: string): boolean + { + return !!this.getChild(name); + } + + public getChild(name: string): FurniturePlanetSystemVisualizationPlanetObject + { + for(const child of this._children) + { + if(child.name === name) return child; + + if(child.hasChild(name)) return child.getChild(name); + } + + return null; + } + + public get name(): string + { + return this._name; + } +} diff --git a/packages/room/src/object/visualization/furniture/FurniturePosterVisualization.ts b/packages/room/src/object/visualization/furniture/FurniturePosterVisualization.ts new file mode 100644 index 0000000..6bfadc4 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurniturePosterVisualization.ts @@ -0,0 +1,6 @@ +import { FurnitureAnimatedVisualization } from './FurnitureAnimatedVisualization'; + +export class FurniturePosterVisualization extends FurnitureAnimatedVisualization +{ + +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureQueueTileVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureQueueTileVisualization.ts new file mode 100644 index 0000000..9a1e5de --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureQueueTileVisualization.ts @@ -0,0 +1,50 @@ +import { FurnitureAnimatedVisualization } from './FurnitureAnimatedVisualization'; + +export class FurnitureQueueTileVisualization extends FurnitureAnimatedVisualization +{ + private static ANIMATION_ID_ROLL: number = 3; + private static ANIMATION_ID_ROLL_ONCE: number = 2; + private static ANIMATION_ID_NORMAL: number = 1; + private static ANIMATION_DURATION: number = 15; + + private _stateQueue: number[]; + private _animationCounter: number; + + constructor() + { + super(); + + this._stateQueue = []; + this._animationCounter = -1; + } + + protected setAnimation(animationId: number): void + { + if(animationId === FurnitureQueueTileVisualization.ANIMATION_ID_ROLL_ONCE) + { + this._stateQueue = []; + this._stateQueue.push(FurnitureQueueTileVisualization.ANIMATION_ID_NORMAL); + + this._animationCounter = FurnitureQueueTileVisualization.ANIMATION_DURATION; + } + + return super.setAnimation(animationId); + } + + protected updateAnimation(scale: number): number + { + if(this._animationCounter > 0) this._animationCounter--; + + if(!this._animationCounter) + { + if(this._stateQueue.length) super.setAnimation(this._stateQueue.shift()); + } + + return super.updateAnimation(scale); + } + + protected usesAnimationResetting(): boolean + { + return true; + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureResettingAnimatedVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureResettingAnimatedVisualization.ts new file mode 100644 index 0000000..dd191e9 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureResettingAnimatedVisualization.ts @@ -0,0 +1,9 @@ +import { FurnitureAnimatedVisualization } from './FurnitureAnimatedVisualization'; + +export class FurnitureResettingAnimatedVisualization extends FurnitureAnimatedVisualization +{ + protected usesAnimationResetting(): boolean + { + return true; + } +} \ No newline at end of file diff --git a/packages/room/src/object/visualization/furniture/FurnitureRoomBackgroundVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureRoomBackgroundVisualization.ts new file mode 100644 index 0000000..895b985 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureRoomBackgroundVisualization.ts @@ -0,0 +1,64 @@ +import { Texture } from 'pixi.js'; +import { DirectionalOffsetData } from '../data'; +import { FurnitureBrandedImageVisualization } from './FurnitureBrandedImageVisualization'; + +export class FurnitureRoomBackgroundVisualization extends FurnitureBrandedImageVisualization +{ + private _imageOffset: DirectionalOffsetData; + + protected imageReady(texture: Texture, imageUrl: string): void + { + super.imageReady(texture, imageUrl); + + if(!texture) return; + + this.setImageOffset(texture.width, texture.height); + } + + private setImageOffset(width: number, height: number): void + { + const offsetData = new DirectionalOffsetData(); + + offsetData.setDirection(1, 0, -height); + offsetData.setDirection(3, 0, 0); + offsetData.setDirection(5, -width, 0); + offsetData.setDirection(7, -width, -height); + offsetData.setDirection(4, (-width / 2), (-height / 2)); + + this._imageOffset = offsetData; + } + + protected getLayerXOffset(scale: number, direction: number, layerId: number): number + { + if(this._imageOffset) + { + const offset = this._imageOffset.getXOffset(direction, 0); + + if(offset !== undefined) return offset + this._offsetX; + } + + return super.getLayerXOffset(scale, direction, layerId) + this._offsetX; + } + + protected getLayerYOffset(scale: number, direction: number, layerId: number): number + { + if(this._imageOffset) + { + const offset = this._imageOffset.getYOffset(direction, 0); + + if(offset !== undefined) return offset + this._offsetY; + } + + return super.getLayerYOffset(scale, direction, layerId) + this._offsetY; + } + + protected getLayerZOffset(scale: number, direction: number, layerId: number): number + { + return super.getLayerZOffset(scale, direction, layerId) + (-(this._offsetZ)); + } + + protected getLayerIgnoreMouse(scale: number, direction: number, layerId: number): boolean + { + return true; + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureScoreBoardVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureScoreBoardVisualization.ts new file mode 100644 index 0000000..0ec747e --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureScoreBoardVisualization.ts @@ -0,0 +1,24 @@ +import { FurnitureAnimatedVisualization } from './FurnitureAnimatedVisualization'; + +export class FurnitureScoreBoardVisualization extends FurnitureAnimatedVisualization +{ + private static ONES_SPRITE: string = 'ones_sprite'; + private static TENS_SPRITE: string = 'tens_sprite'; + private static HUNDREDS_SPRITE: string = 'hundreds_sprite'; + private static THOUSANDS_SPRITE: string = 'thousands_sprite'; + + protected getFrameNumber(scale: number, layerId: number): number + { + const tag = this.getLayerTag(scale, this.direction, layerId); + const animation = this.object.getState(0); + + switch(tag) + { + case FurnitureScoreBoardVisualization.ONES_SPRITE: return Math.floor(animation % 10); + case FurnitureScoreBoardVisualization.TENS_SPRITE: return Math.floor((animation / 10) % 10); + case FurnitureScoreBoardVisualization.HUNDREDS_SPRITE: return Math.floor((animation / 100) % 10); + case FurnitureScoreBoardVisualization.THOUSANDS_SPRITE: return Math.floor((animation / 1000) % 10); + default: return super.getFrameNumber(scale, layerId); + } + } +} \ No newline at end of file diff --git a/packages/room/src/object/visualization/furniture/FurnitureSoundBlockVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureSoundBlockVisualization.ts new file mode 100644 index 0000000..1268e7c --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureSoundBlockVisualization.ts @@ -0,0 +1,16 @@ +import { RoomObjectVariable } from '@nitrots/api'; +import { FurnitureAnimatedVisualization } from './FurnitureAnimatedVisualization'; + +export class FurnitureSoundBlockVisualization extends FurnitureAnimatedVisualization +{ + private _internalFrameIncreaseCounter: number = 0; + + protected updateAnimations(scale: number): number + { + this._internalFrameIncreaseCounter = (this._internalFrameIncreaseCounter + this.object.model.getValue(RoomObjectVariable.FURNITURE_SOUNDBLOCK_RELATIVE_ANIMATION_SPEED)); + this._frameIncrease = this._internalFrameIncreaseCounter; + this._internalFrameIncreaseCounter = (this._internalFrameIncreaseCounter - this._frameIncrease); + + return super.updateAnimations(scale); + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureStickieVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureStickieVisualization.ts new file mode 100644 index 0000000..29cfca3 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureStickieVisualization.ts @@ -0,0 +1,12 @@ +import { ColorData } from '../data'; +import { FurnitureVisualization } from './FurnitureVisualization'; + +export class FurnitureStickieVisualization extends FurnitureVisualization +{ + protected getLayerColor(scale: number, layerId: number, colorId: number): number + { + if(!this._data) return ColorData.DEFAULT_COLOR; + + return this._data.getLayerColor(scale, layerId, colorId); + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureValRandomizerVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureValRandomizerVisualization.ts new file mode 100644 index 0000000..b95769c --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureValRandomizerVisualization.ts @@ -0,0 +1,76 @@ +import { FurnitureAnimatedVisualization } from './FurnitureAnimatedVisualization'; + +export class FurnitureValRandomizerVisualization extends FurnitureAnimatedVisualization +{ + private static ANIMATION_ID_OFFSET_SLOW1: number = 20; + private static ANIMATION_ID_OFFSET_SLOW2: number = 10; + private static ANIMATION_ID_START_ROLL: number = 31; + private static ANIMATION_ID_ROLL: number = 32; + private static ANIMATION_ID_OFF: number = 30; + + private _stateQueue: number[]; + private _running: boolean; + + constructor() + { + super(); + + this._stateQueue = []; + this._running = false; + + super.setAnimation(FurnitureValRandomizerVisualization.ANIMATION_ID_OFF); + } + + protected setAnimation(animationId: number): void + { + if(animationId === 0) + { + if(!this._running) + { + this._running = true; + this._stateQueue = []; + + this._stateQueue.push(FurnitureValRandomizerVisualization.ANIMATION_ID_START_ROLL); + this._stateQueue.push(FurnitureValRandomizerVisualization.ANIMATION_ID_ROLL); + + return; + } + } + + if((animationId > 0) && (animationId <= FurnitureValRandomizerVisualization.ANIMATION_ID_OFFSET_SLOW2)) + { + if(this._running) + { + this._running = false; + this._stateQueue = []; + + if(this.direction === 2) + { + this._stateQueue.push(FurnitureValRandomizerVisualization.ANIMATION_ID_OFFSET_SLOW1 + 5); + this._stateQueue.push(FurnitureValRandomizerVisualization.ANIMATION_ID_OFFSET_SLOW2 + 5); + } + else + { + this._stateQueue.push(FurnitureValRandomizerVisualization.ANIMATION_ID_OFFSET_SLOW1 + animationId); + this._stateQueue.push(FurnitureValRandomizerVisualization.ANIMATION_ID_OFFSET_SLOW2 + animationId); + } + + this._stateQueue.push(FurnitureValRandomizerVisualization.ANIMATION_ID_OFF); + + return; + } + + super.setAnimation(FurnitureValRandomizerVisualization.ANIMATION_ID_OFF); + } + } + + protected updateAnimation(scale: number): number + { + if(this.getLastFramePlayed(11)) + { + if(this._stateQueue.length) super.setAnimation(this._stateQueue.shift()); + } + + return super.updateAnimation(scale); + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureVisualization.ts new file mode 100644 index 0000000..12c022e --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureVisualization.ts @@ -0,0 +1,594 @@ +import { AlphaTolerance, IGraphicAsset, IObjectVisualizationData, IRoomGeometry, IRoomObjectSprite, RoomObjectVariable, RoomObjectVisualizationType } from '@nitrots/api'; +import { BLEND_MODES, Texture } from 'pixi.js'; +import { RoomObjectSpriteVisualization } from '../RoomObjectSpriteVisualization'; +import { ColorData, LayerData } from '../data'; +import { FurnitureVisualizationData } from './FurnitureVisualizationData'; + +export class FurnitureVisualization extends RoomObjectSpriteVisualization +{ + protected static DEPTH_MULTIPLIER: number = Math.sqrt(0.5); + + public static TYPE: string = RoomObjectVisualizationType.FURNITURE_STATIC; + + protected _data: FurnitureVisualizationData; + + protected _type: string; + protected _direction: number; + protected _lastCameraAngle: number; + protected _selectedColor: number; + protected _furnitureLift: number; + protected _alphaMultiplier: number; + protected _alphaChanged: boolean; + protected _clickUrl: string; + protected _clickHandling: boolean; + + protected _cacheDirection: number; + protected _cacheScale: number; + protected _cacheSize: number; + + protected _layerCount: number; + protected _shadowLayerIndex: number; + protected _updatedLayers: boolean[]; + protected _assetNames: string[]; + protected _spriteTags: string[]; + protected _spriteBlendModes: BLEND_MODES[]; + protected _spriteAlphas: number[]; + protected _spriteColors: number[]; + protected _spriteMouseCaptures: boolean[]; + protected _spriteXOffsets: number[]; + protected _spriteYOffsets: number[]; + protected _spriteZOffsets: number[]; + + private _animationNumber: number; + + constructor() + { + super(); + + this._data = null; + + this._type = null; + this._direction = 0; + this._lastCameraAngle = NaN; + this._selectedColor = 0; + this._furnitureLift = 0; + this._alphaMultiplier = 1; + this._alphaChanged = false; + this._clickUrl = null; + this._clickHandling = false; + + this._cacheDirection = -1; + this._cacheScale = 0; + this._cacheSize = -1; + + this._layerCount = 0; + this._shadowLayerIndex = -1; + this._updatedLayers = []; + this._assetNames = []; + this._spriteTags = []; + this._spriteBlendModes = []; + this._spriteAlphas = []; + this._spriteColors = []; + this._spriteMouseCaptures = []; + this._spriteXOffsets = []; + this._spriteYOffsets = []; + this._spriteZOffsets = []; + + this._animationNumber = 0; + } + + public initialize(data: IObjectVisualizationData): boolean + { + this.reset(); + + if(!(data instanceof FurnitureVisualizationData)) return false; + + this._type = data.type; + this._data = data; + + return true; + } + + public dispose(): void + { + super.dispose(); + + this._data = null; + this._updatedLayers = null; + this._assetNames = null; + this._spriteTags = null; + this._spriteBlendModes = null; + this._spriteAlphas = null; + this._spriteColors = null; + this._spriteMouseCaptures = null; + this._spriteXOffsets = null; + this._spriteYOffsets = null; + this._spriteZOffsets = null; + } + + protected reset(): void + { + super.reset(); + + this.setDirection(-1); + + this._data = null; + this._updatedLayers = []; + this._assetNames = []; + this._spriteTags = []; + this._spriteBlendModes = []; + this._spriteAlphas = []; + this._spriteColors = []; + this._spriteMouseCaptures = []; + this._spriteXOffsets = []; + this._spriteYOffsets = []; + this._spriteZOffsets = []; + + this.createSprites(0); + } + + protected resetLayers(scale: number, direction: number): void + { + if((this._cacheDirection === direction) && (this._cacheScale === scale)) return; + + this._updatedLayers = []; + this._assetNames = []; + this._spriteTags = []; + this._spriteBlendModes = []; + this._spriteAlphas = []; + this._spriteColors = []; + this._spriteMouseCaptures = []; + this._spriteXOffsets = []; + this._spriteYOffsets = []; + this._spriteZOffsets = []; + + this._cacheDirection = direction; + this._cacheScale = scale; + this._cacheSize = this.getValidSize(scale); + + this.setLayerCount(((this._data && this._data.getLayerCount(scale)) || 0) + this.getAdditionalLayerCount()); + } + + public update(geometry: IRoomGeometry, time: number, update: boolean, skipUpdate: boolean): void + { + if(!geometry) return; + + const scale = geometry.scale; + let updateSprites = false; + + if(this.updateObject(scale, geometry.direction.x)) updateSprites = true; + + if(this.updateModel(scale)) updateSprites = true; + + let number = 0; + + if(skipUpdate) + { + this._animationNumber = (this._animationNumber | this.updateAnimation(scale)); + } + else + { + number = this.updateAnimation(scale) | this._animationNumber; + + this._animationNumber = 0; + } + + if(updateSprites || (number !== 0)) + { + this.updateSprites(scale, updateSprites, number); + + this._scale = scale; + + this.updateSpriteCounter++; + } + } + + protected updateObject(scale: number, direction: number): boolean + { + if(!this.object) return false; + + if((this.updateObjectCounter === this.object.updateCounter) && (scale === this._scale) && (this._lastCameraAngle === direction)) return false; + + let offsetDirection = (this.object.getDirection().x - (direction + 135)); + + offsetDirection = ((((offsetDirection) % 360) + 360) % 360); + + if(this._data) + { + const validDirection = this._data.getValidDirection(scale, offsetDirection); + + this.setDirection(validDirection); + } + + this._lastCameraAngle = direction; + this._scale = scale; + + this.updateObjectCounter = this.object.updateCounter; + + this.resetLayers(scale, this._direction); + + return true; + } + + protected updateModel(scale: number): boolean + { + const model = this.object && this.object.model; + + if(!model) return false; + + if(this.updateModelCounter === model.updateCounter) return false; + + this._selectedColor = model.getValue(RoomObjectVariable.FURNITURE_COLOR); + this._clickUrl = model.getValue(RoomObjectVariable.FURNITURE_AD_URL); + this._clickHandling = ((this._clickUrl && (this._clickUrl !== '') && (this._clickUrl.indexOf('http') === 0)) || false); + this._furnitureLift = (model.getValue(RoomObjectVariable.FURNITURE_LIFT_AMOUNT) || 0); + + let alphaMultiplier = model.getValue(RoomObjectVariable.FURNITURE_ALPHA_MULTIPLIER); + + if(isNaN(alphaMultiplier)) alphaMultiplier = 1; + + if(this._alphaMultiplier !== alphaMultiplier) + { + this._alphaMultiplier = alphaMultiplier; + + this._alphaChanged = true; + } + + this.updateModelCounter = model.updateCounter; + + return true; + } + + protected updateSprites(scale: number, update: boolean, animation: number): void + { + if(this._layerCount !== this.totalSprites) this.createSprites(this._layerCount); + + if(update) + { + let layerId = (this.totalSprites - 1); + + while(layerId >= 0) + { + this.updateSprite(scale, layerId); + + layerId--; + } + } + else + { + let layerId = 0; + + while(animation > 0) + { + if(animation) this.updateSprite(scale, layerId); + + layerId++; + animation = (animation >> 1); + } + } + + this._alphaChanged = false; + } + + protected updateSprite(scale: number, layerId: number): void + { + const assetName = this.getSpriteAssetName(scale, layerId); + const sprite = this.getSprite(layerId); + + if(assetName && sprite) + { + const assetData = this.getAsset(assetName, layerId); + + if(assetData) + { + sprite.visible = true; + sprite.type = this._type; + sprite.texture = this.getTexture(scale, layerId, assetData); + sprite.flipH = assetData.flipH; + sprite.flipV = assetData.flipV; + sprite.direction = this._direction; + + let relativeDepth = 0; + + if(layerId !== this._shadowLayerIndex) + { + sprite.tag = this.getLayerTag(scale, this._direction, layerId); + sprite.alpha = this.getLayerAlpha(scale, this._direction, layerId); + sprite.color = this.getLayerColor(scale, layerId, this._selectedColor); + sprite.offsetX = (assetData.offsetX + this.getLayerXOffset(scale, this._direction, layerId)); + sprite.offsetY = (assetData.offsetY + this.getLayerYOffset(scale, this._direction, layerId)); + sprite.blendMode = this.getLayerBlendMode(scale, this._direction, layerId); + sprite.alphaTolerance = (this.getLayerIgnoreMouse(scale, this._direction, layerId) ? AlphaTolerance.MATCH_NOTHING : AlphaTolerance.MATCH_OPAQUE_PIXELS); + + relativeDepth = this.getLayerZOffset(scale, this._direction, layerId); + relativeDepth = (relativeDepth - (layerId * 0.001)); + } + else + { + sprite.offsetX = assetData.offsetX; + sprite.offsetY = (assetData.offsetY + this.getLayerYOffset(scale, this._direction, layerId)); + sprite.alpha = (48 * this._alphaMultiplier); + sprite.alphaTolerance = AlphaTolerance.MATCH_NOTHING; + + relativeDepth = 1; + } + + sprite.relativeDepth = (relativeDepth * FurnitureVisualization.DEPTH_MULTIPLIER); + sprite.name = assetName; + sprite.libraryAssetName = this.getLibraryAssetNameForSprite(assetData, sprite); + sprite.posture = this.getPostureForAsset(scale, assetData.source); + sprite.clickHandling = this._clickHandling; + } + else + { + this.resetSprite(sprite); + } + } + else + { + if(sprite) this.resetSprite(sprite); + } + } + + protected getLibraryAssetNameForSprite(asset: IGraphicAsset, sprite: IRoomObjectSprite): string + { + return asset.source; + } + + protected getPostureForAssetFile(scale: number, _arg_2: string): string + { + return null; + } + + private resetSprite(sprite: IRoomObjectSprite): void + { + if(!sprite) return; + + sprite.texture = null; + sprite.libraryAssetName = ''; + sprite.posture = ''; + sprite.tag = ''; + sprite.offsetX = 0; + sprite.offsetY = 0; + sprite.flipH = false; + sprite.flipV = false; + sprite.relativeDepth = 0; + sprite.clickHandling = false; + } + + protected getSpriteAssetName(scale: number, layerId: number): string + { + if(!this._data || (layerId >= FurnitureVisualizationData.LAYER_LETTERS.length)) return ''; + + let assetName = this._assetNames[layerId]; + let updated = this._updatedLayers[layerId]; + + if(!assetName || !assetName.length) + { + assetName = this.cacheSpriteAssetName(scale, layerId, true); + updated = (this._cacheSize !== 1); + } + + if(updated) assetName += this.getFrameNumber(scale, layerId); + + return assetName; + } + + protected cacheSpriteAssetName(scale: number, layerId: number, cache: boolean): string + { + const type = this._type; + const size = (cache) ? this._cacheSize : this.getValidSize(scale); + let layerCode = ''; + const isntIcon = (size !== 1); + + if(layerId !== this._shadowLayerIndex) + { + layerCode = FurnitureVisualizationData.LAYER_LETTERS[layerId] || ''; + } + else + { + layerCode = 'sd'; + } + + if(layerCode === '') return null; + + const assetName = (this._type + ((isntIcon) ? ('_' + size + '_' + layerCode + '_' + this._direction + '_') : ('_icon_' + layerCode))); + + if(cache) + { + this._assetNames[layerId] = assetName; + this._updatedLayers[layerId] = isntIcon; + } + + return assetName; + } + + protected getLayerTag(scale: number, direction: number, layerId: number): string + { + const existing = this._spriteTags[layerId]; + + if(existing !== undefined) return existing; + + if(!this._data) return LayerData.DEFAULT_TAG; + + const tag = this._data.getLayerTag(scale, direction, layerId); + + this._spriteTags[layerId] = tag; + + return tag; + } + + protected getLayerBlendMode(scale: number, direction: number, layerId: number): BLEND_MODES + { + const existing = this._spriteBlendModes[layerId]; + + if(existing !== undefined) return existing; + + if(!this._data) return LayerData.DEFAULT_BLEND_MODE; + + const blendMode = this._data.getLayerBlendMode(scale, direction, layerId); + + this._spriteBlendModes[layerId] = blendMode; + + return blendMode; + } + + protected getLayerAlpha(scale: number, direction: number, layerId: number): number + { + if(!this._alphaChanged) + { + const existing = this._spriteAlphas[layerId]; + + if(existing !== undefined) return existing; + } + + if(!this._data) return LayerData.DEFAULT_ALPHA; + + let alpha = this._data.getLayerAlpha(scale, direction, layerId); + + if(this._alphaMultiplier !== null) alpha = (alpha * this._alphaMultiplier); + + this._spriteAlphas[layerId] = alpha; + + return alpha; + } + + protected getLayerColor(scale: number, layerId: number, colorId: number): number + { + const existing = this._spriteColors[layerId]; + + if(existing !== undefined) return existing; + + if(!this._data) return ColorData.DEFAULT_COLOR; + + const color = this._data.getLayerColor(scale, layerId, colorId); + + this._spriteColors[layerId] = color; + + return color; + } + + protected getLayerIgnoreMouse(scale: number, direction: number, layerId: number): boolean + { + const existing = this._spriteMouseCaptures[layerId]; + + if(existing !== undefined) return existing; + + if(!this._data) return LayerData.DEFAULT_IGNORE_MOUSE; + + const ignoreMouse = this._data.getLayerIgnoreMouse(scale, direction, layerId); + + this._spriteMouseCaptures[layerId] = ignoreMouse; + + return ignoreMouse; + } + + protected getLayerXOffset(scale: number, direction: number, layerId: number): number + { + const existing = this._spriteXOffsets[layerId]; + + if(existing !== undefined) return existing; + + if(!this._data) return LayerData.DEFAULT_XOFFSET; + + const xOffset = this._data.getLayerXOffset(scale, direction, layerId); + + this._spriteXOffsets[layerId] = xOffset; + + return xOffset; + } + + protected getLayerYOffset(scale: number, direction: number, layerId: number): number + { + if(layerId === this._shadowLayerIndex) return Math.ceil((this._furnitureLift * (scale / 2))); + + const existing = this._spriteYOffsets[layerId]; + + if(existing !== undefined) return existing; + + if(!this._data) return LayerData.DEFAULT_YOFFSET; + + const yOffset = this._data.getLayerYOffset(scale, direction, layerId); + + this._spriteYOffsets[layerId] = yOffset; + + return yOffset; + } + + protected getLayerZOffset(scale: number, direction: number, layerId: number): number + { + const existing = this._spriteZOffsets[layerId]; + + if(existing !== undefined) return existing; + + if(!this._data) return LayerData.DEFAULT_ZOFFSET; + + const zOffset = this._data.getLayerZOffset(scale, direction, layerId); + + this._spriteZOffsets[layerId] = zOffset; + + return zOffset; + } + + protected getValidSize(scale: number): number + { + if(!this._data) return scale; + + return this._data.getValidSize(scale); + } + + protected setLayerCount(count: number): void + { + this._layerCount = count; + this._shadowLayerIndex = count - this.getAdditionalLayerCount(); + } + + protected setDirection(direction: number): void + { + if(this._direction === direction) return; + + this._direction = direction; + } + + protected getAdditionalLayerCount(): number + { + return 1; + } + + protected updateAnimation(scale: number): number + { + return 0; + } + + protected getFrameNumber(scale: number, layerId: number): number + { + return 0; + } + + protected getPostureForAsset(scale: number, name: string): string + { + return null; + } + + public getAsset(name: string, layerId: number = -1): IGraphicAsset + { + if(!this.asset) return null; + + return this.asset.getAsset(name); + } + + public getTexture(scale: number, layerId: number, asset: IGraphicAsset): Texture + { + return asset?.texture ?? null; + } + + protected get direction(): number + { + return this._direction; + } + + protected get data(): FurnitureVisualizationData + { + return this._data; + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureVisualizationData.ts b/packages/room/src/object/visualization/furniture/FurnitureVisualizationData.ts new file mode 100644 index 0000000..e64004d --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureVisualizationData.ts @@ -0,0 +1,281 @@ +import { IAssetData, IAssetVisualizationData, IObjectVisualizationData } from '@nitrots/api'; +import { BLEND_MODES } from 'pixi.js'; +import { ColorData, LayerData, SizeData } from '../data'; + +export class FurnitureVisualizationData implements IObjectVisualizationData +{ + public static LAYER_LETTERS: string[] = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']; + + private _type: string = ''; + private _sizes: number[] = []; + private _sizeDatas: Map = new Map(); + private _lastSize: number = -1; + private _lastSizeScale: number = -1; + private _lastSizeData: SizeData = null; + private _lastSizeDataScale: number = -1; + + public initialize(asset: IAssetData): boolean + { + this.reset(); + + if(!asset) return false; + + this._type = asset.name; + + if(!this.defineVisualizations(asset.visualizations)) + { + this.reset(); + + return false; + } + + return true; + } + + public dispose(): void + { + if(this._sizeDatas && this._sizeDatas.size) + { + for(const size of this._sizeDatas.values()) size && size.dispose(); + + this._sizeDatas = null; + } + + this._lastSizeData = null; + this._sizes = null; + } + + private reset(): void + { + this._type = ''; + + if(this._sizeDatas && this._sizeDatas.size) + { + for(const size of this._sizeDatas.values()) size && size.dispose(); + } + + this._sizeDatas.clear(); + + this._sizes = []; + this._lastSizeData = null; + this._lastSizeDataScale = -1; + } + + protected createSizeData(scale: number, layerCount: number, angle: number): SizeData + { + return new SizeData(layerCount, angle); + } + + protected defineVisualizations(visualizations: IAssetVisualizationData[]): boolean + { + if(!visualizations) return false; + + for(const visualizationId in visualizations) + { + const visualization = visualizations[visualizationId]; + + const layerCount = visualization.layerCount; + const angle = visualization.angle; + + let size = visualization.size; + + if(size < 1) size = 1; + + if(this._sizeDatas.get(size)) return false; + + const sizeData = this.createSizeData(size, layerCount, angle); + + if(!sizeData) return false; + + for(const key in visualization) + { + //@ts-ignore + const data = visualization[key]; + + if(!this.processVisualElement(sizeData, key, data)) + { + sizeData.dispose(); + + return false; + } + } + + this._sizeDatas.set(size, sizeData); + + this._sizes.push(size); + } + + this._sizes.sort(); + + return true; + } + + protected processVisualElement(sizeData: SizeData, key: string, data: any): boolean + { + if(!sizeData || !key || !data) return false; + + switch(key) + { + case 'layers': + if(!sizeData.processLayers(data)) return false; + break; + case 'directions': + if(!sizeData.processDirections(data)) return false; + break; + case 'colors': + if(!sizeData.processColors(data)) return false; + break; + } + + return true; + } + + public getValidSize(scale: number): number + { + if(scale === this._lastSizeScale) return this._lastSize; + + const sizeIndex = this.getSizeIndex(scale); + + let newScale = -1; + + if(sizeIndex < this._sizes.length) newScale = this._sizes[sizeIndex]; + + this._lastSizeScale = scale; + this._lastSize = newScale; + + return newScale; + } + + private getSizeIndex(size: number): number + { + if(size <= 0) return 0; + + let index = 0; + let iterator = 1; + + while(iterator < this._sizes.length) + { + if(this._sizes[iterator] > size) + { + if((this._sizes[iterator] / size) < (size / this._sizes[(iterator - 1)])) index = iterator; + + break; + } + + index = iterator; + + iterator++; + } + + return index; + } + + protected getSizeData(size: number): SizeData + { + if(size === this._lastSizeDataScale) return this._lastSizeData; + + const sizeIndex = this.getSizeIndex(size); + + if(sizeIndex < this._sizes.length) this._lastSizeData = this._sizeDatas.get(this._sizes[sizeIndex]); + else this._lastSizeData = null; + + this._lastSizeDataScale = size; + + return this._lastSizeData; + } + + public getLayerCount(scale: number): number + { + const size = this.getSizeData(scale); + + if(!size) return LayerData.DEFAULT_COUNT; + + return size.layerCount; + } + + public getValidDirection(scale: number, direction: number): number + { + const size = this.getSizeData(scale); + + if(!size) return LayerData.DEFAULT_DIRECTION; + + return size.getValidDirection(direction); + } + + public getLayerTag(scale: number, direction: number, layerId: number): string + { + const size = this.getSizeData(scale); + + if(!size) return LayerData.DEFAULT_TAG; + + return size.getLayerTag(direction, layerId); + } + + public getLayerBlendMode(scale: number, direction: number, layerId: number): BLEND_MODES + { + const size = this.getSizeData(scale); + + if(!size) return LayerData.DEFAULT_BLEND_MODE; + + return size.getLayerBlendMode(direction, layerId); + } + + public getLayerAlpha(scale: number, direction: number, layerId: number): number + { + const size = this.getSizeData(scale); + + if(!size) return LayerData.DEFAULT_ALPHA; + + return size.getLayerAlpha(direction, layerId); + } + + public getLayerColor(scale: number, layerId: number, colorId: number): number + { + const size = this.getSizeData(scale); + + if(!size) return ColorData.DEFAULT_COLOR; + + return size.getLayerColor(layerId, colorId); + } + + public getLayerIgnoreMouse(scale: number, direction: number, layerId: number): boolean + { + const size = this.getSizeData(scale); + + if(!size) return LayerData.DEFAULT_IGNORE_MOUSE; + + return size.getLayerIgnoreMouse(direction, layerId); + } + + public getLayerXOffset(scale: number, direction: number, layerId: number): number + { + const size = this.getSizeData(scale); + + if(!size) return LayerData.DEFAULT_XOFFSET; + + return size.getLayerXOffset(direction, layerId); + } + + public getLayerYOffset(scale: number, direction: number, layerId: number): number + { + const size = this.getSizeData(scale); + + if(!size) return LayerData.DEFAULT_YOFFSET; + + return size.getLayerYOffset(direction, layerId); + } + + public getLayerZOffset(scale: number, direction: number, layerId: number): number + { + const size = this.getSizeData(scale); + + if(!size) return LayerData.DEFAULT_ZOFFSET; + + return size.getLayerZOffset(direction, layerId); + } + + public get type(): string + { + return this._type; + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureVoteCounterVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureVoteCounterVisualization.ts new file mode 100644 index 0000000..de34e4d --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureVoteCounterVisualization.ts @@ -0,0 +1,51 @@ +import { RoomObjectVariable } from '@nitrots/api'; +import { FurnitureAnimatedVisualization } from './FurnitureAnimatedVisualization'; + +export class FurnitureVoteCounterVisualization extends FurnitureAnimatedVisualization +{ + private static ONES_SPRITE: string = 'ones_sprite'; + private static TENS_SPRITE: string = 'tens_sprite'; + private static HUNDREDS_SPRITE: string = 'hundreds_sprite'; + private static HIDE_COUNTER_SCORE: number = -1; + + protected updateObject(scale: number, direction: number): boolean + { + super.updateObject(scale, direction); + + return true; + } + + protected getFrameNumber(scale: number, layerId: number): number + { + const result = this.object.model.getValue(RoomObjectVariable.FURNITURE_VOTE_COUNTER_COUNT); + const tag = this.getLayerTag(scale, this.direction, layerId); + + switch(tag) + { + case FurnitureVoteCounterVisualization.ONES_SPRITE: return (result % 10); + case FurnitureVoteCounterVisualization.TENS_SPRITE: return ((result / 10) % 10); + case FurnitureVoteCounterVisualization.HUNDREDS_SPRITE: return ((result / 100) % 10); + default: return super.getFrameNumber(scale, layerId); + } + } + + protected getLayerAlpha(scale: number, direction: number, layerId: number): number + { + const result = this.object.model.getValue(RoomObjectVariable.FURNITURE_VOTE_COUNTER_COUNT); + + if(result === FurnitureVoteCounterVisualization.HIDE_COUNTER_SCORE) + { + const tag = this.getLayerTag(scale, direction, layerId); + + switch(tag) + { + case FurnitureVoteCounterVisualization.ONES_SPRITE: + case FurnitureVoteCounterVisualization.TENS_SPRITE: + case FurnitureVoteCounterVisualization.HUNDREDS_SPRITE: + return 0; + } + } + + return super.getLayerAlpha(scale, direction, layerId); + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureVoteMajorityVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureVoteMajorityVisualization.ts new file mode 100644 index 0000000..17030b5 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureVoteMajorityVisualization.ts @@ -0,0 +1,45 @@ +import { RoomObjectVariable } from '@nitrots/api'; +import { FurnitureAnimatedVisualization } from './FurnitureAnimatedVisualization'; + +export class FurnitureVoteMajorityVisualization extends FurnitureAnimatedVisualization +{ + private static ONES_SPRITE: string = 'ones_sprite'; + private static TENS_SPRITE: string = 'tens_sprite'; + private static HUNDREDS_SPRITE: string = 'hundreds_sprite'; + private static HIDE_RESULTS_STATES: number[] = [-1, 1]; + private static HIDE_RESULTS_VALUE: number = -1; + + protected getFrameNumber(scale: number, layerId: number): number + { + const result = this.object.model.getValue(RoomObjectVariable.FURNITURE_VOTE_MAJORITY_RESULT); + const tag = this.getLayerTag(scale, this.direction, layerId); + + switch(tag) + { + case FurnitureVoteMajorityVisualization.ONES_SPRITE: return (result % 10); + case FurnitureVoteMajorityVisualization.TENS_SPRITE: return ((result / 10) % 10); + case FurnitureVoteMajorityVisualization.HUNDREDS_SPRITE: return ((result / 100) % 10); + default: return super.getFrameNumber(scale, layerId); + } + } + + protected getLayerAlpha(scale: number, direction: number, layerId: number): number + { + const result = this.object.model.getValue(RoomObjectVariable.FURNITURE_VOTE_MAJORITY_RESULT); + + if(((!(FurnitureVoteMajorityVisualization.HIDE_RESULTS_STATES.indexOf(this.object.getState(0)) === -1)) || (result === FurnitureVoteMajorityVisualization.HIDE_RESULTS_VALUE))) + { + const tag = this.getLayerTag(scale, direction, layerId); + + switch(tag) + { + case FurnitureVoteMajorityVisualization.ONES_SPRITE: + case FurnitureVoteMajorityVisualization.TENS_SPRITE: + case FurnitureVoteMajorityVisualization.HUNDREDS_SPRITE: + return 0; + } + } + + return super.getLayerAlpha(scale, direction, layerId); + } +} diff --git a/packages/room/src/object/visualization/furniture/FurnitureWaterAreaVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureWaterAreaVisualization.ts new file mode 100644 index 0000000..c40f65c --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureWaterAreaVisualization.ts @@ -0,0 +1,6 @@ +import { FurnitureAnimatedVisualization } from './FurnitureAnimatedVisualization'; + +export class FurnitureWaterAreaVisualization extends FurnitureAnimatedVisualization +{ + +} \ No newline at end of file diff --git a/packages/room/src/object/visualization/furniture/FurnitureYoutubeVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureYoutubeVisualization.ts new file mode 100644 index 0000000..1b1a544 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/FurnitureYoutubeVisualization.ts @@ -0,0 +1,18 @@ +import { RoomObjectVariable } from '@nitrots/api'; +import { FurnitureDynamicThumbnailVisualization } from './FurnitureDynamicThumbnailVisualization'; + +export class FurnitureYoutubeVisualization extends FurnitureDynamicThumbnailVisualization +{ + protected static THUMBNAIL_URL: string = 'THUMBNAIL_URL'; + + protected getThumbnailURL(): string + { + if(!this.object) return null; + + const furnitureData = this.object.model.getValue<{ [index: string]: string }>(RoomObjectVariable.FURNITURE_DATA); + + if(furnitureData) return (furnitureData[FurnitureYoutubeVisualization.THUMBNAIL_URL] || null); + + return null; + } +} diff --git a/packages/room/src/object/visualization/furniture/IsometricImageFurniVisualization.ts b/packages/room/src/object/visualization/furniture/IsometricImageFurniVisualization.ts new file mode 100644 index 0000000..2504825 --- /dev/null +++ b/packages/room/src/object/visualization/furniture/IsometricImageFurniVisualization.ts @@ -0,0 +1,172 @@ +import { IGraphicAsset } from '@nitrots/api'; +import { TextureUtils } from '@nitrots/utils'; +import { Matrix, Sprite, Texture } from 'pixi.js'; +import { FurnitureAnimatedVisualization } from './FurnitureAnimatedVisualization'; + +export class IsometricImageFurniVisualization extends FurnitureAnimatedVisualization +{ + protected static THUMBNAIL: string = 'THUMBNAIL'; + + private _thumbnailAssetNameNormal: string; + private _thumbnailImageNormal: Texture; + private _thumbnailDirection: number; + private _thumbnailChanged: boolean; + protected _hasOutline: boolean; + + constructor() + { + super(); + + this._thumbnailAssetNameNormal = null; + this._thumbnailImageNormal = null; + this._thumbnailDirection = -1; + this._thumbnailChanged = false; + this._hasOutline = false; + } + + public get hasThumbnailImage(): boolean + { + return !(this._thumbnailImageNormal == null); + } + + public setThumbnailImages(k: Texture): void + { + this._thumbnailImageNormal = k; + this._thumbnailChanged = true; + } + + protected updateModel(scale: number): boolean + { + const flag = super.updateModel(scale); + + if(!this._thumbnailChanged && (this._thumbnailDirection === this.direction)) return flag; + + this.refreshThumbnail(); + + return true; + } + + private refreshThumbnail(): void + { + if(this.asset == null) return; + + if(this._thumbnailImageNormal) + { + this.addThumbnailAsset(this._thumbnailImageNormal, 64); + } + else + { + this.asset.disposeAsset(this.getThumbnailAssetName(64)); + } + + this._thumbnailChanged = false; + this._thumbnailDirection = this.direction; + } + + private addThumbnailAsset(k: Texture, scale: number): void + { + let layerId = 0; + + while(layerId < this.totalSprites) + { + if(this.getLayerTag(scale, this.direction, layerId) === IsometricImageFurniVisualization.THUMBNAIL) + { + const assetName = (this.cacheSpriteAssetName(scale, layerId, false) + this.getFrameNumber(scale, layerId)); + const asset = this.getAsset(assetName, layerId); + + if(asset) + { + const _local_6 = this.generateTransformedThumbnail(k, asset); + const _local_7 = this.getThumbnailAssetName(scale); + + this.asset.disposeAsset(_local_7); + this.asset.addAsset(_local_7, _local_6, true, asset.offsetX, asset.offsetY, false, false); + } + + return; + } + + layerId++; + } + } + + protected generateTransformedThumbnail(texture: Texture, asset: IGraphicAsset): Texture + { + if(this._hasOutline) + { + const container = new Sprite(); + const background = new Sprite(Texture.WHITE); + + background.tint = 0x000000; + background.width = (texture.width + 40); + background.height = (texture.height + 40); + + const sprite = new Sprite(texture); + const offsetX = ((background.width - sprite.width) / 2); + const offsetY = ((background.height - sprite.height) / 2); + + sprite.position.set(offsetX, offsetY); + + container.addChild(background, sprite); + + texture = TextureUtils.generateTexture(container); + } + + const scale = 1.1; + const matrix = new Matrix(); + const difference = (asset.width / texture.width); + + switch(this.direction) + { + case 2: + matrix.a = difference; + matrix.b = (-0.5 * difference); + matrix.c = 0; + matrix.d = (difference * scale); + matrix.tx = 0; + matrix.ty = ((0.5 * difference) * texture.width); + break; + case 0: + case 4: + matrix.a = difference; + matrix.b = (0.5 * difference); + matrix.c = 0; + matrix.d = (difference * scale); + matrix.tx = 0; + matrix.ty = 0; + break; + default: + matrix.a = difference; + matrix.b = 0; + matrix.c = 0; + matrix.d = difference; + matrix.tx = 0; + matrix.ty = 0; + } + + const sprite = new Sprite(texture); + + sprite.setFromMatrix(matrix); + + return TextureUtils.generateTexture(sprite); + } + + protected getSpriteAssetName(scale: number, layerId: number): string + { + if(this._thumbnailImageNormal && (this.getLayerTag(scale, this.direction, layerId) === IsometricImageFurniVisualization.THUMBNAIL)) return this.getThumbnailAssetName(scale); + + return super.getSpriteAssetName(scale, layerId); + } + + protected getThumbnailAssetName(scale: number): string + { + this._thumbnailAssetNameNormal = this.getFullThumbnailAssetName(this.object.id, 64); + + return this._thumbnailAssetNameNormal; + } + + protected getFullThumbnailAssetName(k: number, _arg_2: number): string + { + return [this._type, k, 'thumb', _arg_2].join('_'); + } +} diff --git a/packages/room/src/object/visualization/furniture/index.ts b/packages/room/src/object/visualization/furniture/index.ts new file mode 100644 index 0000000..9c96d0f --- /dev/null +++ b/packages/room/src/object/visualization/furniture/index.ts @@ -0,0 +1,41 @@ +export * from './FurnitureAnimatedVisualization'; +export * from './FurnitureAnimatedVisualizationData'; +export * from './FurnitureBBVisualization'; +export * from './FurnitureBadgeDisplayVisualization'; +export * from './FurnitureBottleVisualization'; +export * from './FurnitureBrandedImageVisualization'; +export * from './FurnitureBuilderPlaceholderVisualization'; +export * from './FurnitureCounterClockVisualization'; +export * from './FurnitureCuboidVisualization'; +export * from './FurnitureDynamicThumbnailVisualization'; +export * from './FurnitureExternalImageVisualization'; +export * from './FurnitureFireworksVisualization'; +export * from './FurnitureGiftWrappedFireworksVisualization'; +export * from './FurnitureGiftWrappedVisualization'; +export * from './FurnitureGuildCustomizedVisualization'; +export * from './FurnitureGuildIsometricBadgeVisualization'; +export * from './FurnitureHabboWheelVisualization'; +export * from './FurnitureIsometricBBVisualization'; +export * from './FurnitureMannequinVisualization'; +export * from './FurnitureMannequinVisualizationData'; +export * from './FurnitureParticleSystem'; +export * from './FurnitureParticleSystemEmitter'; +export * from './FurnitureParticleSystemParticle'; +export * from './FurniturePartyBeamerVisualization'; +export * from './FurniturePlanetSystemVisualization'; +export * from './FurniturePlanetSystemVisualizationPlanetObject'; +export * from './FurniturePosterVisualization'; +export * from './FurnitureQueueTileVisualization'; +export * from './FurnitureResettingAnimatedVisualization'; +export * from './FurnitureRoomBackgroundVisualization'; +export * from './FurnitureScoreBoardVisualization'; +export * from './FurnitureSoundBlockVisualization'; +export * from './FurnitureStickieVisualization'; +export * from './FurnitureValRandomizerVisualization'; +export * from './FurnitureVisualization'; +export * from './FurnitureVisualizationData'; +export * from './FurnitureVoteCounterVisualization'; +export * from './FurnitureVoteMajorityVisualization'; +export * from './FurnitureWaterAreaVisualization'; +export * from './FurnitureYoutubeVisualization'; +export * from './IsometricImageFurniVisualization'; diff --git a/packages/room/src/object/visualization/index.ts b/packages/room/src/object/visualization/index.ts new file mode 100644 index 0000000..a7fd77a --- /dev/null +++ b/packages/room/src/object/visualization/index.ts @@ -0,0 +1,10 @@ +export * from './RoomObjectSprite'; +export * from './RoomObjectSpriteVisualization'; +export * from './avatar'; +export * from './avatar/additions'; +export * from './data'; +export * from './furniture'; +export * from './pet'; +export * from './room'; +export * from './room/mask'; +export * from './room/utils'; diff --git a/packages/room/src/object/visualization/pet/ExperienceData.ts b/packages/room/src/object/visualization/pet/ExperienceData.ts new file mode 100644 index 0000000..6c9ac44 --- /dev/null +++ b/packages/room/src/object/visualization/pet/ExperienceData.ts @@ -0,0 +1,75 @@ +import { TextureUtils } from '@nitrots/utils'; +import { Container, Sprite, Text, TextStyle, Texture } from 'pixi.js'; + +export class ExperienceData +{ + private _sprite: Sprite; + private _texture: Texture; + private _amount: number; + private _alpha: number; + + constructor(texture: Texture) + { + this._sprite = new Sprite(texture); + this._texture = null; + this._amount = -1; + this._alpha = 0; + } + + public renderBubble(amount: number): Texture + { + if(!this._sprite || (this._amount === amount)) return null; + + const container = new Container(); + + container.addChild(this._sprite); + + const text = new Text({ + text: ('+' + amount), + style: new TextStyle({ + fontFamily: 'Arial', + fontSize: 9, + fill: 0xFFFFFF, + align: 'center' + }) + }); + + text.anchor.x = 0.5; + + text.x = (this._sprite.width / 2); + text.y = 19; + + container.addChild(text); + + if(!this._texture) + { + this._texture = TextureUtils.generateTexture(container); + } + else + { + TextureUtils.writeToTexture(container, this._texture, true); + } + + return this._texture; + } + + public get amount(): number + { + return this._amount; + } + + public set amount(amount: number) + { + this._amount = amount; + } + + public get alpha(): number + { + return this._alpha; + } + + public set alpha(alpha: number) + { + this._alpha = alpha; + } +} diff --git a/packages/room/src/object/visualization/pet/PetVisualization.ts b/packages/room/src/object/visualization/pet/PetVisualization.ts new file mode 100644 index 0000000..879c922 --- /dev/null +++ b/packages/room/src/object/visualization/pet/PetVisualization.ts @@ -0,0 +1,594 @@ +import { IGraphicAsset, IObjectVisualizationData, IRoomGeometry, RoomObjectVariable, RoomObjectVisualizationType } from '@nitrots/api'; +import { GetAssetManager } from '@nitrots/assets'; +import { AnimationData, AnimationStateData, DirectionData, LayerData } from '../data'; +import { FurnitureAnimatedVisualization, FurnitureVisualizationData } from '../furniture'; +import { ExperienceData } from './ExperienceData'; +import { PetVisualizationData } from './PetVisualizationData'; + +export class PetVisualization extends FurnitureAnimatedVisualization +{ + public static TYPE: string = RoomObjectVisualizationType.PET_ANIMATED; + + private static HEAD: string = 'head'; + private static SADDLE: string = 'saddle'; + private static HAIR: string = 'hair'; + private static ADDITIONAL_SPRITE_COUNT: number = 1; + private static EXPERIENCE_BUBBLE_VISIBLE_IN_MS: number = 1000; + private static PET_EXPERIENCE_BUBBLE: string = 'avatar_addition_pet_experience_bubble'; + private static POSTURE_ANIMATION_INDEX: number = 0; + private static GESTURE_ANIMATION_INDEX: number = 1; + private static ANIMATION_INDEX_COUNT: number = 2; + + private _posture: string; + private _gesture: string; + private _isSleeping: boolean; + private _headDirection: number; + private _headOnly: boolean; + private _nonHeadSprites: boolean[]; + private _headSprites: boolean[]; + private _saddleSprites: boolean[]; + private _animationOver: boolean; + private _paletteIndex: number; + private _paletteName: string; + private _customLayerIds: number[]; + private _customPartIds: number[]; + private _customPaletteIds: number[]; + private _isRiding: boolean; + private _color: number; + private _experience: number; + private _experienceTimestamp: number; + private _experienceData: ExperienceData; + + private _previousAnimationDirection: number; + private _animationStates: AnimationStateData[]; + + constructor() + { + super(); + + this._posture = ''; + this._gesture = ''; + this._isSleeping = false; + this._headDirection = -1; + this._headOnly = false; + this._nonHeadSprites = []; + this._headSprites = []; + this._saddleSprites = []; + this._animationOver = false; + this._paletteIndex = -1; + this._paletteName = ''; + this._customLayerIds = []; + this._customPartIds = []; + this._customPaletteIds = []; + this._isRiding = false; + this._color = 0xFFFFFF; + this._experience = 0; + this._experienceTimestamp = 0; + this._experienceData = null; + + this._previousAnimationDirection = -1; + this._animationStates = []; + + while(this._animationStates.length < PetVisualization.ANIMATION_INDEX_COUNT) this._animationStates.push(new AnimationStateData()); + } + + public initialize(data: IObjectVisualizationData): boolean + { + if(!(data instanceof PetVisualizationData)) return false; + + const texture = GetAssetManager().getTexture(PetVisualization.PET_EXPERIENCE_BUBBLE); + + if(texture) + { + this._experienceData = new ExperienceData(texture); + } + + return super.initialize(data); + } + + public dispose(): void + { + super.dispose(); + + if(this._animationStates) + { + while(this._animationStates.length) + { + const animationState = this._animationStates[0]; + + if(animationState) animationState.dispose(); + + this._animationStates.pop(); + } + + this._animationStates = null; + } + } + + protected getAnimationId(animationData: AnimationStateData): number + { + return animationData.animationId; + } + + public update(geometry: IRoomGeometry, time: number, update: boolean, skipUpdate: boolean): void + { + super.update(geometry, time, update, skipUpdate); + + this.updateExperienceBubble(time); + } + + protected updateExperienceBubble(time: number): void + { + if(!this._experienceData) return; + + this._experienceData.alpha = 0; + + if(this._experienceTimestamp) + { + const difference = (time - this._experienceTimestamp); + + if(difference < PetVisualization.EXPERIENCE_BUBBLE_VISIBLE_IN_MS) + { + this._experienceData.alpha = (Math.sin(((difference / PetVisualization.EXPERIENCE_BUBBLE_VISIBLE_IN_MS) * Math.PI)) * 0xFF); + } + else + { + this._experienceTimestamp = 0; + } + + const sprite = this.getSprite((this.totalSprites - 1)); + + if(sprite) + { + if(this._experienceData.alpha > 0) + { + const texture = this._experienceData.renderBubble(this._experience); + + if(texture) + { + sprite.texture = texture; + sprite.offsetX = -20; + sprite.offsetY = -80; + sprite.alpha = this._experienceData.alpha; + sprite.visible = true; + sprite.relativeDepth = -0.2; + + return; + } + } + + sprite.texture = null; + sprite.visible = false; + } + } + } + + protected updateModel(scale: number): boolean + { + const model = this.object && this.object.model; + + if(!model) return false; + + if(this.updateModelCounter === model.updateCounter) return false; + + const posture = model.getValue(RoomObjectVariable.FIGURE_POSTURE); + const gesture = model.getValue(RoomObjectVariable.FIGURE_GESTURE); + + this.setPostureAndGesture(posture, gesture); + + let alphaMultiplier = (model.getValue(RoomObjectVariable.FURNITURE_ALPHA_MULTIPLIER) || null); + + if(alphaMultiplier === null || isNaN(alphaMultiplier)) alphaMultiplier = 1; + + if(this._alphaMultiplier !== alphaMultiplier) + { + this._alphaMultiplier = alphaMultiplier; + + this._alphaChanged = true; + } + + this._isSleeping = (model.getValue(RoomObjectVariable.FIGURE_SLEEP) > 0); + + const headDirection = model.getValue(RoomObjectVariable.HEAD_DIRECTION); + + if(!isNaN(headDirection) && this.data.isAllowedToTurnHead) + { + this._headDirection = headDirection; + } + else + { + this._headDirection = this.object.getDirection().x; + } + + this._experience = (model.getValue(RoomObjectVariable.FIGURE_GAINED_EXPERIENCE)); + this._experienceTimestamp = (model.getValue(RoomObjectVariable.FIGURE_EXPERIENCE_TIMESTAMP)); + + const customPaletteIndex = model.getValue(RoomObjectVariable.PET_PALETTE_INDEX); + const customLayerIds = model.getValue(RoomObjectVariable.PET_CUSTOM_LAYER_IDS); + const customPartIds = model.getValue(RoomObjectVariable.PET_CUSTOM_PARTS_IDS); + const customPaletteIds = model.getValue(RoomObjectVariable.PET_CUSTOM_PALETTE_IDS); + const isRiding = model.getValue(RoomObjectVariable.PET_IS_RIDING); + const headOnly = model.getValue(RoomObjectVariable.PET_HEAD_ONLY); + const color = model.getValue(RoomObjectVariable.PET_COLOR); + + if(customPaletteIndex !== this._paletteIndex) + { + this._paletteIndex = customPaletteIndex; + this._paletteName = this._paletteIndex.toString(); + } + + this._customLayerIds = (customLayerIds) ? customLayerIds : []; + this._customPartIds = (customPartIds) ? customPartIds : []; + this._customPaletteIds = (customPaletteIds) ? customPaletteIds : []; + this._isRiding = (!isNaN(isRiding) && (isRiding > 0)); + this._headOnly = (!isNaN(headOnly) && (headOnly > 0)); + + if(!isNaN(color) && this._color !== color) this._color = color; + + this.updateModelCounter = model.updateCounter; + + return true; + } + + protected updateAnimation(scale: number): number + { + if(this.object) + { + const direction = this.object.getDirection().x; + + if(direction !== this._previousAnimationDirection) + { + this._previousAnimationDirection = direction; + + this.resetAllAnimationFrames(); + } + } + + return super.updateAnimation(scale); + } + + protected setPostureAndGesture(posture: string, gesture: string): void + { + if(!this.data) return; + + if(posture !== this._posture) + { + this._posture = posture; + + this.setAnimationForIndex(PetVisualization.POSTURE_ANIMATION_INDEX, this.data.postureToAnimation(this._scale, posture)); + } + + if(this.data.getGestureDisabled(this._scale, posture)) gesture = null; + + if(gesture !== this._gesture) + { + this._gesture = gesture; + + this.setAnimationForIndex(PetVisualization.GESTURE_ANIMATION_INDEX, this.data.gestureToAnimation(this._scale, gesture)); + } + } + + private getAnimationStateData(k: number): AnimationStateData + { + if((k >= 0) && (k < this._animationStates.length)) return this._animationStates[k]; + + return null; + } + + private setAnimationForIndex(k: number, _arg_2: number): void + { + const animationStateData = this.getAnimationStateData(k); + + if(animationStateData) + { + if(this.setSubAnimation(animationStateData, _arg_2)) this._animationOver = false; + } + } + + protected resetAllAnimationFrames(): void + { + this._animationOver = false; + + let index = (this._animationStates.length - 1); + + while(index >= 0) + { + const stateData = this._animationStates[index]; + + if(stateData) stateData.setLayerCount(this.animatedLayerCount); + + index--; + } + } + + protected updateAnimations(scale: number): number + { + if(this._animationOver) return 0; + + let animationOver = true; + let _local_3 = 0; + let index = 0; + + while(index < this._animationStates.length) + { + const stateData = this._animationStates[index]; + + if(stateData) + { + if(!stateData.animationOver) + { + const _local_6 = this.updateFramesForAnimation(stateData, scale); + + _local_3 = (_local_3 | _local_6); + + if(!stateData.animationOver) + { + animationOver = false; + } + else + { + if(AnimationData.isTransitionFromAnimation(stateData.animationId) || AnimationData.isTransitionToAnimation(stateData.animationId)) + { + this.setAnimationForIndex(index, stateData.animationAfterTransitionId); + + animationOver = false; + } + } + } + } + + index++; + } + + this._animationOver = animationOver; + + return _local_3; + } + + protected getSpriteAssetName(scale: number, layerId: number): string + { + if(this._headOnly && this.isNonHeadSprite(layerId)) return null; + + if(this._isRiding && this._parser3(layerId)) return null; + + const totalSprites = this.totalSprites; + + if(layerId < (totalSprites - PetVisualization.ADDITIONAL_SPRITE_COUNT)) + { + const validScale = this.getValidSize(scale); + + if(layerId < (totalSprites - (1 + PetVisualization.ADDITIONAL_SPRITE_COUNT))) + { + if(layerId >= FurnitureVisualizationData.LAYER_LETTERS.length) return null; + + const layerLetter = FurnitureVisualizationData.LAYER_LETTERS[layerId]; + + if(validScale === 1) return (this._type + '_icon_' + layerLetter); + + return (this._type + '_' + validScale + '_' + layerLetter + '_' + this.getDirection(scale, layerId) + '_' + this.getFrameNumber(validScale, layerId)); + } + + return (this._type + '_' + validScale + '_sd_' + this.getDirection(scale, layerId) + '_0'); + } + + return null; + } + + protected getLayerColor(scale: number, layerId: number, colorId: number): number + { + if(layerId < (this.totalSprites - PetVisualization.ADDITIONAL_SPRITE_COUNT)) return this._color; + + return 0xFFFFFF; + } + + protected getLayerXOffset(scale: number, direction: number, layerId: number): number + { + let offset = super.getLayerXOffset(scale, direction, layerId); + let index = (this._animationStates.length - 1); + + while(index >= 0) + { + const stateData = this._animationStates[index]; + + if(stateData) + { + const frame = stateData.getFrame(layerId); + + if(frame) offset += frame.x; + } + + index--; + } + + return offset; + } + + protected getLayerYOffset(scale: number, direction: number, layerId: number): number + { + let offset = super.getLayerYOffset(scale, direction, layerId); + let index = (this._animationStates.length - 1); + + while(index >= 0) + { + const stateData = this._animationStates[index]; + + if(stateData) + { + const frame = stateData.getFrame(layerId); + + if(frame) offset += frame.y; + } + + index--; + } + + return offset; + } + + protected getLayerZOffset(scale: number, direction: number, layerId: number): number + { + if(!this.data) return LayerData.DEFAULT_ZOFFSET; + + return this.data.getLayerZOffset(scale, this.getDirection(scale, layerId), layerId); + } + + private getDirection(scale: number, layerId: number): number + { + if(!this.isHeadSprite(layerId)) return this._direction; + + return this.data.getValidDirection(scale, this._headDirection); + } + + protected getFrameNumber(scale: number, layerId: number): number + { + let index = (this._animationStates.length - 1); + + while(index >= 0) + { + const stateData = this._animationStates[index]; + + if(stateData) + { + const frame = stateData.getFrame(layerId); + + if(frame) return frame.id; + } + + index--; + } + + return super.getFrameNumber(scale, layerId); + } + + private isHeadSprite(layerId: number): boolean + { + if(this._headSprites[layerId] === undefined) + { + const isHead = (this.data.getLayerTag(this._scale, DirectionData.USE_DEFAULT_DIRECTION, layerId) === PetVisualization.HEAD); + const isHair = (this.data.getLayerTag(this._scale, DirectionData.USE_DEFAULT_DIRECTION, layerId) === PetVisualization.HAIR); + + if(isHead || isHair) this._headSprites[layerId] = true; + else this._headSprites[layerId] = false; + } + + return this._headSprites[layerId]; + } + + private isNonHeadSprite(layerId: number): boolean + { + if(this._nonHeadSprites[layerId] === undefined) + { + if(layerId < (this.totalSprites - (1 + PetVisualization.ADDITIONAL_SPRITE_COUNT))) + { + const tag = this.data.getLayerTag(this._scale, DirectionData.USE_DEFAULT_DIRECTION, layerId); + + if(((tag && (tag.length > 0)) && (tag !== PetVisualization.HEAD)) && (tag !== PetVisualization.HAIR)) + { + this._nonHeadSprites[layerId] = true; + } + else + { + this._nonHeadSprites[layerId] = false; + } + } + else + { + this._nonHeadSprites[layerId] = true; + } + } + + return this._nonHeadSprites[layerId]; + } + + private _parser3(layerId: number): boolean + { + if(this._saddleSprites[layerId] === undefined) + { + if(this.data.getLayerTag(this._scale, DirectionData.USE_DEFAULT_DIRECTION, layerId) === PetVisualization.SADDLE) + { + this._saddleSprites[layerId] = true; + } + else + { + this._saddleSprites[layerId] = false; + } + } + + return this._saddleSprites[layerId]; + } + + public getAsset(name: string, layerId: number = -1): IGraphicAsset + { + if(!this.asset) return null; + + const layerIndex = this._customLayerIds.indexOf(layerId); + let paletteName = this._paletteName; + let partId = -1; + let paletteId = -1; + + if(layerIndex > -1) + { + partId = this._customPartIds[layerIndex]; + paletteId = this._customPaletteIds[layerIndex]; + paletteName = ((paletteId > -1) ? paletteId.toString() : this._paletteName); + } + + if(!(isNaN(partId)) && (partId > -1)) + { + name = (name + '_' + partId); + } + + return this.asset.getAssetWithPalette(name, paletteName); + } + + protected getAdditionalLayerCount(): number + { + return super.getAdditionalLayerCount() + PetVisualization.ADDITIONAL_SPRITE_COUNT; + } + + protected setLayerCount(count: number): void + { + super.setLayerCount(count); + + this._headSprites = []; + } + + protected getPostureForAsset(scale: number, name: string): string + { + const parts = name.split('_'); + let length = parts.length; + let i = 0; + + while(i < parts.length) + { + if((parts[i] === '64') || (parts[i] === '32')) + { + length = (i + 3); + + break; + } + + i++; + } + + let posture: string = null; + + if(length < parts.length) + { + let part = parts[length]; + + part = part.split('@')[0]; + + posture = this.data.animationToPosture(scale, (parseInt(part) / 100), false); + + if(!posture) posture = this.data.getGestureForAnimationId(scale, (parseInt(part) / 100)); + } + + return posture; + } + + protected get data(): PetVisualizationData + { + return this._data as PetVisualizationData; + } +} diff --git a/packages/room/src/object/visualization/pet/PetVisualizationData.ts b/packages/room/src/object/visualization/pet/PetVisualizationData.ts new file mode 100644 index 0000000..5f0a801 --- /dev/null +++ b/packages/room/src/object/visualization/pet/PetVisualizationData.ts @@ -0,0 +1,125 @@ +import { IAssetVisualizationData } from '@nitrots/api'; +import { AnimationSizeData, PetSizeData, SizeData } from '../data'; +import { FurnitureAnimatedVisualizationData } from '../furniture'; + +export class PetVisualizationData extends FurnitureAnimatedVisualizationData +{ + private _isAllowedToTurnHead: boolean; + + constructor() + { + super(); + + this._isAllowedToTurnHead = true; + } + + protected createSizeData(scale: number, layerCount: number, angle: number): SizeData + { + if(scale > 1) return new PetSizeData(layerCount, angle); + else return new AnimationSizeData(layerCount, angle); + } + + protected defineVisualizations(visualizations: IAssetVisualizationData[]): boolean + { + this._isAllowedToTurnHead = true; //check visualization for '@disableheadturn' + + return super.defineVisualizations(visualizations); + } + + protected processVisualElement(sizeData: SizeData, key: string, data: any): boolean + { + if(!sizeData || !key || !data) return false; + + switch(key) + { + case 'postures': + if(!(sizeData instanceof PetSizeData) || !sizeData.processPostures(data)) return false; + break; + case 'gestures': + if(!(sizeData instanceof PetSizeData) || !sizeData.processGestures(data)) return false; + break; + default: + if(!super.processVisualElement(sizeData, key, data)) return false; + break; + } + + return true; + } + + public postureToAnimation(scale: number, posture: string): number + { + const size = this.getSizeData(scale) as PetSizeData; + + if(!size) return PetSizeData.DEFAULT; + + return size.postureToAnimation(posture); + } + + public getGestureDisabled(scale: number, posture: string): boolean + { + const size = this.getSizeData(scale) as PetSizeData; + + if(!size) return false; + + return size.getGestureDisabled(posture); + } + + public gestureToAnimation(scale: number, gesture: string): number + { + const size = this.getSizeData(scale) as PetSizeData; + + if(!size) return PetSizeData.DEFAULT; + + return size.gestureToAnimation(gesture); + } + + public animationToPosture(scale: number, index: number, useDefault: boolean): string + { + const size = this.getSizeData(scale) as PetSizeData; + + if(!size) return null; + + return size.animationToPosture(index, useDefault); + } + + public animationToGesture(scale: number, index: number): string + { + const size = this.getSizeData(scale) as PetSizeData; + + if(!size) return null; + + return size.animationToGesture(index); + } + + public getGestureForAnimationId(scale: number, _arg_2: number): string + { + const size = this.getSizeData(scale) as PetSizeData; + + if(!size) return null; + + return size.getGestureForAnimationId(_arg_2); + } + + public totalPostures(scale: number): number + { + const size = this.getSizeData(scale) as PetSizeData; + + if(!size) return 0; + + return size.totalPostures; + } + + public totalGestures(scale: number): number + { + const size = this.getSizeData(scale) as PetSizeData; + + if(!size) return 0; + + return size.totalGestures; + } + + public get isAllowedToTurnHead(): boolean + { + return this._isAllowedToTurnHead; + } +} diff --git a/packages/room/src/object/visualization/pet/index.ts b/packages/room/src/object/visualization/pet/index.ts new file mode 100644 index 0000000..02a6ab3 --- /dev/null +++ b/packages/room/src/object/visualization/pet/index.ts @@ -0,0 +1,3 @@ +export * from './ExperienceData'; +export * from './PetVisualization'; +export * from './PetVisualizationData'; diff --git a/packages/room/src/object/visualization/room/PlaneDrawingData.ts b/packages/room/src/object/visualization/room/PlaneDrawingData.ts new file mode 100644 index 0000000..861712a --- /dev/null +++ b/packages/room/src/object/visualization/room/PlaneDrawingData.ts @@ -0,0 +1,103 @@ +import { IPlaneDrawingData } from '@nitrots/api'; +import { Point } from 'pixi.js'; + +export class PlaneDrawingData implements IPlaneDrawingData +{ + private _z: number; + private _points: Point[]; + private _color: number; + private _maskAssetNames: string[]; + private _maskAssetLocations: Point[]; + private _maskAssetFlipHs: boolean[]; + private _maskAssetFlipVs: boolean[]; + private _alignBottom: boolean; + private _assetNames: string[][]; + + constructor(k: PlaneDrawingData = null, _arg_2: number = 0, _arg_3: boolean = false) + { + this._assetNames = []; + this._maskAssetNames = []; + this._maskAssetLocations = []; + this._maskAssetFlipHs = []; + this._maskAssetFlipVs = []; + + if(k != null) + { + this._maskAssetNames = k._maskAssetNames; + this._maskAssetLocations = k._maskAssetLocations; + this._maskAssetFlipHs = k._maskAssetFlipHs; + this._maskAssetFlipVs = k._maskAssetFlipVs; + } + + this._color = _arg_2; + this._alignBottom = _arg_3; + } + + public addMask(k: string, _arg_2: Point, _arg_3: boolean, _arg_4: boolean): void + { + this._maskAssetNames.push(k); + this._maskAssetLocations.push(_arg_2); + this._maskAssetFlipHs.push(_arg_3); + this._maskAssetFlipVs.push(_arg_4); + } + + public addAssetColumn(k: string[]): void + { + this._assetNames.push(k); + } + + public set z(k: number) + { + this._z = k; + } + + public get z(): number + { + return this._z; + } + + public set cornerPoints(k: Point[]) + { + this._points = k; + } + + public get cornerPoints(): Point[] + { + return this._points; + } + + public get color(): number + { + return this._color; + } + + public get maskAssetNames(): string[] + { + return this._maskAssetNames; + } + + public get maskAssetLocations(): Point[] + { + return this._maskAssetLocations; + } + + public get maskAssetFlipHs(): boolean[] + { + return this._maskAssetFlipHs; + } + + public get maskAssetFlipVs(): boolean[] + { + return this._maskAssetFlipVs; + } + + public isBottomAligned(): boolean + { + return this._alignBottom; + } + + public get assetNameColumns(): string[][] + { + return this._assetNames; + } +} diff --git a/packages/room/src/object/visualization/room/RoomPlane.ts b/packages/room/src/object/visualization/room/RoomPlane.ts new file mode 100644 index 0000000..3feaa5e --- /dev/null +++ b/packages/room/src/object/visualization/room/RoomPlane.ts @@ -0,0 +1,636 @@ +import { IAssetPlaneVisualizationLayer, IAssetRoomVisualizationData, IRoomGeometry, IRoomPlane, IVector3D } from '@nitrots/api'; +import { GetAssetManager } from '@nitrots/assets'; +import { GetRenderer, GetTexturePool, PlaneMaskFilter, Vector3d } from '@nitrots/utils'; +import { Container, Filter, Matrix, Point, Sprite, Texture, TilingSprite } from 'pixi.js'; +import { RoomGeometry } from '../../../utils'; +import { RoomPlaneBitmapMask } from './RoomPlaneBitmapMask'; +import { RoomPlaneRectangleMask } from './RoomPlaneRectangleMask'; +import { PlaneMaskManager } from './mask'; +import { Randomizer } from './utils'; + +export class RoomPlane implements IRoomPlane +{ + public static HORIZONTAL_ANGLE_DEFAULT: number = 45; + public static VERTICAL_ANGLE_DEFAULT: number = 30; + public static PLANE_GEOMETRY: IRoomGeometry = new RoomGeometry(64, new Vector3d(RoomPlane.HORIZONTAL_ANGLE_DEFAULT, RoomPlane.VERTICAL_ANGLE_DEFAULT), new Vector3d(-10, 0, 0)); + private static LANDSCAPE_COLOR: number = 0x0082F0; + + public static TYPE_UNDEFINED: number = 0; + public static TYPE_WALL: number = 1; + public static TYPE_FLOOR: number = 2; + public static TYPE_LANDSCAPE: number = 3; + private static _uniqueIdCounter: number = 1; + + private _disposed: boolean = false; + private _randomSeed: number; + private _origin: IVector3D = new Vector3d(); + private _location: IVector3D = new Vector3d(); + private _leftSide: IVector3D = new Vector3d(); + private _rightSide: IVector3D = new Vector3d(); + private _normal: IVector3D = null; + private _secondaryNormals: IVector3D[] = []; + private _type: number; + private _isVisible: boolean = false; + private _offset: Point = new Point(); + private _relativeDepth: number = 0; + private _color: number = 0; + private _maskManager: PlaneMaskManager = null; + private _id: string = null; + private _uniqueId: number; + private _cornerA: IVector3D = new Vector3d(); + private _cornerB: IVector3D = new Vector3d(); + private _cornerC: IVector3D = new Vector3d(); + private _cornerD: IVector3D = new Vector3d(); + private _textureOffsetX: number; + private _textureOffsetY: number; + private _textureMaxX: number; + private _textureMaxY: number; + private _width: number = 0; + private _height: number = 0; + private _hasTexture: boolean = true; + private _canBeVisible: boolean = true; + private _geometryUpdateId: number = -1; + + private _useMask: boolean; + private _bitmapMasks: RoomPlaneBitmapMask[] = []; + private _rectangleMasks: RoomPlaneRectangleMask[] = []; + private _maskChanged: boolean = false; + private _bitmapMasksOld: RoomPlaneBitmapMask[] = []; + private _rectangleMasksOld: RoomPlaneRectangleMask[] = []; + + private _planeSprite: TilingSprite = null; + private _planeTexture: Texture = null; + private _maskFilter: Filter = null; + + constructor(origin: IVector3D, location: IVector3D, leftSide: IVector3D, rightSide: IVector3D, type: number, usesMask: boolean, secondaryNormals: IVector3D[], randomSeed: number, textureOffsetX: number = 0, textureOffsetY: number = 0, textureMaxX: number = 0, textureMaxY: number = 0) + { + this._randomSeed = randomSeed; + this._origin.assign(origin); + this._location.assign(location); + this._leftSide.assign(leftSide); + this._rightSide.assign(rightSide); + this._normal = Vector3d.crossProduct(this._leftSide, this._rightSide); + + if(this._normal.length > 0) this._normal.multiply((1 / this._normal.length)); + + if(secondaryNormals != null) + { + for(const entry of secondaryNormals) + { + if(!entry) continue; + + const vector = new Vector3d(); + + vector.assign(entry); + + this._secondaryNormals.push(vector); + } + } + + this._type = type; + this._textureOffsetX = textureOffsetX; + this._textureOffsetY = textureOffsetY; + this._textureMaxX = textureMaxX; + this._textureMaxY = textureMaxY; + this._useMask = usesMask; + this._uniqueId = ++RoomPlane._uniqueIdCounter; + } + + public dispose(): void + { + this._location = null; + this._origin = null; + this._leftSide = null; + this._rightSide = null; + this._normal = null; + this._cornerA = null; + this._cornerB = null; + this._cornerC = null; + this._cornerD = null; + + if(this._planeSprite) this._planeSprite.destroy(); + + if(this._planeTexture) + { + GetTexturePool().putTexture(this._planeTexture); + + this._planeTexture = null; + } + + this._disposed = true; + } + + public update(geometry: IRoomGeometry, timeSinceStartMs: number, needsUpdate: boolean = false): boolean + { + if(!geometry || this._disposed) return false; + + if(this._geometryUpdateId !== geometry.updateId) + { + this._geometryUpdateId = geometry.updateId; + + needsUpdate = true; + } + + if(!needsUpdate || !this._canBeVisible) + { + if(!this.visible) return false; + } + + if(needsUpdate) + { + let cosAngle = 0; + + cosAngle = Vector3d.cosAngle(geometry.directionAxis, this.normal); + + if(cosAngle > -0.001) + { + if(this._isVisible) + { + this._isVisible = false; + + return true; + } + + return false; + } + + let i = 0; + + while(i < this._secondaryNormals.length) + { + cosAngle = Vector3d.cosAngle(geometry.directionAxis, this._secondaryNormals[i]); + + if(cosAngle > -0.001) + { + if(this._isVisible) + { + this._isVisible = false; + return true; + } + + return false; + } + + i++; + } + + this.updateCorners(geometry); + + let relativeDepth = (Math.max(this._cornerA.z, this._cornerB.z, this._cornerC.z, this._cornerD.z) - geometry.getScreenPosition(this._origin).z); + + switch(this._type) + { + case RoomPlane.TYPE_FLOOR: + relativeDepth = (relativeDepth - ((this._location.z + Math.min(0, this._leftSide.z, this._rightSide.z)) * 8)); + break; + case RoomPlane.TYPE_LANDSCAPE: + relativeDepth = (relativeDepth + 0.02); + break; + } + + this._relativeDepth = relativeDepth; + this._isVisible = true; + + Randomizer.setSeed(this._randomSeed); + + let width = (this._leftSide.length * geometry.scale); + let height = (this._rightSide.length * geometry.scale); + const normal = geometry.getCoordinatePosition(this._normal); + + const getTextureAndColorForPlane = (planeId: string, planeType: number) => + { + const dataType: keyof IAssetRoomVisualizationData = (planeType === RoomPlane.TYPE_FLOOR) ? 'floorData' : (planeType === RoomPlane.TYPE_WALL) ? 'wallData' : 'landscapeData'; + + const roomCollection = GetAssetManager().getCollection('room'); + const planeVisualizationData = roomCollection?.data?.roomVisualization?.[dataType]; + const plane = planeVisualizationData?.planes?.find(plane => (plane.id === planeId)); + const planeVisualization = (dataType === 'landscapeData') ? plane?.animatedVisualization?.[0] : plane?.visualizations?.[0]; + const planeLayer = planeVisualization?.allLayers?.[0] as IAssetPlaneVisualizationLayer; + const planeMaterialId = planeLayer?.materialId; + const planeColor = planeLayer?.color; + const planeAssetName = planeVisualizationData?.textures?.find(texture => (texture.id === planeMaterialId))?.bitmaps?.[0]?.assetName; + const texture = GetAssetManager().getAsset(planeAssetName)?.texture; + + return { texture, color: planeColor }; + }; + + const planeData = getTextureAndColorForPlane(this._id, this._type); + const texture = this._hasTexture ? planeData.texture ?? Texture.WHITE : Texture.WHITE; + + switch(this._type) + { + case RoomPlane.TYPE_FLOOR: { + const _local_10 = RoomPlane.PLANE_GEOMETRY.getScreenPoint(new Vector3d(0, 0, 0)); + const _local_11 = RoomPlane.PLANE_GEOMETRY.getScreenPoint(new Vector3d(0, (height / RoomPlane.PLANE_GEOMETRY.scale), 0)); + const _local_12 = RoomPlane.PLANE_GEOMETRY.getScreenPoint(new Vector3d((width / RoomPlane.PLANE_GEOMETRY.scale), 0, 0)); + + let x = 0; + let y = 0; + + if(_local_10 && _local_11 && _local_12) + { + width = Math.round(Math.abs((_local_10.x - _local_12.x))); + height = Math.round(Math.abs((_local_10.x - _local_11.x))); + + const _local_15 = (_local_10.x - RoomPlane.PLANE_GEOMETRY.getScreenPoint(new Vector3d(1, 0, 0)).x); + + x = (this._textureOffsetX * Math.trunc(Math.abs(_local_15))); + y = (this._textureOffsetY * Math.trunc(Math.abs(_local_15))); + } + + if((x !== 0) || (y !== 0)) + { + while(x < 0) x += texture.width; + + while(y < 0) y += texture.height; + } + + this._planeSprite = new TilingSprite({ + texture, + width, + height, + tint: planeData.color, + tilePosition: { + x: (x % texture.width) + (this._textureOffsetX * texture.width), + y: (y % texture.height) + (this._textureOffsetY * texture.height) + } + }); + + break; + } + case RoomPlane.TYPE_WALL: { + const _local_8 = RoomPlane.PLANE_GEOMETRY.getScreenPoint(new Vector3d(0, 0, 0)); + const _local_9 = RoomPlane.PLANE_GEOMETRY.getScreenPoint(new Vector3d(0, 0, (height / RoomPlane.PLANE_GEOMETRY.scale))); + const _local_10 = RoomPlane.PLANE_GEOMETRY.getScreenPoint(new Vector3d(0, (width / RoomPlane.PLANE_GEOMETRY.scale), 0)); + + if(_local_8 && _local_9 && _local_10) + { + width = Math.round(Math.abs((_local_8.x - _local_10.x))); + height = Math.round(Math.abs((_local_8.y - _local_9.y))); + } + + this._planeSprite = new TilingSprite({ + texture, + width, + height, + tint: planeData.color, + tilePosition: { + x: (this._textureOffsetX * texture.width), + y: (this._textureOffsetY * texture.height) + } + }); + + break; + } + case RoomPlane.TYPE_LANDSCAPE: { + const _local_13 = RoomPlane.PLANE_GEOMETRY.getScreenPoint(new Vector3d(0, 0, 0)); + const _local_14 = RoomPlane.PLANE_GEOMETRY.getScreenPoint(new Vector3d(0, 0, 1)); + const _local_15 = RoomPlane.PLANE_GEOMETRY.getScreenPoint(new Vector3d(0, 1, 0)); + + if(_local_13 && _local_14 && _local_15) + { + width = Math.round(Math.abs((((_local_13.x - _local_15.x) * width) / RoomPlane.PLANE_GEOMETRY.scale))); + height = Math.round(Math.abs((((_local_13.y - _local_14.y) * height) / RoomPlane.PLANE_GEOMETRY.scale))); + } + + const renderMaxX = Math.trunc(this._textureMaxX * Math.abs((_local_13.x - _local_15.x))); + const renderMaxY = Math.trunc(this._textureMaxY * Math.abs((_local_13.y - _local_14.y))); + + const renderOffsetX = Math.trunc(this._textureOffsetX * Math.abs((_local_13.x - _local_15.x))); + const renderOffsetY = Math.trunc(this._textureOffsetY * Math.abs((_local_13.y - _local_14.y))); + + this._planeSprite = new TilingSprite({ + texture, + width, + height, + tilePosition: { + x: renderOffsetX, + y: renderOffsetY + }, + tint: RoomPlane.LANDSCAPE_COLOR + }); + break; + } + default: { + this._planeSprite = new TilingSprite({ + texture: Texture.WHITE, + width: width, + height: height + }); + } + } + + this._planeSprite.allowChildren = true; + } + + if(needsUpdate || this._maskChanged) + { + this.updateMask(this._planeSprite, geometry); + + needsUpdate = true; + } + + if(this._planeTexture) + { + if(this._planeTexture.width !== this._width || this._planeTexture.height !== this._height) + { + GetTexturePool().putTexture(this._planeTexture); + + this._planeTexture = null; + } + } + + if(!this._planeTexture) this._planeTexture = GetTexturePool().getTexture(this._width, this._height); + + this._planeTexture.source.label = `room_plane_${ this._uniqueId.toString() }`; + + if(needsUpdate) + { + GetRenderer().render({ + target: this._planeTexture, + container: this._planeSprite, + transform: this.getMatrixForDimensions(this._planeSprite.width, this._planeSprite.height), + clear: true + }); + } + + return true; + } + + private updateCorners(geometry: IRoomGeometry): void + { + this._cornerA.assign(geometry.getScreenPosition(this._location)); + this._cornerB.assign(geometry.getScreenPosition(Vector3d.sum(this._location, this._rightSide))); + this._cornerC.assign(geometry.getScreenPosition(Vector3d.sum(Vector3d.sum(this._location, this._leftSide), this._rightSide))); + this._cornerD.assign(geometry.getScreenPosition(Vector3d.sum(this._location, this._leftSide))); + + this._offset = geometry.getScreenPoint(this._origin); + this._cornerA.x = Math.round(this._cornerA.x); + this._cornerA.y = Math.round(this._cornerA.y); + this._cornerB.x = Math.round(this._cornerB.x); + this._cornerB.y = Math.round(this._cornerB.y); + this._cornerC.x = Math.round(this._cornerC.x); + this._cornerC.y = Math.round(this._cornerC.y); + this._cornerD.x = Math.round(this._cornerD.x); + this._cornerD.y = Math.round(this._cornerD.y); + this._offset.x = Math.round(this._offset.x); + this._offset.y = Math.round(this._offset.y); + + const minX = Math.min(this._cornerA.x, this._cornerB.x, this._cornerC.x, this._cornerD.x); + const maxX = Math.max(this._cornerA.x, this._cornerB.x, this._cornerC.x, this._cornerD.x) - minX; + const minY = Math.min(this._cornerA.y, this._cornerB.y, this._cornerC.y, this._cornerD.y); + const maxY = Math.max(this._cornerA.y, this._cornerB.y, this._cornerC.y, this._cornerD.y) - minY; + + this._offset.x = (this._offset.x - minX); + this._cornerA.x = (this._cornerA.x - minX); + this._cornerB.x = (this._cornerB.x - minX); + this._cornerC.x = (this._cornerC.x - minX); + this._cornerD.x = (this._cornerD.x - minX); + + this._offset.y = (this._offset.y - minY); + this._cornerA.y = (this._cornerA.y - minY); + this._cornerB.y = (this._cornerB.y - minY); + this._cornerC.y = (this._cornerC.y - minY); + this._cornerD.y = (this._cornerD.y - minY); + + this._width = maxX; + this._height = maxY; + } + + private getMatrixForDimensions(width: number, height: number): Matrix + { + let a: number = (this._cornerD.x - this._cornerC.x); + let b: number = (this._cornerD.y - this._cornerC.y); + let c: number = (this._cornerB.x - this._cornerC.x); + let d: number = (this._cornerB.y - this._cornerC.y); + + if((this._type === RoomPlane.TYPE_WALL) || (this._type === RoomPlane.TYPE_LANDSCAPE)) + { + if(Math.abs((c - width)) <= 1) c = width; + + if(Math.abs((d - width)) <= 1) d = width; + + if(Math.abs((a - height)) <= 1) a = height; + + if(Math.abs((b - height)) <= 1) b = height; + } + + const xScale: number = (c / width); + const ySkew: number = (d / width); + const xSkew: number = (a / height); + const yScale: number = (b / height); + + const matrix = new Matrix(xScale, ySkew, xSkew, yScale); + + matrix.translate(this._cornerC.x, this._cornerC.y); + + return matrix; + } + + public resetBitmapMasks(): void + { + if(this._disposed || !this._useMask || !this._bitmapMasks.length) return; + + this._maskChanged = true; + this._bitmapMasks = []; + } + + public addBitmapMask(maskType: string, leftSideLoc: number, rightSideLoc: number): boolean + { + if(!this._useMask) return false; + + for(const mask of this._bitmapMasks) + { + if(!mask) continue; + + if((((mask.type === maskType) && (mask.leftSideLoc === leftSideLoc)) && (mask.rightSideLoc === rightSideLoc))) return false; + } + + const mask = new RoomPlaneBitmapMask(maskType, leftSideLoc, rightSideLoc); + + this._bitmapMasks.push(mask); + this._maskChanged = true; + + return true; + } + + public resetRectangleMasks(): void + { + if(!this._useMask || !this._rectangleMasks.length) return; + + this._maskChanged = true; + this._rectangleMasks = []; + } + + public addRectangleMask(leftLocation: number, rightLocation: number, leftLength: number, rightLength: number): boolean + { + if(this._useMask) + { + for(const mask of this._rectangleMasks) + { + if(!mask) continue; + + if((((mask.leftSideLoc === leftLocation) && (mask.rightSideLoc === rightLocation)) && (mask.leftSideLength === leftLength)) && (mask.rightSideLength === rightLength)) return false; + } + + this._rectangleMasks.push(new RoomPlaneRectangleMask(leftLocation, rightLocation, leftLength, rightLength)); + this._maskChanged = true; + + return true; + } + + return false; + } + + private updateMask(container: Container, geometry: IRoomGeometry): boolean + { + if(container.children?.length) container.removeChildren(); + + if(!container || !geometry || !this._useMask || (!this._bitmapMasks.length && !this._rectangleMasks.length) || !this._maskManager) return false; + + const normal = geometry.getCoordinatePosition(this._normal); + + let type: string = null; + let posX = 0; + let posY = 0; + let i = 0; + + while(i < this._bitmapMasks.length) + { + const mask = this._bitmapMasks[i]; + + if(mask) + { + type = mask.type; + posX = (container.width - ((container.width * mask.leftSideLoc) / this._leftSide.length)); + posY = (container.height - ((container.height * mask.rightSideLoc) / this._rightSide.length)); + + this._maskManager.addMaskToContainer(container, type, geometry.scale, normal, posX, posY); + } + + i++; + } + + i = 0; + + while(i < this._rectangleMasks.length) + { + const rectMask = this._rectangleMasks[i]; + + if(rectMask) + { + posX = (container.width - ((container.width * rectMask.leftSideLoc) / this._leftSide.length)); + posY = (container.height - ((container.height * rectMask.rightSideLoc) / this._rightSide.length)); + + const wd = ((container.width * rectMask.leftSideLength) / this._leftSide.length); + const ht = ((container.height * rectMask.rightSideLength) / this._rightSide.length); + + const maskSprite = new Sprite(Texture.WHITE); + + maskSprite.tint = 0x000000; + maskSprite.width = wd; + maskSprite.height = ht; + maskSprite.position.set(Math.trunc((posX - wd)), Math.trunc((posY - ht))); + + container.addChild(maskSprite); + } + + i++; + } + + this._maskChanged = false; + + if(!this._maskFilter) this._maskFilter = new PlaneMaskFilter({}); + + if(!container.filters) container.filters = [ this._maskFilter ]; + + return true; + } + + public get canBeVisible(): boolean + { + return this._canBeVisible; + } + + public set canBeVisible(flag: boolean) + { + if(flag !== this._canBeVisible) this._canBeVisible = flag; + } + + public get visible(): boolean + { + return (this._isVisible && this._canBeVisible); + } + + public get offset(): Point + { + return this._offset; + } + + public get relativeDepth(): number + { + return this._relativeDepth; + } + + public get color(): number + { + return this._color; + } + + public set color(k: number) + { + this._color = k; + } + + public get type(): number + { + return this._type; + } + + public get leftSide(): IVector3D + { + return this._leftSide; + } + + public get rightSide(): IVector3D + { + return this._rightSide; + } + + public get location(): IVector3D + { + return this._location; + } + + public get normal(): IVector3D + { + return this._normal; + } + + public set id(k: string) + { + if(k === this._id) return; + + this._id = k; + } + + public set maskManager(k: PlaneMaskManager) + { + this._maskManager = k; + } + + public get uniqueId(): number + { + return this._uniqueId; + } + + public get planeTexture(): Texture + { + return this._planeTexture; + } + + public set hasTexture(flag: boolean) + { + this._hasTexture = flag; + } +} diff --git a/packages/room/src/object/visualization/room/RoomPlaneBitmapMask.ts b/packages/room/src/object/visualization/room/RoomPlaneBitmapMask.ts new file mode 100644 index 0000000..44f583c --- /dev/null +++ b/packages/room/src/object/visualization/room/RoomPlaneBitmapMask.ts @@ -0,0 +1,28 @@ +export class RoomPlaneBitmapMask +{ + private _type: string; + private _leftSideLoc: number; + private _rightSideLoc: number; + + constructor(maskType: string, leftSideLoc: number, rightSideLoc: number) + { + this._type = maskType; + this._leftSideLoc = leftSideLoc; + this._rightSideLoc = rightSideLoc; + } + + public get type(): string + { + return this._type; + } + + public get leftSideLoc(): number + { + return this._leftSideLoc; + } + + public get rightSideLoc(): number + { + return this._rightSideLoc; + } +} diff --git a/packages/room/src/object/visualization/room/RoomPlaneRectangleMask.ts b/packages/room/src/object/visualization/room/RoomPlaneRectangleMask.ts new file mode 100644 index 0000000..807dc20 --- /dev/null +++ b/packages/room/src/object/visualization/room/RoomPlaneRectangleMask.ts @@ -0,0 +1,35 @@ +export class RoomPlaneRectangleMask +{ + private _leftSideLoc: number; + private _rightSideLoc: number; + private _leftSideLength: number; + private _rightSideLength: number; + + constructor(k: number, _arg_2: number, _arg_3: number, _arg_4: number) + { + this._leftSideLoc = k; + this._rightSideLoc = _arg_2; + this._leftSideLength = _arg_3; + this._rightSideLength = _arg_4; + } + + public get leftSideLoc(): number + { + return this._leftSideLoc; + } + + public get rightSideLoc(): number + { + return this._rightSideLoc; + } + + public get leftSideLength(): number + { + return this._leftSideLength; + } + + public get rightSideLength(): number + { + return this._rightSideLength; + } +} diff --git a/packages/room/src/object/visualization/room/RoomVisualization.ts b/packages/room/src/object/visualization/room/RoomVisualization.ts new file mode 100644 index 0000000..883fe5d --- /dev/null +++ b/packages/room/src/object/visualization/room/RoomVisualization.ts @@ -0,0 +1,812 @@ +import { ToInt32, Vector3d } from '@nitrots/utils'; +import { Rectangle, Texture } from 'pixi.js'; +import { AlphaTolerance, IObjectVisualizationData, IPlaneVisualization, IRoomGeometry, IRoomObjectModel, IRoomObjectSprite, IRoomPlane, RoomObjectSpriteType, RoomObjectVariable } from '../../../../../api'; +import { RoomMapData } from '../../RoomMapData'; +import { RoomMapMaskData } from '../../RoomMapMaskData'; +import { RoomPlaneBitmapMaskData } from '../../RoomPlaneBitmapMaskData'; +import { RoomPlaneBitmapMaskParser } from '../../RoomPlaneBitmapMaskParser'; +import { RoomPlaneData } from '../../RoomPlaneData'; +import { RoomPlaneParser } from '../../RoomPlaneParser'; +import { RoomObjectSpriteVisualization } from '../RoomObjectSpriteVisualization'; +import { RoomPlane } from './RoomPlane'; +import { RoomVisualizationData } from './RoomVisualizationData'; + +export class RoomVisualization extends RoomObjectSpriteVisualization implements IPlaneVisualization +{ + public static FLOOR_COLOR: number = 0xFFFFFF; + public static FLOOR_COLOR_LEFT: number = 0xDDDDDD; + public static FLOOR_COLOR_RIGHT: number = 0xBBBBBB; + private static WALL_COLOR_TOP: number = 0xFFFFFF; + private static WALL_COLOR_SIDE: number = 0xCCCCCC; + private static WALL_COLOR_BOTTOM: number = 0x999999; + private static WALL_COLOR_BORDER: number = 0x999999; + public static LANDSCAPE_COLOR_TOP: number = 0xFFFFFF; + public static LANDSCAPE_COLOR_SIDE: number = 0xCCCCCC; + public static LANDSCAPE_COLOR_BOTTOM: number = 0x999999; + private static ROOM_DEPTH_OFFSET: number = 1000; + + protected _data: RoomVisualizationData = null; + + private _roomPlaneParser: RoomPlaneParser = new RoomPlaneParser(); + private _roomPlaneBitmapMaskParser: RoomPlaneBitmapMaskParser = new RoomPlaneBitmapMaskParser(); + private _geometryUpdateId: number = -1; + private _boundingRectangle: Rectangle = null; + private _directionX: number = 0; + private _directionY: number = 0; + private _directionZ: number = 0; + private _floorThickness: number = 1; + private _wallThickness: number = 1; + private _holeUpdateTime: number = NaN; + private _planes: RoomPlane[] = []; + private _visiblePlanes: RoomPlane[] = []; + private _visiblePlaneSpriteNumbers: number[] = []; + private _roomScale: number = 0; + private _colorBackgroundOnly: boolean = true; + private _color: number = 0xFFFFFF; + private _redColor: number = 0xFFFFFF; + private _greenColor: number = 0xFFFFFF; + private _blueColor: number = 0xFFFFFF; + private _wallType: string = null; + private _floorType: string = null; + private _landscapeType: string = null; + private _typeVisibility: boolean[] = []; + private _assetUpdateCounter: number = 0; + private _maskData: RoomMapMaskData = null; + private _isPlaneSet: boolean = false; + + constructor() + { + super(); + + this._typeVisibility[RoomPlane.TYPE_UNDEFINED] = false; + this._typeVisibility[RoomPlane.TYPE_FLOOR] = true; + this._typeVisibility[RoomPlane.TYPE_WALL] = true; + this._typeVisibility[RoomPlane.TYPE_LANDSCAPE] = true; + } + + public initialize(data: IObjectVisualizationData): boolean + { + if(!(data instanceof RoomVisualizationData)) return false; + + this._data = data; + + super.initialize(data); + + this._data.setGraphicAssetCollection(this.asset); + + return true; + } + + public dispose(): void + { + super.dispose(); + + this.clearPlanes(); + + this._planes = null; + this._visiblePlanes = null; + this._visiblePlaneSpriteNumbers = null; + + if(this._roomPlaneParser) + { + this._roomPlaneParser.dispose(); + + this._roomPlaneParser = null; + } + + if(this._roomPlaneBitmapMaskParser) + { + this._roomPlaneBitmapMaskParser.dispose(); + + this._roomPlaneBitmapMaskParser = null; + } + + + if(this._data) + { + this._data.clearCache(); + + this._data = null; + } + } + + protected reset(): void + { + super.reset(); + + this._floorType = null; + this._wallType = null; + this._landscapeType = null; + this._maskData = null; + this._geometryUpdateId = -1; + this._roomScale = 0; + } + + public update(geometry: IRoomGeometry, time: number, update: boolean, skipUpdate: boolean): void + { + if(!this.object || !geometry) return; + + const geometryUpdate = this.updateGeometry(geometry); + const objectModel = this.object.model; + + let needsUpdate = geometryUpdate; + + if(this.updateThickness(objectModel)) needsUpdate = true; + + if(this.updateHole(objectModel)) needsUpdate = true; + + this.initializeRoomPlanes(); + + if(this.updateMasks(objectModel)) needsUpdate = true; + + if(this.updatePlaneTexturesAndVisibilities(objectModel)) needsUpdate = true; + + if(this.updatePlanes(geometry, geometryUpdate, time, needsUpdate)) needsUpdate = true; + + if(needsUpdate) + { + let index = 0; + + while(index < this._visiblePlanes.length) + { + const spriteIndex = this._visiblePlaneSpriteNumbers[index]; + const sprite = this.getSprite(spriteIndex); + const plane = this._visiblePlanes[index]; + + if(sprite && plane && (plane.type !== RoomPlane.TYPE_LANDSCAPE)) + { + if(this._colorBackgroundOnly) + { + let _local_14 = plane.color; + + const _local_15 = (((_local_14 & 0xFF) * this._redColor) / 0xFF); + const _local_16 = ((((_local_14 >> 8) & 0xFF) * this._greenColor) / 0xFF); + const _local_17 = ((((_local_14 >> 16) & 0xFF) * this._blueColor) / 0xFF); + const _local_18 = (_local_14 >> 24); + + _local_14 = ((((_local_18 << 24) + (_local_17 << 16)) + (_local_16 << 8)) + _local_15); + + sprite.color = _local_14; + } + else + { + sprite.color = plane.color; + } + } + + index++; + } + } + + this.updateSpriteCounter++; + + this.updateModelCounter = objectModel.updateCounter; + } + + private updateGeometry(k: IRoomGeometry): boolean + { + if(!k) return false; + + if(this._geometryUpdateId === k.updateId) return false; + + this._geometryUpdateId = k.updateId; + this._boundingRectangle = null; + + const direction = k.direction; + + if(direction && ((direction.x !== this._directionX) || (direction.y !== this._directionY) || (direction.z !== this._directionZ) || (k.scale !== this._roomScale))) + { + this._directionX = direction.x; + this._directionY = direction.y; + this._directionZ = direction.z; + this._roomScale = k.scale; + + return true; + } + + return false; + } + + private updateThickness(k: IRoomObjectModel): boolean + { + if(this.updateModelCounter === k.updateCounter) return false; + + const floorThickness = k.getValue(RoomObjectVariable.ROOM_FLOOR_THICKNESS); + const wallThickness = k.getValue(RoomObjectVariable.ROOM_WALL_THICKNESS); + + if((!isNaN(floorThickness) && !isNaN(wallThickness)) && ((floorThickness !== this._floorThickness) || (wallThickness !== this._wallThickness))) + { + this._floorThickness = floorThickness; + this._wallThickness = wallThickness; + + this.clearPlanes(); + + return true; + } + + return false; + } + + private updateHole(k: IRoomObjectModel): boolean + { + if(this.updateModelCounter === k.updateCounter) return false; + + const holeUpdate = k.getValue(RoomObjectVariable.ROOM_FLOOR_HOLE_UPDATE_TIME); + + if(!isNaN(holeUpdate) && (holeUpdate !== this._holeUpdateTime)) + { + this._holeUpdateTime = holeUpdate; + + this.clearPlanes(); + + return true; + } + + return false; + } + + private updatePlaneTexturesAndVisibilities(model: IRoomObjectModel): boolean + { + if(this.updateModelCounter === model.updateCounter) return false; + + const floorType = model.getValue(RoomObjectVariable.ROOM_FLOOR_TYPE); + const wallType = model.getValue(RoomObjectVariable.ROOM_WALL_TYPE); + const landscapeType = model.getValue(RoomObjectVariable.ROOM_LANDSCAPE_TYPE); + + const floorVisibility = (model.getValue(RoomObjectVariable.ROOM_FLOOR_VISIBILITY) === 1); + const wallVisibility = (model.getValue(RoomObjectVariable.ROOM_WALL_VISIBILITY) === 1); + const landscapeVisibility = (model.getValue(RoomObjectVariable.ROOM_LANDSCAPE_VISIBILITY) === 1); + + let result = false; + + result = this.updatePlaneTypes(floorType, wallType, landscapeType); + + result = this.updatePlaneVisibility(floorVisibility, wallVisibility, landscapeVisibility) ? true : result; + + return result; + } + + private updateMasks(model: IRoomObjectModel): boolean + { + if(this.updateModelCounter === model.updateCounter) return false; + + let didUpdate = false; + + const planeMask = model.getValue(RoomObjectVariable.ROOM_PLANE_MASK_XML); + + if(planeMask !== this._maskData) + { + this.updatePlaneMasks(planeMask); + + this._maskData = planeMask; + + didUpdate = true; + } + + const backgroundColor = model.getValue(RoomObjectVariable.ROOM_BACKGROUND_COLOR); + + if(backgroundColor !== this._color) + { + this._color = backgroundColor; + this._redColor = (this._color & 0xFF); + this._greenColor = ((this._color >> 8) & 0xFF); + this._blueColor = ((this._color >> 16) & 0xFF); + + didUpdate = true; + } + + const backgroundOnly = (model.getValue(RoomObjectVariable.ROOM_COLORIZE_BG_ONLY) || false); + + if(backgroundOnly !== this._colorBackgroundOnly) + { + this._colorBackgroundOnly = backgroundOnly; + + didUpdate = true; + } + + return didUpdate; + } + + private clearPlanes(): void + { + if(this._planes) + { + while(this._planes.length) + { + const plane = this._planes[0]; + + if(plane) plane.dispose(); + + this._planes.shift(); + } + + this._planes = []; + } + + this._isPlaneSet = false; + this._assetUpdateCounter = (this._assetUpdateCounter + 1); + + this.reset(); + } + + protected initializeRoomPlanes(): void + { + if(!this.object || this._isPlaneSet) return; + + if(!isNaN(this._floorThickness)) this._roomPlaneParser.floorThicknessMultiplier = this._floorThickness; + if(!isNaN(this._wallThickness)) this._roomPlaneParser.wallThicknessMultiplier = this._wallThickness; + + const mapData = this.object.model.getValue(RoomObjectVariable.ROOM_MAP_DATA); + + if(!this._roomPlaneParser.initializeFromMapData(mapData)) return; + + const maxX = this.getLandscapeWidth(); + const maxY = this.getLandscapeHeight(); + + let landscapeOffsetX = 0; + let randomSeed = this.object.model.getValue(RoomObjectVariable.ROOM_RANDOM_SEED); + let index = 0; + + while(index < this._roomPlaneParser.planeCount) + { + const location = this._roomPlaneParser.getPlaneLocation(index); + const leftSide = this._roomPlaneParser.getPlaneLeftSide(index); + const rightSide = this._roomPlaneParser.getPlaneRightSide(index); + const secondaryNormals = this._roomPlaneParser.getPlaneSecondaryNormals(index); + const planeType = this._roomPlaneParser.getPlaneType(index); + + let plane: RoomPlane = null; + + if(location && leftSide && rightSide) + { + const _local_14 = Vector3d.crossProduct(leftSide, rightSide); + + randomSeed = ToInt32(Math.trunc((randomSeed * 7613) + 517) >>> 0); + plane = null; + + if(planeType === RoomPlaneData.PLANE_FLOOR) + { + const _local_15 = ((location.x + leftSide.x) + 0.5); + const _local_16 = ((location.y + rightSide.y) + 0.5); + const textureOffsetX = (Math.trunc(_local_15) - _local_15); + const textureOffsetY = (Math.trunc(_local_16) - _local_16); + + plane = new RoomPlane(this.object.getLocation(), location, leftSide, rightSide, RoomPlane.TYPE_FLOOR, true, secondaryNormals, randomSeed, -(textureOffsetX), -(textureOffsetY)); + + plane.color = (_local_14.z !== 0) ? RoomVisualization.FLOOR_COLOR : ((_local_14.x !== 0) ? RoomVisualization.FLOOR_COLOR_RIGHT : RoomVisualization.FLOOR_COLOR_LEFT); + } + + else if(planeType === RoomPlaneData.PLANE_WALL) + { + plane = new RoomPlane(this.object.getLocation(), location, leftSide, rightSide, RoomPlane.TYPE_WALL, true, secondaryNormals, randomSeed); + + if((leftSide.length < 1) || (rightSide.length < 1)) plane.hasTexture = false; + + plane.color = ((_local_14.x === 0) && (_local_14.y === 0)) ? RoomVisualization.WALL_COLOR_BORDER : ((_local_14.y > 0) ? RoomVisualization.WALL_COLOR_TOP : ((_local_14.y === 0) ? RoomVisualization.WALL_COLOR_SIDE : RoomVisualization.WALL_COLOR_BOTTOM)); + } + + else if(planeType === RoomPlaneData.PLANE_LANDSCAPE) + { + plane = new RoomPlane(this.object.getLocation(), location, leftSide, rightSide, RoomPlane.TYPE_LANDSCAPE, true, secondaryNormals, randomSeed, landscapeOffsetX, 0, maxX, maxY); + + if((leftSide.length < 1) || (rightSide.length < 1)) plane.hasTexture = false; + + plane.color = (_local_14.y > 0) ? RoomVisualization.LANDSCAPE_COLOR_TOP : (_local_14.y === 0) ? RoomVisualization.LANDSCAPE_COLOR_SIDE : RoomVisualization.LANDSCAPE_COLOR_BOTTOM; + + landscapeOffsetX = (landscapeOffsetX + leftSide.length); + } + + if(plane) + { + plane.maskManager = this._data.maskManager; + + let i = 0; + + while(i < this._roomPlaneParser.getPlaneMaskCount(index)) + { + const _local_20 = this._roomPlaneParser.getPlaneMaskLeftSideLoc(index, i); + const _local_21 = this._roomPlaneParser.getPlaneMaskRightSideLoc(index, i); + const _local_22 = this._roomPlaneParser.getPlaneMaskLeftSideLength(index, i); + const _local_23 = this._roomPlaneParser.getPlaneMaskRightSideLength(index, i); + + plane.addRectangleMask(_local_20, _local_21, _local_22, _local_23); + + i++; + } + + this._planes.push(plane); + } + } + else + { + return; + } + + index++; + } + + this._isPlaneSet = true; + this.defineSprites(); + } + + protected defineSprites(): void + { + this.createSprites(this._planes.length); + + let planeIndex = 0; + + while(planeIndex < this._planes.length) + { + const plane = this._planes[planeIndex]; + const sprite = this.getSprite(planeIndex); + + if(plane && sprite && plane.leftSide && plane.rightSide) + { + if((plane.type === RoomPlane.TYPE_WALL) && ((plane.leftSide.length < 1) || (plane.rightSide.length < 1))) + { + sprite.alphaTolerance = AlphaTolerance.MATCH_NOTHING; + } + else + { + sprite.alphaTolerance = AlphaTolerance.MATCH_OPAQUE_PIXELS; + } + + if(plane.type === RoomPlane.TYPE_WALL) + { + sprite.tag = 'plane.wall@' + (planeIndex + 1); + } + + else if(plane.type === RoomPlane.TYPE_FLOOR) + { + sprite.tag = 'plane.floor@' + (planeIndex + 1); + } + + else + { + sprite.tag = 'plane@' + (planeIndex + 1); + } + + sprite.spriteType = RoomObjectSpriteType.ROOM_PLANE; + } + + planeIndex++; + } + } + + private getLandscapeWidth(): number + { + let length = 0; + let index = 0; + + while(index < this._roomPlaneParser.planeCount) + { + const type = this._roomPlaneParser.getPlaneType(index); + + if(type === RoomPlaneData.PLANE_LANDSCAPE) + { + const vector = this._roomPlaneParser.getPlaneLeftSide(index); + + length += vector.length; + } + + index++; + } + + return length; + } + + private getLandscapeHeight(): number + { + let length = 0; + let index = 0; + + while(index < this._roomPlaneParser.planeCount) + { + const type = this._roomPlaneParser.getPlaneType(index); + + if(type === RoomPlaneData.PLANE_LANDSCAPE) + { + const vector = this._roomPlaneParser.getPlaneRightSide(index); + + if(vector.length > length) length = vector.length; + } + + index++; + } + + if(length > 5) length = 5; + + return length; + } + + protected updatePlaneTypes(floorType: string, wallType: string, landscapeType: string): boolean + { + if(floorType !== this._floorType) this._floorType = floorType; + else floorType = null; + + if(wallType !== this._wallType) this._wallType = wallType; + else wallType = null; + + if(landscapeType !== this._landscapeType) this._landscapeType = landscapeType; + else landscapeType = null; + + if(!floorType && !wallType && !landscapeType) return false; + + let index = 0; + + while(index < this._planes.length) + { + const plane = this._planes[index]; + + if(plane) + { + if((plane.type === RoomPlane.TYPE_FLOOR) && floorType) + { + plane.id = floorType; + } + + else if((plane.type === RoomPlane.TYPE_WALL) && wallType) + { + plane.id = wallType; + } + + else if((plane.type === RoomPlane.TYPE_LANDSCAPE) && landscapeType) + { + plane.id = landscapeType; + } + } + + index++; + } + + return true; + } + + private updatePlaneVisibility(floorVisibility: boolean, wallVisibility: boolean, landscapeVisibility: boolean): boolean + { + if((floorVisibility === this._typeVisibility[RoomPlane.TYPE_FLOOR]) && (wallVisibility === this._typeVisibility[RoomPlane.TYPE_WALL]) && (landscapeVisibility === this._typeVisibility[RoomPlane.TYPE_LANDSCAPE])) return false; + + this._typeVisibility[RoomPlane.TYPE_FLOOR] = floorVisibility; + this._typeVisibility[RoomPlane.TYPE_WALL] = wallVisibility; + this._typeVisibility[RoomPlane.TYPE_LANDSCAPE] = landscapeVisibility; + + this._visiblePlanes = []; + this._visiblePlaneSpriteNumbers = []; + + return true; + } + + protected updatePlanes(geometry: IRoomGeometry, geometryUpdate: boolean, timeSinceStartMs: number, needsUpdate: boolean = false): boolean + { + if(!geometry || !this.object) return false; + + this._assetUpdateCounter++; + + if(geometryUpdate) + { + this._visiblePlanes = []; + this._visiblePlaneSpriteNumbers = []; + } + + const hasVisiblePlanes = (this._visiblePlanes.length > 0); + + let visiblePlanes = this._visiblePlanes; + + if(!this._visiblePlanes.length) visiblePlanes = this._planes; + + let depth = 0; + let updated = false; + let index = 0; + + while(index < visiblePlanes.length) + { + let id = index; + + if(hasVisiblePlanes) id = this._visiblePlaneSpriteNumbers[index]; + + const sprite = this.getSprite(id); + + if(sprite) + { + const plane = visiblePlanes[index]; + + if(plane) + { + sprite.id = plane.uniqueId; + + if(plane.update(geometry, timeSinceStartMs, needsUpdate)) + { + if(plane.visible) + { + depth = ((plane.relativeDepth + this.floorRelativeDepth) + (id / 1000)); + + if(plane.type !== RoomPlane.TYPE_FLOOR) + { + depth = ((plane.relativeDepth + this.wallRelativeDepth) + (id / 1000)); + + if((plane.leftSide.length < 1) || (plane.rightSide.length < 1)) + { + depth = (depth + (RoomVisualization.ROOM_DEPTH_OFFSET * 0.5)); + } + } + + this.updateSprite(sprite, geometry, plane, `plane ${ id } ${ geometry.scale }`, depth); + } + + updated = true; + } + + if(sprite.visible != ((plane.visible) && (this._typeVisibility[plane.type]))) + { + sprite.visible = (!(sprite.visible)); + updated = true; + } + + if(sprite.visible) + { + if(!hasVisiblePlanes) + { + this._visiblePlanes.push(plane); + this._visiblePlaneSpriteNumbers.push(index); + } + } + } + else + { + sprite.id = 0; + + if(sprite.visible) + { + sprite.visible = false; + updated = true; + } + } + } + + index++; + } + + return updated; + } + + protected updatePlaneMasks(maskData: RoomMapMaskData): void + { + if(!maskData) return; + + this._roomPlaneBitmapMaskParser.initialize(maskData); + + const _local_4: number[] = []; + const _local_5: number[] = []; + + let _local_6 = false; + let index = 0; + + while(index < this._planes.length) + { + const plane = this._planes[index]; + + if(plane) + { + plane.resetBitmapMasks(); + + if(plane.type === RoomPlane.TYPE_LANDSCAPE) _local_4.push(index); + } + + index++; + } + + for(const mask of this._roomPlaneBitmapMaskParser.masks.values()) + { + const maskType = this._roomPlaneBitmapMaskParser.getMaskType(mask); + const maskLocation = this._roomPlaneBitmapMaskParser.getMaskLocation(mask); + const maskCategory = this._roomPlaneBitmapMaskParser.getMaskCategory(mask); + + if(maskLocation) + { + let i = 0; + + while(i < this._planes.length) + { + const plane = this._planes[i]; + + if((plane.type === RoomPlane.TYPE_WALL) || (plane.type === RoomPlane.TYPE_LANDSCAPE)) + { + if(plane && plane.location && plane.normal) + { + const _local_14 = Vector3d.dif(maskLocation, plane.location); + const _local_15 = Math.abs(Vector3d.scalarProjection(_local_14, plane.normal)); + + if(_local_15 < 0.01) + { + if(plane.leftSide && plane.rightSide) + { + const leftSideLoc = Vector3d.scalarProjection(_local_14, plane.leftSide); + const rightSideLoc = Vector3d.scalarProjection(_local_14, plane.rightSide); + + if((plane.type === RoomPlane.TYPE_WALL) || ((plane.type === RoomPlane.TYPE_LANDSCAPE) && (maskCategory === RoomPlaneBitmapMaskData.HOLE))) + { + plane.addBitmapMask(maskType, leftSideLoc, rightSideLoc); + } + else + { + if(plane.type === RoomPlane.TYPE_LANDSCAPE) + { + if(!plane.canBeVisible) _local_6 = true; + + plane.canBeVisible = true; + + _local_5.push(i); + } + } + } + } + } + } + + i++; + } + } + } + + index = 0; + + while(index < _local_4.length) + { + const planeIndex = _local_4[index]; + + if(_local_5.indexOf(planeIndex) < 0) + { + const plane = this._planes[planeIndex]; + + plane.canBeVisible = false; + _local_6 = true; + } + + index++; + } + + if(_local_6) + { + this._visiblePlanes = []; + this._visiblePlaneSpriteNumbers = []; + } + } + + private updateSprite(sprite: IRoomObjectSprite, geometry: IRoomGeometry, plane: RoomPlane, _arg_3: string, relativeDepth: number): void + { + const offset = plane.offset; + + sprite.offsetX = -(offset.x); + sprite.offsetY = -(offset.y); + sprite.relativeDepth = relativeDepth; + sprite.color = plane.color; + sprite.texture = plane.planeTexture ?? Texture.EMPTY; + sprite.name = ((_arg_3 + '_') + this._assetUpdateCounter); + } + + public getBoundingRectangle(): Rectangle + { + if(!this._boundingRectangle) this._boundingRectangle = super.getBoundingRectangle(); + + return new Rectangle(this._boundingRectangle.x, this._boundingRectangle.y, this._boundingRectangle.width, this._boundingRectangle.height); + } + + public get planes(): IRoomPlane[] + { + const planes: IRoomPlane[] = []; + + for(const plane of this._visiblePlanes) planes.push(plane); + + return planes; + } + + public get floorRelativeDepth(): number + { + return RoomVisualization.ROOM_DEPTH_OFFSET + 0.1; + } + + public get wallRelativeDepth(): number + { + return RoomVisualization.ROOM_DEPTH_OFFSET + 0.5; + } +} diff --git a/packages/room/src/object/visualization/room/RoomVisualizationData.ts b/packages/room/src/object/visualization/room/RoomVisualizationData.ts new file mode 100644 index 0000000..9059d98 --- /dev/null +++ b/packages/room/src/object/visualization/room/RoomVisualizationData.ts @@ -0,0 +1,47 @@ +import { IAssetData, IGraphicAssetCollection, IObjectVisualizationData } from '@nitrots/api'; +import { PlaneMaskManager } from './mask'; + +export class RoomVisualizationData implements IObjectVisualizationData +{ + private _maskManager: PlaneMaskManager = new PlaneMaskManager(); + private _initialized: boolean = false; + + public initialize(asset: IAssetData): boolean + { + if(!asset.roomVisualization) return false; + + const maskData = asset.roomVisualization.maskData; + + if(maskData) this._maskManager.initialize(maskData); + + return true; + } + + public dispose(): void + { + if(this._maskManager) + { + this._maskManager.dispose(); + + this._maskManager = null; + } + } + + public setGraphicAssetCollection(collection: IGraphicAssetCollection): void + { + if(this._initialized) return; + + this._maskManager.initializeAssetCollection(collection); + + this._initialized = true; + } + + public clearCache(): void + { + } + + public get maskManager(): PlaneMaskManager + { + return this._maskManager; + } +} diff --git a/packages/room/src/object/visualization/room/TileCursorVisualization.ts b/packages/room/src/object/visualization/room/TileCursorVisualization.ts new file mode 100644 index 0000000..ffc217f --- /dev/null +++ b/packages/room/src/object/visualization/room/TileCursorVisualization.ts @@ -0,0 +1,26 @@ +import { RoomObjectVariable } from '@nitrots/api'; +import { FurnitureAnimatedVisualization } from '../furniture'; + +export class TileCursorVisualization extends FurnitureAnimatedVisualization +{ + private _tileHeight: number; + + constructor() + { + super(); + + this._tileHeight = 0; + } + + protected getLayerYOffset(scale: number, direction: number, layerId: number): number + { + if(layerId === 1) + { + this._tileHeight = this.object.model.getValue(RoomObjectVariable.TILE_CURSOR_HEIGHT); + + return -(this._tileHeight) * 32; // 32 = scale / 2 + } + + return super.getLayerYOffset(scale, direction, layerId); + } +} diff --git a/packages/room/src/object/visualization/room/index.ts b/packages/room/src/object/visualization/room/index.ts new file mode 100644 index 0000000..37a12a9 --- /dev/null +++ b/packages/room/src/object/visualization/room/index.ts @@ -0,0 +1,9 @@ +export * from './PlaneDrawingData'; +export * from './RoomPlane'; +export * from './RoomPlaneBitmapMask'; +export * from './RoomPlaneRectangleMask'; +export * from './RoomVisualization'; +export * from './RoomVisualizationData'; +export * from './TileCursorVisualization'; +export * from './mask'; +export * from './utils'; diff --git a/packages/room/src/object/visualization/room/mask/PlaneMask.ts b/packages/room/src/object/visualization/room/mask/PlaneMask.ts new file mode 100644 index 0000000..b01381c --- /dev/null +++ b/packages/room/src/object/visualization/room/mask/PlaneMask.ts @@ -0,0 +1,119 @@ +import { IGraphicAsset, IVector3D } from '@nitrots/api'; +import { PlaneMaskVisualization } from './PlaneMaskVisualization'; + +export class PlaneMask +{ + private _maskVisualizations: Map; + private _sizes: number[]; + private _assetNames: Map; + private _lastMaskVisualization: PlaneMaskVisualization; + private _lastSize: number; + + constructor() + { + this._sizes = []; + this._maskVisualizations = new Map(); + this._assetNames = new Map(); + this._lastMaskVisualization = null; + this._lastSize = -1; + } + + public dispose(): void + { + if(this._maskVisualizations) + { + for(const mask of this._maskVisualizations.values()) + { + if(!mask) continue; + + mask.dispose(); + } + + this._maskVisualizations = null; + } + + this._lastMaskVisualization = null; + this._sizes = null; + } + + public createMaskVisualization(size: number): PlaneMaskVisualization + { + const existing = this._maskVisualizations.get(size); + + if(existing) return null; + + const visualization = new PlaneMaskVisualization(); + + this._maskVisualizations.set(size, visualization); + + this._sizes.push(size); + this._sizes.sort(); + + return visualization; + } + + private getSizeIndex(k: number): number + { + let sizeIndex = 0; + let index = 1; + + while(index < this._sizes.length) + { + if(this._sizes[index] > k) + { + if((this._sizes[index] - k) < (k - this._sizes[(index - 1)])) sizeIndex = index; + + break; + } + + sizeIndex = index; + + index++; + } + + return sizeIndex; + } + + protected getMaskVisualization(k: number): PlaneMaskVisualization + { + if(k === this._lastSize) return this._lastMaskVisualization; + + const sizeIndex = this.getSizeIndex(k); + + if(sizeIndex < this._sizes.length) + { + this._lastMaskVisualization = (this._maskVisualizations.get(this._sizes[sizeIndex])); + } + else + { + this._lastMaskVisualization = null; + } + + this._lastSize = k; + + return this._lastMaskVisualization; + } + + public getGraphicAsset(k: number, _arg_2: IVector3D): IGraphicAsset + { + const visualization = this.getMaskVisualization(k); + + if(!visualization) return null; + + return visualization.getAsset(_arg_2); + } + + public getAssetName(k: number): string + { + if(!this._assetNames) return null; + + return this._assetNames.get(k) || null; + } + + public setAssetName(k: number, _arg_2: string): void + { + if(!this._assetNames) return; + + this._assetNames.set(k, _arg_2); + } +} diff --git a/packages/room/src/object/visualization/room/mask/PlaneMaskBitmap.ts b/packages/room/src/object/visualization/room/mask/PlaneMaskBitmap.ts new file mode 100644 index 0000000..c02022a --- /dev/null +++ b/packages/room/src/object/visualization/room/mask/PlaneMaskBitmap.ts @@ -0,0 +1,52 @@ +import { IGraphicAsset } from '@nitrots/api'; + +export class PlaneMaskBitmap +{ + public static MIN_NORMAL_COORDINATE_VALUE: number = -1; + public static MAX_NORMAL_COORDINATE_VALUE: number = 1; + + private _asset: IGraphicAsset; + private _normalMinX: number; + private _normalMaxX: number; + private _normalMinY: number; + private _normalMaxY: number; + + constructor(k: IGraphicAsset, _arg_2: number = -1, _arg_3: number = 1, _arg_4: number = -1, _arg_5: number = 1) + { + this._normalMinX = _arg_2; + this._normalMaxX = _arg_3; + this._normalMinY = _arg_4; + this._normalMaxY = _arg_5; + this._asset = k; + } + + public get asset(): IGraphicAsset + { + return this._asset; + } + + public get normalMinX(): number + { + return this._normalMinX; + } + + public get normalMaxX(): number + { + return this._normalMaxX; + } + + public get normalMinY(): number + { + return this._normalMinY; + } + + public get normalMaxY(): number + { + return this._normalMaxY; + } + + public dispose(): void + { + this._asset = null; + } +} diff --git a/packages/room/src/object/visualization/room/mask/PlaneMaskManager.ts b/packages/room/src/object/visualization/room/mask/PlaneMaskManager.ts new file mode 100644 index 0000000..53f3c71 --- /dev/null +++ b/packages/room/src/object/visualization/room/mask/PlaneMaskManager.ts @@ -0,0 +1,257 @@ +import { IAssetPlaneMaskData, IAssetPlaneTextureBitmap, IGraphicAssetCollection, IVector3D } from '@nitrots/api'; +import { GetRenderer } from '@nitrots/utils'; +import { Container, Matrix, Point, Sprite, Texture } from 'pixi.js'; +import { PlaneMask } from './PlaneMask'; +import { PlaneMaskVisualization } from './PlaneMaskVisualization'; + +export class PlaneMaskManager +{ + private _assetCollection: IGraphicAssetCollection; + private _masks: Map; + private _data: IAssetPlaneMaskData; + + constructor() + { + this._assetCollection = null; + this._masks = new Map(); + this._data = null; + } + + public get data(): IAssetPlaneMaskData + { + return this._data; + } + + public dispose(): void + { + this._assetCollection = null; + this._data = null; + + if(this._masks && this._masks.size) + { + for(const mask of this._masks.values()) + { + if(!mask) continue; + + mask.dispose(); + } + + this._masks.clear(); + } + } + + public initialize(k: IAssetPlaneMaskData): void + { + this._data = k; + } + + public initializeAssetCollection(k: IGraphicAssetCollection): void + { + if(!this.data) return; + + this._assetCollection = k; + + this.parseMasks(this.data, k); + } + + private parseMasks(maskData: IAssetPlaneMaskData, _arg_2: IGraphicAssetCollection): void + { + if(!maskData || !_arg_2) return; + + if(maskData.masks && maskData.masks.length) + { + let index = 0; + + while(index < maskData.masks.length) + { + const mask = maskData.masks[index]; + + if(mask) + { + const id = mask.id; + const existing = this._masks.get(id); + + if(existing) continue; + + const newMask = new PlaneMask(); + + if(mask.visualizations && mask.visualizations.length) + { + let visualIndex = 0; + + while(visualIndex < mask.visualizations.length) + { + const visualization = mask.visualizations[visualIndex]; + + if(visualization) + { + const size = visualization.size; + const maskVisualization = newMask.createMaskVisualization(size); + + if(maskVisualization) + { + const assetName = this.parseMaskBitmaps(visualization.bitmaps, maskVisualization, _arg_2); + + newMask.setAssetName(size, assetName); + } + } + + visualIndex++; + } + } + + this._masks.set(id, newMask); + } + + index++; + } + } + } + + private parseMaskBitmaps(bitmaps: IAssetPlaneTextureBitmap[], maskVisualization: PlaneMaskVisualization, assetCollection: IGraphicAssetCollection): string + { + if(!bitmaps || !bitmaps.length) return null; + + let graphicName: string = null; + + for(const bitmap of bitmaps) + { + if(!bitmap) continue; + + const assetName = bitmap.assetName; + const asset = assetCollection.getAsset(assetName); + + if(!asset) continue; + + let normalMinX = PlaneMaskVisualization.MIN_NORMAL_COORDINATE_VALUE; + let normalMaxX = PlaneMaskVisualization.MAX_NORMAL_COORDINATE_VALUE; + let normalMinY = PlaneMaskVisualization.MIN_NORMAL_COORDINATE_VALUE; + let normalMaxY = PlaneMaskVisualization.MAX_NORMAL_COORDINATE_VALUE; + + if(bitmap.normalMinX !== undefined) normalMinX = bitmap.normalMinX; + if(bitmap.normalMaxX !== undefined) normalMaxX = bitmap.normalMaxX; + if(bitmap.normalMinY !== undefined) normalMinY = bitmap.normalMinY; + if(bitmap.normalMaxY !== undefined) normalMaxY = bitmap.normalMaxY; + + if(!asset.flipH) graphicName = assetName; + + maskVisualization.addBitmap(asset, normalMinX, normalMaxX, normalMinY, normalMaxY); + } + + return graphicName; + } + + public addMaskToContainer(container: Container, type: string, scale: number, normal: IVector3D, posX: number, posY: number): boolean + { + const mask = this._masks.get(type); + + if(!mask) return true; + + const asset = mask.getGraphicAsset(scale, normal); + + if(!asset) return true; + + const texture = asset.texture; + + if(!texture) return true; + + const point = new Point((posX + asset.offsetX), (posY + asset.offsetY)); + + const matrix = new Matrix(); + + let xScale = 1; + let ySkew = 1; + let xSkew = 0; + let yScale = 0; + let tx = (point.x + xSkew); + let ty = (point.y + yScale); + + if(asset.flipH) + { + xScale = -1; + xSkew = texture.width; + + tx = ((point.x + xSkew) - texture.width); + } + + if(asset.flipV) + { + ySkew = -1; + yScale = texture.height; + + ty = ((point.y + yScale) - texture.height); + } + + matrix.scale(xScale, ySkew); + matrix.translate(tx, ty); + + const sprite = new Sprite(texture); + + sprite.setFromMatrix(matrix); + + container.addChild(sprite); + + return true; + } + + public writeMaskToTexture(targetTexture: Texture, type: string, scale: number, normal: IVector3D, posX: number, posY: number): boolean + { + const mask = this._masks.get(type); + + if(!mask) return true; + + const asset = mask.getGraphicAsset(scale, normal); + + if(!asset) return true; + + const texture = asset.texture; + + if(!texture) return true; + + const point = new Point((posX + asset.offsetX), (posY + asset.offsetY)); + + const matrix = new Matrix(); + + let xScale = 1; + let ySkew = 1; + let xSkew = 0; + let yScale = 0; + let tx = (point.x + xSkew); + let ty = (point.y + yScale); + + if(asset.flipH) + { + xScale = -1; + xSkew = texture.width; + + tx = ((point.x + xSkew) - texture.width); + } + + if(asset.flipV) + { + ySkew = -1; + yScale = texture.height; + + ty = ((point.y + yScale) - texture.height); + } + + matrix.scale(xScale, ySkew); + matrix.translate(tx, ty); + + GetRenderer().render({ + target: targetTexture, + container: new Sprite(texture), + clear: false, + transform: matrix + }); + + return true; + } + + public getMask(k: string): PlaneMask + { + if(!this._masks || !this._masks.size) return null; + + return this._masks.get(k) || null; + } +} diff --git a/packages/room/src/object/visualization/room/mask/PlaneMaskVisualization.ts b/packages/room/src/object/visualization/room/mask/PlaneMaskVisualization.ts new file mode 100644 index 0000000..dcee40c --- /dev/null +++ b/packages/room/src/object/visualization/room/mask/PlaneMaskVisualization.ts @@ -0,0 +1,49 @@ +import { IGraphicAsset, IVector3D } from '@nitrots/api'; +import { PlaneMaskBitmap } from './PlaneMaskBitmap'; + +export class PlaneMaskVisualization +{ + public static MIN_NORMAL_COORDINATE_VALUE: number = -1; + public static MAX_NORMAL_COORDINATE_VALUE: number = 1; + + private _bitmaps: PlaneMaskBitmap[]; + + constructor() + { + this._bitmaps = []; + } + + public dispose(): void + { + for(const mask of this._bitmaps) + { + if(!mask) continue; + + mask.dispose(); + } + + this._bitmaps = null; + } + + public addBitmap(k: IGraphicAsset, _arg_2: number = -1, _arg_3: number = 1, _arg_4: number = -1, _arg_5: number = 1): void + { + this._bitmaps.push(new PlaneMaskBitmap(k, _arg_2, _arg_3, _arg_4, _arg_5)); + } + + public getAsset(k: IVector3D): IGraphicAsset + { + if(!k) return null; + + for(const mask of this._bitmaps) + { + if(!mask) continue; + + if((((k.x >= mask.normalMinX) && (k.x <= mask.normalMaxX)) && (k.y >= mask.normalMinY)) && (k.y <= mask.normalMaxY)) + { + return mask.asset; + } + } + + return null; + } +} diff --git a/packages/room/src/object/visualization/room/mask/index.ts b/packages/room/src/object/visualization/room/mask/index.ts new file mode 100644 index 0000000..51da625 --- /dev/null +++ b/packages/room/src/object/visualization/room/mask/index.ts @@ -0,0 +1,4 @@ +export * from './PlaneMask'; +export * from './PlaneMaskBitmap'; +export * from './PlaneMaskManager'; +export * from './PlaneMaskVisualization'; diff --git a/packages/room/src/object/visualization/room/utils/PlaneBitmapData.ts b/packages/room/src/object/visualization/room/utils/PlaneBitmapData.ts new file mode 100644 index 0000000..2c5319c --- /dev/null +++ b/packages/room/src/object/visualization/room/utils/PlaneBitmapData.ts @@ -0,0 +1,28 @@ +import { Texture } from 'pixi.js'; + +export class PlaneBitmapData +{ + private _texture: Texture; + private _timeStamp: number; + + constructor(texture: Texture, timestamp: number) + { + this._texture = texture; + this._timeStamp = timestamp; + } + + public dispose(): void + { + this._texture = null; + } + + public get texture(): Texture + { + return this._texture; + } + + public get timeStamp(): number + { + return this._timeStamp; + } +} diff --git a/packages/room/src/object/visualization/room/utils/Randomizer.ts b/packages/room/src/object/visualization/room/utils/Randomizer.ts new file mode 100644 index 0000000..7125a71 --- /dev/null +++ b/packages/room/src/object/visualization/room/utils/Randomizer.ts @@ -0,0 +1,128 @@ +import { ToInt32 } from '@nitrots/utils'; + +export class Randomizer +{ + public static DEFAULT_SEED: number = 1; + public static DEFAULT_MODULUS: number = 16777216; + + private static _randomizer:Randomizer = null; + + private _seed: number = 1; + private _modulus: number = 16777216; + private _multiplier: number = 69069; + private _increment: number = 5; + + public static setSeed(k: number = 1): void + { + if(!Randomizer._randomizer) Randomizer._randomizer = new Randomizer(); + + Randomizer._randomizer.seed = k; + } + + public static setModulus(k: number = 16777216): void + { + if(!Randomizer._randomizer) Randomizer._randomizer = new Randomizer(); + + Randomizer._randomizer.modulus = k; + } + + public static getValues(k: number, _arg_2: number, _arg_3: number): number[] + { + if(!Randomizer._randomizer) Randomizer._randomizer = new Randomizer(); + + return Randomizer._randomizer.getRandomValues(k, _arg_2, _arg_3); + } + + public static getArray(k: number, _arg_2: number): number[] + { + if(!Randomizer._randomizer) Randomizer._randomizer = new Randomizer(); + + return Randomizer._randomizer.getRandomArray(k, _arg_2); + } + + public set seed(k: number) + { + this._seed = k; + } + + public set modulus(k: number) + { + if(k < 1) k = 1; + + this._modulus = k; + } + + public dispose(): void + { + } + + public getRandomValues(k: number, _arg_2: number, _arg_3: number): number[] + { + const _local_4: number[] = []; + + let _local_5 = 0; + + while(_local_5 < k) + { + _local_4.push(this.iterateScaled(_arg_2, (_arg_3 - _arg_2))); + _local_5++; + } + + return _local_4; + } + + public getRandomArray(k: number, _arg_2: number): number[] + { + if(((k > _arg_2) || (_arg_2 > 1000))) return null; + + const _local_3: number[] = []; + + let _local_4 = 0; + + while(_local_4 <= _arg_2) + { + _local_3.push(_local_4); + _local_4++; + } + + const _local_5: number[] = []; + + let _local_6 = 0; + + while(_local_6 < k) + { + const _local_7 = this.iterateScaled(0, (_local_3.length - 1)); + + _local_5.push(_local_3[_local_7]); + _local_3.splice(_local_7, 1); + + _local_6++; + } + + return _local_5; + } + + private iterate(): number + { + let k: number = ToInt32(Math.trunc(this._multiplier * this._seed) + this._increment); + + if(k < 0) k = -(k); + + k = (k % this._modulus); + + this._seed = k; + + return k; + } + + private iterateScaled(k: number, _arg_2: number): number + { + let _local_3: number = this.iterate(); + + if(_arg_2 < 1) return k; + + _local_3 = Math.trunc(k + ((_local_3 / this._modulus) * _arg_2)); + + return _local_3; + } +} diff --git a/packages/room/src/object/visualization/room/utils/index.ts b/packages/room/src/object/visualization/room/utils/index.ts new file mode 100644 index 0000000..beb9718 --- /dev/null +++ b/packages/room/src/object/visualization/room/utils/index.ts @@ -0,0 +1,2 @@ +export * from './PlaneBitmapData'; +export * from './Randomizer'; diff --git a/packages/room/src/renderer/RoomRenderer.ts b/packages/room/src/renderer/RoomRenderer.ts new file mode 100644 index 0000000..dd6f0c4 --- /dev/null +++ b/packages/room/src/renderer/RoomRenderer.ts @@ -0,0 +1,160 @@ +import { IRoomObject, IRoomRenderer, IRoomRenderingCanvas, IRoomSpriteCanvasContainer } from '@nitrots/api'; +import { RoomSpriteCanvas } from './RoomSpriteCanvas'; + +export class RoomRenderer implements IRoomRenderer, IRoomSpriteCanvasContainer +{ + private _objects: Map = new Map(); + private _canvases: Map = new Map(); + + private _disposed: boolean = false; + private _roomObjectVariableAccurateZ: string = null; + + public dispose(): void + { + if(this._disposed) return; + + if(this._canvases) + { + for(const [key, canvas] of this._canvases.entries()) + { + this._canvases.delete(key); + + if(!canvas) continue; + + canvas.dispose(); + } + + this._canvases = null; + } + + if(this._objects) + { + this._objects = null; + } + + this._disposed = true; + } + + public reset(): void + { + this._objects.clear(); + } + + public getInstanceId(object: IRoomObject): number + { + if(!object) return -1; + + return object.instanceId; + } + + public getRoomObject(instanceId: number): IRoomObject + { + return this._objects.get(instanceId); + } + + public addObject(object: IRoomObject): void + { + if(!object) return; + + this._objects.set(this.getInstanceId(object), object); + } + + public removeObject(object: IRoomObject): void + { + const instanceId = this.getInstanceId(object); + + this._objects.delete(instanceId); + + for(const canvas of this._canvases.values()) + { + if(!canvas) continue; + + const spriteCanvas = canvas as RoomSpriteCanvas; + + spriteCanvas.removeFromCache(instanceId.toString()); + } + } + + public render(time: number, update: boolean = false): void + { + if(!this._canvases || !this._canvases.size) return; + + for(const canvas of this._canvases.values()) canvas && canvas.render(time, update); + } + + public update(time: number, update: boolean = false): void + { + if(!this._canvases || !this._canvases.size) return; + + this.render(time, update); + + for(const canvas of this._canvases.values()) canvas && canvas.update(); + } + + public getCanvas(id: number): IRoomRenderingCanvas + { + const existing = this._canvases.get(id); + + if(!existing) return null; + + return existing; + } + + public createCanvas(id: number, width: number, height: number, scale: number): IRoomRenderingCanvas + { + const existing = this._canvases.get(id) as IRoomRenderingCanvas; + + if(existing) + { + existing.initialize(width, height); + + if(existing.geometry) existing.geometry.scale = scale; + + return existing; + } + + const canvas = this.createSpriteCanvas(id, width, height, scale); + + if(!canvas) return; + + this._canvases.set(id, canvas); + + return canvas; + } + + private createSpriteCanvas(id: number, width: number, height: number, scale: number): IRoomRenderingCanvas + { + return new RoomSpriteCanvas(id, this, width, height, scale); + } + + public removeCanvas(id: number): void + { + const existing = this._canvases.get(id); + + if(!existing) return; + + this._canvases.delete(id); + + existing.dispose(); + } + + public get objects(): Map + { + return this._objects; + } + + public get disposed(): boolean + { + return this._disposed; + } + + public get roomObjectVariableAccurateZ(): string + { + return this._roomObjectVariableAccurateZ; + } + + public set roomObjectVariableAccurateZ(z: string) + { + this._roomObjectVariableAccurateZ = z; + } +} diff --git a/packages/room/src/renderer/RoomSpriteCanvas.ts b/packages/room/src/renderer/RoomSpriteCanvas.ts new file mode 100644 index 0000000..1fcab92 --- /dev/null +++ b/packages/room/src/renderer/RoomSpriteCanvas.ts @@ -0,0 +1,1180 @@ +import { IRoomCanvasMouseListener, IRoomGeometry, IRoomObject, IRoomObjectSprite, IRoomObjectSpriteVisualization, IRoomRenderingCanvas, IRoomSpriteCanvasContainer, IRoomSpriteMouseEvent, MouseEventType, RoomObjectSpriteData, RoomObjectSpriteType } from '@nitrots/api'; +import { GetConfiguration } from '@nitrots/configuration'; +import { RoomSpriteMouseEvent } from '@nitrots/events'; +import { GetTicker, TextureUtils, Vector3d } from '@nitrots/utils'; +import { Container, Matrix, Point, Rectangle, Sprite, Texture } from 'pixi.js'; +import { RoomEnterEffect, RoomGeometry, RoomRotatingEffect, RoomShakingEffect } from '../utils'; +import { RoomObjectCache, RoomObjectCacheItem } from './cache'; +import { ExtendedSprite, ObjectMouseData, SortableSprite } from './utils'; + +export class RoomSpriteCanvas implements IRoomRenderingCanvas +{ + private _geometry: RoomGeometry; + private _animationFPS: number; + private _renderTimestamp: number = 0; + private _totalTimeRunning: number = 0; + private _lastFrame: number = 0; + + private _master: Container = null; + private _display: Container = null; + private _mask: Sprite = null; + + private _sortableSprites: SortableSprite[] = []; + private _spriteCount: number = 0; + private _activeSpriteCount: number = 0; + private _spritePool: ExtendedSprite[] = []; + private _skipObjectUpdate: boolean = false; + private _runningSlow: boolean = false; + + private _width: number = 0; + private _height: number = 0; + private _renderedWidth: number = 0; + private _renderedHeight: number = 0; + private _screenOffsetX: number = 0; + private _screenOffsetY: number = 0; + private _mouseLocation: Point = new Point(); + private _mouseOldX: number = 0; + private _mouseOldY: number = 0; + private _mouseCheckCount: number = 0; + private _mouseSpriteWasHit: boolean = false; + private _mouseActiveObjects: Map = new Map(); + private _eventCache: Map = new Map(); + private _eventId: number = 0; + private _scale: number = 1; + + private _SafeStr_4507: boolean = false; + private _rotation: number = 0; + private _rotationOrigin: Vector3d = null; + private _rotationRodLength: number = 0; + private _effectDirection: Vector3d; + private _effectLocation: Vector3d; + private _SafeStr_795: number = 0; + + private _noSpriteVisibilityChecking: boolean = false; + private _usesExclusionRectangles: boolean = false; + private _usesMask: boolean = true; + private _canvasUpdated: boolean = false; + + private _objectCache: RoomObjectCache; + + private _mouseListener: IRoomCanvasMouseListener = null; + + constructor( + private _id: number, + private _container: IRoomSpriteCanvasContainer, + width: number, + height: number, + scale: number) + { + this._geometry = new RoomGeometry(scale, new Vector3d(-135, 30, 0), new Vector3d(11, 11, 5), new Vector3d(-135, 0.5, 0)); + this._animationFPS = GetConfiguration().getValue('system.fps.animation', 24); + this._objectCache = new RoomObjectCache(this._container.roomObjectVariableAccurateZ); + + this.setupCanvas(); + this.initialize(width, height); + } + + private setupCanvas(): void + { + if(!this._master) this._master = new Container(); + + this._master.cullableChildren = false; + + if(!this._display) + { + const display = new Container(); + + display.isRenderGroup = true; + + display.cullableChildren = false; + + display.interactive = false; + display.interactiveChildren = false; + + this._master.addChild(display); + + this._display = display; + } + } + + public dispose(): void + { + this.cleanSprites(0, true); + + if(this._geometry) + { + this._geometry.dispose(); + + this._geometry = null; + } + + if(this._mask) this._mask = null; + + if(this._objectCache) + { + this._objectCache.dispose(); + + this._objectCache = null; + } + + if(this._master) + { + while(this._master.children.length) + { + const child = this._master.removeChildAt(0); + + child.destroy(); + } + + if(this._master.parent) this._master.parent.removeChild(this._master); + + this._master.destroy(); + + this._master = null; + } + + this._display = null; + this._sortableSprites = []; + + if(this._mouseActiveObjects) + { + this._mouseActiveObjects.clear(); + + this._mouseActiveObjects = null; + } + + if(this._spritePool) + { + for(const sprite of this._spritePool) + { + this.cleanSprite(sprite, true); + } + + this._spritePool = []; + } + + if(this._eventCache) + { + this._eventCache.clear(); + + this._eventCache = null; + } + + this._mouseListener = null; + } + + public initialize(width: number, height: number): void + { + width = width < 1 ? 1 : width; + height = height < 1 ? 1 : height; + + if(this._usesMask) + { + if(!this._mask) + { + this._mask = new Sprite(Texture.WHITE); + + this._mask.tint = 0xFF0000; + this._mask.width = width; + this._mask.height = height; + + if(this._master) + { + this._master.addChild(this._mask); + + if(this._display) this._display.mask = this._mask; + } + } + else + { + this._mask.width = width; + this._mask.height = height; + } + } + + if(this._master) + { + if(this._master.filterArea) + { + const filterArea = this._master.filterArea; + + filterArea.width = width; + filterArea.height = height; + } + else + { + this._master.filterArea = new Rectangle(0, 0, width, height); + } + } + + this._width = width; + this._height = height; + } + + public setMask(flag: boolean): void + { + if(flag && !this._usesMask) + { + this._usesMask = true; + + if(this._mask && (this._mask.parent !== this._master)) + { + this._master.addChild(this._mask); + + this._display.mask = this._mask; + } + } + + else if(!flag && this._usesMask) + { + this._usesMask = false; + + if(this._mask && (this._mask.parent === this._master)) + { + this._master.removeChild(this._mask); + + this._display.mask = null; + } + } + } + + public setScale(scale: number, point: Point = null, offsetPoint: Point = null): void + { + if(!this._master || !this._display) return; + + if(!point) point = new Point((this._width / 2), (this._height / 2)); + + if(!offsetPoint) offsetPoint = point; + + point = this._display.toLocal(point); + + this._scale = scale; + + this.screenOffsetX = (offsetPoint.x - (point.x * this._scale)); + this.screenOffsetY = (offsetPoint.y - (point.y * this._scale)); + } + + public render(time: number, update: boolean = false): void + { + this._canvasUpdated = false; + + this._totalTimeRunning += GetTicker().deltaTime; + + if(this._totalTimeRunning === this._renderTimestamp) return; + + if(time === -1) time = (this._renderTimestamp + 1); + + if(!this._container || !this._geometry) return; + + if((this._width !== this._renderedWidth) || (this._height !== this._renderedHeight)) update = true; + + if((this._display.x !== this._screenOffsetX) || (this._display.y !== this._screenOffsetY)) + { + this._display.position.set(this._screenOffsetX, this._screenOffsetY); + + update = true; + } + + if(this._display.scale.x !== this._scale) + { + this._display.scale.set(this._scale); + + update = true; + } + + this.doMagic(); + + const frame = Math.round(this._totalTimeRunning / (60 / this._animationFPS)); + + let updateVisuals = false; + + if(frame !== this._lastFrame) + { + this._lastFrame = frame; + + updateVisuals = true; + } + + let spriteCount = 0; + + const objects = this._container.objects; + + if(objects.size) + { + for(const object of objects.values()) + { + if(!object) continue; + + spriteCount = (spriteCount + this.renderObject(object, object.instanceId.toString(), time, update, updateVisuals, spriteCount)); + } + } + + this._sortableSprites.sort((a, b) => (b.z - a.z)); + + if(spriteCount < this._sortableSprites.length) this._sortableSprites.splice(spriteCount); + + let iterator = 0; + + while(iterator < spriteCount) + { + const sprite = this._sortableSprites[iterator]; + + if(sprite && sprite.sprite) this.renderSprite(iterator, sprite); + + iterator++; + } + + this.cleanSprites(spriteCount); + + if(update || updateVisuals) this._canvasUpdated = true; + + this._renderTimestamp = this._totalTimeRunning; + this._renderedWidth = this._width; + this._renderedHeight = this._height; + } + + public skipSpriteVisibilityChecking(): void + { + this._noSpriteVisibilityChecking = true; + + this.render(-1, true); + } + + public resumeSpriteVisibilityChecking(): void + { + this._noSpriteVisibilityChecking = false; + } + + public getSortableSpriteList(): RoomObjectSpriteData[] + { + return this._objectCache.getSortableSpriteList(); + } + + public getPlaneSortableSprites(): SortableSprite[] + { + return this._objectCache.getPlaneSortableSprites(); + } + + public removeFromCache(identifier: string): void + { + this._objectCache.removeObjectCache(identifier); + } + + private renderObject(object: IRoomObject, identifier: string, time: number, update: boolean, updateVisuals: boolean, count: number): number + { + if(!object) return 0; + + const visualization = object.visualization as IRoomObjectSpriteVisualization; + + if(!visualization) + { + this.removeFromCache(identifier); + + return 0; + } + + const cache = this.getCacheItem(identifier); + cache.objectId = object.instanceId; + + const locationCache = cache.location; + const sortableCache = cache.sprites; + + const vector = locationCache.updateLocation(object, this._geometry); + + if(!vector) + { + this.removeFromCache(identifier); + + return 0; + } + + if(updateVisuals) visualization.update(this._geometry, time, (!sortableCache.isEmpty || update), (this._skipObjectUpdate && this._runningSlow)); + + if(locationCache.locationChanged) update = true; + + if(!sortableCache.needsUpdate(visualization.instanceId, visualization.updateSpriteCounter) && !update) + { + return sortableCache.spriteCount; + } + + let x = vector.x; + let y = vector.y; + let z = vector.z; + + if(x > 0) z = (z + (x * 1.2E-7)); + else z = (z + (-(x) * 1.2E-7)); + + x = (x + Math.trunc(this._width / 2)); + y = (y + Math.trunc(this._height / 2)); + + let spriteCount = 0; + + for(const sprite of visualization.sprites.values()) + { + if(!sprite || !sprite.visible) continue; + + const texture = sprite.texture; + const baseTexture = texture && texture.source; + + if(!texture || !baseTexture) continue; + + const spriteX = ((x + sprite.offsetX) + this._screenOffsetX); + const spriteY = ((y + sprite.offsetY) + this._screenOffsetY); + + if(sprite.flipH) + { + const checkX = ((x + (-(texture.width + (-(sprite.offsetX))))) + this._screenOffsetX); + + if(!this.isSpriteVisible(checkX, spriteY, texture.width, texture.height)) continue; + } + + else if(sprite.flipV) + { + const checkY = ((y + (-(texture.height + (-(sprite.offsetY))))) + this._screenOffsetY); + + if(!this.isSpriteVisible(spriteX, checkY, texture.width, texture.height)) continue; + } + + else + { + if(!this.isSpriteVisible(spriteX, spriteY, texture.width, texture.height)) continue; + } + + let sortableSprite = sortableCache.getSprite(spriteCount); + + if(!sortableSprite) + { + sortableSprite = new SortableSprite(); + + sortableCache.addSprite(sortableSprite); + + this._sortableSprites.push(sortableSprite); + + sortableSprite.name = identifier; + } + + sortableSprite.sprite = sprite; + + if((sprite.spriteType === RoomObjectSpriteType.AVATAR) || (sprite.spriteType === RoomObjectSpriteType.AVATAR_OWN)) + { + sortableSprite.sprite.libraryAssetName = 'avatar_' + object.id; + } + + sortableSprite.x = (spriteX - this._screenOffsetX); + sortableSprite.y = (spriteY - this._screenOffsetY); + sortableSprite.z = ((z + sprite.relativeDepth) + (3.7E-11 * count)); + + spriteCount++; + count++; + } + + sortableCache.setSpriteCount(spriteCount); + + this._canvasUpdated = true; + + return spriteCount; + } + + private getExtendedSprite(index: number): ExtendedSprite + { + if((index < 0) || (index >= this._spriteCount)) return null; + + const sprite = (this._display.getChildAt(index) as ExtendedSprite); + + if(!sprite) return null; + + return sprite; + } + + protected getExtendedSpriteIdentifier(sprite: ExtendedSprite): string + { + if(!sprite) return ''; + + return sprite.label; + } + + private renderSprite(index: number, sprite: SortableSprite): boolean + { + if(index >= this._spriteCount) + { + this.createAndAddSprite(sprite); + + return true; + } + + if(!sprite) return false; + + const objectSprite = sprite.sprite; + const extendedSprite = this.getExtendedSprite(index); + + if(!objectSprite || !extendedSprite) return false; + + if(extendedSprite.varyingDepth !== objectSprite.varyingDepth) + { + if(extendedSprite.varyingDepth && !objectSprite.varyingDepth) + { + this._display.removeChildAt(index); + + this._spritePool.push(extendedSprite); + + return this.renderSprite(index, sprite); + } + + this.createAndAddSprite(sprite, index); + + return true; + } + + if(extendedSprite.needsUpdate(objectSprite.id, objectSprite.updateCounter) || RoomEnterEffect.isVisualizationOn()) + { + extendedSprite.tag = objectSprite.tag; + extendedSprite.alphaTolerance = objectSprite.alphaTolerance; + extendedSprite.label = sprite.name; + extendedSprite.varyingDepth = objectSprite.varyingDepth; + extendedSprite.clickHandling = objectSprite.clickHandling; + extendedSprite.filters = objectSprite.filters; + + const alpha = (objectSprite.alpha / 255); + + if(extendedSprite.alpha !== alpha) extendedSprite.alpha = alpha; + + if(extendedSprite.tint !== objectSprite.color) extendedSprite.tint = objectSprite.color; + + if(extendedSprite.blendMode !== objectSprite.blendMode) extendedSprite.blendMode = objectSprite.blendMode; + + if(extendedSprite.texture !== objectSprite.texture) extendedSprite.setTexture(objectSprite.texture); + + if(objectSprite.flipH) + { + if(extendedSprite.scale.x !== -1) extendedSprite.scale.x = -1; + } + else + { + if(extendedSprite.scale.x !== 1) extendedSprite.scale.x = 1; + } + + if(objectSprite.flipV) + { + if(extendedSprite.scale.y !== -1) extendedSprite.scale.y = -1; + } + else + { + if(extendedSprite.scale.y !== 1) extendedSprite.scale.y = 1; + } + + this.updateEnterRoomEffect(extendedSprite, objectSprite); + } + + if(extendedSprite.x !== sprite.x) extendedSprite.x = sprite.x; + if(extendedSprite.y !== sprite.y) extendedSprite.y = sprite.y; + + extendedSprite.offsetX = objectSprite.offsetX; + extendedSprite.offsetY = objectSprite.offsetY; + + return true; + } + + private createAndAddSprite(sortableSprite: SortableSprite, index: number = -1): void + { + const sprite = sortableSprite.sprite; + + if(!sprite) return; + + let extendedSprite: ExtendedSprite = null; + + if(this._spritePool.length > 0) extendedSprite = this._spritePool.pop(); + + if(!extendedSprite) extendedSprite = new ExtendedSprite({}); + + if(extendedSprite.children.length) extendedSprite.removeChildren(); + + extendedSprite.tag = sprite.tag; + extendedSprite.alphaTolerance = sprite.alphaTolerance; + extendedSprite.alpha = (sprite.alpha / 255); + extendedSprite.tint = sprite.color; + extendedSprite.x = sortableSprite.x; + extendedSprite.y = sortableSprite.y; + extendedSprite.offsetX = sprite.offsetX; + extendedSprite.offsetY = sprite.offsetY; + extendedSprite.label = sprite.name; + extendedSprite.varyingDepth = sprite.varyingDepth; + extendedSprite.clickHandling = sprite.clickHandling; + extendedSprite.blendMode = sprite.blendMode; + extendedSprite.filters = sprite.filters; + + extendedSprite.setTexture(sprite.texture); + + if(sprite.flipH) extendedSprite.scale.x = -1; + + if(sprite.flipV) extendedSprite.scale.y = -1; + + this.updateEnterRoomEffect(extendedSprite, sprite); + + if((index < 0) || (index >= this._spriteCount)) + { + this._display.addChild(extendedSprite); + + this._spriteCount++; + } + else + { + this._display.addChildAt(extendedSprite, index); + } + + this._activeSpriteCount++; + } + + private cleanSprites(spriteCount: number, _arg_2: boolean = false): void + { + if(!this._display) return; + + if(spriteCount < 0) spriteCount = 0; + + if((spriteCount < this._activeSpriteCount) || !this._activeSpriteCount) + { + let iterator = (this._spriteCount - 1); + + while(iterator >= spriteCount) + { + this.cleanSprite(this.getExtendedSprite(iterator), _arg_2); + + iterator--; + } + } + + this._activeSpriteCount = spriteCount; + } + + private updateEnterRoomEffect(sprite: ExtendedSprite, _arg_2: IRoomObjectSprite): void + { + if(!RoomEnterEffect.isVisualizationOn() || !_arg_2) return; + + switch(_arg_2.spriteType) + { + case RoomObjectSpriteType.AVATAR_OWN: + return; + case RoomObjectSpriteType.ROOM_PLANE: + sprite.alpha = RoomEnterEffect.getDelta(0.9); + return; + case RoomObjectSpriteType.AVATAR: + sprite.alpha = RoomEnterEffect.getDelta(0.5); + return; + default: + sprite.alpha = RoomEnterEffect.getDelta(0.1); + } + } + + private cleanSprite(sprite: ExtendedSprite, _arg_2: boolean): void + { + if(!sprite) return; + + if(!_arg_2) + { + sprite.setTexture(null); + } + else + { + if(sprite.parent) sprite.parent.removeChild(sprite); + + sprite.destroy({ + children: true + }); + } + } + + public update(): void + { + if(!this._mouseCheckCount) + { + //this.checkMouseHits(this._mouseLocation.x, this._mouseLocation.y, MouseEventType.MOUSE_MOVE); + } + + this._mouseCheckCount = 0; + + this._eventId++; + } + + public setMouseListener(listener: IRoomCanvasMouseListener): void + { + this._mouseListener = listener; + } + + private getCacheItem(id: string): RoomObjectCacheItem + { + return this._objectCache.getObjectCache(id); + } + + private isSpriteVisible(x: number, y: number, width: number, height: number): boolean + { + if(this._noSpriteVisibilityChecking) return true; + + x = (((x - this._screenOffsetX) * this._scale) + this._screenOffsetX); + y = (((y - this._screenOffsetY) * this._scale) + this._screenOffsetY); + width = (width * this._scale); + height = (height * this._scale); + + if(((x < this._width) && ((x + width) >= 0)) && ((y < this._height) && ((y + height) >= 0))) + { + if(!this._usesExclusionRectangles) return true; + } + + return false; + } + + public handleMouseEvent(x: number, y: number, type: string, altKey: boolean, ctrlKey: boolean, shiftKey: boolean, buttonDown: boolean): boolean + { + x = (x - this._screenOffsetX); + y = (y - this._screenOffsetY); + + this._mouseLocation.x = (x / this._scale); + this._mouseLocation.y = (y / this._scale); + + if((this._mouseCheckCount > 0) && (type == MouseEventType.MOUSE_MOVE)) return this._mouseSpriteWasHit; + + this._mouseSpriteWasHit = this.checkMouseHits(Math.trunc(x / this._scale), Math.trunc(y / this._scale), type, altKey, ctrlKey, shiftKey, buttonDown); + + this._mouseCheckCount++; + + return this._mouseSpriteWasHit; + } + + private checkMouseHits(x: number, y: number, type: string, altKey: boolean = false, ctrlKey: boolean = false, shiftKey: boolean = false, buttonDown: boolean = false): boolean + { + const checkedSprites: string[] = []; + + let didHitSprite = false; + let mouseEvent: IRoomSpriteMouseEvent = null; + let spriteId = (this._activeSpriteCount - 1); + + while(spriteId >= 0) + { + const extendedSprite = this.getExtendedSprite(spriteId); + + if(extendedSprite && extendedSprite.containsPoint(new Point((x - extendedSprite.x), (y - extendedSprite.y)))) + { + if(extendedSprite.clickHandling && ((type === MouseEventType.MOUSE_CLICK) || (type === MouseEventType.DOUBLE_CLICK))) + { + // + } + else + { + const identifier = this.getExtendedSpriteIdentifier(extendedSprite); + + if(checkedSprites.indexOf(identifier) === -1) + { + const tag = extendedSprite.tag; + + let mouseData = this._mouseActiveObjects.get(identifier); + + if(mouseData) + { + if(mouseData.spriteTag !== tag) + { + mouseEvent = this.createMouseEvent(0, 0, 0, 0, MouseEventType.ROLL_OUT, mouseData.spriteTag, altKey, ctrlKey, shiftKey, buttonDown); + + this.bufferMouseEvent(mouseEvent, identifier); + } + } + + if((type === MouseEventType.MOUSE_MOVE) && (!mouseData || (mouseData.spriteTag !== tag))) + { + mouseEvent = this.createMouseEvent(x, y, (x - extendedSprite.x), (y - extendedSprite.y), MouseEventType.ROLL_OVER, tag, altKey, ctrlKey, shiftKey, buttonDown); + } + else + { + mouseEvent = this.createMouseEvent(x, y, (x - extendedSprite.x), (y - extendedSprite.y), type, tag, altKey, ctrlKey, shiftKey, buttonDown); + + mouseEvent.spriteOffsetX = extendedSprite.offsetX; + mouseEvent.spriteOffsetY = extendedSprite.offsetY; + } + + if(!mouseData) + { + mouseData = new ObjectMouseData(); + + mouseData.objectId = identifier; + this._mouseActiveObjects.set(identifier, mouseData); + } + + mouseData.spriteTag = tag; + + if(((type !== MouseEventType.MOUSE_MOVE) || (x !== this._mouseOldX)) || (y !== this._mouseOldY)) + { + this.bufferMouseEvent(mouseEvent, identifier); + } + + checkedSprites.push(identifier); + } + + didHitSprite = true; + } + } + + spriteId--; + } + + const keys: string[] = []; + + for(const key of this._mouseActiveObjects.keys()) key && keys.push(key); + + let index = 0; + + while(index < keys.length) + { + const key = keys[index]; + + if(checkedSprites.indexOf(key) >= 0) keys[index] = null; + + index++; + } + + index = 0; + + while(index < keys.length) + { + const key = keys[index]; + + if(key !== null) + { + const existing = this._mouseActiveObjects.get(key); + + if(existing) this._mouseActiveObjects.delete(key); + + const mouseEvent = this.createMouseEvent(0, 0, 0, 0, MouseEventType.ROLL_OUT, existing.spriteTag, altKey, ctrlKey, shiftKey, buttonDown); + + this.bufferMouseEvent(mouseEvent, key); + } + + index++; + } + + this.processMouseEvents(); + this._mouseOldX = x; + this._mouseOldY = y; + + return didHitSprite; + } + + protected createMouseEvent(x: number, y: number, localX: number, localY: number, type: string, tag: string, altKey: boolean, ctrlKey: boolean, shiftKey: boolean, buttonDown: boolean): IRoomSpriteMouseEvent + { + const screenX: number = (x - (this._width / 2)); + const screenY: number = (y - (this._height / 2)); + const canvasName = `canvas_${this._id}`; + + return new RoomSpriteMouseEvent(type, ((canvasName + '_') + this._eventId), canvasName, tag, screenX, screenY, localX, localY, ctrlKey, altKey, shiftKey, buttonDown); + } + + protected bufferMouseEvent(k: IRoomSpriteMouseEvent, _arg_2: string): void + { + if(!k || !this._eventCache) return; + + this._eventCache.delete(_arg_2); + this._eventCache.set(_arg_2, k); + } + + protected processMouseEvents(): void + { + if(!this._container || !this._eventCache) return; + + for(const [key, event] of this._eventCache.entries()) + { + if(!this._eventCache) return; + + if(!event) continue; + + const roomObject = this._container.getRoomObject(parseInt(key)); + + if(!roomObject) continue; + + if(this._mouseListener) + { + this._mouseListener.processRoomCanvasMouseEvent(event, roomObject, this._geometry); + } + else + { + const logic = roomObject.mouseHandler; + + if(logic) + { + logic.mouseEvent(event, this._geometry); + } + } + } + + if(this._eventCache) this._eventCache.clear(); + } + + public getDisplayAsTexture(): Texture + { + this._noSpriteVisibilityChecking = true; + + const currentScale = this._scale; + const currentOffsetX = this._screenOffsetX; + const currentOffsetY = this._screenOffsetY; + + this.setScale(1); + + this._screenOffsetX = 0; + this._screenOffsetY = 0; + + this.render(-1, true); + + this._display.mask = null; + + const bounds = this._display.getBounds(); + const texture = TextureUtils.createAndWriteRenderTexture(this._display.width, this._display.height, this._display, new Matrix(1, 0, 0, 1, -(bounds.x), -(bounds.y))); + + this._display.mask = this._mask; + + this._noSpriteVisibilityChecking = false; + + this.setScale(currentScale); + + this._screenOffsetX = currentOffsetX; + this._screenOffsetY = currentOffsetY; + + return texture; + } + + private doMagic(): void + { + const geometry = (this.geometry as RoomGeometry); + + if(this._rotation !== 0) + { + let direction = this._effectDirection; + + geometry.direction = new Vector3d((direction.x + this._rotation), direction.y, direction.z); + + direction = (geometry.direction as Vector3d); + + geometry.setDepthVector(new Vector3d(direction.x, direction.y, 5)); + + const location = new Vector3d(); + + location.assign(this._rotationOrigin); + + location.x = (location.x + ((this._rotationRodLength * Math.cos((((direction.x + 180) / 180) * Math.PI))) * Math.cos(((direction.y / 180) * Math.PI)))); + location.y = (location.y + ((this._rotationRodLength * Math.sin((((direction.x + 180) / 180) * Math.PI))) * Math.cos(((direction.y / 180) * Math.PI)))); + location.z = (location.z + (this._rotationRodLength * Math.sin(((direction.y / 180) * Math.PI)))); + + geometry.location = location; + + this._effectLocation = new Vector3d(); + this._effectLocation.assign(location); + this._effectDirection = new Vector3d(); + this._effectDirection.assign(geometry.direction); + } + + if(RoomShakingEffect.isVisualizationOn() && !this._SafeStr_4507) + { + this.changeShaking(); + } + else + { + if(!RoomShakingEffect.isVisualizationOn() && this._SafeStr_4507) this.changeShaking(); + } + + if(RoomRotatingEffect.isVisualizationOn()) this.changeRotation(); + + if(this._SafeStr_4507) + { + this._SafeStr_795++; + + const _local_4 = this._effectDirection; + const _local_1 = Vector3d.sum(_local_4, new Vector3d((Math.sin((((this._SafeStr_795 * 5) / 180) * Math.PI)) * 2), (Math.sin(((this._SafeStr_795 / 180) * Math.PI)) * 5), (Math.sin((((this._SafeStr_795 * 10) / 180) * Math.PI)) * 2))); + + geometry.direction = _local_1; + } + else + { + this._SafeStr_795 = 0; + + geometry.direction = this._effectDirection; + } + } + + private changeShaking(): void + { + this._SafeStr_4507 = !this._SafeStr_4507; + + if(this._SafeStr_4507) + { + const direction = this.geometry.direction; + + this._effectDirection = new Vector3d(direction.x, direction.y, direction.z); + } + } + + private changeRotation(): void + { + if(this._SafeStr_4507) return; + + const geometry = (this.geometry as RoomGeometry); + + if(!geometry) return; + + if(this._rotation === 0) + { + const location = geometry.location; + const directionAxis = geometry.directionAxis; + + this._effectLocation = new Vector3d(); + this._effectLocation.assign(location); + this._effectDirection = new Vector3d(); + this._effectDirection.assign(geometry.direction); + + const intersection = RoomGeometry.getIntersectionVector(location, directionAxis, new Vector3d(0, 0, 0), new Vector3d(0, 0, 1)); + + if(intersection !== null) + { + this._rotationOrigin = new Vector3d(intersection.x, intersection.y, intersection.z); + this._rotationRodLength = Vector3d.dif(intersection, location).length; + this._rotation = 1; + } + + return; + } + + this._rotation = 0; + + geometry.location = this._effectLocation; + geometry.direction = this._effectDirection; + geometry.setDepthVector(new Vector3d(this._effectDirection.x, this._effectDirection.y, 5)); + } + + public moveLeft(): void + { + if(this._rotation !== 0) + { + if(this._rotation === 1) + { + this._rotation = -1; + } + else + { + this._rotation = (this._rotation - 1); + } + + return; + } + + const geometry = (this.geometry as RoomGeometry); + const direction = (((geometry.direction.x - 90) / 180) * Math.PI); + + geometry.location = Vector3d.sum(geometry.location, new Vector3d((Math.cos(direction) * Math.sqrt(2)), (Math.sin(direction) * Math.sqrt(2)))); + } + + public moveRight(): void + { + if(this._rotation !== 0) + { + if(this._rotation === -1) + { + this._rotation = 1; + } + else + { + this._rotation = (this._rotation + 1); + } + + return; + } + + const geometry = (this.geometry as RoomGeometry); + const direction = (((geometry.direction.x + 90) / 180) * Math.PI); + + geometry.location = Vector3d.sum(geometry.location, new Vector3d((Math.cos(direction) * Math.sqrt(2)), (Math.sin(direction) * Math.sqrt(2)))); + } + + public moveUp(): void + { + if(this._rotation !== 0) return; + + const geometry = (this.geometry as RoomGeometry); + const direction = ((geometry.direction.x / 180) * Math.PI); + + geometry.location = Vector3d.sum(geometry.location, new Vector3d((Math.cos(direction) * Math.sqrt(2)), (Math.sin(direction) * Math.sqrt(2)))); + } + + public moveDown(): void + { + if(this._rotation !== 0) return; + + const geometry = (this.geometry as RoomGeometry); + const direction = (((geometry.direction.x + 180) / 180) * Math.PI); + + geometry.location = Vector3d.sum(geometry.location, new Vector3d((Math.cos(direction) * Math.sqrt(2)), (Math.sin(direction) * Math.sqrt(2)))); + } + + public get id(): number + { + return this._id; + } + + public get geometry(): IRoomGeometry + { + return this._geometry; + } + + public get master(): Container + { + return this._master; + } + + public get display(): Container + { + return this._display; + } + + public get screenOffsetX(): number + { + return this._screenOffsetX; + } + + public set screenOffsetX(x: number) + { + x = Math.trunc(x); + + this._mouseLocation.x = (this._mouseLocation.x - (x - this._screenOffsetX)); + this._screenOffsetX = x; + } + + public get screenOffsetY(): number + { + return this._screenOffsetY; + } + + public set screenOffsetY(y: number) + { + y = Math.trunc(y); + + this._mouseLocation.y = (this._mouseLocation.y - (y - this._screenOffsetY)); + this._screenOffsetY = y; + } + + public get scale(): number + { + return this._scale; + } + + public get width(): number + { + return (this._width * this._scale); + } + + public get height(): number + { + return (this._height * this._scale); + } + + public get canvasUpdated(): boolean + { + return this._canvasUpdated; + } + + public set canvasUpdated(flag: boolean) + { + this._canvasUpdated = flag; + } +} diff --git a/packages/room/src/renderer/cache/RoomObjectCache.ts b/packages/room/src/renderer/cache/RoomObjectCache.ts new file mode 100644 index 0000000..bdff1cb --- /dev/null +++ b/packages/room/src/renderer/cache/RoomObjectCache.ts @@ -0,0 +1,142 @@ +import { IRoomObjectSprite, RoomObjectSpriteData, RoomObjectSpriteType } from '@nitrots/api'; +import { SortableSprite } from '../utils'; +import { RoomObjectCacheItem } from './RoomObjectCacheItem'; + +export class RoomObjectCache +{ + private static MAX_SIZE_FOR_AVG_COLOR: number = 200; + + private _data: Map = new Map(); + private _roomObjectVariableAccurateZ: string; + + constructor(accurateZ: string) + { + this._roomObjectVariableAccurateZ = accurateZ; + } + + public dispose(): void + { + if(this._data) + { + for(const [key, item] of this._data.entries()) + { + if(!item) continue; + + this._data.delete(key); + + item.dispose(); + } + + this._data = null; + } + } + + public getObjectCache(k: string): RoomObjectCacheItem + { + let existing = this._data.get(k); + + if(!existing) + { + existing = new RoomObjectCacheItem(this._roomObjectVariableAccurateZ); + + this._data.set(k, existing); + } + + return existing; + } + + public removeObjectCache(k: string): void + { + const existing = this._data.get(k); + + if(!existing) return; + + this._data.delete(k); + + existing.dispose(); + } + + public getSortableSpriteList(): RoomObjectSpriteData[] + { + const spriteData: RoomObjectSpriteData[] = []; + + for(const item of this._data.values()) + { + if(!item) continue; + + const sprites = item.sprites && item.sprites.sprites; + + if(!sprites || !sprites.length) continue; + + for(const sprite of sprites) + { + if(!sprite) continue; + + if((sprite.sprite.spriteType !== RoomObjectSpriteType.ROOM_PLANE) && (sprite.sprite.name !== '')) + { + const data = new RoomObjectSpriteData(); + + data.objectId = item.objectId; + data.x = sprite.x; + data.y = sprite.y; + data.z = sprite.z; + data.name = sprite.sprite.name || ''; + data.flipH = sprite.sprite.flipH; + data.alpha = sprite.sprite.alpha; + data.color = sprite.sprite.color.toString(); + data.blendMode = sprite.sprite.blendMode.toString(); + data.width = sprite.sprite.width; + data.height = sprite.sprite.height; + data.type = sprite.sprite.type; + data.posture = sprite.sprite.posture; + + const isSkewed = this.isSkewedSprite(sprite.sprite); + + if(isSkewed) data.skew = (((sprite.sprite.direction % 4) === 0) ? -0.5 : 0.5); + + if(((((isSkewed || (sprite.name.indexOf('%image.library.url%') >= 0)) || (sprite.name.indexOf('%group.badge.url%') >= 0)) && (data.width <= RoomObjectCache.MAX_SIZE_FOR_AVG_COLOR)) && (data.height <= RoomObjectCache.MAX_SIZE_FOR_AVG_COLOR))) + { + //data.color = Canvas._Str_23439(sprite.sprite.texture).toString(); + + if(sprite.sprite.name.indexOf('external_image_wallitem') === 0) + { + data.frame = true; + } + } + + spriteData.push(data); + } + } + } + + if(!spriteData || !spriteData.length) return null; + + return spriteData; + } + + private isSkewedSprite(k: IRoomObjectSprite): boolean + { + if(!k.type) return false; + + if((k.type.indexOf('external_image_wallitem') === 0) && (k.tag === 'THUMBNAIL')) return true; + + if((k.type.indexOf('guild_forum') === 0) && (k.tag === 'THUMBNAIL')) return true; + + return false; + } + + public getPlaneSortableSprites(): SortableSprite[] + { + const sprites: SortableSprite[] = []; + + for(const item of this._data.values()) + { + for(const sprite of item.sprites.sprites) + { + if(sprite.sprite.spriteType === RoomObjectSpriteType.ROOM_PLANE) sprites.push(sprite); + } + } + + return sprites; + } +} diff --git a/packages/room/src/renderer/cache/RoomObjectCacheItem.ts b/packages/room/src/renderer/cache/RoomObjectCacheItem.ts new file mode 100644 index 0000000..12de528 --- /dev/null +++ b/packages/room/src/renderer/cache/RoomObjectCacheItem.ts @@ -0,0 +1,52 @@ +import { RoomObjectLocationCacheItem } from './RoomObjectLocationCacheItem'; +import { RoomObjectSortableSpriteCacheItem } from './RoomObjectSortableSpriteCacheItem'; + +export class RoomObjectCacheItem +{ + private _objectId: number; + private _location: RoomObjectLocationCacheItem; + private _sprites: RoomObjectSortableSpriteCacheItem; + + constructor(accurateZ: string) + { + this._location = new RoomObjectLocationCacheItem(accurateZ); + this._sprites = new RoomObjectSortableSpriteCacheItem(); + } + + public dispose(): void + { + if(this._location) + { + this._location.dispose(); + + this._location = null; + } + + if(this._sprites) + { + this._sprites.dispose(); + + this._sprites = null; + } + } + + public get objectId(): number + { + return this._objectId; + } + + public set objectId(k: number) + { + this._objectId = k; + } + + public get location(): RoomObjectLocationCacheItem + { + return this._location; + } + + public get sprites(): RoomObjectSortableSpriteCacheItem + { + return this._sprites; + } +} diff --git a/packages/room/src/renderer/cache/RoomObjectLocationCacheItem.ts b/packages/room/src/renderer/cache/RoomObjectLocationCacheItem.ts new file mode 100644 index 0000000..799655f --- /dev/null +++ b/packages/room/src/renderer/cache/RoomObjectLocationCacheItem.ts @@ -0,0 +1,96 @@ +import { IRoomGeometry, IRoomObject, IVector3D } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; + +export class RoomObjectLocationCacheItem +{ + private _roomObjectVariableAccurateZ: string; + + private _location: Vector3d; + private _screenLocation: Vector3d; + private _locationChanged: boolean; + + private _geometryUpdateId: number; + private _objectUpdateId: number; + + constructor(accurateZ: string) + { + this._roomObjectVariableAccurateZ = accurateZ || ''; + + this._location = new Vector3d(); + this._screenLocation = new Vector3d(); + this._locationChanged = false; + + this._geometryUpdateId = -1; + this._objectUpdateId = -1; + } + + public dispose(): void + { + this._screenLocation = null; + } + + public updateLocation(object: IRoomObject, geometry: IRoomGeometry): IVector3D + { + if(!object || !geometry) return null; + + let locationChanged = false; + + const location = object.getLocation(); + + if((geometry.updateId !== this._geometryUpdateId) || (object.updateCounter !== this._objectUpdateId)) + { + this._objectUpdateId = object.updateCounter; + + if((geometry.updateId !== this._geometryUpdateId) || (location.x !== this._location.x) || (location.y !== this._location.y) || (location.z !== this._location.z)) + { + this._geometryUpdateId = geometry.updateId; + this._location.assign(location); + + locationChanged = true; + } + } + + this._locationChanged = locationChanged; + + if(this._locationChanged) + { + const screenLocation = geometry.getScreenPosition(location); + + if(!screenLocation) return null; + + const accurateZ = object.model.getValue(this._roomObjectVariableAccurateZ); + + if(isNaN(accurateZ) || (accurateZ === 0)) + { + const rounded = new Vector3d(Math.round(location.x), Math.round(location.y), location.z); + + if((rounded.x !== location.x) || (rounded.y !== location.y)) + { + const roundedScreen = geometry.getScreenPosition(rounded); + + this._screenLocation.assign(screenLocation); + + if(roundedScreen) this._screenLocation.z = roundedScreen.z; + } + else + { + this._screenLocation.assign(screenLocation); + } + } + else + { + this._screenLocation.assign(screenLocation); + } + + this._screenLocation.x = Math.round(this._screenLocation.x); + this._screenLocation.y = Math.round(this._screenLocation.y); + } + + return this._screenLocation; + } + + public get locationChanged(): boolean + { + return this._locationChanged; + } +} diff --git a/packages/room/src/renderer/cache/RoomObjectSortableSpriteCacheItem.ts b/packages/room/src/renderer/cache/RoomObjectSortableSpriteCacheItem.ts new file mode 100644 index 0000000..9d4a5ca --- /dev/null +++ b/packages/room/src/renderer/cache/RoomObjectSortableSpriteCacheItem.ts @@ -0,0 +1,68 @@ +import { SortableSprite } from '../utils'; + +export class RoomObjectSortableSpriteCacheItem +{ + private _sprites: SortableSprite[] = []; + private _updateId1: number = -1; + private _updateId2: number = -1; + private _isEmpty: boolean = false; + + public dispose(): void + { + this.setSpriteCount(0); + } + + public addSprite(sprite: SortableSprite): void + { + this._sprites.push(sprite); + } + + public getSprite(index: number): SortableSprite + { + return this._sprites[index]; + } + + public needsUpdate(id1: number, id2: number): boolean + { + if((id1 === this._updateId1) && (id2 === this._updateId2)) return false; + + this._updateId1 = id1; + this._updateId2 = id2; + + return true; + } + + public setSpriteCount(count: number): void + { + if(count < this._sprites.length) + { + let i = count; + + while(i < this._sprites.length) + { + this._sprites[i]?.dispose(); + + i++; + } + + this._sprites.splice(count, (this._sprites.length - count)); + } + + this._isEmpty = (this._sprites.length) ? false : true; + } + + public get sprites(): SortableSprite[] + { + return this._sprites; + } + + public get spriteCount(): number + { + return this._sprites.length; + } + + public get isEmpty(): boolean + { + return this._isEmpty; + } +} diff --git a/packages/room/src/renderer/cache/index.ts b/packages/room/src/renderer/cache/index.ts new file mode 100644 index 0000000..361f724 --- /dev/null +++ b/packages/room/src/renderer/cache/index.ts @@ -0,0 +1,4 @@ +export * from './RoomObjectCache'; +export * from './RoomObjectCacheItem'; +export * from './RoomObjectLocationCacheItem'; +export * from './RoomObjectSortableSpriteCacheItem'; diff --git a/packages/room/src/renderer/index.ts b/packages/room/src/renderer/index.ts new file mode 100644 index 0000000..a09ea46 --- /dev/null +++ b/packages/room/src/renderer/index.ts @@ -0,0 +1,4 @@ +export * from './RoomRenderer'; +export * from './RoomSpriteCanvas'; +export * from './cache'; +export * from './utils'; diff --git a/packages/room/src/renderer/utils/ExtendedSprite.ts b/packages/room/src/renderer/utils/ExtendedSprite.ts new file mode 100644 index 0000000..0eed5d3 --- /dev/null +++ b/packages/room/src/renderer/utils/ExtendedSprite.ts @@ -0,0 +1,170 @@ +import { AlphaTolerance } from '@nitrots/api'; +import { GetRenderer } from '@nitrots/utils'; +import { GlRenderTarget, Point, Sprite, Texture, TextureSource, WebGLRenderer } from 'pixi.js'; + +const BYTES_PER_PIXEL = 4; + +export class ExtendedSprite extends Sprite +{ + private _offsetX: number = 0; + private _offsetY: number = 0; + private _tag: string = ''; + private _alphaTolerance: number = AlphaTolerance.MATCH_OPAQUE_PIXELS; + private _varyingDepth: boolean = false; + private _clickHandling: boolean = false; + + private _updateId1: number = -1; + private _updateId2: number = -1; + + public needsUpdate(updateId1: number, updateId2: number): boolean + { + if((this._updateId1 === updateId1) && (this._updateId2 === updateId2)) return false; + + this._updateId1 = updateId1; + this._updateId2 = updateId2; + + return true; + } + + public setTexture(texture: Texture): void + { + if(!texture) texture = Texture.EMPTY; + + if(texture === this.texture) return; + + if(texture === Texture.EMPTY) + { + this._updateId1 = -1; + this._updateId2 = -1; + } + + this.texture = texture; + } + + public containsPoint(point: Point): boolean + { + if(!point || (this.alphaTolerance > 255) || !this.texture || (this.texture === Texture.EMPTY) || (this.blendMode !== 'normal')) return false; + + point = new Point((point.x * this.scale.x), (point.y * this.scale.y)); + + if(!super.containsPoint(point)) return false; + + const texture = this.texture; + const textureSource = this.texture.source; + + //@ts-ignore + if((!textureSource || !textureSource.hitMap) && !ExtendedSprite.generateHitMapForTextureSource(textureSource)) return false; + + //@ts-ignore + const hitMap = (textureSource.hitMap as U8intclampedArray); + + let dx = (point.x + texture.frame.x); + let dy = (point.y + texture.frame.y); + + if(this.texture.trim) + { + dx -= texture.trim.x; + dy -= texture.trim.y; + } + + dx = (Math.round(dx) * textureSource.resolution); + dy = (Math.round(dy) * textureSource.resolution); + + const index = (dx + dy * textureSource.width) * 4; + + return (hitMap[index + 3] >= this.alphaTolerance); + } + + private static generateHitMapForTextureSource(textureSource: TextureSource): boolean + { + if(!textureSource) return false; + + const width = Math.max(Math.round(textureSource.width * textureSource.resolution), 1); + const height = Math.max(Math.round(textureSource.height * textureSource.resolution), 1); + const pixels = new Uint8Array(BYTES_PER_PIXEL * width * height); + + const renderer = GetRenderer() as WebGLRenderer; + + const renderTarget = renderer.renderTarget.getRenderTarget(textureSource); + const glRenterTarget = renderer.renderTarget.getGpuRenderTarget(renderTarget) as GlRenderTarget; + + const gl = renderer.gl; + + gl.bindFramebuffer(gl.FRAMEBUFFER, glRenterTarget.resolveTargetFramebuffer); + + gl.readPixels( + 0, + 0, + width, + height, + gl.RGBA, + gl.UNSIGNED_BYTE, + pixels + ); + + //@ts-ignore + textureSource.hitMap = pixels; + + return true; + } + + public get offsetX(): number + { + return this._offsetX; + } + + public set offsetX(offset: number) + { + this._offsetX = offset; + } + + public get offsetY(): number + { + return this._offsetY; + } + + public set offsetY(offset: number) + { + this._offsetY = offset; + } + + public get tag(): string + { + return this._tag; + } + + public set tag(tag: string) + { + this._tag = tag; + } + + public get alphaTolerance(): number + { + return this._alphaTolerance; + } + + public set alphaTolerance(tolerance: number) + { + this._alphaTolerance = tolerance; + } + + public get varyingDepth(): boolean + { + return this._varyingDepth; + } + + public set varyingDepth(flag: boolean) + { + this._varyingDepth = flag; + } + + public get clickHandling(): boolean + { + return this._clickHandling; + } + + public set clickHandling(flag: boolean) + { + this._clickHandling = flag; + } +} diff --git a/packages/room/src/renderer/utils/ObjectMouseData.ts b/packages/room/src/renderer/utils/ObjectMouseData.ts new file mode 100644 index 0000000..ed47437 --- /dev/null +++ b/packages/room/src/renderer/utils/ObjectMouseData.ts @@ -0,0 +1,31 @@ +export class ObjectMouseData +{ + private _objectId: string; + private _spriteTag: string; + + constructor() + { + this._objectId = ''; + this._spriteTag = ''; + } + + public get objectId(): string + { + return this._objectId; + } + + public set objectId(k: string) + { + this._objectId = k; + } + + public get spriteTag(): string + { + return this._spriteTag; + } + + public set spriteTag(k: string) + { + this._spriteTag = k; + } +} \ No newline at end of file diff --git a/packages/room/src/renderer/utils/SortableSprite.ts b/packages/room/src/renderer/utils/SortableSprite.ts new file mode 100644 index 0000000..4f6e2c3 --- /dev/null +++ b/packages/room/src/renderer/utils/SortableSprite.ts @@ -0,0 +1,79 @@ +import { IRoomObjectSprite, ISortableSprite } from '@nitrots/api'; + +export class SortableSprite implements ISortableSprite +{ + public static Z_INFINITY: number = 100000000; + + private _name: string; + private _sprite: IRoomObjectSprite; + + private _x: number; + private _y: number; + private _z: number; + + constructor() + { + this._name = ''; + this._sprite = null; + + this._x = 0; + this._y = 0; + this._z = 0; + } + + public dispose(): void + { + this._z = -(SortableSprite.Z_INFINITY); + this._sprite = null; + } + + public get name(): string + { + return this._name; + } + + public set name(name: string) + { + this._name = name; + } + + public get sprite(): IRoomObjectSprite + { + return this._sprite; + } + + public set sprite(sprite: IRoomObjectSprite) + { + this._sprite = sprite; + } + + public get x(): number + { + return this._x; + } + + public set x(x: number) + { + this._x = x; + } + + public get y(): number + { + return this._y; + } + + public set y(y: number) + { + this._y = y; + } + + public get z(): number + { + return this._z; + } + + public set z(z: number) + { + this._z = z; + } +} diff --git a/packages/room/src/renderer/utils/index.ts b/packages/room/src/renderer/utils/index.ts new file mode 100644 index 0000000..65ca238 --- /dev/null +++ b/packages/room/src/renderer/utils/index.ts @@ -0,0 +1,3 @@ +export * from './ExtendedSprite'; +export * from './ObjectMouseData'; +export * from './SortableSprite'; diff --git a/packages/room/src/utils/FurnitureStackingHeightMap.ts b/packages/room/src/utils/FurnitureStackingHeightMap.ts new file mode 100644 index 0000000..4e2ee52 --- /dev/null +++ b/packages/room/src/utils/FurnitureStackingHeightMap.ts @@ -0,0 +1,121 @@ +import { IFurnitureStackingHeightMap } from '@nitrots/api'; + +export class FurnitureStackingHeightMap implements IFurnitureStackingHeightMap +{ + private _width: number; + private _height: number; + private _heights: number[]; + private _isNotStackable: boolean[]; + private _isRoomTile: boolean[]; + + constructor(width: number, height: number) + { + this._width = width; + this._height = height; + this._heights = []; + this._isNotStackable = []; + this._isRoomTile = []; + + let total = (width * height); + + while(total > 0) + { + this._heights.push(0); + this._isNotStackable.push(false); + this._isRoomTile.push(false); + + total--; + } + } + + public dispose(): void + { + this._width = 0; + this._height = 0; + this._height = null; + this._isNotStackable = null; + this._isRoomTile = null; + } + + private validPosition(x: number, y: number): boolean + { + return (((x >= 0) && (x < this._width)) && (y >= 0)) && (y < this._height); + } + + public getTileHeight(x: number, y: number): number + { + return ((this.validPosition(x, y)) ? this._heights[((y * this._width) + x)] : 0); + } + + public setTileHeight(x: number, y: number, height: number): void + { + if(this.validPosition(x, y)) this._heights[((y * this._width) + x)] = height; + } + + public setStackingBlocked(x: number, y: number, isNotStackable: boolean): void + { + if(this.validPosition(x, y)) this._isNotStackable[((y * this._width) + x)] = isNotStackable; + } + + public setIsRoomTile(x: number, y: number, isRoomTile: boolean): void + { + if(this.validPosition(x, y)) this._isRoomTile[((y * this._width) + x)] = isRoomTile; + } + + public 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 = -1): boolean + { + let _local_12 = 0; + let _local_13 = 0; + + if(!this.validPosition(k, _arg_2) || !this.validPosition(((k + _arg_3) - 1), ((_arg_2 + _arg_4) - 1))) return false; + + if(((_arg_5 < 0) || (_arg_5 >= this._width))) _arg_5 = 0; + + if(((_arg_6 < 0) || (_arg_6 >= this._height))) _arg_6 = 0; + + _arg_7 = Math.min(_arg_7, (this._width - _arg_5)); + _arg_8 = Math.min(_arg_8, (this._height - _arg_6)); + + if(_arg_10 === -1) _arg_10 = this.getTileHeight(k, _arg_2); + + let _local_11 = _arg_2; + + while(_local_11 < (_arg_2 + _arg_4)) + { + _local_12 = k; + + while(_local_12 < (k + _arg_3)) + { + if(((((_local_12 < _arg_5) || (_local_12 >= (_arg_5 + _arg_7))) || (_local_11 < _arg_6)) || (_local_11 >= (_arg_6 + _arg_8)))) + { + _local_13 = ((_local_11 * this._width) + _local_12); + + if(_arg_9) + { + if(!this._isRoomTile[_local_13]) return false; + } + else + { + if(((this._isNotStackable[_local_13]) || (!(this._isRoomTile[_local_13]))) || (Math.abs((this._heights[_local_13] - _arg_10)) > 0.01)) return false; + } + } + + _local_12++; + } + + _local_11++; + } + + return true; + } + + public get width(): number + { + return this._width; + } + + public get height(): number + { + return this._height; + } +} diff --git a/packages/room/src/utils/LegacyWallGeometry.ts b/packages/room/src/utils/LegacyWallGeometry.ts new file mode 100644 index 0000000..45bdff3 --- /dev/null +++ b/packages/room/src/utils/LegacyWallGeometry.ts @@ -0,0 +1,322 @@ +import { ILegacyWallGeometry, IVector3D } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; + +export class LegacyWallGeometry implements ILegacyWallGeometry +{ + public static DEFAULT_SCALE: number = 32; + + private static L: string = 'l'; + private static R: string = 'r'; + + private _isDisposed: boolean; + private _scale: number; + private _heightMap: number[][]; + private _width: number; + private _height: number; + private _floorHeight: number; + + constructor() + { + this._isDisposed = false; + this._scale = 64; + this._heightMap = []; + this._width = 0; + this._height = 0; + this._floorHeight = 0; + } + + public get disposed(): boolean + { + return this._isDisposed; + } + + public get scale(): number + { + return this._scale; + } + + public set scale(k: number) + { + this._scale = k; + } + + public dispose(): void + { + this.reset(); + this._isDisposed = true; + } + + public initialize(width: number, height: number, floorHeight: number): void + { + if((width <= this._width) && (height <= this._height)) + { + this._width = width; + this._height = height; + this._floorHeight = floorHeight; + + return; + } + + this.reset(); + + let y = 0; + + while(y < height) + { + const heights: number[] = []; + + this._heightMap.push(heights); + + let x = 0; + + while(x < width) + { + heights.push(0); + + x++; + } + + y++; + } + + this._width = width; + this._height = height; + this._floorHeight = floorHeight; + } + + private reset(): void + { + this._heightMap = []; + } + + public setHeight(x: number, y: number, height: number): boolean + { + if((((x < 0) || (x >= this._width)) || (y < 0)) || (y >= this._height)) return false; + + const heightMap = this._heightMap[y]; + + if(!heightMap) return false; + + heightMap[x] = height; + + return true; + } + + public getHeight(x: number, y: number): number + { + if((((x < 0) || (x >= this._width)) || (y < 0)) || (y >= this._height)) return 0; + + const heightMap = this._heightMap[y]; + + if(!heightMap) return 0; + + return heightMap[x]; + } + + public getLocation(width: number, height: number, localX: number, localY: number, direction: string): IVector3D + { + let _local_7: number; + if(((width == 0) && (height == 0))) + { + width = this._width; + height = this._height; + const _local_12 = Math.round((this.scale / 10)); + if(direction == LegacyWallGeometry.R) + { + let _local_7 = (this._width - 1); + while(_local_7 >= 0) + { + let _local_6 = 1; + while(_local_6 < this._height) + { + if(this.getHeight(_local_7, _local_6) <= this._floorHeight) + { + if((_local_6 - 1) < height) + { + width = _local_7; + height = (_local_6 - 1); + } + break; + } + _local_6++; + } + _local_7--; + } + localY = (localY + ((this.scale / 4) - (_local_12 / 2))); + localX = (localX + (this.scale / 2)); + } + else + { + let _local_6 = (this._height - 1); + while(_local_6 >= 0) + { + let _local_7 = 1; + while(_local_7 < this._width) + { + if(this.getHeight(_local_7, _local_6) <= this._floorHeight) + { + if((_local_7 - 1) < width) + { + width = (_local_7 - 1); + height = _local_6; + } + break; + } + _local_7++; + } + _local_6--; + } + localY = (localY + ((this.scale / 4) - (_local_12 / 2))); + localX = (localX - _local_12); + } + } + let _local_8: number = width; + let _local_9: number = height; + let _local_10: number = this.getHeight(width, height); + if(direction == LegacyWallGeometry.R) + { + _local_8 = (_local_8 + ((localX / (this._scale / 2)) - 0.5)); + _local_9 = (_local_9 + 0.5); + _local_10 = (_local_10 - ((localY - (localX / 2)) / (this._scale / 2))); + } + else + { + _local_9 = (_local_9 + ((((this._scale / 2) - localX) / (this._scale / 2)) - 0.5)); + _local_8 = (_local_8 + 0.5); + _local_10 = (_local_10 - ((localY - (((this._scale / 2) - localX) / 2)) / (this._scale / 2))); + } + const _local_11: IVector3D = new Vector3d(_local_8, _local_9, _local_10); + return _local_11; + } + + public getLocationOldFormat(k: number, _arg_2: number, _arg_3: string): IVector3D + { + let _local_4: number; + let _local_5: number; + let _local_6 = 0; + let _local_7 = 0; + _local_5 = Math.ceil(k); + _local_6 = (_local_5 - k); + let _local_8: number; + let _local_9: number; + let _local_11: number; + let _local_12 = 0; + _local_4 = 0; + while(_local_4 < this._width) + { + if(((_local_5 >= 0) && (_local_5 < this._height))) + { + if(this.getHeight(_local_4, _local_5) <= this._floorHeight) + { + _local_8 = (_local_4 - 1); + _local_9 = _local_5; + _local_7 = _local_4; + _arg_3 = LegacyWallGeometry.L; + break; + } + if(this.getHeight(_local_4, (_local_5 + 1)) <= this._floorHeight) + { + _local_8 = _local_4; + _local_9 = _local_5; + _local_7 = (_local_9 - k); + _arg_3 = LegacyWallGeometry.R; + break; + } + } + _local_5++; + _local_4++; + } + const _local_10 = ((this.scale / 2) * _local_6); + let _local_13: number = ((-(_local_7) * this.scale) / 2); + _local_13 = (_local_13 + ((((-(_arg_2) * 18) / 32) * this.scale) / 2)); + _local_12 = this.getHeight(_local_8, _local_9); + _local_11 = (((_local_12 * this.scale) / 2) + _local_13); + if(_arg_3 == LegacyWallGeometry.R) + { + _local_11 = (_local_11 + ((_local_6 * this.scale) / 4)); + } + else + { + _local_11 = (_local_11 + (((1 - _local_6) * this.scale) / 4)); + } + return this.getLocation(_local_8, _local_9, _local_10, _local_11, _arg_3); + } + + public getOldLocation(k: IVector3D, _arg_2: number): [number, number, number, number, string] + { + if(k == null) + { + return null; + } + let _local_3 = 0; + let _local_4 = 0; + let _local_5 = 0; + let _local_6 = 0; + let _local_7 = ''; + let _local_8 = 0; + if(_arg_2 == 90) + { + _local_3 = Math.floor((k.x - 0.5)); + _local_4 = Math.floor((k.y + 0.5)); + _local_8 = this.getHeight(_local_3, _local_4); + _local_5 = ((this._scale / 2) - (((k.y - _local_4) + 0.5) * (this._scale / 2))); + _local_6 = (((_local_8 - k.z) * (this._scale / 2)) + (((this._scale / 2) - _local_5) / 2)); + _local_7 = LegacyWallGeometry.L; + } + else + { + if(_arg_2 == 180) + { + _local_3 = Math.floor((k.x + 0.5)); + _local_4 = Math.floor((k.y - 0.5)); + _local_8 = this.getHeight(_local_3, _local_4); + _local_5 = (((k.x + 0.5) - _local_3) * (this._scale / 2)); + _local_6 = (((_local_8 - k.z) * (this._scale / 2)) + (_local_5 / 2)); + _local_7 = LegacyWallGeometry.R; + } + else + { + return null; + } + } + return [_local_3, _local_4, _local_5, _local_6, _local_7]; + } + + public getOldLocationString(k: IVector3D, _arg_2: number): string + { + const _local_3 = this.getOldLocation(k, _arg_2); + if(_local_3 == null) + { + return null; + } + const _local_4: number = Math.trunc(_local_3[0]); + const _local_5: number = Math.trunc(_local_3[1]); + const _local_6: number = Math.trunc(_local_3[2]); + const _local_7: number = Math.trunc(_local_3[3]); + const _local_8: string = _local_3[4]; + const _local_9: string = (((((((((':w=' + _local_4) + ',') + _local_5) + ' l=') + _local_6) + ',') + _local_7) + ' ') + _local_8); + return _local_9; + } + + public getDirection(k: string): number + { + if(k == LegacyWallGeometry.R) + { + return 180; + } + return 90; + } + + public getFloorAltitude(k: number, _arg_2: number): number + { + const _local_3 = this.getHeight(k, _arg_2); + const _local_4 = (_local_3 + 1); + + return _local_3 + (((((((((Math.trunc(this.getHeight((k - 1), (_arg_2 - 1))) == _local_4) || (Math.trunc(this.getHeight(k, (_arg_2 - 1))) == _local_4)) || (Math.trunc(this.getHeight((k + 1), (_arg_2 - 1))) == _local_4)) || (Math.trunc(this.getHeight((k - 1), _arg_2)) == _local_4)) || (Math.trunc(this.getHeight((k + 1), _arg_2)) == _local_4)) || (Math.trunc(this.getHeight((k - 1), (_arg_2 + 1))) == _local_4)) || (Math.trunc(this.getHeight(k, (_arg_2 + 1))) == _local_4)) || (Math.trunc(this.getHeight((k + 1), (_arg_2 + 1))) == _local_4)) ? 0.5 : 0); + } + + public isRoomTile(k: number, _arg_2: number): boolean + { + return ((((k >= 0) && (k < this._width)) && (_arg_2 >= 0)) && (_arg_2 < this._height)) && (this._heightMap[_arg_2][k] >= 0); + } +} diff --git a/packages/room/src/utils/RoomCamera.ts b/packages/room/src/utils/RoomCamera.ts new file mode 100644 index 0000000..e05c42b --- /dev/null +++ b/packages/room/src/utils/RoomCamera.ts @@ -0,0 +1,288 @@ +import { IVector3D } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; + +export class RoomCamera +{ + private static MOVE_SPEED_DENOMINATOR: number = 12; + + private _targetId: number = -1; + private _targetCategory: number = -2; + private _targetLoc: IVector3D = null; + private _moveDistance: number = 0; + private _previousMoveSpeed: number = 0; + private _maintainPreviousMoveSpeed: boolean = false; + private _currentLoc: IVector3D = null; + private _targetObjectLoc: IVector3D; + private _limitedLocX: boolean = false; + private _limitedLocY: boolean = false; + private _centeredLocX: boolean = false; + private _centeredLocY: boolean = false; + private _screenWd: number = 0; + private _screenHt: number = 0; + private _scale: number = 0; + private _roomWd: number = 0; + private _roomHt: number = 0; + private _geometryUpdateId: number = -1; + private _scaleChanged: boolean = false; + private _followDuration: number; + + constructor() + { + this._targetObjectLoc = new Vector3d(); + } + + public get location(): IVector3D + { + return this._currentLoc; + } + + public get targetId(): number + { + return this._targetId; + } + + public set targetId(k: number) + { + this._targetId = k; + } + + public get targetCategory(): number + { + return this._targetCategory; + } + + public set targetCategory(k: number) + { + this._targetCategory = k; + } + + public get targetObjectLoc(): IVector3D + { + return this._targetObjectLoc; + } + + public set targetObjectLoc(k: IVector3D) + { + this._targetObjectLoc.assign(k); + } + + public get limitedLocationX(): boolean + { + return this._limitedLocX; + } + + public set limitedLocationX(k: boolean) + { + this._limitedLocX = k; + } + + public get limitedLocationY(): boolean + { + return this._limitedLocY; + } + + public set limitedLocationY(k: boolean) + { + this._limitedLocY = k; + } + + public get centeredLocX(): boolean + { + return this._centeredLocX; + } + + public set centeredLocX(k: boolean) + { + this._centeredLocX = k; + } + + public get centeredLocY(): boolean + { + return this._centeredLocY; + } + + public set centeredLocY(k: boolean) + { + this._centeredLocY = k; + } + + public get screenWd(): number + { + return this._screenWd; + } + + public set screenWd(k: number) + { + this._screenWd = k; + } + + public get screenHt(): number + { + return this._screenHt; + } + + public set screenHt(k: number) + { + this._screenHt = k; + } + + public get scale(): number + { + return this._scale; + } + + public set scale(k: number) + { + if(this._scale != k) + { + this._scale = k; + this._scaleChanged = true; + } + } + + public get roomWd(): number + { + return this._roomWd; + } + + public set roomWd(k: number) + { + this._roomWd = k; + } + + public get roomHt(): number + { + return this._roomHt; + } + + public set roomHt(k: number) + { + this._roomHt = k; + } + + public get geometryUpdateId(): number + { + return this._geometryUpdateId; + } + + public set geometryUpdateId(k: number) + { + this._geometryUpdateId = k; + } + + public get isMoving(): boolean + { + if(((!(this._targetLoc == null)) && (!(this._currentLoc == null)))) + { + return true; + } + return false; + } + + public set target(k: IVector3D) + { + let _local_2: IVector3D; + if(this._targetLoc == null) + { + this._targetLoc = new Vector3d(); + } + if((((!(this._targetLoc.x == k.x)) || (!(this._targetLoc.y == k.y))) || (!(this._targetLoc.z == k.z)))) + { + this._targetLoc.assign(k); + _local_2 = Vector3d.dif(this._targetLoc, this._currentLoc); + this._moveDistance = _local_2.length; + this._maintainPreviousMoveSpeed = true; + } + } + + public dispose(): void + { + this._targetLoc = null; + this._currentLoc = null; + } + + public initializeLocation(k: IVector3D): void + { + if(this._currentLoc != null) + { + return; + } + this._currentLoc = new Vector3d(); + this._currentLoc.assign(k); + } + + public resetLocation(k: IVector3D): void + { + if(this._currentLoc == null) + { + this._currentLoc = new Vector3d(); + } + this._currentLoc.assign(k); + } + + public update(k: number, _arg_2: number): void + { + let _local_3: IVector3D; + let _local_4: number; + let _local_5: number; + let _local_6: number; + let _local_7: number; + if((((this._followDuration > 0) && (!(this._targetLoc == null))) && (!(this._currentLoc == null)))) + { + if(this._scaleChanged) + { + this._scaleChanged = false; + this._currentLoc = this._targetLoc; + this._targetLoc = null; + return; + } + _local_3 = Vector3d.dif(this._targetLoc, this._currentLoc); + if(_local_3.length > this._moveDistance) + { + this._moveDistance = _local_3.length; + } + if(_local_3.length <= _arg_2) + { + this._currentLoc = this._targetLoc; + this._targetLoc = null; + this._previousMoveSpeed = 0; + } + else + { + _local_4 = Math.sin(((Math.PI * _local_3.length) / this._moveDistance)); + _local_5 = (_arg_2 * 0.5); + _local_6 = (this._moveDistance / RoomCamera.MOVE_SPEED_DENOMINATOR); + _local_7 = (_local_5 + ((_local_6 - _local_5) * _local_4)); + if(this._maintainPreviousMoveSpeed) + { + if(_local_7 < this._previousMoveSpeed) + { + _local_7 = this._previousMoveSpeed; + if(_local_7 > _local_3.length) + { + _local_7 = _local_3.length; + } + } + else + { + this._maintainPreviousMoveSpeed = false; + } + } + this._previousMoveSpeed = _local_7; + _local_3.divide(_local_3.length); + _local_3.multiply(_local_7); + this._currentLoc = Vector3d.sum(this._currentLoc, _local_3); + } + } + } + + public reset(): void + { + this._geometryUpdateId = -1; + } + + public activateFollowing(k: number): void + { + this._followDuration = k; + } +} diff --git a/packages/room/src/utils/RoomData.ts b/packages/room/src/utils/RoomData.ts new file mode 100644 index 0000000..c3a2629 --- /dev/null +++ b/packages/room/src/utils/RoomData.ts @@ -0,0 +1,59 @@ +import { RoomMapData } from '../object'; + +export class RoomData +{ + private _roomId: number; + private _data: RoomMapData; + private _floorType: string; + private _wallType: string; + private _landscapeType: string; + + constructor(roomId: number, data: RoomMapData) + { + this._roomId = roomId; + this._data = data; + this._floorType = null; + this._wallType = null; + this._landscapeType = null; + } + + public get roomId(): number + { + return this._roomId; + } + + public get data(): RoomMapData + { + return this._data; + } + + public get floorType(): string + { + return this._floorType; + } + + public set floorType(k: string) + { + this._floorType = k; + } + + public get wallType(): string + { + return this._wallType; + } + + public set wallType(k: string) + { + this._wallType = k; + } + + public get landscapeType(): string + { + return this._landscapeType; + } + + public set landscapeType(k: string) + { + this._landscapeType = k; + } +} diff --git a/packages/room/src/utils/RoomEnterEffect.ts b/packages/room/src/utils/RoomEnterEffect.ts new file mode 100644 index 0000000..c2ed7dc --- /dev/null +++ b/packages/room/src/utils/RoomEnterEffect.ts @@ -0,0 +1,78 @@ +import { GetTickerTime } from '@nitrots/utils'; + +export class RoomEnterEffect +{ + public static STATE_NOT_INITIALIZED: number = 0; + public static STATE_START_DELAY: number = 1; + public static STATE_RUNNING: number = 2; + public static STATE_OVER: number = 3; + + private static _state: number = RoomEnterEffect.STATE_NOT_INITIALIZED; + private static _visualizationOn: boolean = false; + private static _currentDelta: number = 0; + private static _initializationTimeMs: number = 0; + private static _startDelayMs: number = (20 * 1000); + private static _effectDurationMs: number = 2000; + + public static init(delay: number, duration: number): void + { + RoomEnterEffect._currentDelta = 0; + RoomEnterEffect._startDelayMs = delay; + RoomEnterEffect._effectDurationMs = duration; + RoomEnterEffect._initializationTimeMs = GetTickerTime(); + RoomEnterEffect._state = RoomEnterEffect.STATE_START_DELAY; + } + + public static turnVisualizationOn(): void + { + if((RoomEnterEffect._state === RoomEnterEffect.STATE_NOT_INITIALIZED) || (RoomEnterEffect._state === RoomEnterEffect.STATE_OVER)) return; + + const k = (GetTickerTime() - RoomEnterEffect._initializationTimeMs); + + if(k > (RoomEnterEffect._startDelayMs + RoomEnterEffect._effectDurationMs)) + { + RoomEnterEffect._state = RoomEnterEffect.STATE_OVER; + + return; + } + + RoomEnterEffect._visualizationOn = true; + + if(k < RoomEnterEffect._startDelayMs) + { + RoomEnterEffect._state = RoomEnterEffect.STATE_START_DELAY; + + return; + } + + RoomEnterEffect._state = RoomEnterEffect.STATE_RUNNING; + RoomEnterEffect._currentDelta = ((k - RoomEnterEffect._startDelayMs) / RoomEnterEffect._effectDurationMs); + } + + public static turnVisualizationOff(): void + { + RoomEnterEffect._visualizationOn = false; + } + + public static isVisualizationOn(): boolean + { + return (RoomEnterEffect._visualizationOn) && (RoomEnterEffect.isRunning()); + } + + public static isRunning(): boolean + { + if((RoomEnterEffect._state === RoomEnterEffect.STATE_START_DELAY) || (RoomEnterEffect._state === RoomEnterEffect.STATE_RUNNING)) return true; + + return false; + } + + public static getDelta(k: number = 0, _arg_2: number = 1): number + { + return Math.min(Math.max(RoomEnterEffect._currentDelta, k), _arg_2); + } + + public static get totalRunningTime(): number + { + return RoomEnterEffect._startDelayMs + RoomEnterEffect._effectDurationMs; + } +} diff --git a/packages/room/src/utils/RoomFurnitureData.ts b/packages/room/src/utils/RoomFurnitureData.ts new file mode 100644 index 0000000..3475406 --- /dev/null +++ b/packages/room/src/utils/RoomFurnitureData.ts @@ -0,0 +1,119 @@ +import { IObjectData, IVector3D } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; + +export class RoomFurnitureData +{ + private _id: number; + private _typeId: number; + private _type: string; + private _location: IVector3D; + private _direction: IVector3D; + private _state: number; + private _data: IObjectData; + private _extra: number; + private _expiryTime: number; + private _usagePolicy: number; + private _ownerId: number; + private _ownerName: string; + private _synchronized: boolean; + private _realRoomObject: boolean; + private _sizeZ: number; + + constructor(id: number, typeId: number, type: string, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra: number = NaN, expires: number = -1, usagePolicy: number = 0, ownerId: number = 0, ownerName: string = '', synchronized: boolean = true, realRoomObject: boolean = true, sizeZ: number = -1) + { + this._id = id; + this._typeId = typeId; + this._type = type; + this._state = state; + this._data = objectData; + this._extra = extra; + this._expiryTime = expires; + this._usagePolicy = usagePolicy; + this._ownerId = ownerId; + this._ownerName = ownerName; + this._synchronized = synchronized; + this._realRoomObject = realRoomObject; + this._sizeZ = sizeZ; + + this._location = new Vector3d(); + this._direction = new Vector3d(); + + this._location.assign(location); + this._direction.assign(direction); + } + + public get id(): number + { + return this._id; + } + + public get typeId(): number + { + return this._typeId; + } + + public get type(): string + { + return this._type; + } + + public get location(): IVector3D + { + return this._location; + } + + public get direction(): IVector3D + { + return this._direction; + } + + public get state(): number + { + return this._state; + } + + public get data(): IObjectData + { + return this._data; + } + + public get extra(): number + { + return this._extra; + } + + public get expiryTime(): number + { + return this._expiryTime; + } + + public get usagePolicy(): number + { + return this._usagePolicy; + } + + public get ownerId(): number + { + return this._ownerId; + } + + public get ownerName(): string + { + return this._ownerName; + } + + public get synchronized(): boolean + { + return this._synchronized; + } + + public get realRoomObject(): boolean + { + return this._realRoomObject; + } + + public get sizeZ(): number + { + return this._sizeZ; + } +} diff --git a/packages/room/src/utils/RoomGeometry.ts b/packages/room/src/utils/RoomGeometry.ts new file mode 100644 index 0000000..b82cad9 --- /dev/null +++ b/packages/room/src/utils/RoomGeometry.ts @@ -0,0 +1,432 @@ +import { IRoomGeometry, IVector3D } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; +import { Point } from 'pixi.js'; + +export class RoomGeometry implements IRoomGeometry +{ + public static SCALE_ZOOMED_IN: number = 64; + public static SCALE_ZOOMED_OUT: number = 32; + + private _updateId: number = 0; + private _x: IVector3D; + private _y: IVector3D; + private _z: IVector3D; + private _directionAxis: IVector3D; + private _location: IVector3D; + private _direction: IVector3D; + private _depth: IVector3D; + private _scale: number = 1; + private _x_scale: number = 1; + private _y_scale: number = 1; + private _z_scale: number = 1; + private _x_scale_internal: number = 1; + private _y_scale_internal: number = 1; + private _z_scale_internal: number = 1; + private _loc: IVector3D; + private _dir: IVector3D; + private _clipNear: number = -500; + private _clipFar: number = 500; + private _displacements: Map = null; + + constructor(scale: number, direction: IVector3D, location: IVector3D, _arg_4: IVector3D = null) + { + this.scale = scale; + this._x = new Vector3d(); + this._y = new Vector3d(); + this._z = new Vector3d(); + this._directionAxis = new Vector3d(); + this._location = new Vector3d(); + this._direction = new Vector3d(); + this._depth = new Vector3d(); + this._x_scale_internal = 1; + this._y_scale_internal = 1; + this.x_scale = 1; + this.y_scale = 1; + this._z_scale_internal = (Math.sqrt((1 / 2)) / Math.sqrt((3 / 4))); + this.z_scale = 1; + this.location = new Vector3d(location.x, location.y, location.z); + this.direction = new Vector3d(direction.x, direction.y, direction.z); + if(_arg_4 != null) + { + this.setDepthVector(_arg_4); + } + else + { + this.setDepthVector(direction); + } + this._displacements = new Map(); + } + + public static getIntersectionVector(k: IVector3D, _arg_2: IVector3D, _arg_3: IVector3D, _arg_4: IVector3D): IVector3D + { + const _local_5: number = Vector3d.dotProduct(_arg_2, _arg_4); + if(Math.abs(_local_5) < 1E-5) + { + return null; + } + const _local_6: IVector3D = Vector3d.dif(k, _arg_3); + const _local_7: number = (-(Vector3d.dotProduct(_arg_4, _local_6)) / _local_5); + const _local_8: IVector3D = Vector3d.sum(k, Vector3d.product(_arg_2, _local_7)); + return _local_8; + } + + + public get updateId(): number + { + return this._updateId; + } + + public get scale(): number + { + return this._scale / Math.sqrt(0.5); + } + + public set scale(scale: number) + { + if(scale <= 1) + { + scale = 1; + } + scale = (scale * Math.sqrt(0.5)); + if(scale != this._scale) + { + this._scale = scale; + this._updateId++; + } + } + + public get directionAxis(): IVector3D + { + return this._directionAxis; + } + + public get location(): IVector3D + { + this._location.assign(this._loc); + this._location.x = (this._location.x * this._x_scale); + this._location.y = (this._location.y * this._y_scale); + this._location.z = (this._location.z * this._z_scale); + return this._location; + } + + public set location(location: IVector3D) + { + if(location == null) + { + return; + } + if(this._loc == null) + { + this._loc = new Vector3d(); + } + const _local_2: number = this._loc.x; + const _local_3: number = this._loc.y; + const _local_4: number = this._loc.z; + this._loc.assign(location); + this._loc.x = (this._loc.x / this._x_scale); + this._loc.y = (this._loc.y / this._y_scale); + this._loc.z = (this._loc.z / this._z_scale); + if((((!(this._loc.x == _local_2)) || (!(this._loc.y == _local_3))) || (!(this._loc.z == _local_4)))) + { + this._updateId++; + } + } + + public get direction(): IVector3D + { + return this._direction; + } + + public set direction(direction: IVector3D) + { + let _local_21: number; + let _local_22: number; + let _local_23: IVector3D; + let _local_24: IVector3D; + let _local_25: IVector3D; + if(direction == null) + { + return; + } + if(this._dir == null) + { + this._dir = new Vector3d(); + } + const _local_2: number = this._dir.x; + const _local_3: number = this._dir.y; + const _local_4: number = this._dir.z; + this._dir.assign(direction); + this._direction.assign(direction); + if((((!(this._dir.x == _local_2)) || (!(this._dir.y == _local_3))) || (!(this._dir.z == _local_4)))) + { + this._updateId++; + } + const _local_5: IVector3D = new Vector3d(0, 1, 0); + const _local_6: IVector3D = new Vector3d(0, 0, 1); + const _local_7: IVector3D = new Vector3d(1, 0, 0); + const _local_8: number = ((direction.x / 180) * Math.PI); + const _local_9: number = ((direction.y / 180) * Math.PI); + const _local_10: number = ((direction.z / 180) * Math.PI); + const _local_11: number = Math.cos(_local_8); + const _local_12: number = Math.sin(_local_8); + const _local_13: IVector3D = Vector3d.sum(Vector3d.product(_local_5, _local_11), Vector3d.product(_local_7, -(_local_12))); + const _local_14: IVector3D = new Vector3d(_local_6.x, _local_6.y, _local_6.z); + const _local_15: IVector3D = Vector3d.sum(Vector3d.product(_local_5, _local_12), Vector3d.product(_local_7, _local_11)); + const _local_16: number = Math.cos(_local_9); + const _local_17: number = Math.sin(_local_9); + const _local_18: IVector3D = new Vector3d(_local_13.x, _local_13.y, _local_13.z); + const _local_19: IVector3D = Vector3d.sum(Vector3d.product(_local_14, _local_16), Vector3d.product(_local_15, _local_17)); + const _local_20: IVector3D = Vector3d.sum(Vector3d.product(_local_14, -(_local_17)), Vector3d.product(_local_15, _local_16)); + if(_local_10 != 0) + { + _local_21 = Math.cos(_local_10); + _local_22 = Math.sin(_local_10); + _local_23 = Vector3d.sum(Vector3d.product(_local_18, _local_21), Vector3d.product(_local_19, _local_22)); + _local_24 = Vector3d.sum(Vector3d.product(_local_18, -(_local_22)), Vector3d.product(_local_19, _local_21)); + _local_25 = new Vector3d(_local_20.x, _local_20.y, _local_20.z); + this._x.assign(_local_23); + this._y.assign(_local_24); + this._z.assign(_local_25); + this._directionAxis.assign(this._z); + } + else + { + this._x.assign(_local_18); + this._y.assign(_local_19); + this._z.assign(_local_20); + this._directionAxis.assign(this._z); + } + } + + public set x_scale(xScale: number) + { + if(this._x_scale != (xScale * this._x_scale_internal)) + { + this._x_scale = (xScale * this._x_scale_internal); + this._updateId++; + } + } + + public set y_scale(yScale: number) + { + if(this._y_scale != (yScale * this._y_scale_internal)) + { + this._y_scale = (yScale * this._y_scale_internal); + this._updateId++; + } + } + + public set z_scale(zScale: number) + { + if(this._z_scale != (zScale * this._z_scale_internal)) + { + this._z_scale = (zScale * this._z_scale_internal); + this._updateId++; + } + } + + public dispose(): void + { + this._x = null; + this._y = null; + this._z = null; + this._loc = null; + this._dir = null; + this._directionAxis = null; + this._location = null; + if(this._displacements != null) + { + this._displacements.clear(); + this._displacements = null; + } + } + + public setDisplacement(k: IVector3D, _arg_2: IVector3D): void + { + let _local_3: string; + let _local_4: IVector3D; + if(((k == null) || (_arg_2 == null))) + { + return; + } + if(this._displacements != null) + { + _local_3 = Math.trunc(Math.round(k.x)) + '_' + Math.trunc(Math.round(k.y)) + '_' + Math.trunc(Math.round(k.z)); + this._displacements.delete(_local_3); + _local_4 = new Vector3d(); + _local_4.assign(_arg_2); + this._displacements.set(_local_3, _local_4); + this._updateId++; + } + } + + private getDisplacenent(k: IVector3D): IVector3D + { + let _local_2: string; + if(this._displacements != null) + { + _local_2 = Math.trunc(Math.round(k.x)) + '_' + Math.trunc(Math.round(k.y)) + '_' + Math.trunc(Math.round(k.z)); + return this._displacements.get(_local_2); + } + return null; + } + + public setDepthVector(k: IVector3D): void + { + let _local_18: number; + let _local_19: number; + let _local_20: IVector3D; + let _local_21: IVector3D; + let _local_22: IVector3D; + const _local_2: IVector3D = new Vector3d(0, 1, 0); + const _local_3: IVector3D = new Vector3d(0, 0, 1); + const _local_4: IVector3D = new Vector3d(1, 0, 0); + const _local_5: number = ((k.x / 180) * Math.PI); + const _local_6: number = ((k.y / 180) * Math.PI); + const _local_7: number = ((k.z / 180) * Math.PI); + const _local_8: number = Math.cos(_local_5); + const _local_9: number = Math.sin(_local_5); + const _local_10: IVector3D = Vector3d.sum(Vector3d.product(_local_2, _local_8), Vector3d.product(_local_4, -(_local_9))); + const _local_11: IVector3D = new Vector3d(_local_3.x, _local_3.y, _local_3.z); + const _local_12: IVector3D = Vector3d.sum(Vector3d.product(_local_2, _local_9), Vector3d.product(_local_4, _local_8)); + const _local_13: number = Math.cos(_local_6); + const _local_14: number = Math.sin(_local_6); + const _local_15: IVector3D = new Vector3d(_local_10.x, _local_10.y, _local_10.z); + const _local_16: IVector3D = Vector3d.sum(Vector3d.product(_local_11, _local_13), Vector3d.product(_local_12, _local_14)); + const _local_17: IVector3D = Vector3d.sum(Vector3d.product(_local_11, -(_local_14)), Vector3d.product(_local_12, _local_13)); + if(_local_7 != 0) + { + _local_18 = Math.cos(_local_7); + _local_19 = Math.sin(_local_7); + _local_20 = Vector3d.sum(Vector3d.product(_local_15, _local_18), Vector3d.product(_local_16, _local_19)); + _local_21 = Vector3d.sum(Vector3d.product(_local_15, -(_local_19)), Vector3d.product(_local_16, _local_18)); + _local_22 = new Vector3d(_local_17.x, _local_17.y, _local_17.z); + this._depth.assign(_local_22); + } + else + { + this._depth.assign(_local_17); + } + this._updateId++; + } + + public adjustLocation(k: IVector3D, _arg_2: number): void + { + if(((k == null) || (this._z == null))) + { + return; + } + const _local_3: IVector3D = Vector3d.product(this._z, -(_arg_2)); + const _local_4: IVector3D = new Vector3d((k.x + _local_3.x), (k.y + _local_3.y), (k.z + _local_3.z)); + this.location = _local_4; + } + + public getCoordinatePosition(k: IVector3D): IVector3D + { + if(k == null) + { + return null; + } + const _local_2: number = Vector3d.scalarProjection(k, this._x); + const _local_3: number = Vector3d.scalarProjection(k, this._y); + const _local_4: number = Vector3d.scalarProjection(k, this._z); + const _local_5: IVector3D = new Vector3d(_local_2, _local_3, _local_4); + return _local_5; + } + + public getScreenPosition(k: IVector3D): IVector3D + { + let _local_2: IVector3D = Vector3d.dif(k, this._loc); + _local_2.x = (_local_2.x * this._x_scale); + _local_2.y = (_local_2.y * this._y_scale); + _local_2.z = (_local_2.z * this._z_scale); + let _local_3: number = Vector3d.scalarProjection(_local_2, this._depth); + if(((_local_3 < this._clipNear) || (_local_3 > this._clipFar))) + { + return null; + } + let _local_4: number = Vector3d.scalarProjection(_local_2, this._x); + let _local_5: number = -(Vector3d.scalarProjection(_local_2, this._y)); + _local_4 = (_local_4 * this._scale); + _local_5 = (_local_5 * this._scale); + const _local_6: IVector3D = this.getDisplacenent(k); + if(_local_6 != null) + { + _local_2 = Vector3d.dif(k, this._loc); + _local_2.add(_local_6); + _local_2.x = (_local_2.x * this._x_scale); + _local_2.y = (_local_2.y * this._y_scale); + _local_2.z = (_local_2.z * this._z_scale); + _local_3 = Vector3d.scalarProjection(_local_2, this._depth); + } + _local_2.x = _local_4; + _local_2.y = _local_5; + _local_2.z = _local_3; + return _local_2; + } + + public getScreenPoint(k: IVector3D): Point + { + const _local_2: IVector3D = this.getScreenPosition(k); + if(_local_2 == null) + { + return null; + } + const _local_3: Point = new Point(_local_2.x, _local_2.y); + return _local_3; + } + + public getPlanePosition(k: Point, _arg_2: IVector3D, _arg_3: IVector3D, _arg_4: IVector3D): Point + { + let _local_15: number; + let _local_16: number; + const _local_5: number = (k.x / this._scale); + const _local_6: number = (-(k.y) / this._scale); + const _local_7: IVector3D = Vector3d.product(this._x, _local_5); + _local_7.add(Vector3d.product(this._y, _local_6)); + const _local_8: IVector3D = new Vector3d((this._loc.x * this._x_scale), (this._loc.y * this._y_scale), (this._loc.z * this._z_scale)); + _local_8.add(_local_7); + const _local_9: IVector3D = this._z; + const _local_10: IVector3D = new Vector3d((_arg_2.x * this._x_scale), (_arg_2.y * this._y_scale), (_arg_2.z * this._z_scale)); + const _local_11: IVector3D = new Vector3d((_arg_3.x * this._x_scale), (_arg_3.y * this._y_scale), (_arg_3.z * this._z_scale)); + const _local_12: IVector3D = new Vector3d((_arg_4.x * this._x_scale), (_arg_4.y * this._y_scale), (_arg_4.z * this._z_scale)); + const _local_13: IVector3D = Vector3d.crossProduct(_local_11, _local_12); + const _local_14: IVector3D = new Vector3d(); + _local_14.assign(RoomGeometry.getIntersectionVector(_local_8, _local_9, _local_10, _local_13)); + if(_local_14 != null) + { + _local_14.subtract(_local_10); + _local_15 = ((Vector3d.scalarProjection(_local_14, _arg_3) / _local_11.length) * _arg_3.length); + _local_16 = ((Vector3d.scalarProjection(_local_14, _arg_4) / _local_12.length) * _arg_4.length); + return new Point(_local_15, _local_16); + } + return null; + } + + public performZoom(): void + { + if(this.isZoomedIn()) + { + this.scale = RoomGeometry.SCALE_ZOOMED_OUT; + } + else + { + this.scale = RoomGeometry.SCALE_ZOOMED_IN; + } + } + + public isZoomedIn(): boolean + { + return this.scale == RoomGeometry.SCALE_ZOOMED_IN; + } + + public performZoomOut(): void + { + this.scale = RoomGeometry.SCALE_ZOOMED_OUT; + } + + public performZoomIn(): void + { + this.scale = RoomGeometry.SCALE_ZOOMED_IN; + } +} diff --git a/packages/room/src/utils/RoomInstanceData.ts b/packages/room/src/utils/RoomInstanceData.ts new file mode 100644 index 0000000..37fd4cb --- /dev/null +++ b/packages/room/src/utils/RoomInstanceData.ts @@ -0,0 +1,234 @@ +import { IFurnitureStackingHeightMap, ILegacyWallGeometry, ISelectedRoomObjectData, ITileObjectMap } from '@nitrots/api'; +import { LegacyWallGeometry } from './LegacyWallGeometry'; +import { RoomCamera } from './RoomCamera'; +import { RoomFurnitureData } from './RoomFurnitureData'; +import { TileObjectMap } from './TileObjectMap'; + +export class RoomInstanceData +{ + private _roomId: number; + + private _modelName: string; + private _legacyGeometry: ILegacyWallGeometry; + private _tileObjectMap: ITileObjectMap; + private _roomCamera: RoomCamera; + private _selectedObject: ISelectedRoomObjectData; + private _placedObject: ISelectedRoomObjectData; + private _furnitureStackingHeightMap: IFurnitureStackingHeightMap; + + private _floorStack: Map; + private _wallStack: Map; + private _mouseButtonCursorOwners: string[]; + + constructor(roomId: number) + { + this._roomId = roomId; + + this._modelName = null; + this._legacyGeometry = new LegacyWallGeometry(); + this._tileObjectMap = null; + this._roomCamera = new RoomCamera(); + this._selectedObject = null; + this._placedObject = null; + this._furnitureStackingHeightMap = null; + + this._floorStack = new Map(); + this._wallStack = new Map(); + this._mouseButtonCursorOwners = []; + } + + public dispose(): void + { + return; + } + + public setModelName(name: string): void + { + this._modelName = name; + } + + public setSelectedObject(data: ISelectedRoomObjectData): void + { + if(this._selectedObject) + { + this._selectedObject.dispose(); + } + + this._selectedObject = data; + } + + public setPlacedObject(data: ISelectedRoomObjectData): void + { + if(this._placedObject) + { + this._placedObject.dispose(); + } + + this._placedObject = data; + } + + public setFurnitureStackingHeightMap(heightMap: IFurnitureStackingHeightMap): void + { + if(this._furnitureStackingHeightMap) this._furnitureStackingHeightMap.dispose(); + + this._furnitureStackingHeightMap = heightMap; + + if(this._tileObjectMap) this._tileObjectMap.dispose(); + + if(this._furnitureStackingHeightMap) + { + this._tileObjectMap = new TileObjectMap(this._furnitureStackingHeightMap.width, this._furnitureStackingHeightMap.height); + } + } + + public addPendingFurnitureFloor(data: RoomFurnitureData): void + { + if(!data) return; + + this._floorStack.delete(data.id); + this._floorStack.set(data.id, data); + } + + public removePendingFunitureFloor(id: number): RoomFurnitureData + { + const existing = this._floorStack.get(id); + + if(!existing) return null; + + this._floorStack.delete(id); + + return existing; + } + + public getPendingFurnitureFloor(id: number): RoomFurnitureData + { + const existing = this._floorStack.get(id); + + if(!existing) return null; + + this._floorStack.delete(id); + + return existing; + } + + public getNextPendingFurnitureFloor(): RoomFurnitureData + { + if(!this._floorStack.size) return null; + + const keys = this._floorStack.keys(); + + return this.getPendingFurnitureFloor(keys.next().value as number); + } + + public addPendingFurnitureWall(data: RoomFurnitureData): void + { + if(!data) return; + + this._wallStack.delete(data.id); + this._wallStack.set(data.id, data); + } + + public removePendingFurnitureWall(id: number): RoomFurnitureData + { + const existing = this._wallStack.get(id); + + if(!existing) return null; + + this._wallStack.delete(id); + + return existing; + } + + public getPendingFurnitureWall(id: number): RoomFurnitureData + { + const existing = this._wallStack.get(id); + + if(!existing) return null; + + this._wallStack.delete(id); + + return existing; + } + + public getNextPendingFurnitureWall(): RoomFurnitureData + { + if(!this._wallStack.size) return null; + + const keys = this._wallStack.keys(); + + return this.getPendingFurnitureWall(keys.next().value as number); + } + + public addButtonMouseCursorOwner(k: string): boolean + { + const _local_2 = this._mouseButtonCursorOwners.indexOf(k); + + if(_local_2 === -1) + { + this._mouseButtonCursorOwners.push(k); + + return true; + } + + return false; + } + + public removeButtonMouseCursorOwner(k: string): boolean + { + const _local_2 = this._mouseButtonCursorOwners.indexOf(k); + + if(_local_2 > -1) + { + this._mouseButtonCursorOwners.splice(_local_2, 1); + + return true; + } + + return false; + } + + public hasButtonMouseCursorOwners(): boolean + { + return this._mouseButtonCursorOwners.length > 0; + } + + public get roomId(): number + { + return this._roomId; + } + + public get modelName(): string + { + return this._modelName; + } + + public get legacyGeometry(): ILegacyWallGeometry + { + return this._legacyGeometry; + } + + public get tileObjectMap(): ITileObjectMap + { + return this._tileObjectMap; + } + + public get roomCamera(): RoomCamera + { + return this._roomCamera; + } + + public get selectedObject(): ISelectedRoomObjectData + { + return this._selectedObject; + } + + public get placedObject(): ISelectedRoomObjectData + { + return this._placedObject; + } + + public get furnitureStackingHeightMap(): IFurnitureStackingHeightMap + { + return this._furnitureStackingHeightMap; + } +} diff --git a/packages/room/src/utils/RoomObjectBadgeImageAssetListener.ts b/packages/room/src/utils/RoomObjectBadgeImageAssetListener.ts new file mode 100644 index 0000000..a7d2de3 --- /dev/null +++ b/packages/room/src/utils/RoomObjectBadgeImageAssetListener.ts @@ -0,0 +1,23 @@ +import { IRoomObjectController } from '@nitrots/api'; + +export class RoomObjectBadgeImageAssetListener +{ + private _object: IRoomObjectController; + private _groupBadge: boolean; + + constructor(object: IRoomObjectController, groupBadge: boolean) + { + this._object = object; + this._groupBadge = groupBadge; + } + + public get object(): IRoomObjectController + { + return this._object; + } + + public get groupBadge(): boolean + { + return this._groupBadge; + } +} diff --git a/packages/room/src/utils/RoomRotatingEffect.ts b/packages/room/src/utils/RoomRotatingEffect.ts new file mode 100644 index 0000000..217859a --- /dev/null +++ b/packages/room/src/utils/RoomRotatingEffect.ts @@ -0,0 +1,75 @@ +import { GetTickerTime } from '@nitrots/utils'; + +export class RoomRotatingEffect +{ + public static STATE_NOT_INITIALIZED: number = 0; + public static STATE_START_DELAY: number = 1; + public static STATE_RUNNING: number = 2; + public static STATE_OVER: number = 3; + + private static _SafeStr_448: number = 0; + private static _SafeStr_4512: boolean = false; + private static _SafeStr_4513: number = 0; + private static _SafeStr_4514: number = 0; + private static _SafeStr_4515: number = 20000; + private static _SafeStr_4516: number = 5000; + private static _SafeStr_4524: ReturnType; + + public static init(_arg_1: number, _arg_2: number): void + { + this._SafeStr_4513 = 0; + this._SafeStr_4515 = _arg_1; + this._SafeStr_4516 = _arg_2; + this._SafeStr_4514 = GetTickerTime(); + this._SafeStr_448 = 1; + } + + public static turnVisualizationOn(): void + { + if((this._SafeStr_448 === 0) || (this._SafeStr_448 === 3)) return; + + if(!this._SafeStr_4524) this._SafeStr_4524 = setTimeout(() => this.turnVisualizationOff(), this._SafeStr_4516); + + const _local_1 = (GetTickerTime() - this._SafeStr_4514); + + if(_local_1 > (this._SafeStr_4515 + this._SafeStr_4516)) + { + this._SafeStr_448 = 3; + + return; + } + + this._SafeStr_4512 = true; + + if(_local_1 < this._SafeStr_4515) + { + this._SafeStr_448 = 1; + + return; + } + + this._SafeStr_448 = 2; + this._SafeStr_4513 = ((_local_1 - this._SafeStr_4515) / this._SafeStr_4516); + } + + public static turnVisualizationOff(): void + { + this._SafeStr_4512 = false; + + clearTimeout(this._SafeStr_4524); + + this._SafeStr_4524 = null; + } + + public static isVisualizationOn(): boolean + { + return (this._SafeStr_4512 && this.isRunning()); + } + + private static isRunning(): boolean + { + if((this._SafeStr_448 === 1) || (this._SafeStr_448 === 2)) return true; + + return false; + } +} diff --git a/packages/room/src/utils/RoomShakingEffect.ts b/packages/room/src/utils/RoomShakingEffect.ts new file mode 100644 index 0000000..b89a64c --- /dev/null +++ b/packages/room/src/utils/RoomShakingEffect.ts @@ -0,0 +1,75 @@ +import { GetTickerTime } from '@nitrots/utils'; + +export class RoomShakingEffect +{ + public static STATE_NOT_INITIALIZED: number = 0; + public static STATE_START_DELAY: number = 1; + public static STATE_RUNNING: number = 2; + public static STATE_OVER: number = 3; + + private static _SafeStr_448: number = 0; + private static _SafeStr_4512: boolean = false; + private static _SafeStr_4513: number; + private static _SafeStr_4514: number = 0; + private static _SafeStr_4515: number = 20000; + private static _SafeStr_4516: number = 5000; + private static _SafeStr_4524: ReturnType; + + public static init(_arg_1: number, _arg_2: number): void + { + this._SafeStr_4513 = 0; + this._SafeStr_4515 = _arg_1; + this._SafeStr_4516 = _arg_2; + this._SafeStr_4514 = GetTickerTime(); + this._SafeStr_448 = 1; + } + + public static turnVisualizationOn(): void + { + if((this._SafeStr_448 === 0) || (this._SafeStr_448 === 3)) return; + + if(!this._SafeStr_4524) this._SafeStr_4524 = setTimeout(() => this.turnVisualizationOff(), this._SafeStr_4516); + + const _local_1 = (GetTickerTime() - this._SafeStr_4514); + + if(_local_1 > (this._SafeStr_4515 + this._SafeStr_4516)) + { + this._SafeStr_448 = 3; + + return; + } + + this._SafeStr_4512 = true; + + if(_local_1 < this._SafeStr_4515) + { + this._SafeStr_448 = 1; + + return; + } + + this._SafeStr_448 = 2; + this._SafeStr_4513 = ((_local_1 - this._SafeStr_4515) / this._SafeStr_4516); + } + + public static turnVisualizationOff(): void + { + this._SafeStr_4512 = false; + + clearTimeout(this._SafeStr_4524); + + this._SafeStr_4524 = null; + } + + public static isVisualizationOn(): boolean + { + return (this._SafeStr_4512 && this.isRunning()); + } + + private static isRunning(): boolean + { + if((this._SafeStr_448 === 1) || (this._SafeStr_448 === 2)) return true; + + return false; + } +} diff --git a/packages/room/src/utils/SelectedRoomObjectData.ts b/packages/room/src/utils/SelectedRoomObjectData.ts new file mode 100644 index 0000000..f88d5b5 --- /dev/null +++ b/packages/room/src/utils/SelectedRoomObjectData.ts @@ -0,0 +1,95 @@ +import { IObjectData, ISelectedRoomObjectData, IVector3D } from '@nitrots/api'; +import { Vector3d } from '@nitrots/utils'; + +export class SelectedRoomObjectData implements ISelectedRoomObjectData +{ + private _id: number = 0; + private _category: number = 0; + private _operation: string = ''; + private _loc: IVector3D = null; + private _dir: IVector3D = null; + private _typeId: number = 0; + private _instanceData: string = null; + private _stuffData: IObjectData = null; + private _state: number = -1; + private _animFrame: number = -1; + private _posture: string = null; + + constructor(id: number, category: number, operation: string, location: IVector3D, direction: IVector3D, typeId: number = 0, instanceData: string = null, stuffData: IObjectData = null, state: number = -1, frameNumber: number = -1, posture: string = null) + { + this._id = id; + this._category = category; + this._operation = operation; + this._loc = new Vector3d(); + this._loc.assign(location); + this._dir = new Vector3d(); + this._dir.assign(direction); + this._typeId = typeId; + this._instanceData = instanceData; + this._stuffData = stuffData; + this._state = state; + this._animFrame = frameNumber; + this._posture = posture; + } + + public get id(): number + { + return this._id; + } + + public get category(): number + { + return this._category; + } + + public get operation(): string + { + return this._operation; + } + + public get loc(): IVector3D + { + return this._loc; + } + + public get dir(): IVector3D + { + return this._dir; + } + + public get typeId(): number + { + return this._typeId; + } + + public get instanceData(): string + { + return this._instanceData; + } + + public get stuffData(): IObjectData + { + return this._stuffData; + } + + public get state(): number + { + return this._state; + } + + public get animFrame(): number + { + return this._animFrame; + } + + public get posture(): string + { + return this._posture; + } + + public dispose(): void + { + this._loc = null; + this._dir = null; + } +} diff --git a/packages/room/src/utils/SpriteDataCollector.ts b/packages/room/src/utils/SpriteDataCollector.ts new file mode 100644 index 0000000..d29996f --- /dev/null +++ b/packages/room/src/utils/SpriteDataCollector.ts @@ -0,0 +1,453 @@ +import { IPlaneDrawingData, IPlaneVisualization, IRoomObjectSpriteVisualization, IRoomPlane, IRoomRenderingCanvas, RoomObjectCategory, RoomObjectSpriteData } from '@nitrots/api'; +import { GetStage, Vector3d } from '@nitrots/utils'; +import { Point, Rectangle } from 'pixi.js'; +import { RoomEngine } from '../RoomEngine'; +import { PlaneDrawingData } from '../object'; + +export class SpriteDataCollector +{ + private static MANNEQUIN_MAGIC_X_OFFSET: number = 1; + private static MANNEQUIN_MAGIC_Y_OFFSET: number = -16; + private static AVATAR_WATER_EFFECT_MAGIC_Y_OFFSET: number = -52; + private static MAX_EXTERNAL_IMAGE_COUNT: number = 30; + + private maxZ: number; + private spriteCount: number = 0; + private externalImageCount: number = 0; + + private static addMannequinSprites(k: RoomObjectSpriteData[], _arg_2: RoomEngine): RoomObjectSpriteData[] + { + const datas: RoomObjectSpriteData[] = []; + + for(const data of k) + { + if(!data) continue; + + if((data.type === 'boutique_mannequin1') && (data.name.indexOf('mannequin_') === 0)) + { + const roomObject = _arg_2.getRoomObject(_arg_2.activeRoomId, data.objectId, RoomObjectCategory.FLOOR); + + if(roomObject) + { + const spriteList = (roomObject.visualization as IRoomObjectSpriteVisualization).getSpriteList(); + + if(spriteList) + { + for(const sprite of spriteList) + { + sprite.x = (sprite.x + ((data.x + (data.width / 2)) + SpriteDataCollector.MANNEQUIN_MAGIC_X_OFFSET)); + sprite.y = (sprite.y + ((data.y + data.height) + SpriteDataCollector.MANNEQUIN_MAGIC_Y_OFFSET)); + sprite.z = (sprite.z + data.z); + datas.push(sprite); + } + } + } + } + else + { + datas.push(data); + } + } + + return datas; + } + + private static sortSpriteDataObjects(k: RoomObjectSpriteData, _arg_2: RoomObjectSpriteData): number + { + if(k.z < _arg_2.z) return 1; + + if(k.z > _arg_2.z) return -1; + + return -1; + } + + private static isSpriteInViewPort(k: RoomObjectSpriteData, _arg_2: Rectangle, _arg_3: IRoomRenderingCanvas): boolean + { + return true; + // var _local_4 = new Rectangle((k.x + _arg_3.screenOffsetX), (k.y + _arg_3.screenOffsetY), k.width, k.height); + // // intersects + // return _local_4.contains(_arg_2.x, _arg_2.y); + } + + private static sortQuadPoints(k: Point, _arg_2: Point, _arg_3: Point, _arg_4: Point): Point[] + { + const points: Point[] = []; + + if(k.x == _arg_2.x) + { + points.push(k, _arg_3, _arg_2, _arg_4); + } + else + { + if(k.x == _arg_3.x) + { + points.push(k, _arg_2, _arg_3, _arg_4); + } + else + { + if((((_arg_2.x < k.x) && (_arg_2.y > k.y)) || ((_arg_2.x > k.x) && (_arg_2.y < k.y)))) + { + points.push(k, _arg_3, _arg_2, _arg_4); + } + else + { + points.push(k, _arg_2, _arg_3, _arg_4); + } + } + } + + if(points[0].x < points[1].x) + { + let _local_6 = points[0]; + + points[0] = points[1]; + points[1] = _local_6; + + _local_6 = points[2]; + + points[2] = points[3]; + points[3] = _local_6; + } + + if(points[0].y < points[2].y) + { + let _local_6 = points[0]; + + points[0] = points[2]; + points[2] = _local_6; + + _local_6 = points[1]; + + points[1] = points[3]; + points[3] = _local_6; + } + + return points; + } + + + public getFurniData(k: Rectangle, _arg_2: IRoomRenderingCanvas, _arg_3: RoomEngine, _arg_4: number): string + { + const _local_5: Object[] = []; + let _local_6 = _arg_2.getSortableSpriteList(); + + const _local_7 = _arg_3.getRoomObjects(_arg_3.activeRoomId, RoomObjectCategory.UNIT); + + for(const _local_8 of _local_7) + { + if(_local_8.id !== _arg_4) + { + const _local_11 = (_local_8.visualization as IRoomObjectSpriteVisualization).getSpriteList(); + + if(_local_11) + { + let _local_12 = 0; + let _local_13 = 0; + + for(const _local_14 of _local_6) + { + if(_local_14.name === ('avatar_' + _local_8.id)) + { + _local_12 = _local_14.z; + _local_13 = ((_local_14.y + _local_14.height) - (_arg_2.geometry.scale / 4)); + + break; + } + } + + const _local_15 = _arg_3.getRoomObjectScreenLocation(_arg_3.activeRoomId, _local_8.id, RoomObjectCategory.UNIT, _arg_2.id); + + if(_local_15) + { + if(_local_13 === 0) _local_13 = _local_15.y; + + for(const _local_16 of _local_11) + { + _local_16.x = (_local_16.x + (_local_15.x - _arg_2.screenOffsetX)); + _local_16.y = (_local_16.y + _local_13); + _local_16.z = (_local_16.z + _local_12); + + if(((_local_16.name.indexOf('h_std_fx29_') === 0) || (_local_16.name.indexOf('h_std_fx185_') === 0))) + { + _local_16.y = (_local_16.y + SpriteDataCollector.AVATAR_WATER_EFFECT_MAGIC_Y_OFFSET); + } + + _local_6.push(_local_16); + } + } + } + } + } + + _local_6 = SpriteDataCollector.addMannequinSprites(_local_6, _arg_3); + _local_6.sort(SpriteDataCollector.sortSpriteDataObjects); + + for(const _local_9 of _local_6) + { + if((((((!(_local_9.name === null)) && (_local_9.name.length > 0)) && (!(_local_9.name.indexOf('tile_cursor_') === 0))) && (SpriteDataCollector.isSpriteInViewPort(_local_9, k, _arg_2))) && ((_arg_4 < 0) || (!(_local_9.objectId == _arg_4))))) + { + _local_5.push(this.getSpriteDataObject(_local_9, k, _arg_2, _arg_3)); + + if(!this.maxZ) this.maxZ = _local_9.z; + + this.spriteCount++; + } + } + + return JSON.stringify(_local_5); + } + + public getRoomRenderingModifiers(k: RoomEngine): string + { + return JSON.stringify(new Object()); + } + + private getSpriteDataObject(k: RoomObjectSpriteData, _arg_2: Rectangle, _arg_3: IRoomRenderingCanvas, _arg_4: RoomEngine): Object + { + let _local_7: string = null; + let _local_9: string[] = []; + + const _local_5: { + name?: string, + x?: number, + y?: number, + z?: number, + alpha?: number, + flipH?: boolean, + skew?: number, + frame?: boolean, + color?: number, + blendMode?: string, + width?: number, + height?: number, + posture?: string + } = {}; + + let _local_6 = k.name; + + if(k.name.indexOf('@') !== -1) + { + _local_9 = k.name.split('@'); + _local_6 = _local_9[0]; + _local_7 = _local_9[1]; + } + + // if(((_local_7) && (k.type))) + // { + // const _local_10 = _arg_4.roomContentLoader.getCollection(k.type); + + // if(_local_10) + // { + // const _local_11 = _local_10.getPalette(_local_7); + + // if (((!(_local_11 == null)) && (!(_local_11.@source == null)))) + // { + // _local_5.paletteSourceName = (_local_11.@source + ''); + // } + // } + // } + + // var _local_8: string = _arg_4.configuration.getProperty('image.library.url'); + // _local_6 = _local_6.replace('%image.library.url%', _local_8); + // if (_local_6.indexOf('%group.badge.url%') != -1) + // { + // _local_12 = _arg_4.configuration.getProperty('group.badge.url'); + // _local_6 = _local_6.replace('%group.badge.url%', ''); + // _local_13 = _local_12.replace('%imagerdata%', _local_6); + // _local_6 = _local_13; + // } + + _local_5.name = _local_6; + _local_5.x = (k.x - _arg_2.x); + _local_5.y = (k.y - _arg_2.y); + _local_5.x = (_local_5.x + _arg_3.screenOffsetX); + _local_5.y = (_local_5.y + _arg_3.screenOffsetY); + _local_5.z = k.z; + + if(k.alpha && (k.alpha.toString() !== '255')) _local_5.alpha = k.alpha; + + if(k.flipH) _local_5.flipH = k.flipH; + + if(k.skew) _local_5.skew = k.skew; + + if(k.frame) _local_5.frame = k.frame; + + if(k.color && (k.color.length > 0)) _local_5.color = parseInt(k.color); + + if(k.blendMode && (k.blendMode !== 'normal')) _local_5.blendMode = k.blendMode; + + if(_local_6.indexOf('http') === 0) + { + _local_5.width = k.width; + _local_5.height = k.height; + + this.externalImageCount++; + + if(this.externalImageCount > SpriteDataCollector.MAX_EXTERNAL_IMAGE_COUNT) _local_5.name = 'box'; + } + + if(k.posture) _local_5.posture = k.posture; + + return _local_5; + } + + private makeBackgroundPlane(k: Rectangle, _arg_2: number, _arg_3: IPlaneDrawingData[]): PlaneDrawingData + { + const _local_4 = new Point(0, 0); + const _local_5 = new Point(k.width, 0); + const _local_6 = new Point(0, k.height); + const _local_7 = new Point(k.width, k.height); + const _local_8 = SpriteDataCollector.sortQuadPoints(_local_4, _local_5, _local_6, _local_7); + + let _local_9 = 0; + + if(_arg_3.length > 0) + { + _local_9 = _arg_3[0].z; + + if(this.maxZ) _local_9 = Math.max(this.maxZ, _local_9); + } + else + { + _local_9 = ((this.maxZ) ? this.maxZ : 0); + } + + _local_9 = (_local_9 + ((this.spriteCount * 1.776104) + (_arg_3.length * 2.31743))); + + const _local_10 = new PlaneDrawingData(null, _arg_2); + + _local_10.cornerPoints = _local_8; + _local_10.z = _local_9; + + return _local_10; + } + + private sortRoomPlanes(k: IRoomPlane[], _arg_2: IRoomRenderingCanvas, _arg_3: RoomEngine): { plane: IRoomPlane, z: number }[] + { + const _local_4: Map = new Map(); + + let _local_5 = 1; + + if(this.maxZ) + { + _local_5 = (_local_5 + this.maxZ); + } + + for(const _local_6 of k) + { + const _local_10 = { + plane: _local_6, + z: _local_5 + }; + + _local_4.set(_local_6.uniqueId, _local_10); + } + + const sprites = _arg_2.getPlaneSortableSprites(); + + sprites.sort((a, b) => + { + return (b.z - a.z); + }); + + sprites.reverse(); + + let _local_8: { plane: IRoomPlane, z: number }[] = []; + + for(const sprite of sprites) + { + const objectSprite = sprite.sprite; + + if(objectSprite) + { + const _local_10 = _local_4.get(objectSprite.id); + + if(_local_10) + { + _local_4.delete(objectSprite.id); + + _local_10.z = sprite.z; + + _local_8.push(_local_10); + } + } + } + + _local_8 = _local_8.concat(Array.from(_local_4.values())); + + return _local_8; + } + + public getRoomPlanes(k: Rectangle, _arg_2: IRoomRenderingCanvas, _arg_3: RoomEngine, _arg_4: number): IPlaneDrawingData[] + { + const _local_5: IPlaneDrawingData[] = []; + + const roomObject = _arg_3.getRoomObject(_arg_3.activeRoomId, RoomEngine.ROOM_OBJECT_ID, RoomObjectCategory.ROOM); + const visualization = (roomObject.visualization as unknown as IPlaneVisualization); + + if(visualization) + { + const _local_8 = _arg_2.geometry; + const _local_9 = this.sortRoomPlanes(visualization.planes, _arg_2, _arg_3); + const _local_10 = GetStage(); + + for(const _local_11 of _local_9) + { + const _local_12 = _local_11.plane; + const _local_13: Point[] = []; + + const _local_14 = Vector3d.sum(_local_12.location, _local_12.leftSide); + const _local_15 = _local_8.getScreenPoint(_local_12.location); + const _local_16 = _local_8.getScreenPoint(_local_14); + const _local_17 = _local_8.getScreenPoint(Vector3d.sum(_local_12.location, _local_12.rightSide)); + const _local_18 = _local_8.getScreenPoint(Vector3d.sum(_local_14, _local_12.rightSide)); + + _local_13.push(_local_15, _local_16, _local_17, _local_18); + + let _local_19 = 0; + let _local_20 = 0; + + for(const _local_21 of _local_13) + { + _local_21.x += (_local_10.width / 2); + _local_21.y += (_local_10.height / 2); + + _local_21.x += _arg_2.screenOffsetX; + _local_21.y += _arg_2.screenOffsetY; + + _local_21.x += -(k.x); + _local_21.y += -(k.y); + + if(_local_21.x < 0) _local_19--; + + else if(_local_21.x >= k.width) _local_19++; + + if(_local_21.y < 0) _local_20--; + + else if(_local_21.y >= k.height) _local_20++; + } + + if(((Math.abs(_local_19) === 4) || (Math.abs(_local_20) === 4))) + { + // + } + else + { + const _local_22 = SpriteDataCollector.sortQuadPoints(_local_15, _local_16, _local_17, _local_18); + + /* for(const _local_23 of _local_12.getDrawingDatas(_local_8)) + { + _local_23.cornerPoints = _local_22; + _local_23.z = _local_11.z; + + _local_5.push(_local_23); + } */ + } + } + + _local_5.unshift(this.makeBackgroundPlane(k, _arg_4, _local_5)); + } + + return _local_5; + } +} diff --git a/packages/room/src/utils/TileObjectMap.ts b/packages/room/src/utils/TileObjectMap.ts new file mode 100644 index 0000000..5c7ae89 --- /dev/null +++ b/packages/room/src/utils/TileObjectMap.ts @@ -0,0 +1,122 @@ +import { IRoomObject, ITileObjectMap, RoomObjectVariable } from '@nitrots/api'; +import { NitroLogger } from '@nitrots/utils'; + +export class TileObjectMap implements ITileObjectMap +{ + private _tileObjectMap: Map>; + private _width: number; + private _height: number; + + constructor(k: number, _arg_2: number) + { + this._tileObjectMap = new Map(); + + let index = 0; + + while(index < _arg_2) + { + this._tileObjectMap.set(index, new Map()); + + index++; + } + + this._width = k; + this._height = _arg_2; + } + + public clear(): void + { + for(const k of this._tileObjectMap.values()) + { + if(!k) continue; + + k.clear(); + } + + this._tileObjectMap.clear(); + } + + public populate(k: IRoomObject[]): void + { + this.clear(); + + for(const _local_2 of k) this.addRoomObject(_local_2); + } + + public dispose(): void + { + this._tileObjectMap = null; + this._width = 0; + this._height = 0; + } + + public getObjectIntTile(k: number, _arg_2: number): IRoomObject + { + if((((k >= 0) && (k < this._width)) && (_arg_2 >= 0)) && (_arg_2 < this._height)) + { + const existing = this._tileObjectMap.get(_arg_2); + + if(existing) return existing.get(k); + } + + return null; + } + + public setObjectInTile(k: number, _arg_2: number, _arg_3: IRoomObject): void + { + if(!_arg_3.isReady) + { + NitroLogger.log('Assigning non initialized object to tile object map!'); + + return; + } + + if((((k >= 0) && (k < this._width)) && (_arg_2 >= 0)) && (_arg_2 < this._height)) + { + const existing = this._tileObjectMap.get(_arg_2); + + if(existing) existing.set(k, _arg_3); + } + } + + public addRoomObject(k: IRoomObject): void + { + if(!k || !k.model || !k.isReady) return; + + const location = k.getLocation(); + const direction = k.getDirection(); + + if(!location || !direction) return; + + let sizeX = k.model.getValue(RoomObjectVariable.FURNITURE_SIZE_X); + let sizeY = k.model.getValue(RoomObjectVariable.FURNITURE_SIZE_Y); + + if(sizeX < 1) sizeX = 1; + if(sizeY < 1) sizeY = 1; + + const directionNumber = ((Math.trunc((direction.x + 45)) % 360) / 90); + + if((directionNumber === 1) || (directionNumber === 3)) [sizeX, sizeY] = [sizeY, sizeX]; + + let y = location.y; + + while(y < (location.y + sizeY)) + { + let x = location.x; + + while(x < (location.x + sizeX)) + { + const roomObject = this.getObjectIntTile(x, y); + + if((!(roomObject)) || ((!(roomObject === k)) && (roomObject.getLocation().z <= location.z))) + { + this.setObjectInTile(x, y, k); + } + + x++; + } + + y++; + } + } +} diff --git a/packages/room/src/utils/index.ts b/packages/room/src/utils/index.ts new file mode 100644 index 0000000..3b335e5 --- /dev/null +++ b/packages/room/src/utils/index.ts @@ -0,0 +1,14 @@ +export * from './FurnitureStackingHeightMap'; +export * from './LegacyWallGeometry'; +export * from './RoomCamera'; +export * from './RoomData'; +export * from './RoomEnterEffect'; +export * from './RoomFurnitureData'; +export * from './RoomGeometry'; +export * from './RoomInstanceData'; +export * from './RoomObjectBadgeImageAssetListener'; +export * from './RoomRotatingEffect'; +export * from './RoomShakingEffect'; +export * from './SelectedRoomObjectData'; +export * from './SpriteDataCollector'; +export * from './TileObjectMap'; diff --git a/packages/room/tsconfig.json b/packages/room/tsconfig.json new file mode 100644 index 0000000..5e8757d --- /dev/null +++ b/packages/room/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./src", + "outDir": "./dist", + "sourceMap": false, + "declaration": true, + "experimentalDecorators": true, + "moduleResolution": "Node", + "esModuleInterop": true, + "importHelpers": true, + "isolatedModules": true, + "resolveJsonModule": true, + "downlevelIteration": true, + "allowSyntheticDefaultImports": true, + "allowJs": true, + "skipLibCheck": true, + "noEmit": true, + "strict": false, + "strictNullChecks": false, + "target": "ES6", + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "module": "ES6" + }, + "include": [ + "src" ] +} diff --git a/packages/session/.eslintrc.json b/packages/session/.eslintrc.json new file mode 100644 index 0000000..ad92133 --- /dev/null +++ b/packages/session/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": [ "@nitrots/eslint-config" ] +} diff --git a/packages/session/.gitignore b/packages/session/.gitignore new file mode 100644 index 0000000..1413af9 --- /dev/null +++ b/packages/session/.gitignore @@ -0,0 +1,51 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings +.git + +# System Files +.DS_Store +Thumbs.db + +*.zip +*.as +*.bin diff --git a/packages/session/index.ts b/packages/session/index.ts new file mode 100644 index 0000000..8420b10 --- /dev/null +++ b/packages/session/index.ts @@ -0,0 +1 @@ +export * from './src'; diff --git a/packages/session/package.json b/packages/session/package.json new file mode 100644 index 0000000..65b6d7f --- /dev/null +++ b/packages/session/package.json @@ -0,0 +1,25 @@ +{ + "name": "@nitrots/session", + "description": "Nitro session module", + "version": "1.0.0", + "type": "module", + "license": "GPL-3.0", + "scripts": { + "compile": "tsc --project ./tsconfig.json --noEmit false", + "eslint": "eslint ./src --fix" + }, + "main": "./index", + "dependencies": { + "@nitrots/api": "1.0.0", + "@nitrots/assets": "1.0.0", + "@nitrots/communication": "1.0.0", + "@nitrots/configuration": "1.0.0", + "@nitrots/eslint-config": "1.0.0", + "@nitrots/events": "1.0.0", + "@nitrots/localization": "1.0.0", + "pixi.js": "^8.0.4" + }, + "devDependencies": { + "typescript": "~5.4.2" + } +} diff --git a/packages/session/src/GetRoomSessionManager.ts b/packages/session/src/GetRoomSessionManager.ts new file mode 100644 index 0000000..63ea5fa --- /dev/null +++ b/packages/session/src/GetRoomSessionManager.ts @@ -0,0 +1,5 @@ +import { RoomSessionManager } from './RoomSessionManager'; + +const roomSessionManager = new RoomSessionManager(); + +export const GetRoomSessionManager = () => roomSessionManager; diff --git a/packages/session/src/GetSessionDataManager.ts b/packages/session/src/GetSessionDataManager.ts new file mode 100644 index 0000000..e0a4aab --- /dev/null +++ b/packages/session/src/GetSessionDataManager.ts @@ -0,0 +1,5 @@ +import { SessionDataManager } from './SessionDataManager'; + +const sessionDataManager = new SessionDataManager(); + +export const GetSessionDataManager = () => sessionDataManager; diff --git a/packages/session/src/GroupInformationManager.ts b/packages/session/src/GroupInformationManager.ts new file mode 100644 index 0000000..fe93aeb --- /dev/null +++ b/packages/session/src/GroupInformationManager.ts @@ -0,0 +1,30 @@ +import { IGroupInformationManager } from '@nitrots/api'; +import { GetCommunication, GetHabboGroupBadgesMessageComposer, HabboGroupBadgesMessageEvent, RoomReadyMessageEvent } from '@nitrots/communication'; + +export class GroupInformationManager implements IGroupInformationManager +{ + private _groupBadges: Map = new Map(); + + public init(): void + { + GetCommunication().registerMessageEvent(new RoomReadyMessageEvent(this.onRoomReadyMessageEvent.bind(this))); + GetCommunication().registerMessageEvent(new HabboGroupBadgesMessageEvent(this.onGroupBadgesEvent.bind(this))); + } + + private onRoomReadyMessageEvent(event: RoomReadyMessageEvent): void + { + GetCommunication().connection.send(new GetHabboGroupBadgesMessageComposer()); + } + + private onGroupBadgesEvent(event: HabboGroupBadgesMessageEvent): void + { + const parser = event.getParser(); + + for(const [groupId, badgeId] of parser.badges.entries()) this._groupBadges.set(groupId, badgeId); + } + + public getGroupBadge(groupId: number): string + { + return this._groupBadges.get(groupId) ?? ''; + } +} diff --git a/packages/session/src/HabboClubLevelEnum.ts b/packages/session/src/HabboClubLevelEnum.ts new file mode 100644 index 0000000..3986c8e --- /dev/null +++ b/packages/session/src/HabboClubLevelEnum.ts @@ -0,0 +1,6 @@ +export class HabboClubLevelEnum +{ + public static NO_CLUB: number = 0; + public static CLUB: number = 1; + public static VIP: number = 2; +} diff --git a/packages/session/src/IgnoredUsersManager.ts b/packages/session/src/IgnoredUsersManager.ts new file mode 100644 index 0000000..77f1cd0 --- /dev/null +++ b/packages/session/src/IgnoredUsersManager.ts @@ -0,0 +1,88 @@ +import { IIgnoredUsersManager } from '@nitrots/api'; +import { GetCommunication, GetIgnoredUsersComposer, IgnoreResultEvent, IgnoreUserComposer, IgnoreUserIdComposer, IgnoredUsersEvent, UnignoreUserComposer } from '@nitrots/communication'; + +export class IgnoredUsersManager implements IIgnoredUsersManager +{ + private _ignoredUsers: string[] = []; + + public init(): void + { + GetCommunication().registerMessageEvent(new IgnoredUsersEvent(this.onIgnoredUsersEvent.bind(this))); + GetCommunication().registerMessageEvent(new IgnoreResultEvent(this.onIgnoreResultEvent.bind(this))); + } + + public requestIgnoredUsers(username: string): void + { + GetCommunication().connection.send(new GetIgnoredUsersComposer(username)); + } + + private onIgnoredUsersEvent(event: IgnoredUsersEvent): void + { + if(!event) return; + + const parser = event.getParser(); + + if(!parser) return; + + this._ignoredUsers = parser.ignoredUsers; + } + + private onIgnoreResultEvent(event: IgnoreResultEvent): void + { + if(!event) return; + + const parser = event.getParser(); + + if(!parser) return; + + const name = parser.name; + + switch(parser.result) + { + case 0: + return; + case 1: + this.addUserToIgnoreList(name); + return; + case 2: + this.addUserToIgnoreList(name); + this._ignoredUsers.shift(); + return; + case 3: + this.removeUserFromIgnoreList(name); + return; + } + } + + private addUserToIgnoreList(name: string): void + { + if(this._ignoredUsers.indexOf(name) < 0) this._ignoredUsers.push(name); + } + + private removeUserFromIgnoreList(name: string): void + { + const index = this._ignoredUsers.indexOf(name); + + if(index >= 0) this._ignoredUsers.splice(index, 1); + } + + public ignoreUserId(id: number): void + { + GetCommunication().connection.send(new IgnoreUserIdComposer(id)); + } + + public ignoreUser(name: string): void + { + GetCommunication().connection.send(new IgnoreUserComposer(name)); + } + + public unignoreUser(name: string): void + { + GetCommunication().connection.send(new UnignoreUserComposer(name)); + } + + public isIgnored(name: string): boolean + { + return (this._ignoredUsers.indexOf(name) >= 0); + } +} diff --git a/packages/session/src/RoomPetData.ts b/packages/session/src/RoomPetData.ts new file mode 100644 index 0000000..3cf720d --- /dev/null +++ b/packages/session/src/RoomPetData.ts @@ -0,0 +1,297 @@ +import { IRoomPetData } from '@nitrots/api'; + +export class RoomPetData implements IRoomPetData +{ + private _id: number; + private _level: number; + private _maximumLevel: number; + private _experience: number; + private _levelExperienceGoal: number; + private _energy: number; + private _maximumEnergy: number; + private _happyness: number; + private _maximumHappyness: number; + private _ownerId: number; + private _ownerName: string; + private _respect: number; + private _age: number; + private _unknownRarity: number; + private _saddle: boolean; + private _rider: boolean; + private _breedable: boolean; + private _skillThresholds: number[]; + private _publiclyRideable: number; + private _fullyGrown: boolean; + private _dead: boolean; + private _maximumTimeToLive: number; + private _remainingTimeToLive: number; + private _remainingGrowTime: number; + private _rarityLevel: number; + private _publiclyBreedable: boolean; + private _adultLevel: number = 7; + + public get id(): number + { + return this._id; + } + + public set id(k: number) + { + this._id = k; + } + + public get level(): number + { + return this._level; + } + + public set level(level: number) + { + this._level = level; + } + + public get maximumLevel(): number + { + return this._maximumLevel; + } + + public set maximumLevel(k: number) + { + this._maximumLevel = k; + } + + public get experience(): number + { + return this._experience; + } + + public set experience(experience: number) + { + this._experience = experience; + } + + public get levelExperienceGoal(): number + { + return this._levelExperienceGoal; + } + + public set levelExperienceGoal(k: number) + { + this._levelExperienceGoal = k; + } + + public get energy(): number + { + return this._energy; + } + + public set energy(energy: number) + { + this._energy = energy; + } + + public get maximumEnergy(): number + { + return this._maximumEnergy; + } + + public set maximumEnergy(k: number) + { + this._maximumEnergy = k; + } + + public get happyness(): number + { + return this._happyness; + } + + public set happyness(k: number) + { + this._happyness = k; + } + + public get maximumHappyness(): number + { + return this._maximumHappyness; + } + + public set maximumHappyness(k: number) + { + this._maximumHappyness = k; + } + + public get ownerId(): number + { + return this._ownerId; + } + + public set ownerId(k: number) + { + this._ownerId = k; + } + + public get ownerName(): string + { + return this._ownerName; + } + + public set ownerName(ownerName: string) + { + this._ownerName = ownerName; + } + + public get respect(): number + { + return this._respect; + } + + public set respect(k: number) + { + this._respect = k; + } + + public get age(): number + { + return this._age; + } + + public set age(age: number) + { + this._age = age; + } + + public get unknownRarity(): number + { + return this._unknownRarity; + } + + public set unknownRarity(k: number) + { + this._unknownRarity = k; + } + + public get saddle(): boolean + { + return this._saddle; + } + + public set saddle(k: boolean) + { + this._saddle = k; + } + + public get rider(): boolean + { + return this._rider; + } + + public set rider(k: boolean) + { + this._rider = k; + } + + public get skillTresholds(): number[] + { + return this._skillThresholds; + } + + public set skillTresholds(k: number[]) + { + this._skillThresholds = k; + } + + public get publiclyRideable(): number + { + return this._publiclyRideable; + } + + public set publiclyRideable(k: number) + { + this._publiclyRideable = k; + } + + public get breedable(): boolean + { + return this._breedable; + } + + public set breedable(k: boolean) + { + this._breedable = k; + } + + public get fullyGrown(): boolean + { + return this._fullyGrown; + } + + public set fullyGrown(k: boolean) + { + this._fullyGrown = k; + } + + public get dead(): boolean + { + return this._dead; + } + + public set dead(k: boolean) + { + this._dead = k; + } + + public get rarityLevel(): number + { + return this._rarityLevel; + } + + public set rarityLevel(rarityLevel: number) + { + this._rarityLevel = rarityLevel; + } + + public get maximumTimeToLive(): number + { + return this._maximumTimeToLive; + } + + public set maximumTimeToLive(k: number) + { + this._maximumTimeToLive = k; + } + + public get remainingTimeToLive(): number + { + return this._remainingTimeToLive; + } + + public set remainingTimeToLive(k: number) + { + this._remainingTimeToLive = k; + } + + public get remainingGrowTime(): number + { + return this._remainingGrowTime; + } + + public set remainingGrowTime(k: number) + { + this._remainingGrowTime = k; + } + + public get publiclyBreedable(): boolean + { + return this._publiclyBreedable; + } + + public set publiclyBreedable(k: boolean) + { + this._publiclyBreedable = k; + } + + public get adultLevel(): number + { + return this._adultLevel; + } +} diff --git a/packages/session/src/RoomSession.ts b/packages/session/src/RoomSession.ts new file mode 100644 index 0000000..2b4e2c9 --- /dev/null +++ b/packages/session/src/RoomSession.ts @@ -0,0 +1,413 @@ +import { IRoomSession, IUserDataManager, RoomControllerLevel, RoomTradingLevelEnum } from '@nitrots/api'; +import { BotRemoveComposer, ChangeQueueMessageComposer, CompostPlantMessageComposer, FurnitureMultiStateComposer, GetCommunication, GetPetCommandsComposer, HarvestPetMessageComposer, MoodlightSettingsComposer, MoodlightSettingsSaveComposer, MoodlightTogggleStateComposer, NewUserExperienceScriptProceedComposer, OpenPetPackageMessageComposer, OpenPresentComposer, PeerUsersClassificationMessageComposer, PetMountComposer, PetRemoveComposer, PollAnswerComposer, PollRejectComposer, PollStartComposer, RemovePetSaddleComposer, RoomAmbassadorAlertComposer, RoomBanUserComposer, RoomDoorbellAccessComposer, RoomEnterComposer, RoomGiveRightsComposer, RoomKickUserComposer, RoomModerationSettings, RoomMuteUserComposer, RoomTakeRightsComposer, RoomUnitActionComposer, RoomUnitChatComposer, RoomUnitChatShoutComposer, RoomUnitChatWhisperComposer, RoomUnitDanceComposer, RoomUnitPostureComposer, RoomUnitSignComposer, RoomUnitTypingStartComposer, RoomUnitTypingStopComposer, RoomUsersClassificationMessageComposer, SetClothingChangeDataMessageComposer, TogglePetBreedingComposer, TogglePetRidingComposer, UsePetProductComposer, UserMottoComposer, VotePollCounterMessageComposer } from '@nitrots/communication'; +import { RoomSessionEvent } from '@nitrots/events'; +import { UserDataManager } from './UserDataManager'; + +export class RoomSession implements IRoomSession +{ + private _userData: IUserDataManager = new UserDataManager(); + + private _roomId: number = 0; + private _password: string = null; + private _state: string = RoomSessionEvent.CREATED; + private _tradeMode: number = RoomTradingLevelEnum.NO_TRADING; + private _doorMode: number = 0; + private _allowPets: boolean = false; + private _controllerLevel: number = RoomControllerLevel.NONE; + private _ownRoomIndex: number = -1; + private _isGuildRoom: boolean = false; + private _isRoomOwner: boolean = false; + private _isDecorating: boolean = false; + private _isSpectator: boolean = false; + + private _moderationSettings: RoomModerationSettings = null; + + public setControllerLevel(level: number): void + { + if((level >= RoomControllerLevel.NONE) && (level <= RoomControllerLevel.MODERATOR)) + { + this._controllerLevel = level; + + return; + } + + this._controllerLevel = RoomControllerLevel.NONE; + } + + public setOwnRoomIndex(roomIndex: number): void + { + this._ownRoomIndex = roomIndex; + } + + public setRoomOwner(): void + { + this._isRoomOwner = true; + } + + public start(): boolean + { + if(this._state !== RoomSessionEvent.CREATED || !GetCommunication().connection) return false; + + this._state = RoomSessionEvent.STARTED; + + return this.enterRoom(); + } + + private enterRoom(): boolean + { + if(!GetCommunication().connection) return false; + + GetCommunication().connection.send(new RoomEnterComposer(this._roomId, this._password)); + + return true; + } + + public reset(roomId: number): void + { + if(roomId === this._roomId) return; + + this._roomId = roomId; + } + + public sendChatMessage(text: string, styleId: number): void + { + GetCommunication().connection.send(new RoomUnitChatComposer(text, styleId)); + } + + public sendShoutMessage(text: string, styleId: number): void + { + GetCommunication().connection.send(new RoomUnitChatShoutComposer(text, styleId)); + } + + public sendWhisperMessage(recipientName: string, text: string, styleId: number): void + { + GetCommunication().connection.send(new RoomUnitChatWhisperComposer(recipientName, text, styleId)); + } + + public sendChatTypingMessage(isTyping: boolean): void + { + if(isTyping) GetCommunication().connection.send(new RoomUnitTypingStartComposer()); + else GetCommunication().connection.send(new RoomUnitTypingStopComposer()); + } + + public sendMottoMessage(motto: string): void + { + GetCommunication().connection.send(new UserMottoComposer(motto)); + } + + public sendDanceMessage(danceId: number): void + { + GetCommunication().connection.send(new RoomUnitDanceComposer(danceId)); + } + + public sendExpressionMessage(expression: number): void + { + GetCommunication().connection.send(new RoomUnitActionComposer(expression)); + } + + public sendSignMessage(sign: number): void + { + if((sign < 0) || (sign > 17)) return; + + GetCommunication().connection.send(new RoomUnitSignComposer(sign)); + } + + public sendPostureMessage(posture: number): void + { + GetCommunication().connection.send(new RoomUnitPostureComposer(posture)); + } + + public sendDoorbellApprovalMessage(userName: string, flag: boolean): void + { + GetCommunication().connection.send(new RoomDoorbellAccessComposer(userName, flag)); + } + + public sendAmbassadorAlertMessage(userId: number): void + { + GetCommunication().connection.send(new RoomAmbassadorAlertComposer(userId)); + } + + public sendKickMessage(userId: number): void + { + GetCommunication().connection.send(new RoomKickUserComposer(userId)); + } + + public sendMuteMessage(userId: number, minutes: number): void + { + GetCommunication().connection.send(new RoomMuteUserComposer(userId, minutes, this._roomId)); + } + + public sendBanMessage(userId: number, type: string): void + { + GetCommunication().connection.send(new RoomBanUserComposer(userId, this._roomId, type)); + } + + public sendGiveRightsMessage(userId: number): void + { + GetCommunication().connection.send(new RoomGiveRightsComposer(userId)); + } + + public sendTakeRightsMessage(userId: number): void + { + GetCommunication().connection.send(new RoomTakeRightsComposer(userId)); + } + + public sendPollStartMessage(pollId: number): void + { + GetCommunication().connection.send(new PollStartComposer(pollId)); + } + + public sendPollRejectMessage(pollId: number): void + { + GetCommunication().connection.send(new PollRejectComposer(pollId)); + } + + public sendPollAnswerMessage(pollId: number, questionId: number, answers: string[]): void + { + GetCommunication().connection.send(new PollAnswerComposer(pollId, questionId, answers)); + } + + public sendPeerUsersClassificationMessage(userClassType: string): void + { + GetCommunication().connection.send(new PeerUsersClassificationMessageComposer(userClassType)); + } + + public sendOpenPetPackageMessage(objectId: number, petName: string): void + { + GetCommunication().connection.send(new OpenPetPackageMessageComposer(objectId, petName)); + } + + public sendRoomUsersClassificationMessage(userClassType: string): void + { + GetCommunication().connection.send(new RoomUsersClassificationMessageComposer(userClassType)); + } + + public updateMoodlightData(id: number, effectId: number, color: number, brightness: number, apply: boolean): void + { + let colorString = '000000' + color.toString(16).toUpperCase(); + colorString = '#' + colorString.substring((colorString.length - 6)); + + GetCommunication().connection.send(new MoodlightSettingsSaveComposer(id, effectId, colorString, brightness, apply)); + } + + public toggleMoodlightState(): void + { + GetCommunication().connection.send(new MoodlightTogggleStateComposer()); + } + + public pickupPet(id: number): void + { + if(!GetCommunication().connection) return; + + GetCommunication().connection.send(new PetRemoveComposer(id)); + } + + public pickupBot(id: number): void + { + if(!GetCommunication().connection) return; + + GetCommunication().connection.send(new BotRemoveComposer(id)); + } + + public requestMoodlightSettings(): void + { + if(!GetCommunication().connection) return; + + GetCommunication().connection.send(new MoodlightSettingsComposer()); + } + + public openGift(objectId: number): void + { + GetCommunication().connection.send(new OpenPresentComposer(objectId)); + } + + public mountPet(id: number): void + { + GetCommunication().connection.send(new PetMountComposer(id, true)); + } + + public dismountPet(id: number): void + { + GetCommunication().connection.send(new PetMountComposer(id, false)); + } + + public usePetProduct(itemId: number, petId: number): void + { + GetCommunication().connection.send(new UsePetProductComposer(itemId, petId)); + } + + public removePetSaddle(id: number): void + { + GetCommunication().connection.send(new RemovePetSaddleComposer(id)); + } + + public togglePetBreeding(id: number): void + { + GetCommunication().connection.send(new TogglePetBreedingComposer(id)); + } + + public togglePetRiding(id: number): void + { + GetCommunication().connection.send(new TogglePetRidingComposer(id)); + } + + public useMultistateItem(id: number): void + { + GetCommunication().connection.send(new FurnitureMultiStateComposer(id)); + } + + public harvestPet(id: number): void + { + GetCommunication().connection.send(new HarvestPetMessageComposer(id)); + } + + public compostPlant(id: number): void + { + GetCommunication().connection.send(new CompostPlantMessageComposer(id)); + } + + public requestPetCommands(id: number):void + { + GetCommunication().connection.send(new GetPetCommandsComposer(id)); + } + + public sendScriptProceed(): void + { + GetCommunication().connection.send(new NewUserExperienceScriptProceedComposer()); + } + + public sendUpdateClothingChangeFurniture(objectId: number, gender: string, look: string):void + { + GetCommunication().connection.send(new SetClothingChangeDataMessageComposer(objectId, gender, look)); + } + + public changeQueue(targetQueue: number): void + { + GetCommunication().connection.send(new ChangeQueueMessageComposer(targetQueue)); + } + + public votePoll(counter: number): void + { + GetCommunication().connection.send(new VotePollCounterMessageComposer(counter)); + } + + public get userDataManager(): IUserDataManager + { + return this._userData; + } + + public get roomId(): number + { + return this._roomId; + } + + public set roomId(roomId: number) + { + this._roomId = roomId; + } + + public get password(): string + { + return this._password; + } + + public set password(password: string) + { + this._password = password; + } + + public get state(): string + { + return this._state; + } + + public get isPrivateRoom(): boolean + { + return true; + } + + public get tradeMode(): number + { + return this._tradeMode; + } + + public set tradeMode(mode: number) + { + this._tradeMode = mode; + } + + public get doorMode(): number + { + return this._doorMode; + } + + public set doorMode(mode: number) + { + this._doorMode = mode; + } + + public get allowPets(): boolean + { + return this._allowPets; + } + + public set allowPets(flag: boolean) + { + this._allowPets = flag; + } + + public get controllerLevel(): number + { + return this._controllerLevel; + } + + public get ownRoomIndex(): number + { + return this._ownRoomIndex; + } + + public get isGuildRoom(): boolean + { + return this._isGuildRoom; + } + + public set isGuildRoom(flag: boolean) + { + this._isGuildRoom = flag; + } + + public get isRoomOwner(): boolean + { + return this._isRoomOwner; + } + + public get isDecorating(): boolean + { + return this._isDecorating; + } + + public set isDecorating(flag: boolean) + { + this._isDecorating = flag; + } + + public get isSpectator(): boolean + { + return this._isSpectator; + } + + public set isSpectator(flag: boolean) + { + this._isSpectator = flag; + } + + public get moderationSettings(): RoomModerationSettings + { + return this._moderationSettings; + } + + public set moderationSettings(parser: RoomModerationSettings) + { + this._moderationSettings = parser; + } +} diff --git a/packages/session/src/RoomSessionManager.ts b/packages/session/src/RoomSessionManager.ts new file mode 100644 index 0000000..073b9c8 --- /dev/null +++ b/packages/session/src/RoomSessionManager.ts @@ -0,0 +1,173 @@ +import { IRoomHandlerListener, IRoomSession, IRoomSessionManager } from '@nitrots/api'; +import { GetCommunication } from '@nitrots/communication'; +import { GetEventDispatcher, RoomSessionEvent } from '@nitrots/events'; +import { RoomSession } from './RoomSession'; +import { BaseHandler, GenericErrorHandler, PetPackageHandler, PollHandler, RoomChatHandler, RoomDataHandler, RoomDimmerPresetsHandler, RoomPermissionsHandler, RoomPresentHandler, RoomSessionHandler, RoomUsersHandler, WordQuizHandler } from './handler'; + +export class RoomSessionManager implements IRoomSessionManager, IRoomHandlerListener +{ + private _handlers: BaseHandler[] = []; + private _sessions: Map = new Map(); + private _pendingSession: IRoomSession = null; + + private _sessionStarting: boolean = false; + private _viewerSession: IRoomSession = null; + + public async init(): Promise + { + this.createHandlers(); + this.processPendingSession(); + } + + private createHandlers(): void + { + const connection = GetCommunication().connection; + + if(!connection) return; + + this._handlers.push( + new RoomChatHandler(connection, this), + new RoomDataHandler(connection, this), + new RoomDimmerPresetsHandler(connection, this), + new RoomPermissionsHandler(connection, this), + new RoomSessionHandler(connection, this), + new RoomUsersHandler(connection, this), + new RoomPresentHandler(connection, this), + new GenericErrorHandler(connection, this), + new WordQuizHandler(connection, this), + new PollHandler(connection, this), + new PetPackageHandler(connection, this), + ); + } + + private setHandlers(session: IRoomSession): void + { + if(!this._handlers || !this._handlers.length) return; + + for(const handler of this._handlers) + { + if(!handler) continue; + + handler.setRoomId(session.roomId); + } + } + + private processPendingSession(): void + { + if(!this._pendingSession) return; + + this.addSession(this._pendingSession); + + this._pendingSession = null; + } + + public getSession(id: number): IRoomSession + { + const existing = this._sessions.get(this.getRoomId(id)); + + if(!existing) return null; + + return existing; + } + + public createSession(roomId: number, password: string = null): boolean + { + const session = new RoomSession(); + + session.roomId = roomId; + session.password = password; + + return this.addSession(session); + } + + private addSession(roomSession: IRoomSession): boolean + { + this._sessionStarting = true; + + if(this._sessions.get(this.getRoomId(roomSession.roomId))) this.removeSession(roomSession.roomId, false); + + this._sessions.set(this.getRoomId(roomSession.roomId), roomSession); + + GetEventDispatcher().dispatchEvent(new RoomSessionEvent(RoomSessionEvent.CREATED, roomSession)); + + this._viewerSession = roomSession; + + this.startSession(this._viewerSession); + + return true; + } + + public startSession(session: IRoomSession): boolean + { + if(session.state === RoomSessionEvent.STARTED) return false; + + this._sessionStarting = false; + + if(!session.start()) + { + this.removeSession(session.roomId); + + return false; + } + + GetEventDispatcher().dispatchEvent(new RoomSessionEvent(RoomSessionEvent.STARTED, session)); + + this.setHandlers(session); + + return true; + } + + public removeSession(id: number, openLandingView: boolean = true): void + { + const session = this.getSession(id); + + if(!session) return; + + this._sessions.delete(this.getRoomId(id)); + + GetEventDispatcher().dispatchEvent(new RoomSessionEvent(RoomSessionEvent.ENDED, session, openLandingView)); + } + + public sessionUpdate(id: number, type: string): void + { + const session = this.getSession(id); + + if(!session) return; + + switch(type) + { + case RoomSessionHandler.RS_CONNECTED: + return; + case RoomSessionHandler.RS_READY: + return; + case RoomSessionHandler.RS_DISCONNECTED: + this.removeSession(id); + return; + } + } + + public sessionReinitialize(fromRoomId: number, toRoomId: number): void + { + const existing = this.getSession(fromRoomId); + + if(!existing) return; + + this._sessions.delete(this.getRoomId(fromRoomId)); + + existing.reset(toRoomId); + + this._sessions.set(this.getRoomId(toRoomId), existing); + + this.setHandlers(existing); + } + + private getRoomId(id: number): string + { + return 'hard_coded_room_id'; + } + + public get viewerSession(): IRoomSession + { + return this._viewerSession; + } +} diff --git a/packages/session/src/RoomUserData.ts b/packages/session/src/RoomUserData.ts new file mode 100644 index 0000000..6cddd62 --- /dev/null +++ b/packages/session/src/RoomUserData.ts @@ -0,0 +1,258 @@ +import { IRoomUserData } from '@nitrots/api'; + +export class RoomUserData implements IRoomUserData +{ + private _roomIndex: number = -1; + private _name: string = ''; + private _type: number = 0; + private _sex: string = ''; + private _figure: string = ''; + private _custom: string = ''; + private _activityPoints: number; + private _webID: number = 0; + private _groupID: number = 0; + private _groupStatus: number = 0; + private _groupName: string = ''; + private _ownerId: number = 0; + private _ownerName: string = ''; + private _petLevel: number = 0; + private _rarityLevel: number = 0; + private _hasSaddle: boolean; + private _isRiding: boolean; + private _canBreed: boolean; + private _canHarvest: boolean; + private _canRevive: boolean; + private _hasBreedingPermission: boolean; + private _botSkills: number[]; + private _isModerator: boolean; + + constructor(k: number) + { + this._roomIndex = k; + } + + public get roomIndex(): number + { + return this._roomIndex; + } + + public get activityPoints(): number + { + return this._activityPoints; + } + + public set activityPoints(k: number) + { + this._activityPoints = k; + } + + public get name(): string + { + return this._name; + } + + public set name(k: string) + { + this._name = k; + } + + public get type(): number + { + return this._type; + } + + public set type(k: number) + { + this._type = k; + } + + public get sex(): string + { + return this._sex; + } + + public set sex(k: string) + { + this._sex = k; + } + + public get figure(): string + { + return this._figure; + } + + public set figure(k: string) + { + this._figure = k; + } + + public get custom(): string + { + return this._custom; + } + + public set custom(k: string) + { + this._custom = k; + } + + public get webID(): number + { + return this._webID; + } + + public set webID(k: number) + { + this._webID = k; + } + + public get groupId(): number + { + return this._groupID; + } + + public set groupId(groupId: number) + { + this._groupID = groupId; + } + + public get groupName(): string + { + return this._groupName; + } + + public set groupName(k: string) + { + this._groupName = k; + } + + public get groupStatus(): number + { + return this._groupStatus; + } + + public set groupStatus(k: number) + { + this._groupStatus = k; + } + + public get ownerId(): number + { + return this._ownerId; + } + + public set ownerId(k: number) + { + this._ownerId = k; + } + + public get ownerName(): string + { + return this._ownerName; + } + + public set ownerName(k: string) + { + this._ownerName = k; + } + + public get rarityLevel(): number + { + return this._rarityLevel; + } + + public set rarityLevel(k: number) + { + this._rarityLevel = k; + } + + public get hasSaddle(): boolean + { + return this._hasSaddle; + } + + public set hasSaddle(k: boolean) + { + this._hasSaddle = k; + } + + public get isRiding(): boolean + { + return this._isRiding; + } + + public set isRiding(k: boolean) + { + this._isRiding = k; + } + + public get canBreed(): boolean + { + return this._canBreed; + } + + public set canBreed(k: boolean) + { + this._canBreed = k; + } + + public get canHarvest(): boolean + { + return this._canHarvest; + } + + public set canHarvest(k: boolean) + { + this._canHarvest = k; + } + + public get canRevive(): boolean + { + return this._canRevive; + } + + public set canRevive(k: boolean) + { + this._canRevive = k; + } + + public get hasBreedingPermission(): boolean + { + return this._hasBreedingPermission; + } + + public set hasBreedingPermission(k: boolean) + { + this._hasBreedingPermission = k; + } + + public get petLevel(): number + { + return this._petLevel; + } + + public set petLevel(k: number) + { + this._petLevel = k; + } + + public get botSkills(): number[] + { + return this._botSkills; + } + + public set botSkills(k: number[]) + { + this._botSkills = k; + } + + public get isModerator(): boolean + { + return this._isModerator; + } + + public set isModerator(k: boolean) + { + this._isModerator = k; + } +} diff --git a/packages/session/src/SessionDataManager.ts b/packages/session/src/SessionDataManager.ts new file mode 100644 index 0000000..ee93e7e --- /dev/null +++ b/packages/session/src/SessionDataManager.ts @@ -0,0 +1,532 @@ +import { ICommunicationManager, IFurnitureData, IGroupInformationManager, IMessageComposer, IProductData, ISessionDataManager, NoobnessLevelEnum, SecurityLevel } from '@nitrots/api'; +import { AccountSafetyLockStatusChangeMessageEvent, AccountSafetyLockStatusChangeParser, AvailabilityStatusMessageEvent, ChangeUserNameResultMessageEvent, EmailStatusResultEvent, FigureUpdateEvent, GetCommunication, GetUserTagsComposer, InClientLinkEvent, MysteryBoxKeysEvent, NoobnessLevelMessageEvent, PetRespectComposer, PetScratchFailedMessageEvent, RoomReadyMessageEvent, RoomUnitChatComposer, UserInfoEvent, UserNameChangeMessageEvent, UserPermissionsEvent, UserRespectComposer, UserTagsMessageEvent } from '@nitrots/communication'; +import { GetConfiguration } from '@nitrots/configuration'; +import { GetEventDispatcher, MysteryBoxKeysUpdateEvent, NitroSettingsEvent, SessionDataPreferencesEvent, UserNameUpdateEvent } from '@nitrots/events'; +import { CreateLinkEvent, HabboWebTools } from '@nitrots/utils'; +import { Texture } from 'pixi.js'; +import { GroupInformationManager } from './GroupInformationManager'; +import { IgnoredUsersManager } from './IgnoredUsersManager'; +import { BadgeImageManager } from './badge/BadgeImageManager'; +import { FurnitureDataLoader } from './furniture/FurnitureDataLoader'; +import { ProductDataLoader } from './product/ProductDataLoader'; + +export class SessionDataManager implements ISessionDataManager +{ + private _userId: number; + private _name: string; + private _figure: string; + private _gender: string; + private _realName: string; + private _respectsReceived: number; + private _respectsLeft: number; + private _respectsPetLeft: number; + private _canChangeName: boolean; + private _safetyLocked: boolean; + + private _ignoredUsersManager: IgnoredUsersManager = new IgnoredUsersManager(); + private _groupInformationManager: IGroupInformationManager = new GroupInformationManager(); + + private _clubLevel: number = 0; + private _securityLevel: number = 0; + private _isAmbassador: boolean = false; + private _noobnessLevel: number = -1; + private _isEmailVerified: boolean = false; + + private _systemOpen: boolean = false; + private _systemShutdown: boolean = false; + private _isAuthenticHabbo: boolean = false; + private _isRoomCameraFollowDisabled: boolean = false; + private _uiFlags: number = 0; + + private _floorItems: Map = new Map(); + private _wallItems: Map = new Map(); + private _products: Map = new Map(); + private _furnitureData: FurnitureDataLoader = new FurnitureDataLoader(this._floorItems, this._wallItems); + private _productData: ProductDataLoader = new ProductDataLoader(this._products); + private _tags: string[] = []; + + private _badgeImageManager: BadgeImageManager = new BadgeImageManager(); + + constructor() + { + this.resetUserInfo(); + + this.onNitroSettingsEvent = this.onNitroSettingsEvent.bind(this); + } + + public async init(): Promise + { + await Promise.all([ + this._furnitureData.init(), + this._productData.init(), + this._badgeImageManager.init(), + this._ignoredUsersManager.init(), + this._groupInformationManager.init() + ]); + + GetCommunication().registerMessageEvent(new FigureUpdateEvent((event: FigureUpdateEvent) => + { + this._figure = event.getParser().figure; + this._gender = event.getParser().gender; + + HabboWebTools.updateFigure(this._figure); + })); + + GetCommunication().registerMessageEvent(new UserInfoEvent(this.onUserInfoEvent.bind(this))); + GetCommunication().registerMessageEvent(new UserPermissionsEvent(this.onUserPermissionsEvent.bind(this))); + GetCommunication().registerMessageEvent(new AvailabilityStatusMessageEvent(this.onAvailabilityStatusMessageEvent.bind(this))); + GetCommunication().registerMessageEvent(new PetScratchFailedMessageEvent(this.onPetRespectFailed.bind(this))); + GetCommunication().registerMessageEvent(new ChangeUserNameResultMessageEvent(this.onChangeNameUpdateEvent.bind(this))); + GetCommunication().registerMessageEvent(new UserNameChangeMessageEvent(this.onUserNameChangeMessageEvent.bind(this))); + GetCommunication().registerMessageEvent(new UserTagsMessageEvent(this.onUserTags.bind(this))); + GetCommunication().registerMessageEvent(new RoomReadyMessageEvent(this.onRoomModelNameEvent.bind(this))); + GetCommunication().registerMessageEvent(new InClientLinkEvent(this.onInClientLinkEvent.bind(this))); + GetCommunication().registerMessageEvent(new MysteryBoxKeysEvent(this.onMysteryBoxKeysEvent.bind(this))); + GetCommunication().registerMessageEvent(new NoobnessLevelMessageEvent(this.onNoobnessLevelMessageEvent.bind(this))); + GetCommunication().registerMessageEvent(new AccountSafetyLockStatusChangeMessageEvent(this.onAccountSafetyLockStatusChangeMessageEvent.bind(this))); + GetCommunication().registerMessageEvent(new EmailStatusResultEvent(this.onEmailStatus.bind(this))); + + GetEventDispatcher().addEventListener(NitroSettingsEvent.SETTINGS_UPDATED, this.onNitroSettingsEvent); + } + + private resetUserInfo(): void + { + this._userId = 0; + this._name = null; + this._figure = null; + this._gender = null; + this._realName = null; + this._canChangeName = false; + this._safetyLocked = false; + } + + public getAllFurnitureData(): IFurnitureData[] + { + return [ ...Array.from(this._floorItems.values()), ...Array.from(this._wallItems.values()) ]; + } + + private onUserInfoEvent(event: UserInfoEvent): void + { + if(!event || !event.connection) return; + + this.resetUserInfo(); + + const userInfo = event.getParser().userInfo; + + if(!userInfo) return; + + this._userId = userInfo.userId; + this._name = userInfo.username; + this._figure = userInfo.figure; + this._gender = userInfo.gender; + this._realName = userInfo.realName; + this._respectsReceived = userInfo.respectsReceived; + this._respectsLeft = userInfo.respectsRemaining; + this._respectsPetLeft = userInfo.respectsPetRemaining; + this._canChangeName = userInfo.canChangeName; + this._safetyLocked = userInfo.safetyLocked; + + this._ignoredUsersManager.requestIgnoredUsers(userInfo.username); + } + + private onUserPermissionsEvent(event: UserPermissionsEvent): void + { + if(!event || !event.connection) return; + + this._clubLevel = event.getParser().clubLevel; + this._securityLevel = event.getParser().securityLevel; + this._isAmbassador = event.getParser().isAmbassador; + } + + private onAvailabilityStatusMessageEvent(event: AvailabilityStatusMessageEvent): void + { + if(!event || !event.connection) return; + + const parser = event.getParser(); + + if(!parser) return; + + this._systemOpen = parser.isOpen; + this._systemShutdown = parser.onShutdown; + this._isAuthenticHabbo = parser.isAuthenticUser; + } + + private onPetRespectFailed(event: PetScratchFailedMessageEvent): void + { + if(!event || !event.connection) return; + + this._respectsPetLeft++; + } + + private onChangeNameUpdateEvent(event: ChangeUserNameResultMessageEvent): void + { + if(!event || !event.connection) return; + + const parser = event.getParser(); + + if(!parser) return; + + if(parser.resultCode !== ChangeUserNameResultMessageEvent.NAME_OK) return; + + this._canChangeName = false; + + GetEventDispatcher().dispatchEvent(new UserNameUpdateEvent(parser.name)); + } + + private onUserNameChangeMessageEvent(event: UserNameChangeMessageEvent): void + { + if(!event || !event.connection) return; + + const parser = event.getParser(); + + if(!parser) return; + + if(parser.webId !== this.userId) return; + + this._name = parser.newName; + this._canChangeName = false; + + GetEventDispatcher().dispatchEvent(new UserNameUpdateEvent(this._name)); + } + + private onUserTags(event: UserTagsMessageEvent): void + { + if(!event || !event.connection) return; + + const parser = event.getParser(); + + if(!parser) return; + + this._tags = parser.tags; + } + + private onRoomModelNameEvent(event: RoomReadyMessageEvent): void + { + if(!event) return; + + const parser = event.getParser(); + + if(!parser) return; + + HabboWebTools.roomVisited(parser.roomId); + } + + private onInClientLinkEvent(event: InClientLinkEvent): void + { + if(!event) return; + + const parser = event.getParser(); + + if(!parser) return; + + CreateLinkEvent(parser.link); + } + + private onMysteryBoxKeysEvent(event: MysteryBoxKeysEvent): void + { + if(!event) return; + + const parser = event.getParser(); + + if(!parser) return; + + GetEventDispatcher().dispatchEvent(new MysteryBoxKeysUpdateEvent(parser.boxColor, parser.keyColor)); + } + + private onNoobnessLevelMessageEvent(event: NoobnessLevelMessageEvent): void + { + this._noobnessLevel = event.getParser().noobnessLevel; + + if(this._noobnessLevel !== NoobnessLevelEnum.OLD_IDENTITY) GetConfiguration().setValue('new.identity', 1); + } + + private onAccountSafetyLockStatusChangeMessageEvent(event: AccountSafetyLockStatusChangeMessageEvent): void + { + if(!event) return; + + const parser = event.getParser(); + + if(!parser) return; + + this._safetyLocked = (parser.status === AccountSafetyLockStatusChangeParser.SAFETY_LOCK_STATUS_LOCKED); + } + + private onEmailStatus(event: EmailStatusResultEvent): void + { + this._isEmailVerified = event?.getParser()?.isVerified ?? false; + } + + private onNitroSettingsEvent(event: NitroSettingsEvent): void + { + this._isRoomCameraFollowDisabled = event.cameraFollow; + this._uiFlags = event.flags; + + GetEventDispatcher().dispatchEvent(new SessionDataPreferencesEvent(this._uiFlags)); + } + + public getFloorItemData(id: number): IFurnitureData + { + const existing = this._floorItems.get(id); + + if(!existing) return null; + + return existing; + } + + public getFloorItemDataByName(name: string): IFurnitureData + { + if(!name || !this._floorItems || !this._floorItems.size) return null; + + for(const item of this._floorItems.values()) + { + if(!item || (item.className !== name)) continue; + + return item; + } + + return null; + } + + public getWallItemData(id: number): IFurnitureData + { + const existing = this._wallItems.get(id); + + if(!existing) return null; + + return existing; + } + + public getWallItemDataByName(name: string): IFurnitureData + { + if(!name || !this._wallItems || !this._wallItems.size) return null; + + for(const item of this._wallItems.values()) + { + if(!item || (item.className !== name)) continue; + + return item; + } + + return null; + } + + public getProductData(type: string): IProductData + { + return this._products.get(type); + } + + public getBadgeUrl(name: string): string + { + return this._badgeImageManager.getBadgeUrl(name); + } + + public getGroupBadgeUrl(name: string): string + { + return this._badgeImageManager.getBadgeUrl(name, BadgeImageManager.GROUP_BADGE); + } + + public getBadgeImage(name: string): Texture + { + return this._badgeImageManager.getBadgeImage(name); + } + + public getGroupBadgeImage(name: string): Texture + { + return this._badgeImageManager.getBadgeImage(name, BadgeImageManager.GROUP_BADGE); + } + + public getUserTags(roomUnitId: number): string[] + { + if(roomUnitId < 0) return; + + this.send(new GetUserTagsComposer(roomUnitId)); + } + + public loadBadgeImage(name: string): string + { + return this._badgeImageManager.loadBadgeImage(name); + } + + public loadGroupBadgeImage(name: string): string + { + return this._badgeImageManager.loadBadgeImage(name, BadgeImageManager.GROUP_BADGE); + } + + public hasSecurity(level: number): boolean + { + return (this._securityLevel >= level); + } + + public giveRespect(userId: number): void + { + if((userId < 0) || (this._respectsLeft <= 0)) return; + + this.send(new UserRespectComposer(userId)); + + this._respectsLeft--; + } + + public givePetRespect(petId: number): void + { + if((petId < 0) || (this._respectsPetLeft <= 0)) return; + + this.send(new PetRespectComposer(petId)); + + this._respectsPetLeft--; + } + + public sendSpecialCommandMessage(text: string, styleId: number = 0): void + { + this.send(new RoomUnitChatComposer(text)); + } + + public ignoreUser(name: string): void + { + this._ignoredUsersManager.ignoreUser(name); + } + + public unignoreUser(name: string): void + { + this._ignoredUsersManager.unignoreUser(name); + } + + public isUserIgnored(name: string): boolean + { + return this._ignoredUsersManager.isIgnored(name); + } + + public getGroupBadge(groupId: number): string + { + return this._groupInformationManager.getGroupBadge(groupId); + } + + public send(composer: IMessageComposer): void + { + GetCommunication().connection.send(composer); + } + + public get communication(): ICommunicationManager + { + return GetCommunication(); + } + + public get userId(): number + { + return this._userId; + } + + public get userName(): string + { + return this._name; + } + + public get figure(): string + { + return this._figure; + } + + public get gender(): string + { + return this._gender; + } + + public get realName(): string + { + return this._realName; + } + + public get ignoredUsersManager(): IgnoredUsersManager + { + return this._ignoredUsersManager; + } + + public get groupInformationManager(): IGroupInformationManager + { + return this._groupInformationManager; + } + + public get respectsReceived(): number + { + return this._respectsReceived; + } + + public get respectsLeft(): number + { + return this._respectsLeft; + } + + public get respectsPetLeft(): number + { + return this._respectsPetLeft; + } + + public get canChangeName(): boolean + { + return this._canChangeName; + } + + public get clubLevel(): number + { + return this._clubLevel; + } + + public get securityLevel(): number + { + return this._securityLevel; + } + + public get isAmbassador(): boolean + { + return this._isAmbassador; + } + + public get isEmailVerified(): boolean + { + return this._isEmailVerified; + } + + public get isNoob(): boolean + { + return (this._noobnessLevel !== NoobnessLevelEnum.OLD_IDENTITY); + } + + public get isRealNoob(): boolean + { + return (this._noobnessLevel === NoobnessLevelEnum.REAL_NOOB); + } + + public get isSystemOpen(): boolean + { + return this._systemOpen; + } + + public get isSystemShutdown(): boolean + { + return this._systemShutdown; + } + + public get isAuthenticHabbo(): boolean + { + return this._isAuthenticHabbo; + } + + public get isModerator(): boolean + { + return (this._securityLevel >= SecurityLevel.MODERATOR); + } + + public get isCameraFollowDisabled(): boolean + { + return this._isRoomCameraFollowDisabled; + } + + public get uiFlags(): number + { + return this._uiFlags; + } + + public get tags(): string[] + { + return this._tags; + } +} diff --git a/packages/session/src/UserDataManager.ts b/packages/session/src/UserDataManager.ts new file mode 100644 index 0000000..41f8be6 --- /dev/null +++ b/packages/session/src/UserDataManager.ts @@ -0,0 +1,184 @@ +import { IRoomUserData, IUserDataManager } from '@nitrots/api'; +import { GetCommunication, RequestPetInfoComposer, UserCurrentBadgesComposer } from '@nitrots/communication'; + +export class UserDataManager implements IUserDataManager +{ + private static TYPE_USER: number = 1; + private static TYPE_PET: number = 2; + private static TYPE_BOT: number = 3; + private static TYPE_RENTABLE_BOT: number = 4; + + private _userDataByType: Map> = new Map(); + private _userDataByRoomIndex: Map = new Map(); + private _userBadges: Map = new Map(); + + public getUserData(webID: number): IRoomUserData + { + return this.getDataByType(webID, UserDataManager.TYPE_USER); + } + + public getPetData(webID: number): IRoomUserData + { + return this.getDataByType(webID, UserDataManager.TYPE_PET); + } + + public getBotData(webID: number): IRoomUserData + { + return this.getDataByType(webID, UserDataManager.TYPE_BOT); + } + + public getRentableBotData(webID: number): IRoomUserData + { + return this.getDataByType(webID, UserDataManager.TYPE_RENTABLE_BOT); + } + + public getDataByType(webID: number, type: number): IRoomUserData + { + const existing = this._userDataByType.get(type); + + if(!existing) return null; + + const userData = existing.get(webID); + + if(!userData) return null; + + return userData; + } + + public getUserDataByIndex(roomIndex: number): IRoomUserData + { + const existing = this._userDataByRoomIndex.get(roomIndex); + + if(!existing) return null; + + return existing; + } + + public getUserDataByName(name: string): IRoomUserData + { + for(const userData of this._userDataByRoomIndex.values()) + { + if(!userData || (userData.name !== name)) continue; + + return userData; + } + + return null; + } + + public updateUserData(data: IRoomUserData): void + { + if(!data) return; + + this.removeUserData(data.roomIndex); + + let existingType = this._userDataByType.get(data.type); + + if(!existingType) + { + existingType = new Map(); + + this._userDataByType.set(data.type, existingType); + } + + existingType.set(data.webID, data); + + this._userDataByRoomIndex.set(data.roomIndex, data); + } + + public removeUserData(roomIndex: number): void + { + const existing = this.getUserDataByIndex(roomIndex); + + if(!existing) return; + + this._userDataByRoomIndex.delete(roomIndex); + + const existingType = this._userDataByType.get(existing.type); + + if(existingType) existingType.delete(existing.webID); + } + + public getUserBadges(userId: number): string[] + { + GetCommunication().connection.send(new UserCurrentBadgesComposer(userId)); + + const badges = this._userBadges.get(userId); + + if(!badges) return []; + + return badges; + } + + public setUserBadges(userId: number, badges: string[]): void + { + this._userBadges.set(userId, badges); + } + + public updateFigure(roomIndex: number, figure: string, sex: string, hasSaddle: boolean, isRiding: boolean): void + { + const userData = this.getUserDataByIndex(roomIndex); + + if(!userData) return; + + userData.figure = figure; + userData.sex = sex; + userData.hasSaddle = hasSaddle; + userData.isRiding = isRiding; + } + + public updateName(roomIndex: number, name: string): void + { + const userData = this.getUserDataByIndex(roomIndex); + + if(!userData) return; + + userData.name = name; + } + + public updateMotto(roomIndex: number, custom: string): void + { + const userData = this.getUserDataByIndex(roomIndex); + + if(!userData) return; + + userData.custom = custom; + } + + public updateAchievementScore(roomIndex: number, score: number): void + { + const userData = this.getUserDataByIndex(roomIndex); + + if(!userData) return; + + userData.activityPoints = score; + } + + public updatePetLevel(roomIndex: number, level: number): void + { + const userData = this.getUserDataByIndex(roomIndex); + + if(userData) userData.petLevel = level; + } + + public updatePetBreedingStatus(roomIndex: number, canBreed: boolean, canHarvest: boolean, canRevive: boolean, hasBreedingPermission: boolean): void + { + const userData = this.getUserDataByIndex(roomIndex); + + if(!userData) return; + + userData.canBreed = canBreed; + userData.canHarvest = canHarvest; + userData.canRevive = canRevive; + userData.hasBreedingPermission = hasBreedingPermission; + } + + public requestPetInfo(id: number): void + { + const petData = this.getPetData(id); + + if(!petData) return; + + GetCommunication().connection.send(new RequestPetInfoComposer(id)); + } +} diff --git a/packages/session/src/badge/BadgeImageManager.ts b/packages/session/src/badge/BadgeImageManager.ts new file mode 100644 index 0000000..0151ed5 --- /dev/null +++ b/packages/session/src/badge/BadgeImageManager.ts @@ -0,0 +1,194 @@ +import { GetAssetManager } from '@nitrots/assets'; +import { GetCommunication, GroupBadgePartsEvent } from '@nitrots/communication'; +import { GetConfiguration } from '@nitrots/configuration'; +import { BadgeImageReadyEvent, GetEventDispatcher } from '@nitrots/events'; +import { TextureUtils } from '@nitrots/utils'; +import { Container, Sprite, Texture } from 'pixi.js'; +import { BadgeInfo } from './BadgeInfo'; +import { GroupBadge } from './GroupBadge'; +import { GroupBadgePart } from './GroupBadgePart'; + +export class BadgeImageManager +{ + public static GROUP_BADGE: string = 'group_badge'; + public static NORMAL_BADGE: string = 'normal_badge'; + + private _groupBases: Map = new Map(); + private _groupSymbols: Map = new Map(); + private _groupPartColors: Map = new Map(); + private _requestedBadges: Map = new Map(); + private _groupBadgesQueue: Map = new Map(); + private _readyToGenerateGroupBadges: boolean = false; + + public init(): void + { + GetCommunication().registerMessageEvent(new GroupBadgePartsEvent(this.onGroupBadgePartsEvent.bind(this))); + } + + public getBadgeImage(badgeName: string, type: string = BadgeImageManager.NORMAL_BADGE, load: boolean = true): Texture + { + return this.getBadgeTexture(badgeName, type); + } + + public getBadgeInfo(k: string): BadgeInfo + { + const badge = this.getBadgeTexture(k); + + return (badge) ? new BadgeInfo(badge, false) : new BadgeInfo(this.getBadgePlaceholder(), true); + } + + public loadBadgeImage(badgeName: string, type: string = BadgeImageManager.NORMAL_BADGE): string + { + if(GetAssetManager().getTexture(this.getBadgeUrl(badgeName, type))) return badgeName; + + this.getBadgeTexture(badgeName, type); + + return null; + } + + private getBadgeTexture(badgeName: string, type: string = BadgeImageManager.NORMAL_BADGE): Texture + { + const url = this.getBadgeUrl(badgeName, type); + + if(!url || !url.length) return null; + + const texture = GetAssetManager().getTexture(url); + + if(texture) return texture; + + if(type === BadgeImageManager.NORMAL_BADGE) + { + const loadBadge = async () => + { + await GetAssetManager().downloadAsset(url); + + const texture = GetAssetManager().getTexture(url); + + if(texture) GetEventDispatcher().dispatchEvent(new BadgeImageReadyEvent(badgeName, texture)); + }; + + loadBadge(); + } + + else if(type === BadgeImageManager.GROUP_BADGE) + { + if(this._groupBadgesQueue.get(badgeName)) return; + + this._groupBadgesQueue.set(badgeName, true); + + if(this._readyToGenerateGroupBadges) this.loadGroupBadge(badgeName); + } + + return this.getBadgePlaceholder(); + } + + private getBadgePlaceholder(): Texture + { + return GetAssetManager().getTexture(GetConfiguration().getValue('images.url') + '/loading_icon.png'); + } + + public getBadgeUrl(badge: string, type: string = BadgeImageManager.NORMAL_BADGE): string + { + let url = null; + + switch(type) + { + case BadgeImageManager.NORMAL_BADGE: + url = (GetConfiguration().getValue('badge.asset.url')).replace('%badgename%', badge); + break; + case BadgeImageManager.GROUP_BADGE: + url = badge; + break; + } + + return url; + } + + private loadGroupBadge(badgeCode: string): void + { + const groupBadge = new GroupBadge(badgeCode); + const partMatches = [...badgeCode.matchAll(/[b|s][0-9]{4,6}/g)]; + + for(const partMatch of partMatches) + { + const partCode = partMatch[0]; + const shortMethod = (partCode.length === 6); + const partType = partCode[0]; + const partId = parseInt(partCode.slice(1, shortMethod ? 3 : 4)); + const partColor = parseInt(partCode.slice(shortMethod ? 3 : 4, shortMethod ? 5 : 6)); + const partPosition = partCode.length < 6 ? 0 : parseInt(partCode.slice(shortMethod ? 5 : 6, shortMethod ? 6 : 7)); // sometimes position is ommitted + const part = new GroupBadgePart(partType, partId, partColor, partPosition); + + groupBadge.parts.push(part); + } + + this.renderGroupBadge(groupBadge); + } + + private renderGroupBadge(groupBadge: GroupBadge): void + { + const container = new Container(); + const tempSprite = new Sprite(Texture.EMPTY); + + tempSprite.width = GroupBadgePart.IMAGE_WIDTH; + tempSprite.height = GroupBadgePart.IMAGE_HEIGHT; + + container.addChild(tempSprite); + + for(const part of groupBadge.parts) + { + let isFirst = true; + + const partNames = ((part.type === 'b') ? this._groupBases.get(part.key) : this._groupSymbols.get(part.key)); + + if(partNames) + { + for(const partName of partNames) + { + if(!partName || !partName.length) continue; + + const texture = GetAssetManager().getTexture(`badgepart_${partName}`); + + if(!texture) continue; + + const { x, y } = part.calculatePosition(texture); + const sprite = new Sprite(texture); + + sprite.position.set(x, y); + + if(isFirst) sprite.tint = parseInt(this._groupPartColors.get(part.color), 16); + + isFirst = false; + + container.addChild(sprite); + } + } + } + + this._requestedBadges.delete(groupBadge.code); + this._groupBadgesQueue.delete(groupBadge.code); + + const texture = TextureUtils.generateTexture(container); + GetAssetManager().setTexture(groupBadge.code, texture); + + GetEventDispatcher().dispatchEvent(new BadgeImageReadyEvent(groupBadge.code, texture)); + } + + private onGroupBadgePartsEvent(event: GroupBadgePartsEvent): void + { + if(!event) return; + + const data = event.getParser(); + + if(!data) return; + + data.bases.forEach((names, id) => this._groupBases.set(id, names.map(val => val.replace('.png', '').replace('.gif', '')))); + + data.symbols.forEach((names, id) => this._groupSymbols.set(id, names.map(val => val.replace('.png', '').replace('.gif', '')))); + + this._groupPartColors = data.partColors; + this._readyToGenerateGroupBadges = true; + + for(const badgeCode of this._groupBadgesQueue.keys()) this.loadGroupBadge(badgeCode); + } +} diff --git a/packages/session/src/badge/BadgeInfo.ts b/packages/session/src/badge/BadgeInfo.ts new file mode 100644 index 0000000..d47cf75 --- /dev/null +++ b/packages/session/src/badge/BadgeInfo.ts @@ -0,0 +1,23 @@ +import { Texture } from 'pixi.js'; + +export class BadgeInfo +{ + private _image: Texture; + private _placeHolder: boolean; + + constructor(image: Texture, placeHolder: boolean) + { + this._image = image; + this._placeHolder = placeHolder; + } + + public get image(): Texture + { + return this._image; + } + + public get placeHolder(): boolean + { + return this._placeHolder; + } +} diff --git a/packages/session/src/badge/GroupBadge.ts b/packages/session/src/badge/GroupBadge.ts new file mode 100644 index 0000000..5ede983 --- /dev/null +++ b/packages/session/src/badge/GroupBadge.ts @@ -0,0 +1,23 @@ +import { GroupBadgePart } from './GroupBadgePart'; + +export class GroupBadge +{ + private _code: string; + private _parts: GroupBadgePart[]; + + constructor(code: string) + { + this._code = code; + this._parts = []; + } + + public get code(): string + { + return this._code; + } + + public get parts(): GroupBadgePart[] + { + return this._parts; + } +} diff --git a/packages/session/src/badge/GroupBadgePart.ts b/packages/session/src/badge/GroupBadgePart.ts new file mode 100644 index 0000000..5385715 --- /dev/null +++ b/packages/session/src/badge/GroupBadgePart.ts @@ -0,0 +1,66 @@ +import { Point, Texture } from 'pixi.js'; + +export class GroupBadgePart +{ + public static BASE: string = 'b'; + public static SYMBOL: string = 's'; + public static SYMBOL_ALT: string = 't'; + public static BASE_PART: number = 0; + public static LAYER_PART: number = 1; + public static IMAGE_WIDTH: number = 39; + public static IMAGE_HEIGHT: number = 39; + public static CELL_WIDTH: number = 13; + public static CELL_HEIGHT: number = 13; + + public type: string; + public key: number; + public color: number; + public position: number; + + constructor(type: string, key: number = 0, color: number = 0, position: number = 0) + { + this.type = type; + this.key = key; + this.color = color; + this.position = position; + } + + public get code(): string + { + if(this.key === 0) return null; + + return GroupBadgePart.getCode(this.type, this.key, this.color, this.position); + } + + public static getCode(type: string, key: number, color: number, position: number): string + { + return (type === GroupBadgePart.BASE ? type : key >= 100 ? GroupBadgePart.SYMBOL_ALT : GroupBadgePart.SYMBOL) + (key < 10 ? '0' : '') + (type === GroupBadgePart.BASE ? key : key >= 100 ? key - 100 : key) + (color < 10 ? '0' : '') + color + position; + } + + public calculatePosition(asset: Texture): Point + { + const gridPos = this.calculateGridPos(this.position); + + let x: number = (((GroupBadgePart.CELL_WIDTH * gridPos.x) + (GroupBadgePart.CELL_WIDTH / 2)) - (asset.width / 2)); + let y: number = (((GroupBadgePart.CELL_HEIGHT * gridPos.y) + (GroupBadgePart.CELL_HEIGHT / 2)) - (asset.height / 2)); + + if(x < 0) x = 0; + + if((x + asset.width) > GroupBadgePart.IMAGE_WIDTH) x = (GroupBadgePart.IMAGE_WIDTH - asset.width); + + if(y < 0) y = 0; + + if((y + asset.height) > GroupBadgePart.IMAGE_HEIGHT) y = (GroupBadgePart.IMAGE_HEIGHT - asset.height); + + return new Point(Math.floor(x), Math.floor(y)); + } + + private calculateGridPos(gridVal: number): Point + { + const point = new Point(); + point.x = Math.floor((gridVal % 3)); + point.y = Math.floor((gridVal / 3)); + + return point; + } +} diff --git a/packages/session/src/badge/index.ts b/packages/session/src/badge/index.ts new file mode 100644 index 0000000..dd81f9c --- /dev/null +++ b/packages/session/src/badge/index.ts @@ -0,0 +1,4 @@ +export * from './BadgeImageManager'; +export * from './BadgeInfo'; +export * from './GroupBadge'; +export * from './GroupBadgePart'; diff --git a/packages/session/src/furniture/FurnitureData.ts b/packages/session/src/furniture/FurnitureData.ts new file mode 100644 index 0000000..3b43f15 --- /dev/null +++ b/packages/session/src/furniture/FurnitureData.ts @@ -0,0 +1,222 @@ +import { IFurnitureData } from '@nitrots/api'; + +export class FurnitureData implements IFurnitureData +{ + private _type: string; + private _id: number; + private _className: string; + private _fullName: string; + private _category: string; + private _hasIndexedColor: boolean; + private _colourIndex: number; + private _revision: number; + private _tileSizeX: number; + private _tileSizeY: number; + private _tileSizeZ: number; + private _colors: number[]; + private _localizedName: string; + private _description: string; + private _adUrl: string; + private _purchaseOfferId: number; + private _rentOfferId: number; + private _customParams: string; + private _specialType: number; + private _purchaseCouldBeUsedForBuyout: boolean; + private _rentCouldBeUsedForBuyout: boolean; + private _availableForBuildersClub: boolean; + private _canStandOn: boolean; + private _canSitOn: boolean; + private _canLayOn: boolean; + private _excludedFromDynamic: boolean; + private _furniLine: string; + private _environment: string; + private _rare: boolean; + + constructor(type: string, id: number, fullName: string, className: string, category: string, localizedName: string, description: string, revision: number, tileSizeX: number, tileSizeY: number, tileSizeZ: number, colors: number[], hadIndexedColor: boolean, colorIndex: number, adUrl: string, purchaseOfferId: number, purchaseCouldBeUsedForBuyout: boolean, rentOfferId: number, rentCouldBeUsedForBuyout: boolean, availableForBuildersClub: boolean, customParams: string, specialType: number, canStandOn: boolean, canSitOn: boolean, canLayOn: boolean, excludedfromDynamic: boolean, furniLine: string, environment: string, rare: boolean) + { + this._type = type; + this._id = id; + this._fullName = fullName; + this._className = className; + this._category = category; + this._revision = revision; + this._tileSizeX = tileSizeX; + this._tileSizeY = tileSizeY; + this._tileSizeZ = tileSizeZ; + this._colors = colors; + this._hasIndexedColor = hadIndexedColor; + this._colourIndex = colorIndex; + this._localizedName = localizedName; + this._description = description; + this._adUrl = adUrl; + this._purchaseOfferId = purchaseOfferId; + this._purchaseCouldBeUsedForBuyout = purchaseCouldBeUsedForBuyout; + this._rentOfferId = rentOfferId; + this._rentCouldBeUsedForBuyout = rentCouldBeUsedForBuyout; + this._customParams = customParams; + this._specialType = specialType; + this._availableForBuildersClub = availableForBuildersClub; + this._canStandOn = canStandOn; + this._canSitOn = canSitOn; + this._canLayOn = canLayOn; + this._excludedFromDynamic = excludedfromDynamic; + this._furniLine = furniLine; + this._environment = environment; + this._rare = rare; + } + + public get type(): string + { + return this._type; + } + + public get id(): number + { + return this._id; + } + + public get className(): string + { + return this._className; + } + + public set className(k: string) + { + this._className = k; + } + + public get fullName(): string + { + return this._fullName; + } + + public get category(): string + { + return this._category; + } + + public get hasIndexedColor(): boolean + { + return this._hasIndexedColor; + } + + public get colorIndex(): number + { + return this._colourIndex; + } + + public get revision(): number + { + return this._revision; + } + + public get tileSizeX(): number + { + return this._tileSizeX; + } + + public get tileSizeY(): number + { + return this._tileSizeY; + } + + public get tileSizeZ(): number + { + return this._tileSizeZ; + } + + public get colors(): number[] + { + return this._colors; + } + + public get name(): string + { + return this._localizedName; + } + + public get description(): string + { + return this._description; + } + + public get adUrl(): string + { + return this._adUrl; + } + + public get purchaseOfferId(): number + { + return this._purchaseOfferId; + } + + public get customParams(): string + { + return this._customParams; + } + + public get specialType(): number + { + return this._specialType; + } + + public get rentOfferId(): number + { + return this._rentOfferId; + } + + public get purchaseCouldBeUsedForBuyout(): boolean + { + return this._purchaseCouldBeUsedForBuyout; + } + + public get rentCouldBeUsedForBuyout(): boolean + { + return this._rentCouldBeUsedForBuyout; + } + + public get availableForBuildersClub(): boolean + { + return this._availableForBuildersClub; + } + + public get canStandOn(): boolean + { + return this._canStandOn; + } + + public get canSitOn(): boolean + { + return this._canSitOn; + } + + public get canLayOn(): boolean + { + return this._canLayOn; + } + + public get isExternalImage(): boolean + { + return !(this._className.indexOf('external_image') === -1); + } + + public get excludeDynamic(): boolean + { + return this._excludedFromDynamic; + } + + public get furniLine(): string + { + return this._furniLine; + } + + public get environment(): string + { + return this._environment; + } + + public get rare(): boolean + { + return this._rare; + } +} diff --git a/packages/session/src/furniture/FurnitureDataLoader.ts b/packages/session/src/furniture/FurnitureDataLoader.ts new file mode 100644 index 0000000..6f7a096 --- /dev/null +++ b/packages/session/src/furniture/FurnitureDataLoader.ts @@ -0,0 +1,106 @@ +import { FurnitureType, IFurnitureData } from '@nitrots/api'; +import { GetConfiguration } from '@nitrots/configuration'; +import { GetLocalizationManager } from '@nitrots/localization'; +import { FurnitureData } from './FurnitureData'; + +export class FurnitureDataLoader +{ + private _floorItems: Map; + private _wallItems: Map; + + constructor(floorItems: Map, wallItems: Map) + { + this._floorItems = floorItems; + this._wallItems = wallItems; + } + + public async init(): Promise + { + const url = GetConfiguration().getValue('furnidata.url'); + + if(!url || !url.length) throw new Error('invalid furni data url'); + + const response = await fetch(url); + + if(response.status !== 200) throw new Error('Invalid furni data file'); + + const responseData = await response.json(); + + if(responseData.roomitemtypes) this.parseFloorItems(responseData.roomitemtypes); + + if(responseData.wallitemtypes) this.parseWallItems(responseData.wallitemtypes); + } + + private parseFloorItems(data: any): void + { + if(!data || !data.furnitype) return; + + for(const furniture of data.furnitype) + { + if(!furniture) continue; + + const colors: number[] = []; + + if(furniture.partcolors) + { + for(const color of furniture.partcolors.color) + { + let colorCode = (color as string); + + if(colorCode.charAt(0) === '#') + { + colorCode = colorCode.replace('#', ''); + + colors.push(parseInt(colorCode, 16)); + } + else + { + colors.push((parseInt(colorCode, 16))); + } + } + } + + const classSplit = (furniture.classname as string).split('*'); + const className = classSplit[0]; + const colorIndex = ((classSplit.length > 1) ? parseInt(classSplit[1]) : 0); + const hasColorIndex = (classSplit.length > 1); + + const furnitureData = new FurnitureData(FurnitureType.FLOOR, furniture.id, furniture.classname, className, furniture.category, furniture.name, furniture.description, furniture.revision, furniture.xdim, furniture.ydim, 0, colors, hasColorIndex, colorIndex, furniture.adurl, furniture.offerid, furniture.buyout, furniture.rentofferid, furniture.rentbuyout, furniture.bc, furniture.customparams, furniture.specialtype, furniture.canstandon, furniture.cansiton, furniture.canlayon, furniture.excludeddynamic, furniture.furniline, furniture.environment, furniture.rare); + + this._floorItems.set(furnitureData.id, furnitureData); + + this.updateLocalizations(furnitureData); + } + } + + private parseWallItems(data: any): void + { + if(!data || !data.furnitype) return; + + for(const furniture of data.furnitype) + { + if(!furniture) continue; + + const furnitureData = new FurnitureData(FurnitureType.WALL, furniture.id, furniture.classname, furniture.classname, furniture.category, furniture.name, furniture.description, furniture.revision, 0, 0, 0, null, false, 0, furniture.adurl, furniture.offerid, furniture.buyout, furniture.rentofferid, furniture.rentbuyout, furniture.bc, null, furniture.specialtype, false, false, false, furniture.excludeddynamic, furniture.furniline, furniture.environment, furniture.rare); + + this._wallItems.set(furnitureData.id, furnitureData); + + this.updateLocalizations(furnitureData); + } + } + + private updateLocalizations(furniture: FurnitureData): void + { + switch(furniture.type) + { + case FurnitureType.FLOOR: + GetLocalizationManager().setValue(('roomItem.name.' + furniture.id), furniture.name); + GetLocalizationManager().setValue(('roomItem.desc.' + furniture.id), furniture.description); + return; + case FurnitureType.WALL: + GetLocalizationManager().setValue(('wallItem.name.' + furniture.id), furniture.name); + GetLocalizationManager().setValue(('wallItem.desc.' + furniture.id), furniture.description); + return; + } + } +} diff --git a/packages/session/src/furniture/index.ts b/packages/session/src/furniture/index.ts new file mode 100644 index 0000000..6b2d9e3 --- /dev/null +++ b/packages/session/src/furniture/index.ts @@ -0,0 +1,2 @@ +export * from './FurnitureData'; +export * from './FurnitureDataLoader'; diff --git a/packages/session/src/handler/BaseHandler.ts b/packages/session/src/handler/BaseHandler.ts new file mode 100644 index 0000000..3bd699b --- /dev/null +++ b/packages/session/src/handler/BaseHandler.ts @@ -0,0 +1,41 @@ +import { IConnection, IRoomHandlerListener } from '@nitrots/api'; + +export class BaseHandler +{ + private _connection: IConnection; + private _listener: IRoomHandlerListener; + private _roomId: number; + + constructor(connection: IConnection, listener: IRoomHandlerListener) + { + this._connection = connection; + this._listener = listener; + this._roomId = 0; + } + + public dispose(): void + { + this._connection = null; + this._listener = null; + } + + public setRoomId(id: number): void + { + this._roomId = id; + } + + public get connection(): IConnection + { + return this._connection; + } + + public get listener(): IRoomHandlerListener + { + return this._listener; + } + + public get roomId(): number + { + return this._roomId; + } +} diff --git a/packages/session/src/handler/GenericErrorHandler.ts b/packages/session/src/handler/GenericErrorHandler.ts new file mode 100644 index 0000000..0d7bebf --- /dev/null +++ b/packages/session/src/handler/GenericErrorHandler.ts @@ -0,0 +1,42 @@ +import { GenericErrorEnum, IConnection, IRoomHandlerListener } from '@nitrots/api'; +import { GenericErrorEvent } from '@nitrots/communication'; +import { GetEventDispatcher, RoomSessionErrorMessageEvent } from '@nitrots/events'; +import { BaseHandler } from './BaseHandler'; + +export class GenericErrorHandler extends BaseHandler +{ + constructor(connection: IConnection, listener: IRoomHandlerListener) + { + super(connection, listener); + + connection.addMessageEvent(new GenericErrorEvent(this.onRoomGenericError.bind(this))); + } + + private onRoomGenericError(event: GenericErrorEvent): void + { + if(!(event instanceof GenericErrorEvent)) return; + + const parser = event.getParser(); + + if(!parser) return; + + const roomSession = this.listener.getSession(this.roomId); + + if(!roomSession) return; + + let type: string = ''; + + switch(parser.errorCode) + { + case GenericErrorEnum.KICKED_OUT_OF_ROOM: + type = RoomSessionErrorMessageEvent.RSEME_KICKED; + break; + default: + return; + } + + if(!type || type.length == 0) return; + + GetEventDispatcher().dispatchEvent(new RoomSessionErrorMessageEvent(type, roomSession)); + } +} diff --git a/packages/session/src/handler/PetPackageHandler.ts b/packages/session/src/handler/PetPackageHandler.ts new file mode 100644 index 0000000..5931d76 --- /dev/null +++ b/packages/session/src/handler/PetPackageHandler.ts @@ -0,0 +1,45 @@ +import { IConnection, IRoomHandlerListener } from '@nitrots/api'; +import { GetCommunication, OpenPetPackageRequestedMessageEvent, OpenPetPackageResultMessageEvent } from '@nitrots/communication'; +import { GetEventDispatcher, RoomSessionPetPackageEvent } from '@nitrots/events'; +import { BaseHandler } from './BaseHandler'; + +export class PetPackageHandler extends BaseHandler +{ + constructor(connection: IConnection, listener: IRoomHandlerListener) + { + super(connection, listener); + + GetCommunication().registerMessageEvent(new OpenPetPackageRequestedMessageEvent(this.onOpenPetPackageRequested.bind(this))); + GetCommunication().registerMessageEvent(new OpenPetPackageResultMessageEvent(this.onOpenPetPackageResult.bind(this))); + } + + private onOpenPetPackageRequested(event: OpenPetPackageRequestedMessageEvent): void + { + if(!this.listener) return; + + const parser = event.getParser(); + + if(!parser) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + GetEventDispatcher().dispatchEvent(new RoomSessionPetPackageEvent(RoomSessionPetPackageEvent.RSOPPE_OPEN_PET_PACKAGE_REQUESTED, session, parser.objectId, parser.figureData, 0, null)); + } + + private onOpenPetPackageResult(event: OpenPetPackageResultMessageEvent): void + { + if(!this.listener) return; + + const parser = event.getParser(); + + if(!parser) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + GetEventDispatcher().dispatchEvent(new RoomSessionPetPackageEvent(RoomSessionPetPackageEvent.RSOPPE_OPEN_PET_PACKAGE_RESULT, session, parser.objectId, null, parser.nameValidationStatus, parser.nameValidationInfo)); + } +} diff --git a/packages/session/src/handler/PollHandler.ts b/packages/session/src/handler/PollHandler.ts new file mode 100644 index 0000000..41c5f44 --- /dev/null +++ b/packages/session/src/handler/PollHandler.ts @@ -0,0 +1,114 @@ +import { IConnection, IRoomHandlerListener } from '@nitrots/api'; +import { PollContentsEvent, PollErrorEvent, PollOfferEvent, RoomPollResultEvent, StartRoomPollEvent } from '@nitrots/communication'; +import { GetEventDispatcher, RoomSessionPollEvent, RoomSessionVoteEvent } from '@nitrots/events'; +import { BaseHandler } from './BaseHandler'; + +export class PollHandler extends BaseHandler +{ + constructor(connection: IConnection, listener: IRoomHandlerListener) + { + super(connection, listener); + + connection.addMessageEvent(new PollContentsEvent(this.onPollContentsEvent.bind(this))); + connection.addMessageEvent(new PollOfferEvent(this.onPollOfferEvent.bind(this))); + connection.addMessageEvent(new PollErrorEvent(this.onPollErrorEvent.bind(this))); + connection.addMessageEvent(new StartRoomPollEvent(this.onStartRoomPollEvent.bind(this))); + connection.addMessageEvent(new RoomPollResultEvent(this.onRoomPollResultEvent.bind(this))); + } + + private onPollContentsEvent(event: PollContentsEvent): void + { + if(!this.listener) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const parser = event.getParser(); + + if(!parser) return; + + const pollEvent = new RoomSessionPollEvent(RoomSessionPollEvent.CONTENT, session, parser.id); + + pollEvent.startMessage = parser.startMessage; + pollEvent.endMessage = parser.endMessage; + pollEvent.numQuestions = parser.numQuestions; + pollEvent.questionArray = parser.questionArray; + pollEvent.npsPoll = parser.npsPoll; + + GetEventDispatcher().dispatchEvent(pollEvent); + } + + private onPollOfferEvent(event: PollOfferEvent): void + { + if(!this.listener) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const parser = event.getParser(); + + if(!parser) return; + + const pollEvent = new RoomSessionPollEvent(RoomSessionPollEvent.OFFER, session, parser.id); + + pollEvent.summary = parser.headline; + pollEvent.summary = parser.summary; + + GetEventDispatcher().dispatchEvent(pollEvent); + } + + private onPollErrorEvent(event: PollErrorEvent): void + { + if(!this.listener) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const parser = event.getParser(); + + if(!parser) return; + + const pollEvent = new RoomSessionPollEvent(RoomSessionPollEvent.ERROR, session, -1); + pollEvent.headline = '???'; + pollEvent.summary = '???'; + + GetEventDispatcher().dispatchEvent(pollEvent); + } + + private onStartRoomPollEvent(event: StartRoomPollEvent): void + { + if(!this.listener) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const parser = event.getParser(); + + if(!parser) return; + + const pollEvent = new RoomSessionVoteEvent(RoomSessionVoteEvent.VOTE_QUESTION, session, parser.question, parser.choices); + + GetEventDispatcher().dispatchEvent(pollEvent); + } + + private onRoomPollResultEvent(event: RoomPollResultEvent): void + { + if(!this.listener) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const parser = event.getParser(); + + if(!parser) return; + + const pollEvent = new RoomSessionVoteEvent(RoomSessionVoteEvent.VOTE_RESULT, session, parser.question, parser.choices, parser.SafeStr_7651, parser.SafeStr_7654); + + GetEventDispatcher().dispatchEvent(pollEvent); + } +} diff --git a/packages/session/src/handler/RoomChatHandler.ts b/packages/session/src/handler/RoomChatHandler.ts new file mode 100644 index 0000000..67903f7 --- /dev/null +++ b/packages/session/src/handler/RoomChatHandler.ts @@ -0,0 +1,173 @@ +import { IConnection, IRoomHandlerListener, SystemChatStyleEnum } from '@nitrots/api'; +import { FloodControlEvent, PetRespectNoficationEvent, PetSupplementTypeEnum, PetSupplementedNotificationEvent, RemainingMuteEvent, RespectReceivedEvent, RoomUnitChatEvent, RoomUnitChatShoutEvent, RoomUnitChatWhisperEvent, RoomUnitHandItemReceivedEvent } from '@nitrots/communication'; +import { GetEventDispatcher, RoomSessionChatEvent } from '@nitrots/events'; +import { BaseHandler } from './BaseHandler'; + +export class RoomChatHandler extends BaseHandler +{ + constructor(connection: IConnection, listener: IRoomHandlerListener) + { + super(connection, listener); + + connection.addMessageEvent(new RoomUnitChatEvent(this.onRoomUnitChatEvent.bind(this))); + connection.addMessageEvent(new RoomUnitChatShoutEvent(this.onRoomUnitChatEvent.bind(this))); + connection.addMessageEvent(new RoomUnitChatWhisperEvent(this.onRoomUnitChatEvent.bind(this))); + connection.addMessageEvent(new RoomUnitHandItemReceivedEvent(this.onRoomUnitHandItemReceivedEvent.bind(this))); + connection.addMessageEvent(new RespectReceivedEvent(this.onRespectReceivedEvent.bind(this))); + connection.addMessageEvent(new PetRespectNoficationEvent(this.onPetRespectNoficationEvent.bind(this))); + connection.addMessageEvent(new PetSupplementedNotificationEvent(this.onPetSupplementedNotificationEvent.bind(this))); + connection.addMessageEvent(new FloodControlEvent(this.onFloodControlEvent.bind(this))); + connection.addMessageEvent(new RemainingMuteEvent(this.onRemainingMuteEvent.bind(this))); + } + + private onRoomUnitChatEvent(event: RoomUnitChatEvent): void + { + if(!this.listener) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const parser = event.getParser(); + + if(!parser) return; + + let chatType: number = RoomSessionChatEvent.CHAT_TYPE_SPEAK; + + if(event instanceof RoomUnitChatShoutEvent) chatType = RoomSessionChatEvent.CHAT_TYPE_SHOUT; + else if(event instanceof RoomUnitChatWhisperEvent) chatType = RoomSessionChatEvent.CHAT_TYPE_WHISPER; + + const chatEvent = new RoomSessionChatEvent(RoomSessionChatEvent.CHAT_EVENT, session, parser.roomIndex, parser.message, chatType, parser.bubble); + + GetEventDispatcher().dispatchEvent(chatEvent); + } + + private onRoomUnitHandItemReceivedEvent(event: RoomUnitHandItemReceivedEvent): void + { + if(!this.listener) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const parser = event.getParser(); + + if(!parser) return; + + GetEventDispatcher().dispatchEvent(new RoomSessionChatEvent(RoomSessionChatEvent.CHAT_EVENT, session, parser.giverUserId, '', RoomSessionChatEvent.CHAT_TYPE_HAND_ITEM_RECEIVED, SystemChatStyleEnum.GENERIC, [], parser.handItemType)); + } + + private onRespectReceivedEvent(event: RespectReceivedEvent): void + { + if(!this.listener) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const parser = event.getParser(); + + if(!parser) return; + + const userData = session.userDataManager.getUserData(parser.userId); + + if(!userData) return; + + GetEventDispatcher().dispatchEvent(new RoomSessionChatEvent(RoomSessionChatEvent.CHAT_EVENT, session, userData.roomIndex, '', RoomSessionChatEvent.CHAT_TYPE_RESPECT, SystemChatStyleEnum.GENERIC)); + } + + private onPetRespectNoficationEvent(event: PetRespectNoficationEvent): void + { + if(!this.listener) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const parser = event.getParser(); + + if(!parser) return; + + const petData = session.userDataManager.getPetData(parser.petData.id); + + if(!petData) return; + + let chatType = RoomSessionChatEvent.CHAT_TYPE_PETRESPECT; + + if(parser.isTreat) chatType = RoomSessionChatEvent.CHAT_TYPE_PETTREAT; + + GetEventDispatcher().dispatchEvent(new RoomSessionChatEvent(RoomSessionChatEvent.CHAT_EVENT, session, petData.roomIndex, '', chatType, SystemChatStyleEnum.GENERIC)); + } + + private onPetSupplementedNotificationEvent(event: PetSupplementedNotificationEvent): void + { + if(!this.listener) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const parser = event.getParser(); + + if(!parser) return; + + const petData = session.userDataManager.getPetData(parser.petId); + + if(!petData) return; + + let userRoomIndex = -1; + + const userData = session.userDataManager.getUserData(parser.userId); + + if(userData) userRoomIndex = userData.roomIndex; + + let chatType = RoomSessionChatEvent.CHAT_TYPE_PETREVIVE; + + switch(parser.supplementType) + { + case PetSupplementTypeEnum.REVIVE: + chatType = RoomSessionChatEvent.CHAT_TYPE_PETREVIVE; + break; + case PetSupplementTypeEnum.REBREED_FERTILIZER: + chatType = RoomSessionChatEvent.CHAT_TYPE_PET_REBREED_FERTILIZE; + break; + case PetSupplementTypeEnum.SPEED_FERTILIZER: + chatType = RoomSessionChatEvent.CHAT_TYPE_PET_SPEED_FERTILIZE; + break; + } + + GetEventDispatcher().dispatchEvent(new RoomSessionChatEvent(RoomSessionChatEvent.CHAT_EVENT, session, petData.roomIndex, '', chatType, SystemChatStyleEnum.GENERIC, null, userRoomIndex)); + } + + private onFloodControlEvent(event: FloodControlEvent): void + { + if(!this.listener) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const parser = event.getParser(); + + if(!parser) return; + + const seconds = parser.seconds; + + GetEventDispatcher().dispatchEvent(new RoomSessionChatEvent(RoomSessionChatEvent.FLOOD_EVENT, session, -1, seconds.toString(), 0, 0)); + } + + private onRemainingMuteEvent(event: RemainingMuteEvent): void + { + if(!this.listener) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const parser = event.getParser(); + + if(!parser) return; + + GetEventDispatcher().dispatchEvent(new RoomSessionChatEvent(RoomSessionChatEvent.CHAT_EVENT, session, session.ownRoomIndex, '', RoomSessionChatEvent.CHAT_TYPE_MUTE_REMAINING, SystemChatStyleEnum.GENERIC, [], parser.seconds)); + } +} diff --git a/packages/session/src/handler/RoomDataHandler.ts b/packages/session/src/handler/RoomDataHandler.ts new file mode 100644 index 0000000..67aa7d3 --- /dev/null +++ b/packages/session/src/handler/RoomDataHandler.ts @@ -0,0 +1,40 @@ +import { IConnection, IRoomHandlerListener } from '@nitrots/api'; +import { GetGuestRoomResultEvent } from '@nitrots/communication'; +import { GetEventDispatcher, RoomSessionEvent, RoomSessionPropertyUpdateEvent } from '@nitrots/events'; +import { BaseHandler } from './BaseHandler'; + +export class RoomDataHandler extends BaseHandler +{ + constructor(connection: IConnection, listener: IRoomHandlerListener) + { + super(connection, listener); + + connection.addMessageEvent(new GetGuestRoomResultEvent(this.onGetGuestRoomResultEvent.bind(this))); + } + + private onGetGuestRoomResultEvent(event: GetGuestRoomResultEvent): void + { + if(!(event instanceof GetGuestRoomResultEvent)) return; + + const parser = event.getParser(); + + if(!parser) return; + + if(parser.roomForward) return; + + const roomSession = this.listener.getSession(this.roomId); + + if(!roomSession) return; + + const roomData = parser.data; + + roomSession.tradeMode = roomData.tradeMode; + roomSession.isGuildRoom = (roomData.habboGroupId !== 0); + roomSession.doorMode = roomData.doorMode; + roomSession.allowPets = roomData.allowPets; + roomSession.moderationSettings = parser.moderation; + + GetEventDispatcher().dispatchEvent(new RoomSessionPropertyUpdateEvent(RoomSessionPropertyUpdateEvent.RSDUE_ALLOW_PETS, roomSession)); + GetEventDispatcher().dispatchEvent(new RoomSessionEvent(RoomSessionEvent.ROOM_DATA, roomSession)); + } +} diff --git a/packages/session/src/handler/RoomDimmerPresetsHandler.ts b/packages/session/src/handler/RoomDimmerPresetsHandler.ts new file mode 100644 index 0000000..09b5b5b --- /dev/null +++ b/packages/session/src/handler/RoomDimmerPresetsHandler.ts @@ -0,0 +1,44 @@ +import { IConnection, IRoomHandlerListener } from '@nitrots/api'; +import { RoomDimmerPresetsEvent } from '@nitrots/communication'; +import { GetEventDispatcher, RoomSessionDimmerPresetsEvent } from '@nitrots/events'; +import { BaseHandler } from './BaseHandler'; + +export class RoomDimmerPresetsHandler extends BaseHandler +{ + constructor(connection: IConnection, listener: IRoomHandlerListener) + { + super(connection, listener); + + connection.addMessageEvent(new RoomDimmerPresetsEvent(this.onRoomDimmerPresets.bind(this))); + } + + private onRoomDimmerPresets(event: RoomDimmerPresetsEvent): void + { + if(!event) return; + + const parser = event.getParser(); + + if(!parser) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const presetEvent = new RoomSessionDimmerPresetsEvent(RoomSessionDimmerPresetsEvent.ROOM_DIMMER_PRESETS, session); + + presetEvent.selectedPresetId = parser.selectedPresetId; + + let i = 0; + + while(i < parser.presetCount) + { + const preset = parser.getPreset(i); + + if(preset) presetEvent.storePreset(preset.id, preset.type, preset.color, preset.brightness); + + i++; + } + + GetEventDispatcher().dispatchEvent(presetEvent); + } +} diff --git a/packages/session/src/handler/RoomPermissionsHandler.ts b/packages/session/src/handler/RoomPermissionsHandler.ts new file mode 100644 index 0000000..3655cde --- /dev/null +++ b/packages/session/src/handler/RoomPermissionsHandler.ts @@ -0,0 +1,48 @@ +import { IConnection, IRoomHandlerListener, RoomControllerLevel } from '@nitrots/api'; +import { RoomRightsClearEvent, RoomRightsEvent, RoomRightsOwnerEvent } from '@nitrots/communication'; +import { BaseHandler } from './BaseHandler'; + +export class RoomPermissionsHandler extends BaseHandler +{ + constructor(connection: IConnection, listener: IRoomHandlerListener) + { + super(connection, listener); + + connection.addMessageEvent(new RoomRightsEvent(this.onRoomRightsEvent.bind(this))); + connection.addMessageEvent(new RoomRightsClearEvent(this.onRoomRightsClearEvent.bind(this))); + connection.addMessageEvent(new RoomRightsOwnerEvent(this.onRoomRightsOwnerEvent.bind(this))); + } + + private onRoomRightsEvent(event: RoomRightsEvent): void + { + if(!(event instanceof RoomRightsEvent)) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + session.setControllerLevel(event.getParser().controllerLevel); + } + + private onRoomRightsClearEvent(event: RoomRightsClearEvent): void + { + if(!(event instanceof RoomRightsClearEvent)) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + session.setControllerLevel(RoomControllerLevel.NONE); + } + + private onRoomRightsOwnerEvent(event: RoomRightsOwnerEvent): void + { + if(!(event instanceof RoomRightsOwnerEvent)) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + session.setRoomOwner(); + } +} diff --git a/packages/session/src/handler/RoomPresentHandler.ts b/packages/session/src/handler/RoomPresentHandler.ts new file mode 100644 index 0000000..3fd8525 --- /dev/null +++ b/packages/session/src/handler/RoomPresentHandler.ts @@ -0,0 +1,33 @@ +import { IConnection, IRoomHandlerListener } from '@nitrots/api'; +import { PresentOpenedMessageEvent } from '@nitrots/communication'; +import { GetEventDispatcher, RoomSessionPresentEvent } from '@nitrots/events'; +import { BaseHandler } from './BaseHandler'; + +export class RoomPresentHandler extends BaseHandler +{ + constructor(connection: IConnection, listener: IRoomHandlerListener) + { + super(connection, listener); + + if(!connection) return; + + connection.addMessageEvent(new PresentOpenedMessageEvent(this.onFurnitureGiftOpenedEvent.bind(this))); + } + + private onFurnitureGiftOpenedEvent(event: PresentOpenedMessageEvent): void + { + if(!event) return; + + const parser = event.getParser(); + + if(!parser) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + GetEventDispatcher().dispatchEvent(new RoomSessionPresentEvent(RoomSessionPresentEvent.RSPE_PRESENT_OPENED, session, parser.classId, parser.itemType, parser.productCode, parser.placedItemId, parser.placedItemType, parser.placedInRoom, parser.petFigureString)); + + } + +} diff --git a/packages/session/src/handler/RoomSessionHandler.ts b/packages/session/src/handler/RoomSessionHandler.ts new file mode 100644 index 0000000..717c9e3 --- /dev/null +++ b/packages/session/src/handler/RoomSessionHandler.ts @@ -0,0 +1,113 @@ +import { IConnection, IRoomHandlerListener } from '@nitrots/api'; +import { DesktopViewEvent, FlatAccessDeniedMessageEvent, GoToFlatMessageComposer, RoomDoorbellAcceptedEvent, RoomEnterEvent, RoomReadyMessageEvent, YouAreSpectatorMessageEvent } from '@nitrots/communication'; +import { GetEventDispatcher, RoomSessionDoorbellEvent, RoomSessionSpectatorModeEvent } from '@nitrots/events'; +import { BaseHandler } from './BaseHandler'; + +export class RoomSessionHandler extends BaseHandler +{ + public static RS_CONNECTED: string = 'RS_CONNECTED'; + public static RS_READY: string = 'RS_READY'; + public static RS_DISCONNECTED: string = 'RS_DISCONNECTED'; + + constructor(connection: IConnection, listener: IRoomHandlerListener) + { + super(connection, listener); + + connection.addMessageEvent(new RoomEnterEvent(this.onRoomEnterEvent.bind(this))); + connection.addMessageEvent(new RoomReadyMessageEvent(this.onRoomReadyMessageEvent.bind(this))); + connection.addMessageEvent(new DesktopViewEvent(this.onDesktopViewEvent.bind(this))); + connection.addMessageEvent(new RoomDoorbellAcceptedEvent(this.onRoomDoorbellAcceptedEvent.bind(this))); + connection.addMessageEvent(new FlatAccessDeniedMessageEvent(this.onRoomDoorbellRejectedEvent.bind(this))); + connection.addMessageEvent(new YouAreSpectatorMessageEvent(this.onYouAreSpectatorMessageEvent.bind(this))); + } + + private onRoomEnterEvent(event: RoomEnterEvent): void + { + if(!(event instanceof RoomEnterEvent)) return; + + if(this.listener) this.listener.sessionUpdate(this.roomId, RoomSessionHandler.RS_CONNECTED); + } + + private onRoomReadyMessageEvent(event: RoomReadyMessageEvent): void + { + if(!(event instanceof RoomReadyMessageEvent)) return; + + const fromRoomId = this.roomId; + const toRoomId = event.getParser().roomId; + + if(this.listener) + { + this.listener.sessionReinitialize(fromRoomId, toRoomId); + this.listener.sessionUpdate(this.roomId, RoomSessionHandler.RS_READY); + } + } + + private onDesktopViewEvent(event: DesktopViewEvent): void + { + if(!(event instanceof DesktopViewEvent)) return; + + if(this.listener) this.listener.sessionUpdate(this.roomId, RoomSessionHandler.RS_DISCONNECTED); + } + + private onRoomDoorbellAcceptedEvent(event: RoomDoorbellAcceptedEvent): void + { + if(!(event instanceof RoomDoorbellAcceptedEvent) || !this.listener) return; + + const parser = event.getParser(); + + if(!parser) return; + + const username = parser.userName; + + if(!username || !username.length) + { + this.connection.send(new GoToFlatMessageComposer(this.roomId)); + } + else + { + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + GetEventDispatcher().dispatchEvent(new RoomSessionDoorbellEvent(RoomSessionDoorbellEvent.RSDE_ACCEPTED, session, username)); + } + } + + private onRoomDoorbellRejectedEvent(event: FlatAccessDeniedMessageEvent): void + { + if(!(event instanceof FlatAccessDeniedMessageEvent) || !this.listener) return; + + const parser = event.getParser(); + + if(!parser) return; + + const username = parser.userName; + + if(!username || !username.length) + { + this.listener.sessionUpdate(this.roomId, RoomSessionHandler.RS_DISCONNECTED); + } + else + { + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + GetEventDispatcher().dispatchEvent(new RoomSessionDoorbellEvent(RoomSessionDoorbellEvent.RSDE_REJECTED, session, username)); + } + } + + private onYouAreSpectatorMessageEvent(event: YouAreSpectatorMessageEvent): void + { + if(this.listener) + { + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + session.isSpectator = true; + + GetEventDispatcher().dispatchEvent(new RoomSessionSpectatorModeEvent(RoomSessionSpectatorModeEvent.SPECTATOR_MODE, session)); + } + } +} diff --git a/packages/session/src/handler/RoomUsersHandler.ts b/packages/session/src/handler/RoomUsersHandler.ts new file mode 100644 index 0000000..772502e --- /dev/null +++ b/packages/session/src/handler/RoomUsersHandler.ts @@ -0,0 +1,475 @@ +import { IConnection, IRoomHandlerListener, IRoomUserData } from '@nitrots/api'; +import { BotErrorEvent, ConfirmBreedingRequestEvent, ConfirmBreedingResultEvent, DoorbellMessageEvent, FavoriteMembershipUpdateMessageEvent, NestBreedingSuccessEvent, NewFriendRequestEvent, PetBreedingMessageEvent, PetBreedingResultEvent, PetFigureUpdateEvent, PetInfoEvent, PetLevelUpdateMessageEvent, PetPlacingErrorEvent, PetStatusUpdateEvent, RoomUnitDanceEvent, RoomUnitEvent, RoomUnitInfoEvent, RoomUnitRemoveEvent, UserCurrentBadgesEvent, UserNameChangeMessageEvent } from '@nitrots/communication'; +import { GetEventDispatcher, RoomSessionConfirmPetBreedingEvent, RoomSessionConfirmPetBreedingResultEvent, RoomSessionDanceEvent, RoomSessionDoorbellEvent, RoomSessionErrorMessageEvent, RoomSessionFavoriteGroupUpdateEvent, RoomSessionFriendRequestEvent, RoomSessionNestBreedingSuccessEvent, RoomSessionPetBreedingEvent, RoomSessionPetBreedingResultEvent, RoomSessionPetFigureUpdateEvent, RoomSessionPetInfoUpdateEvent, RoomSessionPetLevelUpdateEvent, RoomSessionPetStatusUpdateEvent, RoomSessionUserBadgesEvent, RoomSessionUserDataUpdateEvent, RoomSessionUserFigureUpdateEvent } from '@nitrots/events'; +import { RoomPetData } from '../RoomPetData'; +import { RoomUserData } from '../RoomUserData'; +import { BaseHandler } from './BaseHandler'; + +export class RoomUsersHandler extends BaseHandler +{ + constructor(connection: IConnection, listener: IRoomHandlerListener) + { + super(connection, listener); + + connection.addMessageEvent(new RoomUnitEvent(this.onRoomUnitEvent.bind(this))); + connection.addMessageEvent(new RoomUnitInfoEvent(this.onRoomUnitInfoEvent.bind(this))); + connection.addMessageEvent(new RoomUnitRemoveEvent(this.onRoomUnitRemoveEvent.bind(this))); + connection.addMessageEvent(new RoomUnitDanceEvent(this.onRoomUnitDanceEvent.bind(this))); + connection.addMessageEvent(new UserCurrentBadgesEvent(this.onUserCurrentBadgesEvent.bind(this))); + connection.addMessageEvent(new DoorbellMessageEvent(this.onRoomDoorbellEvent.bind(this))); + connection.addMessageEvent(new UserNameChangeMessageEvent(this.onUserNameChangeMessageEvent.bind(this))); + connection.addMessageEvent(new NewFriendRequestEvent(this.onNewFriendRequestEvent.bind(this))); + connection.addMessageEvent(new PetInfoEvent(this.onPetInfoEvent.bind(this))); + connection.addMessageEvent(new PetStatusUpdateEvent(this.onPetStatusUpdateEvent.bind(this))); + connection.addMessageEvent(new PetBreedingMessageEvent(this.onPetBreedingMessageEvent.bind(this))); + connection.addMessageEvent(new PetLevelUpdateMessageEvent(this.onPetLevelUpdateMessageEvent.bind(this))); + connection.addMessageEvent(new ConfirmBreedingResultEvent(this.onConfirmBreedingResultEvent.bind(this))); + connection.addMessageEvent(new NestBreedingSuccessEvent(this.onNestBreedingSuccessEvent.bind(this))); + connection.addMessageEvent(new ConfirmBreedingRequestEvent(this.onConfirmBreedingRequestEvent.bind(this))); + connection.addMessageEvent(new PetFigureUpdateEvent(this.onPetFigureUpdateEvent.bind(this))); + connection.addMessageEvent(new PetBreedingResultEvent(this.onPetBreedingResultEvent.bind(this))); + connection.addMessageEvent(new PetPlacingErrorEvent(this.onPetPlacingError.bind(this))); + connection.addMessageEvent(new BotErrorEvent(this.onBotError.bind(this))); + connection.addMessageEvent(new FavoriteMembershipUpdateMessageEvent(this.onFavoriteMembershipUpdateMessageEvent.bind(this))); + } + + private onRoomUnitEvent(event: RoomUnitEvent): void + { + if(!this.listener) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const users = event.getParser().users; + + const usersToAdd: IRoomUserData[] = []; + + if(users && users.length) + { + for(const user of users) + { + if(!user) continue; + + const userData = new RoomUserData(user.roomIndex); + + userData.name = user.name; + userData.custom = user.custom; + userData.activityPoints = user.activityPoints; + userData.figure = user.figure; + userData.type = user.userType; + userData.webID = user.webID; + userData.groupId = user.groupID; + userData.groupName = user.groupName; + userData.groupStatus = user.groupStatus; + userData.sex = user.sex; + userData.ownerId = user.ownerId; + userData.ownerName = user.ownerName; + userData.rarityLevel = user.rarityLevel; + userData.hasSaddle = user.hasSaddle; + userData.isRiding = user.isRiding; + userData.canBreed = user.canBreed; + userData.canHarvest = user.canHarvest; + userData.canRevive = user.canRevive; + userData.hasBreedingPermission = user.hasBreedingPermission; + userData.petLevel = user.petLevel; + userData.botSkills = user.botSkills; + userData.isModerator = user.isModerator; + + if(!session.userDataManager.getUserData(user.roomIndex)) usersToAdd.push(userData); + + session.userDataManager.updateUserData(userData); + } + } + + GetEventDispatcher().dispatchEvent(new RoomSessionUserDataUpdateEvent(session, usersToAdd)); + } + + private onRoomUnitInfoEvent(event: RoomUnitInfoEvent): void + { + if(!this.listener) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const parser = event.getParser(); + + if(!parser) return; + + session.userDataManager.updateFigure(parser.unitId, parser.figure, parser.gender, false, false); + session.userDataManager.updateMotto(parser.unitId, parser.motto); + session.userDataManager.updateAchievementScore(parser.unitId, parser.achievementScore); + + GetEventDispatcher().dispatchEvent(new RoomSessionUserFigureUpdateEvent(session, parser.unitId, parser.figure, parser.gender, parser.motto, parser.achievementScore)); + + } + + private onRoomUnitRemoveEvent(event: RoomUnitRemoveEvent): void + { + if(!this.listener) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + session.userDataManager.removeUserData(event.getParser().unitId); + } + + private onRoomUnitDanceEvent(event: RoomUnitDanceEvent): void + { + if(!this.listener) return; + + const parser = event.getParser(); + + if(!parser) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + GetEventDispatcher().dispatchEvent(new RoomSessionDanceEvent(session, parser.unitId, parser.danceId)); + } + + private onUserCurrentBadgesEvent(event: UserCurrentBadgesEvent): void + { + if(!this.listener) return; + + const parser = event.getParser(); + + if(!parser) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + session.userDataManager.setUserBadges(parser.userId, parser.badges); + + GetEventDispatcher().dispatchEvent(new RoomSessionUserBadgesEvent(session, parser.userId, parser.badges)); + } + + private onRoomDoorbellEvent(event: DoorbellMessageEvent): void + { + if(!this.listener) return; + + const parser = event.getParser(); + + if(!parser) return; + + const username = parser.userName; + + if(!username || !username.length) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + GetEventDispatcher().dispatchEvent(new RoomSessionDoorbellEvent(RoomSessionDoorbellEvent.DOORBELL, session, username)); + } + + private onUserNameChangeMessageEvent(event: UserNameChangeMessageEvent): void + { + if(!this.listener) return; + + const parser = event.getParser(); + + if(!parser) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + session.userDataManager.updateName(parser.id, parser.newName); + } + + private onNewFriendRequestEvent(event: NewFriendRequestEvent): void + { + if(!this.listener) return; + + const parser = event.getParser(); + + if(!parser) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const request = parser.request; + + GetEventDispatcher().dispatchEvent(new RoomSessionFriendRequestEvent(session, request.requestId, request.requesterUserId, request.requesterName)); + } + + private onPetInfoEvent(event: PetInfoEvent): void + { + if(!this.listener) return; + + const parser = event.getParser(); + + if(!parser) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const petData = new RoomPetData(); + + petData.id = parser.id; + petData.level = parser.level; + petData.maximumLevel = parser.maximumLevel; + petData.experience = parser.experience; + petData.levelExperienceGoal = parser.levelExperienceGoal; + petData.energy = parser.energy; + petData.maximumEnergy = parser.maximumEnergy; + petData.happyness = parser.happyness; + petData.maximumHappyness = parser.maximumHappyness; + petData.ownerId = parser.ownerId; + petData.ownerName = parser.ownerName; + petData.respect = parser.respect; + petData.age = parser.age; + petData.unknownRarity = parser.unknownRarity; + petData.saddle = parser.saddle; + petData.rider = parser.rider; + petData.breedable = parser.breedable; + petData.fullyGrown = parser.fullyGrown; + petData.rarityLevel = parser.rarityLevel; + petData.dead = parser.dead; + petData.skillTresholds = parser.skillTresholds; + petData.publiclyRideable = parser.publiclyRideable; + petData.maximumTimeToLive = parser.maximumTimeToLive; + petData.remainingTimeToLive = parser.remainingTimeToLive; + petData.remainingGrowTime = parser.remainingGrowTime; + petData.publiclyBreedable = parser.publiclyBreedable; + + GetEventDispatcher().dispatchEvent(new RoomSessionPetInfoUpdateEvent(session, petData)); + } + + private onPetStatusUpdateEvent(event: PetStatusUpdateEvent): void + { + if(!this.listener) return; + + const parser = event.getParser(); + + if(!parser) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + session.userDataManager.updatePetBreedingStatus(parser.roomIndex, parser.canBreed, parser.canHarvest, parser.canRevive, parser.hasBreedingPermission); + + GetEventDispatcher().dispatchEvent(new RoomSessionPetStatusUpdateEvent(session, parser.petId, parser.canBreed, parser.canHarvest, parser.canRevive, parser.hasBreedingPermission)); + } + + private onPetBreedingMessageEvent(event: PetBreedingMessageEvent): void + { + if(!this.listener) return; + + const parser = event.getParser(); + + if(!parser) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + GetEventDispatcher().dispatchEvent(new RoomSessionPetBreedingEvent(session, parser.state, parser.ownPetId, parser.otherPetId)); + } + + private onPetLevelUpdateMessageEvent(event: PetLevelUpdateMessageEvent): void + { + if(!this.listener) return; + + const parser = event.getParser(); + + if(!parser) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + session.userDataManager.updatePetLevel(parser.roomIndex, parser.level); + + GetEventDispatcher().dispatchEvent(new RoomSessionPetLevelUpdateEvent(session, parser.petId, parser.level)); + } + + private onConfirmBreedingResultEvent(event: ConfirmBreedingResultEvent): void + { + if(!this.listener) return; + + const parser = event.getParser(); + + if(!parser) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + GetEventDispatcher().dispatchEvent(new RoomSessionConfirmPetBreedingResultEvent(session, parser.breedingNestStuffId, parser.result)); + } + + private onNestBreedingSuccessEvent(event: NestBreedingSuccessEvent): void + { + if(!this.listener) return; + + const parser = event.getParser(); + + if(!parser) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + GetEventDispatcher().dispatchEvent(new RoomSessionNestBreedingSuccessEvent(session, parser.petId, parser.rarityCategory)); + } + + private onConfirmBreedingRequestEvent(event: ConfirmBreedingRequestEvent): void + { + if(!this.listener) return; + + const parser = event.getParser(); + + if(!parser) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + GetEventDispatcher().dispatchEvent(new RoomSessionConfirmPetBreedingEvent(session, parser.nestId, parser.pet1, parser.pet2, parser.rarityCategories, parser.resultPetType)); + } + + private onPetFigureUpdateEvent(event: PetFigureUpdateEvent): void + { + if(!this.listener) return; + + const parser = event.getParser(); + + if(!parser) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const figure = parser.figureData.figuredata; + + session.userDataManager.updateFigure(parser.roomIndex, figure, '', parser.hasSaddle, parser.isRiding); + + GetEventDispatcher().dispatchEvent(new RoomSessionPetFigureUpdateEvent(session, parser.petId, figure)); + } + + private onPetBreedingResultEvent(event: PetBreedingResultEvent): void + { + if(!this.listener) return; + + const parser = event.getParser(); + + if(!parser) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + GetEventDispatcher().dispatchEvent(new RoomSessionPetBreedingResultEvent(session, parser.resultData, parser.otherResultData)); + } + + private onPetPlacingError(event: PetPlacingErrorEvent): void + { + if(!event) return; + + if(!this.listener) return; + + const parser = event.getParser(); + + if(!parser) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + let type: string = ''; + + switch(parser.errorCode) + { + case 0: + type = RoomSessionErrorMessageEvent.RSEME_PETS_FORBIDDEN_IN_HOTEL; + break; + case 1: + type = RoomSessionErrorMessageEvent.RSEME_PETS_FORBIDDEN_IN_FLAT; + break; + case 2: + type = RoomSessionErrorMessageEvent.RSEME_MAX_PETS; + break; + case 3: + type = RoomSessionErrorMessageEvent.RSEME_NO_FREE_TILES_FOR_PET; + break; + case 4: + type = RoomSessionErrorMessageEvent.RSEME_SELECTED_TILE_NOT_FREE_FOR_PET; + break; + case 5: + type = RoomSessionErrorMessageEvent.RSEME_MAX_NUMBER_OF_OWN_PETS; + break; + } + + if(!type || type.length == 0) return; + + GetEventDispatcher().dispatchEvent(new RoomSessionErrorMessageEvent(type, session)); + } + + private onBotError(event: BotErrorEvent): void + { + if(!event) return; + + if(!this.listener) return; + + const parser = event.getParser(); + + if(!parser) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + let type: string = ''; + + switch(parser.errorCode) + { + case 0: + type = RoomSessionErrorMessageEvent.RSEME_BOTS_FORBIDDEN_IN_HOTEL; + break; + case 1: + type = RoomSessionErrorMessageEvent.RSEME_BOTS_FORBIDDEN_IN_FLAT; + break; + case 2: + type = RoomSessionErrorMessageEvent.RSEME_BOT_LIMIT_REACHED; + break; + case 3: + type = RoomSessionErrorMessageEvent.RSEME_SELECTED_TILE_NOT_FREE_FOR_BOT; + break; + case 4: + type = RoomSessionErrorMessageEvent.RSEME_BOT_NAME_NOT_ACCEPTED; + break; + } + + if(!type || type.length == 0) return; + + GetEventDispatcher().dispatchEvent(new RoomSessionErrorMessageEvent(type, session)); + } + + private onFavoriteMembershipUpdateMessageEvent(event: FavoriteMembershipUpdateMessageEvent): void + { + if(!this.listener) return; + + const parser = event.getParser(); + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const userData = session.userDataManager.getUserDataByIndex(parser.roomIndex); + + if(!userData) return; + + userData.groupId = parser.groupId; + userData.groupName = parser.groupName; + + GetEventDispatcher().dispatchEvent(new RoomSessionFavoriteGroupUpdateEvent(session, parser.roomIndex, parser.groupId, parser.status, parser.groupName)); + } +} diff --git a/packages/session/src/handler/WordQuizHandler.ts b/packages/session/src/handler/WordQuizHandler.ts new file mode 100644 index 0000000..c83f25b --- /dev/null +++ b/packages/session/src/handler/WordQuizHandler.ts @@ -0,0 +1,79 @@ +import { IConnection, IRoomHandlerListener } from '@nitrots/api'; +import { QuestionAnsweredEvent, QuestionEvent, QuestionFinishedEvent } from '@nitrots/communication'; +import { GetEventDispatcher, RoomSessionWordQuizEvent } from '@nitrots/events'; +import { BaseHandler } from './BaseHandler'; + +export class WordQuizHandler extends BaseHandler +{ + constructor(connection: IConnection, listener: IRoomHandlerListener) + { + super(connection, listener); + + connection.addMessageEvent(new QuestionEvent(this.onQuestionEvent.bind(this))); + connection.addMessageEvent(new QuestionAnsweredEvent(this.onQuestionAnsweredEvent.bind(this))); + connection.addMessageEvent(new QuestionFinishedEvent(this.onQuestionFinishedEvent.bind(this))); + } + + private onQuestionEvent(event: QuestionEvent): void + { + if(!this.listener) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const parser = event.getParser(); + + if(!parser) return; + + const quizEvent = new RoomSessionWordQuizEvent(RoomSessionWordQuizEvent.QUESTION, session, parser.pollId); + + quizEvent.question = parser.question; + quizEvent.duration = parser.duration; + quizEvent.pollType = parser.pollType; + quizEvent.questionId = parser.questionId; + quizEvent.pollId = parser.pollId; + + GetEventDispatcher().dispatchEvent(quizEvent); + } + + private onQuestionAnsweredEvent(event: QuestionAnsweredEvent): void + { + if(!this.listener) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const parser = event.getParser(); + + if(!parser) return; + + const quizEvent = new RoomSessionWordQuizEvent(RoomSessionWordQuizEvent.ANSWERED, session, parser.userId); + + quizEvent.value = parser.value; + quizEvent.userId = parser.userId; + quizEvent.answerCounts = parser.answerCounts; + + GetEventDispatcher().dispatchEvent(quizEvent); + } + + private onQuestionFinishedEvent(event: QuestionFinishedEvent): void + { + if(!this.listener) return; + + const session = this.listener.getSession(this.roomId); + + if(!session) return; + + const parser = event.getParser(); + + if(!parser) return; + + const quizEvent = new RoomSessionWordQuizEvent(RoomSessionWordQuizEvent.FINISHED, session); + quizEvent.questionId = parser.questionId; + quizEvent.answerCounts = parser.answerCounts; + + GetEventDispatcher().dispatchEvent(quizEvent); + } +} diff --git a/packages/session/src/handler/index.ts b/packages/session/src/handler/index.ts new file mode 100644 index 0000000..67d7eb6 --- /dev/null +++ b/packages/session/src/handler/index.ts @@ -0,0 +1,12 @@ +export * from './BaseHandler'; +export * from './GenericErrorHandler'; +export * from './PetPackageHandler'; +export * from './PollHandler'; +export * from './RoomChatHandler'; +export * from './RoomDataHandler'; +export * from './RoomDimmerPresetsHandler'; +export * from './RoomPermissionsHandler'; +export * from './RoomPresentHandler'; +export * from './RoomSessionHandler'; +export * from './RoomUsersHandler'; +export * from './WordQuizHandler'; diff --git a/packages/session/src/index.ts b/packages/session/src/index.ts new file mode 100644 index 0000000..aeebbef --- /dev/null +++ b/packages/session/src/index.ts @@ -0,0 +1,15 @@ +export * from './GetRoomSessionManager'; +export * from './GetSessionDataManager'; +export * from './GroupInformationManager'; +export * from './HabboClubLevelEnum'; +export * from './IgnoredUsersManager'; +export * from './RoomPetData'; +export * from './RoomSession'; +export * from './RoomSessionManager'; +export * from './RoomUserData'; +export * from './SessionDataManager'; +export * from './UserDataManager'; +export * from './badge'; +export * from './furniture'; +export * from './handler'; +export * from './product'; diff --git a/packages/session/src/product/ProductData.ts b/packages/session/src/product/ProductData.ts new file mode 100644 index 0000000..b5984aa --- /dev/null +++ b/packages/session/src/product/ProductData.ts @@ -0,0 +1,30 @@ +import { IProductData } from '@nitrots/api'; + +export class ProductData implements IProductData +{ + private _type: string; + private _name: string; + private _description: string; + + constructor(type: string, name: string, description: string) + { + this._type = type; + this._name = name; + this._description = description; + } + + public get type(): string + { + return this._type; + } + + public get name(): string + { + return this._name; + } + + public get description(): string + { + return this._description; + } +} diff --git a/packages/session/src/product/ProductDataLoader.ts b/packages/session/src/product/ProductDataLoader.ts new file mode 100644 index 0000000..e8e846f --- /dev/null +++ b/packages/session/src/product/ProductDataLoader.ts @@ -0,0 +1,35 @@ +import { IProductData } from '@nitrots/api'; +import { GetConfiguration } from '@nitrots/configuration'; +import { ProductData } from './ProductData'; + +export class ProductDataLoader +{ + private _products: Map; + + constructor(products: Map) + { + this._products = products; + } + + public async init(): Promise + { + const url = GetConfiguration().getValue('productdata.url'); + + if(!url || !url.length) throw new Error('invalid product data url'); + + const response = await fetch(url); + + if(response.status !== 200) throw new Error('Invalid product data file'); + + const responseData = await response.json(); + + this.parseProducts(responseData.productdata); + } + + private parseProducts(data: { [index: string]: any }): void + { + if(!data) return; + + for(const product of data.product) (product && this._products.set(product.code, new ProductData(product.code, product.name, product.description))); + } +} diff --git a/packages/session/src/product/index.ts b/packages/session/src/product/index.ts new file mode 100644 index 0000000..ad61a98 --- /dev/null +++ b/packages/session/src/product/index.ts @@ -0,0 +1,2 @@ +export * from './ProductData'; +export * from './ProductDataLoader'; diff --git a/packages/session/tsconfig.json b/packages/session/tsconfig.json new file mode 100644 index 0000000..5e8757d --- /dev/null +++ b/packages/session/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./src", + "outDir": "./dist", + "sourceMap": false, + "declaration": true, + "experimentalDecorators": true, + "moduleResolution": "Node", + "esModuleInterop": true, + "importHelpers": true, + "isolatedModules": true, + "resolveJsonModule": true, + "downlevelIteration": true, + "allowSyntheticDefaultImports": true, + "allowJs": true, + "skipLibCheck": true, + "noEmit": true, + "strict": false, + "strictNullChecks": false, + "target": "ES6", + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "module": "ES6" + }, + "include": [ + "src" ] +} diff --git a/packages/sound/.eslintrc.json b/packages/sound/.eslintrc.json new file mode 100644 index 0000000..ad92133 --- /dev/null +++ b/packages/sound/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": [ "@nitrots/eslint-config" ] +} diff --git a/packages/sound/.gitignore b/packages/sound/.gitignore new file mode 100644 index 0000000..1413af9 --- /dev/null +++ b/packages/sound/.gitignore @@ -0,0 +1,51 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings +.git + +# System Files +.DS_Store +Thumbs.db + +*.zip +*.as +*.bin diff --git a/packages/sound/index.ts b/packages/sound/index.ts new file mode 100644 index 0000000..8420b10 --- /dev/null +++ b/packages/sound/index.ts @@ -0,0 +1 @@ +export * from './src'; diff --git a/packages/sound/package.json b/packages/sound/package.json new file mode 100644 index 0000000..f8b22f9 --- /dev/null +++ b/packages/sound/package.json @@ -0,0 +1,21 @@ +{ + "name": "@nitrots/sound", + "description": "Nitro sound module", + "version": "1.0.0", + "type": "module", + "license": "GPL-3.0", + "scripts": { + "compile": "tsc --project ./tsconfig.json --noEmit false", + "eslint": "eslint ./src --fix" + }, + "main": "./index", + "dependencies": { + "@nitrots/api": "1.0.0", + "@nitrots/communication": "1.0.0", + "@nitrots/eslint-config": "1.0.0", + "pixi.js": "^8.0.4" + }, + "devDependencies": { + "typescript": "~5.4.2" + } +} diff --git a/packages/sound/src/GetSoundManager.ts b/packages/sound/src/GetSoundManager.ts new file mode 100644 index 0000000..53d713b --- /dev/null +++ b/packages/sound/src/GetSoundManager.ts @@ -0,0 +1,5 @@ +import { SoundManager } from './SoundManager'; + +const soundManager = new SoundManager(); + +export const GetSoundManager = () => soundManager; diff --git a/packages/sound/src/SoundManager.ts b/packages/sound/src/SoundManager.ts new file mode 100644 index 0000000..ba69514 --- /dev/null +++ b/packages/sound/src/SoundManager.ts @@ -0,0 +1,194 @@ +import { IAdvancedMap, IMusicController, INitroEvent, ISoundManager } from '@nitrots/api'; +import { GetConfiguration } from '@nitrots/configuration'; +import { GetEventDispatcher, NitroSettingsEvent, NitroSoundEvent, RoomEngineEvent, RoomEngineObjectEvent, RoomEngineSamplePlaybackEvent } from '@nitrots/events'; +import { AdvancedMap, NitroLogger } from '@nitrots/utils'; +import { MusicController } from './music/MusicController'; + +export class SoundManager implements ISoundManager +{ + private _volumeSystem: number = 0.5; + private _volumeFurni: number = 0.5; + private _volumeTrax: number = 0.5; + + private _internalSamples: IAdvancedMap = new AdvancedMap(); + private _furniSamples: IAdvancedMap = new AdvancedMap(); + private _furnitureBeingPlayed: IAdvancedMap = new AdvancedMap(); + + private _musicController: IMusicController = new MusicController(); + + public async init(): Promise + { + this._musicController.init(); + + GetEventDispatcher().addEventListener(RoomEngineSamplePlaybackEvent.PLAY_SAMPLE, event => this.onEvent(event)); + GetEventDispatcher().addEventListener(RoomEngineObjectEvent.REMOVED, event => this.onEvent(event)); + GetEventDispatcher().addEventListener(RoomEngineEvent.DISPOSED, event => this.onEvent(event)); + GetEventDispatcher().addEventListener(NitroSettingsEvent.SETTINGS_UPDATED, event => this.onEvent(event)); + GetEventDispatcher().addEventListener(NitroSoundEvent.PLAY_SOUND, event => this.onEvent(event)); + } + + private onEvent(event: INitroEvent) + { + switch(event.type) + { + case RoomEngineSamplePlaybackEvent.PLAY_SAMPLE: { + const castedEvent = (event as RoomEngineSamplePlaybackEvent); + + this.playFurniSample(castedEvent.objectId, castedEvent.sampleId, castedEvent.pitch); + return; + } + case RoomEngineObjectEvent.REMOVED: { + const castedEvent = (event as RoomEngineObjectEvent); + + this.stopFurniSample(castedEvent.objectId); + return; + } + case RoomEngineEvent.DISPOSED: { + this._furnitureBeingPlayed.getKeys().forEach((objectId: number) => + { + this.stopFurniSample(objectId); + }); + return; + } + case NitroSettingsEvent.SETTINGS_UPDATED: { + const castedEvent = (event as NitroSettingsEvent); + + const volumeFurniUpdated = castedEvent.volumeFurni !== this._volumeFurni; + const volumeTraxUpdated = castedEvent.volumeTrax !== this._volumeTrax; + + this._volumeSystem = (castedEvent.volumeSystem / 100); + this._volumeFurni = (castedEvent.volumeFurni / 100); + this._volumeTrax = (castedEvent.volumeTrax / 100); + + if(volumeFurniUpdated) this.updateFurniSamplesVolume(this._volumeFurni); + + if(volumeTraxUpdated) this._musicController?.updateVolume(this._volumeTrax); + + return; + } + case NitroSoundEvent.PLAY_SOUND: { + const castedEvent = (event as NitroSoundEvent); + + this.playInternalSample(castedEvent.sampleCode); + return; + } + } + } + + private playSample(sample: HTMLAudioElement, volume: number, pitch: number = 1): void + { + sample.volume = volume; + sample.currentTime = 0; + + try + { + sample.play(); + } + catch (e) + { + NitroLogger.error(e); + } + } + + private playInternalSample(code: string): void + { + let sample = this._internalSamples.getValue(code); + + if(!sample) + { + const sampleUrl = GetConfiguration().getValue('sounds.url'); + + sample = new Audio(sampleUrl.replace('%sample%', code)); + this._internalSamples.add(code, sample); + } + + this.playSample(sample, this._volumeSystem); + } + + private playFurniSample(objectId: number, code: number, pitch: number): void + { + let sample = this._furniSamples.getValue(code); + + if(!sample) + { + const sampleUrl = GetConfiguration().getValue('external.samples.url'); + + sample = new Audio(sampleUrl.replace('%sample%', code.toString())); + this._furniSamples.add(code, sample); + } + + if(!this._furnitureBeingPlayed.hasKey(objectId)) this._furnitureBeingPlayed.add(objectId, code); + + sample.onended = event => this.stopFurniSample(objectId); + + sample.onpause = event => this.stopFurniSample(objectId); + + sample.onerror = event => this.stopFurniSample(objectId); + + this.playSample(sample, this._volumeFurni, pitch); + } + + private stopInternalSample(code: string): void + { + const sample = this._internalSamples.getValue(code); + + if(!sample) return; + + try + { + sample.pause(); + } + catch (e) + { + NitroLogger.error(e); + } + } + + private stopFurniSample(objectId: number): void + { + const furnitureBeingPlayed = this._furnitureBeingPlayed.getValue(objectId); + + if(!furnitureBeingPlayed) return; + + const sample = this._furniSamples.getValue(furnitureBeingPlayed); + + this._furnitureBeingPlayed.remove(objectId); + + if(!sample) return; + + try + { + sample.pause(); + } + catch (e) + { + NitroLogger.error(e); + } + } + + private updateInternalSamplesVolume(volume: number): void + { + this._internalSamples.getValues().forEach((sample: HTMLAudioElement) => + { + sample.volume = volume; + }); + } + + private updateFurniSamplesVolume(volume: number): void + { + this._furniSamples.getValues().forEach((sample: HTMLAudioElement) => + { + sample.volume = volume; + }); + } + + public get traxVolume(): number + { + return this._volumeTrax; + } + + public get musicController(): IMusicController + { + return this._musicController; + } +} diff --git a/packages/sound/src/common/SongDataEntry.ts b/packages/sound/src/common/SongDataEntry.ts new file mode 100644 index 0000000..0e74bd5 --- /dev/null +++ b/packages/sound/src/common/SongDataEntry.ts @@ -0,0 +1,24 @@ +import { ISongInfo } from '@nitrots/api'; + +export class SongDataEntry implements ISongInfo +{ + private _jukeboxDiskId:number = -1; + + constructor( + public readonly id: number, + public readonly length: number, + public readonly name: string, + public readonly creator: string, + public readonly songData: string = '' + ) {} + + public get diskId(): number + { + return this._jukeboxDiskId; + } + + public set diskId(k: number) + { + this._jukeboxDiskId = k; + } +} diff --git a/packages/sound/src/common/SongStartRequestData.ts b/packages/sound/src/common/SongStartRequestData.ts new file mode 100644 index 0000000..52cd171 --- /dev/null +++ b/packages/sound/src/common/SongStartRequestData.ts @@ -0,0 +1,51 @@ +export class SongStartRequestData +{ + private _songId: number; + private _startPos: number; + private _playLength: number; + private _playRequestTime: number; + private _fadeInSeconds: number; + private _fadeOutSeconds: number; + + constructor(songId: number, startPos: number, playLength: number, fadeInSeconds: number, fadeOutSeconds: number) + { + this._songId = songId; + this._startPos = startPos; + this._playLength = playLength; + this._fadeInSeconds = fadeInSeconds; + this._fadeOutSeconds = fadeOutSeconds; + this._playRequestTime = Date.now(); + } + + public get songId(): number + { + return this._songId; + } + + public get startPos(): number + { + if(this._startPos < 0) return 0; + + return this._startPos + ((Date.now() - this._playRequestTime) / 1000); + } + + public get playLength(): number + { + return this._playLength; + } + + public get playRequestTime(): number + { + return this._playRequestTime; + } + + public get fadeInSeconds(): number + { + return this._fadeInSeconds; + } + + public get fadeOutSeconds(): number + { + return this._fadeOutSeconds; + } +} diff --git a/packages/sound/src/common/index.ts b/packages/sound/src/common/index.ts new file mode 100644 index 0000000..c33b01f --- /dev/null +++ b/packages/sound/src/common/index.ts @@ -0,0 +1,2 @@ +export * from './SongDataEntry'; +export * from './SongStartRequestData'; diff --git a/packages/sound/src/index.ts b/packages/sound/src/index.ts new file mode 100644 index 0000000..1c517b2 --- /dev/null +++ b/packages/sound/src/index.ts @@ -0,0 +1,5 @@ +export * from './GetSoundManager'; +export * from './SoundManager'; +export * from './common'; +export * from './music'; +export * from './trax'; diff --git a/packages/sound/src/music/JukeboxPlaylistController.ts b/packages/sound/src/music/JukeboxPlaylistController.ts new file mode 100644 index 0000000..3351405 --- /dev/null +++ b/packages/sound/src/music/JukeboxPlaylistController.ts @@ -0,0 +1,190 @@ +import { IMessageEvent, IPlaylistController, ISongInfo } from '@nitrots/api'; +import { GetCommunication, GetJukeboxPlayListMessageComposer, JukeboxPlayListFullMessageEvent, JukeboxSongDisksMessageEvent, NowPlayingMessageEvent } from '@nitrots/communication'; +import { GetEventDispatcher, NowPlayingEvent, PlayListStatusEvent, SongInfoReceivedEvent } from '@nitrots/events'; +import { GetSoundManager } from '../GetSoundManager'; +import { SongDataEntry } from '../common'; +import { MusicPriorities } from './MusicPriorities'; + +export class JukeboxPlaylistController implements IPlaylistController +{ + private _isPlaying = false; + private _entries: ISongInfo[]; + private _currentSongId: number = -1; + private _missingSongInfo: number[] = []; + private _playPosition: number = -1; + private _disposed: boolean = false; + private _messageEvents: IMessageEvent[] = []; + + constructor() + { + this.onSongInfoReceivedEvent = this.onSongInfoReceivedEvent.bind(this); + } + + public init(): void + { + this._messageEvents = [ + new NowPlayingMessageEvent(this.onNowPlayingMessageEvent.bind(this)), + new JukeboxSongDisksMessageEvent(this.onJukeboxSongDisksMessageEvent.bind(this)), + new JukeboxPlayListFullMessageEvent(this.onJukeboxPlayListFullMessageEvent.bind(this)) + ]; + + this._messageEvents.forEach(event => GetCommunication().registerMessageEvent(event)); + + GetEventDispatcher().addEventListener(SongInfoReceivedEvent.SIR_TRAX_SONG_INFO_RECEIVED, this.onSongInfoReceivedEvent); + } + + public dispose(): void + { + if(this._disposed) return; + + this.stopPlaying(); + + GetEventDispatcher().removeEventListener(SongInfoReceivedEvent.SIR_TRAX_SONG_INFO_RECEIVED, this.onSongInfoReceivedEvent); + + this._messageEvents.forEach(event => GetCommunication().removeMessageEvent(event)); + + this._disposed = true; + } + + private onNowPlayingMessageEvent(event: NowPlayingMessageEvent): void + { + const parser = event.getParser(); + + this._isPlaying = (parser.currentSongId !== -1); + + if(parser.currentSongId >= 0) + { + GetSoundManager().musicController.playSong(parser.currentSongId, MusicPriorities.PRIORITY_ROOM_PLAYLIST, (parser.syncCount / 1000), 0, 1, 1); + this._currentSongId = parser.currentSongId; + } + else + { + this.stopPlaying(); + } + + if(parser.nextSongId >= 0) GetSoundManager().musicController.addSongInfoRequest(parser.nextSongId); + + this._playPosition = parser.currentPosition; + + GetEventDispatcher().dispatchEvent(new NowPlayingEvent(NowPlayingEvent.NPE_SONG_CHANGED, MusicPriorities.PRIORITY_ROOM_PLAYLIST, parser.currentSongId, parser.currentPosition)); + } + + private onJukeboxSongDisksMessageEvent(event: JukeboxSongDisksMessageEvent): void + { + const parser = event.getParser(); + + this._entries = []; + + for(let i = 0; i < parser.songDisks.length; i++) + { + const songId = parser.songDisks.getWithIndex(i); + const diskId = parser.songDisks.getKey(i); + + let songInfo = (GetSoundManager().musicController.getSongInfo(songId) as SongDataEntry); + + if(!songInfo) + { + songInfo = new SongDataEntry(songId, -1, null, null, null); + + if(this._missingSongInfo.indexOf(songId) < 0) + { + this._missingSongInfo.push(songId); + + GetSoundManager().musicController.requestSongInfoWithoutSamples(songId); + } + } + + songInfo.diskId = diskId; + + this._entries.push(songInfo); + } + + if(!this._missingSongInfo.length) GetEventDispatcher().dispatchEvent(new PlayListStatusEvent(PlayListStatusEvent.PLUE_PLAY_LIST_UPDATED)); + } + + private onJukeboxPlayListFullMessageEvent(event: JukeboxPlayListFullMessageEvent): void + { + GetEventDispatcher().dispatchEvent(new PlayListStatusEvent(PlayListStatusEvent.PLUE_PLAY_LIST_FULL)); + } + + private onSongInfoReceivedEvent(event: SongInfoReceivedEvent): void + { + for(let i = 0; i < this.length; i++) + { + const songData = this._entries[i]; + + if(songData.id === event.id) + { + const diskId = songData.diskId; + const updatedSongData = GetSoundManager().musicController.getSongInfo(event.id); + + if(updatedSongData) + { + updatedSongData.diskId = diskId; + this._entries[i] = updatedSongData; + } + + break; + } + } + + const missingIndex = this._missingSongInfo.indexOf(event.id); + + if(missingIndex >= 0) this._missingSongInfo.splice(missingIndex, 1); + + if(!this._missingSongInfo.length) GetEventDispatcher().dispatchEvent(new PlayListStatusEvent(PlayListStatusEvent.PLUE_PLAY_LIST_UPDATED)); + } + + public stopPlaying(): void + { + GetSoundManager().musicController.stop(this.priority); + + this._currentSongId = -1; + this._playPosition = -1; + this._isPlaying = false; + } + + public getEntry(index: number): ISongInfo + { + if((index < 0) || (index >= this._entries.length)) return null; + + return this._entries[index]; + } + + public requestPlayList(): void + { + GetCommunication().connection.send(new GetJukeboxPlayListMessageComposer()); + } + + public get priority(): number + { + return MusicPriorities.PRIORITY_ROOM_PLAYLIST; + } + + public get length(): number + { + if(!this._entries) return 0; + + return this._entries.length; + } + + public get playPosition(): number + { + return this._playPosition; + } + + public get currentSongId(): number + { + return this._currentSongId; + } + + public get isPlaying(): boolean + { + return this._isPlaying; + } + + public get entries(): ISongInfo[] + { + return this._entries; + } +} diff --git a/packages/sound/src/music/MusicController.ts b/packages/sound/src/music/MusicController.ts new file mode 100644 index 0000000..8eedb4b --- /dev/null +++ b/packages/sound/src/music/MusicController.ts @@ -0,0 +1,560 @@ +import { IAdvancedMap, IMusicController, IPlaylistController, ISongInfo } from '@nitrots/api'; +import { GetCommunication, GetNowPlayingMessageComposer, GetSongInfoMessageComposer, GetUserSongDisksMessageComposer, TraxSongInfoMessageEvent, UserSongDisksInventoryMessageEvent } from '@nitrots/communication'; +import { GetConfiguration } from '@nitrots/configuration'; +import { GetEventDispatcher, NotifyPlayedSongEvent, NowPlayingEvent, RoomObjectSoundMachineEvent, SongDiskInventoryReceivedEvent, SongInfoReceivedEvent, SoundManagerEvent } from '@nitrots/events'; +import { AdvancedMap } from '@nitrots/utils'; +import { GetSoundManager } from '../GetSoundManager'; +import { SongDataEntry, SongStartRequestData } from '../common'; +import { TraxData } from '../trax/TraxData'; +import { JukeboxPlaylistController } from './JukeboxPlaylistController'; +import { MusicPlayer } from './MusicPlayer'; +import { MusicPriorities } from './MusicPriorities'; + +export class MusicController implements IMusicController +{ + public static readonly SKIP_POSITION_SET: number = -1; + private static readonly MAXIMUM_NOTIFY_PRIORITY: number = MusicPriorities.PRIORITY_ROOM_PLAYLIST; + + private _timerInstance: number = 1; + private _songRequestList: number[] = []; + private _requestedSongs: Map = new Map(); + private _availableSongs: Map = new Map(); + private _songRequestsPerPriority: SongStartRequestData[] = []; + private _songRequestCountsPerPriority: number[] = []; + private _diskInventoryMissingData: number[] = []; + private _songDiskInventory: IAdvancedMap = new AdvancedMap(); + private _priorityPlaying: number = -1; + private _requestNumberPlaying: number = -1; + private _roomItemPlaylist: IPlaylistController; + private _musicPlayer: MusicPlayer; + + private _songIdPlaying: number = 1; + private _previousNotifiedSongId: number = -1; + private _previousNotificationTime: number = -1; + + constructor() + { + this.onJukeboxInit = this.onJukeboxInit.bind(this); + this.onJukeboxDispose = this.onJukeboxDispose.bind(this); + this.onSoundMachineInit = this.onSoundMachineInit.bind(this); + this.onSoundMachineDispose = this.onSoundMachineDispose.bind(this); + + this.onTraxSongComplete = this.onTraxSongComplete.bind(this); + } + + public init(): void + { + GetCommunication().registerMessageEvent(new TraxSongInfoMessageEvent(this.onTraxSongInfoMessageEvent.bind(this))); + GetCommunication().registerMessageEvent(new UserSongDisksInventoryMessageEvent(this.onSongDiskInventoryMessage.bind(this))); + + this._timerInstance = window.setInterval(this.onTick.bind(this), 1000); + this._musicPlayer = new MusicPlayer(GetConfiguration().getValue('external.samples.url')); + + GetEventDispatcher().addEventListener(RoomObjectSoundMachineEvent.JUKEBOX_INIT, this.onJukeboxInit); + GetEventDispatcher().addEventListener(RoomObjectSoundMachineEvent.JUKEBOX_DISPOSE, this.onJukeboxDispose); + GetEventDispatcher().addEventListener(RoomObjectSoundMachineEvent.SOUND_MACHINE_INIT, this.onSoundMachineInit); + GetEventDispatcher().addEventListener(RoomObjectSoundMachineEvent.SOUND_MACHINE_DISPOSE, this.onSoundMachineDispose); + GetEventDispatcher().addEventListener(SoundManagerEvent.TRAX_SONG_COMPLETE, this.onTraxSongComplete); + } + + public getRoomItemPlaylist(_arg_1?: number): IPlaylistController + { + return this._roomItemPlaylist; + } + + public get songDiskInventory(): IAdvancedMap + { + return this._songDiskInventory; + } + + public getSongDiskInventorySize(): number + { + return this._songDiskInventory.length; + } + + public getSongDiskInventoryDiskId(k: number): number + { + if(((k >= 0) && (k < this._songDiskInventory.length))) + { + return this._songDiskInventory.getKey(k); + } + return -1; + } + + public getSongDiskInventorySongId(k: number): number + { + if(((k >= 0) && (k < this._songDiskInventory.length))) + { + return this._songDiskInventory.getWithIndex(k); + } + return -1; + } + + public getSongInfo(songId: number): ISongInfo + { + const _local_2: SongDataEntry = this.getSongDataEntry(songId); + if(!_local_2) + { + this.requestSongInfoWithoutSamples(songId); + } + return _local_2; + } + + public getSongIdPlayingAtPriority(priority: number): number + { + if(priority !== this._priorityPlaying) + { + return -1; + } + return this._songIdPlaying; + } + + public stop(priority: number): void + { + const isCurrentPlayingPriority = (priority === this._priorityPlaying); + const isTopRequestPriority = (this.getTopRequestPriority() === priority); + if(isCurrentPlayingPriority) + { + this.resetSongStartRequest(priority); + this.stopSongAtPriority(priority); + } + else + { + this.resetSongStartRequest(priority); + if(isTopRequestPriority) + { + this.reRequestSongAtPriority(this._priorityPlaying); + } + } + } + + public addSongInfoRequest(k: number): void + { + this.requestSong(k, true); + } + + public requestSongInfoWithoutSamples(k: number): void + { + this.requestSong(k, false); + } + + public requestUserSongDisks(): void + { + GetCommunication().connection.send(new GetUserSongDisksMessageComposer()); + } + + public updateVolume(_arg_1: number): void + { + this._musicPlayer.setVolume(_arg_1); + } + + public dispose(): void + { + if(this._timerInstance) + { + clearInterval(this._timerInstance); + this._timerInstance = undefined; + } + + GetEventDispatcher().removeEventListener(RoomObjectSoundMachineEvent.JUKEBOX_INIT, this.onJukeboxInit); + GetEventDispatcher().removeEventListener(RoomObjectSoundMachineEvent.JUKEBOX_DISPOSE, this.onJukeboxDispose); + GetEventDispatcher().removeEventListener(RoomObjectSoundMachineEvent.SOUND_MACHINE_INIT, this.onSoundMachineInit); + GetEventDispatcher().removeEventListener(RoomObjectSoundMachineEvent.SOUND_MACHINE_DISPOSE, this.onSoundMachineDispose); + GetEventDispatcher().removeEventListener(SoundManagerEvent.TRAX_SONG_COMPLETE, this.onTraxSongComplete); + } + + public get samplesIdsInUse(): number[] + { + let _local_3: SongStartRequestData; + let _local_4: SongDataEntry; + let k = []; + for(let i = 0; i < this._songRequestsPerPriority.length; i++) + { + if(this._songRequestsPerPriority[i]) + { + _local_3 = this._songRequestsPerPriority[i]; + _local_4 = this._availableSongs.get(_local_3.songId); + if(_local_4) + { + const songData = _local_4.songData; + if(songData.length > 0) + { + const traxData = new TraxData(songData); + k = k.concat(traxData.getSampleIds()); + } + } + } + } + return k; + } + + public onSongLoaded(songId: number): void + { + const priority = this.getTopRequestPriority(); + if(priority >= 0) + { + const songIdAtTopPriority = this.getSongIdRequestedAtPriority(priority); + if(songId === songIdAtTopPriority) + { + this.playSongObject(priority, songId); + } + } + } + + public samplesUnloaded(_arg_1: number[]): void + { + throw new Error('Method not implemented.'); + } + + protected onTraxSongComplete(k: SoundManagerEvent): void + { + if(this.getSongIdPlayingAtPriority(this._priorityPlaying) === k.id) + { + if(((this.getTopRequestPriority() === this._priorityPlaying) && (this.getSongRequestCountAtPriority(this._priorityPlaying) == this._requestNumberPlaying))) + { + this.resetSongStartRequest(this._priorityPlaying); + } + const priorityPlaying = this._priorityPlaying; + this.playSongWithHighestPriority(); + if(priorityPlaying >= MusicPriorities.PRIORITY_SONG_PLAY) + { + GetEventDispatcher().dispatchEvent(new NowPlayingEvent(NowPlayingEvent.NPW_USER_STOP_SONG, priorityPlaying, k.id, -1)); + } + } + } + + private onTraxSongInfoMessageEvent(event: TraxSongInfoMessageEvent): void + { + const parser = event.getParser(); + + for(const song of parser.songs) + { + const songAvailable = !!this.getSongDataEntry(song.id); + const areSamplesRequested = !!this.areSamplesRequested(song.id); + + if(!songAvailable) + { + if(!areSamplesRequested) + { + //_local_9 = this._soundManager.loadTraxSong(_local_6.id, _local_6.data); + } + + const songInfoEntry: SongDataEntry = new SongDataEntry(song.id, song.length, song.name, song.creator, song.data); + this._availableSongs.set(song.id, songInfoEntry); + + const topRequestPriotityIndex: number = this.getTopRequestPriority(); + const songId: number = this.getSongIdRequestedAtPriority(topRequestPriotityIndex); + if(song.id === songId) + { + this.playSongObject(topRequestPriotityIndex, songId); + } + GetEventDispatcher().dispatchEvent(new SongInfoReceivedEvent(SongInfoReceivedEvent.SIR_TRAX_SONG_INFO_RECEIVED, song.id)); + while(this._diskInventoryMissingData.indexOf(song.id) != -1) + { + this._diskInventoryMissingData.splice(this._diskInventoryMissingData.indexOf(song.id), 1); + if(this._diskInventoryMissingData.length === 0) + { + GetEventDispatcher().dispatchEvent(new SongDiskInventoryReceivedEvent(SongDiskInventoryReceivedEvent.SDIR_SONG_DISK_INVENTORY_RECEIVENT_EVENT)); + } + } + + } + } + } + + private onSongDiskInventoryMessage(event: UserSongDisksInventoryMessageEvent): void + { + const parser = event.getParser(); + + this._songDiskInventory.reset(); + for(let i = 0; i < parser.songDiskCount; i++) + { + const diskId = parser.getDiskId(i); + const songId = parser.getSongId(i); + this._songDiskInventory.add(diskId, songId); + + if(!this._availableSongs.get(songId)) + { + this._diskInventoryMissingData.push(songId); + this.requestSongInfoWithoutSamples(songId); + } + } + if(this._diskInventoryMissingData.length === 0) + { + GetEventDispatcher().dispatchEvent(new SongDiskInventoryReceivedEvent(SongDiskInventoryReceivedEvent.SDIR_SONG_DISK_INVENTORY_RECEIVENT_EVENT)); + } + } + + private onTick(): void + { + if(this._songRequestList.length === 0) return; + + GetCommunication().connection.send(new GetSongInfoMessageComposer(...this._songRequestList)); + this._songRequestList = []; + } + + private requestSong(songId: number, arg2: boolean): void + { + if(this._requestedSongs.get(songId) === undefined) + { + this._requestedSongs.set(songId, arg2); + this._songRequestList.push(songId); + } + } + + private areSamplesRequested(k: number): boolean + { + if(!this._requestedSongs.get(k)) + { + return false; + } + return this._requestedSongs.get(k); + } + + private processSongEntryForPlaying(k: number, _arg_2: boolean = true): boolean + { + const songData: SongDataEntry = this.getSongDataEntry(k); + if(!songData) + { + this.addSongInfoRequest(k); + return false; + } + /* if(_local_3.soundObject == null) + { + _local_3.soundObject = this._soundManager.loadTraxSong(_local_3.id, _local_3.songData); + } + const _local_4:IHabboSound = _local_3.soundObject; + if(!_local_4.ready) + { + return false; + } */ + return true; + } + + public playSong(songId: number, priority: number, startPos: number = 0, playLength: number = 0, fadeInSeconds: number = 0.5, fadeOutSeconds: number = 0.5): boolean + { + if(!this.addSongStartRequest(priority, songId, startPos, playLength, fadeInSeconds, fadeOutSeconds)) + { + return false; + } + if(!this.processSongEntryForPlaying(songId)) + { + return false; + } + if(priority >= this._priorityPlaying) + { + this.playSongObject(priority, songId); + } + return true; + } + + private playSongObject(priority: number, songId: number): boolean + { + if((((songId === -1) || (priority < 0)) || (priority >= MusicPriorities.PRIORITY_COUNT))) + { + return false; + } + let _local_3 = false; + if(this.stopSongAtPriority(this._priorityPlaying)) + { + _local_3 = true; + } + const songData: SongDataEntry = this.getSongDataEntry(songId); + if(!songData) + { + return false; + } + if(_local_3) + { + return true; + } + this._musicPlayer.setVolume(GetSoundManager().traxVolume); + let startPos = MusicController.SKIP_POSITION_SET; + let playLength = 0; + let fadeInSeconds = 2; + let fadeOutSeconds = 1; + + const songRequestData: SongStartRequestData = this.getSongStartRequest(priority); + + if(songRequestData) + { + startPos = songRequestData.startPos; + playLength = songRequestData.playLength; + fadeInSeconds = songRequestData.fadeInSeconds; + fadeOutSeconds = songRequestData.fadeOutSeconds; + } + if(startPos >= (songData.length / 1000)) + { + return false; + } + if(startPos <= MusicController.SKIP_POSITION_SET) + { + startPos = 0; + } + + startPos = Math.trunc(startPos); + /* + _local_5.fadeInSeconds = _local_8; + _local_5.fadeOutSeconds = _local_9; + _local_5.position = _local_6; + _local_5.play(_local_7); + */ + + this._priorityPlaying = priority; + this._requestNumberPlaying = this.getSongRequestCountAtPriority(priority); + this._songIdPlaying = songId; + if(this._priorityPlaying <= MusicController.MAXIMUM_NOTIFY_PRIORITY) + { + this.notifySongPlaying(songData); + } + this._musicPlayer.preloadSamplesForSong(songData.songData).then(() => this._musicPlayer.play(songData.songData, songData.id, startPos, playLength)); + if(priority > MusicPriorities.PRIORITY_ROOM_PLAYLIST) + { + GetEventDispatcher().dispatchEvent(new NowPlayingEvent(NowPlayingEvent.NPE_USER_PLAY_SONG, priority, songData.id, -1)); + } + return true; + } + + private notifySongPlaying(k: SongDataEntry): void + { + const _local_2 = 8000; + const timeNow = Date.now(); + if(((k.length >= _local_2) && ((!(this._previousNotifiedSongId == k.id)) || (timeNow > (this._previousNotificationTime + _local_2))))) + { + GetEventDispatcher().dispatchEvent(new NotifyPlayedSongEvent(k.name, k.creator)); + this._previousNotifiedSongId = k.id; + this._previousNotificationTime = timeNow; + } + } + + private addSongStartRequest(priority: number, songId: number, startPos: number, playLength: number, fadeInSeconds: number, fadeOutSeconds: number): boolean + { + if(((priority < 0) || (priority >= MusicPriorities.PRIORITY_COUNT))) + { + return false; + } + const songStartRequest = new SongStartRequestData(songId, startPos, playLength, fadeInSeconds, fadeOutSeconds); + this._songRequestsPerPriority[priority] = songStartRequest; + this._songRequestCountsPerPriority[priority] = (this._songRequestCountsPerPriority[priority] + 1); + return true; + } + + private getSongDataEntry(k: number): SongDataEntry + { + let entry: SongDataEntry; + if(this._availableSongs) + { + entry = (this._availableSongs.get(k)); + } + return entry; + } + + private getSongStartRequest(k: number): SongStartRequestData + { + return this._songRequestsPerPriority[k]; + } + + private getTopRequestPriority(): number + { + return this._songRequestsPerPriority.length - 1; + } + + private getSongIdRequestedAtPriority(priorityIndex: number): number + { + if(priorityIndex < 0 || priorityIndex >= MusicPriorities.PRIORITY_COUNT) return -1; + + if(!this._songRequestsPerPriority[priorityIndex]) return -1; + + return this._songRequestsPerPriority[priorityIndex].songId; + } + + private getSongRequestCountAtPriority(k: number): number + { + if(((k < 0) || (k >= MusicPriorities.PRIORITY_COUNT))) + { + return -1; + } + return this._songRequestCountsPerPriority[k]; + } + + private playSongWithHighestPriority(): void + { + let _local_3: number; + this._priorityPlaying = -1; + this._songIdPlaying = -1; + this._requestNumberPlaying = -1; + const k = this.getTopRequestPriority(); + let _local_2 = k; + while(_local_2 >= 0) + { + _local_3 = this.getSongIdRequestedAtPriority(_local_2); + if(((_local_3 >= 0) && (this.playSongObject(_local_2, _local_3)))) + { + return; + } + _local_2--; + } + } + + private resetSongStartRequest(priority: number): void + { + if(((priority >= 0) && (priority < MusicPriorities.PRIORITY_COUNT))) + { + this._songRequestsPerPriority[priority] = undefined; + } + } + + private reRequestSongAtPriority(k: number): void + { + this._songRequestCountsPerPriority[k] = (this._songRequestCountsPerPriority[k] + 1); + } + + private stopSongAtPriority(priority: number): boolean + { + if(((priority === this._priorityPlaying) && (this._priorityPlaying >= 0))) + { + const songIdAtPriority = this.getSongIdPlayingAtPriority(priority); + if(songIdAtPriority >= 0) + { + const songData = this.getSongDataEntry(songIdAtPriority); + //this.stopSongDataEntry(_local_3); + this._musicPlayer.stop(); + return true; + } + } + return false; + } + + private onSoundMachineInit(k: Event): void + { + this.disposeRoomPlaylist(); + //this._roomItemPlaylist = (new SoundMachinePlayListController(this._soundManager, this, this._events) as IPlaylistController); + } + + private onSoundMachineDispose(k: Event): void + { + this.disposeRoomPlaylist(); + } + + private onJukeboxInit(k: Event): void + { + this.disposeRoomPlaylist(); + this._roomItemPlaylist = (new JukeboxPlaylistController() as IPlaylistController); + this._roomItemPlaylist.init(); + GetCommunication().connection.send(new GetNowPlayingMessageComposer()); + } + + private onJukeboxDispose(k: Event): void + { + this.disposeRoomPlaylist(); + } + + private disposeRoomPlaylist(): void + { + if(this._roomItemPlaylist) + { + this._roomItemPlaylist.dispose(); + this._roomItemPlaylist = undefined; + } + } +} diff --git a/packages/sound/src/music/MusicPlayer.ts b/packages/sound/src/music/MusicPlayer.ts new file mode 100644 index 0000000..6f005fd --- /dev/null +++ b/packages/sound/src/music/MusicPlayer.ts @@ -0,0 +1,240 @@ +import { GetEventDispatcher, SoundManagerEvent } from '@nitrots/events'; +import { NitroLogger } from '@nitrots/utils'; +import { Howl, Howler } from 'howler'; +import { TraxData } from '../trax/TraxData'; + +export class MusicPlayer +{ + private _currentSong: TraxData | undefined; + private _currentSongId: number; + private _startPos: number; + private _playLength: number; + private _isPlaying: boolean; + private _currentPos: number; + private _cache: Map; + private _sampleUrl: string; + + private _tickerInterval: number | undefined; + private _sequence: ISequenceEntry[][]; + + constructor(sampleUrl: string) + { + this._sampleUrl = sampleUrl; + this._isPlaying = false; + this._startPos = 0; + this._currentPos = 0; + this._playLength = 0; + this._sequence = []; + this._cache = new Map(); + } + + public async play(song: string, currentSongId: number, startPos: number = 0, playLength: number = -1): Promise + { + this.reset(); + + this._currentSong = new TraxData(song); + this._startPos = Math.trunc(startPos); + this._playLength = playLength; + this._currentPos = this._startPos; + this._currentSongId = currentSongId; + //this.emit('loading'); + await this.preload(); + this._isPlaying = true; + //this.emit('playing', this._currentPos, this._playLength - 1); + this.tick(); // to evade initial 1 sec delay + this._tickerInterval = window.setInterval(() => this.tick(), 1000); + } + + private reset(): void + { + this._isPlaying = false; + window.clearInterval(this._tickerInterval); + + Howler.stop(); + this._currentSongId = -1; + this._currentSong = undefined; + this._tickerInterval = undefined; + this._startPos = 0; + this._playLength = 0; + this._sequence = []; + this._currentPos = 0; + } + + public pause(): void + { + this._isPlaying = false; + //this.emit('paused', this._currentPos); + + Howler.stop(); + } + + public resume(): void + { + this._isPlaying = true; + //this.emit('playing', this._currentPos, this._playLength - 1 ); + } + + public stop(): void + { + const songId = this._currentSongId; + this.reset(); + GetEventDispatcher().dispatchEvent(new SoundManagerEvent(SoundManagerEvent.TRAX_SONG_COMPLETE, songId)); + //this.emit('stopped'); + } + + /** + * Sets global howler volume for all sounds + * @param volume value from 0.0 to 1.0 + */ + public setVolume(volume: number): void + { + Howler.volume(volume); + } + + /** + * Gets global howler volume for all sounds + * @returns value from 0.0 to 1.0 + */ + public getVolume(): number + { + return Howler.volume(); + } + + /** + * Gets sample from cache or loads it if not in cache + * @param id sample id + * @returns howl sound object + */ + public async getSample(id: number): Promise + { + let sample = this._cache.get(id); + + if(!sample) sample = await this.loadSong(id); + + return Promise.resolve(sample); + } + + private async preload(): Promise + { + this._sequence = []; + + if(!this._currentSong) return; + + for(const channel of this._currentSong.channels) + { + const sequenceEntryArray: ISequenceEntry[] = []; + for(const sample of channel.items) + { + const sampleSound = await this.getSample(sample.id); + + const sampleCount = Math.ceil((sample.length * 2) / Math.ceil(sampleSound.duration())); + + for(let i = 0; i < sampleCount; i++) + { + for(let j = 0; j < Math.ceil(sampleSound.duration()); j++) + { + sequenceEntryArray.push({ sampleId: sample.id, offset: j }); + } + } + } + + this._sequence.push(sequenceEntryArray); + } + + if(this._playLength <= 0) this._playLength = Math.max(...this._sequence.map((value: ISequenceEntry[]) => value.length)); + } + + public async preloadSamplesForSong(song: string): Promise + { + const traxData = new TraxData(song); + + await Promise.all(traxData.getSampleIds().map(id => this.getSample(id))); + } + + private async loadSong(songId: number): Promise + { + return new Promise((resolve, reject) => + { + const sample = new Howl({ + src: [this._sampleUrl.replace('%sample%', songId.toString())], + preload: true, + }); + + sample.once('load', () => + { + this._cache.set(songId, sample); + resolve(sample); + }); + + sample.once('loaderror', () => + { + NitroLogger.error('failed to load sample ' + songId); + reject('failed to load sample ' + songId); + }); + }); + } + + + private tick(): void + { + if(this._currentPos > this._playLength - 1) + { + this.stop(); + } + + if(this._isPlaying) + { + if(this._currentSong) + { + //this.emit('time', this._currentPos); + this.playPosition(this._currentPos); + } + + this._currentPos++; + } + } + + private playPosition(pos: number): void + { + if(!this._currentSong || !this._sequence) return; + + //@ts-ignore + if(!Howler._audioUnlocked) + { + //console.log('skipping due to locked audio'); + return; + } + + for(const sequencyEntry of this._sequence) + { + const entry = sequencyEntry[pos]; + + if(!entry) continue; + + // sample -1 is play none + // sample 0 is 1 second of empty noise + if(entry.sampleId === -1 || entry.sampleId === 0) continue; + + const sampleAudio = this._cache.get(entry.sampleId); + + if(!sampleAudio) continue; + + if(entry.offset === 0) + { + sampleAudio.play(); + } + else if(!sampleAudio.playing()) + { + sampleAudio.seek(entry.offset); + sampleAudio.play(); + } + } + } + +} + +interface ISequenceEntry +{ + sampleId: number; + offset: number; +} diff --git a/packages/sound/src/music/MusicPriorities.ts b/packages/sound/src/music/MusicPriorities.ts new file mode 100644 index 0000000..3fb0599 --- /dev/null +++ b/packages/sound/src/music/MusicPriorities.ts @@ -0,0 +1,8 @@ +export class MusicPriorities +{ + public static readonly PRIORITY_ROOM_PLAYLIST: number = 0; + public static readonly PRIORITY_USER_PLAYLIST: number = 1; + public static readonly PRIORITY_SONG_PLAY: number = 2; + public static readonly PRIORITY_PURCHASE_PREVIEW: number = 3; + public static readonly PRIORITY_COUNT: number = 4; +} diff --git a/packages/sound/src/music/index.ts b/packages/sound/src/music/index.ts new file mode 100644 index 0000000..d3553d4 --- /dev/null +++ b/packages/sound/src/music/index.ts @@ -0,0 +1,3 @@ +export * from './JukeboxPlaylistController'; +export * from './MusicController'; +export * from './MusicPriorities'; diff --git a/packages/sound/src/trax/TraxChannel.ts b/packages/sound/src/trax/TraxChannel.ts new file mode 100644 index 0000000..02d2ade --- /dev/null +++ b/packages/sound/src/trax/TraxChannel.ts @@ -0,0 +1,23 @@ +import { TraxChannelItem } from './TraxChannelItem'; + +export class TraxChannel +{ + private _id: number; + private _items: TraxChannelItem[]; + + constructor(id: number) + { + this._id = id; + this._items = []; + } + + public addChannelItem(item: TraxChannelItem): void + { + this._items.push(item); + } + + public get items(): TraxChannelItem[] + { + return this._items; + } +} diff --git a/packages/sound/src/trax/TraxChannelItem.ts b/packages/sound/src/trax/TraxChannelItem.ts new file mode 100644 index 0000000..7f08c26 --- /dev/null +++ b/packages/sound/src/trax/TraxChannelItem.ts @@ -0,0 +1,21 @@ +export class TraxChannelItem +{ + private _id: number; + private _length: number; + + constructor(id: number, length: number) + { + this._id = id; + this._length = length; + } + + public get id(): number + { + return this._id; + } + + public get length(): number + { + return this._length; + } +} diff --git a/packages/sound/src/trax/TraxData.ts b/packages/sound/src/trax/TraxData.ts new file mode 100644 index 0000000..57545d3 --- /dev/null +++ b/packages/sound/src/trax/TraxData.ts @@ -0,0 +1,97 @@ +import { TraxChannel } from './TraxChannel'; +import { TraxChannelItem } from './TraxChannelItem'; + +export class TraxData +{ + private _channels: TraxChannel[]; + private _metaData: Map; + + constructor(data: string) + { + this._channels = []; + this._metaData = new Map(); + + let channelLines: string[] = []; + + const lines: string[] = data.split(':'); + const lastLine: string = lines[lines.length - 1]; + + if(lastLine.indexOf('meta') > -1) + { + const metaData: string[] = lastLine.split(';'); + + for(const meta of metaData) + { + const metaAttributes: string[] = meta.split(','); + this._metaData.set(metaAttributes[0], metaAttributes[1]); + } + + channelLines = lines.slice(0, lines.length - 1); + } + else + { + channelLines = lines; + } + + for(let i = 0; i < channelLines.length / 2; i++) + { + if(channelLines[i * 2].length > 0) + { + const channelId: number = parseInt(channelLines[i * 2]); + const channelItemSets: string[] = channelLines[(i * 2) + 1].split(';'); + + const channel: TraxChannel = new TraxChannel(channelId); + + for(const channelItemSet of channelItemSets) + { + const channelItemData: string[] = channelItemSet.split(','); + + if(channelItemData.length !== 2) return; + + channel.addChannelItem(new TraxChannelItem(parseInt(channelItemData[0]), parseInt(channelItemData[1]))); + } + + this._channels.push(channel); + } + } + } + + public get channels(): TraxChannel[] + { + return this._channels; + } + + public getSampleIds(): number[] + { + const ids: number[] = []; + + for(const channel of this._channels) + { + for(const item of channel.items) + { + if(ids.indexOf(item.id) === -1) ids.push(item.id); + } + } + + return ids; + } + + public get hasMetaData(): boolean + { + return this._metaData.has('meta'); + } + + public get metaCutMode(): boolean + { + return this._metaData.has('c'); + } + + public get metaTempo(): number | null + { + const tempo = this._metaData.get('t'); + + if(!tempo) return null; + + return parseInt(tempo); + } +} diff --git a/packages/sound/src/trax/index.ts b/packages/sound/src/trax/index.ts new file mode 100644 index 0000000..d0b4128 --- /dev/null +++ b/packages/sound/src/trax/index.ts @@ -0,0 +1,3 @@ +export * from './TraxChannel'; +export * from './TraxChannelItem'; +export * from './TraxData'; diff --git a/packages/sound/tsconfig.json b/packages/sound/tsconfig.json new file mode 100644 index 0000000..5e8757d --- /dev/null +++ b/packages/sound/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./src", + "outDir": "./dist", + "sourceMap": false, + "declaration": true, + "experimentalDecorators": true, + "moduleResolution": "Node", + "esModuleInterop": true, + "importHelpers": true, + "isolatedModules": true, + "resolveJsonModule": true, + "downlevelIteration": true, + "allowSyntheticDefaultImports": true, + "allowJs": true, + "skipLibCheck": true, + "noEmit": true, + "strict": false, + "strictNullChecks": false, + "target": "ES6", + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "module": "ES6" + }, + "include": [ + "src" ] +} diff --git a/packages/utils/.eslintrc.json b/packages/utils/.eslintrc.json new file mode 100644 index 0000000..ad92133 --- /dev/null +++ b/packages/utils/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": [ "@nitrots/eslint-config" ] +} diff --git a/packages/utils/.gitignore b/packages/utils/.gitignore new file mode 100644 index 0000000..1413af9 --- /dev/null +++ b/packages/utils/.gitignore @@ -0,0 +1,51 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings +.git + +# System Files +.DS_Store +Thumbs.db + +*.zip +*.as +*.bin diff --git a/packages/utils/index.ts b/packages/utils/index.ts new file mode 100644 index 0000000..8420b10 --- /dev/null +++ b/packages/utils/index.ts @@ -0,0 +1 @@ +export * from './src'; diff --git a/packages/utils/package.json b/packages/utils/package.json new file mode 100644 index 0000000..7029cce --- /dev/null +++ b/packages/utils/package.json @@ -0,0 +1,22 @@ +{ + "name": "@nitrots/utils", + "description": "Nitro utils module", + "version": "1.0.0", + "type": "module", + "license": "GPL-3.0", + "scripts": { + "compile": "tsc --project ./tsconfig.json --noEmit false", + "eslint": "eslint ./src --fix" + }, + "main": "./index", + "dependencies": { + "@nitrots/api": "1.0.0", + "@nitrots/eslint-config": "1.0.0", + "pako": "^2.1.0", + "pixi.js": "^8.0.4" + }, + "devDependencies": { + "@types/pako": "^2.0.3", + "typescript": "~5.4.2" + } +} diff --git a/packages/utils/src/AdvancedMap.ts b/packages/utils/src/AdvancedMap.ts new file mode 100644 index 0000000..c8b9549 --- /dev/null +++ b/packages/utils/src/AdvancedMap.ts @@ -0,0 +1,159 @@ +import { IAdvancedMap } from '@nitrots/api'; + +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/packages/utils/src/ArrayBufferToBase64.ts b/packages/utils/src/ArrayBufferToBase64.ts new file mode 100644 index 0000000..aa8eb74 --- /dev/null +++ b/packages/utils/src/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/packages/utils/src/BinaryReader.ts b/packages/utils/src/BinaryReader.ts new file mode 100644 index 0000000..b0c68ac --- /dev/null +++ b/packages/utils/src/BinaryReader.ts @@ -0,0 +1,82 @@ +import { IBinaryReader } from '@nitrots/api'; + +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/packages/utils/src/BinaryWriter.ts b/packages/utils/src/BinaryWriter.ts new file mode 100644 index 0000000..dd20ef5 --- /dev/null +++ b/packages/utils/src/BinaryWriter.ts @@ -0,0 +1,109 @@ +import { IBinaryWriter } from '@nitrots/api'; + +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/packages/utils/src/ColorConverter.ts b/packages/utils/src/ColorConverter.ts new file mode 100644 index 0000000..36e5b22 --- /dev/null +++ b/packages/utils/src/ColorConverter.ts @@ -0,0 +1,354 @@ +import { IVector3D } from '@nitrots/api'; +import { Vector3d } from './Vector3d'; + +export class ColorConverter +{ + private static HEX_DIGITS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']; + + public static hex2rgb(hex: number, out: Array | Float32Array = []): Array | Float32Array + { + out[0] = ((hex >> 16) & 0xFF) / 255; + out[1] = ((hex >> 8) & 0xFF) / 255; + out[2] = (hex & 0xFF) / 255; + + return out; + } + + public static hex2rgba(hex: number, out: Array | Float32Array = []): Array | Float32Array + { + out[0] = ((hex >> 16) & 0xFF) / 255; + out[1] = ((hex >> 8) & 0xFF) / 255; + out[2] = (hex & 0xFF) / 255; + out[3] = (hex & 0xFF); + + return out; + } + + public static rgb2hex(rgb: number[] | Float32Array): number + { + return (((rgb[0] * 255) << 16) + ((rgb[1] * 255) << 8) + (rgb[2] * 255 | 0)); + } + + public static rgba2hex(rgb: number[] | Float32Array): number + { + return (((rgb[0] * 255) << 16) + ((rgb[1] * 255) << 8) + (rgb[2] * 255 | 0) + (rgb[3] | 0)); + } + + public static rgbStringToHex(rgb: string): string + { + const extracted = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/); + + return '#' + ColorConverter.getHex(extracted[1]) + ColorConverter.getHex(extracted[2]) + ColorConverter.getHex(extracted[3]); + } + + public static getHex(x: any) + { + return isNaN(x) ? '00' : ColorConverter.HEX_DIGITS[(x - x % 16) / 16] + ColorConverter.HEX_DIGITS[x % 16]; + } + + public static int2rgb(color: number): string + { + color >>>= 0; + const b = color & 0xFF; + const g = (color & 0xFF00) >>> 8; + const r = (color & 0xFF0000) >>> 16; + const a = ((color & 0xFF000000) >>> 24) / 255; + + return 'rgba(' + [r, g, b, 1].join(',') + ')'; + } + + public static rgbToHSL(k: number): number + { + const _local_2: number = (((k >> 16) & 0xFF) / 0xFF); + const _local_3: number = (((k >> 8) & 0xFF) / 0xFF); + const _local_4: number = ((k & 0xFF) / 0xFF); + const _local_5: number = Math.max(_local_2, _local_3, _local_4); + const _local_6: number = Math.min(_local_2, _local_3, _local_4); + const _local_7: number = (_local_5 - _local_6); + let _local_8 = 0; + let _local_9 = 0; + let _local_10 = 0; + if(_local_7 == 0) + { + _local_8 = 0; + } + else + { + if(_local_5 == _local_2) + { + if(_local_3 > _local_4) + { + _local_8 = ((60 * (_local_3 - _local_4)) / _local_7); + } + else + { + _local_8 = (((60 * (_local_3 - _local_4)) / _local_7) + 360); + } + } + else + { + if(_local_5 == _local_3) + { + _local_8 = (((60 * (_local_4 - _local_2)) / _local_7) + 120); + } + else + { + if(_local_5 == _local_4) + { + _local_8 = (((60 * (_local_2 - _local_3)) / _local_7) + 240); + } + } + } + } + _local_9 = (0.5 * (_local_5 + _local_6)); + if(_local_7 == 0) + { + _local_10 = 0; + } + else + { + if(_local_9 <= 0.5) + { + _local_10 = ((_local_7 / _local_9) * 0.5); + } + else + { + _local_10 = ((_local_7 / (1 - _local_9)) * 0.5); + } + } + const _local_11: number = Math.round(((_local_8 / 360) * 0xFF)); + const _local_12: number = Math.round((_local_10 * 0xFF)); + const _local_13: number = Math.round((_local_9 * 0xFF)); + const _local_14: number = (((_local_11 << 16) + (_local_12 << 8)) + _local_13); + return _local_14; + } + + public static hslToRGB(k: number): number + { + let _local_12: number; + let _local_13: number; + let _local_14: number; + let _local_15: number; + let _local_16: number; + const _local_2: number = (((k >> 16) & 0xFF) / 0xFF); + const _local_3: number = (((k >> 8) & 0xFF) / 0xFF); + const _local_4: number = ((k & 0xFF) / 0xFF); + let _local_5 = 0; + let _local_6 = 0; + let _local_7 = 0; + if(_local_3 > 0) + { + _local_12 = 0; + _local_13 = 0; + if(_local_4 < 0.5) + { + _local_12 = (_local_4 * (1 + _local_3)); + } + else + { + _local_12 = ((_local_4 + _local_3) - (_local_4 * _local_3)); + } + _local_13 = ((2 * _local_4) - _local_12); + _local_14 = (_local_2 + (1 / 3)); + _local_15 = _local_2; + _local_16 = (_local_2 - (1 / 3)); + if(_local_14 < 0) + { + _local_14 = (_local_14 + 1); + } + else + { + if(_local_14 > 1) + { + _local_14--; + } + } + if(_local_15 < 0) + { + _local_15 = (_local_15 + 1); + } + else + { + if(_local_15 > 1) + { + _local_15--; + } + } + if(_local_16 < 0) + { + _local_16 = (_local_16 + 1); + } + else + { + if(_local_16 > 1) + { + _local_16--; + } + } + if((_local_14 * 6) < 1) + { + _local_5 = (_local_13 + (((_local_12 - _local_13) * 6) * _local_14)); + } + else + { + if((_local_14 * 2) < 1) + { + _local_5 = _local_12; + } + else + { + if((_local_14 * 3) < 2) + { + _local_5 = (_local_13 + (((_local_12 - _local_13) * 6) * ((2 / 3) - _local_14))); + } + else + { + _local_5 = _local_13; + } + } + } + if((_local_15 * 6) < 1) + { + _local_6 = (_local_13 + (((_local_12 - _local_13) * 6) * _local_15)); + } + else + { + if((_local_15 * 2) < 1) + { + _local_6 = _local_12; + } + else + { + if((_local_15 * 3) < 2) + { + _local_6 = (_local_13 + (((_local_12 - _local_13) * 6) * ((2 / 3) - _local_15))); + } + else + { + _local_6 = _local_13; + } + } + } + if((_local_16 * 6) < 1) + { + _local_7 = (_local_13 + (((_local_12 - _local_13) * 6) * _local_16)); + } + else + { + if((_local_16 * 2) < 1) + { + _local_7 = _local_12; + } + else + { + if((_local_16 * 3) < 2) + { + _local_7 = (_local_13 + (((_local_12 - _local_13) * 6) * ((2 / 3) - _local_16))); + } + else + { + _local_7 = _local_13; + } + } + } + } + else + { + _local_5 = _local_4; + _local_6 = _local_4; + _local_7 = _local_4; + } + const _local_8: number = Math.round((_local_5 * 0xFF)); + const _local_9: number = Math.round((_local_6 * 0xFF)); + const _local_10: number = Math.round((_local_7 * 0xFF)); + const _local_11: number = (((_local_8 << 16) + (_local_9 << 8)) + _local_10); + return _local_11; + } + + public static rgb2xyz(k: number): IVector3D + { + let _local_2: number = (((k >> 16) & 0xFF) / 0xFF); + let _local_3: number = (((k >> 8) & 0xFF) / 0xFF); + let _local_4: number = (((k >> 0) & 0xFF) / 0xFF); + if(_local_2 > 0.04045) + { + _local_2 = Math.pow(((_local_2 + 0.055) / 1.055), 2.4); + } + else + { + _local_2 = (_local_2 / 12.92); + } + if(_local_3 > 0.04045) + { + _local_3 = Math.pow(((_local_3 + 0.055) / 1.055), 2.4); + } + else + { + _local_3 = (_local_3 / 12.92); + } + if(_local_4 > 0.04045) + { + _local_4 = Math.pow(((_local_4 + 0.055) / 1.055), 2.4); + } + else + { + _local_4 = (_local_4 / 12.92); + } + _local_2 = (_local_2 * 100); + _local_3 = (_local_3 * 100); + _local_4 = (_local_4 * 100); + return new Vector3d((((_local_2 * 0.4124) + (_local_3 * 0.3576)) + (_local_4 * 0.1805)), (((_local_2 * 0.2126) + (_local_3 * 0.7152)) + (_local_4 * 0.0722)), (((_local_2 * 0.0193) + (_local_3 * 0.1192)) + (_local_4 * 0.9505))); + } + + public static xyz2CieLab(k: IVector3D): IVector3D + { + let _local_2: number = (k.x / 95.047); + let _local_3: number = (k.y / 100); + let _local_4: number = (k.z / 108.883); + if(_local_2 > 0.008856) + { + _local_2 = Math.pow(_local_2, (1 / 3)); + } + else + { + _local_2 = ((7.787 * _local_2) + (16 / 116)); + } + if(_local_3 > 0.008856) + { + _local_3 = Math.pow(_local_3, (1 / 3)); + } + else + { + _local_3 = ((7.787 * _local_3) + (16 / 116)); + } + if(_local_4 > 0.008856) + { + _local_4 = Math.pow(_local_4, (1 / 3)); + } + else + { + _local_4 = ((7.787 * _local_4) + (16 / 116)); + } + return new Vector3d(((116 * _local_3) - 16), (500 * (_local_2 - _local_3)), (200 * (_local_3 - _local_4))); + } + + public static rgb2CieLab(k: number): IVector3D + { + return ColorConverter.xyz2CieLab(ColorConverter.rgb2xyz(k)); + } + + public static colorize(colorA: number, colorB: number): number + { + if(colorB === 0xFFFFFFFF) return colorA; + + let r = ((colorB >> 16) & 0xFF); + let g = ((colorB >> 8) & 0xFF); + let b = (colorB & 0xFF); + + r = ((((colorA >> 16) & 0xFF) * r) / 0xFF); + g = ((((colorA >> 8) & 0xFF) * g) / 0xFF); + b = (((colorA & 0xFF) * b) / 0xFF); + + return ((colorA && 0xFF000000) | (r << 16) | (g << 8) | b); + } +} diff --git a/packages/utils/src/FurniId.ts b/packages/utils/src/FurniId.ts new file mode 100644 index 0000000..92bad2b --- /dev/null +++ b/packages/utils/src/FurniId.ts @@ -0,0 +1,9 @@ +export class FurniId +{ + private static BUILDER_CLUB_FURNI_ID_BASE: number = 0x7FFF0000; + + public static isBuilderClubId(k: number): boolean + { + return (k >= FurniId.BUILDER_CLUB_FURNI_ID_BASE); + } +} \ No newline at end of file diff --git a/packages/utils/src/GetPixi.ts b/packages/utils/src/GetPixi.ts new file mode 100644 index 0000000..48c3f22 --- /dev/null +++ b/packages/utils/src/GetPixi.ts @@ -0,0 +1,5 @@ +import { Application } from 'pixi.js'; + +const pixi = new Application(); + +export const GetPixi = () => pixi; diff --git a/packages/utils/src/GetRenderer.ts b/packages/utils/src/GetRenderer.ts new file mode 100644 index 0000000..2b32287 --- /dev/null +++ b/packages/utils/src/GetRenderer.ts @@ -0,0 +1,12 @@ +import { AutoDetectOptions, Renderer, autoDetectRenderer } from 'pixi.js'; + +let renderer: Renderer = null; + +export const PrepareRenderer = async (options: Partial): Promise => +{ + renderer = await autoDetectRenderer(options); + + return renderer; +} + +export const GetRenderer = () => renderer; diff --git a/packages/utils/src/GetStage.ts b/packages/utils/src/GetStage.ts new file mode 100644 index 0000000..164f1a4 --- /dev/null +++ b/packages/utils/src/GetStage.ts @@ -0,0 +1,5 @@ +import { Container } from 'pixi.js'; + +const stage = new Container(); + +export const GetStage = () => stage; diff --git a/packages/utils/src/GetTexturePool.ts b/packages/utils/src/GetTexturePool.ts new file mode 100644 index 0000000..46e84fe --- /dev/null +++ b/packages/utils/src/GetTexturePool.ts @@ -0,0 +1,5 @@ +import { TexturePool } from './TexturePool'; + +const texturePool = new TexturePool(); + +export const GetTexturePool = () => texturePool; diff --git a/packages/utils/src/GetTicker.ts b/packages/utils/src/GetTicker.ts new file mode 100644 index 0000000..b2c9c78 --- /dev/null +++ b/packages/utils/src/GetTicker.ts @@ -0,0 +1,3 @@ +import { Ticker } from 'pixi.js'; + +export const GetTicker = () => Ticker.shared; diff --git a/packages/utils/src/GetTickerFPS.ts b/packages/utils/src/GetTickerFPS.ts new file mode 100644 index 0000000..e35489e --- /dev/null +++ b/packages/utils/src/GetTickerFPS.ts @@ -0,0 +1,3 @@ +import { GetTicker } from './GetTicker'; + +export const GetTickerFPS = () => GetTicker().FPS; diff --git a/packages/utils/src/GetTickerTime.ts b/packages/utils/src/GetTickerTime.ts new file mode 100644 index 0000000..8615e84 --- /dev/null +++ b/packages/utils/src/GetTickerTime.ts @@ -0,0 +1,3 @@ +import { GetTicker } from './GetTicker'; + +export const GetTickerTime = () => GetTicker().lastTime; diff --git a/packages/utils/src/HabboWebTools.ts b/packages/utils/src/HabboWebTools.ts new file mode 100644 index 0000000..491ec79 --- /dev/null +++ b/packages/utils/src/HabboWebTools.ts @@ -0,0 +1,338 @@ +import { LegacyExternalInterface } from './LegacyExternalInterface'; +import { NitroLogger } from './NitroLogger'; + +export class HabboWebTools +{ + public static ADVERTISEMENT: string = 'advertisement'; + public static OPENLINK: string = 'openlink'; + public static OPENROOM: string = 'openroom'; + + public static logEventLog(data: string): void + { + try + { + if(LegacyExternalInterface.available) + { + LegacyExternalInterface.call('logEventLog', data); + } + } + + catch (e) + { + NitroLogger.log('External interface not working, failed to log event log.'); + } + } + + public static openPage(pageUrl: string): void + { + try + { + if(LegacyExternalInterface.available) + { + LegacyExternalInterface.call('openPage', pageUrl); + } + else + { + NitroLogger.log('External interface not available, openPage failed.'); + } + } + + catch (e) + { + NitroLogger.log('Failed to open web page', pageUrl); + } + } + + public static openWebPage(pageUrl: string): void + { + window.open(pageUrl); + } + + public static sendHeartBeat(): void + { + try + { + if(LegacyExternalInterface.available) + { + LegacyExternalInterface.call('heartBeat'); + } + } + + catch (e) + { + NitroLogger.log('Failed to send heartbeat'); + } + } + + public static openWebPageAndMinimizeClient(pageUrl: string): void + { + try + { + if(LegacyExternalInterface.available) + { + HabboWebTools.openPage(pageUrl); + } + } + + catch (e) + { + NitroLogger.log('Failed to open web page', pageUrl); + } + } + + public static closeWebPageAndRestoreClient(): void + { + try + { + if(LegacyExternalInterface.available) + { + LegacyExternalInterface.call('closeWebPageAndRestoreClient'); + } + } + + catch (e) + { + NitroLogger.log('Failed to close web page and restore client!'); + } + } + + public static openHabblet(name: string, param: string = null): void + { + try + { + if(LegacyExternalInterface.available) + { + LegacyExternalInterface.call('openHabblet', name, param); + } + } + + catch (e) + { + NitroLogger.log('Failed to open Habblet', name); + } + } + + public static closeHabblet(name: string, param: string = null): void + { + try + { + if(LegacyExternalInterface.available) + { + LegacyExternalInterface.call('closeHabblet', name, param); + } + } + + catch (e) + { + NitroLogger.log('Failed to close Habblet', name); + } + } + + public static send(reasonCode: number, reasonString: string): void + { + try + { + if(LegacyExternalInterface.available) + { + LegacyExternalInterface.call('disconnect', reasonCode, reasonString); + } + } + + catch (e) + { + NitroLogger.log('Failed to close send '); + } + } + + public static showGame(gameUrl: string): void + { + try + { + if(LegacyExternalInterface.available) + { + LegacyExternalInterface.callGame('showGame', gameUrl); + } + } + + catch (e) + { + NitroLogger.log('Failed to open game', e); + } + } + + public static hideGame(): void + { + try + { + if(LegacyExternalInterface.available) + { + LegacyExternalInterface.callGame('hideGame'); + } + } + + catch (e) + { + NitroLogger.log('Failed to hide game'); + } + } + + public static open(url: string): void + { + try + { + if(LegacyExternalInterface.available) + { + LegacyExternalInterface.call('openExternalLink', escape(url)); + } + else + { + NitroLogger.log(('External interface not available. Could not request to open: ' + url)); + } + } + + catch (e) + { + NitroLogger.log(('External interface not working. Could not request to open: ' + url)); + } + } + + public static roomVisited(roomId: number): void + { + try + { + if(LegacyExternalInterface.available) + { + LegacyExternalInterface.call('roomVisited', roomId); + } + else + { + NitroLogger.log('External interface not available. Could not store last room visit.'); + } + } + + catch (e) + { + NitroLogger.log('External interface not working. Could not store last room visit.'); + } + } + + public static openMinimail(target: string): void + { + try + { + if(LegacyExternalInterface.available) + { + LegacyExternalInterface.call('openMinimail', target); + } + else + { + NitroLogger.log('External interface not available. Could not open minimail.'); + } + } + + catch (e) + { + NitroLogger.log('External interface not working. Could not open minimail.'); + } + } + + public static openNews(): void + { + try + { + if(LegacyExternalInterface.available) + { + LegacyExternalInterface.call('openNews'); + } + else + { + NitroLogger.log('External interface not available. Could not open news.'); + } + } + + catch (e) + { + NitroLogger.log('External interface not working. Could not open news.'); + } + } + + public static closeNews(): void + { + try + { + if(LegacyExternalInterface.available) + { + LegacyExternalInterface.call('closeNews'); + } + else + { + NitroLogger.log('External interface not available. Could not close news.'); + } + } + + catch (e) + { + NitroLogger.log('External interface not working. Could not close news.'); + } + } + + public static openAvatars(): void + { + try + { + if(LegacyExternalInterface.available) + { + LegacyExternalInterface.call('openAvatars'); + } + else + { + NitroLogger.log('External interface not available. Could not open avatars.'); + } + } + + catch (e) + { + NitroLogger.log('External interface not working. Could not open avatars.'); + } + } + + public static openRoomEnterAd(): void + { + try + { + if(LegacyExternalInterface.available) + { + LegacyExternalInterface.call('openRoomEnterAd'); + } + else + { + NitroLogger.log('External interface not available. Could not open roomenterad.'); + } + } + + catch (e) + { + NitroLogger.log('External interface not working. Could not open roomenterad.'); + } + } + + public static updateFigure(figure: string): void + { + try + { + if(LegacyExternalInterface.available) + { + LegacyExternalInterface.call('updateFigure', figure); + } + else + { + NitroLogger.log('External interface not available. Could not update figure.'); + } + } + + catch (e) + { + NitroLogger.log('External interface not working. Could not update figure.'); + } + } +} diff --git a/packages/utils/src/Int32.ts b/packages/utils/src/Int32.ts new file mode 100644 index 0000000..1267f48 --- /dev/null +++ b/packages/utils/src/Int32.ts @@ -0,0 +1,13 @@ +const toUint32 = (x: number) => x >>> 0; + +export const ToInt32 = (x: number) => +{ + const uint32 = toUint32(x); + + if(uint32 >= Math.pow(2, 31)) + { + return uint32 - Math.pow(2, 32); + } + + return uint32; +}; diff --git a/packages/utils/src/LegacyExternalInterface.ts b/packages/utils/src/LegacyExternalInterface.ts new file mode 100644 index 0000000..9dcc458 --- /dev/null +++ b/packages/utils/src/LegacyExternalInterface.ts @@ -0,0 +1,118 @@ +declare global +{ + interface Window + { + FlashExternalInterface?: + { + legacyTrack?: ( + category: string, + action: string, + data: unknown[] + ) => void; + logDebug?: (...params: string[]) => void; + disconnect?: (reasonCode: number, reasonString: string) => void; + logout?: () => void; + openWebPageAndMinimizeClient?: (pageUrl: string) => void; + heartBeat?: () => void; + logEventLog?: (log: string) => void; + openPage?: (pageUrl: string) => void; + closeWebPageAndRestoreClient?: () => void; + openHabblet?: (name: string, param: string) => void; + closeHabblet?: (name: string, param: string) => void; + openExternalLink?: (link: string) => void; + roomVisited?: (roomId: number) => void; + openMinimail?: (target: string) => void; + openNews?: () => void; + closeNews?: () => void; + openAvatars?: () => void; + openRoomEnterAd?: () => void; + updateFigure?: (figure: string) => void; + }; + + FlashExternalGameInterface?: + { + showGame?: (url: string) => void; + hideGame?: () => void; + }; + } +} + +export class LegacyExternalInterface +{ + private static readonly MESSAGE_KEY = 'Nitro_LegacyExternalInterface'; + private static _isListeningForPostMessages = false; + + + public static get available(): boolean + { + if(!this._isListeningForPostMessages) + { + this._isListeningForPostMessages = true; + window.addEventListener('message', (ev) => + { + if(typeof ev.data !== 'string') return; + + if(ev.data.startsWith(LegacyExternalInterface.MESSAGE_KEY)) + { + const { method, params } = JSON.parse( + ev.data.substr(LegacyExternalInterface.MESSAGE_KEY.length) + ); + + const fn = (window as any)[method]; + if(!fn) return; + + fn(...params); + return; + } + + }); + } + + return true; + } + + public static call( + method: K, + ...params: Parameters + ): ReturnType | undefined + { + if(window.top !== window) + { + window.top.postMessage(LegacyExternalInterface.MESSAGE_KEY + JSON.stringify({ + method, + params + }), '*'); + } + + if(!('FlashExternalInterface' in window)) return undefined; + + const fn = window.FlashExternalInterface[method] as Function; + + return typeof fn !== 'undefined' ? fn(...params) : undefined; + } + + public static callGame( + method: K, + ...params: Parameters + ): ReturnType | undefined + { + if(window.top !== window) + { + window.top.postMessage('Nitro_LegacyExternalGameInterface' + JSON.stringify({ + method, + params + }), '*'); + } + + if(!('FlashExternalGameInterface' in window)) return undefined; + + const fn = window.FlashExternalGameInterface[method] as Function; + + return typeof fn !== 'undefined' ? fn(...params) : undefined; + } + + public static addCallback(name: string, func: Function) + { + (window as any)[name] = func; + } +} diff --git a/packages/utils/src/LinkTracker.ts b/packages/utils/src/LinkTracker.ts new file mode 100644 index 0000000..57f6e98 --- /dev/null +++ b/packages/utils/src/LinkTracker.ts @@ -0,0 +1,40 @@ +import { ILinkEventTracker } from '@nitrots/api'; + +const linkTrackers: ILinkEventTracker[] = []; + +export const AddLinkEventTracker = (tracker: ILinkEventTracker): void => +{ + if(linkTrackers.indexOf(tracker) >= 0) return; + + linkTrackers.push(tracker); +}; + +export const RemoveLinkEventTracker = (tracker: ILinkEventTracker): void => +{ + const index = linkTrackers.indexOf(tracker); + + if(index === -1) return; + + linkTrackers.splice(index, 1); +}; + +export const CreateLinkEvent = (link: string): void => +{ + if(!link || (link === '')) return; + + for(const tracker of 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); + } + } +}; diff --git a/packages/utils/src/Matrix4x4.ts b/packages/utils/src/Matrix4x4.ts new file mode 100644 index 0000000..89d368d --- /dev/null +++ b/packages/utils/src/Matrix4x4.ts @@ -0,0 +1,134 @@ +import { IVector3D } from '@nitrots/api'; +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: IVector3D): IVector3D + { + 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/packages/utils/src/NitroBundle.ts b/packages/utils/src/NitroBundle.ts new file mode 100644 index 0000000..aae462c --- /dev/null +++ b/packages/utils/src/NitroBundle.ts @@ -0,0 +1,58 @@ +import { inflate } from 'pako'; +import { Assets, Texture } from 'pixi.js'; +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 _texture: Texture = null; + + public static async from(buffer: ArrayBuffer): Promise + { + const bundle = new NitroBundle(); + + await bundle.parse(buffer); + + return bundle; + } + + public async parse(arrayBuffer: ArrayBuffer): Promise + { + 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); + const inflatedBuffer = inflate(buffer.toArrayBuffer()); + + if(fileName.endsWith('.json')) + { + this._jsonFile = JSON.parse(NitroBundle.TEXT_DECODER.decode(inflatedBuffer)); + } + else + { + this._texture = await Assets.load(`data:image/png;base64,${ ArrayBufferToBase64(inflatedBuffer) }`); + } + + fileCount--; + } + } + + public get jsonFile(): Object + { + return this._jsonFile; + } + + public get texture(): Texture + { + return this._texture; + } +} diff --git a/packages/utils/src/NitroConfig.ts b/packages/utils/src/NitroConfig.ts new file mode 100644 index 0000000..aa905eb --- /dev/null +++ b/packages/utils/src/NitroConfig.ts @@ -0,0 +1,9 @@ +export { }; + +declare global +{ + interface Window + { + NitroConfig?: { [index: string]: any }; + } +} diff --git a/packages/utils/src/NitroLogger.ts b/packages/utils/src/NitroLogger.ts new file mode 100644 index 0000000..d286d2b --- /dev/null +++ b/packages/utils/src/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/packages/utils/src/NitroVersion.ts b/packages/utils/src/NitroVersion.ts new file mode 100644 index 0000000..9cf4590 --- /dev/null +++ b/packages/utils/src/NitroVersion.ts @@ -0,0 +1,31 @@ + +export class NitroVersion +{ + public static RENDERER_VERSION: string = '2.0.0'; + 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/packages/utils/src/Node3D.ts b/packages/utils/src/Node3D.ts new file mode 100644 index 0000000..6018858 --- /dev/null +++ b/packages/utils/src/Node3D.ts @@ -0,0 +1,32 @@ +import { IVector3D } from '@nitrots/api'; +import { Matrix4x4 } from './Matrix4x4'; +import { Vector3d } from './Vector3d'; + +export class Node3D +{ + private _location: IVector3D = null; + private _transformedLocation: IVector3D = new Vector3d(); + private _needsTransformation: boolean = false; + + constructor(x: number, y: number, z: number) + { + this._location = new Vector3d(x, y, z); + + if((x !== 0) || (y !== 0) || (z !== 0)) this._needsTransformation = true; + } + + public get location(): IVector3D + { + return this._location; + } + + public get transformedLocation(): IVector3D + { + return this._transformedLocation; + } + + public applyTransform(matrix: Matrix4x4): void + { + if(this._needsTransformation) this._transformedLocation = matrix.vectorMultiplication(this._location); + } +} diff --git a/packages/utils/src/NumberBank.ts b/packages/utils/src/NumberBank.ts new file mode 100644 index 0000000..271ab1f --- /dev/null +++ b/packages/utils/src/NumberBank.ts @@ -0,0 +1,54 @@ +export class NumberBank +{ + private _reservedNumbers: number[]; + private _freeNumbers: number[]; + + constructor(k: number) + { + if(k < 0) k = 0; + + this._reservedNumbers = []; + this._freeNumbers = []; + + let i = 0; + + while(i < k) + { + this._freeNumbers.push(i); + + i++; + } + } + + public dispose(): void + { + this._reservedNumbers = null; + this._freeNumbers = null; + } + + public reserveNumber(): number + { + if(this._freeNumbers.length > 0) + { + const k = this._freeNumbers.pop(); + + this._reservedNumbers.push(k); + + return k; + } + + return -1; + } + + public freeNumber(k: number): void + { + const i = this._reservedNumbers.indexOf(k); + + if(i >= 0) + { + this._reservedNumbers.splice(i, 1); + + this._freeNumbers.push(k); + } + } +} diff --git a/packages/utils/src/PointMath.ts b/packages/utils/src/PointMath.ts new file mode 100644 index 0000000..376204c --- /dev/null +++ b/packages/utils/src/PointMath.ts @@ -0,0 +1,19 @@ +import { Point } from 'pixi.js'; + +export class PointMath +{ + public static sum(k: Point, _arg_2: Point): Point + { + return new Point((k.x + _arg_2.x), (k.y + _arg_2.y)); + } + + public static sub(k: Point, _arg_2: Point): Point + { + return new Point((k.x - _arg_2.x), (k.y - _arg_2.y)); + } + + public static mul(k: Point, _arg_2: number): Point + { + return new Point((k.x * _arg_2), (k.y * _arg_2)); + } +} diff --git a/packages/utils/src/RoomId.ts b/packages/utils/src/RoomId.ts new file mode 100644 index 0000000..8df53a0 --- /dev/null +++ b/packages/utils/src/RoomId.ts @@ -0,0 +1,14 @@ +export class RoomId +{ + private static PREVIEW_ROOM_ID_BASE: number = 0x7FFF0000; + + public static makeRoomPreviewerId(roomId: number): number + { + return (roomId & 0xFFFF) + RoomId.PREVIEW_ROOM_ID_BASE; + } + + public static isRoomPreviewerId(roomId: number): boolean + { + return (roomId >= RoomId.PREVIEW_ROOM_ID_BASE); + } +} diff --git a/packages/utils/src/TexturePool.ts b/packages/utils/src/TexturePool.ts new file mode 100644 index 0000000..128679c --- /dev/null +++ b/packages/utils/src/TexturePool.ts @@ -0,0 +1,105 @@ +import { NitroLogger, TextureUtils } from '@nitrots/utils'; +import { Texture } from 'pixi.js'; + +export class TexturePool +{ + private static MAX_IDLE: number = 3600; + + private _textures: { [index: string]: { [index: string]: Texture[] } } = {}; + private _totalTextures: number = 0; + private _runCount: number = 0; + + public getTotalTextures(): number + { + let total = 0; + + for(const width in this._textures) + { + for(const height in this._textures[width]) + { + total += this._textures[width][height].length; + } + } + + this._totalTextures = total; + + return this._totalTextures; + } + + public getTexture(width: number, height: number): Texture + { + if(!this._textures[width]) this._textures[width] = {}; + + if(!this._textures[width][height]) this._textures[width][height] = []; + + if(this._textures[width][height].length) + { + const texture = this._textures[width][height].shift(); + + if(texture) + { + this._totalTextures--; + + return texture; + } + } + + return TextureUtils.createRenderTexture(width, height); + } + + public putTexture(texture: Texture) + { + if(!texture) return; + + if(!this._textures[texture.width]) this._textures[texture.width] = {}; + + if(!this._textures[texture.width][texture.height]) this._textures[texture.width][texture.height] = []; + + //@ts-ignore + delete texture.source.hitMap; + + this._textures[texture.width][texture.height].push(texture); + + this._totalTextures++; + } + + public run(): void + { + this._runCount++; + + if(!this._totalTextures) return; + + for(const width in this._textures) + { + for(const height in this._textures[width]) + { + const textures = this._textures[width][height]; + + for(let i = textures.length - 1; i >= 0; i--) + { + const texture = textures[i]; + const source = texture.source; + + if((source._touched > -1) && (this._runCount - source._touched) > TexturePool.MAX_IDLE) + { + //@ts-ignore + delete texture.source.hitMap; + + if(!source.destroyed) texture.destroy(true); + + this._textures[texture.width][texture.height].splice(i, 1); + + this._totalTextures--; + + NitroLogger.log(`[TexturePool] Texture disposed: ${texture.width}x${texture.height}`); + } + } + } + } + } + + public get textures(): { [index: string]: { [index: string]: Texture[] } } + { + return this._textures; + } +} diff --git a/packages/utils/src/TextureUtils.ts b/packages/utils/src/TextureUtils.ts new file mode 100644 index 0000000..c58f621 --- /dev/null +++ b/packages/utils/src/TextureUtils.ts @@ -0,0 +1,135 @@ +import { Container, ExtractImageOptions, ExtractOptions, ExtractSystem, GenerateTextureOptions, GetPixelsOutput, ICanvas, Matrix, RenderTexture, Renderer, Sprite, Texture } from 'pixi.js'; +import { GetRenderer } from './GetRenderer'; + +export class TextureUtils +{ + public static generateTexture(options: GenerateTextureOptions | Container): Texture + { + return this.getRenderer().textureGenerator.generateTexture(options); + } + + public static generateTextureFromImage(image: HTMLImageElement): Texture + { + return Texture.from(image); + } + + public static async generateImage(options: ExtractImageOptions | Container | Texture): Promise + { + return this.getExtractor().image(options); + } + + public static async generateImageUrl(options: ExtractImageOptions | Container | Texture): Promise + { + return this.getExtractor().base64(options); + } + + public static generateCanvas(options: ExtractOptions | Container | Texture): ICanvas + { + return this.getExtractor().canvas(options); + } + + public static clearRenderTexture(texture: Texture): Texture + { + return this.writeToTexture(new Sprite(Texture.EMPTY), texture); + } + + public static createRenderTexture(width: number, height: number): Texture + { + if((width < 0) || (height < 0)) return null; + + return RenderTexture.create({ width, height }); + } + + public static createAndFillRenderTexture(width: number, height: number, color: number = 16777215): Texture + { + if((width < 0) || (height < 0)) return null; + + return this.clearAndFillRenderTexture(this.createRenderTexture(width, height), color); + } + + public static createAndWriteRenderTexture(width: number, height: number, container: Container, transform: Matrix = null): Texture + { + if((width < 0) || (height < 0)) return null; + + return this.writeToTexture(container, this.createRenderTexture(width, height), true, transform); + } + + public static clearAndFillRenderTexture(texture: Texture, color: number = 16777215): Texture + { + if(!texture) return null; + + const sprite = new Sprite(Texture.WHITE); + + sprite.tint = color; + + sprite.width = texture.width; + sprite.height = texture.height; + + return this.writeToTexture(sprite, texture); + } + + public static writeToTexture(container: Container, target: Texture, clear: boolean = true, transform: Matrix = null): Texture + { + if(!container || !target) return null; + + this.getRenderer().render({ + container, + target, + clear, + transform + }); + + return target; + } + + public static flipTextureHorizontal(texture: Texture): Texture + { + if(!texture) return null; + + const matrix = new Matrix(); + + matrix.scale(-1, 1); + matrix.translate(texture.width, 0); + + return this.createAndWriteRenderTexture(texture.width, texture.height, new Sprite(texture), matrix); + } + + public static flipTextureVertical(texture: Texture): Texture + { + if(!texture) return null; + + const matrix = new Matrix(); + + matrix.scale(1, -1); + matrix.translate(0, texture.height); + + return this.createAndWriteRenderTexture(texture.width, texture.height, new Sprite(texture), matrix); + } + + public static flipTextureHorizontalAndVertical(texture: Texture): Texture + { + if(!texture) return null; + + const matrix = new Matrix(); + + matrix.scale(-1, -1); + matrix.translate(texture.width, texture.height); + + return this.createAndWriteRenderTexture(texture.width, texture.height, new Sprite(texture), matrix); + } + + public static getPixels(options: ExtractOptions | Container | Texture): GetPixelsOutput + { + return this.getExtractor().pixels(options); + } + + public static getRenderer(): Renderer + { + return GetRenderer(); + } + + public static getExtractor(): ExtractSystem + { + return this.getRenderer().extract; + } +} diff --git a/packages/utils/src/Vector3d.ts b/packages/utils/src/Vector3d.ts new file mode 100644 index 0000000..12c3d94 --- /dev/null +++ b/packages/utils/src/Vector3d.ts @@ -0,0 +1,215 @@ +import { IVector3D } from '@nitrots/api'; + +export class Vector3d implements IVector3D +{ + private _length: number = NaN; + + constructor( + private _x: number = 0, + private _y: number = 0, + private _z: number = 0) + {} + + 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; + + const product = new Vector3d(); + + product.x = ((vector1.y * vector2.z) - (vector1.z * vector2.y)); + product.y = ((vector1.z * vector2.x) - (vector1.x * vector2.z)); + product.z = ((vector1.x * vector2.y) - (vector1.y * vector2.x)); + + return product; + } + + 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 assign(vector: IVector3D): void + { + if(!vector) return; + + this._x = vector.x; + this._y = vector.y; + this._z = vector.z; + this._length = NaN; + } + + 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 negate(): void + { + this._x = -(this._x); + this._y = -(this._y); + this._z = -(this._z); + } + + public dotProduct(vector: IVector3D): number + { + return ((this._x * vector.x) + (this._y * vector.y)) + (this._z * vector.z); + } + + public crossProduct(vector: IVector3D): IVector3D + { + const newVector = new Vector3d(); + + newVector.x = ((this._y * vector.z) - (this._z * vector.y)); + newVector.y = ((this._z * vector.x) - (this._x * vector.z)); + newVector.z = ((this._x * vector.y) - (this._y * vector.x)); + + return newVector; + } + + public normalize(): void + { + const k = (1 / this.length); + + this._x = (this._x * k); + this._y = (this._y * k); + this._z = (this._z * k); + } + + 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/packages/utils/src/filters/PaletteMapFilter.ts b/packages/utils/src/filters/PaletteMapFilter.ts new file mode 100644 index 0000000..103a983 --- /dev/null +++ b/packages/utils/src/filters/PaletteMapFilter.ts @@ -0,0 +1,147 @@ +import { BufferImageSource, Filter, FilterSystem, GlProgram, RenderSurface, Texture } from 'pixi.js'; +import { TextureUtils } from '../TextureUtils'; + +export interface PaletteMapFilterOptions +{ + palette: number[]; + channel: number; +} + +export class PaletteMapFilter extends Filter +{ + public static readonly CHANNEL_RED = 0; + public static readonly CHANNEL_GREEN = 1; + public static readonly CHANNEL_BLUE = 2; + public static readonly CHANNEL_ALPHA = 3; + + public static readonly DEFAULT_OPTIONS: PaletteMapFilterOptions = { + palette: [], + channel: PaletteMapFilter.CHANNEL_RED, + }; + + public uniforms: { + uPalette: Float32Array, + uChannel: Float32Array + }; + + constructor(options: PaletteMapFilterOptions) + { + options = { ...PaletteMapFilter.DEFAULT_OPTIONS, ...options }; + + const glProgram = GlProgram.from({ + vertex: `in vec2 aPosition; + out vec2 vTextureCoord; + + uniform vec4 uInputSize; + uniform vec4 uOutputFrame; + uniform vec4 uOutputTexture; + + vec4 filterVertexPosition( void ) + { + vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy; + + position.x = position.x * (2.0 / uOutputTexture.x) - 1.0; + position.y = position.y * (2.0*uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z; + + return vec4(position, 0.0, 1.0); + } + + vec2 filterTextureCoord( void ) + { + return aPosition * (uOutputFrame.zw * uInputSize.zw); + } + + void main(void) + { + gl_Position = filterVertexPosition(); + vTextureCoord = filterTextureCoord(); + }`, + fragment: ` + in vec2 vTextureCoord; + out vec4 finalColor; + + uniform sampler2D uTexture; + uniform sampler2D uLutTexture; + uniform int channel; + + void main(void) { + vec4 currentColor = texture(uTexture, vTextureCoord); + vec4 adjusted = currentColor; + + if(currentColor.a > 0.0) + { + if(channel == 0) + { + adjusted = texture2D(uLutTexture, vec2((currentColor.r * 255.0 + 0.5) / 256.0, 0.5)); + } else if(channel == 1) { + adjusted = texture2D(uLutTexture, vec2((currentColor.g * 255.0 + 0.5) / 256.0, 0.5)); + } else if(channel == 2) { + adjusted = texture2D(uLutTexture, vec2((currentColor.b * 255.0 + 0.5) / 256.0, 0.5)); + } else if(channel == 3) { + adjusted = texture2D(uLutTexture, vec2((currentColor.a * 255.0 + 0.5) / 256.0, 0.5)); + } + } + + finalColor = vec4(adjusted.r, adjusted.g, adjusted.b, currentColor.a); + } + `, + name: 'palette-map-filter', + }); + + const lookUpTable = PaletteMapFilter.getLookUpTable(options.palette); + + const lutTexture = new Texture({ + source: new BufferImageSource({ + resource: Uint8Array.from(lookUpTable), + width: lookUpTable.length / 4, + height: 1 + }) + }); + + (async () => + { + console.log(await TextureUtils.generateImageUrl(lutTexture)); + })(); + + super({ + gpuProgram: null, + glProgram, + resources: { + paletteMapUniforms: { + uChannel: { value: options.channel, type: 'int' } + }, + uLutTexture: lutTexture.source + }, + }); + + this.uniforms = this.resources.paletteMapUniforms.uniforms; + + Object.assign(this, options); + } + + public apply( + filterManager: FilterSystem, + input: Texture, + output: RenderSurface, + clearMode: boolean, + ): void + { + + filterManager.applyFilter(this, input, output, clearMode); + } + + private static getLookUpTable(data: number[]): number[] + { + const lookUpTable = []; + + for(let i = 0; i < data.length; i++) + { + lookUpTable[(i * 4) + PaletteMapFilter.CHANNEL_RED] = ((data[i] >> 16) & 0xFF); + lookUpTable[(i * 4) + PaletteMapFilter.CHANNEL_GREEN] = ((data[i] >> 8) & 0xFF); + lookUpTable[(i * 4) + PaletteMapFilter.CHANNEL_BLUE] = (data[i] & 0xFF); + lookUpTable[(i * 4) + PaletteMapFilter.CHANNEL_ALPHA] = ((data[i] >> 24) & 0xFF); + } + + return lookUpTable; + } +} diff --git a/packages/utils/src/filters/PlaneMaskFilter.ts b/packages/utils/src/filters/PlaneMaskFilter.ts new file mode 100644 index 0000000..da85e3d --- /dev/null +++ b/packages/utils/src/filters/PlaneMaskFilter.ts @@ -0,0 +1,90 @@ +import { Filter, FilterSystem, GlProgram, RenderSurface, Texture } from 'pixi.js'; + +export interface PlaneMaskFilterOptions +{ +} + +export class PlaneMaskFilter extends Filter +{ + public static readonly DEFAULT_OPTIONS: PlaneMaskFilterOptions = { + }; + + public uniforms: { + }; + + constructor(options: PlaneMaskFilterOptions) + { + options = { ...PlaneMaskFilter.DEFAULT_OPTIONS, ...options }; + + const glProgram = GlProgram.from({ + vertex: `in vec2 aPosition; + out vec2 vTextureCoord; + + uniform vec4 uInputSize; + uniform vec4 uOutputFrame; + uniform vec4 uOutputTexture; + + vec4 filterVertexPosition( void ) + { + vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy; + + position.x = position.x * (2.0 / uOutputTexture.x) - 1.0; + position.y = position.y * (2.0*uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z; + + return vec4(position, 0.0, 1.0); + } + + vec2 filterTextureCoord( void ) + { + return aPosition * (uOutputFrame.zw * uInputSize.zw); + } + + void main(void) + { + gl_Position = filterVertexPosition(); + vTextureCoord = filterTextureCoord(); + }`, + fragment: ` + in vec2 vTextureCoord; + out vec4 finalColor; + + uniform sampler2D uTexture; + + void main(void) { + vec4 c = texture(uTexture, vTextureCoord); + + if(c.r == 0.0 && c.g == 0.0 && c.b == 0.0) { + finalColor = vec4(0.0, 0.0, 0.0, 0.0); + } else { + finalColor = c; + } + } + `, + name: 'plane-mask-filter', + }); + + super({ + gpuProgram: null, + glProgram, + resources: { + planeMaskUniforms: { + }, + }, + }); + + this.uniforms = this.resources.planeMaskUniforms.uniforms; + + Object.assign(this, options); + } + + public apply( + filterManager: FilterSystem, + input: Texture, + output: RenderSurface, + clearMode: boolean, + ): void + { + + filterManager.applyFilter(this, input, output, clearMode); + } +} diff --git a/packages/utils/src/filters/WiredFilter.ts b/packages/utils/src/filters/WiredFilter.ts new file mode 100644 index 0000000..303ae86 --- /dev/null +++ b/packages/utils/src/filters/WiredFilter.ts @@ -0,0 +1,143 @@ +import { Color, ColorSource, Filter, FilterSystem, GlProgram, RenderSurface, Texture } from 'pixi.js'; + +export interface WiredFilterOptions +{ + lineColor: ColorSource; + color: ColorSource; +} + +export class WiredFilter extends Filter +{ + public static readonly DEFAULT_OPTIONS: WiredFilterOptions = { + lineColor: 0x000000, + color: 0x000000, + }; + + public uniforms: { + uLineColor: Float32Array, + uColor: Float32Array + }; + + private _lineColor!: Color; + private _color!: Color; + + constructor(options: WiredFilterOptions) + { + options = { ...WiredFilter.DEFAULT_OPTIONS, ...options }; + + const glProgram = GlProgram.from({ + vertex: `in vec2 aPosition; + out vec2 vTextureCoord; + + uniform vec4 uInputSize; + uniform vec4 uOutputFrame; + uniform vec4 uOutputTexture; + + vec4 filterVertexPosition( void ) + { + vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy; + + position.x = position.x * (2.0 / uOutputTexture.x) - 1.0; + position.y = position.y * (2.0*uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z; + + return vec4(position, 0.0, 1.0); + } + + vec2 filterTextureCoord( void ) + { + return aPosition * (uOutputFrame.zw * uInputSize.zw); + } + + void main(void) + { + gl_Position = filterVertexPosition(); + vTextureCoord = filterTextureCoord(); + }`, + fragment: ` + in vec2 vTextureCoord; + out vec4 finalColor; + + uniform sampler2D uTexture; + uniform vec3 uLineColor; + uniform vec3 uColor; + + void main(void) { + vec4 currentColor = texture(uTexture, vTextureCoord); + vec3 colorLine = uLineColor * currentColor.a; + vec3 colorOverlay = uColor * currentColor.a; + + if(currentColor.r == 0.0 && currentColor.g == 0.0 && currentColor.b == 0.0 && currentColor.a > 0.0) { + finalColor = vec4(colorLine.r, colorLine.g, colorLine.b, currentColor.a); + } else if(currentColor.a > 0.0) { + finalColor = vec4(colorOverlay.r, colorOverlay.g, colorOverlay.b, currentColor.a); + } + } + `, + name: 'wired-filter', + }); + + super({ + gpuProgram: null, + glProgram, + resources: { + planeMaskUniforms: { + uLineColor: { value: new Float32Array(3), type: 'vec3' }, + uColor: { value: new Float32Array(3), type: 'vec3' } + }, + }, + }); + + this.uniforms = this.resources.planeMaskUniforms.uniforms; + + this._lineColor = new Color(); + this.lineColor = options.lineColor ?? 0x000000; + + this._color = new Color(); + this.color = options.color ?? 0x000000; + + Object.assign(this, options); + } + + public apply( + filterManager: FilterSystem, + input: Texture, + output: RenderSurface, + clearMode: boolean, + ): void + { + + filterManager.applyFilter(this, input, output, clearMode); + } + + public get lineColor(): ColorSource + { + return this._lineColor.value as ColorSource; + } + + public set lineColor(value: ColorSource) + { + this._lineColor.setValue(value); + + const [r, g, b] = this._lineColor.toArray(); + + this.uniforms.uLineColor[0] = r; + this.uniforms.uLineColor[1] = g; + this.uniforms.uLineColor[2] = b; + } + + public get color(): ColorSource + { + return this._color.value as ColorSource; + } + + public set color(value: ColorSource) + { + this._color.setValue(value); + + const [r, g, b] = this._color.toArray(); + + this.uniforms.uColor[0] = r; + this.uniforms.uColor[1] = g; + this.uniforms.uColor[2] = b; + } +} diff --git a/packages/utils/src/filters/index.ts b/packages/utils/src/filters/index.ts new file mode 100644 index 0000000..910b9e9 --- /dev/null +++ b/packages/utils/src/filters/index.ts @@ -0,0 +1,3 @@ +export * from './PaletteMapFilter'; +export * from './PlaneMaskFilter'; +export * from './WiredFilter'; diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts new file mode 100644 index 0000000..a25613d --- /dev/null +++ b/packages/utils/src/index.ts @@ -0,0 +1,31 @@ +export * from './AdvancedMap'; +export * from './ArrayBufferToBase64'; +export * from './BinaryReader'; +export * from './BinaryWriter'; +export * from './ColorConverter'; +export * from './FurniId'; +export * from './GetPixi'; +export * from './GetRenderer'; +export * from './GetStage'; +export * from './GetTexturePool'; +export * from './GetTicker'; +export * from './GetTickerFPS'; +export * from './GetTickerTime'; +export * from './HabboWebTools'; +export * from './Int32'; +export * from './LegacyExternalInterface'; +export * from './LinkTracker'; +export * from './Matrix4x4'; +export * from './NitroBundle'; +export * from './NitroConfig'; +export * from './NitroLogger'; +export * from './NitroVersion'; +export * from './Node3D'; +export * from './NumberBank'; +export * from './PointMath'; +export * from './RoomId'; +export * from './TexturePool'; +export * from './TextureUtils'; +export * from './Vector3d'; +export * from './filters'; +export * from './motion'; diff --git a/packages/utils/src/motion/Callback.ts b/packages/utils/src/motion/Callback.ts new file mode 100644 index 0000000..259f13c --- /dev/null +++ b/packages/utils/src/motion/Callback.ts @@ -0,0 +1,30 @@ +import { Motion } from './Motion'; + +export class Callback extends Motion +{ + protected _callback: Function; + + constructor(k: Function) + { + super(null); + + this._callback = k; + } + + public get running(): boolean + { + return (this._running && !!this._callback); + } + + public tick(k: number): void + { + super.tick(k); + + if(this._callback) + { + this._callback(); + + this._callback = null; + } + } +} \ No newline at end of file diff --git a/packages/utils/src/motion/Combo.ts b/packages/utils/src/motion/Combo.ts new file mode 100644 index 0000000..a5450c6 --- /dev/null +++ b/packages/utils/src/motion/Combo.ts @@ -0,0 +1,61 @@ +import { Motion } from './Motion'; + +export class Combo extends Motion +{ + private _runningMotions: Motion[]; + private _removedMotions: Motion[]; + + constructor(...motions: Motion[]) + { + super((motions && motions.length) ? motions[0].target : null); + + this._runningMotions = []; + this._removedMotions = []; + + for(const motion of motions) this._runningMotions.push(motion); + } + + public start(): void + { + super.start(); + + for(const motion of this._runningMotions) motion.start(); + } + + public tick(k: number): void + { + super.tick(k); + + let motion: Motion = null; + + while(((motion = this._removedMotions.pop()) !== null)) + { + this._runningMotions.splice(this._removedMotions.indexOf(motion), 1); + + if(motion.running) motion.stop(); + } + + for(const motion of this._runningMotions) + { + if(motion.running) motion.tick(k); + + if(motion.complete) this._removedMotions.push(motion); + } + + if(this._runningMotions.length > 0) + { + for(const motion of this._runningMotions) + { + this._target = motion.target; + + if(this._target) break; + } + + this._complete = false; + } + else + { + this._complete = true; + } + } +} \ No newline at end of file diff --git a/packages/utils/src/motion/Dispose.ts b/packages/utils/src/motion/Dispose.ts new file mode 100644 index 0000000..252b8e3 --- /dev/null +++ b/packages/utils/src/motion/Dispose.ts @@ -0,0 +1,21 @@ +import { Motion } from './Motion'; + +export class Dispose extends Motion +{ + constructor(k: HTMLElement) + { + super(k); + } + + public tick(k: number): void + { + super.tick(k); + + if(this.target) + { + this.target.remove(); + + this.target = null; + } + } +} \ No newline at end of file diff --git a/packages/utils/src/motion/DropBounce.ts b/packages/utils/src/motion/DropBounce.ts new file mode 100644 index 0000000..7b52fce --- /dev/null +++ b/packages/utils/src/motion/DropBounce.ts @@ -0,0 +1,60 @@ +import { Interval } from './Interval'; + +export class DropBounce extends Interval +{ + private _height: number; + private _offset: number; + + constructor(target: HTMLElement, duration: number, height: number) + { + super(target, duration); + + this._height = height; + } + + public start(): void + { + super.start(); + + this._offset = 0; + + this.target.style.top = ((this._offset - this._height) + 'px'); + } + + public update(time: number): void + { + super.update(time); + + this.target.style.top = (((this._offset - this._height) + (this.getBounceOffset(time) * this._height)) + 'px'); + } + + protected getBounceOffset(k: number): number + { + if(k < 0.364) return (7.5625 * k) * k; + + if(k < 0.727) + { + k = (k - 0.545); + + return ((7.5625 * k) * k) + 0.75; + } + + if(k < 0.909) + { + k = (k - 0.9091); + + return ((7.5625 * k) * k) + 0.9375; + } + + k = (k - 0.955); + + return ((7.5625 * k) * k) + 0.984375; + } + + public stop(): void + { + this.target.style.top = (this._offset + 'px'); + + super.stop(); + } +} \ No newline at end of file diff --git a/packages/utils/src/motion/Ease.ts b/packages/utils/src/motion/Ease.ts new file mode 100644 index 0000000..1034cdf --- /dev/null +++ b/packages/utils/src/motion/Ease.ts @@ -0,0 +1,34 @@ +import { Interval } from './Interval'; + +export class Ease extends Interval +{ + protected _interval: Interval; + + constructor(k: Interval) + { + super(k.target, k.duration); + + this._interval = k; + } + + public start(): void + { + super.start(); + + this._interval.start(); + } + + public update(k: number): void + { + super.update(k); + + this._interval.update(k); + } + + public stop(): void + { + super.stop(); + + this._interval.stop(); + } +} \ No newline at end of file diff --git a/packages/utils/src/motion/EaseOut.ts b/packages/utils/src/motion/EaseOut.ts new file mode 100644 index 0000000..d59fb0f --- /dev/null +++ b/packages/utils/src/motion/EaseOut.ts @@ -0,0 +1,15 @@ +import { EaseRate } from './EaseRate'; +import { Interval } from './Interval'; + +export class EaseOut extends EaseRate +{ + constructor(k: Interval, _arg_2: number) + { + super(k, _arg_2); + } + + public update(k: number): void + { + this._interval.update(Math.pow(k, (1 / this._rate))); + } +} diff --git a/packages/utils/src/motion/EaseRate.ts b/packages/utils/src/motion/EaseRate.ts new file mode 100644 index 0000000..d5308cc --- /dev/null +++ b/packages/utils/src/motion/EaseRate.ts @@ -0,0 +1,14 @@ +import { Ease } from './Ease'; +import { Interval } from './Interval'; + +export class EaseRate extends Ease +{ + protected _rate: number; + + constructor(k: Interval, _arg_2: number) + { + super(k); + + this._rate = _arg_2; + } +} diff --git a/packages/utils/src/motion/Interval.ts b/packages/utils/src/motion/Interval.ts new file mode 100644 index 0000000..01a963b --- /dev/null +++ b/packages/utils/src/motion/Interval.ts @@ -0,0 +1,47 @@ +import { GetTickerTime } from '../GetTickerTime'; +import { Motion } from './Motion'; + +export class Interval extends Motion +{ + private _startTimeMs: number; + private _duration: number; + + constructor(target: HTMLElement, duration: number) + { + super(target); + + this._complete = false; + this._duration = duration; + } + + public get duration(): number + { + return this._duration; + } + + public start(): void + { + super.start(); + + this._complete = false; + this._startTimeMs = GetTickerTime(); + } + + public tick(time: number): void + { + super.tick(time); + + const elapsed = ((time - this._startTimeMs) / this._duration); + + if(elapsed < 1) + { + this.update(elapsed); + } + else + { + this.update(1); + + this._complete = true; + } + } +} diff --git a/packages/utils/src/motion/JumpBy.ts b/packages/utils/src/motion/JumpBy.ts new file mode 100644 index 0000000..1b956c9 --- /dev/null +++ b/packages/utils/src/motion/JumpBy.ts @@ -0,0 +1,37 @@ +import { Interval } from './Interval'; + +export class JumpBy extends Interval +{ + protected _startX: number; + protected _startY: number; + protected _deltaX: number; + protected _deltaY: number; + protected _height: number; + protected _numJumps: number; + + constructor(target: HTMLElement, duration: number, deltaX: number, deltaY: number, height: number, numJumps: number) + { + super(target, duration); + + this._deltaX = deltaX; + this._deltaY = deltaY; + this._height = -(height); + this._numJumps = numJumps; + } + + public start(): void + { + super.start(); + + this._startX = this.target.offsetLeft; + this._startY = this.target.offsetTop; + } + + public update(k: number): void + { + super.update(k); + + this.target.style.left = ((this._startX + (this._deltaX * k)) + 'px'); + this.target.style.top = (((this._startY + (this._height * Math.abs(Math.sin(((k * Math.PI) * this._numJumps))))) + (this._deltaY * k)) + 'px'); + } +} \ No newline at end of file diff --git a/packages/utils/src/motion/Motion.ts b/packages/utils/src/motion/Motion.ts new file mode 100644 index 0000000..acf6f58 --- /dev/null +++ b/packages/utils/src/motion/Motion.ts @@ -0,0 +1,61 @@ +export class Motion +{ + protected _target: HTMLElement; + protected _running: boolean; + protected _complete: boolean = true; + protected _tag: string; + + constructor(target: HTMLElement) + { + this._target = target; + } + + public get running(): boolean + { + return ((this._running) && (!!this._target)); + } + + public get complete(): boolean + { + return this._complete; + } + + public set target(k: HTMLElement) + { + this._target = k; + } + + public get target(): HTMLElement + { + return this._target; + } + + public set tag(k: string) + { + this._tag = k; + } + + public get tag(): string + { + return this._tag; + } + + public start(): void + { + this._running = true; + } + + public update(k: number): void + { + } + + public stop(): void + { + this._target = null; + this._running = false; + } + + public tick(k: number): void + { + } +} \ No newline at end of file diff --git a/packages/utils/src/motion/Motions.ts b/packages/utils/src/motion/Motions.ts new file mode 100644 index 0000000..92c7242 --- /dev/null +++ b/packages/utils/src/motion/Motions.ts @@ -0,0 +1,194 @@ +import { GetTickerFPS } from '../GetTickerFPS'; +import { GetTickerTime } from '../GetTickerTime'; +import { Motion } from './Motion'; + +export class Motions +{ + private static _QUEUED_MOTIONS: Motion[] = []; + private static _RUNNING_MOTIONS: Motion[] = []; + private static _REMOVED_MOTIONS: Motion[] = []; + private static _TIMER: ReturnType = null; + private static _IS_UPDATING: boolean = false; + + public static get TIMER_TIME(): number + { + return (1000 / GetTickerFPS()); + } + + public static runMotion(k: Motion): Motion + { + if(((Motions._RUNNING_MOTIONS.indexOf(k) === -1) && (Motions._QUEUED_MOTIONS.indexOf(k) === -1))) + { + if(Motions._IS_UPDATING) + { + Motions._QUEUED_MOTIONS.push(k); + } + else + { + Motions._RUNNING_MOTIONS.push(k); + + k.start(); + } + + Motions.startTimer(); + } + + return k; + } + + public static removeMotion(k: Motion): void + { + let _local_2: number = Motions._RUNNING_MOTIONS.indexOf(k); + + if(_local_2 > -1) + { + if(Motions._IS_UPDATING) + { + _local_2 = Motions._REMOVED_MOTIONS.indexOf(k); + + if(_local_2 == -1) Motions._REMOVED_MOTIONS.push(k); + } + else + { + Motions._RUNNING_MOTIONS.splice(_local_2, 1); + + if(k.running) k.stop(); + + if(!Motions._RUNNING_MOTIONS.length) Motions.stopTimer(); + } + } + else + { + _local_2 = Motions._QUEUED_MOTIONS.indexOf(k); + + if(_local_2 > -1) Motions._QUEUED_MOTIONS.splice(_local_2, 1); + } + } + + public static getMotionByTag(k: string): Motion + { + for(const _local_2 of Motions._RUNNING_MOTIONS) + { + if(_local_2.tag == k) return _local_2; + } + + for(const _local_2 of Motions._QUEUED_MOTIONS) + { + if(_local_2.tag == k) return _local_2; + } + + return null; + } + + public static getMotionByTarget(k: HTMLElement): Motion + { + for(const _local_2 of Motions._RUNNING_MOTIONS) + { + if(_local_2.target == k) return _local_2; + } + + for(const _local_2 of Motions._QUEUED_MOTIONS) + { + if(_local_2.target == k) return _local_2; + } + + return null; + } + + public static getMotionByTagAndTarget(k: string, _arg_2: HTMLElement): Motion + { + for(const _local_3 of Motions._RUNNING_MOTIONS) + { + if(((_local_3.tag == k) && (_local_3.target == _arg_2))) return _local_3; + } + + for(const _local_3 of Motions._QUEUED_MOTIONS) + { + if(((_local_3.tag == k) && (_local_3.target == _arg_2))) return _local_3; + } + + return null; + } + + public static get isRunning(): boolean + { + return !!Motions._TIMER; + } + + public static get isUpdating(): boolean + { + return Motions._IS_UPDATING; + } + + private static onTick(): void + { + Motions._IS_UPDATING = true; + + const _local_2: number = GetTickerTime(); + + let _local_3: Motion = null; + + // eslint-disable-next-line no-cond-assign + while(_local_3 = Motions._QUEUED_MOTIONS.pop()) Motions._RUNNING_MOTIONS.push(_local_3); + + // eslint-disable-next-line no-cond-assign + while(_local_3 = Motions._REMOVED_MOTIONS.pop()) + { + Motions._RUNNING_MOTIONS.splice(Motions._RUNNING_MOTIONS.indexOf(_local_3), 1); + + if(_local_3.running) _local_3.stop(); + } + + for(_local_3 of Motions._RUNNING_MOTIONS) + { + if(_local_3.running) + { + _local_3.tick(_local_2); + + if(_local_3.complete) + { + Motions.removeMotion(_local_3); + } + } + else + { + Motions.removeMotion(_local_3); + } + } + + if(!Motions._RUNNING_MOTIONS.length) Motions.stopTimer(); + + Motions._IS_UPDATING = false; + } + + private static startTimer(): void + { + if(!Motions._TIMER) + { + Motions._TIMER = setInterval(Motions.onTick, Motions.TIMER_TIME); + } + } + + private static stopTimer(): void + { + if(Motions._TIMER) + { + clearInterval(Motions._TIMER); + + Motions._TIMER = null; + } + } + + + public getNumRunningMotions(k: HTMLElement): number + { + let _local_2 = 0; + + for(const _local_3 of Motions._RUNNING_MOTIONS) + { + if(_local_3.target === k) _local_2++; + } + + return _local_2; + } +} diff --git a/packages/utils/src/motion/MoveBy.ts b/packages/utils/src/motion/MoveBy.ts new file mode 100644 index 0000000..1639901 --- /dev/null +++ b/packages/utils/src/motion/MoveBy.ts @@ -0,0 +1,17 @@ +import { MoveTo } from './MoveTo'; + +export class MoveBy extends MoveTo +{ + constructor(k: HTMLElement, _arg_2: number, _arg_3: number, _arg_4: number) + { + super(k, _arg_2, _arg_3, _arg_4); + } + + public start(): void + { + this._endX = (this.target.offsetLeft + this._endX); + this._endY = (this.target.offsetTop + this._endY); + + super.start(); + } +} \ No newline at end of file diff --git a/packages/utils/src/motion/MoveTo.ts b/packages/utils/src/motion/MoveTo.ts new file mode 100644 index 0000000..3d7fe2a --- /dev/null +++ b/packages/utils/src/motion/MoveTo.ts @@ -0,0 +1,35 @@ +import { Interval } from './Interval'; + +export class MoveTo extends Interval +{ + protected _startX: number; + protected _startY: number; + protected _endX: number; + protected _endY: number; + protected _deltaX: number; + protected _deltaY: number; + + constructor(k: HTMLElement, _arg_2: number, _arg_3: number, _arg_4: number) + { + super(k, _arg_2); + + this._endX = _arg_3; + this._endY = _arg_4; + } + + public start(): void + { + super.start(); + + this._startX = this.target.offsetLeft; + this._startY = this.target.offsetTop; + this._deltaX = (this._endX - this._startX); + this._deltaY = (this._endY - this._startY); + } + + public update(k: number): void + { + this.target.style.left = ((this._startX + (this._deltaX * k)) + 'px'); + this.target.style.top = ((this._startY + (this._deltaY * k)) + 'px'); + } +} \ No newline at end of file diff --git a/packages/utils/src/motion/Queue.ts b/packages/utils/src/motion/Queue.ts new file mode 100644 index 0000000..990d9da --- /dev/null +++ b/packages/utils/src/motion/Queue.ts @@ -0,0 +1,71 @@ +import { Motion } from './Motion'; + +export class Queue extends Motion +{ + private _motion: Motion; + private _queue: Motion[]; + + constructor(...motions: Motion[]) + { + super((motions ? motions[0].target : null)); + + this._queue = []; + + for(const motion of motions) this._queue.push(motion); + + this._motion = motions[0]; + this._complete = !this._motion; + } + + public get running(): boolean + { + return ((this._running && this._motion) ? this._motion.running : false); + } + + public start(): void + { + super.start(); + + this._motion.start(); + } + + public update(k: number): void + { + super.update(k); + + if(this._motion.running) this._motion.update(k); + } + + public stop(): void + { + super.stop(); + + this._motion.stop(); + } + + public tick(k: number): void + { + super.tick(k); + + this._motion.tick(k); + + if(this._motion.complete) + { + this._motion.stop(); + + const index = this._queue.indexOf(this._motion); + + if(index < (this._queue.length - 1)) + { + this._motion = this._queue[(index + 1)]; + this._target = this._motion.target; + + this._motion.start(); + } + else + { + this._complete = true; + } + } + } +} \ No newline at end of file diff --git a/packages/utils/src/motion/ResizeTo.ts b/packages/utils/src/motion/ResizeTo.ts new file mode 100644 index 0000000..d5e706b --- /dev/null +++ b/packages/utils/src/motion/ResizeTo.ts @@ -0,0 +1,35 @@ +import { Interval } from './Interval'; + +export class ResizeTo extends Interval +{ + protected _startW: number; + protected _startH: number; + protected _endW: number; + protected _endH: number; + protected _deltaW: number; + protected _deltaH: number; + + constructor(k: HTMLElement, _arg_2: number, _arg_3: number, _arg_4: number) + { + super(k, _arg_2); + + this._endW = _arg_3; + this._endH = _arg_4; + } + + public start(): void + { + super.start(); + + this._startW = this.target.offsetWidth; + this._startH = this.target.offsetHeight; + this._deltaW = (this._endW - this._startW); + this._deltaH = (this._endH - this._startH); + } + + public update(k: number): void + { + this.target.style.width = ((this._startW + (this._deltaW * k)) + 'px'); + this.target.style.height = ((this._startH + (this._deltaH * k)) + 'px'); + } +} \ No newline at end of file diff --git a/packages/utils/src/motion/Wait.ts b/packages/utils/src/motion/Wait.ts new file mode 100644 index 0000000..f64a01b --- /dev/null +++ b/packages/utils/src/motion/Wait.ts @@ -0,0 +1,37 @@ +import { GetTickerTime } from '../GetTickerTime'; +import { Motion } from './Motion'; + +export class Wait extends Motion +{ + private _startTimeMs: number; + private _waitTimeMs: number; + + constructor(k: number) + { + super(null); + + this._waitTimeMs = k; + } + + public get running(): boolean + { + return this._running; + } + + public start(): void + { + super.start(); + + this._complete = false; + this._startTimeMs = GetTickerTime(); + } + + public tick(k: number): void + { + super.tick(k); + + this._complete = ((k - this._startTimeMs) >= this._waitTimeMs); + + if(this._complete) this.stop(); + } +} diff --git a/packages/utils/src/motion/index.ts b/packages/utils/src/motion/index.ts new file mode 100644 index 0000000..e9d75df --- /dev/null +++ b/packages/utils/src/motion/index.ts @@ -0,0 +1,16 @@ +export * from './Callback'; +export * from './Combo'; +export * from './Dispose'; +export * from './DropBounce'; +export * from './Ease'; +export * from './EaseOut'; +export * from './EaseRate'; +export * from './Interval'; +export * from './JumpBy'; +export * from './Motion'; +export * from './Motions'; +export * from './MoveBy'; +export * from './MoveTo'; +export * from './Queue'; +export * from './ResizeTo'; +export * from './Wait'; diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json new file mode 100644 index 0000000..5e8757d --- /dev/null +++ b/packages/utils/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./src", + "outDir": "./dist", + "sourceMap": false, + "declaration": true, + "experimentalDecorators": true, + "moduleResolution": "Node", + "esModuleInterop": true, + "importHelpers": true, + "isolatedModules": true, + "resolveJsonModule": true, + "downlevelIteration": true, + "allowSyntheticDefaultImports": true, + "allowJs": true, + "skipLibCheck": true, + "noEmit": true, + "strict": false, + "strictNullChecks": false, + "target": "ES6", + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "module": "ES6" + }, + "include": [ + "src" ] +} diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png deleted file mode 100644 index 634eb06..0000000 Binary files a/public/android-chrome-192x192.png and /dev/null differ diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png deleted file mode 100644 index 33cf6c6..0000000 Binary files a/public/android-chrome-512x512.png and /dev/null differ diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png deleted file mode 100644 index 349b3dd..0000000 Binary files a/public/apple-touch-icon.png and /dev/null differ diff --git a/public/browserconfig.xml b/public/browserconfig.xml deleted file mode 100644 index b3930d0..0000000 --- a/public/browserconfig.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - #da532c - - - diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png deleted file mode 100644 index 788a7f1..0000000 Binary files a/public/favicon-16x16.png and /dev/null differ diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png deleted file mode 100644 index ef4a606..0000000 Binary files a/public/favicon-32x32.png and /dev/null differ diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index 34ba1b3..0000000 Binary files a/public/favicon.ico and /dev/null differ diff --git a/public/mstile-150x150.png b/public/mstile-150x150.png deleted file mode 100644 index 3a555aa..0000000 Binary files a/public/mstile-150x150.png and /dev/null differ diff --git a/public/robots.txt b/public/robots.txt deleted file mode 100644 index e9e57dc..0000000 --- a/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: diff --git a/public/safari-pinned-tab.svg b/public/safari-pinned-tab.svg deleted file mode 100644 index dc7ced3..0000000 --- a/public/safari-pinned-tab.svg +++ /dev/null @@ -1,154 +0,0 @@ - - - - -Created by potrace 1.14, written by Peter Selinger 2001-2017 - - - - - diff --git a/public/site.webmanifest b/public/site.webmanifest deleted file mode 100644 index 6264b89..0000000 --- a/public/site.webmanifest +++ /dev/null @@ -1,20 +0,0 @@ -{ - "start_url": "/", - "name": "Nitro", - "short_name": "Nitro", - "icons": [ - { - "src": "android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" -} diff --git a/src/App.scss b/src/App.scss deleted file mode 100644 index 2000ade..0000000 --- a/src/App.scss +++ /dev/null @@ -1,102 +0,0 @@ -$toolbar-me-zindex: 90; -$chatinput-zindex: 80; -$toolbar-zindex: 70; -$rightside-zindex: 69; -$notification-center-zindex: 68; -$toolbar-memenu-zindex: 60; -$roomtools-zindex: 50; -$context-menu-zindex: 40; -$infostand-zindex: 30; -$quiz-zindex: 21; -$chat-zindex: 20; -$highscore-zindex: 19; - -$grid-bg-color: #cdd3d9; -$grid-border-color: $muted; -$grid-active-bg-color: #ececec; -$grid-active-border-color: $white; - -$toolbar-height: 55px; - -$achievement-width: 375px; -$achievement-height: 405px; - -$avatar-editor-width: 620px; -$avatar-editor-height: 374px; - -$catalog-width: 630px; -$catalog-height: 400px; - -$inventory-width: 528px; -$inventory-height: 320px; - -$navigator-width: 420px; -$navigator-height: 440px; - -$chat-input-style-selector-widget-width: 210px; -$chat-input-style-selector-widget-height: 200px; - -$user-profile-width: 470px; -$user-profile-height: 460px; - -$nitro-widget-custom-stack-height-width: 275px; -$nitro-widget-custom-stack-height-height: 220px; - -$nitro-widget-exchange-credit-width: 375px; -$nitro-widget-exchange-credit-height: 150px; - -$nitro-widget-crafting-width: 500px; -$nitro-widget-crafting-height: 300px; - -$chat-history-width: 300px; -$chat-history-height: 300px; - -$friends-list-width: 250px; -$friends-list-height: 300px; - -$help-width: 450px; -$help-height: 290px; - -$nitropedia-width: 400px; -$nitropedia-height: 400px; - -$messenger-width: 500px; -$messenger-height: 370px; - -$marketplace-post-offer-width: 430px; -$marketplace-post-offer-height: 250px; - -$camera-editor-width: 600px; -$camera-editor-height: 500px; - -$camera-checkout-width: 350px; - -$room-info-width: 325px; - -$nitro-group-creator-width: 383px; -$nitro-mod-tools-width: 175px; - -$nitro-group-manager-width: 390px; -$nitro-group-manager-height: 355px; - -$nitro-chooser-width: 200px; -$nitro-chooser-height: 200px; - -$nitro-doorbell-width: 300px; -$nitro-doorbell-height: 200px; - -$nitro-guide-tool-width: 250px; - -$nitro-floor-editor-width: 760px; -$nitro-floor-editor-height: 500px; - -$nitro-calendar-width: 850px; -$nitro-calendar-height: 400px; - -.nitro-app { - width: 100%; - height: 100%; -} - -@import './common'; -@import './components'; diff --git a/src/App.tsx b/src/App.tsx deleted file mode 100644 index 1c8e72c..0000000 --- a/src/App.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import { GetAssetManager, GetAvatarRenderManager, GetCommunication, GetConfiguration, GetLocalizationManager, GetRoomCameraWidgetManager, GetRoomEngine, GetRoomSessionManager, GetSessionDataManager, GetSoundManager, GetStage, GetTexturePool, GetTicker, HabboWebTools, LegacyExternalInterface, LoadGameUrlEvent, NitroLogger, NitroVersion, PrepareRenderer } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { GetUIVersion } from './api'; -import { Base } from './common'; -import { LoadingView } from './components/loading/LoadingView'; -import { MainView } from './components/main/MainView'; -import { useMessageEvent } from './hooks'; - -NitroVersion.UI_VERSION = GetUIVersion(); - -export const App: FC<{}> = props => -{ - const [ isReady, setIsReady ] = useState(false); - - useMessageEvent(LoadGameUrlEvent, event => - { - const parser = event.getParser(); - - if(!parser) return; - - LegacyExternalInterface.callGame('showGame', parser.url); - }); - - useEffect(() => - { - const prepare = async (width: number, height: number) => - { - try - { - if(!window.NitroConfig) throw new Error('NitroConfig is not defined!'); - - const renderer = await PrepareRenderer({ - width, - height, - autoDensity: true, - backgroundAlpha: 0, - preference: 'webgl', - resolution: window.devicePixelRatio - }); - - await GetConfiguration().init(); - - GetTicker().maxFPS = GetConfiguration().getValue('system.fps.max', 24); - NitroLogger.LOG_DEBUG = GetConfiguration().getValue('system.log.debug', true); - NitroLogger.LOG_WARN = GetConfiguration().getValue('system.log.warn', false); - NitroLogger.LOG_ERROR = GetConfiguration().getValue('system.log.error', false); - NitroLogger.LOG_EVENTS = GetConfiguration().getValue('system.log.events', false); - NitroLogger.LOG_PACKETS = GetConfiguration().getValue('system.log.packets', false); - - const assetUrls = GetConfiguration().getValue('preload.assets.urls').map(url => GetConfiguration().interpolate(url)) ?? []; - - await Promise.all( - [ - GetAssetManager().downloadAssets(assetUrls), - GetLocalizationManager().init(), - GetAvatarRenderManager().init(), - GetSoundManager().init(), - GetSessionDataManager().init(), - GetRoomSessionManager().init(), - GetRoomCameraWidgetManager().init() - ] - ); - - await GetRoomEngine().init(); - await GetCommunication().init(); - - // new GameMessageHandler(); - - if(LegacyExternalInterface.available) LegacyExternalInterface.call('legacyTrack', 'authentication', 'authok', []); - - HabboWebTools.sendHeartBeat(); - - setInterval(() => HabboWebTools.sendHeartBeat(), 10000); - - GetTicker().add(ticker => GetRoomEngine().update(ticker)); - GetTicker().add(ticker => renderer.render(GetStage())); - GetTicker().add(ticker => GetTexturePool().run()); - - setIsReady(true); - - // handle socket close - //canvas.addEventListener('webglcontextlost', () => instance.events.dispatchEvent(new NitroEvent(Nitro.WEBGL_CONTEXT_LOST))); - } - - catch(err) - { - NitroLogger.error(err); - } - } - - prepare(window.innerWidth, window.innerHeight); - }, []); - - return ( - - { !isReady && - } - { isReady && } - - - ); -} diff --git a/src/DevTools.ts b/src/DevTools.ts new file mode 100644 index 0000000..ad972b8 --- /dev/null +++ b/src/DevTools.ts @@ -0,0 +1,25 @@ +import { GetRoomEngine, RoomEngine } from '@nitrots/room'; +import { GetRenderer, GetTexturePool } from '@nitrots/utils'; +import { Texture, TextureGCSystem, TextureSource } from 'pixi.js'; +export { }; + +declare global +{ + interface Window + { + NitroDevTools?: + { + roomEngine(): RoomEngine; + textureCache(): TextureSource[]; + texturePool(): { [index: string]: { [index: string]: Texture[] } }; + textureGC(): TextureGCSystem; + }; + } +} + +window.NitroDevTools = { + roomEngine: () => GetRoomEngine(), + textureCache: () => GetRenderer().texture.managedTextures, + texturePool: () => GetTexturePool().textures, + textureGC: () => GetRenderer().textureGC +}; diff --git a/src/api/GetRendererVersion.ts b/src/api/GetRendererVersion.ts deleted file mode 100644 index bb9e461..0000000 --- a/src/api/GetRendererVersion.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { NitroVersion } from '@nitrots/nitro-renderer'; - -export const GetRendererVersion = () => NitroVersion.RENDERER_VERSION; diff --git a/src/api/GetUIVersion.ts b/src/api/GetUIVersion.ts deleted file mode 100644 index bdbe922..0000000 --- a/src/api/GetUIVersion.ts +++ /dev/null @@ -1 +0,0 @@ -export const GetUIVersion = () => '2.2.0'; diff --git a/src/api/achievements/AchievementCategory.ts b/src/api/achievements/AchievementCategory.ts deleted file mode 100644 index 906d8da..0000000 --- a/src/api/achievements/AchievementCategory.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { AchievementData } from '@nitrots/nitro-renderer'; -import { AchievementUtilities } from './AchievementUtilities'; -import { IAchievementCategory } from './IAchievementCategory'; - -export class AchievementCategory implements IAchievementCategory -{ - private _code: string; - private _achievements: AchievementData[]; - - constructor(code: string) - { - this._code = code; - this._achievements = []; - } - - public getProgress(): number - { - return AchievementUtilities.getAchievementCategoryProgress(this); - } - - public getMaxProgress(): number - { - return AchievementUtilities.getAchievementCategoryMaxProgress(this); - } - - public get code(): string - { - return this._code; - } - - public get achievements(): AchievementData[] - { - return this._achievements; - } - - public set achievements(achievements: AchievementData[]) - { - this._achievements = achievements; - } -} diff --git a/src/api/achievements/AchievementUtilities.ts b/src/api/achievements/AchievementUtilities.ts deleted file mode 100644 index 55180e6..0000000 --- a/src/api/achievements/AchievementUtilities.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { AchievementData, GetLocalizationManager } from '@nitrots/nitro-renderer'; -import { GetConfigurationValue } from '../nitro'; -import { IAchievementCategory } from './IAchievementCategory'; - -export class AchievementUtilities -{ - public static getAchievementBadgeCode(achievement: AchievementData): string - { - if(!achievement) return null; - - let badgeId = achievement.badgeId; - - if(!achievement.finalLevel) badgeId = GetLocalizationManager().getPreviousLevelBadgeId(badgeId); - - return badgeId; - } - - public static getAchievementCategoryImageUrl(category: IAchievementCategory, progress: number = null, icon: boolean = false): string - { - const imageUrl = GetConfigurationValue('achievements.images.url'); - - let imageName = icon ? 'achicon_' : 'achcategory_'; - - imageName += category.code; - - if(progress !== null) imageName += `_${ ((progress > 0) ? 'active' : 'inactive') }`; - - return imageUrl.replace('%image%', imageName); - } - - public static getAchievementCategoryMaxProgress(category: IAchievementCategory): number - { - if(!category) return 0; - - let progress = 0; - - for(const achievement of category.achievements) - { - progress += achievement.levelCount; - } - - return progress; - } - - public static getAchievementCategoryProgress(category: IAchievementCategory): number - { - if(!category) return 0; - - let progress = 0; - - for(const achievement of category.achievements) progress += (achievement.finalLevel ? achievement.level : (achievement.level - 1)); - - return progress; - } - - public static getAchievementCategoryTotalUnseen(category: IAchievementCategory): number - { - if(!category) return 0; - - let unseen = 0; - - for(const achievement of category.achievements) ((achievement.unseen > 0) && unseen++); - - return unseen; - } - - public static getAchievementHasStarted(achievement: AchievementData): boolean - { - if(!achievement) return false; - - if(achievement.finalLevel || ((achievement.level - 1) > 0)) return true; - - return false; - } - - public static getAchievementIsIgnored(achievement: AchievementData): boolean - { - if(!achievement) return false; - - const ignored = GetConfigurationValue('achievements.unseen.ignored'); - const value = achievement.badgeId.replace(/[0-9]/g, ''); - const index = ignored.indexOf(value); - - if(index >= 0) return true; - - return false; - } - - public static getAchievementLevel(achievement: AchievementData): number - { - if(!achievement) return 0; - - if(achievement.finalLevel) return achievement.level; - - return (achievement.level - 1); - } -} diff --git a/src/api/achievements/IAchievementCategory.ts b/src/api/achievements/IAchievementCategory.ts deleted file mode 100644 index a049d46..0000000 --- a/src/api/achievements/IAchievementCategory.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { AchievementData } from '@nitrots/nitro-renderer'; - -export interface IAchievementCategory -{ - code: string; - achievements: AchievementData[]; -} diff --git a/src/api/achievements/index.ts b/src/api/achievements/index.ts deleted file mode 100644 index a3d44b7..0000000 --- a/src/api/achievements/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './AchievementCategory'; -export * from './AchievementUtilities'; -export * from './IAchievementCategory'; diff --git a/src/api/avatar/AvatarEditorAction.ts b/src/api/avatar/AvatarEditorAction.ts deleted file mode 100644 index 064d6df..0000000 --- a/src/api/avatar/AvatarEditorAction.ts +++ /dev/null @@ -1,7 +0,0 @@ -export class AvatarEditorAction -{ - public static ACTION_SAVE: string = 'AEA_ACTION_SAVE'; - public static ACTION_CLEAR: string = 'AEA_ACTION_CLEAR'; - public static ACTION_RESET: string = 'AEA_ACTION_RESET'; - public static ACTION_RANDOMIZE: string = 'AEA_ACTION_RANDOMIZE'; -} diff --git a/src/api/avatar/AvatarEditorGridColorItem.ts b/src/api/avatar/AvatarEditorGridColorItem.ts deleted file mode 100644 index dee3dae..0000000 --- a/src/api/avatar/AvatarEditorGridColorItem.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { ColorConverter, IPartColor } from '@nitrots/nitro-renderer'; - -export class AvatarEditorGridColorItem -{ - private _partColor: IPartColor; - private _isDisabled: boolean; - private _isHC: boolean; - private _isSelected: boolean; - private _notifier: () => void; - - constructor(partColor: IPartColor, isDisabled: boolean = false) - { - this._partColor = partColor; - this._isDisabled = isDisabled; - this._isHC = (this._partColor.clubLevel > 0); - this._isSelected = false; - } - - public dispose(): void - { - this._partColor = null; - } - - public get partColor(): IPartColor - { - return this._partColor; - } - - public get color(): string - { - return ColorConverter.int2rgb(this._partColor.rgb); - } - - public get isDisabled(): boolean - { - return this._isDisabled; - } - - public get isHC(): boolean - { - return this._isHC; - } - - public get isSelected(): boolean - { - return this._isSelected; - } - - public set isSelected(flag: boolean) - { - this._isSelected = flag; - - if(this.notify) this.notify(); - } - - public get notify(): () => void - { - return this._notifier; - } - - public set notify(notifier: () => void) - { - this._notifier = notifier; - } -} diff --git a/src/api/avatar/AvatarEditorGridPartItem.ts b/src/api/avatar/AvatarEditorGridPartItem.ts deleted file mode 100644 index 45e9472..0000000 --- a/src/api/avatar/AvatarEditorGridPartItem.ts +++ /dev/null @@ -1,336 +0,0 @@ -import { AvatarFigurePartType, GetAvatarRenderManager, IAvatarImageListener, IAvatarRenderManager, IFigurePart, IFigurePartSet, IGraphicAsset, IPartColor, NitroAlphaFilter, NitroContainer, NitroSprite, TextureUtils } from '@nitrots/nitro-renderer'; -import { FigureData } from './FigureData'; - -export class AvatarEditorGridPartItem implements IAvatarImageListener -{ - private static ALPHA_FILTER: NitroAlphaFilter = new NitroAlphaFilter({ alpha: 0.2 }); - private static THUMB_DIRECTIONS: number[] = [ 2, 6, 0, 4, 3, 1 ]; - private static DRAW_ORDER: string[] = [ - AvatarFigurePartType.LEFT_HAND_ITEM, - AvatarFigurePartType.LEFT_HAND, - AvatarFigurePartType.LEFT_SLEEVE, - AvatarFigurePartType.LEFT_COAT_SLEEVE, - AvatarFigurePartType.BODY, - AvatarFigurePartType.SHOES, - AvatarFigurePartType.LEGS, - AvatarFigurePartType.CHEST, - AvatarFigurePartType.CHEST_ACCESSORY, - AvatarFigurePartType.COAT_CHEST, - AvatarFigurePartType.CHEST_PRINT, - AvatarFigurePartType.WAIST_ACCESSORY, - AvatarFigurePartType.RIGHT_HAND, - AvatarFigurePartType.RIGHT_SLEEVE, - AvatarFigurePartType.RIGHT_COAT_SLEEVE, - AvatarFigurePartType.HEAD, - AvatarFigurePartType.FACE, - AvatarFigurePartType.EYES, - AvatarFigurePartType.HAIR, - AvatarFigurePartType.HAIR_BIG, - AvatarFigurePartType.FACE_ACCESSORY, - AvatarFigurePartType.EYE_ACCESSORY, - AvatarFigurePartType.HEAD_ACCESSORY, - AvatarFigurePartType.HEAD_ACCESSORY_EXTRA, - AvatarFigurePartType.RIGHT_HAND_ITEM, - ]; - - private _renderManager: IAvatarRenderManager; - private _partSet: IFigurePartSet; - private _partColors: IPartColor[]; - private _useColors: boolean; - private _isDisabled: boolean; - private _thumbContainer: NitroContainer; - private _imageUrl: string; - private _maxColorIndex: number; - private _isValidFigure: boolean; - private _isHC: boolean; - private _isSellable: boolean; - private _isClear: boolean; - private _isSelected: boolean; - private _disposed: boolean; - private _isInitalized: boolean; - private _notifier: () => void; - - constructor(partSet: IFigurePartSet, partColors: IPartColor[], useColors: boolean = true, isDisabled: boolean = false) - { - this._renderManager = GetAvatarRenderManager(); - this._partSet = partSet; - this._partColors = partColors; - this._useColors = useColors; - this._isDisabled = isDisabled; - this._thumbContainer = null; - this._imageUrl = null; - this._maxColorIndex = 0; - this._isValidFigure = false; - this._isHC = false; - this._isSellable = false; - this._isClear = false; - this._isSelected = false; - this._disposed = false; - this._isInitalized = false; - - if(partSet) - { - const colors = partSet.parts; - - for(const color of colors) this._maxColorIndex = Math.max(this._maxColorIndex, color.colorLayerIndex); - } - } - - public init(): void - { - if(this._isInitalized) return; - - this._isInitalized = true; - - this.update(); - } - - public dispose(): void - { - if(this._disposed) return; - - this._renderManager = null; - this._partSet = null; - this._partColors = null; - this._imageUrl = null; - this._disposed = true; - this._isInitalized = false; - - if(this._thumbContainer) - { - this._thumbContainer.destroy(); - - this._thumbContainer = null; - } - } - - public update(): void - { - this.updateThumbVisualization(); - } - - private analyzeFigure(): boolean - { - if(!this._renderManager || !this._partSet || !this._partSet.parts || !this._partSet.parts.length) return false; - - const figureContainer = this._renderManager.createFigureContainer(((this.partSet.type + '-') + this.partSet.id)); - - if(!this._renderManager.isFigureContainerReady(figureContainer)) - { - this._renderManager.downloadAvatarFigure(figureContainer, this); - - return false; - } - - this._isValidFigure = true; - - return true; - } - - private renderThumb(): NitroContainer - { - if(!this._renderManager || !this._partSet) return null; - - if(!this._isValidFigure) - { - if(!this.analyzeFigure()) return null; - } - - const parts = this._partSet.parts.concat().sort(this.sortByDrawOrder); - const container = new NitroContainer(); - - for(const part of parts) - { - if(!part) continue; - - let asset: IGraphicAsset = null; - let direction = 0; - let hasAsset = false; - - while(!hasAsset && (direction < AvatarEditorGridPartItem.THUMB_DIRECTIONS.length)) - { - const assetName = ((((((((((FigureData.SCALE + '_') + FigureData.STD) + '_') + part.type) + '_') + part.id) + '_') + AvatarEditorGridPartItem.THUMB_DIRECTIONS[direction]) + '_') + FigureData.DEFAULT_FRAME); - - asset = this._renderManager.getAssetByName(assetName); - - if(asset && asset.texture) - { - hasAsset = true; - } - else - { - direction++; - } - } - - if(!hasAsset) continue; - - const x = asset.offsetX; - const y = asset.offsetY; - let partColor: IPartColor = null; - - if(this._useColors && (part.colorLayerIndex > 0)) - { - const color = this._partColors[(part.colorLayerIndex - 1)]; - - if(color) partColor = color; - } - - const sprite = new NitroSprite(asset.texture); - - sprite.position.set(x, y); - - if(partColor) sprite.tint = partColor.rgb; - - container.addChild(sprite); - } - - return container; - } - - private async updateThumbVisualization(): Promise - { - if(!this._isInitalized) return; - - let container = this._thumbContainer; - - if(!container) container = this.renderThumb(); - - if(!container) return; - - if(this._partSet) - { - this._isHC = (this._partSet.clubLevel > 0); - this._isSellable = this._partSet.isSellable; - } - else - { - this._isHC = false; - this._isSellable = false; - } - - if(this._isDisabled) this.setAlpha(container, 0.2); - - this._imageUrl = await TextureUtils.generateImageUrl(container); - - if(this.notify) this.notify(); - } - - private setAlpha(container: NitroContainer, alpha: number): NitroContainer - { - container.filters = [ AvatarEditorGridPartItem.ALPHA_FILTER ]; - - return container; - } - - private sortByDrawOrder(a: IFigurePart, b: IFigurePart): number - { - const indexA = AvatarEditorGridPartItem.DRAW_ORDER.indexOf(a.type); - const indexB = AvatarEditorGridPartItem.DRAW_ORDER.indexOf(b.type); - - if(indexA < indexB) return -1; - - if(indexA > indexB) return 1; - - if(a.index < b.index) return -1; - - if(a.index > b.index) return 1; - - return 0; - } - - public resetFigure(figure: string): void - { - if(!this.analyzeFigure()) return; - - this.update(); - } - - public get disposed(): boolean - { - return this._disposed; - } - - public get id(): number - { - if(!this._partSet) return -1; - - return this._partSet.id; - } - - public get partSet(): IFigurePartSet - { - return this._partSet; - } - - public set partColors(partColors: IPartColor[]) - { - this._partColors = partColors; - - this.update(); - } - - public get isDisabled(): boolean - { - return this._isDisabled; - } - - public set thumbContainer(container: NitroContainer) - { - this._thumbContainer = container; - - this.update(); - } - - public get imageUrl(): string - { - return this._imageUrl; - } - - public get maxColorIndex(): number - { - return this._maxColorIndex; - } - - public get isHC(): boolean - { - return this._isHC; - } - - public get isSellable(): boolean - { - return this._isSellable; - } - - public get isClear(): boolean - { - return this._isClear; - } - - public set isClear(flag: boolean) - { - this._isClear = flag; - } - - public get isSelected(): boolean - { - return this._isSelected; - } - - public set isSelected(flag: boolean) - { - this._isSelected = flag; - - if(this.notify) this.notify(); - } - - public get notify(): () => void - { - return this._notifier; - } - - public set notify(notifier: () => void) - { - this._notifier = notifier; - } -} diff --git a/src/api/avatar/AvatarEditorThumbnailsHelper.ts b/src/api/avatar/AvatarEditorThumbnailsHelper.ts deleted file mode 100644 index 6be9b9b..0000000 --- a/src/api/avatar/AvatarEditorThumbnailsHelper.ts +++ /dev/null @@ -1,189 +0,0 @@ -import { AvatarFigurePartType, AvatarScaleType, AvatarSetType, GetAssetManager, GetAvatarRenderManager, IFigurePart, IGraphicAsset, IPartColor, NitroAlphaFilter, NitroContainer, NitroSprite, TextureUtils } from '@nitrots/nitro-renderer'; -import { FigureData } from './FigureData'; -import { IAvatarEditorCategoryPartItem } from './IAvatarEditorCategoryPartItem'; - -export class AvatarEditorThumbnailsHelper -{ - private static THUMBNAIL_CACHE: Map = new Map(); - private static THUMB_DIRECTIONS: number[] = [ 2, 6, 0, 4, 3, 1 ]; - private static ALPHA_FILTER: NitroAlphaFilter = new NitroAlphaFilter({ alpha: 0.2 }); - private static DRAW_ORDER: string[] = [ - AvatarFigurePartType.LEFT_HAND_ITEM, - AvatarFigurePartType.LEFT_HAND, - AvatarFigurePartType.LEFT_SLEEVE, - AvatarFigurePartType.LEFT_COAT_SLEEVE, - AvatarFigurePartType.BODY, - AvatarFigurePartType.SHOES, - AvatarFigurePartType.LEGS, - AvatarFigurePartType.CHEST, - AvatarFigurePartType.CHEST_ACCESSORY, - AvatarFigurePartType.COAT_CHEST, - AvatarFigurePartType.CHEST_PRINT, - AvatarFigurePartType.WAIST_ACCESSORY, - AvatarFigurePartType.RIGHT_HAND, - AvatarFigurePartType.RIGHT_SLEEVE, - AvatarFigurePartType.RIGHT_COAT_SLEEVE, - AvatarFigurePartType.HEAD, - AvatarFigurePartType.FACE, - AvatarFigurePartType.EYES, - AvatarFigurePartType.HAIR, - AvatarFigurePartType.HAIR_BIG, - AvatarFigurePartType.FACE_ACCESSORY, - AvatarFigurePartType.EYE_ACCESSORY, - AvatarFigurePartType.HEAD_ACCESSORY, - AvatarFigurePartType.HEAD_ACCESSORY_EXTRA, - AvatarFigurePartType.RIGHT_HAND_ITEM, - ]; - - private static getThumbnailKey(setType: string, part: IAvatarEditorCategoryPartItem): string - { - return `${ setType }-${ part.partSet.id }`; - } - - public static clearCache(): void - { - this.THUMBNAIL_CACHE.clear(); - } - - public static async build(setType: string, part: IAvatarEditorCategoryPartItem, useColors: boolean, partColors: IPartColor[], isDisabled: boolean = false): Promise - { - if(!setType || !setType.length || !part || !part.partSet || !part.partSet.parts || !part.partSet.parts.length) return null; - - const thumbnailKey = this.getThumbnailKey(setType, part); - const cached = this.THUMBNAIL_CACHE.get(thumbnailKey); - - if(cached) return cached; - - const buildContainer = (part: IAvatarEditorCategoryPartItem, useColors: boolean, partColors: IPartColor[], isDisabled: boolean = false) => - { - const container = new NitroContainer(); - const parts = part.partSet.parts.concat().sort(this.sortByDrawOrder); - - for(const part of parts) - { - if(!part) continue; - - let asset: IGraphicAsset = null; - let direction = 0; - let hasAsset = false; - - while(!hasAsset && (direction < AvatarEditorThumbnailsHelper.THUMB_DIRECTIONS.length)) - { - const assetName = `${ FigureData.SCALE }_${ FigureData.STD }_${ part.type }_${ part.id }_${ AvatarEditorThumbnailsHelper.THUMB_DIRECTIONS[direction] }_${ FigureData.DEFAULT_FRAME }`; - - asset = GetAssetManager().getAsset(assetName); - - if(asset && asset.texture) - { - hasAsset = true; - } - else - { - direction++; - } - } - - if(!hasAsset) continue; - - const x = asset.offsetX; - const y = asset.offsetY; - - const sprite = new NitroSprite(asset.texture); - - sprite.position.set(x, y); - - if(useColors && (part.colorLayerIndex > 0) && partColors && partColors.length) - { - const color = partColors[(part.colorLayerIndex - 1)]; - - if(color) sprite.tint = color.rgb; - } - - if(isDisabled) container.filters = [ AvatarEditorThumbnailsHelper.ALPHA_FILTER ]; - - container.addChild(sprite); - } - - return container; - } - - return new Promise(async (resolve, reject) => - { - const resetFigure = async (figure: string) => - { - const container = buildContainer(part, useColors, partColors, isDisabled); - const imageUrl = await TextureUtils.generateImageUrl(container); - - AvatarEditorThumbnailsHelper.THUMBNAIL_CACHE.set(thumbnailKey, imageUrl); - - resolve(imageUrl); - } - - const figureContainer = GetAvatarRenderManager().createFigureContainer(`${ setType }-${ part.partSet.id }`); - - if(!GetAvatarRenderManager().isFigureContainerReady(figureContainer)) - { - GetAvatarRenderManager().downloadAvatarFigure(figureContainer, { - resetFigure, - dispose: null, - disposed: false - }); - } - else - { - resetFigure(null); - } - }); - } - - public static async buildForFace(figureString: string, isDisabled: boolean = false): Promise - { - if(!figureString || !figureString.length) return null; - - const thumbnailKey = figureString; - const cached = this.THUMBNAIL_CACHE.get(thumbnailKey); - - if(cached) return cached; - - return new Promise(async (resolve, reject) => - { - const resetFigure = async (figure: string) => - { - const avatarImage = GetAvatarRenderManager().createAvatarImage(figure, AvatarScaleType.LARGE, null, { resetFigure, dispose: null, disposed: false }); - const texture = avatarImage.processAsTexture(AvatarSetType.HEAD, false); - const sprite = new NitroSprite(texture); - - if(isDisabled) sprite.filters = [ AvatarEditorThumbnailsHelper.ALPHA_FILTER ]; - - const imageUrl = await TextureUtils.generateImageUrl({ - target: sprite - }); - - sprite.destroy(); - avatarImage.dispose(); - - if(!avatarImage.isPlaceholder()) AvatarEditorThumbnailsHelper.THUMBNAIL_CACHE.set(thumbnailKey, imageUrl); - - resolve(imageUrl); - } - - resetFigure(figureString); - }); - } - - private static sortByDrawOrder(a: IFigurePart, b: IFigurePart): number - { - const indexA = AvatarEditorThumbnailsHelper.DRAW_ORDER.indexOf(a.type); - const indexB = AvatarEditorThumbnailsHelper.DRAW_ORDER.indexOf(b.type); - - if(indexA < indexB) return -1; - - if(indexA > indexB) return 1; - - if(a.index < b.index) return -1; - - if(a.index > b.index) return 1; - - return 0; - } -} diff --git a/src/api/avatar/AvatarEditorUtilities.ts b/src/api/avatar/AvatarEditorUtilities.ts deleted file mode 100644 index c7e2468..0000000 --- a/src/api/avatar/AvatarEditorUtilities.ts +++ /dev/null @@ -1,277 +0,0 @@ -import { GetAvatarRenderManager, IPartColor } from '@nitrots/nitro-renderer'; -import { GetClubMemberLevel, GetConfigurationValue } from '../nitro'; -import { AvatarEditorGridColorItem } from './AvatarEditorGridColorItem'; -import { AvatarEditorGridPartItem } from './AvatarEditorGridPartItem'; -import { CategoryBaseModel } from './CategoryBaseModel'; -import { CategoryData } from './CategoryData'; -import { FigureData } from './FigureData'; - -export class AvatarEditorUtilities -{ - private static MAX_PALETTES: number = 2; - - public static CURRENT_FIGURE: FigureData = null; - public static FIGURE_SET_IDS: number[] = []; - public static BOUND_FURNITURE_NAMES: string[] = []; - - public static getGender(gender: string): string - { - switch(gender) - { - case FigureData.MALE: - case 'm': - case 'M': - gender = FigureData.MALE; - break; - case FigureData.FEMALE: - case 'f': - case 'F': - gender = FigureData.FEMALE; - break; - default: - gender = FigureData.MALE; - } - - return gender; - } - - public static hasFigureSetId(setId: number): boolean - { - return (this.FIGURE_SET_IDS.indexOf(setId) >= 0); - } - - public static createCategory(model: CategoryBaseModel, name: string): CategoryData - { - if(!model || !name || !this.CURRENT_FIGURE) return null; - - const partItems: AvatarEditorGridPartItem[] = []; - const colorItems: AvatarEditorGridColorItem[][] = []; - - let i = 0; - - while(i < this.MAX_PALETTES) - { - colorItems.push([]); - - i++; - } - - const setType = GetAvatarRenderManager().structureData.getSetType(name); - - if(!setType) return null; - - const palette = GetAvatarRenderManager().structureData.getPalette(setType.paletteID); - - if(!palette) return null; - - let colorIds = this.CURRENT_FIGURE.getColorIds(name); - - if(!colorIds) colorIds = []; - - const partColors: IPartColor[] = new Array(colorIds.length); - const clubItemsDimmed = this.clubItemsDimmed; - const clubMemberLevel = GetClubMemberLevel(); - - for(const partColor of palette.colors.getValues()) - { - if(partColor.isSelectable && (clubItemsDimmed || (clubMemberLevel >= partColor.clubLevel))) - { - let i = 0; - - while(i < this.MAX_PALETTES) - { - const isDisabled = (clubMemberLevel < partColor.clubLevel); - const colorItem = new AvatarEditorGridColorItem(partColor, isDisabled); - - colorItems[i].push(colorItem); - - i++; - } - - if(name !== FigureData.FACE) - { - let i = 0; - - while(i < colorIds.length) - { - if(partColor.id === colorIds[i]) partColors[i] = partColor; - - i++; - } - } - } - } - - let mandatorySetIds: string[] = []; - - if(clubItemsDimmed) - { - mandatorySetIds = GetAvatarRenderManager().getMandatoryAvatarPartSetIds(this.CURRENT_FIGURE.gender, 2); - } - else - { - mandatorySetIds = GetAvatarRenderManager().getMandatoryAvatarPartSetIds(this.CURRENT_FIGURE.gender, clubMemberLevel); - } - - const isntMandatorySet = (mandatorySetIds.indexOf(name) === -1); - - if(isntMandatorySet) - { - const partItem = new AvatarEditorGridPartItem(null, null, false); - - partItem.isClear = true; - - partItems.push(partItem); - } - - const usesColors = (name !== FigureData.FACE); - const partSets = setType.partSets; - const totalPartSets = partSets.length; - - i = (totalPartSets - 1); - - while(i >= 0) - { - const partSet = partSets.getWithIndex(i); - - let isValidGender = false; - - if(partSet.gender === FigureData.UNISEX) - { - isValidGender = true; - } - - else if(partSet.gender === this.CURRENT_FIGURE.gender) - { - isValidGender = true; - } - - if(partSet.isSelectable && isValidGender && (clubItemsDimmed || (clubMemberLevel >= partSet.clubLevel))) - { - const isDisabled = (clubMemberLevel < partSet.clubLevel); - - let isValid = true; - - if(partSet.isSellable) isValid = this.hasFigureSetId(partSet.id); - - if(isValid) partItems.push(new AvatarEditorGridPartItem(partSet, partColors, usesColors, isDisabled)); - } - - i--; - } - - partItems.sort(this.clubItemsFirst ? this.clubSorter : this.noobSorter); - - // if(this._forceSellableClothingVisibility || GetNitroInstance().getConfiguration("avatareditor.support.sellablefurni", false)) - // { - // _local_31 = (this._manager.windowManager.assets.getAssetByName("camera_zoom_in") as BitmapDataAsset); - // _local_32 = (_local_31.content as BitmapData).clone(); - // _local_33 = (AvatarEditorView._Str_6802.clone() as IWindowContainer); - // _local_33.name = AvatarEditorGridView.GET_MORE; - // _local_7 = new AvatarEditorGridPartItem(_local_33, k, null, null, false); - // _local_7._Str_3093 = _local_32; - // _local_3.push(_local_7); - // } - - i = 0; - - while(i < this.MAX_PALETTES) - { - colorItems[i].sort(this.colorSorter); - - i++; - } - - return new CategoryData(name, partItems, colorItems); - } - - public static clubSorter(a: AvatarEditorGridPartItem, b: AvatarEditorGridPartItem): number - { - const clubLevelA = (!a.partSet ? 9999999999 : a.partSet.clubLevel); - const clubLevelB = (!b.partSet ? 9999999999 : b.partSet.clubLevel); - const isSellableA = (!a.partSet ? false : a.partSet.isSellable); - const isSellableB = (!b.partSet ? false : b.partSet.isSellable); - - if(isSellableA && !isSellableB) return 1; - - if(isSellableB && !isSellableA) return -1; - - if(clubLevelA > clubLevelB) return -1; - - if(clubLevelA < clubLevelB) return 1; - - if(a.partSet.id > b.partSet.id) return -1; - - if(a.partSet.id < b.partSet.id) return 1; - - return 0; - } - - public static colorSorter(a: AvatarEditorGridColorItem, b: AvatarEditorGridColorItem): number - { - const clubLevelA = (!a.partColor ? -1 : a.partColor.clubLevel); - const clubLevelB = (!b.partColor ? -1 : b.partColor.clubLevel); - - if(clubLevelA < clubLevelB) return -1; - - if(clubLevelA > clubLevelB) return 1; - - if(a.partColor.index < b.partColor.index) return -1; - - if(a.partColor.index > b.partColor.index) return 1; - - return 0; - } - - public static noobSorter(a: AvatarEditorGridPartItem, b: AvatarEditorGridPartItem): number - { - const clubLevelA = (!a.partSet ? -1 : a.partSet.clubLevel); - const clubLevelB = (!b.partSet ? -1 : b.partSet.clubLevel); - const isSellableA = (!a.partSet ? false : a.partSet.isSellable); - const isSellableB = (!b.partSet ? false : b.partSet.isSellable); - - if(isSellableA && !isSellableB) return 1; - - if(isSellableB && !isSellableA) return -1; - - if(clubLevelA < clubLevelB) return -1; - - if(clubLevelA > clubLevelB) return 1; - - if(a.partSet.id < b.partSet.id) return -1; - - if(a.partSet.id > b.partSet.id) return 1; - - return 0; - } - - public static avatarSetFirstSelectableColor(name: string): number - { - const setType = GetAvatarRenderManager().structureData.getSetType(name); - - if(!setType) return -1; - - const palette = GetAvatarRenderManager().structureData.getPalette(setType.paletteID); - - if(!palette) return -1; - - for(const color of palette.colors.getValues()) - { - if(!color.isSelectable || (GetClubMemberLevel() < color.clubLevel)) continue; - - return color.id; - } - - return -1; - } - - public static get clubItemsFirst(): boolean - { - return GetConfigurationValue('avatareditor.show.clubitems.first', true); - } - - public static get clubItemsDimmed(): boolean - { - return GetConfigurationValue('avatareditor.show.clubitems.dimmed', true); - } -} diff --git a/src/api/avatar/BodyModel.ts b/src/api/avatar/BodyModel.ts deleted file mode 100644 index d2cf7e4..0000000 --- a/src/api/avatar/BodyModel.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { AvatarEditorFigureCategory, AvatarScaleType, AvatarSetType, GetAvatarRenderManager } from '@nitrots/nitro-renderer'; -import { AvatarEditorUtilities } from './AvatarEditorUtilities'; -import { CategoryBaseModel } from './CategoryBaseModel'; -import { FigureData } from './FigureData'; - -export class BodyModel extends CategoryBaseModel -{ - private _imageCallBackHandled: boolean = false; - - public init(): void - { - super.init(); - - this.addCategory(FigureData.FACE); - - this._isInitalized = true; - } - - public selectColor(category: string, colorIndex: number, paletteId: number): void - { - super.selectColor(category, colorIndex, paletteId); - - this.updateSelectionsFromFigure(FigureData.FACE); - } - - protected updateSelectionsFromFigure(name: string): void - { - if(!this._categories || !AvatarEditorUtilities.CURRENT_FIGURE) return; - - const category = this._categories.get(name); - - if(!category) return; - - const setId = AvatarEditorUtilities.CURRENT_FIGURE.getPartSetId(name); - - let colorIds = AvatarEditorUtilities.CURRENT_FIGURE.getColorIds(name); - - if(!colorIds) colorIds = []; - - category.selectPartId(setId); - category.selectColorIds(colorIds); - - for(const part of category.parts) - { - const resetFigure = (figure: string) => - { - const figureString = AvatarEditorUtilities.CURRENT_FIGURE.getFigureStringWithFace(part.id); - const avatarImage = GetAvatarRenderManager().createAvatarImage(figureString, AvatarScaleType.LARGE, null, { resetFigure, dispose: null, disposed: false }); - - const sprite = avatarImage.processAsContainer(AvatarSetType.HEAD); - - if(sprite) - { - sprite.y = 10; - - part.thumbContainer = sprite; - - setTimeout(() => avatarImage.dispose(), 0); - } - } - - resetFigure(null); - } - } - - public get canSetGender(): boolean - { - return true; - } - - public get name(): string - { - return AvatarEditorFigureCategory.GENERIC; - } -} diff --git a/src/api/avatar/CategoryBaseModel.ts b/src/api/avatar/CategoryBaseModel.ts deleted file mode 100644 index 34dd933..0000000 --- a/src/api/avatar/CategoryBaseModel.ts +++ /dev/null @@ -1,246 +0,0 @@ -import { AvatarEditorUtilities } from './AvatarEditorUtilities'; -import { CategoryData } from './CategoryData'; -import { IAvatarEditorCategoryModel } from './IAvatarEditorCategoryModel'; - -export class CategoryBaseModel implements IAvatarEditorCategoryModel -{ - protected _categories: Map; - protected _isInitalized: boolean; - protected _maxPaletteCount: number; - private _disposed: boolean; - - constructor() - { - this._isInitalized = false; - this._maxPaletteCount = 0; - } - - public dispose(): void - { - this._categories = null; - this._disposed = true; - } - - public get disposed(): boolean - { - return this._disposed; - } - - public init(): void - { - if(!this._categories) this._categories = new Map(); - } - - public reset(): void - { - this._isInitalized = false; - - if(this._categories) - { - for(const category of this._categories.values()) (category && category.dispose()); - } - - this._categories = new Map(); - } - - protected addCategory(name: string): void - { - let existing = this._categories.get(name); - - if(existing) return; - - existing = AvatarEditorUtilities.createCategory(this, name); - - if(!existing) return; - - this._categories.set(name, existing); - - this.updateSelectionsFromFigure(name); - } - - protected updateSelectionsFromFigure(figure: string): void - { - const category = this._categories.get(figure); - - if(!category) return; - - const setId = AvatarEditorUtilities.CURRENT_FIGURE.getPartSetId(figure); - - let colorIds = AvatarEditorUtilities.CURRENT_FIGURE.getColorIds(figure); - - if(!colorIds) colorIds = []; - - category.selectPartId(setId); - category.selectColorIds(colorIds); - } - - public hasClubSelectionsOverLevel(level: number): boolean - { - if(!this._categories) return false; - - for(const category of this._categories.values()) - { - if(!category) continue; - - if(category.hasClubSelectionsOverLevel(level)) return true; - } - - return false; - } - - public hasInvalidSelectedItems(ownedItems: number[]): boolean - { - if(!this._categories) return false; - - for(const category of this._categories.values()) - { - if(category.hasInvalidSelectedItems(ownedItems)) return true; - } - - return false; - } - - public stripClubItemsOverLevel(level: number): boolean - { - if(!this._categories) return false; - - let didStrip = false; - - for(const [ name, category ] of this._categories.entries()) - { - let isValid = false; - - if(category.stripClubItemsOverLevel(level)) isValid = true; - - if(category.stripClubColorsOverLevel(level)) isValid = true; - - if(isValid) - { - const partItem = category.getCurrentPart(); - - if(partItem && AvatarEditorUtilities.CURRENT_FIGURE) - { - AvatarEditorUtilities.CURRENT_FIGURE.savePartData(name, partItem.id, category.getSelectedColorIds(), true); - } - - didStrip = true; - } - } - - return didStrip; - } - - public stripInvalidSellableItems(): boolean - { - if(!this._categories) return false; - - let didStrip = false; - - for(const [ name, category ] of this._categories.entries()) - { - const isValid = false; - - // if(category._Str_8360(this._Str_2278.manager.inventory)) _local_6 = true; - - if(isValid) - { - const partItem = category.getCurrentPart(); - - if(partItem && AvatarEditorUtilities.CURRENT_FIGURE) - { - AvatarEditorUtilities.CURRENT_FIGURE.savePartData(name, partItem.id, category.getSelectedColorIds(), true); - } - - didStrip = true; - } - } - - return didStrip; - } - - public selectPart(category: string, partIndex: number): void - { - const categoryData = this._categories.get(category); - - if(!categoryData) return; - - const selectedPartIndex = categoryData.selectedPartIndex; - - categoryData.selectPartIndex(partIndex); - - const partItem = categoryData.getCurrentPart(); - - if(!partItem) return; - - if(partItem.isDisabled) - { - categoryData.selectPartIndex(selectedPartIndex); - - // open hc window - - return; - } - - this._maxPaletteCount = partItem.maxColorIndex; - - AvatarEditorUtilities.CURRENT_FIGURE.savePartData(category, partItem.id, categoryData.getSelectedColorIds(), true); - } - - public selectColor(category: string, colorIndex: number, paletteId: number): void - { - const categoryData = this._categories.get(category); - - if(!categoryData) return; - - const paletteIndex = categoryData.getCurrentColorIndex(paletteId); - - categoryData.selectColorIndex(colorIndex, paletteId); - - const colorItem = categoryData.getSelectedColor(paletteId); - - if(colorItem.isDisabled) - { - categoryData.selectColorIndex(paletteIndex, paletteId); - - // open hc window - - return; - } - - AvatarEditorUtilities.CURRENT_FIGURE.savePartSetColourId(category, categoryData.getSelectedColorIds(), true); - } - - public getCategoryData(category: string): CategoryData - { - if(!this._isInitalized) this.init(); - - if(!this._categories) return null; - - return this._categories.get(category); - } - - public get categories(): Map - { - return this._categories; - } - - public get canSetGender(): boolean - { - return false; - } - - public get maxPaletteCount(): number - { - return (this._maxPaletteCount || 1); - } - - public set maxPaletteCount(count: number) - { - this._maxPaletteCount = count; - } - - public get name(): string - { - return null; - } -} diff --git a/src/api/avatar/CategoryData.ts b/src/api/avatar/CategoryData.ts deleted file mode 100644 index db82f01..0000000 --- a/src/api/avatar/CategoryData.ts +++ /dev/null @@ -1,487 +0,0 @@ -import { IPartColor } from '@nitrots/nitro-renderer'; -import { AvatarEditorGridColorItem } from './AvatarEditorGridColorItem'; -import { AvatarEditorGridPartItem } from './AvatarEditorGridPartItem'; - -export class CategoryData -{ - private _name: string; - private _parts: AvatarEditorGridPartItem[]; - private _palettes: AvatarEditorGridColorItem[][]; - private _selectedPartIndex: number = -1; - private _paletteIndexes: number[]; - - constructor(name: string, partItems: AvatarEditorGridPartItem[], colorItems: AvatarEditorGridColorItem[][]) - { - this._name = name; - this._parts = partItems; - this._palettes = colorItems; - this._selectedPartIndex = -1; - } - - private static defaultColorId(palettes: AvatarEditorGridColorItem[], clubLevel: number): number - { - if(!palettes || !palettes.length) return -1; - - let i = 0; - - while(i < palettes.length) - { - const colorItem = palettes[i]; - - if(colorItem.partColor && (colorItem.partColor.clubLevel <= clubLevel)) - { - return colorItem.partColor.id; - } - - i++; - } - - return -1; - } - - public init(): void - { - for(const part of this._parts) - { - if(!part) continue; - - part.init(); - } - } - - public dispose(): void - { - if(this._parts) - { - for(const part of this._parts) part.dispose(); - - this._parts = null; - } - - if(this._palettes) - { - for(const palette of this._palettes) for(const colorItem of palette) colorItem.dispose(); - - this._palettes = null; - } - - this._selectedPartIndex = -1; - this._paletteIndexes = null; - } - - public selectPartId(partId: number): void - { - if(!this._parts) return; - - let i = 0; - - while(i < this._parts.length) - { - const partItem = this._parts[i]; - - if(partItem.id === partId) - { - this.selectPartIndex(i); - - return; - } - - i++; - } - } - - public selectColorIds(colorIds: number[]): void - { - if(!colorIds || !this._palettes) return; - - this._paletteIndexes = new Array(colorIds.length); - - let i = 0; - - while(i < this._palettes.length) - { - const palette = this.getPalette(i); - - if(palette) - { - let colorId = 0; - - if(colorIds.length > i) - { - colorId = colorIds[i]; - } - else - { - const colorItem = palette[0]; - - if(colorItem && colorItem.partColor) colorId = colorItem.partColor.id; - } - - let j = 0; - - while(j < palette.length) - { - const colorItem = palette[j]; - - if(colorItem.partColor.id === colorId) - { - this._paletteIndexes[i] = j; - - colorItem.isSelected = true; - } - else - { - colorItem.isSelected = false; - } - - j++; - } - } - - i++; - } - - this.updatePartColors(); - } - - public selectPartIndex(partIndex: number): AvatarEditorGridPartItem - { - if(!this._parts) return null; - - if((this._selectedPartIndex >= 0) && (this._parts.length > this._selectedPartIndex)) - { - const partItem = this._parts[this._selectedPartIndex]; - - if(partItem) partItem.isSelected = false; - } - - if(this._parts.length > partIndex) - { - const partItem = this._parts[partIndex]; - - if(partItem) - { - partItem.isSelected = true; - - this._selectedPartIndex = partIndex; - - return partItem; - } - } - - return null; - } - - public selectColorIndex(colorIndex: number, paletteId: number): AvatarEditorGridColorItem - { - const palette = this.getPalette(paletteId); - - if(!palette) return null; - - if(palette.length <= colorIndex) return null; - - this.deselectColorIndex(this._paletteIndexes[paletteId], paletteId); - - this._paletteIndexes[paletteId] = colorIndex; - - const colorItem = palette[colorIndex]; - - if(!colorItem) return null; - - colorItem.isSelected = true; - - this.updatePartColors(); - - return colorItem; - } - - public getCurrentColorIndex(k: number): number - { - return this._paletteIndexes[k]; - } - - private deselectColorIndex(colorIndex: number, paletteIndex: number): void - { - const palette = this.getPalette(paletteIndex); - - if(!palette) return; - - if(palette.length <= colorIndex) return; - - const colorItem = palette[colorIndex]; - - if(!colorItem) return; - - colorItem.isSelected = false; - } - - public getSelectedColorIds(): number[] - { - if(!this._paletteIndexes || !this._paletteIndexes.length) return null; - - if(!this._palettes || !this._palettes.length) return null; - - const palette = this._palettes[0]; - - if(!palette || (!palette.length)) return null; - - const colorItem = palette[0]; - - if(!colorItem || !colorItem.partColor) return null; - - const colorId = colorItem.partColor.id; - const colorIds: number[] = []; - - let i = 0; - - while(i < this._paletteIndexes.length) - { - const paletteSet = this._palettes[i]; - - if(!((!(paletteSet)) || (paletteSet.length <= i))) - { - if(paletteSet.length > this._paletteIndexes[i]) - { - const color = paletteSet[this._paletteIndexes[i]]; - - if(color && color.partColor) - { - colorIds.push(color.partColor.id); - } - else - { - colorIds.push(colorId); - } - } - else - { - colorIds.push(colorId); - } - } - - i++; - } - - const partItem = this.getCurrentPart(); - - if(!partItem) return null; - - return colorIds.slice(0, Math.max(partItem.maxColorIndex, 1)); - } - - private getSelectedColors(): IPartColor[] - { - const partColors: IPartColor[] = []; - - let i = 0; - - while(i < this._paletteIndexes.length) - { - const colorItem = this.getSelectedColor(i); - - if(colorItem) - { - partColors.push(colorItem.partColor); - } - else - { - partColors.push(null); - } - - i++; - } - - return partColors; - } - - public getSelectedColor(paletteId: number): AvatarEditorGridColorItem - { - const palette = this.getPalette(paletteId); - - if(!palette || (palette.length <= this._paletteIndexes[paletteId])) return null; - - return palette[this._paletteIndexes[paletteId]]; - } - - public getSelectedColorId(paletteId: number): number - { - const colorItem = this.getSelectedColor(paletteId); - - if(colorItem && (colorItem.partColor)) return colorItem.partColor.id; - - return 0; - } - - public getPalette(paletteId: number): AvatarEditorGridColorItem[] - { - if(!this._paletteIndexes || !this._palettes || (this._palettes.length <= paletteId)) - { - return null; - } - - return this._palettes[paletteId]; - } - - public getCurrentPart(): AvatarEditorGridPartItem - { - return this._parts[this._selectedPartIndex] as AvatarEditorGridPartItem; - } - - private updatePartColors(): void - { - const partColors = this.getSelectedColors(); - - for(const partItem of this._parts) - { - if(partItem) partItem.partColors = partColors; - } - } - - public hasClubSelectionsOverLevel(level: number): boolean - { - let hasInvalidSelections = false; - - const partColors = this.getSelectedColors(); - - if(partColors) - { - let i = 0; - - while(i < partColors.length) - { - const partColor = partColors[i]; - - if(partColor && (partColor.clubLevel > level)) hasInvalidSelections = true; - - i++; - } - } - - const partItem = this.getCurrentPart(); - - if(partItem && partItem.partSet) - { - const partSet = partItem.partSet; - - if(partSet && (partSet.clubLevel > level)) hasInvalidSelections = true; - } - - return hasInvalidSelections; - } - - public hasInvalidSelectedItems(ownedItems: number[]): boolean - { - const part = this.getCurrentPart(); - - if(!part) return false; - - const partSet = part.partSet; - - if(!partSet || !partSet.isSellable) return; - - return (ownedItems.indexOf(partSet.id) > -1); - } - - public stripClubItemsOverLevel(level: number): boolean - { - const partItem = this.getCurrentPart(); - - if(partItem && partItem.partSet) - { - const partSet = partItem.partSet; - - if(partSet.clubLevel > level) - { - const newPartItem = this.selectPartIndex(0); - - if(newPartItem && !newPartItem.partSet) this.selectPartIndex(1); - - return true; - } - } - - return false; - } - - public stripClubColorsOverLevel(level: number): boolean - { - const colorIds: number[] = []; - const partColors = this.getSelectedColors(); - const colorItems = this.getPalette(0); - - let didStrip = false; - - const colorId = CategoryData.defaultColorId(colorItems, level); - - if(colorId === -1) return false; - - let i = 0; - - while(i < partColors.length) - { - const partColor = partColors[i]; - - if(!partColor) - { - colorIds.push(colorId); - - didStrip = true; - } - else - { - if(partColor.clubLevel > level) - { - colorIds.push(colorId); - - didStrip = true; - } - else - { - colorIds.push(partColor.id); - } - } - - i++; - } - - if(didStrip) this.selectColorIds(colorIds); - - return didStrip; - } - - // public stripInvalidSellableItems(k:IHabboInventory): boolean - // { - // var _local_3:IFigurePartSet; - // var _local_4:AvatarEditorGridPartItem; - // var _local_2:AvatarEditorGridPartItem = this._Str_6315(); - // if (((_local_2) && (_local_2.partSet))) - // { - // _local_3 = _local_2.partSet; - // if (((_local_3.isSellable) && (!(k._Str_14439(_local_3.id))))) - // { - // _local_4 = this._Str_8066(0); - // if (((!(_local_4 == null)) && (_local_4.partSet == null))) - // { - // this._Str_8066(1); - // } - // return true; - // } - // } - // return false; - // } - - public get name(): string - { - return this._name; - } - - public get parts(): AvatarEditorGridPartItem[] - { - return this._parts; - } - - public get selectedPartIndex(): number - { - return this._selectedPartIndex; - } -} diff --git a/src/api/avatar/FigureData.ts b/src/api/avatar/FigureData.ts deleted file mode 100644 index 78014d1..0000000 --- a/src/api/avatar/FigureData.ts +++ /dev/null @@ -1,287 +0,0 @@ -import { AvatarEditorUtilities } from './AvatarEditorUtilities'; - -export class FigureData -{ - private static DEFAULT_DIRECTION: number = 4; - - public static MALE: string = 'M'; - public static FEMALE: string = 'F'; - public static UNISEX: string = 'U'; - public static SCALE: string = 'h'; - public static STD: string = 'std'; - public static DEFAULT_FRAME: string = '0'; - public static FACE: string = 'hd'; - public static HAIR: string = 'hr'; - public static HAT: string = 'ha'; - public static HEAD_ACCESSORIES: string = 'he'; - public static EYE_ACCESSORIES: string = 'ea'; - public static FACE_ACCESSORIES: string = 'fa'; - public static JACKET: string = 'cc'; - public static SHIRT: string = 'ch'; - public static CHEST_ACCESSORIES: string = 'ca'; - public static CHEST_PRINTS: string = 'cp'; - public static TROUSERS: string = 'lg'; - public static SHOES: string = 'sh'; - public static TROUSER_ACCESSORIES: string = 'wa'; - public static SET_TYPES = [ FigureData.FACE, FigureData.HAIR, FigureData.HAT, FigureData.HEAD_ACCESSORIES, FigureData.EYE_ACCESSORIES, FigureData.FACE_ACCESSORIES, FigureData.JACKET, FigureData.SHIRT, FigureData.CHEST_ACCESSORIES, FigureData.CHEST_PRINTS, FigureData.TROUSERS, FigureData.SHOES, FigureData.TROUSERS ]; - - private _data: Map; - private _colors: Map; - private _gender: string = 'M'; - private _direction: number = FigureData.DEFAULT_DIRECTION; - private _avatarEffectType: number = -1; - private _notifier: () => void = null; - - public loadAvatarData(figureString: string, gender: string): void - { - this._data = new Map(); - this._colors = new Map(); - this._gender = gender; - - this.parseFigureString(figureString); - this.updateView(); - } - - private parseFigureString(figure: string): void - { - if(!figure) return; - - const sets = figure.split('.'); - - if(!sets || !sets.length) return; - - for(const set of sets) - { - const parts = set.split('-'); - - if(!parts.length) continue; - - const setType = parts[0]; - const setId = parseInt(parts[1]); - const colorIds: number[] = []; - - let offset = 2; - - while(offset < parts.length) - { - colorIds.push(parseInt(parts[offset])); - - offset++; - } - - if(!colorIds.length) colorIds.push(0); - - this.savePartSetId(setType, setId, false); - this.savePartSetColourId(setType, colorIds, false); - } - } - - public getPartSetId(setType: string): number - { - const existing = this._data.get(setType); - - if(existing !== undefined) return existing; - - return -1; - } - - public getColorIds(setType: string): number[] - { - const existing = this._colors.get(setType); - - if(existing !== undefined) return existing; - - return [ AvatarEditorUtilities.avatarSetFirstSelectableColor(setType) ]; - } - - public getFigureString(): string - { - let figureString = ''; - const setParts: string[] = []; - - for(const [ setType, setId ] of this._data.entries()) - { - const colorIds = this._colors.get(setType); - - let setPart = ((setType + '-') + setId); - - if(colorIds && colorIds.length) - { - let i = 0; - - while(i < colorIds.length) - { - setPart = (setPart + ('-' + colorIds[i])); - - i++; - } - } - - setParts.push(setPart); - } - - let i = 0; - - while(i < setParts.length) - { - figureString = (figureString + setParts[i]); - - if(i < (setParts.length - 1)) figureString = (figureString + '.'); - - i++; - } - - return figureString; - } - - public savePartData(setType: string, partId: number, colorIds: number[], update: boolean = false): void - { - this.savePartSetId(setType, partId, update); - this.savePartSetColourId(setType, colorIds, update); - } - - private savePartSetId(setType: string, partId: number, update: boolean = true): void - { - switch(setType) - { - case FigureData.FACE: - case FigureData.HAIR: - case FigureData.HAT: - case FigureData.HEAD_ACCESSORIES: - case FigureData.EYE_ACCESSORIES: - case FigureData.FACE_ACCESSORIES: - case FigureData.SHIRT: - case FigureData.JACKET: - case FigureData.CHEST_ACCESSORIES: - case FigureData.CHEST_PRINTS: - case FigureData.TROUSERS: - case FigureData.SHOES: - case FigureData.TROUSER_ACCESSORIES: - if(partId >= 0) - { - this._data.set(setType, partId); - } - else - { - this._data.delete(setType); - } - break; - } - - if(update) this.updateView(); - } - - public savePartSetColourId(setType: string, colorIds: number[], update: boolean = true): void - { - switch(setType) - { - case FigureData.FACE: - case FigureData.HAIR: - case FigureData.HAT: - case FigureData.HEAD_ACCESSORIES: - case FigureData.EYE_ACCESSORIES: - case FigureData.FACE_ACCESSORIES: - case FigureData.SHIRT: - case FigureData.JACKET: - case FigureData.CHEST_ACCESSORIES: - case FigureData.CHEST_PRINTS: - case FigureData.TROUSERS: - case FigureData.SHOES: - case FigureData.TROUSER_ACCESSORIES: - this._colors.set(setType, colorIds); - break; - } - - if(update) this.updateView(); - } - - public getFigureStringWithFace(k: number, override = true): string - { - let figureString = ''; - - const setTypes: string[] = [ FigureData.FACE ]; - const figureSets: string[] = []; - - for(const setType of setTypes) - { - const colors = this._colors.get(setType); - - if(!colors) continue; - - let setId = this._data.get(setType); - - if((setType === FigureData.FACE) && override) setId = k; - - let figureSet = ((setType + '-') + setId); - - if(setId >= 0) - { - let i = 0; - - while(i < colors.length) - { - figureSet = (figureSet + ('-' + colors[i])); - - i++; - } - } - - figureSets.push(figureSet); - } - - let i = 0; - - while(i < figureSets.length) - { - figureString = (figureString + figureSets[i]); - - if(i < (figureSets.length - 1)) figureString = (figureString + '.'); - - i++; - } - - return figureString; - } - - public updateView(): void - { - if(this.notify) this.notify(); - } - - public get gender(): string - { - return this._gender; - } - - public get direction(): number - { - return this._direction; - } - - public set direction(direction: number) - { - this._direction = direction; - - this.updateView(); - } - - public set avatarEffectType(k: number) - { - this._avatarEffectType = k; - } - - public get avatarEffectType(): number - { - return this._avatarEffectType; - } - - public get notify(): () => void - { - return this._notifier; - } - - public set notify(notifier: () => void) - { - this._notifier = notifier; - } -} diff --git a/src/api/avatar/FigureGenerator.ts b/src/api/avatar/FigureGenerator.ts deleted file mode 100644 index 6fc0093..0000000 --- a/src/api/avatar/FigureGenerator.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { AvatarFigureContainer, GetAvatarRenderManager, IFigurePartSet, IPalette, IPartColor, SetType } from '@nitrots/nitro-renderer'; -import { Randomizer } from '../utils'; -import { FigureData } from './FigureData'; - -function getTotalColors(partSet: IFigurePartSet): number -{ - const parts = partSet.parts; - - let totalColors = 0; - - for(const part of parts) totalColors = Math.max(totalColors, part.colorLayerIndex); - - return totalColors; -} - -function getRandomSetTypes(requiredSets: string[], options: string[]): string[] -{ - options = options.filter(option => (requiredSets.indexOf(option) === -1)); - - return [ ...requiredSets, ...Randomizer.getRandomElements(options, (Randomizer.getRandomNumber(options.length) + 1)) ]; -} - -function getRandomPartSet(setType: SetType, gender: string, clubLevel: number = 0, figureSetIds: number[] = []): IFigurePartSet -{ - if(!setType) return null; - - const options = setType.partSets.getValues().filter(option => - { - if(!option.isSelectable || ((option.gender !== 'U') && (option.gender !== gender)) || (option.clubLevel > clubLevel) || (option.isSellable && (figureSetIds.indexOf(option.id) === -1))) return null; - - return option; - }); - - if(!options || !options.length) return null; - - return Randomizer.getRandomElement(options); -} - -function getRandomColors(palette: IPalette, partSet: IFigurePartSet, clubLevel: number = 0): IPartColor[] -{ - if(!palette) return []; - - const options = palette.colors.getValues().filter(option => - { - if(!option.isSelectable || (option.clubLevel > clubLevel)) return null; - - return option; - }); - - if(!options || !options.length) return null; - - return Randomizer.getRandomElements(options, getTotalColors(partSet)); -} - -export function generateRandomFigure(figureData: FigureData, gender: string, clubLevel: number = 0, figureSetIds: number[] = [], ignoredSets: string[] = []): string -{ - const structure = GetAvatarRenderManager().structure; - const figureContainer = new AvatarFigureContainer(''); - const requiredSets = getRandomSetTypes(structure.getMandatorySetTypeIds(gender, clubLevel), FigureData.SET_TYPES); - - for(const setType of ignoredSets) - { - const partSetId = figureData.getPartSetId(setType); - const colors = figureData.getColorIds(setType); - - figureContainer.updatePart(setType, partSetId, colors); - } - - for(const type of requiredSets) - { - if(figureContainer.hasPartType(type)) continue; - - const setType = (structure.figureData.getSetType(type) as SetType); - const selectedSet = getRandomPartSet(setType, gender, clubLevel, figureSetIds); - - if(!selectedSet) continue; - - let selectedColors: number[] = []; - - if(selectedSet.isColorable) - { - selectedColors = getRandomColors(structure.figureData.getPalette(setType.paletteID), selectedSet, clubLevel).map(color => color.id); - } - - figureContainer.updatePart(setType.type, selectedSet.id, selectedColors); - } - - return figureContainer.getFigureString(); -} diff --git a/src/api/avatar/HeadModel.ts b/src/api/avatar/HeadModel.ts deleted file mode 100644 index 5dc30cd..0000000 --- a/src/api/avatar/HeadModel.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { AvatarEditorFigureCategory } from '@nitrots/nitro-renderer'; -import { CategoryBaseModel } from './CategoryBaseModel'; -import { FigureData } from './FigureData'; - -export class HeadModel extends CategoryBaseModel -{ - public init(): void - { - super.init(); - - this.addCategory(FigureData.HAIR); - this.addCategory(FigureData.HAT); - this.addCategory(FigureData.HEAD_ACCESSORIES); - this.addCategory(FigureData.EYE_ACCESSORIES); - this.addCategory(FigureData.FACE_ACCESSORIES); - - this._isInitalized = true; - } - - public get name(): string - { - return AvatarEditorFigureCategory.HEAD; - } -} diff --git a/src/api/avatar/IAvatarEditorCategory.ts b/src/api/avatar/IAvatarEditorCategory.ts deleted file mode 100644 index a7cfd51..0000000 --- a/src/api/avatar/IAvatarEditorCategory.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IPartColor } from '@nitrots/nitro-renderer'; -import { IAvatarEditorCategoryPartItem } from './IAvatarEditorCategoryPartItem'; - -export interface IAvatarEditorCategory -{ - setType: string; - partItems: IAvatarEditorCategoryPartItem[]; - colorItems: IPartColor[][]; -} diff --git a/src/api/avatar/IAvatarEditorCategoryModel.ts b/src/api/avatar/IAvatarEditorCategoryModel.ts deleted file mode 100644 index dc9affa..0000000 --- a/src/api/avatar/IAvatarEditorCategoryModel.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { CategoryData } from './CategoryData'; - -export interface IAvatarEditorCategoryModel -{ - init(): void; - dispose(): void; - reset(): void; - getCategoryData(category: string): CategoryData; - selectPart(category: string, partIndex: number): void; - selectColor(category: string, colorIndex: number, paletteId: number): void; - hasClubSelectionsOverLevel(level: number): boolean; - hasInvalidSelectedItems(ownedItems: number[]): boolean; - stripClubItemsOverLevel(level: number): boolean; - stripInvalidSellableItems(): boolean; - categories: Map; - canSetGender: boolean; - maxPaletteCount: number; - name: string; -} diff --git a/src/api/avatar/IAvatarEditorCategoryPartItem.ts b/src/api/avatar/IAvatarEditorCategoryPartItem.ts deleted file mode 100644 index d1cbc0d..0000000 --- a/src/api/avatar/IAvatarEditorCategoryPartItem.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { IFigurePartSet } from '@nitrots/nitro-renderer'; - -export interface IAvatarEditorCategoryPartItem -{ - id?: number; - partSet?: IFigurePartSet; - usesColor?: boolean; - maxPaletteCount?: number; - isClear?: boolean; -} diff --git a/src/api/avatar/LegModel.ts b/src/api/avatar/LegModel.ts deleted file mode 100644 index 5633930..0000000 --- a/src/api/avatar/LegModel.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AvatarEditorFigureCategory } from '@nitrots/nitro-renderer'; -import { CategoryBaseModel } from './CategoryBaseModel'; -import { FigureData } from './FigureData'; - -export class LegModel extends CategoryBaseModel -{ - public init(): void - { - super.init(); - - this.addCategory(FigureData.TROUSERS); - this.addCategory(FigureData.SHOES); - this.addCategory(FigureData.TROUSER_ACCESSORIES); - - this._isInitalized = true; - } - - public get name(): string - { - return AvatarEditorFigureCategory.LEGS; - } -} diff --git a/src/api/avatar/TorsoModel.ts b/src/api/avatar/TorsoModel.ts deleted file mode 100644 index 43e48cf..0000000 --- a/src/api/avatar/TorsoModel.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { AvatarEditorFigureCategory } from '@nitrots/nitro-renderer'; -import { CategoryBaseModel } from './CategoryBaseModel'; -import { FigureData } from './FigureData'; - -export class TorsoModel extends CategoryBaseModel -{ - public init(): void - { - super.init(); - - this.addCategory(FigureData.SHIRT); - this.addCategory(FigureData.CHEST_PRINTS); - this.addCategory(FigureData.JACKET); - this.addCategory(FigureData.CHEST_ACCESSORIES); - - this._isInitalized = true; - } - - public get name(): string - { - return AvatarEditorFigureCategory.TORSO; - } -} diff --git a/src/api/avatar/index.ts b/src/api/avatar/index.ts deleted file mode 100644 index acf945b..0000000 --- a/src/api/avatar/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -export * from './AvatarEditorAction'; -export * from './AvatarEditorGridColorItem'; -export * from './AvatarEditorGridPartItem'; -export * from './AvatarEditorThumbnailsHelper'; -export * from './AvatarEditorUtilities'; -export * from './BodyModel'; -export * from './CategoryBaseModel'; -export * from './CategoryData'; -export * from './FigureData'; -export * from './FigureGenerator'; -export * from './HeadModel'; -export * from './IAvatarEditorCategory'; -export * from './IAvatarEditorCategoryModel'; -export * from './IAvatarEditorCategoryPartItem'; -export * from './LegModel'; -export * from './TorsoModel'; diff --git a/src/api/camera/CameraEditorTabs.ts b/src/api/camera/CameraEditorTabs.ts deleted file mode 100644 index 6e894e7..0000000 --- a/src/api/camera/CameraEditorTabs.ts +++ /dev/null @@ -1,5 +0,0 @@ -export class CameraEditorTabs -{ - public static readonly COLORMATRIX: string = 'colormatrix'; - public static readonly COMPOSITE: string = 'composite'; -} diff --git a/src/api/camera/CameraPicture.ts b/src/api/camera/CameraPicture.ts deleted file mode 100644 index fe8c221..0000000 --- a/src/api/camera/CameraPicture.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { NitroTexture } from '@nitrots/nitro-renderer'; - -export class CameraPicture -{ - constructor( - public texture: NitroTexture, - public imageUrl: string) - {} -} diff --git a/src/api/camera/CameraPictureThumbnail.ts b/src/api/camera/CameraPictureThumbnail.ts deleted file mode 100644 index cd12660..0000000 --- a/src/api/camera/CameraPictureThumbnail.ts +++ /dev/null @@ -1,7 +0,0 @@ -export class CameraPictureThumbnail -{ - constructor( - public effectName: string, - public thumbnailUrl: string) - {} -} diff --git a/src/api/camera/index.ts b/src/api/camera/index.ts deleted file mode 100644 index 93c6ccb..0000000 --- a/src/api/camera/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './CameraEditorTabs'; -export * from './CameraPicture'; -export * from './CameraPictureThumbnail'; diff --git a/src/api/campaign/CalendarItem.ts b/src/api/campaign/CalendarItem.ts deleted file mode 100644 index d3634b3..0000000 --- a/src/api/campaign/CalendarItem.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { ICalendarItem } from './ICalendarItem'; - -export class CalendarItem implements ICalendarItem -{ - private _productName: string; - private _customImage: string; - private _furnitureClassName: string; - - constructor(productName: string, customImage: string, furnitureClassName: string) - { - this._productName = productName; - this._customImage = customImage; - this._furnitureClassName = furnitureClassName; - } - - public get productName(): string - { - return this._productName; - } - - public get customImage(): string - { - return this._customImage; - } - - public get furnitureClassName(): string - { - return this._furnitureClassName; - } -} diff --git a/src/api/campaign/CalendarItemState.ts b/src/api/campaign/CalendarItemState.ts deleted file mode 100644 index 1b91ca3..0000000 --- a/src/api/campaign/CalendarItemState.ts +++ /dev/null @@ -1,7 +0,0 @@ -export class CalendarItemState -{ - public static readonly STATE_UNLOCKED = 1; - public static readonly STATE_LOCKED_AVAILABLE = 2; - public static readonly STATE_LOCKED_EXPIRED = 3; - public static readonly STATE_LOCKED_FUTURE = 4; -} diff --git a/src/api/campaign/ICalendarItem.ts b/src/api/campaign/ICalendarItem.ts deleted file mode 100644 index 87dfbd6..0000000 --- a/src/api/campaign/ICalendarItem.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface ICalendarItem -{ - readonly productName: string; - readonly customImage: string; - readonly furnitureClassName: string; -} diff --git a/src/api/campaign/index.ts b/src/api/campaign/index.ts deleted file mode 100644 index a86e40c..0000000 --- a/src/api/campaign/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './CalendarItem'; -export * from './CalendarItemState'; -export * from './ICalendarItem'; diff --git a/src/api/catalog/BuilderFurniPlaceableStatus.ts b/src/api/catalog/BuilderFurniPlaceableStatus.ts deleted file mode 100644 index 40eb6f6..0000000 --- a/src/api/catalog/BuilderFurniPlaceableStatus.ts +++ /dev/null @@ -1,10 +0,0 @@ -export class BuilderFurniPlaceableStatus -{ - public static OKAY: number = 0; - public static MISSING_OFFER: number = 1; - public static FURNI_LIMIT_REACHED: number = 2; - public static NOT_IN_ROOM: number = 3; - public static NOT_ROOM_OWNER: number = 4; - public static GUILD_ROOM: number = 5; - public static VISITORS_IN_ROOM: number = 6; -} diff --git a/src/api/catalog/CatalogNode.ts b/src/api/catalog/CatalogNode.ts deleted file mode 100644 index 893aa32..0000000 --- a/src/api/catalog/CatalogNode.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { NodeData } from '@nitrots/nitro-renderer'; -import { ICatalogNode } from './ICatalogNode'; - -export class CatalogNode implements ICatalogNode -{ - private _depth: number = 0; - private _localization: string = ''; - private _pageId: number = -1; - private _pageName: string = ''; - private _iconId: number = 0; - private _children: ICatalogNode[]; - private _offerIds: number[]; - private _parent: ICatalogNode; - private _isVisible: boolean; - private _isActive: boolean; - private _isOpen: boolean; - - constructor(node: NodeData, depth: number, parent: ICatalogNode) - { - this._depth = depth; - this._parent = parent; - this._localization = node.localization; - this._pageId = node.pageId; - this._pageName = node.pageName; - this._iconId = node.icon; - this._children = []; - this._offerIds = node.offerIds; - this._isVisible = node.visible; - this._isActive = false; - this._isOpen = false; - } - - public activate(): void - { - this._isActive = true; - } - - public deactivate(): void - { - this._isActive = false; - } - - public open(): void - { - this._isOpen = true; - } - - public close(): void - { - this._isOpen = false; - } - - public addChild(child: ICatalogNode):void - { - if(!child) return; - - this._children.push(child); - } - - public get depth(): number - { - return this._depth; - } - - public get isBranch(): boolean - { - return (this._children.length > 0); - } - - public get isLeaf(): boolean - { - return (this._children.length === 0); - } - - public get localization(): string - { - return this._localization; - } - - public get pageId(): number - { - return this._pageId; - } - - public get pageName(): string - { - return this._pageName; - } - - public get iconId(): number - { - return this._iconId; - } - - public get children(): ICatalogNode[] - { - return this._children; - } - - public get offerIds(): number[] - { - return this._offerIds; - } - - public get parent(): ICatalogNode - { - return this._parent; - } - - public get isVisible(): boolean - { - return this._isVisible; - } - - public get isActive(): boolean - { - return this._isActive; - } - - public get isOpen(): boolean - { - return this._isOpen; - } -} diff --git a/src/api/catalog/CatalogPage.ts b/src/api/catalog/CatalogPage.ts deleted file mode 100644 index 1e80609..0000000 --- a/src/api/catalog/CatalogPage.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { ICatalogPage } from './ICatalogPage'; -import { IPageLocalization } from './IPageLocalization'; -import { IPurchasableOffer } from './IPurchasableOffer'; - -export class CatalogPage implements ICatalogPage -{ - public static MODE_NORMAL: number = 0; - - private _pageId: number; - private _layoutCode: string; - private _localization: IPageLocalization; - private _offers: IPurchasableOffer[]; - private _acceptSeasonCurrencyAsCredits: boolean; - private _mode: number; - - constructor(pageId: number, layoutCode: string, localization: IPageLocalization, offers: IPurchasableOffer[], acceptSeasonCurrencyAsCredits: boolean, mode: number = -1) - { - this._pageId = pageId; - this._layoutCode = layoutCode; - this._localization = localization; - this._offers = offers; - this._acceptSeasonCurrencyAsCredits = acceptSeasonCurrencyAsCredits; - - for(const offer of offers) (offer.page = this); - - if(mode === -1) this._mode = CatalogPage.MODE_NORMAL; - else this._mode = mode; - } - - public get pageId(): number - { - return this._pageId; - } - - public get layoutCode(): string - { - return this._layoutCode; - } - - public get localization(): IPageLocalization - { - return this._localization; - } - - public get offers(): IPurchasableOffer[] - { - return this._offers; - } - - public get acceptSeasonCurrencyAsCredits(): boolean - { - return this._acceptSeasonCurrencyAsCredits; - } - - public get mode(): number - { - return this._mode; - } -} diff --git a/src/api/catalog/CatalogPageName.ts b/src/api/catalog/CatalogPageName.ts deleted file mode 100644 index 8e4c7b6..0000000 --- a/src/api/catalog/CatalogPageName.ts +++ /dev/null @@ -1,26 +0,0 @@ -export class CatalogPageName -{ - public static DUCKET_INFO: string = 'ducket_info'; - public static CREDITS: string = 'credits'; - public static AVATAR_EFFECTS: string = 'avatar_effects'; - public static HC_MEMBERSHIP: string = 'hc_membership'; - public static CLUB_GIFTS: string = 'club_gifts'; - public static LIMITED_SOLD: string = 'limited_sold'; - public static PET_ACCESSORIES: string = 'pet_accessories'; - public static TRAX_SONGS: string = 'trax_songs'; - public static NEW_ADDITIONS: string = 'new_additions'; - public static QUEST_SHELL: string = 'quest_shell'; - public static QUEST_SNOWFLAKES: string = 'quest_snowflakes'; - public static VAL_QUESTS: string = 'val_quests'; - public static GUILD_CUSTOM_FURNI: string = 'guild_custom_furni'; - public static GIFT_SHOP: string = 'gift_shop'; - public static HORSE_STYLES: string = 'horse_styles'; - public static HORSE_SHOE: string = 'horse_shoe'; - public static SET_EASTER: string = 'set_easter'; - public static ECOTRON_TRANSFORM: string = 'ecotron_transform'; - public static LOYALTY_INFO: string = 'loyalty_info'; - public static ROOM_BUNDLES: string = 'room_bundles'; - public static ROOM_BUNDLES_MOBILE: string = 'room_bundles_mobile'; - public static HABBO_CLUB_DESKTOP: string = 'habbo_club_desktop'; - public static MOBILE_SUBSCRIPTIONS: string = 'mobile_subscriptions'; -} diff --git a/src/api/catalog/CatalogPetPalette.ts b/src/api/catalog/CatalogPetPalette.ts deleted file mode 100644 index d92c40d..0000000 --- a/src/api/catalog/CatalogPetPalette.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SellablePetPaletteData } from '@nitrots/nitro-renderer'; - -export class CatalogPetPalette -{ - constructor( - public readonly breed: string, - public readonly palettes: SellablePetPaletteData[] - ) - {} -} diff --git a/src/api/catalog/CatalogPurchaseState.ts b/src/api/catalog/CatalogPurchaseState.ts deleted file mode 100644 index b442f62..0000000 --- a/src/api/catalog/CatalogPurchaseState.ts +++ /dev/null @@ -1,10 +0,0 @@ -export class CatalogPurchaseState -{ - public static NONE = 0; - public static CONFIRM = 1; - public static PURCHASE = 2; - public static NO_CREDITS = 3; - public static NO_POINTS = 4; - public static SOLD_OUT = 5; - public static FAILED = 6; -} diff --git a/src/api/catalog/CatalogType.ts b/src/api/catalog/CatalogType.ts deleted file mode 100644 index 670ad6f..0000000 --- a/src/api/catalog/CatalogType.ts +++ /dev/null @@ -1,5 +0,0 @@ -export class CatalogType -{ - public static NORMAL: string = 'NORMAL'; - public static BUILDER: string = 'BUILDERS_CLUB'; -} diff --git a/src/api/catalog/CatalogUtilities.ts b/src/api/catalog/CatalogUtilities.ts deleted file mode 100644 index 7aff6a8..0000000 --- a/src/api/catalog/CatalogUtilities.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { GetRoomEngine, SellablePetPaletteData } from '@nitrots/nitro-renderer'; -import { ICatalogNode } from './ICatalogNode'; - -export const GetPixelEffectIcon = (id: number) => -{ - return ''; -} - -export const GetSubscriptionProductIcon = (id: number) => -{ - return ''; -} - -export const GetOfferNodes = (offerNodes: Map, offerId: number) => -{ - const nodes = offerNodes.get(offerId); - const allowedNodes: ICatalogNode[] = []; - - if(nodes && nodes.length) - { - for(const node of nodes) - { - if(!node.isVisible) continue; - - allowedNodes.push(node); - } - } - - return allowedNodes; -} - -export const FilterCatalogNode = (search: string, furniLines: string[], node: ICatalogNode, nodes: ICatalogNode[]) => -{ - if(node.isVisible && (node.pageId > 0)) - { - let nodeAdded = false; - - const hayStack = [ node.pageName, node.localization ].join(' ').toLowerCase().replace(/ /gi, ''); - - if(hayStack.indexOf(search) > -1) - { - nodes.push(node); - - nodeAdded = true; - } - - if(!nodeAdded) - { - for(const furniLine of furniLines) - { - if(hayStack.indexOf(furniLine) >= 0) - { - nodes.push(node); - - break; - } - } - } - } - - for(const child of node.children) FilterCatalogNode(search, furniLines, child, nodes); -} - -export function GetPetIndexFromLocalization(localization: string) -{ - if(!localization.length) return 0; - - let index = (localization.length - 1); - - while(index >= 0) - { - if(isNaN(parseInt(localization.charAt(index)))) break; - - index--; - } - - if(index > 0) return parseInt(localization.substring(index + 1)); - - return -1; -} - -export function GetPetAvailableColors(petIndex: number, palettes: SellablePetPaletteData[]): number[][] -{ - switch(petIndex) - { - case 0: - return [ [ 16743226 ], [ 16750435 ], [ 16764339 ], [ 0xF59500 ], [ 16498012 ], [ 16704690 ], [ 0xEDD400 ], [ 16115545 ], [ 16513201 ], [ 8694111 ], [ 11585939 ], [ 14413767 ], [ 6664599 ], [ 9553845 ], [ 12971486 ], [ 8358322 ], [ 10002885 ], [ 13292268 ], [ 10780600 ], [ 12623573 ], [ 14403561 ], [ 12418717 ], [ 14327229 ], [ 15517403 ], [ 14515069 ], [ 15764368 ], [ 16366271 ], [ 0xABABAB ], [ 0xD4D4D4 ], [ 0xFFFFFF ], [ 14256481 ], [ 14656129 ], [ 15848130 ], [ 14005087 ], [ 14337152 ], [ 15918540 ], [ 15118118 ], [ 15531929 ], [ 9764857 ], [ 11258085 ] ]; - case 1: - return [ [ 16743226 ], [ 16750435 ], [ 16764339 ], [ 0xF59500 ], [ 16498012 ], [ 16704690 ], [ 0xEDD400 ], [ 16115545 ], [ 16513201 ], [ 8694111 ], [ 11585939 ], [ 14413767 ], [ 6664599 ], [ 9553845 ], [ 12971486 ], [ 8358322 ], [ 10002885 ], [ 13292268 ], [ 10780600 ], [ 12623573 ], [ 14403561 ], [ 12418717 ], [ 14327229 ], [ 15517403 ], [ 14515069 ], [ 15764368 ], [ 16366271 ], [ 0xABABAB ], [ 0xD4D4D4 ], [ 0xFFFFFF ], [ 14256481 ], [ 14656129 ], [ 15848130 ], [ 14005087 ], [ 14337152 ], [ 15918540 ], [ 15118118 ], [ 15531929 ], [ 9764857 ], [ 11258085 ] ]; - case 2: - return [ [ 16579283 ], [ 15378351 ], [ 8830016 ], [ 15257125 ], [ 9340985 ], [ 8949607 ], [ 6198292 ], [ 8703620 ], [ 9889626 ], [ 8972045 ], [ 12161285 ], [ 13162269 ], [ 8620113 ], [ 12616503 ], [ 8628101 ], [ 0xD2FF00 ], [ 9764857 ] ]; - case 3: - return [ [ 0xFFFFFF ], [ 0xEEEEEE ], [ 0xDDDDDD ] ]; - case 4: - return [ [ 0xFFFFFF ], [ 16053490 ], [ 15464440 ], [ 16248792 ], [ 15396319 ], [ 15007487 ] ]; - case 5: - return [ [ 0xFFFFFF ], [ 0xEEEEEE ], [ 0xDDDDDD ] ]; - case 6: - return [ [ 0xFFFFFF ], [ 0xEEEEEE ], [ 0xDDDDDD ], [ 16767177 ], [ 16770205 ], [ 16751331 ] ]; - case 7: - return [ [ 0xCCCCCC ], [ 0xAEAEAE ], [ 16751331 ], [ 10149119 ], [ 16763290 ], [ 16743786 ] ]; - default: { - const colors: number[][] = []; - - for(const palette of palettes) - { - const petColorResult = GetRoomEngine().getPetColorResult(petIndex, palette.paletteId); - - if(!petColorResult) continue; - - if(petColorResult.primaryColor === petColorResult.secondaryColor) - { - colors.push([ petColorResult.primaryColor ]); - } - else - { - colors.push([ petColorResult.primaryColor, petColorResult.secondaryColor ]); - } - } - - return colors; - } - } -} diff --git a/src/api/catalog/FurnitureOffer.ts b/src/api/catalog/FurnitureOffer.ts deleted file mode 100644 index 367f247..0000000 --- a/src/api/catalog/FurnitureOffer.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { GetProductOfferComposer, IFurnitureData } from '@nitrots/nitro-renderer'; -import { GetProductDataForLocalization, SendMessageComposer } from '../nitro'; -import { ICatalogPage } from './ICatalogPage'; -import { IProduct } from './IProduct'; -import { IPurchasableOffer } from './IPurchasableOffer'; -import { Offer } from './Offer'; -import { Product } from './Product'; - -export class FurnitureOffer implements IPurchasableOffer -{ - private _furniData:IFurnitureData; - private _page: ICatalogPage; - private _product: IProduct; - - constructor(furniData: IFurnitureData) - { - this._furniData = furniData; - this._product = (new Product(this._furniData.type, this._furniData.id, this._furniData.customParams, 1, GetProductDataForLocalization(this._furniData.className), this._furniData) as IProduct); - } - - public activate(): void - { - SendMessageComposer(new GetProductOfferComposer((this._furniData.rentOfferId > -1) ? this._furniData.rentOfferId : this._furniData.purchaseOfferId)); - } - - public get offerId(): number - { - return (this.isRentOffer) ? this._furniData.rentOfferId : this._furniData.purchaseOfferId; - } - - public get priceInActivityPoints(): number - { - return 0; - } - - public get activityPointType(): number - { - return 0; - } - - public get priceInCredits(): number - { - return 0; - } - - public get page(): ICatalogPage - { - return this._page; - } - - public set page(page: ICatalogPage) - { - this._page = page; - } - - public get priceType(): string - { - return ''; - } - - public get product(): IProduct - { - return this._product; - } - - public get products(): IProduct[] - { - return [ this._product ]; - } - - public get localizationId(): string - { - return 'roomItem.name.' + this._furniData.id; - } - - public get bundlePurchaseAllowed(): boolean - { - return false; - } - - public get isRentOffer(): boolean - { - return (this._furniData.rentOfferId > -1); - } - - public get giftable(): boolean - { - return false; - } - - public get pricingModel(): string - { - return Offer.PRICING_MODEL_FURNITURE; - } - - public get clubLevel(): number - { - return 0; - } - - public get badgeCode(): string - { - return ''; - } - - public get localizationName(): string - { - return this._furniData.name; - } - - public get localizationDescription(): string - { - return this._furniData.description; - } - - public get isLazy(): boolean - { - return true; - } -} diff --git a/src/api/catalog/GetImageIconUrlForProduct.ts b/src/api/catalog/GetImageIconUrlForProduct.ts deleted file mode 100644 index 8c363e7..0000000 --- a/src/api/catalog/GetImageIconUrlForProduct.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { GetRoomEngine } from '@nitrots/nitro-renderer'; -import { ProductTypeEnum } from './ProductTypeEnum'; - -export const GetImageIconUrlForProduct = (productType: string, productClassId: number, extraData: string = null) => -{ - let imageUrl: string = null; - - switch(productType.toLocaleLowerCase()) - { - case ProductTypeEnum.FLOOR: - imageUrl = GetRoomEngine().getFurnitureFloorIconUrl(productClassId); - break; - case ProductTypeEnum.WALL: - imageUrl = GetRoomEngine().getFurnitureWallIconUrl(productClassId, extraData); - break; - } - - return imageUrl; -} diff --git a/src/api/catalog/GiftWrappingConfiguration.ts b/src/api/catalog/GiftWrappingConfiguration.ts deleted file mode 100644 index 9d29b8c..0000000 --- a/src/api/catalog/GiftWrappingConfiguration.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { GiftWrappingConfigurationParser } from '@nitrots/nitro-renderer'; - -export class GiftWrappingConfiguration -{ - private _isEnabled: boolean = false; - private _price: number = null; - private _stuffTypes: number[] = null; - private _boxTypes: number[] = null; - private _ribbonTypes: number[] = null; - private _defaultStuffTypes: number[] = null; - - constructor(parser: GiftWrappingConfigurationParser) - { - this._isEnabled = parser.isEnabled; - this._price = parser.price; - this._boxTypes = parser.boxTypes; - this._ribbonTypes = parser.ribbonTypes; - this._stuffTypes = parser.giftWrappers; - this._defaultStuffTypes = parser.giftFurnis; - } - - public get isEnabled(): boolean - { - return this._isEnabled; - } - - public get price(): number - { - return this._price; - } - - public get stuffTypes(): number[] - { - return this._stuffTypes; - } - - public get boxTypes(): number[] - { - return this._boxTypes; - } - - public get ribbonTypes(): number[] - { - return this._ribbonTypes; - } - - public get defaultStuffTypes(): number[] - { - return this._defaultStuffTypes; - } -} diff --git a/src/api/catalog/ICatalogNode.ts b/src/api/catalog/ICatalogNode.ts deleted file mode 100644 index c69f5a6..0000000 --- a/src/api/catalog/ICatalogNode.ts +++ /dev/null @@ -1,21 +0,0 @@ -export interface ICatalogNode -{ - activate(): void; - deactivate(): void; - open(): void; - close(): void; - addChild(node: ICatalogNode): void; - readonly depth: number; - readonly isBranch: boolean; - readonly isLeaf: boolean; - readonly localization: string; - readonly pageId: number; - readonly pageName: string; - readonly iconId: number; - readonly children: ICatalogNode[]; - readonly offerIds: number[]; - readonly parent: ICatalogNode; - readonly isVisible: boolean; - readonly isActive: boolean; - readonly isOpen: boolean; -} diff --git a/src/api/catalog/ICatalogOptions.ts b/src/api/catalog/ICatalogOptions.ts deleted file mode 100644 index 2035694..0000000 --- a/src/api/catalog/ICatalogOptions.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ClubGiftInfoParser, ClubOfferData, HabboGroupEntryData, MarketplaceConfigurationMessageParser } from '@nitrots/nitro-renderer'; -import { CatalogPetPalette } from './CatalogPetPalette'; -import { GiftWrappingConfiguration } from './GiftWrappingConfiguration'; - -export interface ICatalogOptions -{ - groups?: HabboGroupEntryData[]; - petPalettes?: CatalogPetPalette[]; - clubOffers?: ClubOfferData[]; - clubGifts?: ClubGiftInfoParser; - giftConfiguration?: GiftWrappingConfiguration; - marketplaceConfiguration?: MarketplaceConfigurationMessageParser; -} diff --git a/src/api/catalog/ICatalogPage.ts b/src/api/catalog/ICatalogPage.ts deleted file mode 100644 index ed11ba0..0000000 --- a/src/api/catalog/ICatalogPage.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { IPageLocalization } from './IPageLocalization'; -import { IPurchasableOffer } from './IPurchasableOffer'; - -export interface ICatalogPage -{ - readonly pageId: number; - readonly layoutCode: string; - readonly localization: IPageLocalization; - readonly offers: IPurchasableOffer[]; - readonly acceptSeasonCurrencyAsCredits: boolean; - readonly mode: number; -} diff --git a/src/api/catalog/IMarketplaceSearchOptions.ts b/src/api/catalog/IMarketplaceSearchOptions.ts deleted file mode 100644 index 9489ef0..0000000 --- a/src/api/catalog/IMarketplaceSearchOptions.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface IMarketplaceSearchOptions -{ - query: string; - type: number; - minPrice: number; - maxPrice: number; -} diff --git a/src/api/catalog/IPageLocalization.ts b/src/api/catalog/IPageLocalization.ts deleted file mode 100644 index ad652e1..0000000 --- a/src/api/catalog/IPageLocalization.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface IPageLocalization -{ - getText(index: number): string - getImage(index: number): string -} diff --git a/src/api/catalog/IProduct.ts b/src/api/catalog/IProduct.ts deleted file mode 100644 index 4a1a392..0000000 --- a/src/api/catalog/IProduct.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { IFurnitureData, IProductData } from '@nitrots/nitro-renderer'; -import { IPurchasableOffer } from './IPurchasableOffer'; - -export interface IProduct -{ - getIconUrl(offer?: IPurchasableOffer): string; - productType: string; - productClassId: number; - extraParam: string; - productCount: number; - productData: IProductData; - furnitureData: IFurnitureData; - isUniqueLimitedItem: boolean; - uniqueLimitedItemSeriesSize: number; - uniqueLimitedItemsLeft: number; -} diff --git a/src/api/catalog/IPurchasableOffer.ts b/src/api/catalog/IPurchasableOffer.ts deleted file mode 100644 index b182865..0000000 --- a/src/api/catalog/IPurchasableOffer.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ICatalogPage } from './ICatalogPage'; -import { IProduct } from './IProduct'; - -export interface IPurchasableOffer -{ - activate(): void; - clubLevel: number; - page: ICatalogPage; - offerId: number; - localizationId: string; - priceInCredits: number; - priceInActivityPoints: number; - activityPointType: number; - giftable: boolean; - product: IProduct; - pricingModel: string; - priceType: string; - bundlePurchaseAllowed: boolean; - isRentOffer: boolean; - badgeCode: string; - localizationName: string; - localizationDescription: string; - isLazy: boolean; - products: IProduct[]; -} diff --git a/src/api/catalog/IPurchaseOptions.ts b/src/api/catalog/IPurchaseOptions.ts deleted file mode 100644 index c9fab89..0000000 --- a/src/api/catalog/IPurchaseOptions.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IObjectData } from '@nitrots/nitro-renderer'; - -export interface IPurchaseOptions -{ - quantity?: number; - extraData?: string; - extraParamRequired?: boolean; - previewStuffData?: IObjectData; -} diff --git a/src/api/catalog/MarketplaceOfferState.ts b/src/api/catalog/MarketplaceOfferState.ts deleted file mode 100644 index 20c0e45..0000000 --- a/src/api/catalog/MarketplaceOfferState.ts +++ /dev/null @@ -1,7 +0,0 @@ -export class MarketPlaceOfferState -{ - public static readonly ONGOING = 1; - public static readonly ONGOING_OWN = 1; - public static readonly SOLD = 2; - public static readonly EXPIRED = 3; -} diff --git a/src/api/catalog/MarketplaceSearchType.ts b/src/api/catalog/MarketplaceSearchType.ts deleted file mode 100644 index ac7a701..0000000 --- a/src/api/catalog/MarketplaceSearchType.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class MarketplaceSearchType -{ - public static readonly BY_ACTIVITY = 1; - public static readonly BY_VALUE = 2; - public static readonly ADVANCED = 3; -} diff --git a/src/api/catalog/Offer.ts b/src/api/catalog/Offer.ts deleted file mode 100644 index c14d6ac..0000000 --- a/src/api/catalog/Offer.ts +++ /dev/null @@ -1,245 +0,0 @@ -import { GetFurnitureData, GetProductDataForLocalization, LocalizeText, ProductTypeEnum } from '..'; -import { ICatalogPage } from './ICatalogPage'; -import { IProduct } from './IProduct'; -import { IPurchasableOffer } from './IPurchasableOffer'; -import { Product } from './Product'; - -export class Offer implements IPurchasableOffer -{ - public static PRICING_MODEL_UNKNOWN: string = 'pricing_model_unknown'; - public static PRICING_MODEL_SINGLE: string = 'pricing_model_single'; - public static PRICING_MODEL_MULTI: string = 'pricing_model_multi'; - public static PRICING_MODEL_BUNDLE: string = 'pricing_model_bundle'; - public static PRICING_MODEL_FURNITURE: string = 'pricing_model_furniture'; - public static PRICE_TYPE_NONE: string = 'price_type_none'; - public static PRICE_TYPE_CREDITS: string = 'price_type_credits'; - public static PRICE_TYPE_ACTIVITYPOINTS: string = 'price_type_activitypoints'; - public static PRICE_TYPE_CREDITS_ACTIVITYPOINTS: string = 'price_type_credits_and_activitypoints'; - - private _pricingModel: string; - private _priceType: string; - private _offerId: number; - private _localizationId: string; - private _priceInCredits: number; - private _priceInActivityPoints: number; - private _activityPointType: number; - private _giftable: boolean; - private _isRentOffer: boolean; - private _page: ICatalogPage; - private _clubLevel: number = 0; - private _products: IProduct[]; - private _badgeCode: string; - private _bundlePurchaseAllowed: boolean = false; - - constructor(offerId: number, localizationId: string, isRentOffer: boolean, priceInCredits: number, priceInActivityPoints: number, activityPointType: number, giftable: boolean, clubLevel: number, products: IProduct[], bundlePurchaseAllowed: boolean) - { - this._offerId = offerId; - this._localizationId = localizationId; - this._isRentOffer = isRentOffer; - this._priceInCredits = priceInCredits; - this._priceInActivityPoints = priceInActivityPoints; - this._activityPointType = activityPointType; - this._giftable = giftable; - this._clubLevel = clubLevel; - this._products = products; - this._bundlePurchaseAllowed = bundlePurchaseAllowed; - - this.setPricingModelForProducts(); - this.setPricingType(); - - for(const product of products) - { - if(product.productType === ProductTypeEnum.BADGE) - { - this._badgeCode = product.extraParam; - - break; - } - } - } - - public activate(): void - { - - } - - public get clubLevel(): number - { - return this._clubLevel; - } - - public get page(): ICatalogPage - { - return this._page; - } - - public set page(k: ICatalogPage) - { - this._page = k; - } - - public get offerId(): number - { - return this._offerId; - } - - public get localizationId(): string - { - return this._localizationId; - } - - public get priceInCredits(): number - { - return this._priceInCredits; - } - - public get priceInActivityPoints(): number - { - return this._priceInActivityPoints; - } - - public get activityPointType(): number - { - return this._activityPointType; - } - - public get giftable(): boolean - { - return this._giftable; - } - - public get product(): IProduct - { - if(!this._products || !this._products.length) return null; - - if(this._products.length === 1) return this._products[0]; - - const products = Product.stripAddonProducts(this._products); - - if(products.length) return products[0]; - - return null; - } - - public get pricingModel(): string - { - return this._pricingModel; - } - - public get priceType(): string - { - return this._priceType; - } - - public get bundlePurchaseAllowed(): boolean - { - return this._bundlePurchaseAllowed; - } - - public get isRentOffer(): boolean - { - return this._isRentOffer; - } - - public get badgeCode(): string - { - return this._badgeCode; - } - - public get localizationName(): string - { - const productData = GetProductDataForLocalization(this._localizationId); - - if(productData) return productData.name; - - return LocalizeText(this._localizationId); - } - - public get localizationDescription(): string - { - const productData = GetProductDataForLocalization(this._localizationId); - - if(productData) return productData.description; - - return LocalizeText(this._localizationId); - } - - public get isLazy(): boolean - { - return false; - } - - public get products(): IProduct[] - { - return this._products; - } - - private setPricingModelForProducts(): void - { - const products = Product.stripAddonProducts(this._products); - - if(products.length === 1) - { - if(products[0].productCount === 1) - { - this._pricingModel = Offer.PRICING_MODEL_SINGLE; - } - else - { - this._pricingModel = Offer.PRICING_MODEL_MULTI; - } - } - - else if(products.length > 1) - { - this._pricingModel = Offer.PRICING_MODEL_BUNDLE; - } - - else - { - this._pricingModel = Offer.PRICING_MODEL_UNKNOWN; - } - } - - private setPricingType(): void - { - if((this._priceInCredits > 0) && (this._priceInActivityPoints > 0)) - { - this._priceType = Offer.PRICE_TYPE_CREDITS_ACTIVITYPOINTS; - } - - else if(this._priceInCredits > 0) - { - this._priceType = Offer.PRICE_TYPE_CREDITS; - } - - else if(this._priceInActivityPoints > 0) - { - this._priceType = Offer.PRICE_TYPE_ACTIVITYPOINTS; - } - - else - { - this._priceType = Offer.PRICE_TYPE_NONE; - } - } - - public clone(): IPurchasableOffer - { - const products: IProduct[] = []; - const productData = GetProductDataForLocalization(this.localizationId); - - for(const product of this._products) - { - const furnitureData = GetFurnitureData(product.productClassId, product.productType); - - products.push(new Product(product.productType, product.productClassId, product.extraParam, product.productCount, productData, furnitureData)); - } - - const offer = new Offer(this.offerId, this.localizationId, this.isRentOffer, this.priceInCredits, this.priceInActivityPoints, this.activityPointType, this.giftable, this.clubLevel, products, this.bundlePurchaseAllowed); - - offer.page = this.page; - - return offer; - } -} diff --git a/src/api/catalog/PageLocalization.ts b/src/api/catalog/PageLocalization.ts deleted file mode 100644 index d433923..0000000 --- a/src/api/catalog/PageLocalization.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { GetConfigurationValue } from '../nitro'; -import { IPageLocalization } from './IPageLocalization'; - -export class PageLocalization implements IPageLocalization -{ - private _images: string[]; - private _texts: string[] - - constructor(images: string[], texts: string[]) - { - this._images = images; - this._texts = texts; - } - - public getText(index: number): string - { - let message = (this._texts[index] || ''); - - if(message && message.length) message = message.replace(/\r\n|\r|\n/g, '
'); - - return message; - } - - public getImage(index: number): string - { - const imageName = (this._images[index] || ''); - - if(!imageName || !imageName.length) return null; - - let assetUrl = GetConfigurationValue('catalog.asset.image.url'); - - assetUrl = assetUrl.replace('%name%', imageName); - - return assetUrl; - } -} diff --git a/src/api/catalog/PlacedObjectPurchaseData.ts b/src/api/catalog/PlacedObjectPurchaseData.ts deleted file mode 100644 index 84bad8c..0000000 --- a/src/api/catalog/PlacedObjectPurchaseData.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { IFurnitureData, IProductData } from '@nitrots/nitro-renderer'; -import { IPurchasableOffer } from './IPurchasableOffer'; - -export class PlacedObjectPurchaseData -{ - constructor( - public readonly roomId: number, - public readonly objectId: number, - public readonly category: number, - public readonly wallLocation: string, - public readonly x: number, - public readonly y: number, - public readonly direction: number, - public readonly offer: IPurchasableOffer) - {} - - public get offerId(): number - { - return this.offer.offerId; - } - - public get productClassId(): number - { - return this.offer.product.productClassId; - } - - public get productData(): IProductData - { - return this.offer.product.productData; - } - - public get furniData(): IFurnitureData - { - return this.offer.product.furnitureData; - } - - public get extraParam(): string - { - return this.offer.product.extraParam; - } -} diff --git a/src/api/catalog/Product.ts b/src/api/catalog/Product.ts deleted file mode 100644 index 17d9340..0000000 --- a/src/api/catalog/Product.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { GetRoomEngine, GetSessionDataManager, IFurnitureData, IObjectData, IProductData } from '@nitrots/nitro-renderer'; -import { GetConfigurationValue } from '../nitro'; -import { GetPixelEffectIcon, GetSubscriptionProductIcon } from './CatalogUtilities'; -import { IProduct } from './IProduct'; -import { IPurchasableOffer } from './IPurchasableOffer'; -import { ProductTypeEnum } from './ProductTypeEnum'; - -export class Product implements IProduct -{ - public static EFFECT_CLASSID_NINJA_DISAPPEAR: number = 108; - - private _productType: string; - private _productClassId: number; - private _extraParam: string; - private _productCount: number; - private _productData: IProductData; - private _furnitureData: IFurnitureData; - private _isUniqueLimitedItem: boolean; - private _uniqueLimitedItemSeriesSize: number; - private _uniqueLimitedItemsLeft: number; - - constructor(productType: string, productClassId: number, extraParam: string, productCount: number, productData: IProductData, furnitureData: IFurnitureData, isUniqueLimitedItem: boolean = false, uniqueLimitedItemSeriesSize: number = 0, uniqueLimitedItemsLeft: number = 0) - { - this._productType = productType.toLowerCase(); - this._productClassId = productClassId; - this._extraParam = extraParam; - this._productCount = productCount; - this._productData = productData; - this._furnitureData = furnitureData; - this._isUniqueLimitedItem = isUniqueLimitedItem; - this._uniqueLimitedItemSeriesSize = uniqueLimitedItemSeriesSize; - this._uniqueLimitedItemsLeft = uniqueLimitedItemsLeft; - } - - public static stripAddonProducts(products: IProduct[]): IProduct[] - { - if(products.length === 1) return products; - - return products.filter(product => ((product.productType !== ProductTypeEnum.BADGE) && (product.productType !== ProductTypeEnum.EFFECT) && (product.productClassId !== Product.EFFECT_CLASSID_NINJA_DISAPPEAR))); - } - - public getIconUrl(offer: IPurchasableOffer = null, stuffData: IObjectData = null): string - { - switch(this._productType) - { - case ProductTypeEnum.FLOOR: - return GetRoomEngine().getFurnitureFloorIconUrl(this.productClassId); - case ProductTypeEnum.WALL: { - if(offer && this._furnitureData) - { - let iconName = ''; - - switch(this._furnitureData.className) - { - case 'floor': - iconName = [ 'th', this._furnitureData.className, offer.product.extraParam ].join('_'); - break; - case 'wallpaper': - iconName = [ 'th', 'wall', offer.product.extraParam ].join('_'); - break; - case 'landscape': - iconName = [ 'th', this._furnitureData.className, (offer.product.extraParam || '').replace('.', '_'), '001' ].join('_'); - break; - } - - if(iconName !== '') - { - const assetUrl = GetConfigurationValue('catalog.asset.url'); - - return `${ assetUrl }/${ iconName }.png`; - } - } - - return GetRoomEngine().getFurnitureWallIconUrl(this.productClassId, this._extraParam); - } - case ProductTypeEnum.EFFECT: - return GetPixelEffectIcon(this.productClassId); - case ProductTypeEnum.HABBO_CLUB: - return GetSubscriptionProductIcon(this.productClassId); - case ProductTypeEnum.BADGE: - return GetSessionDataManager().getBadgeUrl(this._extraParam); - case ProductTypeEnum.ROBOT: - return null; - } - - return null; - } - - public get productType(): string - { - return this._productType; - } - - public get productClassId(): number - { - return this._productClassId; - } - - public get extraParam(): string - { - return this._extraParam; - } - - public set extraParam(extraParam: string) - { - this._extraParam = extraParam; - } - - public get productCount(): number - { - return this._productCount; - } - - public get productData(): IProductData - { - return this._productData; - } - - public get furnitureData(): IFurnitureData - { - return this._furnitureData; - } - - public get isUniqueLimitedItem(): boolean - { - return this._isUniqueLimitedItem; - } - - public get uniqueLimitedItemSeriesSize(): number - { - return this._uniqueLimitedItemSeriesSize; - } - - public get uniqueLimitedItemsLeft(): number - { - return this._uniqueLimitedItemsLeft; - } - - public set uniqueLimitedItemsLeft(uniqueLimitedItemsLeft: number) - { - this._uniqueLimitedItemsLeft = uniqueLimitedItemsLeft; - } -} diff --git a/src/api/catalog/ProductTypeEnum.ts b/src/api/catalog/ProductTypeEnum.ts deleted file mode 100644 index f249081..0000000 --- a/src/api/catalog/ProductTypeEnum.ts +++ /dev/null @@ -1,11 +0,0 @@ -export class ProductTypeEnum -{ - public static WALL: string = 'i'; - public static FLOOR: string = 's'; - public static EFFECT: string = 'e'; - public static HABBO_CLUB: string = 'h'; - public static BADGE: string = 'b'; - public static GAME_TOKEN: string = 'GAME_TOKEN'; - public static PET: string = 'p'; - public static ROBOT: string = 'r'; -} diff --git a/src/api/catalog/RequestedPage.ts b/src/api/catalog/RequestedPage.ts deleted file mode 100644 index 8c22730..0000000 --- a/src/api/catalog/RequestedPage.ts +++ /dev/null @@ -1,63 +0,0 @@ -export class RequestedPage -{ - public static REQUEST_TYPE_NONE: number = 0; - public static REQUEST_TYPE_ID: number = 1; - public static REQUEST_TYPE_OFFER: number = 2; - public static REQUEST_TYPE_NAME: number = 3; - - private _requestType: number; - private _requestById: number; - private _requestedByOfferId: number; - private _requestByName: string; - - constructor() - { - this._requestType = RequestedPage.REQUEST_TYPE_NONE; - } - - public resetRequest():void - { - this._requestType = RequestedPage.REQUEST_TYPE_NONE; - this._requestById = -1; - this._requestedByOfferId = -1; - this._requestByName = null; - } - - public get requestType(): number - { - return this._requestType; - } - - public get requestById(): number - { - return this._requestById; - } - - public set requestById(id: number) - { - this._requestType = RequestedPage.REQUEST_TYPE_ID; - this._requestById = id; - } - - public get requestedByOfferId(): number - { - return this._requestedByOfferId; - } - - public set requestedByOfferId(offerId: number) - { - this._requestType = RequestedPage.REQUEST_TYPE_OFFER; - this._requestedByOfferId = offerId; - } - - public get requestByName(): string - { - return this._requestByName; - } - - public set requestByName(name: string) - { - this._requestType = RequestedPage.REQUEST_TYPE_NAME; - this._requestByName = name; - } -} diff --git a/src/api/catalog/SearchResult.ts b/src/api/catalog/SearchResult.ts deleted file mode 100644 index 419f3cf..0000000 --- a/src/api/catalog/SearchResult.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { ICatalogNode } from './ICatalogNode'; -import { IPurchasableOffer } from './IPurchasableOffer'; - -export class SearchResult -{ - constructor( - public readonly searchValue: string, - public readonly offers: IPurchasableOffer[], - public readonly filteredNodes: ICatalogNode[]) - {} -} diff --git a/src/api/catalog/index.ts b/src/api/catalog/index.ts deleted file mode 100644 index 6c5b9e2..0000000 --- a/src/api/catalog/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -export * from './BuilderFurniPlaceableStatus'; -export * from './CatalogNode'; -export * from './CatalogPage'; -export * from './CatalogPageName'; -export * from './CatalogPetPalette'; -export * from './CatalogPurchaseState'; -export * from './CatalogType'; -export * from './CatalogUtilities'; -export * from './FurnitureOffer'; -export * from './GetImageIconUrlForProduct'; -export * from './GiftWrappingConfiguration'; -export * from './ICatalogNode'; -export * from './ICatalogOptions'; -export * from './ICatalogPage'; -export * from './IMarketplaceSearchOptions'; -export * from './IPageLocalization'; -export * from './IProduct'; -export * from './IPurchasableOffer'; -export * from './IPurchaseOptions'; -export * from './MarketplaceOfferData'; -export * from './MarketplaceOfferState'; -export * from './MarketplaceSearchType'; -export * from './Offer'; -export * from './PageLocalization'; -export * from './PlacedObjectPurchaseData'; -export * from './Product'; -export * from './ProductTypeEnum'; -export * from './RequestedPage'; -export * from './SearchResult'; diff --git a/src/api/chat-history/ChatEntryType.ts b/src/api/chat-history/ChatEntryType.ts deleted file mode 100644 index 045f00c..0000000 --- a/src/api/chat-history/ChatEntryType.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class ChatEntryType -{ - public static TYPE_CHAT = 1; - public static TYPE_ROOM_INFO = 2; - public static TYPE_IM = 3; -} diff --git a/src/api/chat-history/ChatHistoryCurrentDate.ts b/src/api/chat-history/ChatHistoryCurrentDate.ts deleted file mode 100644 index 6947bca..0000000 --- a/src/api/chat-history/ChatHistoryCurrentDate.ts +++ /dev/null @@ -1,6 +0,0 @@ -export const ChatHistoryCurrentDate = () => -{ - const currentTime = new Date(); - - return `${ currentTime.getHours().toString().padStart(2, '0') }:${ currentTime.getMinutes().toString().padStart(2, '0') }`; -} diff --git a/src/api/chat-history/IChatEntry.ts b/src/api/chat-history/IChatEntry.ts deleted file mode 100644 index 1bf7a52..0000000 --- a/src/api/chat-history/IChatEntry.ts +++ /dev/null @@ -1,17 +0,0 @@ -export interface IChatEntry -{ - id: number; - webId: number; - entityId: number; - name: string; - look?: string; - message?: string; - entityType?: number; - style?: number; - chatType?: number; - imageUrl?: string; - color?: string; - roomId: number; - timestamp: string; - type: number; -} diff --git a/src/api/chat-history/IRoomHistoryEntry.ts b/src/api/chat-history/IRoomHistoryEntry.ts deleted file mode 100644 index 4986154..0000000 --- a/src/api/chat-history/IRoomHistoryEntry.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface IRoomHistoryEntry -{ - id: number; - name: string; -} diff --git a/src/api/chat-history/MessengerHistoryCurrentDate.ts b/src/api/chat-history/MessengerHistoryCurrentDate.ts deleted file mode 100644 index 3aeebc5..0000000 --- a/src/api/chat-history/MessengerHistoryCurrentDate.ts +++ /dev/null @@ -1,6 +0,0 @@ -export const MessengerHistoryCurrentDate = (secondsSinceNow: number = 0) => -{ - const currentTime = secondsSinceNow ? new Date(Date.now() - secondsSinceNow * 1000) : new Date(); - - return `${ currentTime.getHours().toString().padStart(2, '0') }:${ currentTime.getMinutes().toString().padStart(2, '0') }`; -} diff --git a/src/api/chat-history/index.ts b/src/api/chat-history/index.ts deleted file mode 100644 index a989374..0000000 --- a/src/api/chat-history/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './ChatEntryType'; -export * from './ChatHistoryCurrentDate'; -export * from './IChatEntry'; -export * from './IRoomHistoryEntry'; -export * from './MessengerHistoryCurrentDate'; diff --git a/src/api/events/DispatchEvent.ts b/src/api/events/DispatchEvent.ts deleted file mode 100644 index 79e2f5c..0000000 --- a/src/api/events/DispatchEvent.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { IEventDispatcher, NitroEvent } from '@nitrots/nitro-renderer'; - -export const DispatchEvent = (eventDispatcher: IEventDispatcher, event: NitroEvent) => eventDispatcher.dispatchEvent(event); diff --git a/src/api/events/DispatchMainEvent.ts b/src/api/events/DispatchMainEvent.ts deleted file mode 100644 index e316b30..0000000 --- a/src/api/events/DispatchMainEvent.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { GetEventDispatcher, NitroEvent } from '@nitrots/nitro-renderer'; -import { DispatchEvent } from './DispatchEvent'; - -export const DispatchMainEvent = (event: NitroEvent) => DispatchEvent(GetEventDispatcher(), event); diff --git a/src/api/events/DispatchUiEvent.ts b/src/api/events/DispatchUiEvent.ts deleted file mode 100644 index 5200bb4..0000000 --- a/src/api/events/DispatchUiEvent.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { DispatchEvent } from './DispatchEvent'; -import { UI_EVENT_DISPATCHER } from './UI_EVENT_DISPATCHER'; - -export const DispatchUiEvent = (event: NitroEvent) => DispatchEvent(UI_EVENT_DISPATCHER, event); diff --git a/src/api/events/UI_EVENT_DISPATCHER.ts b/src/api/events/UI_EVENT_DISPATCHER.ts deleted file mode 100644 index cb57311..0000000 --- a/src/api/events/UI_EVENT_DISPATCHER.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { EventDispatcher, IEventDispatcher } from '@nitrots/nitro-renderer'; - -export const UI_EVENT_DISPATCHER: IEventDispatcher = new EventDispatcher(); diff --git a/src/api/events/index.ts b/src/api/events/index.ts deleted file mode 100644 index b7c22ee..0000000 --- a/src/api/events/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './DispatchEvent'; -export * from './DispatchMainEvent'; -export * from './DispatchUiEvent'; -export * from './UI_EVENT_DISPATCHER'; diff --git a/src/api/friends/GetGroupChatData.ts b/src/api/friends/GetGroupChatData.ts deleted file mode 100644 index 75df962..0000000 --- a/src/api/friends/GetGroupChatData.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IGroupChatData } from './IGroupChatData'; - -export const GetGroupChatData = (extraData: string) => -{ - if(!extraData || !extraData.length) return null; - - const splitData = extraData.split('/'); - const username = splitData[0]; - const figure = splitData[1]; - const userId = parseInt(splitData[2]); - - return ({ username: username, figure: figure, userId: userId } as IGroupChatData); -} diff --git a/src/api/friends/IGroupChatData.ts b/src/api/friends/IGroupChatData.ts deleted file mode 100644 index 24a3f9c..0000000 --- a/src/api/friends/IGroupChatData.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface IGroupChatData -{ - username: string; - figure: string; - userId: number; -} diff --git a/src/api/friends/MessengerFriend.ts b/src/api/friends/MessengerFriend.ts deleted file mode 100644 index b5cfc88..0000000 --- a/src/api/friends/MessengerFriend.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { FriendParser } from '@nitrots/nitro-renderer'; - -export class MessengerFriend -{ - public static RELATIONSHIP_NONE: number = 0; - public static RELATIONSHIP_HEART: number = 1; - public static RELATIONSHIP_SMILE: number = 2; - public static RELATIONSHIP_BOBBA: number = 3; - - public id: number = -1; - public name: string = null; - public gender: number = 0; - public online: boolean = false; - public followingAllowed: boolean = false; - public figure: string = null; - public categoryId: number = 0; - public motto: string = null; - public realName: string = null; - public lastAccess: string = null; - public persistedMessageUser: boolean = false; - public vipMember: boolean = false; - public pocketHabboUser: boolean = false; - public relationshipStatus: number = -1; - public unread: number = 0; - - public populate(parser: FriendParser): void - { - this.id = parser.id; - this.name = parser.name; - this.gender = parser.gender; - this.online = parser.online; - this.followingAllowed = parser.followingAllowed; - this.figure = parser.figure; - this.categoryId = parser.categoryId; - this.motto = parser.motto; - this.realName = parser.realName; - this.lastAccess = parser.lastAccess; - this.persistedMessageUser = parser.persistedMessageUser; - this.vipMember = parser.vipMember; - this.pocketHabboUser = parser.pocketHabboUser; - this.relationshipStatus = parser.relationshipStatus; - } -} diff --git a/src/api/friends/MessengerGroupType.ts b/src/api/friends/MessengerGroupType.ts deleted file mode 100644 index d46a1b6..0000000 --- a/src/api/friends/MessengerGroupType.ts +++ /dev/null @@ -1,5 +0,0 @@ -export class MessengerGroupType -{ - public static readonly GROUP_CHAT = 0; - public static readonly PRIVATE_CHAT = 1; -} diff --git a/src/api/friends/MessengerIconState.ts b/src/api/friends/MessengerIconState.ts deleted file mode 100644 index 63f8c13..0000000 --- a/src/api/friends/MessengerIconState.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class MessengerIconState -{ - public static HIDDEN: number = 0; - public static SHOW: number = 1; - public static UNREAD: number = 2; -} diff --git a/src/api/friends/MessengerRequest.ts b/src/api/friends/MessengerRequest.ts deleted file mode 100644 index 89ceec5..0000000 --- a/src/api/friends/MessengerRequest.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { FriendRequestData } from '@nitrots/nitro-renderer'; - -export class MessengerRequest -{ - private _id: number; - private _name: string; - private _requesterUserId: number; - private _figureString: string; - - public populate(data: FriendRequestData): boolean - { - if(!data) return false; - - this._id = data.requestId; - this._name = data.requesterName; - this._figureString = data.figureString; - this._requesterUserId = data.requesterUserId; - - return true; - } - - public get id(): number - { - return this._id; - } - - public get name(): string - { - return this._name; - } - - public get requesterUserId(): number - { - return this._requesterUserId; - } - - public get figureString(): string - { - return this._figureString; - } -} diff --git a/src/api/friends/MessengerSettings.ts b/src/api/friends/MessengerSettings.ts deleted file mode 100644 index e0fc8c2..0000000 --- a/src/api/friends/MessengerSettings.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { FriendCategoryData } from '@nitrots/nitro-renderer'; - -export class MessengerSettings -{ - constructor( - public userFriendLimit: number = 0, - public normalFriendLimit: number = 0, - public extendedFriendLimit: number = 0, - public categories: FriendCategoryData[] = []) - {} -} diff --git a/src/api/friends/MessengerThread.ts b/src/api/friends/MessengerThread.ts deleted file mode 100644 index 405ea33..0000000 --- a/src/api/friends/MessengerThread.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { GetGroupChatData } from './GetGroupChatData'; -import { MessengerFriend } from './MessengerFriend'; -import { MessengerGroupType } from './MessengerGroupType'; -import { MessengerThreadChat } from './MessengerThreadChat'; -import { MessengerThreadChatGroup } from './MessengerThreadChatGroup'; - -export class MessengerThread -{ - public static MESSAGE_RECEIVED: string = 'MT_MESSAGE_RECEIVED'; - public static THREAD_ID: number = 0; - - private _threadId: number; - private _participant: MessengerFriend; - private _groups: MessengerThreadChatGroup[]; - private _lastUpdated: Date; - private _unreadCount: number; - - constructor(participant: MessengerFriend) - { - this._threadId = ++MessengerThread.THREAD_ID; - this._participant = participant; - this._groups = []; - this._lastUpdated = new Date(); - this._unreadCount = 0; - } - - public addMessage(senderId: number, message: string, secondsSinceSent: number = 0, extraData: string = null, type: number = 0): MessengerThreadChat - { - const isGroupChat = (senderId < 0 && extraData); - const userId = isGroupChat ? GetGroupChatData(extraData).userId : senderId; - - const group = this.getLastGroup(userId); - - if(!group) return; - - if(isGroupChat) group.type = MessengerGroupType.GROUP_CHAT; - - const chat = new MessengerThreadChat(senderId, message, secondsSinceSent, extraData, type); - - group.addChat(chat); - - this._lastUpdated = new Date(); - - this._unreadCount++; - - return chat; - } - - private getLastGroup(userId: number): MessengerThreadChatGroup - { - let group = this._groups[(this._groups.length - 1)]; - - if(group && (group.userId === userId)) return group; - - group = new MessengerThreadChatGroup(userId); - - this._groups.push(group); - - return group; - } - - public setRead(): void - { - this._unreadCount = 0; - } - - public get threadId(): number - { - return this._threadId; - } - - public get participant(): MessengerFriend - { - return this._participant; - } - - public get groups(): MessengerThreadChatGroup[] - { - return this._groups; - } - - public get lastUpdated(): Date - { - return this._lastUpdated; - } - - public get unreadCount(): number - { - return this._unreadCount; - } - - public get unread(): boolean - { - return (this._unreadCount > 0); - } -} diff --git a/src/api/friends/MessengerThreadChat.ts b/src/api/friends/MessengerThreadChat.ts deleted file mode 100644 index 2927fec..0000000 --- a/src/api/friends/MessengerThreadChat.ts +++ /dev/null @@ -1,54 +0,0 @@ -export class MessengerThreadChat -{ - public static CHAT: number = 0; - public static ROOM_INVITE: number = 1; - public static STATUS_NOTIFICATION: number = 2; - public static SECURITY_NOTIFICATION: number = 3; - - private _type: number; - private _senderId: number; - private _message: string; - private _secondsSinceSent: number; - private _extraData: string; - private _date: Date; - - constructor(senderId: number, message: string, secondsSinceSent: number = 0, extraData: string = null, type: number = 0) - { - this._type = type; - this._senderId = senderId; - this._message = message; - this._secondsSinceSent = secondsSinceSent; - this._extraData = extraData; - this._date = new Date(); - } - - public get type(): number - { - return this._type; - } - - public get senderId(): number - { - return this._senderId; - } - - public get message(): string - { - return this._message; - } - - public get secondsSinceSent(): number - { - return this._secondsSinceSent; - } - - public get extraData(): string - { - return this._extraData; - } - - public get date(): Date - { - return this._date; - } -} diff --git a/src/api/friends/MessengerThreadChatGroup.ts b/src/api/friends/MessengerThreadChatGroup.ts deleted file mode 100644 index 1668aed..0000000 --- a/src/api/friends/MessengerThreadChatGroup.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { MessengerGroupType } from './MessengerGroupType'; -import { MessengerThreadChat } from './MessengerThreadChat'; - -export class MessengerThreadChatGroup -{ - private _userId: number; - private _chats: MessengerThreadChat[]; - private _type: number; - - constructor(userId: number, type = MessengerGroupType.PRIVATE_CHAT) - { - this._userId = userId; - this._chats = []; - this._type = type; - } - - public addChat(message: MessengerThreadChat): void - { - this._chats.push(message); - } - - public get userId(): number - { - return this._userId; - } - - public get chats(): MessengerThreadChat[] - { - return this._chats; - } - - public get type(): number - { - return this._type; - } - - public set type(type: number) - { - this._type = type; - } -} diff --git a/src/api/friends/OpenMessengerChat.ts b/src/api/friends/OpenMessengerChat.ts deleted file mode 100644 index 6050f2f..0000000 --- a/src/api/friends/OpenMessengerChat.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { CreateLinkEvent } from '@nitrots/nitro-renderer'; - -export function OpenMessengerChat(friendId: number = 0): void -{ - if(friendId === 0) CreateLinkEvent('friends-messenger/toggle'); - else CreateLinkEvent(`friends-messenger/${ friendId }`); -} diff --git a/src/api/friends/index.ts b/src/api/friends/index.ts deleted file mode 100644 index ce1ed60..0000000 --- a/src/api/friends/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * from './GetGroupChatData'; -export * from './IGroupChatData'; -export * from './MessengerFriend'; -export * from './MessengerGroupType'; -export * from './MessengerIconState'; -export * from './MessengerRequest'; -export * from './MessengerSettings'; -export * from './MessengerThread'; -export * from './MessengerThreadChat'; -export * from './MessengerThreadChatGroup'; -export * from './OpenMessengerChat'; diff --git a/src/api/groups/GetGroupInformation.ts b/src/api/groups/GetGroupInformation.ts deleted file mode 100644 index 14fe326..0000000 --- a/src/api/groups/GetGroupInformation.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { GroupInformationComposer } from '@nitrots/nitro-renderer'; -import { SendMessageComposer } from '../nitro'; - -export function GetGroupInformation(groupId: number): void -{ - SendMessageComposer(new GroupInformationComposer(groupId, true)); -} diff --git a/src/api/groups/GetGroupManager.ts b/src/api/groups/GetGroupManager.ts deleted file mode 100644 index 2044a45..0000000 --- a/src/api/groups/GetGroupManager.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { CreateLinkEvent } from '@nitrots/nitro-renderer'; - -export function GetGroupManager(groupId: number): void -{ - CreateLinkEvent(`groups/manage/${ groupId }`); -} diff --git a/src/api/groups/GetGroupMembers.ts b/src/api/groups/GetGroupMembers.ts deleted file mode 100644 index 9e10b01..0000000 --- a/src/api/groups/GetGroupMembers.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { CreateLinkEvent } from '@nitrots/nitro-renderer'; - -export function GetGroupMembers(groupId: number, levelId?: number): void -{ - if(!levelId) CreateLinkEvent(`group-members/${ groupId }`); - else CreateLinkEvent(`group-members/${ groupId }/${ levelId }`); -} diff --git a/src/api/groups/GroupBadgePart.ts b/src/api/groups/GroupBadgePart.ts deleted file mode 100644 index 09c137c..0000000 --- a/src/api/groups/GroupBadgePart.ts +++ /dev/null @@ -1,30 +0,0 @@ -export class GroupBadgePart -{ - public static BASE: string = 'b'; - public static SYMBOL: string = 's'; - - public type: string; - public key: number; - public color: number; - public position: number; - - constructor(type: string, key?: number, color?: number, position?: number) - { - this.type = type; - this.key = key ? key : 0; - this.color = color ? color : 0; - this.position = position ? position : 4; - } - - public get code(): string - { - if((this.key === 0) && (this.type !== GroupBadgePart.BASE)) return null; - - return GroupBadgePart.getCode(this.type, this.key, this.color, this.position); - } - - public static getCode(type: string, key: number, color: number, position: number): string - { - return type + (key < 10 ? '0' : '') + key + (color < 10 ? '0' : '') + color + position; - } -} diff --git a/src/api/groups/GroupMembershipType.ts b/src/api/groups/GroupMembershipType.ts deleted file mode 100644 index 532c836..0000000 --- a/src/api/groups/GroupMembershipType.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class GroupMembershipType -{ - public static NOT_MEMBER: number = 0; - public static MEMBER: number = 1; - public static REQUEST_PENDING: number = 2; -} diff --git a/src/api/groups/GroupType.ts b/src/api/groups/GroupType.ts deleted file mode 100644 index 58ae72c..0000000 --- a/src/api/groups/GroupType.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class GroupType -{ - public static REGULAR: number = 0; - public static EXCLUSIVE: number = 1; - public static PRIVATE: number = 2; -} diff --git a/src/api/groups/IGroupCustomize.ts b/src/api/groups/IGroupCustomize.ts deleted file mode 100644 index 44fc4ff..0000000 --- a/src/api/groups/IGroupCustomize.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface IGroupCustomize -{ - badgeBases: { id: number, images: string[] }[]; - badgeSymbols: { id: number, images: string[] }[]; - badgePartColors: { id: number, color: string }[]; - groupColorsA: { id: number, color: string }[]; - groupColorsB: { id: number, color: string }[]; -} diff --git a/src/api/groups/IGroupData.ts b/src/api/groups/IGroupData.ts deleted file mode 100644 index bb65b49..0000000 --- a/src/api/groups/IGroupData.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { GroupBadgePart } from './GroupBadgePart'; - -export interface IGroupData -{ - groupId: number; - groupName: string; - groupDescription: string; - groupHomeroomId: number; - groupState: number; - groupCanMembersDecorate: boolean; - groupColors: number[]; - groupBadgeParts: GroupBadgePart[]; -} diff --git a/src/api/groups/ToggleFavoriteGroup.ts b/src/api/groups/ToggleFavoriteGroup.ts deleted file mode 100644 index 572e05d..0000000 --- a/src/api/groups/ToggleFavoriteGroup.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { GroupFavoriteComposer, GroupUnfavoriteComposer, HabboGroupEntryData } from '@nitrots/nitro-renderer'; -import { SendMessageComposer } from '../nitro'; - -export const ToggleFavoriteGroup = (group: HabboGroupEntryData) => -{ - SendMessageComposer(group.favourite ? new GroupUnfavoriteComposer(group.groupId) : new GroupFavoriteComposer(group.groupId)); -} diff --git a/src/api/groups/TryJoinGroup.ts b/src/api/groups/TryJoinGroup.ts deleted file mode 100644 index 63959bf..0000000 --- a/src/api/groups/TryJoinGroup.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { GroupJoinComposer } from '@nitrots/nitro-renderer'; -import { SendMessageComposer } from '../nitro'; - -export const TryJoinGroup = (groupId: number) => SendMessageComposer(new GroupJoinComposer(groupId)); diff --git a/src/api/groups/index.ts b/src/api/groups/index.ts deleted file mode 100644 index 4842948..0000000 --- a/src/api/groups/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export * from './GetGroupInformation'; -export * from './GetGroupManager'; -export * from './GetGroupMembers'; -export * from './GroupBadgePart'; -export * from './GroupMembershipType'; -export * from './GroupType'; -export * from './IGroupCustomize'; -export * from './IGroupData'; -export * from './ToggleFavoriteGroup'; -export * from './TryJoinGroup'; diff --git a/src/api/guide-tool/GuideSessionState.ts b/src/api/guide-tool/GuideSessionState.ts deleted file mode 100644 index c5e24f3..0000000 --- a/src/api/guide-tool/GuideSessionState.ts +++ /dev/null @@ -1,23 +0,0 @@ -export class GuideSessionState -{ - public static readonly NONE: string = 'NONE'; - public static readonly ERROR: string = 'ERROR'; - public static readonly REJECTED: string = 'REJECTED'; - public static readonly USER_CREATE: string = 'USER_CREATE'; - public static readonly USER_PENDING: string = 'USER_PENDING'; - public static readonly USER_ONGOING: string = 'USER_ONGOING'; - public static readonly USER_FEEDBACK: string = 'USER_FEEDBACK'; - public static readonly USER_NO_HELPERS: string = 'USER_NO_HELPERS'; - public static readonly USER_SOMETHING_WRONG: string = 'USER_SOMETHING_WRONG'; - public static readonly USER_THANKS: string = 'USER_THANKS'; - public static readonly USER_GUIDE_DISCONNECTED: string = 'USER_GUIDE_DISCONNECTED'; - public static readonly GUIDE_TOOL_MENU: string = 'GUIDE_TOOL_MENU'; - public static readonly GUIDE_ACCEPT: string = 'GUIDE_ACCEPT'; - public static readonly GUIDE_ONGOING: string = 'GUIDE_ONGOING'; - public static readonly GUIDE_CLOSED: string = 'GUIDE_CLOSED'; - public static readonly GUARDIAN_CHAT_REVIEW_ACCEPT: string = 'GUARDIAN_CHAT_REVIEW_ACCEPT'; - public static readonly GUARDIAN_CHAT_REVIEW_WAIT_FOR_VOTERS: string = 'GUARDIAN_CHAT_REVIEW_WAIT_FOR_VOTERS'; - public static readonly GUARDIAN_CHAT_REVIEW_VOTE: string = 'GUARDIAN_CHAT_REVIEW_VOTE'; - public static readonly GUARDIAN_CHAT_REVIEW_WAIT_FOR_RESULTS: string = 'GUARDIAN_CHAT_REVIEW_WAIT_FOR_RESULTS'; - public static readonly GUARDIAN_CHAT_REVIEW_RESULTS: string = 'GUARDIAN_CHAT_REVIEW_RESULTS'; -} diff --git a/src/api/guide-tool/GuideToolMessage.ts b/src/api/guide-tool/GuideToolMessage.ts deleted file mode 100644 index 3810726..0000000 --- a/src/api/guide-tool/GuideToolMessage.ts +++ /dev/null @@ -1,21 +0,0 @@ -export class GuideToolMessage -{ - private _message: string; - private _roomId: number; - - constructor(message: string, roomId?: number) - { - this._message = message; - this._roomId = roomId; - } - - public get message(): string - { - return this._message; - } - - public get roomId(): number - { - return this._roomId; - } -} diff --git a/src/api/guide-tool/GuideToolMessageGroup.ts b/src/api/guide-tool/GuideToolMessageGroup.ts deleted file mode 100644 index bf03c9b..0000000 --- a/src/api/guide-tool/GuideToolMessageGroup.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { GuideToolMessage } from './GuideToolMessage'; - -export class GuideToolMessageGroup -{ - private _userId: number; - private _messages: GuideToolMessage[]; - - constructor(userId: number) - { - this._userId = userId; - this._messages = []; - } - - public addChat(message: GuideToolMessage): void - { - this._messages.push(message); - } - - public get userId(): number - { - return this._userId; - } - - public get messages(): GuideToolMessage[] - { - return this._messages; - } -} diff --git a/src/api/guide-tool/index.ts b/src/api/guide-tool/index.ts deleted file mode 100644 index 1400adc..0000000 --- a/src/api/guide-tool/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './GuideSessionState'; -export * from './GuideToolMessage'; -export * from './GuideToolMessageGroup'; diff --git a/src/api/hc-center/ClubStatus.ts b/src/api/hc-center/ClubStatus.ts deleted file mode 100644 index 8200b14..0000000 --- a/src/api/hc-center/ClubStatus.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class ClubStatus -{ - public static ACTIVE: string = 'active'; - public static NONE: string = 'none'; - public static EXPIRED: string = 'expired'; -} diff --git a/src/api/hc-center/GetClubBadge.ts b/src/api/hc-center/GetClubBadge.ts deleted file mode 100644 index 6b779e0..0000000 --- a/src/api/hc-center/GetClubBadge.ts +++ /dev/null @@ -1,11 +0,0 @@ -const DEFAULT_BADGE: string = 'HC1'; -const BADGES: string[] = [ 'ACH_VipHC1', 'ACH_VipHC2', 'ACH_VipHC3', 'ACH_VipHC4', 'ACH_VipHC5', 'HC1', 'HC2', 'HC3', 'HC4', 'HC5' ]; - -export const GetClubBadge = (badgeCodes: string[]) => -{ - let badgeCode: string = null; - - BADGES.forEach(badge => ((badgeCodes.indexOf(badge) > -1) && (badgeCode = badge))); - - return (badgeCode || DEFAULT_BADGE); -} diff --git a/src/api/hc-center/index.ts b/src/api/hc-center/index.ts deleted file mode 100644 index cee8f69..0000000 --- a/src/api/hc-center/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './ClubStatus'; -export * from './GetClubBadge'; diff --git a/src/api/help/CallForHelpResult.ts b/src/api/help/CallForHelpResult.ts deleted file mode 100644 index 37e7ea1..0000000 --- a/src/api/help/CallForHelpResult.ts +++ /dev/null @@ -1,5 +0,0 @@ -export class CallForHelpResult -{ - public static readonly TOO_MANY_PENDING_CALLS_CODE = 1; - public static readonly HAS_ABUSIVE_CALL_CODE = 2; -} diff --git a/src/api/help/GetCloseReasonKey.ts b/src/api/help/GetCloseReasonKey.ts deleted file mode 100644 index 520d14f..0000000 --- a/src/api/help/GetCloseReasonKey.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const GetCloseReasonKey = (code: number) => -{ - if(code === 1) return 'useless'; - - if(code === 2) return 'abusive'; - - return 'resolved'; -} diff --git a/src/api/help/IHelpReport.ts b/src/api/help/IHelpReport.ts deleted file mode 100644 index 8611707..0000000 --- a/src/api/help/IHelpReport.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { IChatEntry } from '../chat-history'; - -export interface IHelpReport -{ - reportType: number; - reportedUserId: number; - reportedChats: IChatEntry[]; - cfhCategory: number; - cfhTopic: number; - roomId: number; - roomName: string; - groupId: number; - threadId: number; - messageId: number; - extraData: string; - roomObjectId: number; - message: string; - currentStep: number; -} diff --git a/src/api/help/IReportedUser.ts b/src/api/help/IReportedUser.ts deleted file mode 100644 index 90a3887..0000000 --- a/src/api/help/IReportedUser.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface IReportedUser -{ - id: number; - username: string; -} diff --git a/src/api/help/ReportState.ts b/src/api/help/ReportState.ts deleted file mode 100644 index ae3a3bd..0000000 --- a/src/api/help/ReportState.ts +++ /dev/null @@ -1,8 +0,0 @@ -export class ReportState -{ - public static readonly SELECT_USER = 0; - public static readonly SELECT_CHATS = 1; - public static readonly SELECT_TOPICS = 2; - public static readonly INPUT_REPORT_MESSAGE = 3; - public static readonly REPORT_SUMMARY = 4; -} diff --git a/src/api/help/ReportType.ts b/src/api/help/ReportType.ts deleted file mode 100644 index 24eb7ae..0000000 --- a/src/api/help/ReportType.ts +++ /dev/null @@ -1,11 +0,0 @@ -export class ReportType -{ - public static readonly EMERGENCY = 1; - public static readonly GUIDE = 2; - public static readonly IM = 3; - public static readonly ROOM = 4; - public static readonly BULLY = 6; - public static readonly THREAD = 7; - public static readonly MESSAGE = 8; - public static readonly PHOTO = 9; -} diff --git a/src/api/help/index.ts b/src/api/help/index.ts deleted file mode 100644 index 6fa2045..0000000 --- a/src/api/help/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './CallForHelpResult'; -export * from './GetCloseReasonKey'; -export * from './IHelpReport'; -export * from './IReportedUser'; -export * from './ReportState'; -export * from './ReportType'; diff --git a/src/api/index.ts b/src/api/index.ts deleted file mode 100644 index 7089277..0000000 --- a/src/api/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -export * from './GetRendererVersion'; -export * from './GetUIVersion'; -export * from './achievements'; -export * from './avatar'; -export * from './camera'; -export * from './campaign'; -export * from './catalog'; -export * from './chat-history'; -export * from './events'; -export * from './friends'; -export * from './groups'; -export * from './guide-tool'; -export * from './hc-center'; -export * from './help'; -export * from './inventory'; -export * from './mod-tools'; -export * from './navigator'; -export * from './nitro'; -export * from './nitro/room'; -export * from './nitro/session'; -export * from './notification'; -export * from './purse'; -export * from './room'; -export * from './room/events'; -export * from './room/widgets'; -export * from './user'; -export * from './utils'; -export * from './wired'; diff --git a/src/api/inventory/FurniCategory.ts b/src/api/inventory/FurniCategory.ts deleted file mode 100644 index 6528947..0000000 --- a/src/api/inventory/FurniCategory.ts +++ /dev/null @@ -1,26 +0,0 @@ -export class FurniCategory -{ - public static DEFAULT: number = 1; - public static WALL_PAPER: number = 2; - public static FLOOR: number = 3; - public static LANDSCAPE: number = 4; - public static POST_IT: number = 5; - public static POSTER: number = 6; - public static SOUND_SET: number = 7; - public static TRAX_SONG: number = 8; - public static PRESENT: number = 9; - public static ECOTRON_BOX: number = 10; - public static TROPHY: number = 11; - public static CREDIT_FURNI: number = 12; - public static PET_SHAMPOO: number = 13; - public static PET_CUSTOM_PART: number = 14; - public static PET_CUSTOM_PART_SHAMPOO: number = 15; - public static PET_SADDLE: number = 16; - public static GUILD_FURNI: number = 17; - public static GAME_FURNI: number = 18; - public static MONSTERPLANT_SEED: number = 19; - public static MONSTERPLANT_REVIVAL: number = 20; - public static MONSTERPLANT_REBREED: number = 21; - public static MONSTERPLANT_FERTILIZE: number = 22; - public static FIGURE_PURCHASABLE_SET: number = 23; -} diff --git a/src/api/inventory/FurnitureItem.ts b/src/api/inventory/FurnitureItem.ts deleted file mode 100644 index f5f2f0f..0000000 --- a/src/api/inventory/FurnitureItem.ts +++ /dev/null @@ -1,245 +0,0 @@ -import { GetTickerTime, IFurnitureItemData, IObjectData } from '@nitrots/nitro-renderer'; -import { IFurnitureItem } from './IFurnitureItem'; - -export class FurnitureItem implements IFurnitureItem -{ - private _expirationTimeStamp: number; - private _isWallItem: boolean; - private _songId: number; - private _locked: boolean; - private _id: number; - private _ref: number; - private _category: number; - private _type: number; - private _stuffData: IObjectData; - private _extra: number; - private _recyclable: boolean; - private _tradeable: boolean; - private _groupable: boolean; - private _sellable: boolean; - private _secondsToExpiration: number; - private _hasRentPeriodStarted: boolean; - private _creationDay: number; - private _creationMonth: number; - private _creationYear: number; - private _slotId: string; - private _isRented: boolean; - private _flatId: number; - - constructor(parser: IFurnitureItemData) - { - if(!parser) return; - - this._locked = false; - this._id = parser.itemId; - this._type = parser.spriteId; - this._ref = parser.ref; - this._category = parser.category; - this._groupable = ((parser.isGroupable) && (!(parser.rentable))); - this._tradeable = parser.tradable; - this._recyclable = parser.isRecycleable; - this._sellable = parser.sellable; - this._stuffData = parser.stuffData; - this._extra = parser.extra; - this._secondsToExpiration = parser.secondsToExpiration; - this._expirationTimeStamp = parser.expirationTimeStamp; - this._hasRentPeriodStarted = parser.hasRentPeriodStarted; - this._creationDay = parser.creationDay; - this._creationMonth = parser.creationMonth; - this._creationYear = parser.creationYear; - this._slotId = parser.slotId; - this._songId = parser.songId; - this._flatId = parser.flatId; - this._isRented = parser.rentable; - this._isWallItem = parser.isWallItem; - } - - public get rentable(): boolean - { - return this._isRented; - } - - public get id(): number - { - return this._id; - } - - public get ref(): number - { - return this._ref; - } - - public get category(): number - { - return this._category; - } - - public get type(): number - { - return this._type; - } - - public get stuffData(): IObjectData - { - return this._stuffData; - } - - public set stuffData(k: IObjectData) - { - this._stuffData = k; - } - - public get extra(): number - { - return this._extra; - } - - public get recyclable(): boolean - { - return this._recyclable; - } - - public get isTradable(): boolean - { - return this._tradeable; - } - - public get isGroupable(): boolean - { - return this._groupable; - } - - public get sellable(): boolean - { - return this._sellable; - } - - public get secondsToExpiration(): number - { - if(this._secondsToExpiration === -1) return -1; - - let time = -1; - - if(this._hasRentPeriodStarted) - { - time = (this._secondsToExpiration - ((GetTickerTime() - this._expirationTimeStamp) / 1000)); - - if(time < 0) time = 0; - } - else - { - time = this._secondsToExpiration; - } - - return time; - } - - public get creationDay(): number - { - return this._creationDay; - } - - public get creationMonth(): number - { - return this._creationMonth; - } - - public get creationYear(): number - { - return this._creationYear; - } - - public get slotId(): string - { - return this._slotId; - } - - public get songId(): number - { - return this._songId; - } - - public get locked(): boolean - { - return this._locked; - } - - public set locked(k: boolean) - { - this._locked = k; - } - - public get flatId(): number - { - return this._flatId; - } - - public get isWallItem(): boolean - { - return this._isWallItem; - } - - public get hasRentPeriodStarted(): boolean - { - return this._hasRentPeriodStarted; - } - - public get expirationTimeStamp(): number - { - return this._expirationTimeStamp; - } - - public update(parser: IFurnitureItemData): void - { - this._type = parser.spriteId; - this._ref = parser.ref; - this._category = parser.category; - this._groupable = (parser.isGroupable && !parser.rentable); - this._tradeable = parser.tradable; - this._recyclable = parser.isRecycleable; - this._sellable = parser.sellable; - this._stuffData = parser.stuffData; - this._extra = parser.extra; - this._secondsToExpiration = parser.secondsToExpiration; - this._expirationTimeStamp = parser.expirationTimeStamp; - this._hasRentPeriodStarted = parser.hasRentPeriodStarted; - this._creationDay = parser.creationDay; - this._creationMonth = parser.creationMonth; - this._creationYear = parser.creationYear; - this._slotId = parser.slotId; - this._songId = parser.songId; - this._flatId = parser.flatId; - this._isRented = parser.rentable; - this._isWallItem = parser.isWallItem; - } - - public clone(): FurnitureItem - { - const item = new FurnitureItem(null); - - item._expirationTimeStamp = this._expirationTimeStamp; - item._isWallItem = this._isWallItem; - item._songId = this._songId; - item._locked = this._locked; - item._id = this._id; - item._ref = this._ref; - item._category = this._category; - item._type = this._type; - item._stuffData = this._stuffData; - item._extra = this._extra; - item._recyclable = this._recyclable; - item._tradeable = this._tradeable; - item._groupable = this._groupable; - item._sellable = this._sellable; - item._secondsToExpiration = this._secondsToExpiration; - item._hasRentPeriodStarted = this._hasRentPeriodStarted; - item._creationDay = this._creationDay; - item._creationMonth = this._creationMonth; - item._creationYear = this._creationYear; - item._slotId = this._slotId; - item._isRented = this._isRented; - item._flatId = this._flatId; - - return item; - } -} diff --git a/src/api/inventory/FurnitureUtilities.ts b/src/api/inventory/FurnitureUtilities.ts deleted file mode 100644 index 1c12803..0000000 --- a/src/api/inventory/FurnitureUtilities.ts +++ /dev/null @@ -1,171 +0,0 @@ -import { FurnitureListItemParser, GetRoomEngine, IObjectData } from '@nitrots/nitro-renderer'; -import { FurniCategory } from './FurniCategory'; -import { FurnitureItem } from './FurnitureItem'; -import { GroupItem } from './GroupItem'; - -export const createGroupItem = (type: number, category: number, stuffData: IObjectData, extra: number = NaN) => new GroupItem(type, category, GetRoomEngine(), stuffData, extra); - -const addSingleFurnitureItem = (set: GroupItem[], item: FurnitureItem, unseen: boolean) => -{ - const groupItems: GroupItem[] = []; - - for(const groupItem of set) - { - if(groupItem.type === item.type) groupItems.push(groupItem); - } - - for(const groupItem of groupItems) - { - if(groupItem.getItemById(item.id)) return groupItem; - } - - const groupItem = createGroupItem(item.type, item.category, item.stuffData, item.extra); - - groupItem.push(item); - - if(unseen) - { - groupItem.hasUnseenItems = true; - - set.unshift(groupItem); - } - else - { - set.push(groupItem); - } - - return groupItem; -} - -const addGroupableFurnitureItem = (set: GroupItem[], item: FurnitureItem, unseen: boolean) => -{ - let existingGroup: GroupItem = null; - - for(const groupItem of set) - { - if((groupItem.type === item.type) && (groupItem.isWallItem === item.isWallItem) && groupItem.isGroupable) - { - if(item.category === FurniCategory.POSTER) - { - if(groupItem.stuffData.getLegacyString() === item.stuffData.getLegacyString()) - { - existingGroup = groupItem; - - break; - } - } - - else if(item.category === FurniCategory.GUILD_FURNI) - { - if(item.stuffData.compare(groupItem.stuffData)) - { - existingGroup = groupItem; - - break; - } - } - - else - { - existingGroup = groupItem; - - break; - } - } - } - - if(existingGroup) - { - existingGroup.push(item); - - if(unseen) - { - existingGroup.hasUnseenItems = true; - - const index = set.indexOf(existingGroup); - - if(index >= 0) set.splice(index, 1); - - set.unshift(existingGroup); - } - - return existingGroup; - } - - existingGroup = createGroupItem(item.type, item.category, item.stuffData, item.extra); - - existingGroup.push(item); - - if(unseen) - { - existingGroup.hasUnseenItems = true; - - set.unshift(existingGroup); - } - else - { - set.push(existingGroup); - } - - return existingGroup; -} - -export const addFurnitureItem = (set: GroupItem[], item: FurnitureItem, unseen: boolean) => -{ - if(!item.isGroupable) - { - addSingleFurnitureItem(set, item, unseen); - } - else - { - addGroupableFurnitureItem(set, item, unseen); - } -} - -export const mergeFurniFragments = (fragment: Map, totalFragments: number, fragmentNumber: number, fragments: Map[]) => -{ - if(totalFragments === 1) return fragment; - - fragments[fragmentNumber] = fragment; - - for(const frag of fragments) - { - if(!frag) return null; - } - - const merged: Map = new Map(); - - for(const frag of fragments) - { - for(const [ key, value ] of frag) merged.set(key, value); - - frag.clear(); - } - - fragments = null; - - return merged; -} - -export const getAllItemIds = (groupItems: GroupItem[]) => -{ - const itemIds: number[] = []; - - for(const groupItem of groupItems) - { - let totalCount = groupItem.getTotalCount(); - - if(groupItem.category === FurniCategory.POST_IT) totalCount = 1; - - let i = 0; - - while(i < totalCount) - { - itemIds.push(groupItem.getItemByIndex(i).id); - - i++; - } - } - - return itemIds; -} diff --git a/src/api/inventory/GroupItem.ts b/src/api/inventory/GroupItem.ts deleted file mode 100644 index 8569321..0000000 --- a/src/api/inventory/GroupItem.ts +++ /dev/null @@ -1,461 +0,0 @@ -import { IObjectData, IRoomEngine } from '@nitrots/nitro-renderer'; -import { LocalizeText } from '../utils'; -import { FurniCategory } from './FurniCategory'; -import { FurnitureItem } from './FurnitureItem'; -import { IFurnitureItem } from './IFurnitureItem'; - -export class GroupItem -{ - private _type: number; - private _category: number; - private _roomEngine: IRoomEngine; - private _stuffData: IObjectData; - private _extra: number; - private _isWallItem: boolean; - private _iconUrl: string; - private _name: string; - private _description: string; - private _locked: boolean; - private _selected: boolean; - private _hasUnseenItems: boolean; - private _items: FurnitureItem[]; - - constructor(type: number = -1, category: number = -1, roomEngine: IRoomEngine = null, stuffData: IObjectData = null, extra: number = -1) - { - this._type = type; - this._category = category; - this._roomEngine = roomEngine; - this._stuffData = stuffData; - this._extra = extra; - this._isWallItem = false; - this._iconUrl = null; - this._name = null; - this._description = null; - this._locked = false; - this._selected = false; - this._hasUnseenItems = false; - this._items = []; - } - - public clone(): GroupItem - { - const groupItem = new GroupItem(); - - groupItem._type = this._type; - groupItem._category = this._category; - groupItem._roomEngine = this._roomEngine; - groupItem._stuffData = this._stuffData; - groupItem._extra = this._extra; - groupItem._isWallItem = this._isWallItem; - groupItem._iconUrl = this._iconUrl; - groupItem._name = this._name; - groupItem._description = this._description; - groupItem._locked = this._locked; - groupItem._selected = this._selected; - groupItem._hasUnseenItems = this._hasUnseenItems; - groupItem._items = this._items; - - return groupItem; - } - - public prepareGroup(): void - { - this.setIcon(); - this.setName(); - this.setDescription(); - } - - public dispose(): void - { - - } - - public getItemByIndex(index: number): FurnitureItem - { - return this._items[index]; - } - - public getItemById(id: number): FurnitureItem - { - for(const item of this._items) - { - if(item.id !== id) continue; - - return item; - } - - return null; - } - - public getTradeItems(count: number): IFurnitureItem[] - { - const items: IFurnitureItem[] = []; - - const furnitureItem = this.getLastItem(); - - if(!furnitureItem) return items; - - let found = 0; - let i = 0; - - while(i < this._items.length) - { - if(found >= count) break; - - const item = this.getItemByIndex(i); - - if(!item.locked && item.isTradable && (item.type === furnitureItem.type)) - { - items.push(item); - - found++; - } - - i++; - } - - return items; - } - - public push(item: FurnitureItem): void - { - const items = [ ...this._items ]; - - let index = 0; - - while(index < items.length) - { - let existingItem = items[index]; - - if(existingItem.id === item.id) - { - existingItem = existingItem.clone(); - - existingItem.locked = false; - - items.splice(index, 1); - - items.push(existingItem); - - this._items = items; - - return; - } - - index++; - } - - items.push(item); - - this._items = items; - - if(this._items.length === 1) this.prepareGroup(); - } - - public pop(): FurnitureItem - { - const items = [ ...this._items ]; - - let item: FurnitureItem = null; - - if(items.length > 0) - { - const index = (items.length - 1); - - item = items[index]; - - items.splice(index, 1); - } - - this._items = items; - - return item; - } - - public remove(k: number): FurnitureItem - { - const items = [ ...this._items ]; - - let index = 0; - - while(index < items.length) - { - let existingItem = items[index]; - - if(existingItem.id === k) - { - items.splice(index, 1); - - this._items = items; - - return existingItem; - } - - index++; - } - - return null; - } - - public getTotalCount(): number - { - if(this._category === FurniCategory.POST_IT) - { - let count = 0; - let index = 0; - - while(index < this._items.length) - { - const item = this.getItemByIndex(index); - - count = (count + parseInt(item.stuffData.getLegacyString())); - - index++; - } - - return count; - } - - return this._items.length; - } - - public getUnlockedCount(): number - { - if(this.category === FurniCategory.POST_IT) return this.getTotalCount(); - - let count = 0; - let index = 0; - - while(index < this._items.length) - { - const item = this.getItemByIndex(index); - - if(!item.locked) count++; - - index++; - } - - return count; - } - - public getLastItem(): FurnitureItem - { - if(!this._items.length) return null; - - const item = this.getItemByIndex((this._items.length - 1)); - - return item; - } - - public unlockAllItems(): void - { - const items = [ ...this._items ]; - - let index = 0; - - while(index < items.length) - { - const item = items[index]; - - if(item.locked) - { - const newItem = item.clone(); - - newItem.locked = false; - - items[index] = newItem; - } - - index++; - } - - this._items = items; - } - - public lockItemIds(itemIds: number[]): boolean - { - const items = [ ...this._items ]; - - let index = 0; - let updated = false; - - while(index < items.length) - { - const item = items[index]; - const locked = (itemIds.indexOf(item.ref) >= 0); - - if(item.locked !== locked) - { - updated = true; - - const newItem = item.clone(); - - newItem.locked = locked; - - items[index] = newItem; - } - - index++; - } - - this._items = items; - - return updated; - } - - private setName(): void - { - const k = this.getLastItem(); - - if(!k) - { - this._name = ''; - - return; - } - - let key = ''; - - switch(this._category) - { - case FurniCategory.POSTER: - key = (('poster_' + k.stuffData.getLegacyString()) + '_name'); - break; - case FurniCategory.TRAX_SONG: - this._name = 'SONG_NAME'; - return; - default: - if(this.isWallItem) - { - key = ('wallItem.name.' + k.type); - } - else - { - key = ('roomItem.name.' + k.type); - } - } - - this._name = LocalizeText(key); - } - - private setDescription(): void - { - this._description = ''; - } - - private setIcon(): void - { - if(this._iconUrl) return; - - let url = null; - - if(this.isWallItem) - { - url = this._roomEngine.getFurnitureWallIconUrl(this._type, this._stuffData.getLegacyString()); - } - else - { - url = this._roomEngine.getFurnitureFloorIconUrl(this._type); - } - - if(!url) return; - - this._iconUrl = url; - } - - public get type(): number - { - return this._type; - } - - public get category(): number - { - return this._category; - } - - public get stuffData(): IObjectData - { - return this._stuffData; - } - - public get extra(): number - { - return this._extra; - } - - public get iconUrl(): string - { - return this._iconUrl; - } - - public get name(): string - { - return this._name; - } - - public get description(): string - { - return this._description; - } - - public get hasUnseenItems(): boolean - { - return this._hasUnseenItems; - } - - public set hasUnseenItems(flag: boolean) - { - this._hasUnseenItems = flag; - } - - public get locked(): boolean - { - return this._locked; - } - - public set locked(flag: boolean) - { - this._locked = flag; - } - - public get selected(): boolean - { - return this._selected; - } - - public set selected(flag: boolean) - { - this._selected = flag; - } - - public get isWallItem(): boolean - { - const item = this.getItemByIndex(0); - - return (item ? item.isWallItem : false); - } - - public get isGroupable(): boolean - { - const item = this.getItemByIndex(0); - - return (item ? item.isGroupable : false); - } - - public get isSellable(): boolean - { - const item = this.getItemByIndex(0); - - return (item ? item.sellable : false); - } - - public get items(): FurnitureItem[] - { - return this._items; - } - - public set items(items: FurnitureItem[]) - { - this._items = items; - } -} diff --git a/src/api/inventory/IBotItem.ts b/src/api/inventory/IBotItem.ts deleted file mode 100644 index 0a370ba..0000000 --- a/src/api/inventory/IBotItem.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { BotData } from '@nitrots/nitro-renderer'; - -export interface IBotItem -{ - botData: BotData; -} diff --git a/src/api/inventory/IFurnitureItem.ts b/src/api/inventory/IFurnitureItem.ts deleted file mode 100644 index 435597d..0000000 --- a/src/api/inventory/IFurnitureItem.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { IObjectData } from '@nitrots/nitro-renderer'; - -export interface IFurnitureItem -{ - id: number; - ref: number; - type: number; - stuffData: IObjectData; - extra: number; - category: number; - recyclable: boolean; - isTradable: boolean; - isGroupable: boolean; - sellable: boolean; - locked: boolean; - isWallItem: boolean; -} diff --git a/src/api/inventory/IPetItem.ts b/src/api/inventory/IPetItem.ts deleted file mode 100644 index 910d5df..0000000 --- a/src/api/inventory/IPetItem.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { PetData } from '@nitrots/nitro-renderer'; - -export interface IPetItem -{ - petData: PetData; -} diff --git a/src/api/inventory/IUnseenItemTracker.ts b/src/api/inventory/IUnseenItemTracker.ts deleted file mode 100644 index 8a70a16..0000000 --- a/src/api/inventory/IUnseenItemTracker.ts +++ /dev/null @@ -1,12 +0,0 @@ -export interface IUnseenItemTracker -{ - dispose(): void; - resetCategory(category: number): boolean; - resetItems(category: number, itemIds: number[]): boolean; - isUnseen(category: number, itemId: number): boolean; - removeUnseen(category: number, itemId: number): boolean; - getIds(category: number): number[]; - getCount(category: number): number; - getFullCount(): number; - addItems(category: number, itemIds: number[]): void; -} diff --git a/src/api/inventory/InventoryUtilities.ts b/src/api/inventory/InventoryUtilities.ts deleted file mode 100644 index c383e07..0000000 --- a/src/api/inventory/InventoryUtilities.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { CreateLinkEvent, FurniturePlacePaintComposer, GetRoomEngine, GetRoomSessionManager, RoomObjectCategory, RoomObjectPlacementSource, RoomObjectType } from '@nitrots/nitro-renderer'; -import { SendMessageComposer } from '../nitro'; -import { FurniCategory } from './FurniCategory'; -import { GroupItem } from './GroupItem'; -import { IBotItem } from './IBotItem'; -import { IPetItem } from './IPetItem'; - -let objectMoverRequested = false; -let itemIdInPlacing = -1; - -export const isObjectMoverRequested = () => objectMoverRequested; - -export const setObjectMoverRequested = (flag: boolean) => objectMoverRequested = flag; - -export const getPlacingItemId = () => itemIdInPlacing; - -export const setPlacingItemId = (id: number) => (itemIdInPlacing = id); - -export const cancelRoomObjectPlacement = () => -{ - if(getPlacingItemId() === -1) return; - - GetRoomEngine().cancelRoomObjectPlacement(); - - setPlacingItemId(-1); - setObjectMoverRequested(false); -} - -export const attemptPetPlacement = (petItem: IPetItem, flag: boolean = false) => -{ - const petData = petItem.petData; - - if(!petData) return false; - - const session = GetRoomSessionManager().getSession(1); - - if(!session) return false; - - if(!session.isRoomOwner && !session.allowPets) return false; - - CreateLinkEvent('inventory/hide'); - - if(GetRoomEngine().processRoomObjectPlacement(RoomObjectPlacementSource.INVENTORY, -(petData.id), RoomObjectCategory.UNIT, RoomObjectType.PET, petData.figureData.figuredata)) - { - setPlacingItemId(petData.id); - setObjectMoverRequested(true); - } - - return true; -} - -export const attemptItemPlacement = (groupItem: GroupItem, flag: boolean = false) => -{ - if(!groupItem || !groupItem.getUnlockedCount()) return false; - - const item = groupItem.getLastItem(); - - if(!item) return false; - - if((item.category === FurniCategory.FLOOR) || (item.category === FurniCategory.WALL_PAPER) || (item.category === FurniCategory.LANDSCAPE)) - { - if(flag) return false; - - SendMessageComposer(new FurniturePlacePaintComposer(item.id)); - - return false; - } - else - { - CreateLinkEvent('inventory/hide'); - - let category = 0; - let isMoving = false; - - if(item.isWallItem) category = RoomObjectCategory.WALL; - else category = RoomObjectCategory.FLOOR; - - if((item.category === FurniCategory.POSTER)) // or external image from furnidata - { - isMoving = GetRoomEngine().processRoomObjectPlacement(RoomObjectPlacementSource.INVENTORY, item.id, category, item.type, item.stuffData.getLegacyString()); - } - else - { - isMoving = GetRoomEngine().processRoomObjectPlacement(RoomObjectPlacementSource.INVENTORY, item.id, category, item.type, item.extra.toString(), item.stuffData); - } - - if(isMoving) - { - setPlacingItemId(item.ref); - setObjectMoverRequested(true); - } - } - - return true; -} - - -export const attemptBotPlacement = (botItem: IBotItem, flag: boolean = false) => -{ - const botData = botItem.botData; - - if(!botData) return false; - - const session = GetRoomSessionManager().getSession(1); - - if(!session || !session.isRoomOwner) return false; - - CreateLinkEvent('inventory/hide'); - - if(GetRoomEngine().processRoomObjectPlacement(RoomObjectPlacementSource.INVENTORY, -(botData.id), RoomObjectCategory.UNIT, RoomObjectType.RENTABLE_BOT, botData.figure)) - { - setPlacingItemId(botData.id); - setObjectMoverRequested(true); - } - - return true; -} diff --git a/src/api/inventory/PetUtilities.ts b/src/api/inventory/PetUtilities.ts deleted file mode 100644 index bee286a..0000000 --- a/src/api/inventory/PetUtilities.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { CreateLinkEvent, PetData } from '@nitrots/nitro-renderer'; -import { IPetItem } from './IPetItem'; -import { cancelRoomObjectPlacement, getPlacingItemId } from './InventoryUtilities'; -import { UnseenItemCategory } from './UnseenItemCategory'; - -export const getAllPetIds = (petItems: IPetItem[]) => petItems.map(item => item.petData.id); - -export const addSinglePetItem = (petData: PetData, set: IPetItem[], unseen: boolean = true) => -{ - const petItem = { petData }; - - if(unseen) - { - //petItem.isUnseen = true; - - set.unshift(petItem); - } - else - { - set.push(petItem); - } - - return petItem; -} - -export const removePetItemById = (id: number, set: IPetItem[]) => -{ - let index = 0; - - while(index < set.length) - { - const petItem = set[index]; - - if(petItem && (petItem.petData.id === id)) - { - if(getPlacingItemId() === petItem.petData.id) - { - cancelRoomObjectPlacement(); - - CreateLinkEvent('inventory/open'); - } - - set.splice(index, 1); - - return petItem; - } - - index++; - } - - return null; -} - -export const processPetFragment = (set: IPetItem[], fragment: Map, isUnseen: (category: number, itemId: number) => boolean) => -{ - const existingIds = getAllPetIds(set); - const addedIds: number[] = []; - const removedIds: number[] = []; - - for(const key of fragment.keys()) (existingIds.indexOf(key) === -1) && addedIds.push(key); - - for(const itemId of existingIds) (!fragment.get(itemId)) && removedIds.push(itemId); - - const emptyExistingSet = (existingIds.length === 0); - - for(const id of removedIds) removePetItemById(id, set); - - for(const id of addedIds) - { - const parser = fragment.get(id); - - if(!parser) continue; - - addSinglePetItem(parser, set, isUnseen(UnseenItemCategory.PET, parser.id)); - } - - return set; -} - -export const mergePetFragments = (fragment: Map, totalFragments: number, fragmentNumber: number, fragments: Map[]) => -{ - if(totalFragments === 1) return fragment; - - fragments[fragmentNumber] = fragment; - - for(const frag of fragments) - { - if(!frag) return null; - } - - const merged: Map = new Map(); - - for(const frag of fragments) - { - for(const [ key, value ] of frag) merged.set(key, value); - - frag.clear(); - } - - fragments = null; - - return merged; -} diff --git a/src/api/inventory/TradeState.ts b/src/api/inventory/TradeState.ts deleted file mode 100644 index 3df418b..0000000 --- a/src/api/inventory/TradeState.ts +++ /dev/null @@ -1,10 +0,0 @@ -export class TradeState -{ - public static TRADING_STATE_READY: number = 0; - public static TRADING_STATE_RUNNING: number = 1; - public static TRADING_STATE_COUNTDOWN: number = 2; - public static TRADING_STATE_CONFIRMING: number = 3; - public static TRADING_STATE_CONFIRMED: number = 4; - public static TRADING_STATE_COMPLETED: number = 5; - public static TRADING_STATE_CANCELLED: number = 6; -} diff --git a/src/api/inventory/TradeUserData.ts b/src/api/inventory/TradeUserData.ts deleted file mode 100644 index 452c7ee..0000000 --- a/src/api/inventory/TradeUserData.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { AdvancedMap } from '@nitrots/nitro-renderer'; -import { GroupItem } from './GroupItem'; - -export class TradeUserData -{ - constructor( - public userId: number = -1, - public userName: string = '', - public userItems: AdvancedMap = new AdvancedMap(), - public itemCount: number = 0, - public creditsCount: number = 0, - public accepts: boolean = false, - public canTrade: boolean = false) - {} -} diff --git a/src/api/inventory/TradingNotificationType.ts b/src/api/inventory/TradingNotificationType.ts deleted file mode 100644 index 4aed490..0000000 --- a/src/api/inventory/TradingNotificationType.ts +++ /dev/null @@ -1,12 +0,0 @@ -export class TradingNotificationType -{ - public static ALERT_SCAM: number = 0; - public static HOTEL_TRADING_DISABLED = 1; - public static YOU_NOT_ALLOWED: number = 2; - public static THEY_NOT_ALLOWED: number = 4; - public static ROOM_DISABLED: number = 6; - public static YOU_OPEN: number = 7; - public static THEY_OPEN: number = 8; - public static ERROR_WHILE_COMMIT: number = 9; - public static THEY_CANCELLED: number = 10; -} diff --git a/src/api/inventory/TradingUtilities.ts b/src/api/inventory/TradingUtilities.ts deleted file mode 100644 index cd18fba..0000000 --- a/src/api/inventory/TradingUtilities.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { AdvancedMap, GetSessionDataManager, IObjectData, ItemDataStructure, StringDataType } from '@nitrots/nitro-renderer'; -import { FurniCategory } from './FurniCategory'; -import { FurnitureItem } from './FurnitureItem'; -import { createGroupItem } from './FurnitureUtilities'; -import { GroupItem } from './GroupItem'; - -const isExternalImage = (spriteId: number) => GetSessionDataManager().getWallItemData(spriteId)?.isExternalImage || false; - -export const parseTradeItems = (items: ItemDataStructure[]) => -{ - const existingItems = new AdvancedMap(); - const totalItems = items.length; - - if(totalItems) - { - for(const item of items) - { - const spriteId = item.spriteId; - const category = item.category; - - let name = (item.furniType + spriteId); - - if(!item.isGroupable || isExternalImage(spriteId)) - { - name = ('itemid' + item.itemId); - } - - if(item.category === FurniCategory.POSTER) - { - name = (item.itemId + 'poster' + item.stuffData.getLegacyString()); - } - - else if(item.category === FurniCategory.GUILD_FURNI) - { - name = ''; - } - - let groupItem = ((item.isGroupable && !isExternalImage(item.spriteId)) ? existingItems.getValue(name) : null); - - if(!groupItem) - { - groupItem = createGroupItem(spriteId, category, item.stuffData); - - existingItems.add(name, groupItem); - } - - groupItem.push(new FurnitureItem(item)); - } - } - - return existingItems; -} - -export const getGuildFurniType = (spriteId: number, stuffData: IObjectData) => -{ - let type = spriteId.toString(); - - if(!(stuffData instanceof StringDataType)) return type; - - let i = 1; - - while(i < 5) - { - type = (type + (',' + stuffData.getValue(i))); - - i++; - } - - return type; -} diff --git a/src/api/inventory/UnseenItemCategory.ts b/src/api/inventory/UnseenItemCategory.ts deleted file mode 100644 index cbd7e9b..0000000 --- a/src/api/inventory/UnseenItemCategory.ts +++ /dev/null @@ -1,9 +0,0 @@ -export class UnseenItemCategory -{ - public static FURNI: number = 1; - public static RENTABLE: number = 2; - public static PET: number = 3; - public static BADGE: number = 4; - public static BOT: number = 5; - public static GAMES: number = 6; -} diff --git a/src/api/inventory/index.ts b/src/api/inventory/index.ts deleted file mode 100644 index 6a245d7..0000000 --- a/src/api/inventory/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -export * from './FurniCategory'; -export * from './FurnitureItem'; -export * from './FurnitureUtilities'; -export * from './GroupItem'; -export * from './IBotItem'; -export * from './IFurnitureItem'; -export * from './IPetItem'; -export * from './IUnseenItemTracker'; -export * from './InventoryUtilities'; -export * from './PetUtilities'; -export * from './TradeState'; -export * from './TradeUserData'; -export * from './TradingNotificationType'; -export * from './TradingUtilities'; -export * from './UnseenItemCategory'; diff --git a/src/api/mod-tools/GetIssueCategoryName.ts b/src/api/mod-tools/GetIssueCategoryName.ts deleted file mode 100644 index 81a3f86..0000000 --- a/src/api/mod-tools/GetIssueCategoryName.ts +++ /dev/null @@ -1,35 +0,0 @@ -export const GetIssueCategoryName = (categoryId: number) => -{ - switch(categoryId) - { - case 1: - case 2: - return 'Normal'; - case 3: - return 'Automatic'; - case 4: - return 'Automatic IM'; - case 5: - return 'Guide System'; - case 6: - return 'IM'; - case 7: - return 'Room'; - case 8: - return 'Panic'; - case 9: - return 'Guardian'; - case 10: - return 'Automatic Helper'; - case 11: - return 'Discussion'; - case 12: - return 'Selfie'; - case 14: - return 'Photo'; - case 15: - return 'Ambassador'; - } - - return 'Unknown'; -} diff --git a/src/api/mod-tools/ISelectedUser.ts b/src/api/mod-tools/ISelectedUser.ts deleted file mode 100644 index 4f6e76b..0000000 --- a/src/api/mod-tools/ISelectedUser.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface ISelectedUser -{ - userId: number; - username: string; -} diff --git a/src/api/mod-tools/IUserInfo.ts b/src/api/mod-tools/IUserInfo.ts deleted file mode 100644 index 8d49aa7..0000000 --- a/src/api/mod-tools/IUserInfo.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface IUserInfo -{ - nameKey: string; - nameKeyFallback: string; - value: string; -} diff --git a/src/api/mod-tools/ModActionDefinition.ts b/src/api/mod-tools/ModActionDefinition.ts deleted file mode 100644 index b28aa9c..0000000 --- a/src/api/mod-tools/ModActionDefinition.ts +++ /dev/null @@ -1,49 +0,0 @@ -export class ModActionDefinition -{ - public static ALERT: number = 1; - public static MUTE: number = 2; - public static BAN: number = 3; - public static KICK: number = 4; - public static TRADE_LOCK: number = 5; - public static MESSAGE: number = 6; - - private readonly _actionId: number; - private readonly _name: string; - private readonly _actionType: number; - private readonly _sanctionTypeId: number; - private readonly _actionLengthHours: number; - - constructor(actionId: number, actionName: string, actionType: number, sanctionTypeId: number, actionLengthHours:number) - { - this._actionId = actionId; - this._name = actionName; - this._actionType = actionType; - this._sanctionTypeId = sanctionTypeId; - this._actionLengthHours = actionLengthHours; - } - - public get actionId(): number - { - return this._actionId; - } - - public get name(): string - { - return this._name; - } - - public get actionType(): number - { - return this._actionType; - } - - public get sanctionTypeId(): number - { - return this._sanctionTypeId; - } - - public get actionLengthHours(): number - { - return this._actionLengthHours; - } -} diff --git a/src/api/mod-tools/index.ts b/src/api/mod-tools/index.ts deleted file mode 100644 index 004bbaa..0000000 --- a/src/api/mod-tools/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './GetIssueCategoryName'; -export * from './ISelectedUser'; -export * from './IUserInfo'; -export * from './ModActionDefinition'; diff --git a/src/api/navigator/DoorStateType.ts b/src/api/navigator/DoorStateType.ts deleted file mode 100644 index 1f8a8ef..0000000 --- a/src/api/navigator/DoorStateType.ts +++ /dev/null @@ -1,12 +0,0 @@ -export class DoorStateType -{ - public static NONE: number = 0; - public static START_DOORBELL: number = 1; - public static START_PASSWORD: number = 2; - public static STATE_PENDING_SERVER: number = 3; - public static UPDATE_STATE: number = 4; - public static STATE_WAITING: number = 5; - public static STATE_NO_ANSWER: number = 6; - public static STATE_WRONG_PASSWORD: number = 7; - public static STATE_ACCEPTED: number = 8; -} diff --git a/src/api/navigator/INavigatorData.ts b/src/api/navigator/INavigatorData.ts deleted file mode 100644 index e50b6fe..0000000 --- a/src/api/navigator/INavigatorData.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { RoomDataParser } from '@nitrots/nitro-renderer'; - -export interface INavigatorData -{ - homeRoomId: number; - settingsReceived: boolean; - enteredGuestRoom: RoomDataParser; - currentRoomOwner: boolean; - currentRoomId: number; - currentRoomIsStaffPick: boolean; - createdFlatId: number; - avatarId: number; - roomPicker: boolean; - eventMod: boolean; - currentRoomRating: number; - canRate: boolean; -} diff --git a/src/api/navigator/INavigatorSearchFilter.ts b/src/api/navigator/INavigatorSearchFilter.ts deleted file mode 100644 index 179d5d5..0000000 --- a/src/api/navigator/INavigatorSearchFilter.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface INavigatorSearchFilter -{ - name: string; - query: string; -} diff --git a/src/api/navigator/IRoomChatSettings.ts b/src/api/navigator/IRoomChatSettings.ts deleted file mode 100644 index aee426c..0000000 --- a/src/api/navigator/IRoomChatSettings.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface IRoomChatSettings -{ - mode: number; - weight: number; - speed: number; - distance: number; - protection: number; -} diff --git a/src/api/navigator/IRoomData.ts b/src/api/navigator/IRoomData.ts deleted file mode 100644 index 9146314..0000000 --- a/src/api/navigator/IRoomData.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { IRoomChatSettings } from './IRoomChatSettings'; -import { IRoomModerationSettings } from './IRoomModerationSettings'; - -export interface IRoomData -{ - roomId: number; - roomName: string; - roomDescription: string; - categoryId: number; - userCount: number; - tags: string[]; - tradeState: number; - allowWalkthrough: boolean; - lockState: number; - password: string; - allowPets: boolean; - allowPetsEat: boolean; - hideWalls: boolean; - wallThickness: number; - floorThickness: number; - chatSettings: IRoomChatSettings; - moderationSettings: IRoomModerationSettings; -} diff --git a/src/api/navigator/IRoomModel.ts b/src/api/navigator/IRoomModel.ts deleted file mode 100644 index 73dfe27..0000000 --- a/src/api/navigator/IRoomModel.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface IRoomModel -{ - clubLevel: number; - tileSize: number; - name: string; -} diff --git a/src/api/navigator/IRoomModerationSettings.ts b/src/api/navigator/IRoomModerationSettings.ts deleted file mode 100644 index 266fe47..0000000 --- a/src/api/navigator/IRoomModerationSettings.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface IRoomModerationSettings -{ - allowMute: number; - allowKick: number; - allowBan: number; -} diff --git a/src/api/navigator/NavigatorSearchResultViewDisplayMode.ts b/src/api/navigator/NavigatorSearchResultViewDisplayMode.ts deleted file mode 100644 index b532d1a..0000000 --- a/src/api/navigator/NavigatorSearchResultViewDisplayMode.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class NavigatorSearchResultViewDisplayMode -{ - public static readonly LIST: number = 0; - public static readonly THUMBNAILS: number = 1; - public static readonly FORCED_THUMBNAILS: number = 2; -} diff --git a/src/api/navigator/RoomInfoData.ts b/src/api/navigator/RoomInfoData.ts deleted file mode 100644 index fc0a93b..0000000 --- a/src/api/navigator/RoomInfoData.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { RoomDataParser } from '@nitrots/nitro-renderer'; - -export class RoomInfoData -{ - private _enteredGuestRoom: RoomDataParser = null; - private _createdRoomId: number = 0; - private _currentRoomId: number = 0; - private _currentRoomOwner: boolean = false; - private _canRate: boolean = false; - - public get enteredGuestRoom(): RoomDataParser - { - return this._enteredGuestRoom; - } - - public set enteredGuestRoom(data: RoomDataParser) - { - this._enteredGuestRoom = data; - } - - public get createdRoomId(): number - { - return this._createdRoomId; - } - - public set createdRoomId(id: number) - { - this._createdRoomId = id; - } - - public get currentRoomId(): number - { - return this._currentRoomId; - } - - public set currentRoomId(id: number) - { - this._currentRoomId = id; - } - - public get currentRoomOwner(): boolean - { - return this._currentRoomOwner; - } - - public set currentRoomOwner(flag: boolean) - { - this._currentRoomOwner = flag; - } - - public get canRate(): boolean - { - return this._canRate; - } - - public set canRate(flag: boolean) - { - this._canRate = flag; - } -} diff --git a/src/api/navigator/RoomSettingsUtils.ts b/src/api/navigator/RoomSettingsUtils.ts deleted file mode 100644 index bc611da..0000000 --- a/src/api/navigator/RoomSettingsUtils.ts +++ /dev/null @@ -1,10 +0,0 @@ -const BuildMaxVisitorsList = () => -{ - const list: number[] = []; - - for(let i = 10; i <= 100; i = i + 10) list.push(i); - - return list; -} - -export const GetMaxVisitorsList = BuildMaxVisitorsList(); diff --git a/src/api/navigator/SearchFilterOptions.ts b/src/api/navigator/SearchFilterOptions.ts deleted file mode 100644 index aaf1290..0000000 --- a/src/api/navigator/SearchFilterOptions.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { INavigatorSearchFilter } from './INavigatorSearchFilter'; - -export const SearchFilterOptions: INavigatorSearchFilter[] = [ - { - name: 'anything', - query: null - }, - { - name: 'room.name', - query: 'roomname' - }, - { - name: 'owner', - query: 'owner' - }, - { - name: 'tag', - query: 'tag' - }, - { - name: 'group', - query: 'group' - } -]; diff --git a/src/api/navigator/TryVisitRoom.ts b/src/api/navigator/TryVisitRoom.ts deleted file mode 100644 index 81138d6..0000000 --- a/src/api/navigator/TryVisitRoom.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { GetGuestRoomMessageComposer } from '@nitrots/nitro-renderer'; -import { SendMessageComposer } from '../nitro'; - -export function TryVisitRoom(roomId: number): void -{ - SendMessageComposer(new GetGuestRoomMessageComposer(roomId, false, true)); -} diff --git a/src/api/navigator/index.ts b/src/api/navigator/index.ts deleted file mode 100644 index bceb33e..0000000 --- a/src/api/navigator/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -export * from './DoorStateType'; -export * from './INavigatorData'; -export * from './INavigatorSearchFilter'; -export * from './IRoomChatSettings'; -export * from './IRoomData'; -export * from './IRoomModel'; -export * from './IRoomModerationSettings'; -export * from './NavigatorSearchResultViewDisplayMode'; -export * from './RoomInfoData'; -export * from './RoomSettingsUtils'; -export * from './SearchFilterOptions'; -export * from './TryVisitRoom'; diff --git a/src/api/nitro/GetConfigurationValue.ts b/src/api/nitro/GetConfigurationValue.ts deleted file mode 100644 index 4438444..0000000 --- a/src/api/nitro/GetConfigurationValue.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { GetConfiguration } from '@nitrots/nitro-renderer'; - -export function GetConfigurationValue(key: string, value: T = null): T -{ - return GetConfiguration().getValue(key, value); -} diff --git a/src/api/nitro/OpenUrl.ts b/src/api/nitro/OpenUrl.ts deleted file mode 100644 index 0329c00..0000000 --- a/src/api/nitro/OpenUrl.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { CreateLinkEvent, HabboWebTools } from '@nitrots/nitro-renderer'; - -export const OpenUrl = (url: string) => -{ - if(!url || !url.length) return; - - if(url.startsWith('http')) - { - HabboWebTools.openWebPage(url); - } - else - { - CreateLinkEvent(url); - } -} diff --git a/src/api/nitro/SendMessageComposer.ts b/src/api/nitro/SendMessageComposer.ts deleted file mode 100644 index 4229c28..0000000 --- a/src/api/nitro/SendMessageComposer.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { GetCommunication, IMessageComposer } from '@nitrots/nitro-renderer'; - -export const SendMessageComposer = (event: IMessageComposer) => GetCommunication().connection.send(event); diff --git a/src/api/nitro/index.ts b/src/api/nitro/index.ts deleted file mode 100644 index 11b9d02..0000000 --- a/src/api/nitro/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './GetConfigurationValue'; -export * from './OpenUrl'; -export * from './SendMessageComposer'; -export * from './room'; -export * from './session'; diff --git a/src/api/nitro/room/DispatchMouseEvent.ts b/src/api/nitro/room/DispatchMouseEvent.ts deleted file mode 100644 index c28e5e4..0000000 --- a/src/api/nitro/room/DispatchMouseEvent.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { GetRoomEngine, MouseEventType } from '@nitrots/nitro-renderer'; - -let didMouseMove = false; -let lastClick = 0; -let clickCount = 0; - -export const DispatchMouseEvent = (event: MouseEvent, canvasId: number = 1) => -{ - const x = event.clientX; - const y = event.clientY; - - let eventType = event.type; - - if(eventType === MouseEventType.MOUSE_CLICK) - { - if(lastClick) - { - clickCount = 1; - - if(lastClick >= Date.now() - 300) clickCount++; - } - - lastClick = Date.now(); - - if(clickCount === 2) - { - if(!didMouseMove) eventType = MouseEventType.DOUBLE_CLICK; - - clickCount = 0; - lastClick = null; - } - } - - switch(eventType) - { - case MouseEventType.MOUSE_CLICK: - break; - case MouseEventType.DOUBLE_CLICK: - break; - case MouseEventType.MOUSE_MOVE: - didMouseMove = true; - break; - case MouseEventType.MOUSE_DOWN: - didMouseMove = false; - break; - case MouseEventType.MOUSE_UP: - break; - case MouseEventType.RIGHT_CLICK: - break; - default: return; - } - - GetRoomEngine().dispatchMouseEvent(canvasId, x, y, eventType, event.altKey, (event.ctrlKey || event.metaKey), event.shiftKey, false); -} diff --git a/src/api/nitro/room/DispatchTouchEvent.ts b/src/api/nitro/room/DispatchTouchEvent.ts deleted file mode 100644 index 0f31bdc..0000000 --- a/src/api/nitro/room/DispatchTouchEvent.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { GetRoomEngine, MouseEventType, TouchEventType } from '@nitrots/nitro-renderer'; - -let didMouseMove = false; -let lastClick = 0; -let clickCount = 0; - -export const DispatchTouchEvent = (event: TouchEvent, canvasId: number = 1, longTouch: boolean = false, altKey: boolean = false, ctrlKey: boolean = false, shiftKey: boolean = false) => -{ - let x = 0; - let y = 0; - - if(event.touches[0]) - { - x = event.touches[0].clientX; - y = event.touches[0].clientY; - } - - else if(event.changedTouches[0]) - { - x = event.changedTouches[0].clientX; - y = event.changedTouches[0].clientY; - } - - let eventType = event.type; - - if(longTouch) eventType = TouchEventType.TOUCH_LONG; - - if(eventType === MouseEventType.MOUSE_CLICK || eventType === TouchEventType.TOUCH_END) - { - eventType = MouseEventType.MOUSE_CLICK; - - if(lastClick) - { - clickCount = 1; - - if(lastClick >= (Date.now() - 300)) clickCount++; - } - - lastClick = Date.now(); - - if(clickCount === 2) - { - if(!didMouseMove) eventType = MouseEventType.DOUBLE_CLICK; - - clickCount = 0; - lastClick = null; - } - } - - switch(eventType) - { - case MouseEventType.MOUSE_CLICK: - break; - case MouseEventType.DOUBLE_CLICK: - break; - case TouchEventType.TOUCH_START: - eventType = MouseEventType.MOUSE_DOWN; - - didMouseMove = false; - break; - case TouchEventType.TOUCH_MOVE: - eventType = MouseEventType.MOUSE_MOVE; - - didMouseMove = true; - break; - case TouchEventType.TOUCH_END: - eventType = MouseEventType.MOUSE_UP; - break; - case TouchEventType.TOUCH_LONG: - eventType = MouseEventType.MOUSE_DOWN_LONG; - break; - default: return; - } - - if (eventType === TouchEventType.TOUCH_START) - { - GetRoomEngine().dispatchMouseEvent(canvasId, x, y, eventType, altKey, ctrlKey, shiftKey, false); - } - - GetRoomEngine().dispatchMouseEvent(canvasId, x, y, eventType, altKey, ctrlKey, shiftKey, false); -} diff --git a/src/api/nitro/room/GetOwnRoomObject.ts b/src/api/nitro/room/GetOwnRoomObject.ts deleted file mode 100644 index aae0b77..0000000 --- a/src/api/nitro/room/GetOwnRoomObject.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { GetRoomEngine, GetSessionDataManager, IRoomObjectController, RoomObjectCategory } from '@nitrots/nitro-renderer'; -import { GetRoomSession } from '../session'; - -export function GetOwnRoomObject(): IRoomObjectController -{ - const userId = GetSessionDataManager().userId; - const roomId = GetRoomEngine().activeRoomId; - const category = RoomObjectCategory.UNIT; - const totalObjects = GetRoomEngine().getTotalObjectsForManager(roomId, category); - - let i = 0; - - while(i < totalObjects) - { - const roomObject = GetRoomEngine().getRoomObjectByIndex(roomId, i, category); - - if(roomObject) - { - const userData = GetRoomSession().userDataManager.getUserDataByIndex(roomObject.id); - - if(userData) - { - if(userData.webID === userId) return roomObject; - } - } - - i++; - } - - return null; -} diff --git a/src/api/nitro/room/GetRoomObjectBounds.ts b/src/api/nitro/room/GetRoomObjectBounds.ts deleted file mode 100644 index e32fd25..0000000 --- a/src/api/nitro/room/GetRoomObjectBounds.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { GetRoomEngine } from '@nitrots/nitro-renderer'; - -export const GetRoomObjectBounds = (roomId: number, objectId: number, category: number, canvasId = 1) => -{ - const rectangle = GetRoomEngine().getRoomObjectBoundingRectangle(roomId, objectId, category, canvasId); - - if(!rectangle) return null; - - rectangle.x = Math.round(rectangle.x); - rectangle.y = Math.round(rectangle.y); - - return rectangle; -} diff --git a/src/api/nitro/room/GetRoomObjectScreenLocation.ts b/src/api/nitro/room/GetRoomObjectScreenLocation.ts deleted file mode 100644 index 58cbc92..0000000 --- a/src/api/nitro/room/GetRoomObjectScreenLocation.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { GetRoomEngine } from '@nitrots/nitro-renderer'; - -export const GetRoomObjectScreenLocation = (roomId: number, objectId: number, category: number, canvasId = 1) => -{ - const point = GetRoomEngine().getRoomObjectScreenLocation(roomId, objectId, category, canvasId); - - if(!point) return null; - - point.x = Math.round(point.x); - point.y = Math.round(point.y); - - return point; -} diff --git a/src/api/nitro/room/InitializeRoomInstanceRenderingCanvas.ts b/src/api/nitro/room/InitializeRoomInstanceRenderingCanvas.ts deleted file mode 100644 index 4f3eae5..0000000 --- a/src/api/nitro/room/InitializeRoomInstanceRenderingCanvas.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { GetRoomEngine } from '@nitrots/nitro-renderer'; - -export const InitializeRoomInstanceRenderingCanvas = (width: number, height: number, canvasId: number = 1) => -{ - const roomEngine = GetRoomEngine(); - const roomId = roomEngine.activeRoomId; - - roomEngine.initializeRoomInstanceRenderingCanvas(roomId, canvasId, width, height); -} diff --git a/src/api/nitro/room/IsFurnitureSelectionDisabled.ts b/src/api/nitro/room/IsFurnitureSelectionDisabled.ts deleted file mode 100644 index e86f9a3..0000000 --- a/src/api/nitro/room/IsFurnitureSelectionDisabled.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { GetRoomEngine, GetSessionDataManager, RoomEngineObjectEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; - -export function IsFurnitureSelectionDisabled(event: RoomEngineObjectEvent): boolean -{ - let result = false; - - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - - if(roomObject) - { - const selectionDisabled = (roomObject.model.getValue(RoomObjectVariable.FURNITURE_SELECTION_DISABLED) === 1); - - if(selectionDisabled) - { - result = true; - - if(GetSessionDataManager().isModerator) result = false; - } - } - - return result; -} diff --git a/src/api/nitro/room/ProcessRoomObjectOperation.ts b/src/api/nitro/room/ProcessRoomObjectOperation.ts deleted file mode 100644 index 5a1c997..0000000 --- a/src/api/nitro/room/ProcessRoomObjectOperation.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { GetRoomEngine } from '@nitrots/nitro-renderer'; - -export function ProcessRoomObjectOperation(objectId: number, category: number, operation: string): void -{ - GetRoomEngine().processRoomObjectOperation(objectId, category, operation); -} diff --git a/src/api/nitro/room/SetActiveRoomId.ts b/src/api/nitro/room/SetActiveRoomId.ts deleted file mode 100644 index 9446537..0000000 --- a/src/api/nitro/room/SetActiveRoomId.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { GetRoomEngine } from '@nitrots/nitro-renderer'; - -export function SetActiveRoomId(roomId: number): void -{ - GetRoomEngine().setActiveRoomId(roomId); -} diff --git a/src/api/nitro/room/index.ts b/src/api/nitro/room/index.ts deleted file mode 100644 index 2af9c28..0000000 --- a/src/api/nitro/room/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * from './DispatchMouseEvent'; -export * from './DispatchTouchEvent'; -export * from './GetOwnRoomObject'; -export * from './GetRoomObjectBounds'; -export * from './GetRoomObjectScreenLocation'; -export * from './InitializeRoomInstanceRenderingCanvas'; -export * from './IsFurnitureSelectionDisabled'; -export * from './ProcessRoomObjectOperation'; -export * from './SetActiveRoomId'; diff --git a/src/api/nitro/session/CanManipulateFurniture.ts b/src/api/nitro/session/CanManipulateFurniture.ts deleted file mode 100644 index ba89efd..0000000 --- a/src/api/nitro/session/CanManipulateFurniture.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { GetRoomEngine, GetSessionDataManager, IRoomSession, RoomControllerLevel } from '@nitrots/nitro-renderer'; -import { IsOwnerOfFurniture } from './IsOwnerOfFurniture'; - -export function CanManipulateFurniture(roomSession: IRoomSession, objectId: number, category: number): boolean -{ - if(!roomSession) return false; - - return (roomSession.isRoomOwner || (roomSession.controllerLevel >= RoomControllerLevel.GUEST) || GetSessionDataManager().isModerator || IsOwnerOfFurniture(GetRoomEngine().getRoomObject(roomSession.roomId, objectId, category))); -} diff --git a/src/api/nitro/session/CreateRoomSession.ts b/src/api/nitro/session/CreateRoomSession.ts deleted file mode 100644 index 3f12bb4..0000000 --- a/src/api/nitro/session/CreateRoomSession.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { GetRoomSessionManager } from '@nitrots/nitro-renderer'; - -export function CreateRoomSession(roomId: number, password: string = null): void -{ - GetRoomSessionManager().createSession(roomId, password); -} diff --git a/src/api/nitro/session/GetCanStandUp.ts b/src/api/nitro/session/GetCanStandUp.ts deleted file mode 100644 index 4915d18..0000000 --- a/src/api/nitro/session/GetCanStandUp.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { AvatarAction, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { GetOwnRoomObject } from '../room'; - -export function GetCanStandUp(): string -{ - const roomObject = GetOwnRoomObject(); - - if(!roomObject) return AvatarAction.POSTURE_STAND; - - const model = roomObject.model; - - return model.getValue(RoomObjectVariable.FIGURE_CAN_STAND_UP); -} diff --git a/src/api/nitro/session/GetCanUseExpression.ts b/src/api/nitro/session/GetCanUseExpression.ts deleted file mode 100644 index c7c7367..0000000 --- a/src/api/nitro/session/GetCanUseExpression.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { GetOwnRoomObject } from '../room'; - -export function GetCanUseExpression(): boolean -{ - const roomObject = GetOwnRoomObject(); - - if(!roomObject) return false; - - const model = roomObject.model; - const effectId = model.getValue(RoomObjectVariable.FIGURE_EFFECT); - - return !((effectId === 29) || (effectId === 30) || (effectId === 185)); -} diff --git a/src/api/nitro/session/GetClubMemberLevel.ts b/src/api/nitro/session/GetClubMemberLevel.ts deleted file mode 100644 index 97d4949..0000000 --- a/src/api/nitro/session/GetClubMemberLevel.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { GetSessionDataManager, HabboClubLevelEnum } from '@nitrots/nitro-renderer'; -import { GetConfigurationValue } from '../GetConfigurationValue'; - -export function GetClubMemberLevel(): number -{ - if(GetConfigurationValue('hc.disabled', false)) return HabboClubLevelEnum.VIP; - - return GetSessionDataManager().clubLevel; -} diff --git a/src/api/nitro/session/GetFurnitureData.ts b/src/api/nitro/session/GetFurnitureData.ts deleted file mode 100644 index b7646df..0000000 --- a/src/api/nitro/session/GetFurnitureData.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { GetSessionDataManager, IFurnitureData } from '@nitrots/nitro-renderer'; -import { ProductTypeEnum } from '../../catalog'; - -export function GetFurnitureData(furniClassId: number, productType: string): IFurnitureData -{ - let furniData: IFurnitureData = null; - - switch(productType.toLowerCase()) - { - case ProductTypeEnum.FLOOR: - furniData = GetSessionDataManager().getFloorItemData(furniClassId); - break; - case ProductTypeEnum.WALL: - furniData = GetSessionDataManager().getWallItemData(furniClassId); - break; - } - - return furniData; -} diff --git a/src/api/nitro/session/GetFurnitureDataForProductOffer.ts b/src/api/nitro/session/GetFurnitureDataForProductOffer.ts deleted file mode 100644 index 95a6256..0000000 --- a/src/api/nitro/session/GetFurnitureDataForProductOffer.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { CatalogPageMessageProductData, FurnitureType, GetSessionDataManager, IFurnitureData } from '@nitrots/nitro-renderer'; - -export function GetFurnitureDataForProductOffer(offer: CatalogPageMessageProductData): IFurnitureData -{ - if(!offer) return null; - - let furniData: IFurnitureData = null; - - switch((offer.productType.toUpperCase())) - { - case FurnitureType.FLOOR: - furniData = GetSessionDataManager().getFloorItemData(offer.furniClassId); - break; - case FurnitureType.WALL: - furniData = GetSessionDataManager().getWallItemData(offer.furniClassId); - break; - } - - return furniData; -} diff --git a/src/api/nitro/session/GetFurnitureDataForRoomObject.ts b/src/api/nitro/session/GetFurnitureDataForRoomObject.ts deleted file mode 100644 index fb76b9e..0000000 --- a/src/api/nitro/session/GetFurnitureDataForRoomObject.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { GetRoomEngine, GetSessionDataManager, IFurnitureData, RoomObjectCategory, RoomObjectVariable } from '@nitrots/nitro-renderer'; - -export function GetFurnitureDataForRoomObject(roomId: number, objectId: number, category: number): IFurnitureData -{ - const roomObject = GetRoomEngine().getRoomObject(roomId, objectId, category); - - if(!roomObject) return; - - const typeId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); - - switch(category) - { - case RoomObjectCategory.FLOOR: - return GetSessionDataManager().getFloorItemData(typeId); - case RoomObjectCategory.WALL: - return GetSessionDataManager().getWallItemData(typeId); - } - - return null; -} diff --git a/src/api/nitro/session/GetOwnPosture.ts b/src/api/nitro/session/GetOwnPosture.ts deleted file mode 100644 index fe0c5f3..0000000 --- a/src/api/nitro/session/GetOwnPosture.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { AvatarAction, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { GetOwnRoomObject } from '../room'; - -export function GetOwnPosture(): string -{ - const roomObject = GetOwnRoomObject(); - - if(!roomObject) return AvatarAction.POSTURE_STAND; - - const model = roomObject.model; - - return model.getValue(RoomObjectVariable.FIGURE_POSTURE); -} diff --git a/src/api/nitro/session/GetProductDataForLocalization.ts b/src/api/nitro/session/GetProductDataForLocalization.ts deleted file mode 100644 index ac89803..0000000 --- a/src/api/nitro/session/GetProductDataForLocalization.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { GetSessionDataManager, IProductData } from '@nitrots/nitro-renderer'; - -export function GetProductDataForLocalization(localizationId: string): IProductData -{ - if(!localizationId) return null; - - return GetSessionDataManager().getProductData(localizationId); -} diff --git a/src/api/nitro/session/GetRoomSession.ts b/src/api/nitro/session/GetRoomSession.ts deleted file mode 100644 index da2af41..0000000 --- a/src/api/nitro/session/GetRoomSession.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { GetRoomSessionManager } from '@nitrots/nitro-renderer'; - -export const GetRoomSession = () => GetRoomSessionManager().getSession(-1); diff --git a/src/api/nitro/session/GoToDesktop.ts b/src/api/nitro/session/GoToDesktop.ts deleted file mode 100644 index 34f2031..0000000 --- a/src/api/nitro/session/GoToDesktop.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { DesktopViewComposer } from '@nitrots/nitro-renderer'; -import { SendMessageComposer } from '../SendMessageComposer'; - -export function GoToDesktop(): void -{ - SendMessageComposer(new DesktopViewComposer()); -} diff --git a/src/api/nitro/session/HasHabboClub.ts b/src/api/nitro/session/HasHabboClub.ts deleted file mode 100644 index 9cee03f..0000000 --- a/src/api/nitro/session/HasHabboClub.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { GetSessionDataManager, HabboClubLevelEnum } from '@nitrots/nitro-renderer'; - -export function HasHabboClub(): boolean -{ - return (GetSessionDataManager().clubLevel >= HabboClubLevelEnum.CLUB); -} diff --git a/src/api/nitro/session/HasHabboVip.ts b/src/api/nitro/session/HasHabboVip.ts deleted file mode 100644 index f5a3e21..0000000 --- a/src/api/nitro/session/HasHabboVip.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { GetSessionDataManager, HabboClubLevelEnum } from '@nitrots/nitro-renderer'; - -export function HasHabboVip(): boolean -{ - return (GetSessionDataManager().clubLevel >= HabboClubLevelEnum.VIP); -} diff --git a/src/api/nitro/session/IsOwnerOfFloorFurniture.ts b/src/api/nitro/session/IsOwnerOfFloorFurniture.ts deleted file mode 100644 index 5675db9..0000000 --- a/src/api/nitro/session/IsOwnerOfFloorFurniture.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { GetRoomEngine, GetSessionDataManager, RoomObjectCategory, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { GetRoomSession } from './GetRoomSession'; - -export function IsOwnerOfFloorFurniture(id: number): boolean -{ - const roomObject = GetRoomEngine().getRoomObject(GetRoomSession().roomId, id, RoomObjectCategory.FLOOR); - - if(!roomObject || !roomObject.model) return false; - - const userId = GetSessionDataManager().userId; - const objectOwnerId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_OWNER_ID); - - return (userId === objectOwnerId); -} diff --git a/src/api/nitro/session/IsOwnerOfFurniture.ts b/src/api/nitro/session/IsOwnerOfFurniture.ts deleted file mode 100644 index 49ce166..0000000 --- a/src/api/nitro/session/IsOwnerOfFurniture.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { GetSessionDataManager, IRoomObject, RoomObjectVariable } from '@nitrots/nitro-renderer'; - -export function IsOwnerOfFurniture(roomObject: IRoomObject): boolean -{ - if(!roomObject || !roomObject.model) return false; - - const userId = GetSessionDataManager().userId; - const objectOwnerId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_OWNER_ID); - - return (userId === objectOwnerId); -} diff --git a/src/api/nitro/session/IsRidingHorse.ts b/src/api/nitro/session/IsRidingHorse.ts deleted file mode 100644 index f946b69..0000000 --- a/src/api/nitro/session/IsRidingHorse.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { GetOwnRoomObject } from '../room'; - -export function IsRidingHorse(): boolean -{ - const roomObject = GetOwnRoomObject(); - - if(!roomObject) return false; - - const model = roomObject.model; - const effectId = model.getValue(RoomObjectVariable.FIGURE_EFFECT); - - return (effectId === 77); -} diff --git a/src/api/nitro/session/StartRoomSession.ts b/src/api/nitro/session/StartRoomSession.ts deleted file mode 100644 index c203a77..0000000 --- a/src/api/nitro/session/StartRoomSession.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { GetRoomSessionManager, IRoomSession } from '@nitrots/nitro-renderer'; - -export function StartRoomSession(session: IRoomSession): void -{ - GetRoomSessionManager().startSession(session); -} diff --git a/src/api/nitro/session/VisitDesktop.ts b/src/api/nitro/session/VisitDesktop.ts deleted file mode 100644 index 9fe3fb7..0000000 --- a/src/api/nitro/session/VisitDesktop.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { GetRoomSessionManager } from '@nitrots/nitro-renderer'; -import { GetRoomSession } from './GetRoomSession'; -import { GoToDesktop } from './GoToDesktop'; - -export const VisitDesktop = () => -{ - if(!GetRoomSession()) return; - - GoToDesktop(); - GetRoomSessionManager().removeSession(-1); -} diff --git a/src/api/nitro/session/index.ts b/src/api/nitro/session/index.ts deleted file mode 100644 index 4c0491d..0000000 --- a/src/api/nitro/session/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -export * from './CanManipulateFurniture'; -export * from './CreateRoomSession'; -export * from './GetCanStandUp'; -export * from './GetCanUseExpression'; -export * from './GetClubMemberLevel'; -export * from './GetFurnitureData'; -export * from './GetFurnitureDataForProductOffer'; -export * from './GetFurnitureDataForRoomObject'; -export * from './GetOwnPosture'; -export * from './GetProductDataForLocalization'; -export * from './GetRoomSession'; -export * from './GoToDesktop'; -export * from './HasHabboClub'; -export * from './HasHabboVip'; -export * from './IsOwnerOfFloorFurniture'; -export * from './IsOwnerOfFurniture'; -export * from './IsRidingHorse'; -export * from './StartRoomSession'; -export * from './VisitDesktop'; diff --git a/src/api/notification/NotificationAlertItem.ts b/src/api/notification/NotificationAlertItem.ts deleted file mode 100644 index 2d7702c..0000000 --- a/src/api/notification/NotificationAlertItem.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { NotificationAlertType } from './NotificationAlertType'; - -export class NotificationAlertItem -{ - private static ITEM_ID: number = -1; - - private _id: number; - private _messages: string[]; - private _alertType: string; - private _clickUrl: string; - private _clickUrlText: string; - private _title: string; - private _imageUrl: string; - - constructor(messages: string[], alertType: string = NotificationAlertType.DEFAULT, clickUrl: string = null, clickUrlText: string = null, title: string = null, imageUrl: string = null) - { - NotificationAlertItem.ITEM_ID += 1; - - this._id = NotificationAlertItem.ITEM_ID; - this._messages = messages; - this._alertType = alertType; - this._clickUrl = clickUrl; - this._clickUrlText = clickUrlText; - this._title = title; - this._imageUrl = imageUrl; - } - - public get id(): number - { - return this._id; - } - - public get messages(): string[] - { - return this._messages; - } - - public set alertType(alertType: string) - { - this._alertType = alertType; - } - - public get alertType(): string - { - return this._alertType; - } - - public get clickUrl(): string - { - return this._clickUrl; - } - - public get clickUrlText(): string - { - return this._clickUrlText; - } - - public get title(): string - { - return this._title; - } - - public get imageUrl(): string - { - return this._imageUrl; - } -} diff --git a/src/api/notification/NotificationAlertType.ts b/src/api/notification/NotificationAlertType.ts deleted file mode 100644 index ad804e8..0000000 --- a/src/api/notification/NotificationAlertType.ts +++ /dev/null @@ -1,10 +0,0 @@ -export class NotificationAlertType -{ - public static DEFAULT: string = 'default'; - public static MOTD: string = 'motd'; - public static MODERATION: string = 'moderation'; - public static EVENT: string = 'event'; - public static NITRO: string = 'nitro'; - public static SEARCH: string = 'search'; - public static ALERT: string = 'alert'; -} diff --git a/src/api/notification/NotificationBubbleItem.ts b/src/api/notification/NotificationBubbleItem.ts deleted file mode 100644 index fe90dab..0000000 --- a/src/api/notification/NotificationBubbleItem.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { NotificationBubbleType } from './NotificationBubbleType'; - -export class NotificationBubbleItem -{ - private static ITEM_ID: number = -1; - - private _id: number; - private _message: string; - private _notificationType: string; - private _iconUrl: string; - private _linkUrl: string; - - constructor(message: string, notificationType: string = NotificationBubbleType.INFO, iconUrl: string = null, linkUrl: string = null) - { - NotificationBubbleItem.ITEM_ID += 1; - - this._id = NotificationBubbleItem.ITEM_ID; - this._message = message; - this._notificationType = notificationType; - this._iconUrl = iconUrl; - this._linkUrl = linkUrl; - } - - public get id(): number - { - return this._id; - } - - public get message(): string - { - return this._message; - } - - public get notificationType(): string - { - return this._notificationType; - } - - public get iconUrl(): string - { - return this._iconUrl; - } - - public get linkUrl(): string - { - return this._linkUrl; - } -} diff --git a/src/api/notification/NotificationBubbleType.ts b/src/api/notification/NotificationBubbleType.ts deleted file mode 100644 index cce38f5..0000000 --- a/src/api/notification/NotificationBubbleType.ts +++ /dev/null @@ -1,19 +0,0 @@ -export class NotificationBubbleType -{ - public static FRIENDOFFLINE: string = 'friendoffline'; - public static FRIENDONLINE: string = 'friendonline'; - public static THIRDPARTYFRIENDOFFLINE: string = 'thirdpartyfriendoffline'; - public static THIRDPARTYFRIENDONLINE: string = 'thirdpartyfriendonline'; - public static ACHIEVEMENT: string = 'achievement'; - public static BADGE_RECEIVED: string = 'badge_received'; - public static INFO: string = 'info'; - public static RECYCLEROK: string = 'recyclerok'; - public static RESPECT: string = 'respect'; - public static CLUB: string = 'club'; - public static SOUNDMACHINE: string = 'soundmachine'; - public static PETLEVEL: string = 'petlevel'; - public static CLUBGIFT: string = 'clubgift'; - public static BUYFURNI: string = 'buyfurni'; - public static VIP: string = 'vip'; - public static ROOMMESSAGESPOSTED: string = 'roommessagesposted'; -} diff --git a/src/api/notification/NotificationConfirmItem.ts b/src/api/notification/NotificationConfirmItem.ts deleted file mode 100644 index 0455662..0000000 --- a/src/api/notification/NotificationConfirmItem.ts +++ /dev/null @@ -1,67 +0,0 @@ -export class NotificationConfirmItem -{ - private static ITEM_ID: number = -1; - - private _id: number; - private _confirmType: string; - private _message: string; - private _onConfirm: Function; - private _onCancel: Function; - private _confirmText: string; - private _cancelText: string; - private _title: string; - - constructor(confirmType: string, message: string, onConfirm: Function, onCancel: Function, confirmText: string, cancelText: string, title: string) - { - NotificationConfirmItem.ITEM_ID += 1; - - this._id = NotificationConfirmItem.ITEM_ID; - this._confirmType = confirmType; - this._message = message; - this._onConfirm = onConfirm; - this._onCancel = onCancel; - this._confirmText = confirmText; - this._cancelText = cancelText; - this._title = title; - } - - public get id(): number - { - return this._id; - } - - public get confirmType(): string - { - return this._confirmType; - } - - public get message(): string - { - return this._message; - } - - public get onConfirm(): Function - { - return this._onConfirm; - } - - public get onCancel(): Function - { - return this._onCancel; - } - - public get confirmText(): string - { - return this._confirmText; - } - - public get cancelText(): string - { - return this._cancelText; - } - - public get title(): string - { - return this._title; - } -} diff --git a/src/api/notification/NotificationConfirmType.ts b/src/api/notification/NotificationConfirmType.ts deleted file mode 100644 index 533ca05..0000000 --- a/src/api/notification/NotificationConfirmType.ts +++ /dev/null @@ -1,4 +0,0 @@ -export class NotificationConfirmType -{ - public static DEFAULT: string = 'default'; -} diff --git a/src/api/notification/index.ts b/src/api/notification/index.ts deleted file mode 100644 index 23476d3..0000000 --- a/src/api/notification/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './NotificationAlertItem'; -export * from './NotificationAlertType'; -export * from './NotificationBubbleItem'; -export * from './NotificationBubbleType'; -export * from './NotificationConfirmItem'; -export * from './NotificationConfirmType'; diff --git a/src/api/purse/IPurse.ts b/src/api/purse/IPurse.ts deleted file mode 100644 index 9fffb18..0000000 --- a/src/api/purse/IPurse.ts +++ /dev/null @@ -1,15 +0,0 @@ -export interface IPurse -{ - credits: number; - activityPoints: Map; - clubDays: number; - clubPeriods: number; - hasClubLeft: boolean; - isVip: boolean; - pastClubDays: number; - pastVipDays: number; - isExpiring: boolean; - minutesUntilExpiration: number; - minutesSinceLastModified: number; - clubLevel: number; -} diff --git a/src/api/purse/Purse.ts b/src/api/purse/Purse.ts deleted file mode 100644 index 6970e59..0000000 --- a/src/api/purse/Purse.ts +++ /dev/null @@ -1,165 +0,0 @@ -import { GetTickerTime, HabboClubLevelEnum } from '@nitrots/nitro-renderer'; -import { IPurse } from './IPurse'; - -export class Purse implements IPurse -{ - private _credits: number = 0; - private _activityPoints: Map = new Map(); - private _clubDays: number = 0; - private _clubPeriods: number = 0; - private _isVIP: boolean = false; - private _pastClubDays: number = 0; - private _pastVipDays: number = 0; - private _isExpiring: boolean = false; - private _minutesUntilExpiration: number = 0; - private _minutesSinceLastModified: number = 0; - private _lastUpdated: number = 0; - - public static from(purse: Purse): Purse - { - const newPurse = new Purse(); - - newPurse._credits = purse._credits; - newPurse._activityPoints = purse._activityPoints; - newPurse._clubDays = purse._clubDays; - newPurse._clubPeriods = purse._clubPeriods; - newPurse._isVIP = purse._isVIP; - newPurse._pastClubDays = purse._pastClubDays; - newPurse._pastVipDays = purse._pastVipDays; - newPurse._isExpiring = purse._isExpiring; - newPurse._minutesUntilExpiration = purse._minutesUntilExpiration; - newPurse._minutesSinceLastModified = purse._minutesSinceLastModified; - newPurse._lastUpdated = purse._lastUpdated; - - return newPurse; - } - - public get credits(): number - { - return this._credits; - } - - public set credits(credits: number) - { - this._lastUpdated = GetTickerTime(); - this._credits = credits; - } - - public get activityPoints(): Map - { - return this._activityPoints; - } - - public set activityPoints(k: Map) - { - this._lastUpdated = GetTickerTime(); - this._activityPoints = k; - } - - public get clubDays(): number - { - return this._clubDays; - } - - public set clubDays(k: number) - { - this._lastUpdated = GetTickerTime(); - this._clubDays = k; - } - - public get clubPeriods(): number - { - return this._clubPeriods; - } - - public set clubPeriods(k: number) - { - this._lastUpdated = GetTickerTime(); - this._clubPeriods = k; - } - - public get hasClubLeft(): boolean - { - return (this._clubDays > 0) || (this._clubPeriods > 0); - } - - public get isVip(): boolean - { - return this._isVIP; - } - - public set isVip(k: boolean) - { - this._isVIP = k; - } - - public get pastClubDays(): number - { - return this._pastClubDays; - } - - public set pastClubDays(k: number) - { - this._lastUpdated = GetTickerTime(); - this._pastClubDays = k; - } - - public get pastVipDays(): number - { - return this._pastVipDays; - } - - public set pastVipDays(k: number) - { - this._lastUpdated = GetTickerTime(); - this._pastVipDays = k; - } - - public get isExpiring(): boolean - { - return this._isExpiring; - } - - public set isExpiring(k: boolean) - { - this._isExpiring = k; - } - - public get minutesUntilExpiration(): number - { - var k: number = ((GetTickerTime() - this._lastUpdated) / (1000 * 60)); - var _local_2: number = (this._minutesUntilExpiration - k); - return (_local_2 > 0) ? _local_2 : 0; - } - - public set minutesUntilExpiration(k: number) - { - this._lastUpdated = GetTickerTime(); - this._minutesUntilExpiration = k; - } - - public get minutesSinceLastModified(): number - { - return this._minutesSinceLastModified; - } - - public set minutesSinceLastModified(k: number) - { - this._lastUpdated = GetTickerTime(); - this._minutesSinceLastModified = k; - } - - public get lastUpdated(): number - { - return this._lastUpdated; - } - - public get clubLevel(): number - { - if(((this.clubDays === 0) && (this.clubPeriods === 0))) return HabboClubLevelEnum.NO_CLUB; - - if(this.isVip) return HabboClubLevelEnum.VIP; - - return HabboClubLevelEnum.CLUB; - } -} diff --git a/src/api/purse/index.ts b/src/api/purse/index.ts deleted file mode 100644 index ed34480..0000000 --- a/src/api/purse/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './IPurse'; -export * from './Purse'; diff --git a/src/api/room/events/RoomWidgetPollUpdateEvent.ts b/src/api/room/events/RoomWidgetPollUpdateEvent.ts deleted file mode 100644 index edfb8fd..0000000 --- a/src/api/room/events/RoomWidgetPollUpdateEvent.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { IPollQuestion } from '@nitrots/nitro-renderer'; -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetPollUpdateEvent extends RoomWidgetUpdateEvent -{ - public static readonly OFFER = 'RWPUW_OFFER'; - public static readonly ERROR = 'RWPUW_ERROR'; - public static readonly CONTENT = 'RWPUW_CONTENT'; - - private _id = -1; - private _summary: string; - private _headline: string; - private _numQuestions = 0; - private _startMessage = ''; - private _endMessage = ''; - private _questionArray: IPollQuestion[] = null; - private _pollType = ''; - private _npsPoll = false; - - constructor(type: string, id: number) - { - super(type); - this._id = id; - } - - public get id(): number - { - return this._id; - } - - public get summary(): string - { - return this._summary; - } - - public set summary(k: string) - { - this._summary = k; - } - - public get headline(): string - { - return this._headline; - } - - public set headline(k: string) - { - this._headline = 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 pollType(): string - { - return this._pollType; - } - - public set pollType(k: string) - { - this._pollType = k; - } - - public get npsPoll(): boolean - { - return this._npsPoll; - } - - public set npsPoll(k: boolean) - { - this._npsPoll = k; - } -} diff --git a/src/api/room/events/RoomWidgetUpdateBackgroundColorPreviewEvent.ts b/src/api/room/events/RoomWidgetUpdateBackgroundColorPreviewEvent.ts deleted file mode 100644 index 30135a3..0000000 --- a/src/api/room/events/RoomWidgetUpdateBackgroundColorPreviewEvent.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateBackgroundColorPreviewEvent extends RoomWidgetUpdateEvent -{ - public static PREVIEW = 'RWUBCPE_PREVIEW'; - public static CLEAR_PREVIEW = 'RWUBCPE_CLEAR_PREVIEW'; - - private _hue: number; - private _saturation: number; - private _lightness: number; - - constructor(type: string, hue: number = 0, saturation: number = 0, lightness: number = 0) - { - super(type); - - this._hue = hue; - this._saturation = saturation; - this._lightness = lightness; - } - - public get hue(): number - { - return this._hue; - } - - public get saturation(): number - { - return this._saturation; - } - - public get lightness(): number - { - return this._lightness; - } -} diff --git a/src/api/room/events/RoomWidgetUpdateChatInputContentEvent.ts b/src/api/room/events/RoomWidgetUpdateChatInputContentEvent.ts deleted file mode 100644 index 9352372..0000000 --- a/src/api/room/events/RoomWidgetUpdateChatInputContentEvent.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateChatInputContentEvent extends RoomWidgetUpdateEvent -{ - public static CHAT_INPUT_CONTENT: string = 'RWUCICE_CHAT_INPUT_CONTENT'; - public static WHISPER: string = 'whisper'; - public static SHOUT: string = 'shout'; - - private _chatMode: string = ''; - private _userName: string = ''; - - constructor(chatMode: string, userName: string) - { - super(RoomWidgetUpdateChatInputContentEvent.CHAT_INPUT_CONTENT); - - this._chatMode = chatMode; - this._userName = userName; - } - - public get chatMode(): string - { - return this._chatMode; - } - - public get userName(): string - { - return this._userName; - } -} diff --git a/src/api/room/events/RoomWidgetUpdateEvent.ts b/src/api/room/events/RoomWidgetUpdateEvent.ts deleted file mode 100644 index 0ac8ff8..0000000 --- a/src/api/room/events/RoomWidgetUpdateEvent.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class RoomWidgetUpdateEvent extends NitroEvent -{} diff --git a/src/api/room/events/RoomWidgetUpdateRentableBotChatEvent.ts b/src/api/room/events/RoomWidgetUpdateRentableBotChatEvent.ts deleted file mode 100644 index 6191e1b..0000000 --- a/src/api/room/events/RoomWidgetUpdateRentableBotChatEvent.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateRentableBotChatEvent extends RoomWidgetUpdateEvent -{ - public static UPDATE_CHAT: string = 'RWURBCE_UPDATE_CHAT'; - - private _objectId: number; - private _category: number; - private _botId: number; - private _chat: string; - private _automaticChat: boolean; - private _chatDelay: number; - private _mixSentences: boolean; - - constructor(objectId: number, category: number, botId: number, chat: string, automaticChat: boolean, chatDelay: number, mixSentences: boolean) - { - super(RoomWidgetUpdateRentableBotChatEvent.UPDATE_CHAT); - - this._objectId = objectId; - this._category = category; - this._botId = botId; - this._chat = chat; - this._automaticChat = automaticChat; - this._chatDelay = chatDelay; - this._mixSentences = mixSentences; - } - - public get objectId(): number - { - return this._objectId; - } - - public get category(): number - { - return this._category; - } - - public get botId(): number - { - return this._botId; - } - - public get chat(): string - { - return this._chat; - } - - public get automaticChat(): boolean - { - return this._automaticChat; - } - - public get chatDelay(): number - { - return this._chatDelay; - } - - public get mixSentences(): boolean - { - return this._mixSentences; - } -} diff --git a/src/api/room/events/RoomWidgetUpdateRoomObjectEvent.ts b/src/api/room/events/RoomWidgetUpdateRoomObjectEvent.ts deleted file mode 100644 index 0660276..0000000 --- a/src/api/room/events/RoomWidgetUpdateRoomObjectEvent.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateRoomObjectEvent extends RoomWidgetUpdateEvent -{ - public static OBJECT_SELECTED: string = 'RWUROE_OBJECT_SELECTED'; - public static OBJECT_DESELECTED: string = 'RWUROE_OBJECT_DESELECTED'; - public static USER_REMOVED: string = 'RWUROE_USER_REMOVED'; - public static FURNI_REMOVED: string = 'RWUROE_FURNI_REMOVED'; - public static FURNI_ADDED: string = 'RWUROE_FURNI_ADDED'; - public static USER_ADDED: string = 'RWUROE_USER_ADDED'; - public static OBJECT_ROLL_OVER: string = 'RWUROE_OBJECT_ROLL_OVER'; - public static OBJECT_ROLL_OUT: string = 'RWUROE_OBJECT_ROLL_OUT'; - public static OBJECT_REQUEST_MANIPULATION: string = 'RWUROE_OBJECT_REQUEST_MANIPULATION'; - public static OBJECT_DOUBLE_CLICKED: string = 'RWUROE_OBJECT_DOUBLE_CLICKED'; - - private _id: number; - private _category: number; - private _roomId: number; - - constructor(type: string, id: number, category: number, roomId: number) - { - super(type); - - this._id = id; - this._category = category; - this._roomId = roomId; - } - - public get id(): number - { - return this._id; - } - - public get category(): number - { - return this._category; - } - - public get roomId(): number - { - return this._roomId; - } -} diff --git a/src/api/room/events/index.ts b/src/api/room/events/index.ts deleted file mode 100644 index e5ed0d8..0000000 --- a/src/api/room/events/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './RoomWidgetPollUpdateEvent'; -export * from './RoomWidgetUpdateBackgroundColorPreviewEvent'; -export * from './RoomWidgetUpdateChatInputContentEvent'; -export * from './RoomWidgetUpdateEvent'; -export * from './RoomWidgetUpdateRentableBotChatEvent'; -export * from './RoomWidgetUpdateRoomObjectEvent'; diff --git a/src/api/room/index.ts b/src/api/room/index.ts deleted file mode 100644 index 56aea79..0000000 --- a/src/api/room/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './events'; -export * from './widgets'; diff --git a/src/api/room/widgets/AvatarInfoFurni.ts b/src/api/room/widgets/AvatarInfoFurni.ts deleted file mode 100644 index 47743e9..0000000 --- a/src/api/room/widgets/AvatarInfoFurni.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { IObjectData } from '@nitrots/nitro-renderer'; -import { IAvatarInfo } from './IAvatarInfo'; - -export class AvatarInfoFurni implements IAvatarInfo -{ - public static FURNI: string = 'IFI_FURNI'; - - public id: number = 0; - public category: number = 0; - public name: string = ''; - public description: string = ''; - public isWallItem: boolean = false; - public isStickie: boolean = false; - public isRoomOwner: boolean = false; - public roomControllerLevel: number = 0; - public isAnyRoomController: boolean = false; - public expiration: number = -1; - public purchaseCatalogPageId: number = -1; - public purchaseOfferId: number = -1; - public extraParam: string = ''; - public isOwner: boolean = false; - public stuffData: IObjectData = null; - public groupId: number = 0; - public ownerId: number = 0; - public ownerName: string = ''; - public usagePolicy: number = 0; - public rentCatalogPageId: number = -1; - public rentOfferId: number = -1; - public purchaseCouldBeUsedForBuyout: boolean = false; - public rentCouldBeUsedForBuyout: boolean = false; - public availableForBuildersClub: boolean = false; - public tileSizeX: number = 1; - public tileSizeY: number = 1; - - constructor(public readonly type: string) - {} -} diff --git a/src/api/room/widgets/AvatarInfoName.ts b/src/api/room/widgets/AvatarInfoName.ts deleted file mode 100644 index 66a6a7e..0000000 --- a/src/api/room/widgets/AvatarInfoName.ts +++ /dev/null @@ -1,11 +0,0 @@ -export class AvatarInfoName -{ - constructor( - public readonly roomIndex: number, - public readonly category: number, - public readonly id: number, - public readonly name: string, - public readonly userType: number, - public readonly isFriend: boolean = false) - {} -} diff --git a/src/api/room/widgets/AvatarInfoPet.ts b/src/api/room/widgets/AvatarInfoPet.ts deleted file mode 100644 index 0c0435a..0000000 --- a/src/api/room/widgets/AvatarInfoPet.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { IAvatarInfo } from './IAvatarInfo'; - -export class AvatarInfoPet implements IAvatarInfo -{ - public static PET_INFO: string = 'IPI_PET_INFO'; - - public level: number = 0; - public maximumLevel: number = 0; - public experience: number = 0; - public levelExperienceGoal: number = 0; - public energy: number = 0; - public maximumEnergy: number = 0; - public happyness: number = 0; - public maximumHappyness: number = 0; - public respectsPetLeft: number = 0; - public respect: number = 0; - public age: number = 0; - public name: string = ''; - public id: number = -1; - public image: HTMLImageElement = null; - public petType: number = 0; - public petBreed: number = 0; - public petFigure: string = ''; - public posture: string = 'std'; - public isOwner: boolean = false; - public ownerId: number = -1; - public ownerName: string = ''; - public canRemovePet: boolean = false; - public roomIndex: number = 0; - public unknownRarityLevel: number = 0; - public saddle: boolean = false; - public rider: boolean = false; - public breedable: boolean = false; - public skillTresholds: number[] = []; - public publiclyRideable: number = 0; - public fullyGrown: boolean = false; - public dead: boolean = false; - public rarityLevel: number = 0; - public maximumTimeToLive: number = 0; - public remainingTimeToLive: number = 0; - public remainingGrowTime: number = 0; - public publiclyBreedable: boolean = false; - - constructor(public readonly type: string) - {} -} diff --git a/src/api/room/widgets/AvatarInfoRentableBot.ts b/src/api/room/widgets/AvatarInfoRentableBot.ts deleted file mode 100644 index 77fb10c..0000000 --- a/src/api/room/widgets/AvatarInfoRentableBot.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { IAvatarInfo } from './IAvatarInfo'; - -export class AvatarInfoRentableBot implements IAvatarInfo -{ - public static RENTABLE_BOT: string = 'IRBI_RENTABLE_BOT'; - - public name: string = ''; - public motto: string = ''; - public webID: number = 0; - public figure: string = ''; - public badges: string[] = []; - public carryItem: number = 0; - public roomIndex: number = 0; - public amIOwner: boolean = false; - public amIAnyRoomController: boolean = false; - public roomControllerLevel: number = 0; - public ownerId: number = -1; - public ownerName: string = ''; - public botSkills: number[] = []; - - constructor(public readonly type: string) - {} -} diff --git a/src/api/room/widgets/AvatarInfoUser.ts b/src/api/room/widgets/AvatarInfoUser.ts deleted file mode 100644 index 270bfbd..0000000 --- a/src/api/room/widgets/AvatarInfoUser.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { IAvatarInfo } from './IAvatarInfo'; - -export class AvatarInfoUser implements IAvatarInfo -{ - public static OWN_USER: string = 'IUI_OWN_USER'; - public static PEER: string = 'IUI_PEER'; - public static BOT: string = 'IUI_BOT'; - public static TRADE_REASON_OK: number = 0; - public static TRADE_REASON_SHUTDOWN: number = 2; - public static TRADE_REASON_NO_TRADING: number = 3; - public static DEFAULT_BOT_BADGE_ID: string = 'BOT'; - - public name: string = ''; - public motto: string = ''; - public achievementScore: number = 0; - public webID: number = 0; - public xp: number = 0; - public userType: number = -1; - public figure: string = ''; - public badges: string[] = []; - public groupId: number = 0; - public groupName: string = ''; - public groupBadgeId: string = ''; - public carryItem: number = 0; - public roomIndex: number = 0; - public isSpectatorMode: boolean = false; - public allowNameChange: boolean = false; - public amIOwner: boolean = false; - public amIAnyRoomController: boolean = false; - public roomControllerLevel: number = 0; - public canBeKicked: boolean = false; - public canBeBanned: boolean = false; - public canBeMuted: boolean = false; - public respectLeft: number = 0; - public isIgnored: boolean = false; - public isGuildRoom: boolean = false; - public canTrade: boolean = false; - public canTradeReason: number = 0; - public targetRoomControllerLevel: number = 0; - public isAmbassador: boolean = false; - - constructor(public readonly type: string) - {} - - public get isOwnUser(): boolean - { - return (this.type === AvatarInfoUser.OWN_USER); - } -} diff --git a/src/api/room/widgets/AvatarInfoUtilities.ts b/src/api/room/widgets/AvatarInfoUtilities.ts deleted file mode 100644 index b670bde..0000000 --- a/src/api/room/widgets/AvatarInfoUtilities.ts +++ /dev/null @@ -1,439 +0,0 @@ -import { GetRoomEngine, GetSessionDataManager, GetTickerTime, IFurnitureData, IRoomModerationSettings, IRoomPetData, IRoomUserData, ObjectDataFactory, PetFigureData, PetType, RoomControllerLevel, RoomModerationSettings, RoomObjectCategory, RoomObjectType, RoomObjectVariable, RoomTradingLevelEnum, RoomWidgetEnumItemExtradataParameter } from '@nitrots/nitro-renderer'; -import { GetRoomSession, IsOwnerOfFurniture } from '../../nitro'; -import { LocalizeText } from '../../utils'; -import { AvatarInfoFurni } from './AvatarInfoFurni'; -import { AvatarInfoName } from './AvatarInfoName'; -import { AvatarInfoPet } from './AvatarInfoPet'; -import { AvatarInfoRentableBot } from './AvatarInfoRentableBot'; -import { AvatarInfoUser } from './AvatarInfoUser'; - -export class AvatarInfoUtilities -{ - public static getObjectName(objectId: number, category: number): AvatarInfoName - { - const roomSession = GetRoomSession(); - - let id = -1; - let name: string = null; - let userType = 0; - - switch(category) - { - case RoomObjectCategory.FLOOR: - case RoomObjectCategory.WALL: { - const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, objectId, category); - - if(!roomObject) break; - - if(roomObject.type.indexOf('poster') === 0) - { - name = LocalizeText('${poster_' + parseInt(roomObject.type.replace('poster', '')) + '_name}'); - } - else - { - let furniData: IFurnitureData = null; - - const typeId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); - - if(category === RoomObjectCategory.FLOOR) - { - furniData = GetSessionDataManager().getFloorItemData(typeId); - } - - else if(category === RoomObjectCategory.WALL) - { - furniData = GetSessionDataManager().getWallItemData(typeId); - } - - if(!furniData) break; - - id = furniData.id; - name = furniData.name; - } - break; - } - case RoomObjectCategory.UNIT: { - const userData = roomSession.userDataManager.getUserDataByIndex(objectId); - - if(!userData) break; - - id = userData.webID; - name = userData.name; - userType = userData.type; - break; - } - } - - if(!name || !name.length) return null; - - return new AvatarInfoName(objectId, category, id, name, userType); - } - - public static getFurniInfo(objectId: number, category: number): AvatarInfoFurni - { - const roomSession = GetRoomSession(); - const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, objectId, category); - - if(!roomObject) return null; - - const furniInfo = new AvatarInfoFurni(AvatarInfoFurni.FURNI); - - furniInfo.id = objectId; - furniInfo.category = category; - - const model = roomObject.model; - - if(model.getValue(RoomWidgetEnumItemExtradataParameter.INFOSTAND_EXTRA_PARAM)) furniInfo.extraParam = model.getValue(RoomWidgetEnumItemExtradataParameter.INFOSTAND_EXTRA_PARAM); - - const objectData = ObjectDataFactory.getData(model.getValue(RoomObjectVariable.FURNITURE_DATA_FORMAT)); - - objectData.initializeFromRoomObjectModel(model); - - furniInfo.stuffData = objectData; - - const objectType = roomObject.type; - - if(objectType.indexOf('poster') === 0) - { - const posterId = parseInt(objectType.replace('poster', '')); - - furniInfo.name = LocalizeText(('${poster_' + posterId) + '_name}'); - furniInfo.description = LocalizeText(('${poster_' + posterId) + '_desc}'); - } - else - { - const typeId = model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); - - let furnitureData: IFurnitureData = null; - - if(category === RoomObjectCategory.FLOOR) - { - furnitureData = GetSessionDataManager().getFloorItemData(typeId); - } - - else if(category === RoomObjectCategory.WALL) - { - furnitureData = GetSessionDataManager().getWallItemData(typeId); - } - - if(furnitureData) - { - furniInfo.name = furnitureData.name; - furniInfo.description = furnitureData.description; - furniInfo.purchaseOfferId = furnitureData.purchaseOfferId; - furniInfo.purchaseCouldBeUsedForBuyout = furnitureData.purchaseCouldBeUsedForBuyout; - furniInfo.rentOfferId = furnitureData.rentOfferId; - furniInfo.rentCouldBeUsedForBuyout = furnitureData.rentCouldBeUsedForBuyout; - furniInfo.availableForBuildersClub = furnitureData.availableForBuildersClub; - furniInfo.tileSizeX = furnitureData.tileSizeX; - furniInfo.tileSizeY = furnitureData.tileSizeY; - } - } - - if(objectType.indexOf('post_it') > -1) furniInfo.isStickie = true; - - const expiryTime = model.getValue(RoomObjectVariable.FURNITURE_EXPIRY_TIME); - const expiryTimestamp = model.getValue(RoomObjectVariable.FURNITURE_EXPIRTY_TIMESTAMP); - - furniInfo.expiration = ((expiryTime < 0) ? expiryTime : Math.max(0, (expiryTime - ((GetTickerTime() - expiryTimestamp) / 1000)))); - - /* let roomObjectImage = GetRoomEngine().getRoomObjectImage(roomSession.roomId, objectId, category, new Vector3d(180), 64, null); - - if(!roomObjectImage.data || (roomObjectImage.data.width > 140) || (roomObjectImage.data.height > 200)) - { - roomObjectImage = GetRoomEngine().getRoomObjectImage(roomSession.roomId, objectId, category, new Vector3d(180), 1, null); - } - - furniInfo.image = roomObjectImage.getImage(); */ - furniInfo.isWallItem = (category === RoomObjectCategory.WALL); - furniInfo.isRoomOwner = roomSession.isRoomOwner; - furniInfo.roomControllerLevel = roomSession.controllerLevel; - furniInfo.isAnyRoomController = GetSessionDataManager().isModerator; - furniInfo.ownerId = model.getValue(RoomObjectVariable.FURNITURE_OWNER_ID); - furniInfo.ownerName = model.getValue(RoomObjectVariable.FURNITURE_OWNER_NAME); - furniInfo.usagePolicy = model.getValue(RoomObjectVariable.FURNITURE_USAGE_POLICY); - - const guildId = model.getValue(RoomObjectVariable.FURNITURE_GUILD_CUSTOMIZED_GUILD_ID); - - if(guildId !== 0) furniInfo.groupId = guildId; - - if(IsOwnerOfFurniture(roomObject)) furniInfo.isOwner = true; - - return furniInfo; - } - - public static getUserInfo(category: number, userData: IRoomUserData): AvatarInfoUser - { - const roomSession = GetRoomSession(); - - const userInfo = new AvatarInfoUser((userData.webID === GetSessionDataManager().userId) ? AvatarInfoUser.OWN_USER : AvatarInfoUser.PEER); - - userInfo.isSpectatorMode = roomSession.isSpectator; - userInfo.name = userData.name; - userInfo.motto = userData.custom; - userInfo.achievementScore = userData.activityPoints; - userInfo.webID = userData.webID; - userInfo.roomIndex = userData.roomIndex; - userInfo.userType = RoomObjectType.USER; - - const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, userData.roomIndex, category); - - if(roomObject) userInfo.carryItem = (roomObject.model.getValue(RoomObjectVariable.FIGURE_CARRY_OBJECT) || 0); - - if(userInfo.type === AvatarInfoUser.OWN_USER) userInfo.allowNameChange = GetSessionDataManager().canChangeName; - - userInfo.amIOwner = roomSession.isRoomOwner; - userInfo.isGuildRoom = roomSession.isGuildRoom; - userInfo.roomControllerLevel = roomSession.controllerLevel; - userInfo.amIAnyRoomController = GetSessionDataManager().isModerator; - userInfo.isAmbassador = GetSessionDataManager().isAmbassador; - - if(userInfo.type === AvatarInfoUser.PEER) - { - if(roomObject) - { - userInfo.targetRoomControllerLevel = roomObject.model.getValue(RoomObjectVariable.FIGURE_FLAT_CONTROL); - userInfo.canBeMuted = this.canBeMuted(userInfo); - userInfo.canBeKicked = this.canBeKicked(userInfo); - userInfo.canBeBanned = this.canBeBanned(userInfo); - } - - userInfo.isIgnored = GetSessionDataManager().isUserIgnored(userData.name); - userInfo.respectLeft = GetSessionDataManager().respectsLeft; - - const isShuttingDown = GetSessionDataManager().isSystemShutdown; - const tradeMode = roomSession.tradeMode; - - if(isShuttingDown) - { - userInfo.canTrade = false; - } - else - { - switch(tradeMode) - { - case RoomTradingLevelEnum.ROOM_CONTROLLER_REQUIRED: { - const roomController = ((userInfo.roomControllerLevel !== RoomControllerLevel.NONE) && (userInfo.roomControllerLevel !== RoomControllerLevel.GUILD_MEMBER)); - const targetController = ((userInfo.targetRoomControllerLevel !== RoomControllerLevel.NONE) && (userInfo.targetRoomControllerLevel !== RoomControllerLevel.GUILD_MEMBER)); - - userInfo.canTrade = (roomController || targetController); - break; - } - case RoomTradingLevelEnum.FREE_TRADING: - userInfo.canTrade = true; - break; - default: - userInfo.canTrade = false; - break; - } - } - - userInfo.canTradeReason = AvatarInfoUser.TRADE_REASON_OK; - - if(isShuttingDown) userInfo.canTradeReason = AvatarInfoUser.TRADE_REASON_SHUTDOWN; - - if(tradeMode !== RoomTradingLevelEnum.FREE_TRADING) userInfo.canTradeReason = AvatarInfoUser.TRADE_REASON_NO_TRADING; - - // const _local_12 = GetSessionDataManager().userId; - // _local_13 = GetSessionDataManager().getUserTags(_local_12); - // this._Str_16287(_local_12, _local_13); - } - - userInfo.groupId = userData.groupId; - userInfo.groupBadgeId = GetSessionDataManager().getGroupBadge(userInfo.groupId); - userInfo.groupName = userData.groupName; - userInfo.badges = roomSession.userDataManager.getUserBadges(userData.webID); - userInfo.figure = userData.figure; - //var _local_8:Array = GetSessionDataManager().getUserTags(userData.webID); - //this._Str_16287(userData.webId, _local_8); - //this._container.habboGroupsManager.updateVisibleExtendedProfile(userData.webID); - //this._container.connection.send(new GetRelationshipStatusInfoMessageComposer(userData.webId)); - - return userInfo; - } - - public static getBotInfo(category: number, userData: IRoomUserData): AvatarInfoUser - { - const roomSession = GetRoomSession(); - const userInfo = new AvatarInfoUser(AvatarInfoUser.BOT); - - userInfo.name = userData.name; - userInfo.motto = userData.custom; - userInfo.webID = userData.webID; - userInfo.roomIndex = userData.roomIndex; - userInfo.userType = userData.type; - - const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, userData.roomIndex, category); - - if(roomObject) userInfo.carryItem = (roomObject.model.getValue(RoomObjectVariable.FIGURE_CARRY_OBJECT) || 0); - - userInfo.amIOwner = roomSession.isRoomOwner; - userInfo.isGuildRoom = roomSession.isGuildRoom; - userInfo.roomControllerLevel = roomSession.controllerLevel; - userInfo.amIAnyRoomController = GetSessionDataManager().isModerator; - userInfo.isAmbassador = GetSessionDataManager().isAmbassador; - userInfo.badges = [ AvatarInfoUser.DEFAULT_BOT_BADGE_ID ]; - userInfo.figure = userData.figure; - - return userInfo; - } - - public static getRentableBotInfo(category: number, userData: IRoomUserData): AvatarInfoRentableBot - { - const roomSession = GetRoomSession(); - const botInfo = new AvatarInfoRentableBot(AvatarInfoRentableBot.RENTABLE_BOT); - - botInfo.name = userData.name; - botInfo.motto = userData.custom; - botInfo.webID = userData.webID; - botInfo.roomIndex = userData.roomIndex; - botInfo.ownerId = userData.ownerId; - botInfo.ownerName = userData.ownerName; - botInfo.botSkills = userData.botSkills; - - const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, userData.roomIndex, category); - - if(roomObject) botInfo.carryItem = (roomObject.model.getValue(RoomObjectVariable.FIGURE_CARRY_OBJECT) || 0); - - botInfo.amIOwner = roomSession.isRoomOwner; - botInfo.roomControllerLevel = roomSession.controllerLevel; - botInfo.amIAnyRoomController = GetSessionDataManager().isModerator; - botInfo.badges = [ AvatarInfoUser.DEFAULT_BOT_BADGE_ID ]; - botInfo.figure = userData.figure; - - return botInfo; - } - - public static getPetInfo(petData: IRoomPetData): AvatarInfoPet - { - const roomSession = GetRoomSession(); - const userData = roomSession.userDataManager.getPetData(petData.id); - - if(!userData) return; - - const figure = new PetFigureData(userData.figure); - - let posture: string = null; - - if(figure.typeId === PetType.MONSTERPLANT) - { - if(petData.level >= petData.adultLevel) posture = 'std'; - else posture = ('grw' + petData.level); - } - - const isOwner = (petData.ownerId === GetSessionDataManager().userId); - const petInfo = new AvatarInfoPet(AvatarInfoPet.PET_INFO); - - petInfo.name = userData.name; - petInfo.id = petData.id; - petInfo.ownerId = petData.ownerId; - petInfo.ownerName = petData.ownerName; - petInfo.rarityLevel = petData.rarityLevel; - petInfo.petType = figure.typeId; - petInfo.petBreed = figure.paletteId; - petInfo.petFigure = userData.figure; - petInfo.posture = posture; - petInfo.isOwner = isOwner; - petInfo.roomIndex = userData.roomIndex; - petInfo.level = petData.level; - petInfo.maximumLevel = petData.maximumLevel; - petInfo.experience = petData.experience; - petInfo.levelExperienceGoal = petData.levelExperienceGoal; - petInfo.energy = petData.energy; - petInfo.maximumEnergy = petData.maximumEnergy; - petInfo.happyness = petData.happyness; - petInfo.maximumHappyness = petData.maximumHappyness; - petInfo.respect = petData.respect; - petInfo.respectsPetLeft = GetSessionDataManager().respectsPetLeft; - petInfo.age = petData.age; - petInfo.saddle = petData.saddle; - petInfo.rider = petData.rider; - petInfo.breedable = petData.breedable; - petInfo.fullyGrown = petData.fullyGrown; - petInfo.dead = petData.dead; - petInfo.rarityLevel = petData.rarityLevel; - petInfo.skillTresholds = petData.skillTresholds; - petInfo.canRemovePet = false; - petInfo.publiclyRideable = petData.publiclyRideable; - petInfo.maximumTimeToLive = petData.maximumTimeToLive; - petInfo.remainingTimeToLive = petData.remainingTimeToLive; - petInfo.remainingGrowTime = petData.remainingGrowTime; - petInfo.publiclyBreedable = petData.publiclyBreedable; - - if(isOwner || roomSession.isRoomOwner || GetSessionDataManager().isModerator || (roomSession.controllerLevel >= RoomControllerLevel.GUEST)) petInfo.canRemovePet = true; - - return petInfo; - } - - private static checkGuildSetting(userInfo: AvatarInfoUser): boolean - { - if(userInfo.isGuildRoom) return (userInfo.roomControllerLevel >= RoomControllerLevel.GUILD_ADMIN); - - return (userInfo.roomControllerLevel >= RoomControllerLevel.GUEST); - } - - private static isValidSetting(userInfo: AvatarInfoUser, checkSetting: (userInfo: AvatarInfoUser, moderation: IRoomModerationSettings) => boolean): boolean - { - const roomSession = GetRoomSession(); - - if(!roomSession.isPrivateRoom) return false; - - const moderation = roomSession.moderationSettings; - - let flag = false; - - if(moderation) flag = checkSetting(userInfo, moderation); - - return (flag && (userInfo.targetRoomControllerLevel < RoomControllerLevel.ROOM_OWNER)); - } - - private static canBeMuted(userInfo: AvatarInfoUser): boolean - { - const checkSetting = (userInfo: AvatarInfoUser, moderation: IRoomModerationSettings) => - { - switch(moderation.allowMute) - { - case RoomModerationSettings.MODERATION_LEVEL_USER_WITH_RIGHTS: - return this.checkGuildSetting(userInfo); - default: - return (userInfo.roomControllerLevel >= RoomControllerLevel.ROOM_OWNER); - } - } - - return this.isValidSetting(userInfo, checkSetting); - } - - private static canBeKicked(userInfo: AvatarInfoUser): boolean - { - const checkSetting = (userInfo: AvatarInfoUser, moderation: IRoomModerationSettings) => - { - switch(moderation.allowKick) - { - case RoomModerationSettings.MODERATION_LEVEL_ALL: - return true; - case RoomModerationSettings.MODERATION_LEVEL_USER_WITH_RIGHTS: - return this.checkGuildSetting(userInfo); - default: - return (userInfo.roomControllerLevel >= RoomControllerLevel.ROOM_OWNER); - } - } - - return this.isValidSetting(userInfo, checkSetting); - } - - private static canBeBanned(userInfo: AvatarInfoUser): boolean - { - const checkSetting = (userInfo: AvatarInfoUser, moderation: IRoomModerationSettings) => - { - switch(moderation.allowBan) - { - case RoomModerationSettings.MODERATION_LEVEL_USER_WITH_RIGHTS: - return this.checkGuildSetting(userInfo); - default: - return (userInfo.roomControllerLevel >= RoomControllerLevel.ROOM_OWNER); - } - } - - return this.isValidSetting(userInfo, checkSetting); - } -} diff --git a/src/api/room/widgets/BotSkillsEnum.ts b/src/api/room/widgets/BotSkillsEnum.ts deleted file mode 100644 index b879cdc..0000000 --- a/src/api/room/widgets/BotSkillsEnum.ts +++ /dev/null @@ -1,18 +0,0 @@ -export class BotSkillsEnum -{ - public static GENERIC_SKILL: number = 0; - public static DRESS_UP: number = 1; - public static SETUP_CHAT: number = 2; - public static RANDOM_WALK: number = 3; - public static DANCE: number = 4; - public static CHANGE_BOT_NAME: number = 5; - public static SERVE_BEVERAGE: number = 6; - public static INCLIENT_LINK: number = 7; - public static NUX_PROCEED: number = 8; - public static CHANGE_BOT_MOTTO: number = 9; - public static NUX_TAKE_TOUR: number = 10; - public static NO_PICK_UP: number = 12; - public static NAVIGATOR_SEARCH: number = 14; - public static DONATE_TO_USER: number = 24; - public static DONATE_TO_ALL: number = 25; -} diff --git a/src/api/room/widgets/ChatBubbleMessage.ts b/src/api/room/widgets/ChatBubbleMessage.ts deleted file mode 100644 index 44d848c..0000000 --- a/src/api/room/widgets/ChatBubbleMessage.ts +++ /dev/null @@ -1,54 +0,0 @@ -export class ChatBubbleMessage -{ - public static BUBBLE_COUNTER: number = 0; - - public id: number = -1; - public width: number = 0; - public height: number = 0; - public elementRef: HTMLDivElement = null; - public skipMovement: boolean = false; - - private _top: number = 0; - private _left: number = 0; - - constructor( - public senderId: number = -1, - public senderCategory: number = -1, - public roomId: number = -1, - public text: string = '', - public formattedText: string = '', - public username: string = '', - public location: { x: number, y: number } = null, - public type: number = 0, - public styleId: number = 0, - public imageUrl: string = null, - public color: string = null - ) - { - this.id = ++ChatBubbleMessage.BUBBLE_COUNTER; - } - - public get top(): number - { - return this._top; - } - - public set top(value: number) - { - this._top = value; - - if(this.elementRef) this.elementRef.style.top = (this._top + 'px'); - } - - public get left(): number - { - return this._left; - } - - public set left(value: number) - { - this._left = value; - - if(this.elementRef) this.elementRef.style.left = (this._left + 'px'); - } -} diff --git a/src/api/room/widgets/ChatBubbleUtilities.ts b/src/api/room/widgets/ChatBubbleUtilities.ts deleted file mode 100644 index 0ccbb14..0000000 --- a/src/api/room/widgets/ChatBubbleUtilities.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AvatarFigurePartType, AvatarScaleType, AvatarSetType, GetAvatarRenderManager, GetRoomEngine, PetFigureData, TextureUtils, Vector3d } from '@nitrots/nitro-renderer'; - -export class ChatBubbleUtilities -{ - public static AVATAR_COLOR_CACHE: Map = new Map(); - public static AVATAR_IMAGE_CACHE: Map = new Map(); - public static PET_IMAGE_CACHE: Map = new Map(); - - private static placeHolderImageUrl: string = ''; - - public static async setFigureImage(figure: string): Promise - { - const avatarImage = GetAvatarRenderManager().createAvatarImage(figure, AvatarScaleType.LARGE, null, { - resetFigure: figure => this.setFigureImage(figure), - dispose: () => - {}, - disposed: false - }); - - if(!avatarImage) return null; - - const isPlaceholder = avatarImage.isPlaceholder(); - - if(isPlaceholder && this.placeHolderImageUrl?.length) return this.placeHolderImageUrl; - - figure = avatarImage.getFigure().getFigureString(); - - const imageUrl = avatarImage.processAsImageUrl(AvatarSetType.HEAD); - const color = avatarImage.getPartColor(AvatarFigurePartType.CHEST); - - if(isPlaceholder) this.placeHolderImageUrl = imageUrl; - - this.AVATAR_COLOR_CACHE.set(figure, ((color && color.rgb) || 16777215)); - this.AVATAR_IMAGE_CACHE.set(figure, imageUrl); - - avatarImage.dispose(); - - return imageUrl; - } - - public static async getUserImage(figure: string): Promise - { - let existing = this.AVATAR_IMAGE_CACHE.get(figure); - - if(!existing) existing = await this.setFigureImage(figure); - - return existing; - } - - public static async getPetImage(figure: string, direction: number, _arg_3: boolean, scale: number = 64, posture: string = null) - { - let existing = this.PET_IMAGE_CACHE.get((figure + posture)); - - if(existing) return existing; - - const figureData = new PetFigureData(figure); - const typeId = figureData.typeId; - const image = GetRoomEngine().getRoomObjectPetImage(typeId, figureData.paletteId, figureData.color, new Vector3d((direction * 45)), scale, null, false, 0, figureData.customParts, posture); - - if(image) - { - existing = await TextureUtils.generateImageUrl(image.data); - - this.PET_IMAGE_CACHE.set((figure + posture), existing); - } - - return existing; - } -} diff --git a/src/api/room/widgets/ChatMessageTypeEnum.ts b/src/api/room/widgets/ChatMessageTypeEnum.ts deleted file mode 100644 index 1a5296b..0000000 --- a/src/api/room/widgets/ChatMessageTypeEnum.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class ChatMessageTypeEnum -{ - public static CHAT_DEFAULT: number = 0; - public static CHAT_WHISPER: number = 1; - public static CHAT_SHOUT: number = 2; -} diff --git a/src/api/room/widgets/DimmerFurnitureWidgetPresetItem.ts b/src/api/room/widgets/DimmerFurnitureWidgetPresetItem.ts deleted file mode 100644 index 1a2759f..0000000 --- a/src/api/room/widgets/DimmerFurnitureWidgetPresetItem.ts +++ /dev/null @@ -1,9 +0,0 @@ -export class DimmerFurnitureWidgetPresetItem -{ - constructor( - public id: number = 0, - public type: number = 0, - public color: number = 0, - public light: number = 0) - {} -} diff --git a/src/api/room/widgets/DoChatsOverlap.ts b/src/api/room/widgets/DoChatsOverlap.ts deleted file mode 100644 index 092ce5d..0000000 --- a/src/api/room/widgets/DoChatsOverlap.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ChatBubbleMessage } from './ChatBubbleMessage'; - -export const DoChatsOverlap = (a: ChatBubbleMessage, b: ChatBubbleMessage, additionalBTop: number, padding: number = 0) => -{ - return !((((a.left + padding) + a.width) < (b.left + padding)) || ((a.left + padding) > ((b.left + padding) + b.width)) || ((a.top + a.height) < (b.top + additionalBTop)) || (a.top > ((b.top + additionalBTop) + b.height))); -} - \ No newline at end of file diff --git a/src/api/room/widgets/FurnitureDimmerUtilities.ts b/src/api/room/widgets/FurnitureDimmerUtilities.ts deleted file mode 100644 index f55fc87..0000000 --- a/src/api/room/widgets/FurnitureDimmerUtilities.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { GetRoomEngine } from '@nitrots/nitro-renderer'; -import { GetRoomSession } from '../../nitro'; - -export class FurnitureDimmerUtilities -{ - public static AVAILABLE_COLORS: number[] = [ 7665141, 21495, 15161822, 15353138, 15923281, 8581961, 0 ]; - public static HTML_COLORS: string[] = [ '#74F5F5', '#0053F7', '#E759DE', '#EA4532', '#F2F851', '#82F349', '#000000' ]; - public static MIN_BRIGHTNESS: number = 76; - public static MAX_BRIGHTNESS: number = 255; - - public static savePreset(presetNumber: number, effectTypeId: number, color: number, brightness: number, apply: boolean): void - { - GetRoomSession().updateMoodlightData(presetNumber, effectTypeId, color, brightness, apply); - } - - public static changeState(): void - { - GetRoomSession().toggleMoodlightState(); - } - - public static previewDimmer(color: number, brightness: number, bgOnly: boolean): void - { - GetRoomEngine().updateObjectRoomColor(GetRoomSession().roomId, color, brightness, bgOnly); - } - - public static scaleBrightness(value: number): number - { - return ~~((((value - this.MIN_BRIGHTNESS) * (100 - 0)) / (this.MAX_BRIGHTNESS - this.MIN_BRIGHTNESS)) + 0); - } -} diff --git a/src/api/room/widgets/GetDiskColor.ts b/src/api/room/widgets/GetDiskColor.ts deleted file mode 100644 index 989f294..0000000 --- a/src/api/room/widgets/GetDiskColor.ts +++ /dev/null @@ -1,37 +0,0 @@ -const DISK_COLOR_RED_MIN: number = 130; -const DISK_COLOR_RED_RANGE: number = 100; -const DISK_COLOR_GREEN_MIN: number = 130; -const DISK_COLOR_GREEN_RANGE: number = 100; -const DISK_COLOR_BLUE_MIN: number = 130; -const DISK_COLOR_BLUE_RANGE: number = 100; - -export const GetDiskColor = (name: string) => -{ - let r: number = 0; - let g: number = 0; - let b: number = 0; - let index: number = 0; - - while (index < name.length) - { - switch ((index % 3)) - { - case 0: - r = (r + ( name.charCodeAt(index) * 37) ); - break; - case 1: - g = (g + ( name.charCodeAt(index) * 37) ); - break; - case 2: - b = (b + ( name.charCodeAt(index) * 37) ); - break; - } - index++; - } - - r = ((r % DISK_COLOR_RED_RANGE) + DISK_COLOR_RED_MIN); - g = ((g % DISK_COLOR_GREEN_RANGE) + DISK_COLOR_GREEN_MIN); - b = ((b % DISK_COLOR_BLUE_RANGE) + DISK_COLOR_BLUE_MIN); - - return `rgb(${ r },${ g },${ b })`; -} diff --git a/src/api/room/widgets/IAvatarInfo.ts b/src/api/room/widgets/IAvatarInfo.ts deleted file mode 100644 index 23fb47b..0000000 --- a/src/api/room/widgets/IAvatarInfo.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface IAvatarInfo -{ - type: string; -} diff --git a/src/api/room/widgets/ICraftingIngredient.ts b/src/api/room/widgets/ICraftingIngredient.ts deleted file mode 100644 index cb2b031..0000000 --- a/src/api/room/widgets/ICraftingIngredient.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface ICraftingIngredient -{ - name: string; - iconUrl: string; - count: number; -} diff --git a/src/api/room/widgets/ICraftingRecipe.ts b/src/api/room/widgets/ICraftingRecipe.ts deleted file mode 100644 index dd99291..0000000 --- a/src/api/room/widgets/ICraftingRecipe.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface ICraftingRecipe -{ - name: string; - localizedName: string; - iconUrl: string; -} diff --git a/src/api/room/widgets/IPhotoData.ts b/src/api/room/widgets/IPhotoData.ts deleted file mode 100644 index 9a7b846..0000000 --- a/src/api/room/widgets/IPhotoData.ts +++ /dev/null @@ -1,42 +0,0 @@ -export interface IPhotoData -{ - /** - * creator username - */ - n?: string; - - /** - * creator user id - */ - s?: number; - - /** - * photo unique id - */ - u?: number; - - /** - * creation timestamp - */ - t?: number; - - /** - * photo caption - */ - m?: string; - - /** - * photo image url - */ - w?: string; - - /** - * owner id - */ - oi?: number; - - /** - * owner name - */ - o?: string; -} \ No newline at end of file diff --git a/src/api/room/widgets/MannequinUtilities.ts b/src/api/room/widgets/MannequinUtilities.ts deleted file mode 100644 index 9368a79..0000000 --- a/src/api/room/widgets/MannequinUtilities.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { AvatarFigurePartType, GetAvatarRenderManager, IAvatarFigureContainer } from '@nitrots/nitro-renderer'; - -export class MannequinUtilities -{ - public static MANNEQUIN_FIGURE = [ 'hd', 99999, [ 99998 ] ]; - public static MANNEQUIN_CLOTHING_PART_TYPES = [ - AvatarFigurePartType.CHEST_ACCESSORY, - AvatarFigurePartType.COAT_CHEST, - AvatarFigurePartType.CHEST, - AvatarFigurePartType.LEGS, - AvatarFigurePartType.SHOES, - AvatarFigurePartType.WAIST_ACCESSORY - ]; - - public static getMergedMannequinFigureContainer(figure: string, targetFigure: string): IAvatarFigureContainer - { - const figureContainer = GetAvatarRenderManager().createFigureContainer(figure); - const targetFigureContainer = GetAvatarRenderManager().createFigureContainer(targetFigure); - - for(const part of this.MANNEQUIN_CLOTHING_PART_TYPES) figureContainer.removePart(part); - - for(const part of targetFigureContainer.getPartTypeIds()) figureContainer.updatePart(part, targetFigureContainer.getPartSetId(part), targetFigureContainer.getPartColorIds(part)); - - return figureContainer; - } - - public static transformAsMannequinFigure(figureContainer: IAvatarFigureContainer): void - { - for(const part of figureContainer.getPartTypeIds()) - { - if(this.MANNEQUIN_CLOTHING_PART_TYPES.indexOf(part) >= 0) continue; - - figureContainer.removePart(part); - } - - figureContainer.updatePart((this.MANNEQUIN_FIGURE[0] as string), (this.MANNEQUIN_FIGURE[1] as number), (this.MANNEQUIN_FIGURE[2] as number[])); - }; -} diff --git a/src/api/room/widgets/PetSupplementEnum.ts b/src/api/room/widgets/PetSupplementEnum.ts deleted file mode 100644 index eb23687..0000000 --- a/src/api/room/widgets/PetSupplementEnum.ts +++ /dev/null @@ -1,5 +0,0 @@ -export class PetSupplementEnum -{ - public static WATER: number = 0; - public static LIGHT: number = 1; -} diff --git a/src/api/room/widgets/PostureTypeEnum.ts b/src/api/room/widgets/PostureTypeEnum.ts deleted file mode 100644 index 21352d7..0000000 --- a/src/api/room/widgets/PostureTypeEnum.ts +++ /dev/null @@ -1,5 +0,0 @@ -export class PostureTypeEnum -{ - public static POSTURE_STAND: number = 0; - public static POSTURE_SIT: number = 1; -} diff --git a/src/api/room/widgets/RoomDimmerPreset.ts b/src/api/room/widgets/RoomDimmerPreset.ts deleted file mode 100644 index 86600d5..0000000 --- a/src/api/room/widgets/RoomDimmerPreset.ts +++ /dev/null @@ -1,35 +0,0 @@ -export class RoomDimmerPreset -{ - 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/src/api/room/widgets/RoomObjectItem.ts b/src/api/room/widgets/RoomObjectItem.ts deleted file mode 100644 index f4fb2d6..0000000 --- a/src/api/room/widgets/RoomObjectItem.ts +++ /dev/null @@ -1,28 +0,0 @@ -export class RoomObjectItem -{ - private _id: number; - private _category: number; - private _name: string; - - constructor(id: number, category: number, name: string) - { - this._id = id; - this._category = category; - this._name = name; - } - - public get id(): number - { - return this._id; - } - - public get category(): number - { - return this._category; - } - - public get name(): string - { - return this._name; - } -} diff --git a/src/api/room/widgets/UseProductItem.ts b/src/api/room/widgets/UseProductItem.ts deleted file mode 100644 index d3e2088..0000000 --- a/src/api/room/widgets/UseProductItem.ts +++ /dev/null @@ -1,12 +0,0 @@ -export class UseProductItem -{ - constructor( - public readonly id: number, - public readonly category: number, - public readonly name: string, - public readonly requestRoomObjectId: number, - public readonly targetRoomObjectId: number, - public readonly requestInventoryStripId: number, - public readonly replace: boolean) - {} -} diff --git a/src/api/room/widgets/VoteValue.ts b/src/api/room/widgets/VoteValue.ts deleted file mode 100644 index ecf4336..0000000 --- a/src/api/room/widgets/VoteValue.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const VALUE_KEY_DISLIKE = '0'; -export const VALUE_KEY_LIKE = '1'; - -export interface VoteValue -{ - value: string; - secondsLeft: number; -} diff --git a/src/api/room/widgets/YoutubeVideoPlaybackStateEnum.ts b/src/api/room/widgets/YoutubeVideoPlaybackStateEnum.ts deleted file mode 100644 index 3a885d1..0000000 --- a/src/api/room/widgets/YoutubeVideoPlaybackStateEnum.ts +++ /dev/null @@ -1,9 +0,0 @@ -export class YoutubeVideoPlaybackStateEnum -{ - public static readonly UNSTARTED = -1; - public static readonly ENDED = 0; - public static readonly PLAYING = 1; - public static readonly PAUSED = 2; - public static readonly BUFFERING = 3; - public static readonly CUED = 5; -} diff --git a/src/api/room/widgets/index.ts b/src/api/room/widgets/index.ts deleted file mode 100644 index 6c50c83..0000000 --- a/src/api/room/widgets/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -export * from './AvatarInfoFurni'; -export * from './AvatarInfoName'; -export * from './AvatarInfoPet'; -export * from './AvatarInfoRentableBot'; -export * from './AvatarInfoUser'; -export * from './AvatarInfoUtilities'; -export * from './BotSkillsEnum'; -export * from './ChatBubbleMessage'; -export * from './ChatBubbleUtilities'; -export * from './ChatMessageTypeEnum'; -export * from './DimmerFurnitureWidgetPresetItem'; -export * from './DoChatsOverlap'; -export * from './FurnitureDimmerUtilities'; -export * from './GetDiskColor'; -export * from './IAvatarInfo'; -export * from './ICraftingIngredient'; -export * from './ICraftingRecipe'; -export * from './IPhotoData'; -export * from './MannequinUtilities'; -export * from './PetSupplementEnum'; -export * from './PostureTypeEnum'; -export * from './RoomDimmerPreset'; -export * from './RoomObjectItem'; -export * from './UseProductItem'; -export * from './VoteValue'; -export * from './YoutubeVideoPlaybackStateEnum'; diff --git a/src/api/user/GetUserProfile.ts b/src/api/user/GetUserProfile.ts deleted file mode 100644 index 13c67aa..0000000 --- a/src/api/user/GetUserProfile.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { UserProfileComposer } from '@nitrots/nitro-renderer'; -import { SendMessageComposer } from '../nitro'; - -export function GetUserProfile(userId: number): void -{ - SendMessageComposer(new UserProfileComposer(userId)); -} diff --git a/src/api/user/index.ts b/src/api/user/index.ts deleted file mode 100644 index 1c609ea..0000000 --- a/src/api/user/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './GetUserProfile'; diff --git a/src/api/utils/CloneObject.ts b/src/api/utils/CloneObject.ts deleted file mode 100644 index 6cd8d3e..0000000 --- a/src/api/utils/CloneObject.ts +++ /dev/null @@ -1,14 +0,0 @@ -export const CloneObject = (object: T): T => -{ - if((object == null) || ('object' != typeof object)) return object; - - // @ts-ignore - const copy = new object.constructor(); - - for(const attr in object) - { - if(object.hasOwnProperty(attr)) copy[attr] = object[attr]; - } - - return copy; -} diff --git a/src/api/utils/ColorUtils.ts b/src/api/utils/ColorUtils.ts deleted file mode 100644 index c32f8fb..0000000 --- a/src/api/utils/ColorUtils.ts +++ /dev/null @@ -1,65 +0,0 @@ -export class ColorUtils -{ - public static makeColorHex(color: string): string - { - return ('#' + color); - } - - public static makeColorNumberHex(color: number): string - { - let val = color.toString(16); - return ( '#' + val.padStart(6, '0')); - } - - public static convertFromHex(color: string): number - { - return parseInt(color.replace('#', ''), 16); - } - - public static uintHexColor(color: number): string - { - const realColor = color >>>0; - - return ColorUtils.makeColorHex(realColor.toString(16).substring(2)); - } - - /** - * Converts an integer format into an array of 8-bit values - * @param {number} value value in integer format - * @returns {Array} 8-bit values - */ - public static int_to_8BitVals(value: number): [number, number, number, number] - { - const val1 = ((value >> 24) & 0xFF) - const val2 = ((value >> 16) & 0xFF); - const val3 = ((value >> 8) & 0xFF); - const val4 = (value & 0xFF); - - return [ val1, val2, val3, val4 ]; - } - - /** - * Combines 4 8-bit values into a 32-bit integer. Values are combined in - * in the order of the parameters - * @param val1 - * @param val2 - * @param val3 - * @param val4 - * @returns 32-bit integer of combined values - */ - public static eight_bitVals_to_int(val1: number, val2: number, val3: number, val4: number): number - { - return (((val1) << 24) + ((val2) << 16) + ((val3) << 8) + (val4| 0)); - } - - public static int2rgb(color: number): string - { - color >>>= 0; - const b = color & 0xFF; - const g = (color & 0xFF00) >>> 8; - const r = (color & 0xFF0000) >>> 16; - const a = ((color & 0xFF000000) >>> 24) / 255; - - return 'rgba(' + [ r, g, b, 1 ].join(',') + ')'; - } -} diff --git a/src/api/utils/ConvertSeconds.ts b/src/api/utils/ConvertSeconds.ts deleted file mode 100644 index f559dea..0000000 --- a/src/api/utils/ConvertSeconds.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const ConvertSeconds = (seconds: number) => -{ - let numDays = Math.floor(seconds / 86400); - let numHours = Math.floor((seconds % 86400) / 3600); - let numMinutes = Math.floor(((seconds % 86400) % 3600) / 60); - let numSeconds = ((seconds % 86400) % 3600) % 60; - - return numDays.toString().padStart(2, '0') + ':' + numHours.toString().padStart(2, '0') + ':' + numMinutes.toString().padStart(2, '0') + ':' + numSeconds.toString().padStart(2, '0'); -} diff --git a/src/api/utils/FixedSizeStack.ts b/src/api/utils/FixedSizeStack.ts deleted file mode 100644 index af8e09a..0000000 --- a/src/api/utils/FixedSizeStack.ts +++ /dev/null @@ -1,65 +0,0 @@ -export class FixedSizeStack -{ - private _data: number[]; - private _maxSize: number; - private _index: number; - - constructor(k: number) - { - this._data = []; - this._maxSize = k; - this._index = 0; - } - - public reset(): void - { - this._data = []; - this._index = 0; - } - - public addValue(k: number): void - { - if(this._data.length < this._maxSize) - { - this._data.push(k); - } - else - { - this._data[this._index] = k; - } - - this._index = ((this._index + 1) % this._maxSize); - } - - public getMax(): number - { - let k = Number.MIN_VALUE; - - let _local_2 = 0; - - while(_local_2 < this._maxSize) - { - if(this._data[_local_2] > k) k = this._data[_local_2]; - - _local_2++; - } - - return k; - } - - public getMin(): number - { - let k = Number.MAX_VALUE; - - let _local_2 = 0; - - while(_local_2 < this._maxSize) - { - if(this._data[_local_2] < k) k = this._data[_local_2]; - - _local_2++; - } - - return k; - } -} diff --git a/src/api/utils/FriendlyTime.ts b/src/api/utils/FriendlyTime.ts deleted file mode 100644 index 7acb39c..0000000 --- a/src/api/utils/FriendlyTime.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { LocalizeText } from './LocalizeText'; - -export class FriendlyTime -{ - private static MINUTE: number = 60; - private static HOUR: number = (60 * FriendlyTime.MINUTE); - private static DAY: number = (24 * FriendlyTime.HOUR); - private static WEEK: number = (7 * FriendlyTime.DAY); - private static MONTH: number = (30 * FriendlyTime.DAY); - private static YEAR: number = (365 * FriendlyTime.DAY); - - - public static format(seconds: number, key: string = '', threshold: number = 3): string - { - if(seconds > (threshold * FriendlyTime.YEAR)) return FriendlyTime.getLocalization(('friendlytime.years' + key), Math.round((seconds / FriendlyTime.YEAR))); - - if(seconds > (threshold * FriendlyTime.MONTH)) return FriendlyTime.getLocalization(('friendlytime.months' + key), Math.round((seconds / FriendlyTime.MONTH))); - - if(seconds > (threshold * FriendlyTime.DAY)) return FriendlyTime.getLocalization(('friendlytime.days' + key), Math.round((seconds / FriendlyTime.DAY))); - - if(seconds > (threshold * FriendlyTime.HOUR)) return FriendlyTime.getLocalization(('friendlytime.hours' + key), Math.round((seconds / FriendlyTime.HOUR))); - - if(seconds > (threshold * FriendlyTime.MINUTE)) return FriendlyTime.getLocalization(('friendlytime.minutes' + key), Math.round((seconds / FriendlyTime.MINUTE))); - - return FriendlyTime.getLocalization(('friendlytime.seconds' + key), Math.round(seconds)); - } - - public static shortFormat(seconds: number, key: string = '', threshold: number = 3): string - { - if(seconds > (threshold * FriendlyTime.YEAR)) return FriendlyTime.getLocalization(('friendlytime.years.short' + key), Math.round((seconds / FriendlyTime.YEAR))); - - if(seconds > (threshold * FriendlyTime.MONTH)) return FriendlyTime.getLocalization(('friendlytime.months.short' + key), Math.round((seconds / FriendlyTime.MONTH))); - - if(seconds > (threshold * FriendlyTime.DAY)) return FriendlyTime.getLocalization(('friendlytime.days.short' + key), Math.round((seconds / FriendlyTime.DAY))); - - if(seconds > (threshold * FriendlyTime.HOUR)) return FriendlyTime.getLocalization(('friendlytime.hours.short' + key), Math.round((seconds / FriendlyTime.HOUR))); - - if(seconds > (threshold * FriendlyTime.MINUTE)) return FriendlyTime.getLocalization(('friendlytime.minutes.short' + key), Math.round((seconds / FriendlyTime.MINUTE))); - - return FriendlyTime.getLocalization(('friendlytime.seconds.short' + key), Math.round(seconds)); - } - - public static getLocalization(key: string, amount: number): string - { - return LocalizeText(key, [ 'amount' ], [ amount.toString() ]); - } -} diff --git a/src/api/utils/GetLocalStorage.ts b/src/api/utils/GetLocalStorage.ts deleted file mode 100644 index 769df6d..0000000 --- a/src/api/utils/GetLocalStorage.ts +++ /dev/null @@ -1,11 +0,0 @@ -export const GetLocalStorage = (key: string) => -{ - try - { - JSON.parse(window.localStorage.getItem(key)) as T ?? null - } - catch(e) - { - return null; - } -} diff --git a/src/api/utils/LocalStorageKeys.ts b/src/api/utils/LocalStorageKeys.ts deleted file mode 100644 index 6c92279..0000000 --- a/src/api/utils/LocalStorageKeys.ts +++ /dev/null @@ -1,5 +0,0 @@ -export class LocalStorageKeys -{ - public static CATALOG_PLACE_MULTIPLE_OBJECTS: string = 'catalogPlaceMultipleObjects'; - public static CATALOG_SKIP_PURCHASE_CONFIRMATION: string = 'catalogSkipPurchaseConfirmation'; -} diff --git a/src/api/utils/LocalizeBadgeDescription.ts b/src/api/utils/LocalizeBadgeDescription.ts deleted file mode 100644 index acf3795..0000000 --- a/src/api/utils/LocalizeBadgeDescription.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { GetLocalizationManager } from '@nitrots/nitro-renderer'; - -export const LocalizeBadgeDescription = (key: string) => -{ - let badgeDesc = GetLocalizationManager().getBadgeDesc(key); - - if(!badgeDesc || !badgeDesc.length) badgeDesc = `badge_desc_${ key }`; - - return badgeDesc; -} diff --git a/src/api/utils/LocalizeBageName.ts b/src/api/utils/LocalizeBageName.ts deleted file mode 100644 index 50d6ac5..0000000 --- a/src/api/utils/LocalizeBageName.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { GetLocalizationManager } from '@nitrots/nitro-renderer'; - -export const LocalizeBadgeName = (key: string) => -{ - let badgeName = GetLocalizationManager().getBadgeName(key); - - if(!badgeName || !badgeName.length) badgeName = `badge_name_${ key }`; - - return badgeName; -} diff --git a/src/api/utils/LocalizeFormattedNumber.ts b/src/api/utils/LocalizeFormattedNumber.ts deleted file mode 100644 index fab30d4..0000000 --- a/src/api/utils/LocalizeFormattedNumber.ts +++ /dev/null @@ -1,6 +0,0 @@ -export function LocalizeFormattedNumber(number: number): string -{ - if(!number || isNaN(number)) return '0'; - - return number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ' '); -}; diff --git a/src/api/utils/LocalizeShortNumber.ts b/src/api/utils/LocalizeShortNumber.ts deleted file mode 100644 index 30975ec..0000000 --- a/src/api/utils/LocalizeShortNumber.ts +++ /dev/null @@ -1,36 +0,0 @@ -export function LocalizeShortNumber(number: number): string -{ - if(!number || isNaN(number)) return '0'; - - let abs = Math.abs(number); - - const rounder = Math.pow(10, 1); - const isNegative = (number < 0); - - let key = ''; - - const powers = [ - { key: 'Q', value: Math.pow(10, 15) }, - { key: 'T', value: Math.pow(10, 12) }, - { key: 'B', value: Math.pow(10, 9) }, - { key: 'M', value: Math.pow(10, 6) }, - { key: 'K', value: 1000 } - ]; - - for(const power of powers) - { - let reduced = abs / power.value; - - reduced = Math.round(reduced * rounder) / rounder; - - if(reduced >= 1) - { - abs = reduced; - key = power.key; - - break; - } - } - - return ((isNegative ? '-' : '') + abs + key); -} diff --git a/src/api/utils/LocalizeText.ts b/src/api/utils/LocalizeText.ts deleted file mode 100644 index 68d0273..0000000 --- a/src/api/utils/LocalizeText.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { GetLocalizationManager } from '@nitrots/nitro-renderer'; - -export function LocalizeText(key: string, parameters: string[] = null, replacements: string[] = null): string -{ - return GetLocalizationManager().getValueWithParameters(key, parameters, replacements); -} diff --git a/src/api/utils/PlaySound.ts b/src/api/utils/PlaySound.ts deleted file mode 100644 index 0f9a39d..0000000 --- a/src/api/utils/PlaySound.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { MouseEventType, NitroSoundEvent } from '@nitrots/nitro-renderer'; -import { DispatchMainEvent } from '../events'; - -let canPlaySound = false; - -export const PlaySound = (sampleCode: string) => -{ - if(!canPlaySound) return; - - DispatchMainEvent(new NitroSoundEvent(NitroSoundEvent.PLAY_SOUND, sampleCode)); -} - -const eventTypes = [ MouseEventType.MOUSE_CLICK ]; - -const startListening = () => -{ - const stopListening = () => eventTypes.forEach(type => window.removeEventListener(type, onEvent)); - - const onEvent = (event: Event) => ((canPlaySound = true) && stopListening()); - - eventTypes.forEach(type => window.addEventListener(type, onEvent)); -} - -startListening(); diff --git a/src/api/utils/ProductImageUtility.ts b/src/api/utils/ProductImageUtility.ts deleted file mode 100644 index b12c43d..0000000 --- a/src/api/utils/ProductImageUtility.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { CatalogPageMessageProductData, GetRoomEngine } from '@nitrots/nitro-renderer'; -import { FurniCategory } from '../inventory'; - -export class ProductImageUtility -{ - public static getProductImageUrl(productType: string, furniClassId: number, extraParam: string): string - { - let imageUrl: string = null; - - switch(productType) - { - case CatalogPageMessageProductData.S: - imageUrl = GetRoomEngine().getFurnitureFloorIconUrl(furniClassId); - break; - case CatalogPageMessageProductData.I: - const productCategory = this.getProductCategory(CatalogPageMessageProductData.I, furniClassId); - - if(productCategory === 1) - { - imageUrl = GetRoomEngine().getFurnitureWallIconUrl(furniClassId, extraParam); - } - else - { - switch(productCategory) - { - case FurniCategory.WALL_PAPER: - break; - case FurniCategory.LANDSCAPE: - break; - case FurniCategory.FLOOR: - break; - } - } - break; - case CatalogPageMessageProductData.E: - // fx_icon_furniClassId_png - break; - } - - return imageUrl; - } - - public static getProductCategory(productType: string, furniClassId: number): number - { - if(productType === CatalogPageMessageProductData.S) return 1; - - if(productType === CatalogPageMessageProductData.I) - { - if(furniClassId === 3001) return FurniCategory.WALL_PAPER; - - if(furniClassId === 3002) return FurniCategory.FLOOR; - - if(furniClassId === 4057) return FurniCategory.LANDSCAPE; - } - - return 1; - } -} diff --git a/src/api/utils/Randomizer.ts b/src/api/utils/Randomizer.ts deleted file mode 100644 index 1f67a12..0000000 --- a/src/api/utils/Randomizer.ts +++ /dev/null @@ -1,28 +0,0 @@ -export class Randomizer -{ - public static getRandomNumber(count: number): number - { - return Math.floor(Math.random() * count); - } - - public static getRandomElement(elements: T[]): T - { - return elements[this.getRandomNumber(elements.length)]; - } - - public static getRandomElements(elements: T[], count: number): T[] - { - const result: T[] = new Array(count); - let len = elements.length; - const taken = new Array(len); - - while(count--) - { - var x = this.getRandomNumber(len); - result[count] = elements[x in taken ? taken[x] : x]; - taken[x] = --len in taken ? taken[len] : len; - } - - return result; - } -} diff --git a/src/api/utils/RoomChatFormatter.ts b/src/api/utils/RoomChatFormatter.ts deleted file mode 100644 index a24cdf5..0000000 --- a/src/api/utils/RoomChatFormatter.ts +++ /dev/null @@ -1,75 +0,0 @@ -const allowedColours: Map = new Map(); - -allowedColours.set('r', 'red'); -allowedColours.set('b', 'blue'); -allowedColours.set('g', 'green'); -allowedColours.set('y', 'yellow'); -allowedColours.set('w', 'white'); -allowedColours.set('o', 'orange'); -allowedColours.set('c', 'cyan'); -allowedColours.set('br', 'brown'); -allowedColours.set('pr', 'purple'); -allowedColours.set('pk', 'pink'); - -allowedColours.set('red', 'red'); -allowedColours.set('blue', 'blue'); -allowedColours.set('green', 'green'); -allowedColours.set('yellow', 'yellow'); -allowedColours.set('white', 'white'); -allowedColours.set('orange', 'orange'); -allowedColours.set('cyan', 'cyan'); -allowedColours.set('brown', 'brown'); -allowedColours.set('purple', 'purple'); -allowedColours.set('pink', 'pink'); - -const encodeHTML = (str: string) => -{ - return str.replace(/([\u00A0-\u9999<>&])(.|$)/g, (full, char, next) => - { - if(char !== '&' || next !== '#') - { - if(/[\u00A0-\u9999<>&]/.test(next)) next = '&#' + next.charCodeAt(0) + ';'; - - return '&#' + char.charCodeAt(0) + ';' + next; - } - - return full; - }); -} - -export const RoomChatFormatter = (content: string) => -{ - let result = ''; - - content = encodeHTML(content); - //content = (joypixels.shortnameToUnicode(content) as string) - - if(content.startsWith('@') && content.indexOf('@', 1) > -1) - { - let match = null; - - while((match = /@[a-zA-Z]+@/g.exec(content)) !== null) - { - const colorTag = match[0].toString(); - const colorName = colorTag.substr(1, colorTag.length - 2); - const text = content.replace(colorTag, ''); - - if(!allowedColours.has(colorName)) - { - result = text; - } - else - { - const color = allowedColours.get(colorName); - result = '' + text + ''; - } - break; - } - } - else - { - result = content; - } - - return result; -} diff --git a/src/api/utils/SetLocalStorage.ts b/src/api/utils/SetLocalStorage.ts deleted file mode 100644 index 02aa8f3..0000000 --- a/src/api/utils/SetLocalStorage.ts +++ /dev/null @@ -1 +0,0 @@ -export const SetLocalStorage = (key: string, value: T) => window.localStorage.setItem(key, JSON.stringify(value)); diff --git a/src/api/utils/SoundNames.ts b/src/api/utils/SoundNames.ts deleted file mode 100644 index 4459651..0000000 --- a/src/api/utils/SoundNames.ts +++ /dev/null @@ -1,9 +0,0 @@ -export class SoundNames -{ - public static CAMERA_SHUTTER = 'camera_shutter'; - public static CREDITS = 'credits'; - public static DUCKETS = 'duckets'; - public static MESSENGER_NEW_THREAD = 'messenger_new_thread'; - public static MESSENGER_MESSAGE_RECEIVED = 'messenger_message_received'; - public static MODTOOLS_NEW_TICKET = 'modtools_new_ticket'; -} diff --git a/src/api/utils/WindowSaveOptions.ts b/src/api/utils/WindowSaveOptions.ts deleted file mode 100644 index 9aa8456..0000000 --- a/src/api/utils/WindowSaveOptions.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface WindowSaveOptions -{ - offset: { x: number, y: number }; - size: { width: number, height: number }; -} diff --git a/src/api/utils/index.ts b/src/api/utils/index.ts deleted file mode 100644 index 1824add..0000000 --- a/src/api/utils/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -export * from './CloneObject'; -export * from './ColorUtils'; -export * from './ConvertSeconds'; -export * from './FixedSizeStack'; -export * from './FriendlyTime'; -export * from './GetLocalStorage'; -export * from './LocalStorageKeys'; -export * from './LocalizeBadgeDescription'; -export * from './LocalizeBageName'; -export * from './LocalizeFormattedNumber'; -export * from './LocalizeShortNumber'; -export * from './LocalizeText'; -export * from './PlaySound'; -export * from './ProductImageUtility'; -export * from './Randomizer'; -export * from './RoomChatFormatter'; -export * from './SetLocalStorage'; -export * from './SoundNames'; -export * from './WindowSaveOptions'; diff --git a/src/api/wired/GetWiredTimeLocale.ts b/src/api/wired/GetWiredTimeLocale.ts deleted file mode 100644 index 49025fe..0000000 --- a/src/api/wired/GetWiredTimeLocale.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const GetWiredTimeLocale = (value: number) => -{ - const time = Math.floor((value / 2)); - - if(!(value % 2)) return time.toString(); - - return (time + 0.5).toString(); -} diff --git a/src/api/wired/WiredActionLayoutCode.ts b/src/api/wired/WiredActionLayoutCode.ts deleted file mode 100644 index 5282dc5..0000000 --- a/src/api/wired/WiredActionLayoutCode.ts +++ /dev/null @@ -1,29 +0,0 @@ -export class WiredActionLayoutCode -{ - public static TOGGLE_FURNI_STATE: number = 0; - public static RESET: number = 1; - public static SET_FURNI_STATE: number = 3; - public static MOVE_FURNI: number = 4; - public static GIVE_SCORE: number = 6; - public static CHAT: number = 7; - public static TELEPORT: number = 8; - public static JOIN_TEAM: number = 9; - public static LEAVE_TEAM: number = 10; - public static CHASE: number = 11; - public static FLEE: number = 12; - public static MOVE_AND_ROTATE_FURNI: number = 13; - public static GIVE_SCORE_TO_PREDEFINED_TEAM: number = 14; - public static TOGGLE_TO_RANDOM_STATE: number = 15; - public static MOVE_FURNI_TO: number = 16; - public static GIVE_REWARD: number = 17; - public static CALL_ANOTHER_STACK: number = 18; - public static KICK_FROM_ROOM: number = 19; - public static MUTE_USER: number = 20; - public static BOT_TELEPORT: number = 21; - public static BOT_MOVE: number = 22; - public static BOT_TALK: number = 23; - public static BOT_GIVE_HAND_ITEM: number = 24; - public static BOT_FOLLOW_AVATAR: number = 25; - public static BOT_CHANGE_FIGURE: number = 26; - public static BOT_TALK_DIRECT_TO_AVTR: number = 27; -} diff --git a/src/api/wired/WiredConditionLayoutCode.ts b/src/api/wired/WiredConditionLayoutCode.ts deleted file mode 100644 index 58cae5d..0000000 --- a/src/api/wired/WiredConditionLayoutCode.ts +++ /dev/null @@ -1,29 +0,0 @@ -export class WiredConditionlayout -{ - public static STATES_MATCH: number = 0; - public static FURNIS_HAVE_AVATARS: number = 1; - public static ACTOR_IS_ON_FURNI: number = 2; - public static TIME_ELAPSED_MORE: number = 3; - public static TIME_ELAPSED_LESS: number = 4; - public static USER_COUNT_IN: number = 5; - public static ACTOR_IS_IN_TEAM: number = 6; - public static HAS_STACKED_FURNIS: number = 7; - public static STUFF_TYPE_MATCHES: number = 8; - public static STUFFS_IN_FORMATION: number = 9; - public static ACTOR_IS_GROUP_MEMBER: number = 10; - public static ACTOR_IS_WEARING_BADGE: number = 11; - public static ACTOR_IS_WEARING_EFFECT: number = 12; - public static NOT_STATES_MATCH: number = 13; - public static FURNI_NOT_HAVE_HABBO: number = 14; - public static NOT_ACTOR_ON_FURNI: number = 15; - public static NOT_USER_COUNT_IN: number = 16; - public static NOT_ACTOR_IN_TEAM: number = 17; - public static NOT_HAS_STACKED_FURNIS: number = 18; - public static NOT_FURNI_IS_OF_TYPE: number = 19; - public static NOT_STUFFS_IN_FORMATION: number = 20; - public static NOT_ACTOR_IN_GROUP: number = 21; - public static NOT_ACTOR_WEARS_BADGE: number = 22; - public static NOT_ACTOR_WEARING_EFFECT: number = 23; - public static DATE_RANGE_ACTIVE: number = 24; - public static ACTOR_HAS_HANDITEM: number = 25; -} diff --git a/src/api/wired/WiredDateToString.ts b/src/api/wired/WiredDateToString.ts deleted file mode 100644 index 825adc8..0000000 --- a/src/api/wired/WiredDateToString.ts +++ /dev/null @@ -1 +0,0 @@ -export const WiredDateToString = (date: Date) => `${ date.getFullYear() }/${ ('0' + (date.getMonth() + 1)).slice(-2) }/${ ('0' + date.getDate()).slice(-2) } ${ ('0' + date.getHours()).slice(-2) }:${ ('0' + date.getMinutes()).slice(-2) }`; diff --git a/src/api/wired/WiredFurniType.ts b/src/api/wired/WiredFurniType.ts deleted file mode 100644 index 447e970..0000000 --- a/src/api/wired/WiredFurniType.ts +++ /dev/null @@ -1,7 +0,0 @@ -export class WiredFurniType -{ - public static STUFF_SELECTION_OPTION_NONE: number = 0; - public static STUFF_SELECTION_OPTION_BY_ID: number = 1; - public static STUFF_SELECTION_OPTION_BY_ID_OR_BY_TYPE: number = 2; - public static STUFF_SELECTION_OPTION_BY_ID_BY_TYPE_OR_FROM_CONTEXT: number = 3; -} diff --git a/src/api/wired/WiredSelectionVisualizer.ts b/src/api/wired/WiredSelectionVisualizer.ts deleted file mode 100644 index 18edbf7..0000000 --- a/src/api/wired/WiredSelectionVisualizer.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { GetRoomEngine, IRoomObject, IRoomObjectSpriteVisualization, RoomObjectCategory, WiredFilter } from '@nitrots/nitro-renderer'; - -export class WiredSelectionVisualizer -{ - private static _selectionShader: WiredFilter = new WiredFilter({ - lineColor: [ 1, 1, 1 ], - color: [ 0.6, 0.6, 0.6 ] - }); - - public static show(furniId: number): void - { - WiredSelectionVisualizer.applySelectionShader(WiredSelectionVisualizer.getRoomObject(furniId)); - } - - public static hide(furniId: number): void - { - WiredSelectionVisualizer.clearSelectionShader(WiredSelectionVisualizer.getRoomObject(furniId)); - } - - public static clearSelectionShaderFromFurni(furniIds: number[]): void - { - for(const furniId of furniIds) - { - WiredSelectionVisualizer.clearSelectionShader(WiredSelectionVisualizer.getRoomObject(furniId)); - } - } - - public static applySelectionShaderToFurni(furniIds: number[]): void - { - for(const furniId of furniIds) - { - WiredSelectionVisualizer.applySelectionShader(WiredSelectionVisualizer.getRoomObject(furniId)); - } - } - - private static getRoomObject(objectId: number): IRoomObject - { - const roomEngine = GetRoomEngine(); - - return roomEngine.getRoomObject(roomEngine.activeRoomId, objectId, RoomObjectCategory.FLOOR); - } - - private static applySelectionShader(roomObject: IRoomObject): void - { - if(!roomObject) return; - - const visualization = (roomObject.visualization as IRoomObjectSpriteVisualization); - - if(!visualization) return; - - for(const sprite of visualization.sprites) - { - if(sprite.blendMode === 'add') continue; - - if(!sprite.filters) sprite.filters = []; - - sprite.filters.push(WiredSelectionVisualizer._selectionShader); - - sprite.increaseUpdateCounter(); - } - } - - private static clearSelectionShader(roomObject: IRoomObject): void - { - if(!roomObject) return; - - const visualization = (roomObject.visualization as IRoomObjectSpriteVisualization); - - if(!visualization) return; - - for(const sprite of visualization.sprites) - { - if(!sprite.filters) continue; - - const index = sprite.filters.indexOf(WiredSelectionVisualizer._selectionShader); - - if(index >= 0) - { - sprite.filters.splice(index, 1); - - sprite.increaseUpdateCounter(); - } - } - } -} diff --git a/src/api/wired/WiredStringDelimeter.ts b/src/api/wired/WiredStringDelimeter.ts deleted file mode 100644 index bc4cf2e..0000000 --- a/src/api/wired/WiredStringDelimeter.ts +++ /dev/null @@ -1 +0,0 @@ -export const WIRED_STRING_DELIMETER: string = '\t'; diff --git a/src/api/wired/WiredTriggerLayoutCode.ts b/src/api/wired/WiredTriggerLayoutCode.ts deleted file mode 100644 index fd758df..0000000 --- a/src/api/wired/WiredTriggerLayoutCode.ts +++ /dev/null @@ -1,17 +0,0 @@ -export class WiredTriggerLayout -{ - public static AVATAR_SAYS_SOMETHING: number = 0; - public static AVATAR_WALKS_ON_FURNI: number = 1; - public static AVATAR_WALKS_OFF_FURNI: number = 2; - public static EXECUTE_ONCE: number = 3; - public static TOGGLE_FURNI: number = 4; - public static EXECUTE_PERIODICALLY: number = 6; - public static AVATAR_ENTERS_ROOM: number = 7; - public static GAME_STARTS: number = 8; - public static GAME_ENDS: number = 9; - public static SCORE_ACHIEVED: number = 10; - public static COLLISION: number = 11; - public static EXECUTE_PERIODICALLY_LONG: number = 12; - public static BOT_REACHED_STUFF: number = 13; - public static BOT_REACHED_AVATAR: number = 14; -} diff --git a/src/api/wired/index.ts b/src/api/wired/index.ts deleted file mode 100644 index 6590adf..0000000 --- a/src/api/wired/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from './GetWiredTimeLocale'; -export * from './WiredActionLayoutCode'; -export * from './WiredConditionLayoutCode'; -export * from './WiredDateToString'; -export * from './WiredFurniType'; -export * from './WiredSelectionVisualizer'; -export * from './WiredStringDelimeter'; -export * from './WiredTriggerLayoutCode'; diff --git a/src/assets/images/achievements/back-arrow.png b/src/assets/images/achievements/back-arrow.png deleted file mode 100644 index e795c0e..0000000 Binary files a/src/assets/images/achievements/back-arrow.png and /dev/null differ diff --git a/src/assets/images/avatareditor/arrow-left-icon.png b/src/assets/images/avatareditor/arrow-left-icon.png deleted file mode 100644 index f94a7df..0000000 Binary files a/src/assets/images/avatareditor/arrow-left-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/arrow-right-icon.png b/src/assets/images/avatareditor/arrow-right-icon.png deleted file mode 100644 index 1d2217f..0000000 Binary files a/src/assets/images/avatareditor/arrow-right-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/avatar-editor-spritesheet.png b/src/assets/images/avatareditor/avatar-editor-spritesheet.png deleted file mode 100644 index 0c91ca0..0000000 Binary files a/src/assets/images/avatareditor/avatar-editor-spritesheet.png and /dev/null differ diff --git a/src/assets/images/avatareditor/ca-icon.png b/src/assets/images/avatareditor/ca-icon.png deleted file mode 100644 index c9803b9..0000000 Binary files a/src/assets/images/avatareditor/ca-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/ca-selected-icon.png b/src/assets/images/avatareditor/ca-selected-icon.png deleted file mode 100644 index b118c3e..0000000 Binary files a/src/assets/images/avatareditor/ca-selected-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/cc-icon.png b/src/assets/images/avatareditor/cc-icon.png deleted file mode 100644 index 4a8844e..0000000 Binary files a/src/assets/images/avatareditor/cc-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/cc-selected-icon.png b/src/assets/images/avatareditor/cc-selected-icon.png deleted file mode 100644 index 3493751..0000000 Binary files a/src/assets/images/avatareditor/cc-selected-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/ch-icon.png b/src/assets/images/avatareditor/ch-icon.png deleted file mode 100644 index ef7da11..0000000 Binary files a/src/assets/images/avatareditor/ch-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/ch-selected-icon.png b/src/assets/images/avatareditor/ch-selected-icon.png deleted file mode 100644 index c5e9f34..0000000 Binary files a/src/assets/images/avatareditor/ch-selected-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/clear-icon.png b/src/assets/images/avatareditor/clear-icon.png deleted file mode 100644 index e0d50ab..0000000 Binary files a/src/assets/images/avatareditor/clear-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/cp-icon.png b/src/assets/images/avatareditor/cp-icon.png deleted file mode 100644 index 5e460f1..0000000 Binary files a/src/assets/images/avatareditor/cp-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/cp-selected-icon.png b/src/assets/images/avatareditor/cp-selected-icon.png deleted file mode 100644 index a067085..0000000 Binary files a/src/assets/images/avatareditor/cp-selected-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/ea-icon.png b/src/assets/images/avatareditor/ea-icon.png deleted file mode 100644 index c227ae1..0000000 Binary files a/src/assets/images/avatareditor/ea-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/ea-selected-icon.png b/src/assets/images/avatareditor/ea-selected-icon.png deleted file mode 100644 index e7678c4..0000000 Binary files a/src/assets/images/avatareditor/ea-selected-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/fa-icon.png b/src/assets/images/avatareditor/fa-icon.png deleted file mode 100644 index 9b72ff5..0000000 Binary files a/src/assets/images/avatareditor/fa-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/fa-selected-icon.png b/src/assets/images/avatareditor/fa-selected-icon.png deleted file mode 100644 index a1d26b6..0000000 Binary files a/src/assets/images/avatareditor/fa-selected-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/female-icon.png b/src/assets/images/avatareditor/female-icon.png deleted file mode 100644 index 8e6e820..0000000 Binary files a/src/assets/images/avatareditor/female-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/female-selected-icon.png b/src/assets/images/avatareditor/female-selected-icon.png deleted file mode 100644 index 50ffde0..0000000 Binary files a/src/assets/images/avatareditor/female-selected-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/ha-icon.png b/src/assets/images/avatareditor/ha-icon.png deleted file mode 100644 index f0a8191..0000000 Binary files a/src/assets/images/avatareditor/ha-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/ha-selected-icon.png b/src/assets/images/avatareditor/ha-selected-icon.png deleted file mode 100644 index 4c81ece..0000000 Binary files a/src/assets/images/avatareditor/ha-selected-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/he-icon.png b/src/assets/images/avatareditor/he-icon.png deleted file mode 100644 index 7cf6dc4..0000000 Binary files a/src/assets/images/avatareditor/he-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/he-selected-icon.png b/src/assets/images/avatareditor/he-selected-icon.png deleted file mode 100644 index 3263355..0000000 Binary files a/src/assets/images/avatareditor/he-selected-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/hr-icon.png b/src/assets/images/avatareditor/hr-icon.png deleted file mode 100644 index de29990..0000000 Binary files a/src/assets/images/avatareditor/hr-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/hr-selected-icon.png b/src/assets/images/avatareditor/hr-selected-icon.png deleted file mode 100644 index c694b82..0000000 Binary files a/src/assets/images/avatareditor/hr-selected-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/lg-icon.png b/src/assets/images/avatareditor/lg-icon.png deleted file mode 100644 index 0bdd750..0000000 Binary files a/src/assets/images/avatareditor/lg-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/lg-selected-icon.png b/src/assets/images/avatareditor/lg-selected-icon.png deleted file mode 100644 index 7a2853b..0000000 Binary files a/src/assets/images/avatareditor/lg-selected-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/loading-icon.png b/src/assets/images/avatareditor/loading-icon.png deleted file mode 100644 index 50d132b..0000000 Binary files a/src/assets/images/avatareditor/loading-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/male-icon.png b/src/assets/images/avatareditor/male-icon.png deleted file mode 100644 index 95a1b35..0000000 Binary files a/src/assets/images/avatareditor/male-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/male-selected-icon.png b/src/assets/images/avatareditor/male-selected-icon.png deleted file mode 100644 index 85debbb..0000000 Binary files a/src/assets/images/avatareditor/male-selected-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/sellable-icon.png b/src/assets/images/avatareditor/sellable-icon.png deleted file mode 100644 index 4485b51..0000000 Binary files a/src/assets/images/avatareditor/sellable-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/sh-icon.png b/src/assets/images/avatareditor/sh-icon.png deleted file mode 100644 index 915c7c1..0000000 Binary files a/src/assets/images/avatareditor/sh-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/sh-selected-icon.png b/src/assets/images/avatareditor/sh-selected-icon.png deleted file mode 100644 index 12c6deb..0000000 Binary files a/src/assets/images/avatareditor/sh-selected-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/spotlight-icon.png b/src/assets/images/avatareditor/spotlight-icon.png deleted file mode 100644 index 8755373..0000000 Binary files a/src/assets/images/avatareditor/spotlight-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/wa-icon.png b/src/assets/images/avatareditor/wa-icon.png deleted file mode 100644 index 8a73b7a..0000000 Binary files a/src/assets/images/avatareditor/wa-icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/wa-selected-icon.png b/src/assets/images/avatareditor/wa-selected-icon.png deleted file mode 100644 index 5348be3..0000000 Binary files a/src/assets/images/avatareditor/wa-selected-icon.png and /dev/null differ diff --git a/src/assets/images/campaign/available.png b/src/assets/images/campaign/available.png deleted file mode 100644 index 1cc8fa6..0000000 Binary files a/src/assets/images/campaign/available.png and /dev/null differ diff --git a/src/assets/images/campaign/campaign_day_generic_bg.png b/src/assets/images/campaign/campaign_day_generic_bg.png deleted file mode 100644 index 25b3c62..0000000 Binary files a/src/assets/images/campaign/campaign_day_generic_bg.png and /dev/null differ diff --git a/src/assets/images/campaign/campaign_opened.png b/src/assets/images/campaign/campaign_opened.png deleted file mode 100644 index 9ec1bb3..0000000 Binary files a/src/assets/images/campaign/campaign_opened.png and /dev/null differ diff --git a/src/assets/images/campaign/campaign_spritesheet.png b/src/assets/images/campaign/campaign_spritesheet.png deleted file mode 100644 index eeac9d4..0000000 Binary files a/src/assets/images/campaign/campaign_spritesheet.png and /dev/null differ diff --git a/src/assets/images/campaign/locked.png b/src/assets/images/campaign/locked.png deleted file mode 100644 index 3805e50..0000000 Binary files a/src/assets/images/campaign/locked.png and /dev/null differ diff --git a/src/assets/images/campaign/locked_bg.png b/src/assets/images/campaign/locked_bg.png deleted file mode 100644 index 93927dd..0000000 Binary files a/src/assets/images/campaign/locked_bg.png and /dev/null differ diff --git a/src/assets/images/campaign/next.png b/src/assets/images/campaign/next.png deleted file mode 100644 index 88a2883..0000000 Binary files a/src/assets/images/campaign/next.png and /dev/null differ diff --git a/src/assets/images/campaign/prev.png b/src/assets/images/campaign/prev.png deleted file mode 100644 index 914a659..0000000 Binary files a/src/assets/images/campaign/prev.png and /dev/null differ diff --git a/src/assets/images/campaign/unavailable.png b/src/assets/images/campaign/unavailable.png deleted file mode 100644 index dc134c3..0000000 Binary files a/src/assets/images/campaign/unavailable.png and /dev/null differ diff --git a/src/assets/images/campaign/unlocked_bg.png b/src/assets/images/campaign/unlocked_bg.png deleted file mode 100644 index 31c35ba..0000000 Binary files a/src/assets/images/campaign/unlocked_bg.png and /dev/null differ diff --git a/src/assets/images/catalog/diamond_info_illustration.gif b/src/assets/images/catalog/diamond_info_illustration.gif deleted file mode 100644 index d082ef4..0000000 Binary files a/src/assets/images/catalog/diamond_info_illustration.gif and /dev/null differ diff --git a/src/assets/images/catalog/hc_banner_big.png b/src/assets/images/catalog/hc_banner_big.png deleted file mode 100644 index 4b2c4ec..0000000 Binary files a/src/assets/images/catalog/hc_banner_big.png and /dev/null differ diff --git a/src/assets/images/catalog/hc_big.png b/src/assets/images/catalog/hc_big.png deleted file mode 100644 index 5f8c0a2..0000000 Binary files a/src/assets/images/catalog/hc_big.png and /dev/null differ diff --git a/src/assets/images/catalog/hc_small.png b/src/assets/images/catalog/hc_small.png deleted file mode 100644 index 9983330..0000000 Binary files a/src/assets/images/catalog/hc_small.png and /dev/null differ diff --git a/src/assets/images/catalog/paint-icon.png b/src/assets/images/catalog/paint-icon.png deleted file mode 100644 index f2bf7ea..0000000 Binary files a/src/assets/images/catalog/paint-icon.png and /dev/null differ diff --git a/src/assets/images/catalog/target-price.png b/src/assets/images/catalog/target-price.png deleted file mode 100644 index 8639afd..0000000 Binary files a/src/assets/images/catalog/target-price.png and /dev/null differ diff --git a/src/assets/images/catalog/vip.png b/src/assets/images/catalog/vip.png deleted file mode 100644 index 9a3aad6..0000000 Binary files a/src/assets/images/catalog/vip.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_0.png b/src/assets/images/chat/chatbubbles/bubble_0.png deleted file mode 100644 index da68536..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_0.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_0_1_33_34_pointer.png b/src/assets/images/chat/chatbubbles/bubble_0_1_33_34_pointer.png deleted file mode 100644 index e7a4740..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_0_1_33_34_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_0_transparent.png b/src/assets/images/chat/chatbubbles/bubble_0_transparent.png deleted file mode 100644 index 596d2c7..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_0_transparent.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_1.png b/src/assets/images/chat/chatbubbles/bubble_1.png deleted file mode 100644 index 492dbde..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_1.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_10.png b/src/assets/images/chat/chatbubbles/bubble_10.png deleted file mode 100644 index cbf25a8..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_10.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_10_pointer.png b/src/assets/images/chat/chatbubbles/bubble_10_pointer.png deleted file mode 100644 index f7bd858..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_10_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_11.png b/src/assets/images/chat/chatbubbles/bubble_11.png deleted file mode 100644 index a8026d6..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_11.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_11_pointer.png b/src/assets/images/chat/chatbubbles/bubble_11_pointer.png deleted file mode 100644 index d6c4482..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_11_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_12.png b/src/assets/images/chat/chatbubbles/bubble_12.png deleted file mode 100644 index fa73413..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_12.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_12_pointer.png b/src/assets/images/chat/chatbubbles/bubble_12_pointer.png deleted file mode 100644 index 309a550..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_12_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_13.png b/src/assets/images/chat/chatbubbles/bubble_13.png deleted file mode 100644 index a9f2c41..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_13.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_13_pointer.png b/src/assets/images/chat/chatbubbles/bubble_13_pointer.png deleted file mode 100644 index 65be4f2..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_13_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_14.png b/src/assets/images/chat/chatbubbles/bubble_14.png deleted file mode 100644 index 54232f2..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_14.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_14_pointer.png b/src/assets/images/chat/chatbubbles/bubble_14_pointer.png deleted file mode 100644 index 4975897..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_14_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_15.png b/src/assets/images/chat/chatbubbles/bubble_15.png deleted file mode 100644 index 6a7ad13..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_15.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_15_pointer.png b/src/assets/images/chat/chatbubbles/bubble_15_pointer.png deleted file mode 100644 index b4a69e1..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_15_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_16.png b/src/assets/images/chat/chatbubbles/bubble_16.png deleted file mode 100644 index ae0a23e..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_16.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_16_pointer.png b/src/assets/images/chat/chatbubbles/bubble_16_pointer.png deleted file mode 100644 index abb9625..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_16_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_17.png b/src/assets/images/chat/chatbubbles/bubble_17.png deleted file mode 100644 index 5193025..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_17.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_17_pointer.png b/src/assets/images/chat/chatbubbles/bubble_17_pointer.png deleted file mode 100644 index b73b25b..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_17_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_18.png b/src/assets/images/chat/chatbubbles/bubble_18.png deleted file mode 100644 index ad07d05..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_18.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_18_pointer.png b/src/assets/images/chat/chatbubbles/bubble_18_pointer.png deleted file mode 100644 index f364525..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_18_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_19.png b/src/assets/images/chat/chatbubbles/bubble_19.png deleted file mode 100644 index c0dfb41..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_19.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_19_20_pointer.png b/src/assets/images/chat/chatbubbles/bubble_19_20_pointer.png deleted file mode 100644 index 990c21f..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_19_20_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_2.png b/src/assets/images/chat/chatbubbles/bubble_2.png deleted file mode 100644 index dc33507..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_2.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_20.png b/src/assets/images/chat/chatbubbles/bubble_20.png deleted file mode 100644 index 127d0f9..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_20.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_21.png b/src/assets/images/chat/chatbubbles/bubble_21.png deleted file mode 100644 index 933daf5..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_21.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_21_pointer.png b/src/assets/images/chat/chatbubbles/bubble_21_pointer.png deleted file mode 100644 index fe1f312..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_21_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_22.png b/src/assets/images/chat/chatbubbles/bubble_22.png deleted file mode 100644 index a77a733..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_22.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_22_pointer.png b/src/assets/images/chat/chatbubbles/bubble_22_pointer.png deleted file mode 100644 index 855ceff..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_22_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_23.png b/src/assets/images/chat/chatbubbles/bubble_23.png deleted file mode 100644 index d2a8fb4..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_23.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_23_37_pointer.png b/src/assets/images/chat/chatbubbles/bubble_23_37_pointer.png deleted file mode 100644 index 786c849..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_23_37_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_24.png b/src/assets/images/chat/chatbubbles/bubble_24.png deleted file mode 100644 index 73ee650..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_24.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_24_pointer.png b/src/assets/images/chat/chatbubbles/bubble_24_pointer.png deleted file mode 100644 index 4653eef..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_24_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_25.png b/src/assets/images/chat/chatbubbles/bubble_25.png deleted file mode 100644 index 60dcaad..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_25.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_25_pointer.png b/src/assets/images/chat/chatbubbles/bubble_25_pointer.png deleted file mode 100644 index 7567395..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_25_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_26.png b/src/assets/images/chat/chatbubbles/bubble_26.png deleted file mode 100644 index 0b43dec..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_26.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_26_pointer.png b/src/assets/images/chat/chatbubbles/bubble_26_pointer.png deleted file mode 100644 index d97093f..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_26_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_27.png b/src/assets/images/chat/chatbubbles/bubble_27.png deleted file mode 100644 index 57de9a9..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_27.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_27_pointer.png b/src/assets/images/chat/chatbubbles/bubble_27_pointer.png deleted file mode 100644 index d0c0cee..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_27_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_28.png b/src/assets/images/chat/chatbubbles/bubble_28.png deleted file mode 100644 index 3337b79..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_28.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_28_pointer.png b/src/assets/images/chat/chatbubbles/bubble_28_pointer.png deleted file mode 100644 index 850b99e..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_28_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_29.png b/src/assets/images/chat/chatbubbles/bubble_29.png deleted file mode 100644 index 9eb5aec..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_29.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_29_pointer.png b/src/assets/images/chat/chatbubbles/bubble_29_pointer.png deleted file mode 100644 index 1462b37..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_29_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_2_31_pointer.png b/src/assets/images/chat/chatbubbles/bubble_2_31_pointer.png deleted file mode 100644 index ad9db87..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_2_31_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_3.png b/src/assets/images/chat/chatbubbles/bubble_3.png deleted file mode 100644 index 6298809..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_3.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_30.png b/src/assets/images/chat/chatbubbles/bubble_30.png deleted file mode 100644 index 581fc70..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_30.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_30_pointer.png b/src/assets/images/chat/chatbubbles/bubble_30_pointer.png deleted file mode 100644 index 8660de9..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_30_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_32.png b/src/assets/images/chat/chatbubbles/bubble_32.png deleted file mode 100644 index 598d8c8..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_32.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_32_pointer.png b/src/assets/images/chat/chatbubbles/bubble_32_pointer.png deleted file mode 100644 index a68ddfb..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_32_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_33_34.png b/src/assets/images/chat/chatbubbles/bubble_33_34.png deleted file mode 100644 index d871e1a..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_33_34.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_33_extra.png b/src/assets/images/chat/chatbubbles/bubble_33_extra.png deleted file mode 100644 index 5b398ba..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_33_extra.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_34_extra.png b/src/assets/images/chat/chatbubbles/bubble_34_extra.png deleted file mode 100644 index 9a67674..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_34_extra.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_35.png b/src/assets/images/chat/chatbubbles/bubble_35.png deleted file mode 100644 index e4e7ea6..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_35.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_35_pointer.png b/src/assets/images/chat/chatbubbles/bubble_35_pointer.png deleted file mode 100644 index a8e8c32..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_35_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_36.png b/src/assets/images/chat/chatbubbles/bubble_36.png deleted file mode 100644 index a96e5e0..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_36.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_36_extra.png b/src/assets/images/chat/chatbubbles/bubble_36_extra.png deleted file mode 100644 index 8e72fe4..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_36_extra.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_36_pointer.png b/src/assets/images/chat/chatbubbles/bubble_36_pointer.png deleted file mode 100644 index caa9e3c..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_36_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_37.png b/src/assets/images/chat/chatbubbles/bubble_37.png deleted file mode 100644 index 43e609e..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_37.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_38.png b/src/assets/images/chat/chatbubbles/bubble_38.png deleted file mode 100644 index 326cdf4..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_38.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_38_extra.png b/src/assets/images/chat/chatbubbles/bubble_38_extra.png deleted file mode 100644 index 73cfcaf..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_38_extra.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_38_pointer.png b/src/assets/images/chat/chatbubbles/bubble_38_pointer.png deleted file mode 100644 index 402e543..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_38_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_3_pointer.png b/src/assets/images/chat/chatbubbles/bubble_3_pointer.png deleted file mode 100644 index 55df368..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_3_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_4.png b/src/assets/images/chat/chatbubbles/bubble_4.png deleted file mode 100644 index c5f5706..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_4.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_4_pointer.png b/src/assets/images/chat/chatbubbles/bubble_4_pointer.png deleted file mode 100644 index beb6919..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_4_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_5.png b/src/assets/images/chat/chatbubbles/bubble_5.png deleted file mode 100644 index fa33a77..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_5.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_5_pointer.png b/src/assets/images/chat/chatbubbles/bubble_5_pointer.png deleted file mode 100644 index ce8131a..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_5_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_6.png b/src/assets/images/chat/chatbubbles/bubble_6.png deleted file mode 100644 index ad6a0f2..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_6.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_6_pointer.png b/src/assets/images/chat/chatbubbles/bubble_6_pointer.png deleted file mode 100644 index 8c343f5..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_6_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_7.png b/src/assets/images/chat/chatbubbles/bubble_7.png deleted file mode 100644 index 8ced1de..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_7.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_7_pointer.png b/src/assets/images/chat/chatbubbles/bubble_7_pointer.png deleted file mode 100644 index 6c05652..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_7_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_8.png b/src/assets/images/chat/chatbubbles/bubble_8.png deleted file mode 100644 index 2d37069..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_8.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_8_pointer.png b/src/assets/images/chat/chatbubbles/bubble_8_pointer.png deleted file mode 100644 index f786e7e..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_8_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_9.png b/src/assets/images/chat/chatbubbles/bubble_9.png deleted file mode 100644 index 23d5721..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_9.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_9_pointer.png b/src/assets/images/chat/chatbubbles/bubble_9_pointer.png deleted file mode 100644 index 9bc5919..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_9_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/styles-icon.png b/src/assets/images/chat/styles-icon.png deleted file mode 100644 index 74cd9ec..0000000 Binary files a/src/assets/images/chat/styles-icon.png and /dev/null differ diff --git a/src/assets/images/floorplaneditor/door-direction-0.png b/src/assets/images/floorplaneditor/door-direction-0.png deleted file mode 100644 index 8c272a0..0000000 Binary files a/src/assets/images/floorplaneditor/door-direction-0.png and /dev/null differ diff --git a/src/assets/images/floorplaneditor/door-direction-1.png b/src/assets/images/floorplaneditor/door-direction-1.png deleted file mode 100644 index 52e488f..0000000 Binary files a/src/assets/images/floorplaneditor/door-direction-1.png and /dev/null differ diff --git a/src/assets/images/floorplaneditor/door-direction-2.png b/src/assets/images/floorplaneditor/door-direction-2.png deleted file mode 100644 index da1a1cb..0000000 Binary files a/src/assets/images/floorplaneditor/door-direction-2.png and /dev/null differ diff --git a/src/assets/images/floorplaneditor/door-direction-3.png b/src/assets/images/floorplaneditor/door-direction-3.png deleted file mode 100644 index 15712a9..0000000 Binary files a/src/assets/images/floorplaneditor/door-direction-3.png and /dev/null differ diff --git a/src/assets/images/floorplaneditor/door-direction-4.png b/src/assets/images/floorplaneditor/door-direction-4.png deleted file mode 100644 index eb1b4b5..0000000 Binary files a/src/assets/images/floorplaneditor/door-direction-4.png and /dev/null differ diff --git a/src/assets/images/floorplaneditor/door-direction-5.png b/src/assets/images/floorplaneditor/door-direction-5.png deleted file mode 100644 index 46e6f4d..0000000 Binary files a/src/assets/images/floorplaneditor/door-direction-5.png and /dev/null differ diff --git a/src/assets/images/floorplaneditor/door-direction-6.png b/src/assets/images/floorplaneditor/door-direction-6.png deleted file mode 100644 index fda613a..0000000 Binary files a/src/assets/images/floorplaneditor/door-direction-6.png and /dev/null differ diff --git a/src/assets/images/floorplaneditor/door-direction-7.png b/src/assets/images/floorplaneditor/door-direction-7.png deleted file mode 100644 index 96fa8e4..0000000 Binary files a/src/assets/images/floorplaneditor/door-direction-7.png and /dev/null differ diff --git a/src/assets/images/floorplaneditor/icon-door.png b/src/assets/images/floorplaneditor/icon-door.png deleted file mode 100644 index 1b56bb2..0000000 Binary files a/src/assets/images/floorplaneditor/icon-door.png and /dev/null differ diff --git a/src/assets/images/floorplaneditor/icon-tile-down.png b/src/assets/images/floorplaneditor/icon-tile-down.png deleted file mode 100644 index 352c48d..0000000 Binary files a/src/assets/images/floorplaneditor/icon-tile-down.png and /dev/null differ diff --git a/src/assets/images/floorplaneditor/icon-tile-set.png b/src/assets/images/floorplaneditor/icon-tile-set.png deleted file mode 100644 index eac6153..0000000 Binary files a/src/assets/images/floorplaneditor/icon-tile-set.png and /dev/null differ diff --git a/src/assets/images/floorplaneditor/icon-tile-unset.png b/src/assets/images/floorplaneditor/icon-tile-unset.png deleted file mode 100644 index 3f5e218..0000000 Binary files a/src/assets/images/floorplaneditor/icon-tile-unset.png and /dev/null differ diff --git a/src/assets/images/floorplaneditor/icon-tile-up.png b/src/assets/images/floorplaneditor/icon-tile-up.png deleted file mode 100644 index 27153e0..0000000 Binary files a/src/assets/images/floorplaneditor/icon-tile-up.png and /dev/null differ diff --git a/src/assets/images/floorplaneditor/preview_tile.png b/src/assets/images/floorplaneditor/preview_tile.png deleted file mode 100644 index 607f450..0000000 Binary files a/src/assets/images/floorplaneditor/preview_tile.png and /dev/null differ diff --git a/src/assets/images/floorplaneditor/selected_height_icon.png b/src/assets/images/floorplaneditor/selected_height_icon.png deleted file mode 100644 index f763fde..0000000 Binary files a/src/assets/images/floorplaneditor/selected_height_icon.png and /dev/null differ diff --git a/src/assets/images/friends/friends-spritesheet.png b/src/assets/images/friends/friends-spritesheet.png deleted file mode 100644 index aa72325..0000000 Binary files a/src/assets/images/friends/friends-spritesheet.png and /dev/null differ diff --git a/src/assets/images/friends/icon-accept.png b/src/assets/images/friends/icon-accept.png deleted file mode 100644 index da56941..0000000 Binary files a/src/assets/images/friends/icon-accept.png and /dev/null differ diff --git a/src/assets/images/friends/icon-add.png b/src/assets/images/friends/icon-add.png deleted file mode 100644 index d570c8f..0000000 Binary files a/src/assets/images/friends/icon-add.png and /dev/null differ diff --git a/src/assets/images/friends/icon-bobba.png b/src/assets/images/friends/icon-bobba.png deleted file mode 100644 index eaea895..0000000 Binary files a/src/assets/images/friends/icon-bobba.png and /dev/null differ diff --git a/src/assets/images/friends/icon-chat.png b/src/assets/images/friends/icon-chat.png deleted file mode 100644 index 631b7bc..0000000 Binary files a/src/assets/images/friends/icon-chat.png and /dev/null differ diff --git a/src/assets/images/friends/icon-deny.png b/src/assets/images/friends/icon-deny.png deleted file mode 100644 index c74e5c0..0000000 Binary files a/src/assets/images/friends/icon-deny.png and /dev/null differ diff --git a/src/assets/images/friends/icon-follow.png b/src/assets/images/friends/icon-follow.png deleted file mode 100644 index 9e04516..0000000 Binary files a/src/assets/images/friends/icon-follow.png and /dev/null differ diff --git a/src/assets/images/friends/icon-friendbar-chat.png b/src/assets/images/friends/icon-friendbar-chat.png deleted file mode 100644 index e0c1645..0000000 Binary files a/src/assets/images/friends/icon-friendbar-chat.png and /dev/null differ diff --git a/src/assets/images/friends/icon-friendbar-visit.png b/src/assets/images/friends/icon-friendbar-visit.png deleted file mode 100644 index fac57d9..0000000 Binary files a/src/assets/images/friends/icon-friendbar-visit.png and /dev/null differ diff --git a/src/assets/images/friends/icon-heart.png b/src/assets/images/friends/icon-heart.png deleted file mode 100644 index 5dd1015..0000000 Binary files a/src/assets/images/friends/icon-heart.png and /dev/null differ diff --git a/src/assets/images/friends/icon-new-message.png b/src/assets/images/friends/icon-new-message.png deleted file mode 100644 index 46d23f5..0000000 Binary files a/src/assets/images/friends/icon-new-message.png and /dev/null differ diff --git a/src/assets/images/friends/icon-none.png b/src/assets/images/friends/icon-none.png deleted file mode 100644 index ececd9e..0000000 Binary files a/src/assets/images/friends/icon-none.png and /dev/null differ diff --git a/src/assets/images/friends/icon-profile-sm-hover.png b/src/assets/images/friends/icon-profile-sm-hover.png deleted file mode 100644 index f8f42f2..0000000 Binary files a/src/assets/images/friends/icon-profile-sm-hover.png and /dev/null differ diff --git a/src/assets/images/friends/icon-profile-sm.png b/src/assets/images/friends/icon-profile-sm.png deleted file mode 100644 index 60107e1..0000000 Binary files a/src/assets/images/friends/icon-profile-sm.png and /dev/null differ diff --git a/src/assets/images/friends/icon-profile.png b/src/assets/images/friends/icon-profile.png deleted file mode 100644 index 2c8ec5c..0000000 Binary files a/src/assets/images/friends/icon-profile.png and /dev/null differ diff --git a/src/assets/images/friends/icon-smile.png b/src/assets/images/friends/icon-smile.png deleted file mode 100644 index 62fcae6..0000000 Binary files a/src/assets/images/friends/icon-smile.png and /dev/null differ diff --git a/src/assets/images/friends/icon-warning.png b/src/assets/images/friends/icon-warning.png deleted file mode 100644 index 3a3ffcf..0000000 Binary files a/src/assets/images/friends/icon-warning.png and /dev/null differ diff --git a/src/assets/images/friends/messenger_notification_icon.png b/src/assets/images/friends/messenger_notification_icon.png deleted file mode 100644 index 73f7e5e..0000000 Binary files a/src/assets/images/friends/messenger_notification_icon.png and /dev/null differ diff --git a/src/assets/images/gamecenter/selectedIcon.png b/src/assets/images/gamecenter/selectedIcon.png deleted file mode 100644 index 718e48b..0000000 Binary files a/src/assets/images/gamecenter/selectedIcon.png and /dev/null differ diff --git a/src/assets/images/gift/gift_tag.png b/src/assets/images/gift/gift_tag.png deleted file mode 100644 index 3c24813..0000000 Binary files a/src/assets/images/gift/gift_tag.png and /dev/null differ diff --git a/src/assets/images/gift/incognito.png b/src/assets/images/gift/incognito.png deleted file mode 100644 index 304c30c..0000000 Binary files a/src/assets/images/gift/incognito.png and /dev/null differ diff --git a/src/assets/images/groups/creator_images.png b/src/assets/images/groups/creator_images.png deleted file mode 100644 index b39b0d7..0000000 Binary files a/src/assets/images/groups/creator_images.png and /dev/null differ diff --git a/src/assets/images/groups/creator_tabs.png b/src/assets/images/groups/creator_tabs.png deleted file mode 100644 index e95b9f0..0000000 Binary files a/src/assets/images/groups/creator_tabs.png and /dev/null differ diff --git a/src/assets/images/groups/icons/group_decorate_icon.png b/src/assets/images/groups/icons/group_decorate_icon.png deleted file mode 100644 index 3a395fb..0000000 Binary files a/src/assets/images/groups/icons/group_decorate_icon.png and /dev/null differ diff --git a/src/assets/images/groups/icons/group_favorite.png b/src/assets/images/groups/icons/group_favorite.png deleted file mode 100644 index 4cd734d..0000000 Binary files a/src/assets/images/groups/icons/group_favorite.png and /dev/null differ diff --git a/src/assets/images/groups/icons/group_icon_admin.png b/src/assets/images/groups/icons/group_icon_admin.png deleted file mode 100644 index bad07e4..0000000 Binary files a/src/assets/images/groups/icons/group_icon_admin.png and /dev/null differ diff --git a/src/assets/images/groups/icons/group_icon_big_admin.png b/src/assets/images/groups/icons/group_icon_big_admin.png deleted file mode 100644 index 2d3e287..0000000 Binary files a/src/assets/images/groups/icons/group_icon_big_admin.png and /dev/null differ diff --git a/src/assets/images/groups/icons/group_icon_big_member.png b/src/assets/images/groups/icons/group_icon_big_member.png deleted file mode 100644 index 3435937..0000000 Binary files a/src/assets/images/groups/icons/group_icon_big_member.png and /dev/null differ diff --git a/src/assets/images/groups/icons/group_icon_big_owner.png b/src/assets/images/groups/icons/group_icon_big_owner.png deleted file mode 100644 index 52b8361..0000000 Binary files a/src/assets/images/groups/icons/group_icon_big_owner.png and /dev/null differ diff --git a/src/assets/images/groups/icons/group_icon_not_admin.png b/src/assets/images/groups/icons/group_icon_not_admin.png deleted file mode 100644 index 7c8b9ee..0000000 Binary files a/src/assets/images/groups/icons/group_icon_not_admin.png and /dev/null differ diff --git a/src/assets/images/groups/icons/group_icon_small_owner.png b/src/assets/images/groups/icons/group_icon_small_owner.png deleted file mode 100644 index 7230ecc..0000000 Binary files a/src/assets/images/groups/icons/group_icon_small_owner.png and /dev/null differ diff --git a/src/assets/images/groups/icons/group_notfavorite.png b/src/assets/images/groups/icons/group_notfavorite.png deleted file mode 100644 index 835d8eb..0000000 Binary files a/src/assets/images/groups/icons/group_notfavorite.png and /dev/null differ diff --git a/src/assets/images/groups/icons/grouptype_icon_0.png b/src/assets/images/groups/icons/grouptype_icon_0.png deleted file mode 100644 index 9dc4191..0000000 Binary files a/src/assets/images/groups/icons/grouptype_icon_0.png and /dev/null differ diff --git a/src/assets/images/groups/icons/grouptype_icon_1.png b/src/assets/images/groups/icons/grouptype_icon_1.png deleted file mode 100644 index ed37213..0000000 Binary files a/src/assets/images/groups/icons/grouptype_icon_1.png and /dev/null differ diff --git a/src/assets/images/groups/icons/grouptype_icon_2.png b/src/assets/images/groups/icons/grouptype_icon_2.png deleted file mode 100644 index 6a5c057..0000000 Binary files a/src/assets/images/groups/icons/grouptype_icon_2.png and /dev/null differ diff --git a/src/assets/images/groups/no-group-1.png b/src/assets/images/groups/no-group-1.png deleted file mode 100644 index caf0182..0000000 Binary files a/src/assets/images/groups/no-group-1.png and /dev/null differ diff --git a/src/assets/images/groups/no-group-2.png b/src/assets/images/groups/no-group-2.png deleted file mode 100644 index 797c946..0000000 Binary files a/src/assets/images/groups/no-group-2.png and /dev/null differ diff --git a/src/assets/images/groups/no-group-3.png b/src/assets/images/groups/no-group-3.png deleted file mode 100644 index e5d6a7b..0000000 Binary files a/src/assets/images/groups/no-group-3.png and /dev/null differ diff --git a/src/assets/images/groups/no-group-spritesheet.png b/src/assets/images/groups/no-group-spritesheet.png deleted file mode 100644 index 3eed4b9..0000000 Binary files a/src/assets/images/groups/no-group-spritesheet.png and /dev/null differ diff --git a/src/assets/images/guide-tool/guide_tool_duty_switch.png b/src/assets/images/guide-tool/guide_tool_duty_switch.png deleted file mode 100644 index f7de6be..0000000 Binary files a/src/assets/images/guide-tool/guide_tool_duty_switch.png and /dev/null differ diff --git a/src/assets/images/guide-tool/guide_tool_info_icon.png b/src/assets/images/guide-tool/guide_tool_info_icon.png deleted file mode 100644 index 32c4a35..0000000 Binary files a/src/assets/images/guide-tool/guide_tool_info_icon.png and /dev/null differ diff --git a/src/assets/images/hc-center/benefits.png b/src/assets/images/hc-center/benefits.png deleted file mode 100644 index 508ecc8..0000000 Binary files a/src/assets/images/hc-center/benefits.png and /dev/null differ diff --git a/src/assets/images/hc-center/clock.png b/src/assets/images/hc-center/clock.png deleted file mode 100644 index 4c37e95..0000000 Binary files a/src/assets/images/hc-center/clock.png and /dev/null differ diff --git a/src/assets/images/hc-center/hc_logo.gif b/src/assets/images/hc-center/hc_logo.gif deleted file mode 100644 index 8834034..0000000 Binary files a/src/assets/images/hc-center/hc_logo.gif and /dev/null differ diff --git a/src/assets/images/hc-center/payday.png b/src/assets/images/hc-center/payday.png deleted file mode 100644 index c9bd80b..0000000 Binary files a/src/assets/images/hc-center/payday.png and /dev/null differ diff --git a/src/assets/images/help/help_index.png b/src/assets/images/help/help_index.png deleted file mode 100644 index 2844f41..0000000 Binary files a/src/assets/images/help/help_index.png and /dev/null differ diff --git a/src/assets/images/icons/arrows.png b/src/assets/images/icons/arrows.png deleted file mode 100644 index 47a833c..0000000 Binary files a/src/assets/images/icons/arrows.png and /dev/null differ diff --git a/src/assets/images/icons/camera-colormatrix.png b/src/assets/images/icons/camera-colormatrix.png deleted file mode 100644 index 894396e..0000000 Binary files a/src/assets/images/icons/camera-colormatrix.png and /dev/null differ diff --git a/src/assets/images/icons/camera-composite.png b/src/assets/images/icons/camera-composite.png deleted file mode 100644 index 681fb18..0000000 Binary files a/src/assets/images/icons/camera-composite.png and /dev/null differ diff --git a/src/assets/images/icons/camera-small.png b/src/assets/images/icons/camera-small.png deleted file mode 100644 index 1c0563e..0000000 Binary files a/src/assets/images/icons/camera-small.png and /dev/null differ diff --git a/src/assets/images/icons/chat-history.png b/src/assets/images/icons/chat-history.png deleted file mode 100644 index da51f37..0000000 Binary files a/src/assets/images/icons/chat-history.png and /dev/null differ diff --git a/src/assets/images/icons/close.png b/src/assets/images/icons/close.png deleted file mode 100644 index a723b3e..0000000 Binary files a/src/assets/images/icons/close.png and /dev/null differ diff --git a/src/assets/images/icons/cog.png b/src/assets/images/icons/cog.png deleted file mode 100644 index b7101d7..0000000 Binary files a/src/assets/images/icons/cog.png and /dev/null differ diff --git a/src/assets/images/icons/help.png b/src/assets/images/icons/help.png deleted file mode 100644 index 50d8aa8..0000000 Binary files a/src/assets/images/icons/help.png and /dev/null differ diff --git a/src/assets/images/icons/house-small.png b/src/assets/images/icons/house-small.png deleted file mode 100644 index e106a45..0000000 Binary files a/src/assets/images/icons/house-small.png and /dev/null differ diff --git a/src/assets/images/icons/icon_cog.png b/src/assets/images/icons/icon_cog.png deleted file mode 100644 index 7175afb..0000000 Binary files a/src/assets/images/icons/icon_cog.png and /dev/null differ diff --git a/src/assets/images/icons/like-room.png b/src/assets/images/icons/like-room.png deleted file mode 100644 index 1c13cd8..0000000 Binary files a/src/assets/images/icons/like-room.png and /dev/null differ diff --git a/src/assets/images/icons/loading-icon.png b/src/assets/images/icons/loading-icon.png deleted file mode 100644 index e3d64d0..0000000 Binary files a/src/assets/images/icons/loading-icon.png and /dev/null differ diff --git a/src/assets/images/icons/room-link.png b/src/assets/images/icons/room-link.png deleted file mode 100644 index efbebf4..0000000 Binary files a/src/assets/images/icons/room-link.png and /dev/null differ diff --git a/src/assets/images/icons/sign-exclamation.png b/src/assets/images/icons/sign-exclamation.png deleted file mode 100644 index 7db61fb..0000000 Binary files a/src/assets/images/icons/sign-exclamation.png and /dev/null differ diff --git a/src/assets/images/icons/sign-heart.png b/src/assets/images/icons/sign-heart.png deleted file mode 100644 index 8ac5685..0000000 Binary files a/src/assets/images/icons/sign-heart.png and /dev/null differ diff --git a/src/assets/images/icons/sign-red.png b/src/assets/images/icons/sign-red.png deleted file mode 100644 index ac0915e..0000000 Binary files a/src/assets/images/icons/sign-red.png and /dev/null differ diff --git a/src/assets/images/icons/sign-skull.png b/src/assets/images/icons/sign-skull.png deleted file mode 100644 index 6221d9a..0000000 Binary files a/src/assets/images/icons/sign-skull.png and /dev/null differ diff --git a/src/assets/images/icons/sign-smile.png b/src/assets/images/icons/sign-smile.png deleted file mode 100644 index 1a1721c..0000000 Binary files a/src/assets/images/icons/sign-smile.png and /dev/null differ diff --git a/src/assets/images/icons/sign-soccer.png b/src/assets/images/icons/sign-soccer.png deleted file mode 100644 index 334f1fa..0000000 Binary files a/src/assets/images/icons/sign-soccer.png and /dev/null differ diff --git a/src/assets/images/icons/sign-yellow.png b/src/assets/images/icons/sign-yellow.png deleted file mode 100644 index 272358f..0000000 Binary files a/src/assets/images/icons/sign-yellow.png and /dev/null differ diff --git a/src/assets/images/icons/small-room.png b/src/assets/images/icons/small-room.png deleted file mode 100644 index c8bbbcc..0000000 Binary files a/src/assets/images/icons/small-room.png and /dev/null differ diff --git a/src/assets/images/icons/tickets.png b/src/assets/images/icons/tickets.png deleted file mode 100644 index 81f4883..0000000 Binary files a/src/assets/images/icons/tickets.png and /dev/null differ diff --git a/src/assets/images/icons/user.png b/src/assets/images/icons/user.png deleted file mode 100644 index c4155a2..0000000 Binary files a/src/assets/images/icons/user.png and /dev/null differ diff --git a/src/assets/images/icons/zoom-less.png b/src/assets/images/icons/zoom-less.png deleted file mode 100644 index 36423da..0000000 Binary files a/src/assets/images/icons/zoom-less.png and /dev/null differ diff --git a/src/assets/images/icons/zoom-more.png b/src/assets/images/icons/zoom-more.png deleted file mode 100644 index c14a9e8..0000000 Binary files a/src/assets/images/icons/zoom-more.png and /dev/null differ diff --git a/src/assets/images/infostand/bot_background.png b/src/assets/images/infostand/bot_background.png deleted file mode 100644 index cd460bb..0000000 Binary files a/src/assets/images/infostand/bot_background.png and /dev/null differ diff --git a/src/assets/images/infostand/countown-timer.png b/src/assets/images/infostand/countown-timer.png deleted file mode 100644 index ebfe629..0000000 Binary files a/src/assets/images/infostand/countown-timer.png and /dev/null differ diff --git a/src/assets/images/infostand/disk-creator.png b/src/assets/images/infostand/disk-creator.png deleted file mode 100644 index c4e95c9..0000000 Binary files a/src/assets/images/infostand/disk-creator.png and /dev/null differ diff --git a/src/assets/images/infostand/disk-icon.png b/src/assets/images/infostand/disk-icon.png deleted file mode 100644 index 9ee4ed8..0000000 Binary files a/src/assets/images/infostand/disk-icon.png and /dev/null differ diff --git a/src/assets/images/infostand/pencil-icon.png b/src/assets/images/infostand/pencil-icon.png deleted file mode 100644 index 27de0d6..0000000 Binary files a/src/assets/images/infostand/pencil-icon.png and /dev/null differ diff --git a/src/assets/images/infostand/rarity-level.png b/src/assets/images/infostand/rarity-level.png deleted file mode 100644 index eb1278e..0000000 Binary files a/src/assets/images/infostand/rarity-level.png and /dev/null differ diff --git a/src/assets/images/inventory/empty.png b/src/assets/images/inventory/empty.png deleted file mode 100644 index d975b41..0000000 Binary files a/src/assets/images/inventory/empty.png and /dev/null differ diff --git a/src/assets/images/inventory/rarity-level.png b/src/assets/images/inventory/rarity-level.png deleted file mode 100644 index 218eccb..0000000 Binary files a/src/assets/images/inventory/rarity-level.png and /dev/null differ diff --git a/src/assets/images/inventory/trading/locked-icon.png b/src/assets/images/inventory/trading/locked-icon.png deleted file mode 100644 index 4f54e2d..0000000 Binary files a/src/assets/images/inventory/trading/locked-icon.png and /dev/null differ diff --git a/src/assets/images/inventory/trading/unlocked-icon.png b/src/assets/images/inventory/trading/unlocked-icon.png deleted file mode 100644 index d6362c4..0000000 Binary files a/src/assets/images/inventory/trading/unlocked-icon.png and /dev/null differ diff --git a/src/assets/images/loading/connecting-duck-spritesheet.png b/src/assets/images/loading/connecting-duck-spritesheet.png deleted file mode 100644 index 36c5dae..0000000 Binary files a/src/assets/images/loading/connecting-duck-spritesheet.png and /dev/null differ diff --git a/src/assets/images/loading/connecting_duck_01.png b/src/assets/images/loading/connecting_duck_01.png deleted file mode 100644 index e3772c8..0000000 Binary files a/src/assets/images/loading/connecting_duck_01.png and /dev/null differ diff --git a/src/assets/images/loading/connecting_duck_02.png b/src/assets/images/loading/connecting_duck_02.png deleted file mode 100644 index 86499a3..0000000 Binary files a/src/assets/images/loading/connecting_duck_02.png and /dev/null differ diff --git a/src/assets/images/loading/connecting_duck_03.png b/src/assets/images/loading/connecting_duck_03.png deleted file mode 100644 index 15a2bb9..0000000 Binary files a/src/assets/images/loading/connecting_duck_03.png and /dev/null differ diff --git a/src/assets/images/loading/connecting_duck_04.png b/src/assets/images/loading/connecting_duck_04.png deleted file mode 100644 index 90860f2..0000000 Binary files a/src/assets/images/loading/connecting_duck_04.png and /dev/null differ diff --git a/src/assets/images/loading/connecting_duck_05.png b/src/assets/images/loading/connecting_duck_05.png deleted file mode 100644 index a72154a..0000000 Binary files a/src/assets/images/loading/connecting_duck_05.png and /dev/null differ diff --git a/src/assets/images/loading/connecting_duck_06.png b/src/assets/images/loading/connecting_duck_06.png deleted file mode 100644 index 0e51a51..0000000 Binary files a/src/assets/images/loading/connecting_duck_06.png and /dev/null differ diff --git a/src/assets/images/loading/connecting_duck_07.png b/src/assets/images/loading/connecting_duck_07.png deleted file mode 100644 index 76c9e34..0000000 Binary files a/src/assets/images/loading/connecting_duck_07.png and /dev/null differ diff --git a/src/assets/images/loading/progress_habbos.gif b/src/assets/images/loading/progress_habbos.gif deleted file mode 100644 index 2224994..0000000 Binary files a/src/assets/images/loading/progress_habbos.gif and /dev/null differ diff --git a/src/assets/images/modtool/chatlog.gif b/src/assets/images/modtool/chatlog.gif deleted file mode 100644 index a64ca0b..0000000 Binary files a/src/assets/images/modtool/chatlog.gif and /dev/null differ diff --git a/src/assets/images/modtool/key.gif b/src/assets/images/modtool/key.gif deleted file mode 100644 index 578ee65..0000000 Binary files a/src/assets/images/modtool/key.gif and /dev/null differ diff --git a/src/assets/images/modtool/m_icon.png b/src/assets/images/modtool/m_icon.png deleted file mode 100644 index 1116b4d..0000000 Binary files a/src/assets/images/modtool/m_icon.png and /dev/null differ diff --git a/src/assets/images/modtool/reports.png b/src/assets/images/modtool/reports.png deleted file mode 100644 index 4731fed..0000000 Binary files a/src/assets/images/modtool/reports.png and /dev/null differ diff --git a/src/assets/images/modtool/room.gif b/src/assets/images/modtool/room.gif deleted file mode 100644 index 94e77dd..0000000 Binary files a/src/assets/images/modtool/room.gif and /dev/null differ diff --git a/src/assets/images/modtool/room.png b/src/assets/images/modtool/room.png deleted file mode 100644 index 2ce5efa..0000000 Binary files a/src/assets/images/modtool/room.png and /dev/null differ diff --git a/src/assets/images/modtool/user.gif b/src/assets/images/modtool/user.gif deleted file mode 100644 index ab9a590..0000000 Binary files a/src/assets/images/modtool/user.gif and /dev/null differ diff --git a/src/assets/images/modtool/wrench.gif b/src/assets/images/modtool/wrench.gif deleted file mode 100644 index 530c78a..0000000 Binary files a/src/assets/images/modtool/wrench.gif and /dev/null differ diff --git a/src/assets/images/mysterybox/chain_mysterybox_box_overlay.png b/src/assets/images/mysterybox/chain_mysterybox_box_overlay.png deleted file mode 100644 index 5914aa5..0000000 Binary files a/src/assets/images/mysterybox/chain_mysterybox_box_overlay.png and /dev/null differ diff --git a/src/assets/images/mysterybox/key_overlay.png b/src/assets/images/mysterybox/key_overlay.png deleted file mode 100644 index 8f8c2a5..0000000 Binary files a/src/assets/images/mysterybox/key_overlay.png and /dev/null differ diff --git a/src/assets/images/mysterybox/mystery_box.png b/src/assets/images/mysterybox/mystery_box.png deleted file mode 100644 index e85f966..0000000 Binary files a/src/assets/images/mysterybox/mystery_box.png and /dev/null differ diff --git a/src/assets/images/mysterybox/mystery_box_key.png b/src/assets/images/mysterybox/mystery_box_key.png deleted file mode 100644 index 79b43de..0000000 Binary files a/src/assets/images/mysterybox/mystery_box_key.png and /dev/null differ diff --git a/src/assets/images/mysterytrophy/frank_mystery_trophy.png b/src/assets/images/mysterytrophy/frank_mystery_trophy.png deleted file mode 100644 index 67bfeba..0000000 Binary files a/src/assets/images/mysterytrophy/frank_mystery_trophy.png and /dev/null differ diff --git a/src/assets/images/navigator/icons/info.png b/src/assets/images/navigator/icons/info.png deleted file mode 100644 index b32d14d..0000000 Binary files a/src/assets/images/navigator/icons/info.png and /dev/null differ diff --git a/src/assets/images/navigator/icons/room_group.png b/src/assets/images/navigator/icons/room_group.png deleted file mode 100644 index b059ba4..0000000 Binary files a/src/assets/images/navigator/icons/room_group.png and /dev/null differ diff --git a/src/assets/images/navigator/icons/room_invisible.png b/src/assets/images/navigator/icons/room_invisible.png deleted file mode 100644 index 976fe8b..0000000 Binary files a/src/assets/images/navigator/icons/room_invisible.png and /dev/null differ diff --git a/src/assets/images/navigator/icons/room_locked.png b/src/assets/images/navigator/icons/room_locked.png deleted file mode 100644 index f46843c..0000000 Binary files a/src/assets/images/navigator/icons/room_locked.png and /dev/null differ diff --git a/src/assets/images/navigator/icons/room_password.png b/src/assets/images/navigator/icons/room_password.png deleted file mode 100644 index 9fa392f..0000000 Binary files a/src/assets/images/navigator/icons/room_password.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_0.png b/src/assets/images/navigator/models/model_0.png deleted file mode 100644 index 8b7b1d3..0000000 Binary files a/src/assets/images/navigator/models/model_0.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_1.png b/src/assets/images/navigator/models/model_1.png deleted file mode 100644 index 36f325a..0000000 Binary files a/src/assets/images/navigator/models/model_1.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_2.png b/src/assets/images/navigator/models/model_2.png deleted file mode 100644 index 921d6f1..0000000 Binary files a/src/assets/images/navigator/models/model_2.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_3.png b/src/assets/images/navigator/models/model_3.png deleted file mode 100644 index 0444324..0000000 Binary files a/src/assets/images/navigator/models/model_3.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_4.png b/src/assets/images/navigator/models/model_4.png deleted file mode 100644 index e371475..0000000 Binary files a/src/assets/images/navigator/models/model_4.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_5.png b/src/assets/images/navigator/models/model_5.png deleted file mode 100644 index 4036e1d..0000000 Binary files a/src/assets/images/navigator/models/model_5.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_6.png b/src/assets/images/navigator/models/model_6.png deleted file mode 100644 index dd14b3b..0000000 Binary files a/src/assets/images/navigator/models/model_6.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_7.png b/src/assets/images/navigator/models/model_7.png deleted file mode 100644 index 031751e..0000000 Binary files a/src/assets/images/navigator/models/model_7.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_8.png b/src/assets/images/navigator/models/model_8.png deleted file mode 100644 index 7e38e1f..0000000 Binary files a/src/assets/images/navigator/models/model_8.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_9.png b/src/assets/images/navigator/models/model_9.png deleted file mode 100644 index 0f36c7c..0000000 Binary files a/src/assets/images/navigator/models/model_9.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_a.png b/src/assets/images/navigator/models/model_a.png deleted file mode 100644 index cc4a072..0000000 Binary files a/src/assets/images/navigator/models/model_a.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_b.png b/src/assets/images/navigator/models/model_b.png deleted file mode 100644 index 49b780a..0000000 Binary files a/src/assets/images/navigator/models/model_b.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_c.png b/src/assets/images/navigator/models/model_c.png deleted file mode 100644 index 2ce5efa..0000000 Binary files a/src/assets/images/navigator/models/model_c.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_d.png b/src/assets/images/navigator/models/model_d.png deleted file mode 100644 index de061c8..0000000 Binary files a/src/assets/images/navigator/models/model_d.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_e.png b/src/assets/images/navigator/models/model_e.png deleted file mode 100644 index 039b927..0000000 Binary files a/src/assets/images/navigator/models/model_e.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_f.png b/src/assets/images/navigator/models/model_f.png deleted file mode 100644 index 4b4fadb..0000000 Binary files a/src/assets/images/navigator/models/model_f.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_g.png b/src/assets/images/navigator/models/model_g.png deleted file mode 100644 index 26d0372..0000000 Binary files a/src/assets/images/navigator/models/model_g.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_h.png b/src/assets/images/navigator/models/model_h.png deleted file mode 100644 index d8c4be7..0000000 Binary files a/src/assets/images/navigator/models/model_h.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_i.png b/src/assets/images/navigator/models/model_i.png deleted file mode 100644 index f5e3d55..0000000 Binary files a/src/assets/images/navigator/models/model_i.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_j.png b/src/assets/images/navigator/models/model_j.png deleted file mode 100644 index 8be8f67..0000000 Binary files a/src/assets/images/navigator/models/model_j.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_k.png b/src/assets/images/navigator/models/model_k.png deleted file mode 100644 index 96fcc8b..0000000 Binary files a/src/assets/images/navigator/models/model_k.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_l.png b/src/assets/images/navigator/models/model_l.png deleted file mode 100644 index f479323..0000000 Binary files a/src/assets/images/navigator/models/model_l.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_m.png b/src/assets/images/navigator/models/model_m.png deleted file mode 100644 index d1d8dd7..0000000 Binary files a/src/assets/images/navigator/models/model_m.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_n.png b/src/assets/images/navigator/models/model_n.png deleted file mode 100644 index 6e023a1..0000000 Binary files a/src/assets/images/navigator/models/model_n.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_o.png b/src/assets/images/navigator/models/model_o.png deleted file mode 100644 index 4587064..0000000 Binary files a/src/assets/images/navigator/models/model_o.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_p.png b/src/assets/images/navigator/models/model_p.png deleted file mode 100644 index 356601e..0000000 Binary files a/src/assets/images/navigator/models/model_p.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_q.png b/src/assets/images/navigator/models/model_q.png deleted file mode 100644 index 9208a14..0000000 Binary files a/src/assets/images/navigator/models/model_q.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_r.png b/src/assets/images/navigator/models/model_r.png deleted file mode 100644 index a93d80d..0000000 Binary files a/src/assets/images/navigator/models/model_r.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_snowwar1.png b/src/assets/images/navigator/models/model_snowwar1.png deleted file mode 100644 index 41bab59..0000000 Binary files a/src/assets/images/navigator/models/model_snowwar1.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_snowwar2.png b/src/assets/images/navigator/models/model_snowwar2.png deleted file mode 100644 index 41bab59..0000000 Binary files a/src/assets/images/navigator/models/model_snowwar2.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_t.png b/src/assets/images/navigator/models/model_t.png deleted file mode 100644 index 920255d..0000000 Binary files a/src/assets/images/navigator/models/model_t.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_u.png b/src/assets/images/navigator/models/model_u.png deleted file mode 100644 index 96da101..0000000 Binary files a/src/assets/images/navigator/models/model_u.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_v.png b/src/assets/images/navigator/models/model_v.png deleted file mode 100644 index 6d85c22..0000000 Binary files a/src/assets/images/navigator/models/model_v.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_w.png b/src/assets/images/navigator/models/model_w.png deleted file mode 100644 index 7bc8024..0000000 Binary files a/src/assets/images/navigator/models/model_w.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_x.png b/src/assets/images/navigator/models/model_x.png deleted file mode 100644 index ce04037..0000000 Binary files a/src/assets/images/navigator/models/model_x.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_y.png b/src/assets/images/navigator/models/model_y.png deleted file mode 100644 index 430344c..0000000 Binary files a/src/assets/images/navigator/models/model_y.png and /dev/null differ diff --git a/src/assets/images/navigator/models/model_z.png b/src/assets/images/navigator/models/model_z.png deleted file mode 100644 index 0809c91..0000000 Binary files a/src/assets/images/navigator/models/model_z.png and /dev/null differ diff --git a/src/assets/images/navigator/thumbnail_placeholder.png b/src/assets/images/navigator/thumbnail_placeholder.png deleted file mode 100644 index be26f84..0000000 Binary files a/src/assets/images/navigator/thumbnail_placeholder.png and /dev/null differ diff --git a/src/assets/images/nitro/nitro-dark.svg b/src/assets/images/nitro/nitro-dark.svg deleted file mode 100644 index 20cc533..0000000 --- a/src/assets/images/nitro/nitro-dark.svg +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/src/assets/images/nitro/nitro-light.svg b/src/assets/images/nitro/nitro-light.svg deleted file mode 100644 index 5706684..0000000 --- a/src/assets/images/nitro/nitro-light.svg +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/src/assets/images/nitro/nitro-n-dark.svg b/src/assets/images/nitro/nitro-n-dark.svg deleted file mode 100644 index f8d0ebd..0000000 --- a/src/assets/images/nitro/nitro-n-dark.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - diff --git a/src/assets/images/nitro/nitro-n-light.svg b/src/assets/images/nitro/nitro-n-light.svg deleted file mode 100644 index 4dd94fc..0000000 --- a/src/assets/images/nitro/nitro-n-light.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - diff --git a/src/assets/images/notifications/frank.gif b/src/assets/images/notifications/frank.gif deleted file mode 100644 index 211634f..0000000 Binary files a/src/assets/images/notifications/frank.gif and /dev/null differ diff --git a/src/assets/images/pets/pet-package/gnome.png b/src/assets/images/pets/pet-package/gnome.png deleted file mode 100644 index 2c38828..0000000 Binary files a/src/assets/images/pets/pet-package/gnome.png and /dev/null differ diff --git a/src/assets/images/pets/pet-package/leprechaun_box.png b/src/assets/images/pets/pet-package/leprechaun_box.png deleted file mode 100644 index 1603eb8..0000000 Binary files a/src/assets/images/pets/pet-package/leprechaun_box.png and /dev/null differ diff --git a/src/assets/images/pets/pet-package/petbox_epic.png b/src/assets/images/pets/pet-package/petbox_epic.png deleted file mode 100644 index e09ad77..0000000 Binary files a/src/assets/images/pets/pet-package/petbox_epic.png and /dev/null differ diff --git a/src/assets/images/pets/pet-package/pterosaur_egg.png b/src/assets/images/pets/pet-package/pterosaur_egg.png deleted file mode 100644 index 43ee141..0000000 Binary files a/src/assets/images/pets/pet-package/pterosaur_egg.png and /dev/null differ diff --git a/src/assets/images/pets/pet-package/val11_present.png b/src/assets/images/pets/pet-package/val11_present.png deleted file mode 100644 index 3d371b5..0000000 Binary files a/src/assets/images/pets/pet-package/val11_present.png and /dev/null differ diff --git a/src/assets/images/pets/pet-package/velociraptor_egg.png b/src/assets/images/pets/pet-package/velociraptor_egg.png deleted file mode 100644 index 242f0df..0000000 Binary files a/src/assets/images/pets/pet-package/velociraptor_egg.png and /dev/null differ diff --git a/src/assets/images/prize/prize_background.png b/src/assets/images/prize/prize_background.png deleted file mode 100644 index ec9c030..0000000 Binary files a/src/assets/images/prize/prize_background.png and /dev/null differ diff --git a/src/assets/images/profile/icons/offline.png b/src/assets/images/profile/icons/offline.png deleted file mode 100644 index 677aadc..0000000 Binary files a/src/assets/images/profile/icons/offline.png and /dev/null differ diff --git a/src/assets/images/profile/icons/online.gif b/src/assets/images/profile/icons/online.gif deleted file mode 100644 index 3a79838..0000000 Binary files a/src/assets/images/profile/icons/online.gif and /dev/null differ diff --git a/src/assets/images/profile/icons/tick.png b/src/assets/images/profile/icons/tick.png deleted file mode 100644 index ec8c52f..0000000 Binary files a/src/assets/images/profile/icons/tick.png and /dev/null differ diff --git a/src/assets/images/room-spectator/room_spectator_bottom_left.png b/src/assets/images/room-spectator/room_spectator_bottom_left.png deleted file mode 100644 index 01688cb..0000000 Binary files a/src/assets/images/room-spectator/room_spectator_bottom_left.png and /dev/null differ diff --git a/src/assets/images/room-spectator/room_spectator_bottom_right.png b/src/assets/images/room-spectator/room_spectator_bottom_right.png deleted file mode 100644 index 59c8ef2..0000000 Binary files a/src/assets/images/room-spectator/room_spectator_bottom_right.png and /dev/null differ diff --git a/src/assets/images/room-spectator/room_spectator_middle_bottom.png b/src/assets/images/room-spectator/room_spectator_middle_bottom.png deleted file mode 100644 index ba6fdec..0000000 Binary files a/src/assets/images/room-spectator/room_spectator_middle_bottom.png and /dev/null differ diff --git a/src/assets/images/room-spectator/room_spectator_middle_left.png b/src/assets/images/room-spectator/room_spectator_middle_left.png deleted file mode 100644 index 6d9aaa7..0000000 Binary files a/src/assets/images/room-spectator/room_spectator_middle_left.png and /dev/null differ diff --git a/src/assets/images/room-spectator/room_spectator_middle_right.png b/src/assets/images/room-spectator/room_spectator_middle_right.png deleted file mode 100644 index 9d963b3..0000000 Binary files a/src/assets/images/room-spectator/room_spectator_middle_right.png and /dev/null differ diff --git a/src/assets/images/room-spectator/room_spectator_middle_top.png b/src/assets/images/room-spectator/room_spectator_middle_top.png deleted file mode 100644 index f6559ce..0000000 Binary files a/src/assets/images/room-spectator/room_spectator_middle_top.png and /dev/null differ diff --git a/src/assets/images/room-spectator/room_spectator_top_left.png b/src/assets/images/room-spectator/room_spectator_top_left.png deleted file mode 100644 index 5e62a3c..0000000 Binary files a/src/assets/images/room-spectator/room_spectator_top_left.png and /dev/null differ diff --git a/src/assets/images/room-spectator/room_spectator_top_right.png b/src/assets/images/room-spectator/room_spectator_top_right.png deleted file mode 100644 index 825f3fb..0000000 Binary files a/src/assets/images/room-spectator/room_spectator_top_right.png and /dev/null differ diff --git a/src/assets/images/room-widgets/avatar-info/preview-background.png b/src/assets/images/room-widgets/avatar-info/preview-background.png deleted file mode 100644 index dea4f08..0000000 Binary files a/src/assets/images/room-widgets/avatar-info/preview-background.png and /dev/null differ diff --git a/src/assets/images/room-widgets/camera-widget/btn.png b/src/assets/images/room-widgets/camera-widget/btn.png deleted file mode 100644 index 76b086b..0000000 Binary files a/src/assets/images/room-widgets/camera-widget/btn.png and /dev/null differ diff --git a/src/assets/images/room-widgets/camera-widget/btn_down.png b/src/assets/images/room-widgets/camera-widget/btn_down.png deleted file mode 100644 index 76f25da..0000000 Binary files a/src/assets/images/room-widgets/camera-widget/btn_down.png and /dev/null differ diff --git a/src/assets/images/room-widgets/camera-widget/btn_hi.png b/src/assets/images/room-widgets/camera-widget/btn_hi.png deleted file mode 100644 index 5f04fc0..0000000 Binary files a/src/assets/images/room-widgets/camera-widget/btn_hi.png and /dev/null differ diff --git a/src/assets/images/room-widgets/camera-widget/cam_bg.png b/src/assets/images/room-widgets/camera-widget/cam_bg.png deleted file mode 100644 index d6cf994..0000000 Binary files a/src/assets/images/room-widgets/camera-widget/cam_bg.png and /dev/null differ diff --git a/src/assets/images/room-widgets/camera-widget/camera-spritesheet.png b/src/assets/images/room-widgets/camera-widget/camera-spritesheet.png deleted file mode 100644 index 4ea82e3..0000000 Binary files a/src/assets/images/room-widgets/camera-widget/camera-spritesheet.png and /dev/null differ diff --git a/src/assets/images/room-widgets/camera-widget/viewfinder.png b/src/assets/images/room-widgets/camera-widget/viewfinder.png deleted file mode 100644 index ab6a9b2..0000000 Binary files a/src/assets/images/room-widgets/camera-widget/viewfinder.png and /dev/null differ diff --git a/src/assets/images/room-widgets/dimmer-widget/dimmer_banner.png b/src/assets/images/room-widgets/dimmer-widget/dimmer_banner.png deleted file mode 100644 index fdc6e9f..0000000 Binary files a/src/assets/images/room-widgets/dimmer-widget/dimmer_banner.png and /dev/null differ diff --git a/src/assets/images/room-widgets/engraving-lock-widget/engraving-lock-spritesheet.png b/src/assets/images/room-widgets/engraving-lock-widget/engraving-lock-spritesheet.png deleted file mode 100644 index 472dc85..0000000 Binary files a/src/assets/images/room-widgets/engraving-lock-widget/engraving-lock-spritesheet.png and /dev/null differ diff --git a/src/assets/images/room-widgets/exchange-credit/exchange-credit-image.png b/src/assets/images/room-widgets/exchange-credit/exchange-credit-image.png deleted file mode 100644 index eef5da6..0000000 Binary files a/src/assets/images/room-widgets/exchange-credit/exchange-credit-image.png and /dev/null differ diff --git a/src/assets/images/room-widgets/furni-context-menu/monsterplant-preview.png b/src/assets/images/room-widgets/furni-context-menu/monsterplant-preview.png deleted file mode 100644 index 8d3d771..0000000 Binary files a/src/assets/images/room-widgets/furni-context-menu/monsterplant-preview.png and /dev/null differ diff --git a/src/assets/images/room-widgets/mannequin-widget/mannequin-spritesheet.png b/src/assets/images/room-widgets/mannequin-widget/mannequin-spritesheet.png deleted file mode 100644 index 45e11f3..0000000 Binary files a/src/assets/images/room-widgets/mannequin-widget/mannequin-spritesheet.png and /dev/null differ diff --git a/src/assets/images/room-widgets/playlist-editor/disk_2.png b/src/assets/images/room-widgets/playlist-editor/disk_2.png deleted file mode 100644 index 3033020..0000000 Binary files a/src/assets/images/room-widgets/playlist-editor/disk_2.png and /dev/null differ diff --git a/src/assets/images/room-widgets/playlist-editor/disk_image.png b/src/assets/images/room-widgets/playlist-editor/disk_image.png deleted file mode 100644 index 7a8ab45..0000000 Binary files a/src/assets/images/room-widgets/playlist-editor/disk_image.png and /dev/null differ diff --git a/src/assets/images/room-widgets/playlist-editor/move.png b/src/assets/images/room-widgets/playlist-editor/move.png deleted file mode 100644 index 9d1635d..0000000 Binary files a/src/assets/images/room-widgets/playlist-editor/move.png and /dev/null differ diff --git a/src/assets/images/room-widgets/playlist-editor/pause-btn.png b/src/assets/images/room-widgets/playlist-editor/pause-btn.png deleted file mode 100644 index 900f99b..0000000 Binary files a/src/assets/images/room-widgets/playlist-editor/pause-btn.png and /dev/null differ diff --git a/src/assets/images/room-widgets/playlist-editor/pause.png b/src/assets/images/room-widgets/playlist-editor/pause.png deleted file mode 100644 index ec5fef4..0000000 Binary files a/src/assets/images/room-widgets/playlist-editor/pause.png and /dev/null differ diff --git a/src/assets/images/room-widgets/playlist-editor/playing.png b/src/assets/images/room-widgets/playlist-editor/playing.png deleted file mode 100644 index 0e3449d..0000000 Binary files a/src/assets/images/room-widgets/playlist-editor/playing.png and /dev/null differ diff --git a/src/assets/images/room-widgets/playlist-editor/preview.png b/src/assets/images/room-widgets/playlist-editor/preview.png deleted file mode 100644 index 160f0be..0000000 Binary files a/src/assets/images/room-widgets/playlist-editor/preview.png and /dev/null differ diff --git a/src/assets/images/room-widgets/stickie-widget/stickie-blue.png b/src/assets/images/room-widgets/stickie-widget/stickie-blue.png deleted file mode 100644 index 9a14182..0000000 Binary files a/src/assets/images/room-widgets/stickie-widget/stickie-blue.png and /dev/null differ diff --git a/src/assets/images/room-widgets/stickie-widget/stickie-christmas.png b/src/assets/images/room-widgets/stickie-widget/stickie-christmas.png deleted file mode 100644 index 82b4732..0000000 Binary files a/src/assets/images/room-widgets/stickie-widget/stickie-christmas.png and /dev/null differ diff --git a/src/assets/images/room-widgets/stickie-widget/stickie-close.png b/src/assets/images/room-widgets/stickie-widget/stickie-close.png deleted file mode 100644 index 9621c56..0000000 Binary files a/src/assets/images/room-widgets/stickie-widget/stickie-close.png and /dev/null differ diff --git a/src/assets/images/room-widgets/stickie-widget/stickie-dreams.png b/src/assets/images/room-widgets/stickie-widget/stickie-dreams.png deleted file mode 100644 index 1723bdc..0000000 Binary files a/src/assets/images/room-widgets/stickie-widget/stickie-dreams.png and /dev/null differ diff --git a/src/assets/images/room-widgets/stickie-widget/stickie-green.png b/src/assets/images/room-widgets/stickie-widget/stickie-green.png deleted file mode 100644 index 5e73c74..0000000 Binary files a/src/assets/images/room-widgets/stickie-widget/stickie-green.png and /dev/null differ diff --git a/src/assets/images/room-widgets/stickie-widget/stickie-heart.png b/src/assets/images/room-widgets/stickie-widget/stickie-heart.png deleted file mode 100644 index 4552385..0000000 Binary files a/src/assets/images/room-widgets/stickie-widget/stickie-heart.png and /dev/null differ diff --git a/src/assets/images/room-widgets/stickie-widget/stickie-juninas.png b/src/assets/images/room-widgets/stickie-widget/stickie-juninas.png deleted file mode 100644 index faaea9d..0000000 Binary files a/src/assets/images/room-widgets/stickie-widget/stickie-juninas.png and /dev/null differ diff --git a/src/assets/images/room-widgets/stickie-widget/stickie-pink.png b/src/assets/images/room-widgets/stickie-widget/stickie-pink.png deleted file mode 100644 index 7565899..0000000 Binary files a/src/assets/images/room-widgets/stickie-widget/stickie-pink.png and /dev/null differ diff --git a/src/assets/images/room-widgets/stickie-widget/stickie-shakesp.png b/src/assets/images/room-widgets/stickie-widget/stickie-shakesp.png deleted file mode 100644 index d5011c7..0000000 Binary files a/src/assets/images/room-widgets/stickie-widget/stickie-shakesp.png and /dev/null differ diff --git a/src/assets/images/room-widgets/stickie-widget/stickie-spritesheet.png b/src/assets/images/room-widgets/stickie-widget/stickie-spritesheet.png deleted file mode 100644 index 0249571..0000000 Binary files a/src/assets/images/room-widgets/stickie-widget/stickie-spritesheet.png and /dev/null differ diff --git a/src/assets/images/room-widgets/stickie-widget/stickie-trash.png b/src/assets/images/room-widgets/stickie-widget/stickie-trash.png deleted file mode 100644 index 96dff8f..0000000 Binary files a/src/assets/images/room-widgets/stickie-widget/stickie-trash.png and /dev/null differ diff --git a/src/assets/images/room-widgets/stickie-widget/stickie-yellow.png b/src/assets/images/room-widgets/stickie-widget/stickie-yellow.png deleted file mode 100644 index 759d3f9..0000000 Binary files a/src/assets/images/room-widgets/stickie-widget/stickie-yellow.png and /dev/null differ diff --git a/src/assets/images/room-widgets/thumbnail-widget/thumbnail-camera-spritesheet.png b/src/assets/images/room-widgets/thumbnail-widget/thumbnail-camera-spritesheet.png deleted file mode 100644 index 63a9397..0000000 Binary files a/src/assets/images/room-widgets/thumbnail-widget/thumbnail-camera-spritesheet.png and /dev/null differ diff --git a/src/assets/images/room-widgets/trophy-widget/trophy-spritesheet.png b/src/assets/images/room-widgets/trophy-widget/trophy-spritesheet.png deleted file mode 100644 index f9184cb..0000000 Binary files a/src/assets/images/room-widgets/trophy-widget/trophy-spritesheet.png and /dev/null differ diff --git a/src/assets/images/room-widgets/wordquiz-widget/thumbs-down-small.png b/src/assets/images/room-widgets/wordquiz-widget/thumbs-down-small.png deleted file mode 100644 index 78e51cf..0000000 Binary files a/src/assets/images/room-widgets/wordquiz-widget/thumbs-down-small.png and /dev/null differ diff --git a/src/assets/images/room-widgets/wordquiz-widget/thumbs-down.png b/src/assets/images/room-widgets/wordquiz-widget/thumbs-down.png deleted file mode 100644 index fd320c5..0000000 Binary files a/src/assets/images/room-widgets/wordquiz-widget/thumbs-down.png and /dev/null differ diff --git a/src/assets/images/room-widgets/wordquiz-widget/thumbs-up-small.png b/src/assets/images/room-widgets/wordquiz-widget/thumbs-up-small.png deleted file mode 100644 index b93111f..0000000 Binary files a/src/assets/images/room-widgets/wordquiz-widget/thumbs-up-small.png and /dev/null differ diff --git a/src/assets/images/room-widgets/wordquiz-widget/thumbs-up.png b/src/assets/images/room-widgets/wordquiz-widget/thumbs-up.png deleted file mode 100644 index dd65098..0000000 Binary files a/src/assets/images/room-widgets/wordquiz-widget/thumbs-up.png and /dev/null differ diff --git a/src/assets/images/room-widgets/youtube-widget/next.png b/src/assets/images/room-widgets/youtube-widget/next.png deleted file mode 100644 index a02e164..0000000 Binary files a/src/assets/images/room-widgets/youtube-widget/next.png and /dev/null differ diff --git a/src/assets/images/room-widgets/youtube-widget/prev.png b/src/assets/images/room-widgets/youtube-widget/prev.png deleted file mode 100644 index d48b658..0000000 Binary files a/src/assets/images/room-widgets/youtube-widget/prev.png and /dev/null differ diff --git a/src/assets/images/stackhelper/slider-background.png b/src/assets/images/stackhelper/slider-background.png deleted file mode 100644 index 20ab191..0000000 Binary files a/src/assets/images/stackhelper/slider-background.png and /dev/null differ diff --git a/src/assets/images/stackhelper/slider-pointer.png b/src/assets/images/stackhelper/slider-pointer.png deleted file mode 100644 index 8787456..0000000 Binary files a/src/assets/images/stackhelper/slider-pointer.png and /dev/null differ diff --git a/src/assets/images/toolbar/arrow.png b/src/assets/images/toolbar/arrow.png deleted file mode 100644 index bf04ea0..0000000 Binary files a/src/assets/images/toolbar/arrow.png and /dev/null differ diff --git a/src/assets/images/toolbar/friend-search.png b/src/assets/images/toolbar/friend-search.png deleted file mode 100644 index 7156c4f..0000000 Binary files a/src/assets/images/toolbar/friend-search.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/buildersclub.png b/src/assets/images/toolbar/icons/buildersclub.png deleted file mode 100644 index bbf6d68..0000000 Binary files a/src/assets/images/toolbar/icons/buildersclub.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/camera.png b/src/assets/images/toolbar/icons/camera.png deleted file mode 100644 index da5d835..0000000 Binary files a/src/assets/images/toolbar/icons/camera.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/catalog.png b/src/assets/images/toolbar/icons/catalog.png deleted file mode 100644 index f680921..0000000 Binary files a/src/assets/images/toolbar/icons/catalog.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/friend_all.png b/src/assets/images/toolbar/icons/friend_all.png deleted file mode 100644 index b2ca0d7..0000000 Binary files a/src/assets/images/toolbar/icons/friend_all.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/friend_head.png b/src/assets/images/toolbar/icons/friend_head.png deleted file mode 100644 index 6380c90..0000000 Binary files a/src/assets/images/toolbar/icons/friend_head.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/friend_search.png b/src/assets/images/toolbar/icons/friend_search.png deleted file mode 100644 index ebe1c65..0000000 Binary files a/src/assets/images/toolbar/icons/friend_search.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/game.png b/src/assets/images/toolbar/icons/game.png deleted file mode 100644 index 59ef8aa..0000000 Binary files a/src/assets/images/toolbar/icons/game.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/habbo.png b/src/assets/images/toolbar/icons/habbo.png deleted file mode 100644 index 78cd0a4..0000000 Binary files a/src/assets/images/toolbar/icons/habbo.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/house.png b/src/assets/images/toolbar/icons/house.png deleted file mode 100644 index f2c8746..0000000 Binary files a/src/assets/images/toolbar/icons/house.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/inventory.png b/src/assets/images/toolbar/icons/inventory.png deleted file mode 100644 index d848586..0000000 Binary files a/src/assets/images/toolbar/icons/inventory.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/joinroom.png b/src/assets/images/toolbar/icons/joinroom.png deleted file mode 100644 index 894ee78..0000000 Binary files a/src/assets/images/toolbar/icons/joinroom.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/me-menu/achievements.png b/src/assets/images/toolbar/icons/me-menu/achievements.png deleted file mode 100644 index 575464d..0000000 Binary files a/src/assets/images/toolbar/icons/me-menu/achievements.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/me-menu/clothing.png b/src/assets/images/toolbar/icons/me-menu/clothing.png deleted file mode 100644 index bfacabd..0000000 Binary files a/src/assets/images/toolbar/icons/me-menu/clothing.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/me-menu/cog.png b/src/assets/images/toolbar/icons/me-menu/cog.png deleted file mode 100644 index 6180409..0000000 Binary files a/src/assets/images/toolbar/icons/me-menu/cog.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/me-menu/forums.png b/src/assets/images/toolbar/icons/me-menu/forums.png deleted file mode 100644 index e22426e..0000000 Binary files a/src/assets/images/toolbar/icons/me-menu/forums.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/me-menu/helper-tool.png b/src/assets/images/toolbar/icons/me-menu/helper-tool.png deleted file mode 100644 index e324611..0000000 Binary files a/src/assets/images/toolbar/icons/me-menu/helper-tool.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/me-menu/my-rooms.png b/src/assets/images/toolbar/icons/me-menu/my-rooms.png deleted file mode 100644 index 8d4dcad..0000000 Binary files a/src/assets/images/toolbar/icons/me-menu/my-rooms.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/me-menu/profile.png b/src/assets/images/toolbar/icons/me-menu/profile.png deleted file mode 100644 index 04964bf..0000000 Binary files a/src/assets/images/toolbar/icons/me-menu/profile.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/me-menu/rooms.png b/src/assets/images/toolbar/icons/me-menu/rooms.png deleted file mode 100644 index 00261ce..0000000 Binary files a/src/assets/images/toolbar/icons/me-menu/rooms.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/me-menu/talents.png b/src/assets/images/toolbar/icons/me-menu/talents.png deleted file mode 100644 index 2f91dfe..0000000 Binary files a/src/assets/images/toolbar/icons/me-menu/talents.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/message.png b/src/assets/images/toolbar/icons/message.png deleted file mode 100644 index c12d5bb..0000000 Binary files a/src/assets/images/toolbar/icons/message.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/message_unsee.gif b/src/assets/images/toolbar/icons/message_unsee.gif deleted file mode 100644 index eddfe1c..0000000 Binary files a/src/assets/images/toolbar/icons/message_unsee.gif and /dev/null differ diff --git a/src/assets/images/toolbar/icons/modtools.png b/src/assets/images/toolbar/icons/modtools.png deleted file mode 100644 index 24c362f..0000000 Binary files a/src/assets/images/toolbar/icons/modtools.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/rooms.png b/src/assets/images/toolbar/icons/rooms.png deleted file mode 100644 index 00261ce..0000000 Binary files a/src/assets/images/toolbar/icons/rooms.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/sendmessage.png b/src/assets/images/toolbar/icons/sendmessage.png deleted file mode 100644 index 9f64b17..0000000 Binary files a/src/assets/images/toolbar/icons/sendmessage.png and /dev/null differ diff --git a/src/assets/images/unique/catalog-info-amount-bg.png b/src/assets/images/unique/catalog-info-amount-bg.png deleted file mode 100644 index 4a56c9b..0000000 Binary files a/src/assets/images/unique/catalog-info-amount-bg.png and /dev/null differ diff --git a/src/assets/images/unique/catalog-info-sold-out.png b/src/assets/images/unique/catalog-info-sold-out.png deleted file mode 100644 index 79626e1..0000000 Binary files a/src/assets/images/unique/catalog-info-sold-out.png and /dev/null differ diff --git a/src/assets/images/unique/grid-bg-glass.png b/src/assets/images/unique/grid-bg-glass.png deleted file mode 100644 index 5b64c48..0000000 Binary files a/src/assets/images/unique/grid-bg-glass.png and /dev/null differ diff --git a/src/assets/images/unique/grid-bg-sold-out.png b/src/assets/images/unique/grid-bg-sold-out.png deleted file mode 100644 index 94f6662..0000000 Binary files a/src/assets/images/unique/grid-bg-sold-out.png and /dev/null differ diff --git a/src/assets/images/unique/grid-bg.png b/src/assets/images/unique/grid-bg.png deleted file mode 100644 index d7737ba..0000000 Binary files a/src/assets/images/unique/grid-bg.png and /dev/null differ diff --git a/src/assets/images/unique/grid-count-bg.png b/src/assets/images/unique/grid-count-bg.png deleted file mode 100644 index 68e13bd..0000000 Binary files a/src/assets/images/unique/grid-count-bg.png and /dev/null differ diff --git a/src/assets/images/unique/inventory-info-amount-bg.png b/src/assets/images/unique/inventory-info-amount-bg.png deleted file mode 100644 index af4e31e..0000000 Binary files a/src/assets/images/unique/inventory-info-amount-bg.png and /dev/null differ diff --git a/src/assets/images/unique/numbers.png b/src/assets/images/unique/numbers.png deleted file mode 100644 index e1ece79..0000000 Binary files a/src/assets/images/unique/numbers.png and /dev/null differ diff --git a/src/assets/images/wired/card-action-corners.png b/src/assets/images/wired/card-action-corners.png deleted file mode 100644 index faec234..0000000 Binary files a/src/assets/images/wired/card-action-corners.png and /dev/null differ diff --git a/src/assets/images/wired/icon_action.png b/src/assets/images/wired/icon_action.png deleted file mode 100644 index 78e90e6..0000000 Binary files a/src/assets/images/wired/icon_action.png and /dev/null differ diff --git a/src/assets/images/wired/icon_condition.png b/src/assets/images/wired/icon_condition.png deleted file mode 100644 index 26925a6..0000000 Binary files a/src/assets/images/wired/icon_condition.png and /dev/null differ diff --git a/src/assets/images/wired/icon_trigger.png b/src/assets/images/wired/icon_trigger.png deleted file mode 100644 index f48d13c..0000000 Binary files a/src/assets/images/wired/icon_trigger.png and /dev/null differ diff --git a/src/assets/images/wired/icon_wired_around.png b/src/assets/images/wired/icon_wired_around.png deleted file mode 100644 index 0b4b5a1..0000000 Binary files a/src/assets/images/wired/icon_wired_around.png and /dev/null differ diff --git a/src/assets/images/wired/icon_wired_left_right.png b/src/assets/images/wired/icon_wired_left_right.png deleted file mode 100644 index 862d6d8..0000000 Binary files a/src/assets/images/wired/icon_wired_left_right.png and /dev/null differ diff --git a/src/assets/images/wired/icon_wired_north_east.png b/src/assets/images/wired/icon_wired_north_east.png deleted file mode 100644 index 3710854..0000000 Binary files a/src/assets/images/wired/icon_wired_north_east.png and /dev/null differ diff --git a/src/assets/images/wired/icon_wired_north_west.png b/src/assets/images/wired/icon_wired_north_west.png deleted file mode 100644 index 09eeefc..0000000 Binary files a/src/assets/images/wired/icon_wired_north_west.png and /dev/null differ diff --git a/src/assets/images/wired/icon_wired_rotate_clockwise.png b/src/assets/images/wired/icon_wired_rotate_clockwise.png deleted file mode 100644 index 2827e3d..0000000 Binary files a/src/assets/images/wired/icon_wired_rotate_clockwise.png and /dev/null differ diff --git a/src/assets/images/wired/icon_wired_rotate_counter_clockwise.png b/src/assets/images/wired/icon_wired_rotate_counter_clockwise.png deleted file mode 100644 index 7e281ba..0000000 Binary files a/src/assets/images/wired/icon_wired_rotate_counter_clockwise.png and /dev/null differ diff --git a/src/assets/images/wired/icon_wired_south_east.png b/src/assets/images/wired/icon_wired_south_east.png deleted file mode 100644 index 4217c4b..0000000 Binary files a/src/assets/images/wired/icon_wired_south_east.png and /dev/null differ diff --git a/src/assets/images/wired/icon_wired_south_west.png b/src/assets/images/wired/icon_wired_south_west.png deleted file mode 100644 index 07ab1f9..0000000 Binary files a/src/assets/images/wired/icon_wired_south_west.png and /dev/null differ diff --git a/src/assets/images/wired/icon_wired_up_down.png b/src/assets/images/wired/icon_wired_up_down.png deleted file mode 100644 index c2d243b..0000000 Binary files a/src/assets/images/wired/icon_wired_up_down.png and /dev/null differ diff --git a/src/assets/styles/bootstrap/_accordion.scss b/src/assets/styles/bootstrap/_accordion.scss deleted file mode 100644 index fc62ceb..0000000 --- a/src/assets/styles/bootstrap/_accordion.scss +++ /dev/null @@ -1,118 +0,0 @@ -// -// Base styles -// - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: $accordion-button-padding-y $accordion-button-padding-x; - @include font-size($font-size-base); - color: $accordion-button-color; - text-align: left; // Reset button style - background-color: $accordion-button-bg; - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition($accordion-transition); - - &:not(.collapsed) { - color: $accordion-button-active-color; - background-color: $accordion-button-active-bg; - box-shadow: inset 0 ($accordion-border-width * -1) 0 $accordion-border-color; - - &::after { - background-image: escape-svg($accordion-button-active-icon); - transform: $accordion-icon-transform; - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: $accordion-icon-width; - height: $accordion-icon-width; - margin-left: auto; - content: ""; - background-image: escape-svg($accordion-button-icon); - background-repeat: no-repeat; - background-size: $accordion-icon-width; - @include transition($accordion-icon-transition); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - border-color: $accordion-button-focus-border-color; - outline: 0; - box-shadow: $accordion-button-focus-box-shadow; - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - background-color: $accordion-bg; - border: $accordion-border-width solid $accordion-border-color; - - &:first-of-type { - @include border-top-radius($accordion-border-radius); - - .accordion-button { - @include border-top-radius($accordion-inner-border-radius); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius($accordion-border-radius); - - .accordion-button { - &.collapsed { - @include border-bottom-radius($accordion-inner-border-radius); - } - } - - .accordion-collapse { - @include border-bottom-radius($accordion-border-radius); - } - } -} - -.accordion-body { - padding: $accordion-body-padding-y $accordion-body-padding-x; -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - .accordion-collapse { - border-width: 0; - } - - .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - .accordion-button { - @include border-radius(0); - } - } -} diff --git a/src/assets/styles/bootstrap/_alert.scss b/src/assets/styles/bootstrap/_alert.scss deleted file mode 100644 index 80b6a43..0000000 --- a/src/assets/styles/bootstrap/_alert.scss +++ /dev/null @@ -1,58 +0,0 @@ -// -// Base styles -// -@use 'sass:math'; - -.alert { - position: relative; - padding: $alert-padding-y $alert-padding-x; - margin-bottom: $alert-margin-bottom; - border: $alert-border-width solid transparent; - @include border-radius($alert-border-radius); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert. - -@each $state, $value in $theme-colors { - $alert-background: shift-color($value, $alert-bg-scale); - $alert-border: shift-color($value, $alert-border-scale); - $alert-color: shift-color($value, $alert-color-scale); - @if (contrast-ratio($alert-background, $alert-color) < $min-contrast-ratio) { - $alert-color: mix($value, color-contrast($alert-background), math.abs($alert-color-scale)); - } - .alert-#{$state} { - @include alert-variant($alert-background, $alert-border, $alert-color); - } -} -// scss-docs-end alert-modifiers diff --git a/src/assets/styles/bootstrap/_badge.scss b/src/assets/styles/bootstrap/_badge.scss deleted file mode 100644 index 08df1b8..0000000 --- a/src/assets/styles/bootstrap/_badge.scss +++ /dev/null @@ -1,29 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - display: inline-block; - padding: $badge-padding-y $badge-padding-x; - @include font-size($badge-font-size); - font-weight: $badge-font-weight; - line-height: 1; - color: $badge-color; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius($badge-border-radius); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/src/assets/styles/bootstrap/_breadcrumb.scss b/src/assets/styles/bootstrap/_breadcrumb.scss deleted file mode 100644 index f7fafe7..0000000 --- a/src/assets/styles/bootstrap/_breadcrumb.scss +++ /dev/null @@ -1,28 +0,0 @@ -.breadcrumb { - display: flex; - flex-wrap: wrap; - padding: $breadcrumb-padding-y $breadcrumb-padding-x; - margin-bottom: $breadcrumb-margin-bottom; - @include font-size($breadcrumb-font-size); - list-style: none; - background-color: $breadcrumb-bg; - @include border-radius($breadcrumb-border-radius); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: $breadcrumb-item-padding-x; - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: $breadcrumb-item-padding-x; - color: $breadcrumb-divider-color; - content: var(--#{$variable-prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$variable-prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: $breadcrumb-active-color; - } -} diff --git a/src/assets/styles/bootstrap/_button-group.scss b/src/assets/styles/bootstrap/_button-group.scss deleted file mode 100644 index 13aa056..0000000 --- a/src/assets/styles/bootstrap/_button-group.scss +++ /dev/null @@ -1,139 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - // Prevent double borders when buttons are next to each other - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-left: -$btn-border-width; - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: -$btn-border-width; - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - > .btn ~ .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/src/assets/styles/bootstrap/_buttons.scss b/src/assets/styles/bootstrap/_buttons.scss deleted file mode 100644 index 3c2cba9..0000000 --- a/src/assets/styles/bootstrap/_buttons.scss +++ /dev/null @@ -1,116 +0,0 @@ -// -// Base styles -// - -.btn { - display: inline-block; - font-family: $btn-font-family; - font-weight: $btn-font-weight; - line-height: $btn-line-height; - color: $body-color; - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - background-color: transparent; - border: $btn-border-width solid transparent; - @include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-border-radius); - @include transition($btn-transition); - - &:hover { - color: $body-color; - text-decoration: if($link-hover-decoration == underline, none, null); - } - - .btn-check:focus + &, - &:focus { - outline: 0; - box-shadow: $btn-focus-box-shadow; - } - - .btn-check:checked + &, - .btn-check:active + &, - &:active, - &.active { - @include box-shadow($btn-active-box-shadow); - - &:focus { - @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - pointer-events: none; - opacity: $btn-disabled-opacity; - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @include button-variant($value, $value); - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - font-weight: $font-weight-normal; - color: $btn-link-color; - text-decoration: $link-decoration; - box-shadow: none !important; - - &:active { - color: $btn-link-color !important; - } - - &:hover { - color: $btn-link-hover-color; - text-decoration: $link-hover-decoration; - } - - &:focus { - text-decoration: $link-hover-decoration; - } - - &:disabled, - &.disabled { - color: $btn-link-disabled-color; - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/src/assets/styles/bootstrap/_card.scss b/src/assets/styles/bootstrap/_card.scss deleted file mode 100644 index 22890f5..0000000 --- a/src/assets/styles/bootstrap/_card.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.card { - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: $card-height; - word-wrap: break-word; - background-color: $card-bg; - background-clip: border-box; - border: $card-border-width solid $card-border-color; - @include border-radius($card-border-radius); - @include box-shadow($card-box-shadow); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius($card-inner-border-radius); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius($card-inner-border-radius); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: $card-spacer-y $card-spacer-x; - color: $card-color; -} - -.card-title { - margin-bottom: $card-title-spacer-y; -} - -.card-subtitle { - margin-top: -$card-title-spacer-y * .5; - margin-bottom: 0; -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: $card-spacer-x; - } -} - -// -// Optional textual caps -// - -.card-header { - padding: $card-cap-padding-y $card-cap-padding-x; - margin-bottom: 0; // Removes the default margin-bottom of - color: $card-cap-color; - background-color: $card-cap-bg; - border-bottom: $card-border-width solid $card-border-color; - - &:first-child { - @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0); - } -} - -.card-footer { - padding: $card-cap-padding-y $card-cap-padding-x; - color: $card-cap-color; - background-color: $card-cap-bg; - border-top: $card-border-width solid $card-border-color; - - &:last-child { - @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: -$card-cap-padding-x * .5; - margin-bottom: -$card-cap-padding-y; - margin-left: -$card-cap-padding-x * .5; - border-bottom: 0; - - @if $nav-tabs-link-active-bg != $card-bg { - .nav-link.active { - background-color: $card-bg; - border-bottom-color: $card-bg; - } - } -} - -.card-header-pills { - margin-right: -$card-cap-padding-x * .5; - margin-left: -$card-cap-padding-x * .5; -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: $card-img-overlay-padding; - @include border-radius($card-inner-border-radius); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius($card-inner-border-radius); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius($card-inner-border-radius); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: $card-group-margin; - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4 - flex: 1 0 0%; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - .card-img-top, - .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - .card-img-bottom, - .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - .card-img-top, - .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - .card-img-bottom, - .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/src/assets/styles/bootstrap/_carousel.scss b/src/assets/styles/bootstrap/_carousel.scss deleted file mode 100644 index 3d8fb15..0000000 --- a/src/assets/styles/bootstrap/_carousel.scss +++ /dev/null @@ -1,229 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -/* rtl:begin:ignore */ -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - -/* rtl:end:ignore */ - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -/* rtl:options: { - "autoRename": true, - "stringMap":[ { - "name" : "prev-next", - "search" : "prev", - "replace" : "next" - } ] -} */ -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg); -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg); -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - list-style: none; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: $carousel-indicator-active-bg; - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: $carousel-caption-color; - text-align: center; -} - -// Dark mode carousel - -.carousel-dark { - .carousel-control-prev-icon, - .carousel-control-next-icon { - filter: $carousel-dark-control-icon-filter; - } - - .carousel-indicators [data-bs-target] { - background-color: $carousel-dark-indicator-active-bg; - } - - .carousel-caption { - color: $carousel-dark-caption-color; - } -} diff --git a/src/assets/styles/bootstrap/_close.scss b/src/assets/styles/bootstrap/_close.scss deleted file mode 100644 index 32a0f68..0000000 --- a/src/assets/styles/bootstrap/_close.scss +++ /dev/null @@ -1,40 +0,0 @@ -// transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: $btn-close-color; - background: transparent escape-svg($btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - border: 0; // for button elements - @include border-radius(); - opacity: $btn-close-opacity; - - // Override 's hover style - &:hover { - color: $btn-close-color; - text-decoration: none; - opacity: $btn-close-hover-opacity; - } - - &:focus { - outline: 0; - box-shadow: $btn-close-focus-shadow; - opacity: $btn-close-focus-opacity; - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: $btn-close-disabled-opacity; - } -} - -.btn-close-white { - filter: $btn-close-white-filter; -} diff --git a/src/assets/styles/bootstrap/_containers.scss b/src/assets/styles/bootstrap/_containers.scss deleted file mode 100644 index f88f1e5..0000000 --- a/src/assets/styles/bootstrap/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-grid-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/src/assets/styles/bootstrap/_dropdown.scss b/src/assets/styles/bootstrap/_dropdown.scss deleted file mode 100644 index adc1143..0000000 --- a/src/assets/styles/bootstrap/_dropdown.scss +++ /dev/null @@ -1,240 +0,0 @@ -// The dropdown wrapper (`
`) -.dropup, -.dropend, -.dropdown, -.dropstart { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - position: absolute; - z-index: $zindex-dropdown; - display: none; // none by default, but block on "open" of the menu - min-width: $dropdown-min-width; - padding: $dropdown-padding-y $dropdown-padding-x; - margin: 0; // Override default margin of ul - @include font-size($dropdown-font-size); - color: $dropdown-color; - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: $dropdown-bg; - background-clip: padding-box; - border: $dropdown-border-width solid $dropdown-border-color; - @include border-radius($dropdown-border-radius); - @include box-shadow($dropdown-box-shadow); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: $dropdown-spacer; - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: $dropdown-spacer; - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: $dropdown-spacer; - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: $dropdown-spacer; - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
`) within the dropdown -.dropdown-divider { - height: 0; - margin: $dropdown-divider-margin-y 0; - overflow: hidden; - border-top: 1px solid $dropdown-divider-bg; -} - -// Links, buttons, and more within the dropdown menu -// -// `
- -
- - - ); -}; diff --git a/src/common/layout/LayoutNotificationAlertView.tsx b/src/common/layout/LayoutNotificationAlertView.tsx deleted file mode 100644 index 8db771a..0000000 --- a/src/common/layout/LayoutNotificationAlertView.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { FC, useMemo } from 'react'; -import { NotificationAlertType } from '../../api'; -import { NitroCardContentView, NitroCardHeaderView, NitroCardView, NitroCardViewProps } from '../card'; - -export interface LayoutNotificationAlertViewProps extends NitroCardViewProps -{ - title?: string; - type?: string; - onClose: () => void; -} - -export const LayoutNotificationAlertView: FC = props => -{ - const { title = '', onClose = null, classNames = [], children = null,type = NotificationAlertType.DEFAULT, ...rest } = props; - - const getClassNames = useMemo(() => - { - const newClassNames: string[] = [ 'nitro-alert' ]; - - newClassNames.push('nitro-alert-' + type); - - if(classNames.length) newClassNames.push(...classNames); - - return newClassNames; - }, [ classNames, type ]); - - return ( - - - - { children } - - - ); -} diff --git a/src/common/layout/LayoutNotificationBubbleView.tsx b/src/common/layout/LayoutNotificationBubbleView.tsx deleted file mode 100644 index 256837d..0000000 --- a/src/common/layout/LayoutNotificationBubbleView.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { FC, useEffect, useMemo, useState } from 'react'; -import { Flex, FlexProps } from '../Flex'; -import { TransitionAnimation, TransitionAnimationTypes } from '../transitions'; - -export interface LayoutNotificationBubbleViewProps extends FlexProps -{ - fadesOut?: boolean; - timeoutMs?: number; - onClose: () => void; -} - -export const LayoutNotificationBubbleView: FC = props => -{ - const { fadesOut = true, timeoutMs = 8000, onClose = null, overflow = 'hidden', classNames = [], ...rest } = props; - const [ isVisible, setIsVisible ] = useState(false); - - const getClassNames = useMemo(() => - { - const newClassNames: string[] = [ 'nitro-notification-bubble', 'rounded' ]; - - if(classNames.length) newClassNames.push(...classNames); - - return newClassNames; - }, [ classNames ]); - - useEffect(() => - { - setIsVisible(true); - - return () => setIsVisible(false); - }, []); - - useEffect(() => - { - if(!fadesOut) return; - - const timeout = setTimeout(() => - { - setIsVisible(false); - - setTimeout(() => onClose(), 300); - }, timeoutMs); - - return () => clearTimeout(timeout); - }, [ fadesOut, timeoutMs, onClose ]); - - return ( - - - - ); -} diff --git a/src/common/layout/LayoutPetImageView.tsx b/src/common/layout/LayoutPetImageView.tsx deleted file mode 100644 index e052ddf..0000000 --- a/src/common/layout/LayoutPetImageView.tsx +++ /dev/null @@ -1,123 +0,0 @@ -import { GetRoomEngine, IPetCustomPart, PetFigureData, TextureUtils, Vector3d } from '@nitrots/nitro-renderer'; -import { CSSProperties, FC, useEffect, useMemo, useRef, useState } from 'react'; -import { Base, BaseProps } from '../Base'; - -interface LayoutPetImageViewProps extends BaseProps -{ - figure?: string; - typeId?: number; - paletteId?: number; - petColor?: number; - customParts?: IPetCustomPart[]; - posture?: string; - headOnly?: boolean; - direction?: number; - scale?: number; -} - -export const LayoutPetImageView: FC = props => -{ - const { figure = '', typeId = -1, paletteId = -1, petColor = 0xFFFFFF, customParts = [], posture = 'std', headOnly = false, direction = 0, scale = 1, style = {}, ...rest } = props; - const [ petUrl, setPetUrl ] = useState(null); - const [ width, setWidth ] = useState(0); - const [ height, setHeight ] = useState(0); - const isDisposed = useRef(false); - - const getStyle = useMemo(() => - { - let newStyle: CSSProperties = {}; - - if(petUrl && petUrl.length) newStyle.backgroundImage = `url(${ petUrl })`; - - if(scale !== 1) - { - newStyle.transform = `scale(${ scale })`; - - if(!(scale % 1)) newStyle.imageRendering = 'pixelated'; - } - - newStyle.width = width; - newStyle.height = height; - - if(Object.keys(style).length) newStyle = { ...newStyle, ...style }; - - return newStyle; - }, [ petUrl, scale, style, width, height ]); - - useEffect(() => - { - let url = null; - - let petTypeId = typeId; - let petPaletteId = paletteId; - let petColor1 = petColor; - let petCustomParts: IPetCustomPart[] = customParts; - let petHeadOnly = headOnly; - - if(figure && figure.length) - { - const petFigureData = new PetFigureData(figure); - - petTypeId = petFigureData.typeId; - petPaletteId = petFigureData.paletteId; - petColor1 = petFigureData.color; - petCustomParts = petFigureData.customParts; - } - - if(petTypeId === 16) petHeadOnly = false; - - const imageResult = GetRoomEngine().getRoomObjectPetImage(petTypeId, petPaletteId, petColor1, new Vector3d((direction * 45)), 64, { - imageReady: async (id, texture, image) => - { - if(isDisposed.current) return; - - if(image) - { - setPetUrl(image.src); - setWidth(image.width); - setHeight(image.height); - } - - else if(texture) - { - setPetUrl(await TextureUtils.generateImageUrl(texture)); - setWidth(texture.width); - setHeight(texture.height); - } - }, - imageFailed: (id) => - { - - } - }, petHeadOnly, 0, petCustomParts, posture); - - if(imageResult) - { - (async () => - { - const image = await imageResult.getImage(); - - if(image) - { - setPetUrl(image.src); - setWidth(image.width); - setHeight(image.height); - } - })(); - } - }, [ figure, typeId, paletteId, petColor, customParts, posture, headOnly, direction ]); - - useEffect(() => - { - isDisposed.current = false; - - return () => - { - isDisposed.current = true; - } - }, []); - - const url = `url('${ petUrl }')`; - - return ; -} diff --git a/src/common/layout/LayoutPrizeProductImageView.tsx b/src/common/layout/LayoutPrizeProductImageView.tsx deleted file mode 100644 index 206c7a8..0000000 --- a/src/common/layout/LayoutPrizeProductImageView.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { FC } from 'react'; -import { ProductTypeEnum } from '../../api'; -import { LayoutBadgeImageView } from './LayoutBadgeImageView'; -import { LayoutCurrencyIcon } from './LayoutCurrencyIcon'; -import { LayoutFurniImageView } from './LayoutFurniImageView'; - -interface LayoutPrizeProductImageViewProps -{ - productType: string; - classId: number; - extraParam?: string; -} - -export const LayoutPrizeProductImageView: FC = props => -{ - const { productType = ProductTypeEnum.FLOOR, classId = -1, extraParam = undefined } = props; - - switch(productType) - { - case ProductTypeEnum.WALL: - case ProductTypeEnum.FLOOR: - return - case ProductTypeEnum.BADGE: - return - case ProductTypeEnum.HABBO_CLUB: - return - } - - return null; -} diff --git a/src/common/layout/LayoutProgressBar.tsx b/src/common/layout/LayoutProgressBar.tsx deleted file mode 100644 index 9b5fb96..0000000 --- a/src/common/layout/LayoutProgressBar.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { FC, useMemo } from 'react'; -import { Base } from '../Base'; -import { Column, ColumnProps } from '../Column'; -import { Flex } from '../Flex'; - -interface LayoutProgressBarProps extends ColumnProps -{ - text?: string; - progress: number; - maxProgress?: number; -} - -export const LayoutProgressBar: FC = props => -{ - const { text = '', progress = 0, maxProgress = 100, position = 'relative', justifyContent = 'center', classNames = [], children = null, ...rest } = props; - - const getClassNames = useMemo(() => - { - const newClassNames: string[] = [ 'nitro-progress-bar', 'text-white' ]; - - if(classNames.length) newClassNames.push(...classNames); - - return newClassNames; - }, [ classNames ]); - - return ( - - { text && (text.length > 0) && - { text } } - - { children } - - ); -} diff --git a/src/common/layout/LayoutRarityLevelView.tsx b/src/common/layout/LayoutRarityLevelView.tsx deleted file mode 100644 index 6fd84d2..0000000 --- a/src/common/layout/LayoutRarityLevelView.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { FC, useMemo } from 'react'; -import { Base, BaseProps } from '../Base'; - -interface LayoutRarityLevelViewProps extends BaseProps -{ - level: number; -} - -export const LayoutRarityLevelView: FC = props => -{ - const { level = 0, classNames = [], children = null, ...rest } = props; - - const getClassNames = useMemo(() => - { - const newClassNames: string[] = [ 'nitro-rarity-level' ]; - - if(classNames.length) newClassNames.push(...classNames); - - return newClassNames; - }, [ classNames ]); - - return ( - -
{ level }
- { children } - - ); -} diff --git a/src/common/layout/LayoutRoomObjectImageView.tsx b/src/common/layout/LayoutRoomObjectImageView.tsx deleted file mode 100644 index cc668f8..0000000 --- a/src/common/layout/LayoutRoomObjectImageView.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import { GetRoomEngine, TextureUtils, Vector3d } from '@nitrots/nitro-renderer'; -import { CSSProperties, FC, useEffect, useMemo, useState } from 'react'; -import { Base, BaseProps } from '../Base'; - -interface LayoutRoomObjectImageViewProps extends BaseProps -{ - roomId: number; - objectId: number; - category: number; - direction?: number; - scale?: number; -} - -export const LayoutRoomObjectImageView: FC = props => -{ - const { roomId = -1, objectId = 1, category = -1, direction = 2, scale = 1, style = {}, ...rest } = props; - const [ imageElement, setImageElement ] = useState(null); - - const getStyle = useMemo(() => - { - let newStyle: CSSProperties = {}; - - if(imageElement?.src?.length) - { - newStyle.backgroundImage = `url('${ imageElement.src }')`; - newStyle.width = imageElement.width; - newStyle.height = imageElement.height; - } - - if(scale !== 1) - { - newStyle.transform = `scale(${ scale })`; - - if(!(scale % 1)) newStyle.imageRendering = 'pixelated'; - } - - if(Object.keys(style).length) newStyle = { ...newStyle, ...style }; - - return newStyle; - }, [ imageElement, scale, style ]); - - useEffect(() => - { - const imageResult = GetRoomEngine().getRoomObjectImage(roomId, objectId, category, new Vector3d(direction * 45), 64, { - imageReady: async (id, texture, image) => setImageElement(await TextureUtils.generateImage(texture)), - imageFailed: null - }); - - // needs (roomObjectImage.data.width > 140) || (roomObjectImage.data.height > 200) scale 1 - - if(!imageResult) return; - - (async () => setImageElement(await TextureUtils.generateImage(imageResult.data)))(); - }, [ roomId, objectId, category, direction, scale ]); - - if(!imageElement) return null; - - return ; -} diff --git a/src/common/layout/LayoutRoomPreviewerView.tsx b/src/common/layout/LayoutRoomPreviewerView.tsx deleted file mode 100644 index e6a005b..0000000 --- a/src/common/layout/LayoutRoomPreviewerView.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { GetRenderer, GetTicker, NitroTicker, RoomPreviewer, TextureUtils } from '@nitrots/nitro-renderer'; -import { FC, MouseEvent, ReactNode, useEffect, useRef } from 'react'; - -export interface LayoutRoomPreviewerViewProps -{ - roomPreviewer: RoomPreviewer; - height?: number; - children?: ReactNode; -} - -export const LayoutRoomPreviewerView: FC = props => -{ - const { roomPreviewer = null, height = 0, children = null } = props; - const elementRef = useRef(); - - const onClick = (event: MouseEvent) => - { - if(!roomPreviewer) return; - - if(event.shiftKey) roomPreviewer.changeRoomObjectDirection(); - else roomPreviewer.changeRoomObjectState(); - } - - useEffect(() => - { - if(!elementRef) return; - - const width = elementRef.current.parentElement.clientWidth; - const texture = TextureUtils.createRenderTexture(width, height); - - const update = async (ticker: NitroTicker) => - { - if(!roomPreviewer || !elementRef.current) return; - - roomPreviewer.updatePreviewRoomView(); - - const renderingCanvas = roomPreviewer.getRenderingCanvas(); - - if(!renderingCanvas.canvasUpdated) return; - - GetRenderer().render({ - target: texture, - container: renderingCanvas.master, - clear: true - }); - - let canvas = GetRenderer().texture.generateCanvas(texture); - const base64 = canvas.toDataURL('image/png'); - - canvas = null; - - elementRef.current.style.backgroundImage = `url(${ base64 })`; - } - - GetTicker().add(update); - - const resizeObserver = new ResizeObserver(() => - { - if(!roomPreviewer || !elementRef.current) return; - - const width = elementRef.current.parentElement.offsetWidth; - - roomPreviewer.modifyRoomCanvas(width, height); - - update(GetTicker()); - }); - - roomPreviewer.getRoomCanvas(width, height); - - resizeObserver.observe(elementRef.current); - - return () => - { - GetTicker().remove(update); - - resizeObserver.disconnect(); - - texture.destroy(true); - } - }, [ roomPreviewer, elementRef, height ]); - - return ( -
-
- { children } -
- ); -} diff --git a/src/common/layout/LayoutRoomThumbnailView.tsx b/src/common/layout/LayoutRoomThumbnailView.tsx deleted file mode 100644 index 144c1f2..0000000 --- a/src/common/layout/LayoutRoomThumbnailView.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { FC, useMemo } from 'react'; -import { GetConfigurationValue } from '../../api'; -import { Base, BaseProps } from '../Base'; - -export interface LayoutRoomThumbnailViewProps extends BaseProps -{ - roomId?: number; - customUrl?: string; -} - -export const LayoutRoomThumbnailView: FC = props => -{ - const { roomId = -1, customUrl = null, shrink = true, overflow = 'hidden', classNames = [], children = null, ...rest } = props; - - const getClassNames = useMemo(() => - { - const newClassNames: string[] = [ 'room-thumbnail', 'rounded', 'border' ]; - - if(classNames.length) newClassNames.push(...classNames); - - return newClassNames; - }, [ classNames ]); - - const getImageUrl = useMemo(() => - { - if(customUrl && customUrl.length) return (GetConfigurationValue('image.library.url') + customUrl); - - return (GetConfigurationValue('thumbnails.url').replace('%thumbnail%', roomId.toString())); - }, [ customUrl, roomId ]); - - return ( - - { getImageUrl && } - { children } - - ); -} diff --git a/src/common/layout/LayoutTrophyView.tsx b/src/common/layout/LayoutTrophyView.tsx deleted file mode 100644 index a65cd95..0000000 --- a/src/common/layout/LayoutTrophyView.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { FC } from 'react'; -import { LocalizeText } from '../../api'; -import { Base } from '../Base'; -import { Column } from '../Column'; -import { Flex } from '../Flex'; -import { Text } from '../Text'; -import { DraggableWindow } from '../draggable-window'; - -interface LayoutTrophyViewProps -{ - color: string; - message: string; - date: string; - senderName: string; - customTitle?: string; - onCloseClick: () => void; -} - -export const LayoutTrophyView: FC = props => -{ - const { color = '', message = '', date = '', senderName = '', customTitle = null, onCloseClick = null } = props; - - return ( - - - - - { LocalizeText('widget.furni.trophy.title') } - - - { customTitle && - { customTitle } } - { message } - - - { date } - { senderName } - - - - ); -} diff --git a/src/common/layout/UserProfileIconView.tsx b/src/common/layout/UserProfileIconView.tsx deleted file mode 100644 index d31fa66..0000000 --- a/src/common/layout/UserProfileIconView.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { FC, useMemo } from 'react'; -import { GetUserProfile } from '../../api'; -import { Base, BaseProps } from '../Base'; - -export interface UserProfileIconViewProps extends BaseProps -{ - userId?: number; - userName?: string; -} - -export const UserProfileIconView: FC = props => -{ - const { userId = 0, userName = null, classNames = [], pointer = true, children = null, ...rest } = props; - - const getClassNames = useMemo(() => - { - const newClassNames: string[] = [ 'nitro-friends-spritesheet', 'icon-profile-sm' ]; - - if(classNames.length) newClassNames.push(...classNames); - - return newClassNames; - }, [ classNames ]); - - return ( - GetUserProfile(userId) } { ... rest }> - { children } - - ); -} diff --git a/src/common/layout/index.ts b/src/common/layout/index.ts deleted file mode 100644 index cbb0568..0000000 --- a/src/common/layout/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -export * from './LayoutAvatarImageView'; -export * from './LayoutBackgroundImage'; -export * from './LayoutBadgeImageView'; -export * from './LayoutCounterTimeView'; -export * from './LayoutCurrencyIcon'; -export * from './LayoutFurniIconImageView'; -export * from './LayoutFurniImageView'; -export * from './LayoutGiftTagView'; -export * from './LayoutGridItem'; -export * from './LayoutImage'; -export * from './LayoutItemCountView'; -export * from './LayoutLoadingSpinnerView'; -export * from './LayoutMiniCameraView'; -export * from './LayoutNotificationAlertView'; -export * from './LayoutNotificationBubbleView'; -export * from './LayoutPetImageView'; -export * from './LayoutProgressBar'; -export * from './LayoutRarityLevelView'; -export * from './LayoutRoomObjectImageView'; -export * from './LayoutRoomPreviewerView'; -export * from './LayoutRoomThumbnailView'; -export * from './LayoutTrophyView'; -export * from './UserProfileIconView'; -export * from './limited-edition'; diff --git a/src/common/layout/limited-edition/LayoutLimitedEditionCompactPlateView.tsx b/src/common/layout/limited-edition/LayoutLimitedEditionCompactPlateView.tsx deleted file mode 100644 index ee41c6c..0000000 --- a/src/common/layout/limited-edition/LayoutLimitedEditionCompactPlateView.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { FC, useMemo } from 'react'; -import { Base, BaseProps } from '../../Base'; -import { LayoutLimitedEditionStyledNumberView } from './LayoutLimitedEditionStyledNumberView'; - -interface LayoutLimitedEditionCompactPlateViewProps extends BaseProps -{ - uniqueNumber: number; - uniqueSeries: number; -} - -export const LayoutLimitedEditionCompactPlateView: FC = props => -{ - const { uniqueNumber = 0, uniqueSeries = 0, classNames = [], children = null, ...rest } = props; - - const getClassNames = useMemo(() => - { - const newClassNames: string[] = [ 'unique-compact-plate', 'z-index-1' ]; - - if(classNames.length) newClassNames.push(...classNames); - - return newClassNames; - }, [ classNames ]); - - return ( - -
- -
-
- -
- { children } - - ); -} diff --git a/src/common/layout/limited-edition/LayoutLimitedEditionCompletePlateView.tsx b/src/common/layout/limited-edition/LayoutLimitedEditionCompletePlateView.tsx deleted file mode 100644 index c83e230..0000000 --- a/src/common/layout/limited-edition/LayoutLimitedEditionCompletePlateView.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { FC, useMemo } from 'react'; -import { LocalizeText } from '../../../api'; -import { Base, BaseProps } from '../../Base'; -import { Column } from '../../Column'; -import { Flex } from '../../Flex'; -import { LayoutLimitedEditionStyledNumberView } from './LayoutLimitedEditionStyledNumberView'; - -interface LayoutLimitedEditionCompletePlateViewProps extends BaseProps -{ - uniqueLimitedItemsLeft: number; - uniqueLimitedSeriesSize: number; -} - -export const LayoutLimitedEditionCompletePlateView: FC = props => -{ - const { uniqueLimitedItemsLeft = 0, uniqueLimitedSeriesSize = 0, classNames = [], ...rest } = props; - - const getClassNames = useMemo(() => - { - const newClassNames: string[] = [ 'unique-complete-plate' ]; - - if(classNames.length) newClassNames.push(...classNames); - - return newClassNames; - }, [ classNames ]); - - return ( - - - - { LocalizeText('unique.items.left') } -
-
- - { LocalizeText('unique.items.number.sold') } -
-
-
- - ); -} diff --git a/src/common/layout/limited-edition/LayoutLimitedEditionStyledNumberView.tsx b/src/common/layout/limited-edition/LayoutLimitedEditionStyledNumberView.tsx deleted file mode 100644 index fe34ba4..0000000 --- a/src/common/layout/limited-edition/LayoutLimitedEditionStyledNumberView.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { FC } from 'react'; - -interface LayoutLimitedEditionStyledNumberViewProps -{ - value: number; -} - -export const LayoutLimitedEditionStyledNumberView: FC = props => -{ - const { value = 0 } = props; - const numbers = value.toString().split(''); - - return ( - <> - { numbers.map((number, index) => ) } - - ); -} diff --git a/src/common/layout/limited-edition/index.ts b/src/common/layout/limited-edition/index.ts deleted file mode 100644 index ee41cf9..0000000 --- a/src/common/layout/limited-edition/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './LayoutLimitedEditionCompactPlateView'; -export * from './LayoutLimitedEditionCompletePlateView'; -export * from './LayoutLimitedEditionStyledNumberView'; diff --git a/src/common/transitions/TransitionAnimation.tsx b/src/common/transitions/TransitionAnimation.tsx deleted file mode 100644 index 6eefd2d..0000000 --- a/src/common/transitions/TransitionAnimation.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { FC, ReactNode, useEffect, useState } from 'react'; -import { Transition } from 'react-transition-group'; -import { getTransitionAnimationStyle } from './TransitionAnimationStyles'; - -interface TransitionAnimationProps -{ - type: string; - inProp: boolean; - timeout?: number; - className?: string; - children?: ReactNode; -} - -export const TransitionAnimation: FC = props => -{ - const { type = null, inProp = false, timeout = 300, className = null, children = null } = props; - - const [ isChildrenVisible, setChildrenVisible ] = useState(false); - - useEffect(() => - { - let timeoutData: ReturnType = null; - - if(inProp) - { - setChildrenVisible(true); - } - else - { - timeoutData = setTimeout(() => - { - setChildrenVisible(false); - clearTimeout(timeout); - }, timeout); - } - - return () => - { - if(timeoutData) clearTimeout(timeoutData); - } - }, [ inProp, timeout ]); - - return ( - - { state => ( -
- { isChildrenVisible && children } -
- ) } -
- ); -} diff --git a/src/common/transitions/TransitionAnimationStyles.ts b/src/common/transitions/TransitionAnimationStyles.ts deleted file mode 100644 index 0d512d0..0000000 --- a/src/common/transitions/TransitionAnimationStyles.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { CSSProperties } from 'react'; -import { TransitionStatus } from 'react-transition-group'; -import { ENTERING, EXITING } from 'react-transition-group/Transition'; -import { TransitionAnimationTypes } from './TransitionAnimationTypes'; - -export function getTransitionAnimationStyle(type: string, transition: TransitionStatus, timeout: number = 300): Partial -{ - switch(type) - { - case TransitionAnimationTypes.BOUNCE: - switch(transition) - { - default: - return {} - case ENTERING: - return { - animationName: 'bounceIn', - animationDuration: `${ timeout }ms` - } - case EXITING: - return { - animationName: 'bounceOut', - animationDuration: `${ timeout }ms` - } - } - case TransitionAnimationTypes.SLIDE_LEFT: - switch(transition) - { - default: - return {} - case ENTERING: - return { - animationName: 'slideInLeft', - animationDuration: `${ timeout }ms` - } - case EXITING: - return { - animationName: 'slideOutLeft', - animationDuration: `${ timeout }ms` - } - } - case TransitionAnimationTypes.SLIDE_RIGHT: - switch(transition) - { - default: - return {} - case ENTERING: - return { - animationName: 'slideInRight', - animationDuration: `${ timeout }ms` - } - case EXITING: - return { - animationName: 'slideOutRight', - animationDuration: `${ timeout }ms` - } - } - case TransitionAnimationTypes.FLIP_X: - switch(transition) - { - default: - return {} - case ENTERING: - return { - animationName: 'flipInX', - animationDuration: `${ timeout }ms` - } - case EXITING: - return { - animationName: 'flipOutX', - animationDuration: `${ timeout }ms` - } - } - case TransitionAnimationTypes.FADE_UP: - switch(transition) - { - default: - return {} - case ENTERING: - return { - animationName: 'fadeInUp', - animationDuration: `${ timeout }ms` - } - case EXITING: - return { - animationName: 'fadeOutDown', - animationDuration: `${ timeout }ms` - } - } - case TransitionAnimationTypes.FADE_IN: - switch(transition) - { - default: - return {} - case ENTERING: - return { - animationName: 'fadeIn', - animationDuration: `${ timeout }ms` - } - case EXITING: - return { - animationName: 'fadeOut', - animationDuration: `${ timeout }ms` - } - } - case TransitionAnimationTypes.FADE_DOWN: - switch(transition) - { - default: - return {} - case ENTERING: - return { - animationName: 'fadeInDown', - animationDuration: `${ timeout }ms` - } - case EXITING: - return { - animationName: 'fadeOutUp', - animationDuration: `${ timeout }ms` - } - } - case TransitionAnimationTypes.HEAD_SHAKE: - switch(transition) - { - default: - return {} - case ENTERING: - return { - animationName: 'headShake', - animationDuration: `${ timeout }ms` - } - } - } - - return null; -} diff --git a/src/common/transitions/TransitionAnimationTypes.ts b/src/common/transitions/TransitionAnimationTypes.ts deleted file mode 100644 index 4ecc23b..0000000 --- a/src/common/transitions/TransitionAnimationTypes.ts +++ /dev/null @@ -1,11 +0,0 @@ -export class TransitionAnimationTypes -{ - public static BOUNCE: string = 'bounce'; - public static SLIDE_LEFT: string = 'slideLeft'; - public static SLIDE_RIGHT: string = 'slideRight'; - public static FLIP_X: string = 'flipX'; - public static FADE_IN: string = 'fadeIn'; - public static FADE_DOWN: string = 'fadeDown'; - public static FADE_UP: string = 'fadeUp'; - public static HEAD_SHAKE: string = 'headShake'; -} diff --git a/src/common/transitions/index.ts b/src/common/transitions/index.ts deleted file mode 100644 index 283a005..0000000 --- a/src/common/transitions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './TransitionAnimation'; -export * from './TransitionAnimationStyles'; -export * from './TransitionAnimationTypes'; diff --git a/src/common/types/AlignItemType.ts b/src/common/types/AlignItemType.ts deleted file mode 100644 index 5a61476..0000000 --- a/src/common/types/AlignItemType.ts +++ /dev/null @@ -1 +0,0 @@ -export type AlignItemType = 'start' | 'end' | 'center' | 'baseline' | 'stretch'; diff --git a/src/common/types/AlignSelfType.ts b/src/common/types/AlignSelfType.ts deleted file mode 100644 index 8e26378..0000000 --- a/src/common/types/AlignSelfType.ts +++ /dev/null @@ -1 +0,0 @@ -export type AlignSelfType = 'start' | 'end' | 'center' | 'baseline' | 'stretch'; diff --git a/src/common/types/ButtonSizeType.ts b/src/common/types/ButtonSizeType.ts deleted file mode 100644 index 0f9dd4a..0000000 --- a/src/common/types/ButtonSizeType.ts +++ /dev/null @@ -1 +0,0 @@ -export type ButtonSizeType = 'lg' | 'sm'; diff --git a/src/common/types/ColorVariantType.ts b/src/common/types/ColorVariantType.ts deleted file mode 100644 index 1ff6f60..0000000 --- a/src/common/types/ColorVariantType.ts +++ /dev/null @@ -1 +0,0 @@ -export type ColorVariantType = 'primary' | 'success' | 'danger' | 'secondary' | 'link' | 'black' | 'white' | 'dark' | 'warning' | 'muted' | 'light'; diff --git a/src/common/types/ColumnSizesType.ts b/src/common/types/ColumnSizesType.ts deleted file mode 100644 index 2b130d8..0000000 --- a/src/common/types/ColumnSizesType.ts +++ /dev/null @@ -1 +0,0 @@ -export type ColumnSizesType = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12; diff --git a/src/common/types/DisplayType.ts b/src/common/types/DisplayType.ts deleted file mode 100644 index 7551d72..0000000 --- a/src/common/types/DisplayType.ts +++ /dev/null @@ -1 +0,0 @@ -export type DisplayType = 'none' | 'inline' | 'inline-block' | 'block' | 'grid' | 'table' | 'table-cell' | 'table-row' | 'flex' | 'inline-flex'; diff --git a/src/common/types/FloatType.ts b/src/common/types/FloatType.ts deleted file mode 100644 index 63e495f..0000000 --- a/src/common/types/FloatType.ts +++ /dev/null @@ -1 +0,0 @@ -export type FloatType = 'start' | 'end' | 'none'; diff --git a/src/common/types/FontSizeType.ts b/src/common/types/FontSizeType.ts deleted file mode 100644 index 120c11c..0000000 --- a/src/common/types/FontSizeType.ts +++ /dev/null @@ -1 +0,0 @@ -export type FontSizeType = 1 | 2 | 3 | 4 | 5 | 6; diff --git a/src/common/types/FontWeightType.ts b/src/common/types/FontWeightType.ts deleted file mode 100644 index c7c9286..0000000 --- a/src/common/types/FontWeightType.ts +++ /dev/null @@ -1 +0,0 @@ -export type FontWeightType = 'bold' | 'bolder' | 'normal' | 'light' | 'lighter'; diff --git a/src/common/types/JustifyContentType.ts b/src/common/types/JustifyContentType.ts deleted file mode 100644 index 73a318d..0000000 --- a/src/common/types/JustifyContentType.ts +++ /dev/null @@ -1 +0,0 @@ -export type JustifyContentType = 'start' | 'end' | 'center' | 'between' | 'around' | 'evenly'; diff --git a/src/common/types/OverflowType.ts b/src/common/types/OverflowType.ts deleted file mode 100644 index 9231ff9..0000000 --- a/src/common/types/OverflowType.ts +++ /dev/null @@ -1 +0,0 @@ -export type OverflowType = 'auto' | 'hidden' | 'visible' | 'scroll' | 'y-scroll' | 'unset'; diff --git a/src/common/types/PositionType.ts b/src/common/types/PositionType.ts deleted file mode 100644 index 4e20b2f..0000000 --- a/src/common/types/PositionType.ts +++ /dev/null @@ -1 +0,0 @@ -export type PositionType = 'static' | 'relative' | 'fixed' | 'absolute' | 'sticky'; diff --git a/src/common/types/SpacingType.ts b/src/common/types/SpacingType.ts deleted file mode 100644 index 91c2bb5..0000000 --- a/src/common/types/SpacingType.ts +++ /dev/null @@ -1 +0,0 @@ -export type SpacingType = 0 | 1 | 2 | 3 | 4 | 5; diff --git a/src/common/types/TextAlignType.ts b/src/common/types/TextAlignType.ts deleted file mode 100644 index cb82648..0000000 --- a/src/common/types/TextAlignType.ts +++ /dev/null @@ -1 +0,0 @@ -export type TextAlignType = 'start' | 'center' | 'end'; diff --git a/src/common/types/index.ts b/src/common/types/index.ts deleted file mode 100644 index 333177e..0000000 --- a/src/common/types/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -export * from './AlignItemType'; -export * from './AlignSelfType'; -export * from './ButtonSizeType'; -export * from './ColorVariantType'; -export * from './ColumnSizesType'; -export * from './DisplayType'; -export * from './FloatType'; -export * from './FontSizeType'; -export * from './FontWeightType'; -export * from './JustifyContentType'; -export * from './OverflowType'; -export * from './PositionType'; -export * from './SpacingType'; -export * from './TextAlignType'; diff --git a/src/common/utils/CreateTransitionToIcon.ts b/src/common/utils/CreateTransitionToIcon.ts deleted file mode 100644 index 656eea5..0000000 --- a/src/common/utils/CreateTransitionToIcon.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { GetEventDispatcher, NitroToolbarAnimateIconEvent } from '@nitrots/nitro-renderer'; - -export const CreateTransitionToIcon = (image: HTMLImageElement, fromElement: HTMLElement, icon: string) => -{ - const bounds = fromElement.getBoundingClientRect(); - const x = (bounds.x + (bounds.width / 2)); - const y = (bounds.y + (bounds.height / 2)); - const event = new NitroToolbarAnimateIconEvent(image, x, y); - - event.iconName = icon; - - GetEventDispatcher().dispatchEvent(event); -} diff --git a/src/common/utils/FriendlyTimeView.tsx b/src/common/utils/FriendlyTimeView.tsx deleted file mode 100644 index cf5a635..0000000 --- a/src/common/utils/FriendlyTimeView.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { FC, useEffect, useMemo, useState } from 'react'; -import { FriendlyTime } from '../../api'; -import { Base, BaseProps } from '../Base'; - -interface FriendlyTimeViewProps extends BaseProps -{ - seconds: number; - isShort?: boolean; -} - -export const FriendlyTimeView: FC = props => -{ - const { seconds = 0, isShort = false, children = null, ...rest } = props; - const [ updateId, setUpdateId ] = useState(-1); - - const getStartSeconds = useMemo(() => (Math.round(new Date().getSeconds()) - seconds), [ seconds ]); - - useEffect(() => - { - const interval = setInterval(() => setUpdateId(prevValue => (prevValue + 1)), 10000); - - return () => clearInterval(interval); - }, []); - - const value = (Math.round(new Date().getSeconds()) - getStartSeconds); - - return { isShort ? FriendlyTime.shortFormat(value) : FriendlyTime.format(value) }; -} diff --git a/src/common/utils/index.ts b/src/common/utils/index.ts deleted file mode 100644 index 11d60a3..0000000 --- a/src/common/utils/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './CreateTransitionToIcon'; -export * from './FriendlyTimeView'; diff --git a/src/components/achievements/AchievementsView.scss b/src/components/achievements/AchievementsView.scss deleted file mode 100644 index 3fa61ac..0000000 --- a/src/components/achievements/AchievementsView.scss +++ /dev/null @@ -1,15 +0,0 @@ -.nitro-achievements { - width: $achievement-width; - height: $achievement-height; -} - -.nitro-achievements-back-arrow { - background: url('@/assets/images/achievements/back-arrow.png') no-repeat center; - width: 33px; - height: 34px; -} - -.nitro-achievements-badge-image { - width: 80px !important; - height: 80px !important; -} diff --git a/src/components/achievements/AchievementsView.tsx b/src/components/achievements/AchievementsView.tsx deleted file mode 100644 index 3af9b98..0000000 --- a/src/components/achievements/AchievementsView.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import { AddLinkEventTracker, ILinkEventTracker, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { AchievementUtilities, LocalizeText } from '../../api'; -import { Base, Column, LayoutImage, LayoutProgressBar, NitroCardContentView, NitroCardHeaderView, NitroCardSubHeaderView, NitroCardView, Text } from '../../common'; -import { useAchievements } from '../../hooks'; -import { AchievementCategoryView } from './views/AchievementCategoryView'; -import { AchievementsCategoryListView } from './views/category-list/AchievementsCategoryListView'; - -export const AchievementsView: FC<{}> = props => -{ - const [ isVisible, setIsVisible ] = useState(false); - const { achievementCategories = [], selectedCategoryCode = null, setSelectedCategoryCode = null, achievementScore = 0, getProgress = 0, getMaxProgress = 0, selectedCategory = null } = useAchievements(); - - useEffect(() => - { - const linkTracker: ILinkEventTracker = { - linkReceived: (url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'show': - setIsVisible(true); - return; - case 'hide': - setIsVisible(false); - return; - case 'toggle': - setIsVisible(prevValue => !prevValue); - return; - } - }, - eventUrlPrefix: 'achievements/' - }; - - AddLinkEventTracker(linkTracker); - - return () => RemoveLinkEventTracker(linkTracker); - }, []); - - if(!isVisible) return null; - - return ( - - setIsVisible(false) } /> - { selectedCategory && - - setSelectedCategoryCode(null) } className="nitro-achievements-back-arrow" /> - - { LocalizeText(`quests.${ selectedCategory.code }.name`) } - { LocalizeText('achievements.details.categoryprogress', [ 'progress', 'limit' ], [ selectedCategory.getProgress().toString(), selectedCategory.getMaxProgress().toString() ]) } - - - } - - { !selectedCategory && - <> - - - { LocalizeText('achievements.categories.score', [ 'score' ], [ achievementScore.toString() ]) } - - - } - { selectedCategory && - } - - - ); -}; diff --git a/src/components/achievements/views/AchievementBadgeView.tsx b/src/components/achievements/views/AchievementBadgeView.tsx deleted file mode 100644 index 5b0d4f9..0000000 --- a/src/components/achievements/views/AchievementBadgeView.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { AchievementData } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { AchievementUtilities } from '../../../api'; -import { BaseProps, LayoutBadgeImageView } from '../../../common'; - -interface AchievementBadgeViewProps extends BaseProps -{ - achievement: AchievementData; - scale?: number; -} - -export const AchievementBadgeView: FC = props => -{ - const { achievement = null, scale = 1, ...rest } = props; - - if(!achievement) return null; - - return ; -} diff --git a/src/components/achievements/views/AchievementCategoryView.tsx b/src/components/achievements/views/AchievementCategoryView.tsx deleted file mode 100644 index 8774d20..0000000 --- a/src/components/achievements/views/AchievementCategoryView.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { FC, useEffect } from 'react'; -import { AchievementCategory } from '../../../api'; -import { Column } from '../../../common'; -import { useAchievements } from '../../../hooks'; -import { AchievementListView } from './achievement-list'; -import { AchievementDetailsView } from './AchievementDetailsView'; - -interface AchievementCategoryViewProps -{ - category: AchievementCategory; -} - -export const AchievementCategoryView: FC = props => -{ - const { category = null } = props; - const { selectedAchievement = null, setSelectedAchievementId = null } = useAchievements(); - - useEffect(() => - { - if(!category) return; - - if(!selectedAchievement) - { - setSelectedAchievementId(category?.achievements?.[0]?.achievementId); - } - }, [ category, selectedAchievement, setSelectedAchievementId ]); - - if(!category) return null; - - return ( - - - { !!selectedAchievement && - } - - ); -} diff --git a/src/components/achievements/views/AchievementDetailsView.tsx b/src/components/achievements/views/AchievementDetailsView.tsx deleted file mode 100644 index b04fa18..0000000 --- a/src/components/achievements/views/AchievementDetailsView.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { AchievementData } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { AchievementUtilities, LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../../api'; -import { Column, Flex, LayoutCurrencyIcon, LayoutProgressBar, Text } from '../../../common'; -import { AchievementBadgeView } from './AchievementBadgeView'; - -interface AchievementDetailsViewProps -{ - achievement: AchievementData; -} - -export const AchievementDetailsView: FC = props => -{ - const { achievement = null } = props; - - if(!achievement) return null; - - return ( - - - - - { LocalizeText('achievements.details.level', [ 'level', 'limit' ], [ AchievementUtilities.getAchievementLevel(achievement).toString(), achievement.levelCount.toString() ]) } - - - - - - { LocalizeBadgeName(AchievementUtilities.getAchievementBadgeCode(achievement)) } - - - { LocalizeBadgeDescription(AchievementUtilities.getAchievementBadgeCode(achievement)) } - - - { ((achievement.levelRewardPoints > 0) || (achievement.scoreLimit > 0)) && - - { (achievement.levelRewardPoints > 0) && - - - { LocalizeText('achievements.details.reward') } - - - { achievement.levelRewardPoints } - - - } - { (achievement.scoreLimit > 0) && - } - } - - - ) -} diff --git a/src/components/achievements/views/achievement-list/AchievementListItemView.tsx b/src/components/achievements/views/achievement-list/AchievementListItemView.tsx deleted file mode 100644 index 9da632b..0000000 --- a/src/components/achievements/views/achievement-list/AchievementListItemView.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { AchievementData } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { LayoutGridItem } from '../../../../common'; -import { useAchievements } from '../../../../hooks'; -import { AchievementBadgeView } from '../AchievementBadgeView'; - -interface AchievementListItemViewProps -{ - achievement: AchievementData; -} - -export const AchievementListItemView: FC = props => -{ - const { achievement = null } = props; - const { selectedAchievement = null, setSelectedAchievementId = null } = useAchievements(); - - if(!achievement) return null; - - return ( - 0) } onClick={ event => setSelectedAchievementId(achievement.achievementId) }> - - - ); -} diff --git a/src/components/achievements/views/achievement-list/AchievementListView.tsx b/src/components/achievements/views/achievement-list/AchievementListView.tsx deleted file mode 100644 index f009581..0000000 --- a/src/components/achievements/views/achievement-list/AchievementListView.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { AchievementData } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { AutoGrid } from '../../../../common'; -import { AchievementListItemView } from './AchievementListItemView'; - -interface AchievementListViewProps -{ - achievements: AchievementData[]; -} - -export const AchievementListView: FC = props => -{ - const { achievements = null } = props; - - return ( - - { achievements && (achievements.length > 0) && achievements.map((achievement, index) => ) } - - ); -} diff --git a/src/components/achievements/views/achievement-list/index.ts b/src/components/achievements/views/achievement-list/index.ts deleted file mode 100644 index 87ccb43..0000000 --- a/src/components/achievements/views/achievement-list/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './AchievementListItemView'; -export * from './AchievementListView'; diff --git a/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx b/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx deleted file mode 100644 index 91b96c6..0000000 --- a/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { Dispatch, FC, SetStateAction } from 'react'; -import { AchievementUtilities, IAchievementCategory, LocalizeText } from '../../../../api'; -import { LayoutBackgroundImage, LayoutGridItem, Text } from '../../../../common'; - -interface AchievementCategoryListItemViewProps -{ - category: IAchievementCategory; - selectedCategoryCode: string; - setSelectedCategoryCode: Dispatch>; -} - -export const AchievementsCategoryListItemView: FC = props => -{ - const { category = null, selectedCategoryCode = null, setSelectedCategoryCode = null } = props; - - if(!category) return null; - - const progress = AchievementUtilities.getAchievementCategoryProgress(category); - const maxProgress = AchievementUtilities.getAchievementCategoryMaxProgress(category); - const getCategoryImage = AchievementUtilities.getAchievementCategoryImageUrl(category, progress); - const getTotalUnseen = AchievementUtilities.getAchievementCategoryTotalUnseen(category); - - return ( - setSelectedCategoryCode(category.code) }> - { LocalizeText(`quests.${ category.code }.name`) } - - { progress } / { maxProgress } - - - ); -} diff --git a/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx b/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx deleted file mode 100644 index ca36296..0000000 --- a/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { Dispatch, FC, SetStateAction } from 'react'; -import { IAchievementCategory } from '../../../../api'; -import { AutoGrid } from '../../../../common'; -import { AchievementsCategoryListItemView } from './AchievementsCategoryListItemView'; - -interface AchievementsCategoryListViewProps -{ - categories: IAchievementCategory[]; - selectedCategoryCode: string; - setSelectedCategoryCode: Dispatch>; -} - -export const AchievementsCategoryListView: FC = props => -{ - const { categories = null, selectedCategoryCode = null, setSelectedCategoryCode = null } = props; - - return ( - - { categories && (categories.length > 0) && categories.map((category, index) => ) } - - ); -}; diff --git a/src/components/achievements/views/category-list/index.ts b/src/components/achievements/views/category-list/index.ts deleted file mode 100644 index 5a367f8..0000000 --- a/src/components/achievements/views/category-list/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './AchievementsCategoryListItemView'; -export * from './AchievementsCategoryListView'; diff --git a/src/components/achievements/views/index.ts b/src/components/achievements/views/index.ts deleted file mode 100644 index 576c635..0000000 --- a/src/components/achievements/views/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './achievement-list'; -export * from './AchievementBadgeView'; -export * from './AchievementCategoryView'; -export * from './AchievementDetailsView'; -export * from './category-list'; diff --git a/src/components/avatar-editor-new/AvatarEditorView.scss b/src/components/avatar-editor-new/AvatarEditorView.scss deleted file mode 100644 index 22b873d..0000000 --- a/src/components/avatar-editor-new/AvatarEditorView.scss +++ /dev/null @@ -1,336 +0,0 @@ -.nitro-avatar-editor-spritesheet { - background: url('@/assets/images/avatareditor/avatar-editor-spritesheet.png') transparent no-repeat; - - &.arrow-left-icon { - width: 28px; - height: 21px; - background-position: -226px -131px; - } - - &.arrow-right-icon { - width: 28px; - height: 21px; - background-position: -226px -162px; - } - - &.ca-icon { - width: 25px; - height: 25px; - background-position: -226px -61px; - - &.selected { - width: 25px; - height: 25px; - background-position: -226px -96px; - } - } - - &.cc-icon { - width: 31px; - height: 29px; - background-position: -145px -5px; - - &.selected { - width: 31px; - height: 29px; - background-position: -145px -44px; - } - } - - &.ch-icon { - width: 29px; - height: 24px; - background-position: -186px -39px; - - &.selected { - width: 29px; - height: 24px; - background-position: -186px -73px; - } - } - - &.clear-icon { - width: 27px; - height: 27px; - background-position: -145px -157px; - } - - &.cp-icon { - width: 30px; - height: 24px; - background-position: -145px -264px; - - &.selected { - width: 30px; - height: 24px; - background-position: -186px -5px; - } - } - - - &.ea-icon { - width: 35px; - height: 16px; - background-position: -226px -193px; - - &.selected { - width: 35px; - height: 16px; - background-position: -226px -219px; - } - } - - &.fa-icon { - width: 27px; - height: 20px; - background-position: -186px -137px; - - &.selected { - width: 27px; - height: 20px; - background-position: -186px -107px; - } - } - - &.female-icon { - width: 18px; - height: 27px; - background-position: -186px -202px; - - &.selected { - width: 18px; - height: 27px; - background-position: -186px -239px; - } - } - - &.ha-icon { - width: 25px; - height: 22px; - background-position: -226px -245px; - - &.selected { - width: 25px; - height: 22px; - background-position: -226px -277px; - } - } - - &.he-icon { - width: 31px; - height: 27px; - background-position: -145px -83px; - - &.selected { - width: 31px; - height: 27px; - background-position: -145px -120px; - } - } - - &.hr-icon { - width: 29px; - height: 25px; - background-position: -145px -194px; - - &.selected { - width: 29px; - height: 25px; - background-position: -145px -229px; - } - } - - &.lg-icon { - width: 19px; - height: 20px; - background-position: -303px -45px; - - &.selected { - width: 19px; - height: 20px; - background-position: -303px -75px; - } - } - - &.loading-icon { - width: 21px; - height: 25px; - background-position: -186px -167px; - } - - - &.male-icon { - width: 21px; - height: 21px; - background-position: -186px -276px; - - &.selected { - width: 21px; - height: 21px; - background-position: -272px -5px; - } - } - - - &.sellable-icon { - width: 17px; - height: 15px; - background-position: -303px -105px; - } - - - &.sh-icon { - width: 37px; - height: 10px; - background-position: -303px -5px; - - &.selected { - width: 37px; - height: 10px; - background-position: -303px -25px; - } - } - - - &.spotlight-icon { - width: 130px; - height: 305px; - background-position: -5px -5px; - } - - - &.wa-icon { - width: 36px; - height: 18px; - background-position: -226px -5px; - - &.selected { - width: 36px; - height: 18px; - background-position: -226px -33px; - } - } -} - -.nitro-avatar-editor-wardrobe-figure-preview { - background-color: $pale-sky; - overflow: hidden; - z-index: 1; - - .avatar-image { - position: absolute; - bottom: -15px; - margin: 0 auto; - z-index: 4; - } - - .avatar-shadow { - position: absolute; - left: 0; - right: 0; - bottom: 25px; - width: 40px; - height: 20px; - margin: 0 auto; - border-radius: 100%; - background-color: rgba(0, 0, 0, 0.20); - z-index: 2; - } - - &:after { - position: absolute; - content: ''; - top: 75%; - bottom: 0; - left: 0; - right: 0; - border-radius: 50%; - background-color: $pale-sky; - box-shadow: 0 0 8px 2px rgba($white,.6); - transform: scale(2); - } - - .button-container { - position: absolute; - bottom: 0; - z-index: 5; - } -} - -.nitro-avatar-editor { - width: $avatar-editor-width; - height: $avatar-editor-height; - - .category-item { - height: 40px; - } - - .figure-preview-container { - position: relative; - height: 100%; - background-color: $pale-sky; - overflow: hidden; - z-index: 1; - - .arrow-container { - position: absolute; - width: 100%; - margin: 0 auto; - padding: 0 10px; - display: flex; - justify-content: space-between; - bottom: 12px; - z-index: 5; - - .icon { - cursor: pointer; - } - } - - .avatar-image { - position: absolute; - left: 0; - right: 0; - bottom: 50px; - margin: 0 auto; - z-index: 4; - } - - .avatar-spotlight { - position: absolute; - top: -10px; - left: 0; - right: 0; - margin: 0 auto; - opacity: 0.3; - pointer-events: none; - z-index: 3; - } - - .avatar-shadow { - position: absolute; - left: 0; - right: 0; - bottom: 15px; - width: 70px; - height: 30px; - margin: 0 auto; - border-radius: 100%; - background-color: rgba(0, 0, 0, 0.20); - z-index: 2; - } - - &:after { - position: absolute; - content: ''; - top: 75%; - bottom: 0; - left: 0; - right: 0; - border-radius: 50%; - background-color: $pale-sky; - box-shadow: 0 0 8px 2px rgba($white,.6); - transform: scale(2); - } - } -} diff --git a/src/components/avatar-editor-new/AvatarEditorView.tsx b/src/components/avatar-editor-new/AvatarEditorView.tsx deleted file mode 100644 index eb1973d..0000000 --- a/src/components/avatar-editor-new/AvatarEditorView.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import { AddLinkEventTracker, AvatarEditorFigureCategory, ILinkEventTracker, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { FaDice, FaTrash, FaUndo } from 'react-icons/fa'; -import { AvatarEditorAction, LocalizeText } from '../../api'; -import { Button, ButtonGroup, Column, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common'; -import { useAvatarEditor } from '../../hooks'; -import { AvatarEditorModelView } from './views/AvatarEditorModelView'; - -const DEFAULT_MALE_FIGURE: string = 'hr-100.hd-180-7.ch-215-66.lg-270-79.sh-305-62.ha-1002-70.wa-2007'; -const DEFAULT_FEMALE_FIGURE: string = 'hr-515-33.hd-600-1.ch-635-70.lg-716-66-62.sh-735-68'; - -export const AvatarEditorNewView: FC<{}> = props => -{ - const [ isVisible, setIsVisible ] = useState(false); - const { setIsVisible: setEditorVisibility, avatarModels, activeModelKey, setActiveModelKey } = useAvatarEditor(); - - const processAction = (action: string) => - { - switch(action) - { - case AvatarEditorAction.ACTION_CLEAR: - return; - case AvatarEditorAction.ACTION_RESET: - return; - case AvatarEditorAction.ACTION_RANDOMIZE: - return; - case AvatarEditorAction.ACTION_SAVE: - return; - } - } - - useEffect(() => - { - const linkTracker: ILinkEventTracker = { - linkReceived: (url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'show': - setIsVisible(true); - return; - case 'hide': - setIsVisible(false); - return; - case 'toggle': - setIsVisible(prevValue => !prevValue); - return; - } - }, - eventUrlPrefix: 'avatar-editor/' - }; - - AddLinkEventTracker(linkTracker); - - return () => RemoveLinkEventTracker(linkTracker); - }, []); - - useEffect(() => - { - setEditorVisibility(isVisible) - }, [ isVisible, setEditorVisibility ]); - - if(!isVisible) return null; - - return ( - - setIsVisible(false) } /> - - { Object.keys(avatarModels).map(modelKey => - { - const isActive = (activeModelKey === modelKey); - - return ( - setActiveModelKey(modelKey) }> - { LocalizeText(`avatareditor.category.${ modelKey }`) } - - ); - }) } - - - - - { ((activeModelKey.length > 0) && (activeModelKey !== AvatarEditorFigureCategory.WARDROBE)) && - } - { (activeModelKey === AvatarEditorFigureCategory.WARDROBE) } - - - { /* */ } - - - - - - - - - - - - - ); -} diff --git a/src/components/avatar-editor-new/views/AvatarEditorIcon.tsx b/src/components/avatar-editor-new/views/AvatarEditorIcon.tsx deleted file mode 100644 index a05baa1..0000000 --- a/src/components/avatar-editor-new/views/AvatarEditorIcon.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { FC, useMemo } from 'react'; -import { Base, BaseProps } from '../../../common'; - -type AvatarIconType = 'male' | 'female' | 'clear' | 'sellable' | string; - -export interface AvatarEditorIconProps extends BaseProps -{ - icon: AvatarIconType; - selected?: boolean; -} - -export const AvatarEditorIcon: FC = props => -{ - const { icon = null, selected = false, classNames = [], children = null, ...rest } = props; - - const getClassNames = useMemo(() => - { - const newClassNames: string[] = [ 'nitro-avatar-editor-spritesheet' ]; - - if(icon && icon.length) newClassNames.push(icon + '-icon'); - - if(selected) newClassNames.push('selected'); - - if(classNames.length) newClassNames.push(...classNames); - - return newClassNames; - }, [ icon, selected, classNames ]); - - return -} diff --git a/src/components/avatar-editor-new/views/AvatarEditorModelView.tsx b/src/components/avatar-editor-new/views/AvatarEditorModelView.tsx deleted file mode 100644 index c012383..0000000 --- a/src/components/avatar-editor-new/views/AvatarEditorModelView.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { AvatarEditorFigureCategory } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useMemo, useState } from 'react'; -import { FigureData, IAvatarEditorCategory } from '../../../api'; -import { Column, Flex, Grid } from '../../../common'; -import { useAvatarEditor } from '../../../hooks'; -import { AvatarEditorIcon } from './AvatarEditorIcon'; -import { AvatarEditorFigureSetView } from './figure-set'; -import { AvatarEditorPaletteSetView } from './palette-set'; - -export const AvatarEditorModelView: FC<{ - name: string, - categories: IAvatarEditorCategory[] -}> = props => -{ - const { name = '', categories = [] } = props; - const [ activeSetType, setActiveSetType ] = useState(''); - const { maxPaletteCount = 1 } = useAvatarEditor(); - - const activeCategory = useMemo(() => - { - return categories.find(category => category.setType === activeSetType) ?? null; - }, [ categories, activeSetType ]); - - const setGender = (gender: string) => - { - // - } - - useEffect(() => - { - if(!activeCategory) return; - - // we need to run this when we change which parts r selected - /* for(const partItem of activeCategory.partItems) - { - if(!partItem || !part.isSelected) continue; - - setMaxPaletteCount(part.maxColorIndex || 1); - - break; - } */ - }, [ activeCategory ]) - - useEffect(() => - { - if(!categories || !categories.length) return; - - setActiveSetType(categories[0]?.setType) - }, [ categories ]); - - if(!activeCategory) return null; - - return ( - - - { (name === AvatarEditorFigureCategory.GENERIC) && - <> - setGender(FigureData.MALE) }> - - - setGender(FigureData.FEMALE) }> - - - } - { (name !== AvatarEditorFigureCategory.GENERIC) && (categories.length > 0) && categories.map(category => - { - return ( - setActiveSetType(category.setType) }> - - - ); - }) } - - - - - - { (maxPaletteCount >= 1) && - } - { (maxPaletteCount === 2) && - } - - - ); -} diff --git a/src/components/avatar-editor-new/views/figure-set/AvatarEditorFigureSetItemView.tsx b/src/components/avatar-editor-new/views/figure-set/AvatarEditorFigureSetItemView.tsx deleted file mode 100644 index 1c00fc9..0000000 --- a/src/components/avatar-editor-new/views/figure-set/AvatarEditorFigureSetItemView.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { AvatarEditorThumbnailsHelper, FigureData, GetConfigurationValue, IAvatarEditorCategoryPartItem } from '../../../../api'; -import { LayoutCurrencyIcon, LayoutGridItem, LayoutGridItemProps } from '../../../../common'; -import { useAvatarEditor } from '../../../../hooks'; -import { AvatarEditorIcon } from '../AvatarEditorIcon'; - -export const AvatarEditorFigureSetItemView: FC<{ - setType: string; - partItem: IAvatarEditorCategoryPartItem; - isSelected: boolean; -} & LayoutGridItemProps> = props => -{ - const { setType = null, partItem = null, isSelected = false, ...rest } = props; - const [ assetUrl, setAssetUrl ] = useState(''); - const { selectedColorParts = null, getFigureStringWithFace = null } = useAvatarEditor(); - - const isHC = !GetConfigurationValue('hc.disabled', false) && ((partItem.partSet?.clubLevel ?? 0) > 0); - - useEffect(() => - { - if(!setType || !setType.length || !partItem) return; - - const loadImage = async () => - { - const isHC = !GetConfigurationValue('hc.disabled', false) && ((partItem.partSet?.clubLevel ?? 0) > 0); - - let url: string = null; - - if(setType === FigureData.FACE) - { - url = await AvatarEditorThumbnailsHelper.buildForFace(getFigureStringWithFace(partItem.id), isHC); - } - else - { - url = await AvatarEditorThumbnailsHelper.build(setType, partItem, partItem.usesColor, selectedColorParts[setType] ?? null, isHC); - } - - if(url && url.length) setAssetUrl(url); - } - - loadImage(); - }, [ setType, partItem, selectedColorParts, getFigureStringWithFace ]); - - if(!partItem) return null; - - return ( - - { !partItem.isClear && isHC && } - { partItem.isClear && } - { !partItem.isClear && partItem.partSet.isSellable && } - - ); -} diff --git a/src/components/avatar-editor-new/views/figure-set/AvatarEditorFigureSetView.tsx b/src/components/avatar-editor-new/views/figure-set/AvatarEditorFigureSetView.tsx deleted file mode 100644 index 7db3743..0000000 --- a/src/components/avatar-editor-new/views/figure-set/AvatarEditorFigureSetView.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { FC, useRef } from 'react'; -import { IAvatarEditorCategory, IAvatarEditorCategoryPartItem } from '../../../../api'; -import { InfiniteGrid } from '../../../../common'; -import { useAvatarEditor } from '../../../../hooks'; -import { AvatarEditorFigureSetItemView } from './AvatarEditorFigureSetItemView'; - -export const AvatarEditorFigureSetView: FC<{ - category: IAvatarEditorCategory -}> = props => -{ - const { category = null } = props; - const { selectedParts = null, selectEditorPart } = useAvatarEditor(); - const elementRef = useRef(null); - - const isPartItemSelected = (partItem: IAvatarEditorCategoryPartItem) => - { - if(!category || !category.setType || !selectedParts || !selectedParts[category.setType]) return false; - - const partId = selectedParts[category.setType]; - - return (partId === partItem.id); - } - - const columnCount = 3; - - return ( - - { - if(!item) return null; - - return ( - selectEditorPart(category.setType, item.partSet?.id ?? -1) } /> - ) - } } /> - ); -} diff --git a/src/components/avatar-editor-new/views/figure-set/index.ts b/src/components/avatar-editor-new/views/figure-set/index.ts deleted file mode 100644 index 0c5880b..0000000 --- a/src/components/avatar-editor-new/views/figure-set/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './AvatarEditorFigureSetItemView'; -export * from './AvatarEditorFigureSetView'; diff --git a/src/components/avatar-editor-new/views/palette-set/AvatarEditorPaletteSetItemView.tsx b/src/components/avatar-editor-new/views/palette-set/AvatarEditorPaletteSetItemView.tsx deleted file mode 100644 index 672c356..0000000 --- a/src/components/avatar-editor-new/views/palette-set/AvatarEditorPaletteSetItemView.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { ColorConverter, IPartColor } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { GetConfigurationValue } from '../../../../api'; -import { LayoutCurrencyIcon, LayoutGridItem, LayoutGridItemProps } from '../../../../common'; - -export interface AvatarEditorPaletteSetItemProps extends LayoutGridItemProps -{ - setType: string; - partColor: IPartColor; - isSelected: boolean; -} - -// its disabled if its hc and you dont have it -export const AvatarEditorPaletteSetItem: FC = props => -{ - const { setType = null, partColor = null, isSelected = false, ...rest } = props; - - if(!partColor) return null; - - const isHC = !GetConfigurationValue('hc.disabled', false) && (partColor.clubLevel > 0); - - return ( - - { isHC && } - - ); -} diff --git a/src/components/avatar-editor-new/views/palette-set/AvatarEditorPaletteSetView.tsx b/src/components/avatar-editor-new/views/palette-set/AvatarEditorPaletteSetView.tsx deleted file mode 100644 index 2e72cd4..0000000 --- a/src/components/avatar-editor-new/views/palette-set/AvatarEditorPaletteSetView.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { IPartColor } from '@nitrots/nitro-renderer'; -import { FC, useRef } from 'react'; -import { IAvatarEditorCategory } from '../../../../api'; -import { AutoGrid } from '../../../../common'; -import { useAvatarEditor } from '../../../../hooks'; -import { AvatarEditorPaletteSetItem } from './AvatarEditorPaletteSetItemView'; - -export const AvatarEditorPaletteSetView: FC<{ - category: IAvatarEditorCategory, - paletteIndex: number; -}> = props => -{ - const { category = null, paletteIndex = -1 } = props; - const paletteSet = category?.colorItems[paletteIndex] ?? null; - const { selectedColors = null, selectEditorColor } = useAvatarEditor(); - const elementRef = useRef(null); - - const isPartColorSelected = (partColor: IPartColor) => - { - if(!category || !category.setType || !selectedColors || !selectedColors[category.setType] || !selectedColors[category.setType][paletteIndex]) return false; - - const colorId = selectedColors[category.setType][paletteIndex]; - - return (colorId === partColor.id); - } - - return ( - - { (paletteSet.length > 0) && paletteSet.map(item => - selectEditorColor(category.setType, paletteIndex, item.id) } />) } - - ); -} diff --git a/src/components/avatar-editor-new/views/palette-set/index.ts b/src/components/avatar-editor-new/views/palette-set/index.ts deleted file mode 100644 index 977e5b9..0000000 --- a/src/components/avatar-editor-new/views/palette-set/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './AvatarEditorPaletteSetItemView'; -export * from './AvatarEditorPaletteSetView'; diff --git a/src/components/avatar-editor/AvatarEditorView.scss b/src/components/avatar-editor/AvatarEditorView.scss deleted file mode 100644 index 22b873d..0000000 --- a/src/components/avatar-editor/AvatarEditorView.scss +++ /dev/null @@ -1,336 +0,0 @@ -.nitro-avatar-editor-spritesheet { - background: url('@/assets/images/avatareditor/avatar-editor-spritesheet.png') transparent no-repeat; - - &.arrow-left-icon { - width: 28px; - height: 21px; - background-position: -226px -131px; - } - - &.arrow-right-icon { - width: 28px; - height: 21px; - background-position: -226px -162px; - } - - &.ca-icon { - width: 25px; - height: 25px; - background-position: -226px -61px; - - &.selected { - width: 25px; - height: 25px; - background-position: -226px -96px; - } - } - - &.cc-icon { - width: 31px; - height: 29px; - background-position: -145px -5px; - - &.selected { - width: 31px; - height: 29px; - background-position: -145px -44px; - } - } - - &.ch-icon { - width: 29px; - height: 24px; - background-position: -186px -39px; - - &.selected { - width: 29px; - height: 24px; - background-position: -186px -73px; - } - } - - &.clear-icon { - width: 27px; - height: 27px; - background-position: -145px -157px; - } - - &.cp-icon { - width: 30px; - height: 24px; - background-position: -145px -264px; - - &.selected { - width: 30px; - height: 24px; - background-position: -186px -5px; - } - } - - - &.ea-icon { - width: 35px; - height: 16px; - background-position: -226px -193px; - - &.selected { - width: 35px; - height: 16px; - background-position: -226px -219px; - } - } - - &.fa-icon { - width: 27px; - height: 20px; - background-position: -186px -137px; - - &.selected { - width: 27px; - height: 20px; - background-position: -186px -107px; - } - } - - &.female-icon { - width: 18px; - height: 27px; - background-position: -186px -202px; - - &.selected { - width: 18px; - height: 27px; - background-position: -186px -239px; - } - } - - &.ha-icon { - width: 25px; - height: 22px; - background-position: -226px -245px; - - &.selected { - width: 25px; - height: 22px; - background-position: -226px -277px; - } - } - - &.he-icon { - width: 31px; - height: 27px; - background-position: -145px -83px; - - &.selected { - width: 31px; - height: 27px; - background-position: -145px -120px; - } - } - - &.hr-icon { - width: 29px; - height: 25px; - background-position: -145px -194px; - - &.selected { - width: 29px; - height: 25px; - background-position: -145px -229px; - } - } - - &.lg-icon { - width: 19px; - height: 20px; - background-position: -303px -45px; - - &.selected { - width: 19px; - height: 20px; - background-position: -303px -75px; - } - } - - &.loading-icon { - width: 21px; - height: 25px; - background-position: -186px -167px; - } - - - &.male-icon { - width: 21px; - height: 21px; - background-position: -186px -276px; - - &.selected { - width: 21px; - height: 21px; - background-position: -272px -5px; - } - } - - - &.sellable-icon { - width: 17px; - height: 15px; - background-position: -303px -105px; - } - - - &.sh-icon { - width: 37px; - height: 10px; - background-position: -303px -5px; - - &.selected { - width: 37px; - height: 10px; - background-position: -303px -25px; - } - } - - - &.spotlight-icon { - width: 130px; - height: 305px; - background-position: -5px -5px; - } - - - &.wa-icon { - width: 36px; - height: 18px; - background-position: -226px -5px; - - &.selected { - width: 36px; - height: 18px; - background-position: -226px -33px; - } - } -} - -.nitro-avatar-editor-wardrobe-figure-preview { - background-color: $pale-sky; - overflow: hidden; - z-index: 1; - - .avatar-image { - position: absolute; - bottom: -15px; - margin: 0 auto; - z-index: 4; - } - - .avatar-shadow { - position: absolute; - left: 0; - right: 0; - bottom: 25px; - width: 40px; - height: 20px; - margin: 0 auto; - border-radius: 100%; - background-color: rgba(0, 0, 0, 0.20); - z-index: 2; - } - - &:after { - position: absolute; - content: ''; - top: 75%; - bottom: 0; - left: 0; - right: 0; - border-radius: 50%; - background-color: $pale-sky; - box-shadow: 0 0 8px 2px rgba($white,.6); - transform: scale(2); - } - - .button-container { - position: absolute; - bottom: 0; - z-index: 5; - } -} - -.nitro-avatar-editor { - width: $avatar-editor-width; - height: $avatar-editor-height; - - .category-item { - height: 40px; - } - - .figure-preview-container { - position: relative; - height: 100%; - background-color: $pale-sky; - overflow: hidden; - z-index: 1; - - .arrow-container { - position: absolute; - width: 100%; - margin: 0 auto; - padding: 0 10px; - display: flex; - justify-content: space-between; - bottom: 12px; - z-index: 5; - - .icon { - cursor: pointer; - } - } - - .avatar-image { - position: absolute; - left: 0; - right: 0; - bottom: 50px; - margin: 0 auto; - z-index: 4; - } - - .avatar-spotlight { - position: absolute; - top: -10px; - left: 0; - right: 0; - margin: 0 auto; - opacity: 0.3; - pointer-events: none; - z-index: 3; - } - - .avatar-shadow { - position: absolute; - left: 0; - right: 0; - bottom: 15px; - width: 70px; - height: 30px; - margin: 0 auto; - border-radius: 100%; - background-color: rgba(0, 0, 0, 0.20); - z-index: 2; - } - - &:after { - position: absolute; - content: ''; - top: 75%; - bottom: 0; - left: 0; - right: 0; - border-radius: 50%; - background-color: $pale-sky; - box-shadow: 0 0 8px 2px rgba($white,.6); - transform: scale(2); - } - } -} diff --git a/src/components/avatar-editor/AvatarEditorView.tsx b/src/components/avatar-editor/AvatarEditorView.tsx deleted file mode 100644 index f2b9c0b..0000000 --- a/src/components/avatar-editor/AvatarEditorView.tsx +++ /dev/null @@ -1,316 +0,0 @@ -import { AvatarEditorFigureCategory, FigureSetIdsMessageEvent, GetAvatarRenderManager, GetSessionDataManager, GetWardrobeMessageComposer, IAvatarFigureContainer, UserFigureComposer, UserWardrobePageEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { FaDice, FaTrash, FaUndo } from 'react-icons/fa'; -import { AvatarEditorAction, AvatarEditorUtilities, BodyModel, FigureData, GetClubMemberLevel, GetConfigurationValue, HeadModel, IAvatarEditorCategoryModel, LegModel, LocalizeText, SendMessageComposer, TorsoModel, generateRandomFigure } from '../../api'; -import { Button, ButtonGroup, Column, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common'; -import { useMessageEvent } from '../../hooks'; -import { AvatarEditorFigurePreviewView } from './views/AvatarEditorFigurePreviewView'; -import { AvatarEditorModelView } from './views/AvatarEditorModelView'; -import { AvatarEditorWardrobeView } from './views/AvatarEditorWardrobeView'; - -const DEFAULT_MALE_FIGURE: string = 'hr-100.hd-180-7.ch-215-66.lg-270-79.sh-305-62.ha-1002-70.wa-2007'; -const DEFAULT_FEMALE_FIGURE: string = 'hr-515-33.hd-600-1.ch-635-70.lg-716-66-62.sh-735-68'; - -export const AvatarEditorView: FC<{}> = props => -{ - const [ isVisible, setIsVisible ] = useState(false); - const [ figures, setFigures ] = useState>(null); - const [ figureData, setFigureData ] = useState(null); - const [ categories, setCategories ] = useState>(null); - const [ activeCategory, setActiveCategory ] = useState(null); - const [ figureSetIds, setFigureSetIds ] = useState([]); - const [ boundFurnitureNames, setBoundFurnitureNames ] = useState([]); - const [ savedFigures, setSavedFigures ] = useState<[ IAvatarFigureContainer, string ][]>([]); - const [ isWardrobeVisible, setIsWardrobeVisible ] = useState(false); - const [ lastFigure, setLastFigure ] = useState(null); - const [ lastGender, setLastGender ] = useState(null); - const [ needsReset, setNeedsReset ] = useState(true); - const [ isInitalized, setIsInitalized ] = useState(false); - - const maxWardrobeSlots = useMemo(() => GetConfigurationValue('avatar.wardrobe.max.slots', 10), []); - - useMessageEvent(FigureSetIdsMessageEvent, event => - { - const parser = event.getParser(); - - setFigureSetIds(parser.figureSetIds); - setBoundFurnitureNames(parser.boundsFurnitureNames); - }); - - useMessageEvent(UserWardrobePageEvent, event => - { - const parser = event.getParser(); - const savedFigures: [ IAvatarFigureContainer, string ][] = []; - - let i = 0; - - while(i < maxWardrobeSlots) - { - savedFigures.push([ null, null ]); - - i++; - } - - for(let [ index, [ look, gender ] ] of parser.looks.entries()) - { - const container = GetAvatarRenderManager().createFigureContainer(look); - - savedFigures[(index - 1)] = [ container, gender ]; - } - - setSavedFigures(savedFigures); - }); - - const selectCategory = useCallback((name: string) => - { - if(!categories) return; - - setActiveCategory(categories.get(name)); - }, [ categories ]); - - const resetCategories = useCallback(() => - { - const categories = new Map(); - - categories.set(AvatarEditorFigureCategory.GENERIC, new BodyModel()); - categories.set(AvatarEditorFigureCategory.HEAD, new HeadModel()); - categories.set(AvatarEditorFigureCategory.TORSO, new TorsoModel()); - categories.set(AvatarEditorFigureCategory.LEGS, new LegModel()); - - setCategories(categories); - }, []); - - const setupFigures = useCallback(() => - { - const figures: Map = new Map(); - - const maleFigure = new FigureData(); - const femaleFigure = new FigureData(); - - maleFigure.loadAvatarData(DEFAULT_MALE_FIGURE, FigureData.MALE); - femaleFigure.loadAvatarData(DEFAULT_FEMALE_FIGURE, FigureData.FEMALE); - - figures.set(FigureData.MALE, maleFigure); - figures.set(FigureData.FEMALE, femaleFigure); - - setFigures(figures); - setFigureData(figures.get(FigureData.MALE)); - }, []); - - const loadAvatarInEditor = useCallback((figure: string, gender: string, reset: boolean = true) => - { - gender = AvatarEditorUtilities.getGender(gender); - - let newFigureData = figureData; - - if(gender !== newFigureData.gender) newFigureData = figures.get(gender); - - if(figure !== newFigureData.getFigureString()) newFigureData.loadAvatarData(figure, gender); - - if(newFigureData !== figureData) setFigureData(newFigureData); - - if(reset) - { - setLastFigure(figureData.getFigureString()); - setLastGender(figureData.gender); - } - }, [ figures, figureData ]); - - const processAction = useCallback((action: string) => - { - switch(action) - { - case AvatarEditorAction.ACTION_CLEAR: - loadAvatarInEditor(figureData.getFigureStringWithFace(0, false), figureData.gender, false); - resetCategories(); - return; - case AvatarEditorAction.ACTION_RESET: - loadAvatarInEditor(lastFigure, lastGender); - resetCategories(); - return; - case AvatarEditorAction.ACTION_RANDOMIZE: - const figure = generateRandomFigure(figureData, figureData.gender, GetClubMemberLevel(), figureSetIds, [ FigureData.FACE ]); - - loadAvatarInEditor(figure, figureData.gender, false); - resetCategories(); - return; - case AvatarEditorAction.ACTION_SAVE: - SendMessageComposer(new UserFigureComposer(figureData.gender, figureData.getFigureString())); - setIsVisible(false); - return; - } - }, [ figureData, lastFigure, lastGender, figureSetIds, loadAvatarInEditor, resetCategories ]) - - const setGender = useCallback((gender: string) => - { - gender = AvatarEditorUtilities.getGender(gender); - - setFigureData(figures.get(gender)); - }, [ figures ]); - - /* useEffect(() => - { - const linkTracker: ILinkEventTracker = { - linkReceived: (url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'show': - setIsVisible(true); - return; - case 'hide': - setIsVisible(false); - return; - case 'toggle': - setIsVisible(prevValue => !prevValue); - return; - } - }, - eventUrlPrefix: 'avatar-editor/' - }; - - AddLinkEventTracker(linkTracker); - - return () => RemoveLinkEventTracker(linkTracker); - }, []); */ - - useEffect(() => - { - setSavedFigures(new Array(maxWardrobeSlots)); - }, [ maxWardrobeSlots ]); - - useEffect(() => - { - if(!isWardrobeVisible) return; - - setActiveCategory(null); - SendMessageComposer(new GetWardrobeMessageComposer()); - }, [ isWardrobeVisible ]); - - useEffect(() => - { - if(!activeCategory) return; - - setIsWardrobeVisible(false); - }, [ activeCategory ]); - - useEffect(() => - { - if(!categories) return; - - selectCategory(AvatarEditorFigureCategory.GENERIC); - }, [ categories, selectCategory ]); - - useEffect(() => - { - if(!figureData) return; - - AvatarEditorUtilities.CURRENT_FIGURE = figureData; - - resetCategories(); - - return () => AvatarEditorUtilities.CURRENT_FIGURE = null; - }, [ figureData, resetCategories ]); - - useEffect(() => - { - AvatarEditorUtilities.FIGURE_SET_IDS = figureSetIds; - AvatarEditorUtilities.BOUND_FURNITURE_NAMES = boundFurnitureNames; - - resetCategories(); - - return () => - { - AvatarEditorUtilities.FIGURE_SET_IDS = null; - AvatarEditorUtilities.BOUND_FURNITURE_NAMES = null; - } - }, [ figureSetIds, boundFurnitureNames, resetCategories ]); - - useEffect(() => - { - if(!isVisible) return; - - if(!figures) - { - setupFigures(); - - setIsInitalized(true); - - return; - } - }, [ isVisible, figures, setupFigures ]); - - useEffect(() => - { - if(!isVisible || !isInitalized || !needsReset) return; - - loadAvatarInEditor(GetSessionDataManager().figure, GetSessionDataManager().gender); - setNeedsReset(false); - }, [ isVisible, isInitalized, needsReset, loadAvatarInEditor ]); - - useEffect(() => - { - if(isVisible) return; - - return () => - { - setNeedsReset(true); - } - }, [ isVisible ]); - - if(!isVisible || !figureData) return null; - - return ( - - setIsVisible(false) } /> - - { categories && (categories.size > 0) && Array.from(categories.keys()).map(category => - { - const isActive = (activeCategory && (activeCategory.name === category)); - - return ( - selectCategory(category) }> - { LocalizeText(`avatareditor.category.${ category }`) } - - ); - }) } - setIsWardrobeVisible(true) }> - { LocalizeText('avatareditor.category.wardrobe') } - - - - - - { (activeCategory && !isWardrobeVisible) && - } - { isWardrobeVisible && - } - - - - - - - - - - - - - - - - ); -} diff --git a/src/components/avatar-editor/views/AvatarEditorFigurePreviewView.tsx b/src/components/avatar-editor/views/AvatarEditorFigurePreviewView.tsx deleted file mode 100644 index d5715ac..0000000 --- a/src/components/avatar-editor/views/AvatarEditorFigurePreviewView.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { AvatarDirectionAngle } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { FigureData } from '../../../api'; -import { Base, Column, LayoutAvatarImageView } from '../../../common'; -import { AvatarEditorIcon } from './AvatarEditorIcon'; - -export interface AvatarEditorFigurePreviewViewProps -{ - figureData: FigureData; -} - -export const AvatarEditorFigurePreviewView: FC = props => -{ - const { figureData = null } = props; - const [ updateId, setUpdateId ] = useState(-1); - - const rotateFigure = (direction: number) => - { - if(direction < AvatarDirectionAngle.MIN_DIRECTION) - { - direction = (AvatarDirectionAngle.MAX_DIRECTION + (direction + 1)); - } - - if(direction > AvatarDirectionAngle.MAX_DIRECTION) - { - direction = (direction - (AvatarDirectionAngle.MAX_DIRECTION + 1)); - } - - figureData.direction = direction; - } - - useEffect(() => - { - if(!figureData) return; - - figureData.notify = () => setUpdateId(prevValue => (prevValue + 1)); - - return () => - { - figureData.notify = null; - } - }, [ figureData ] ); - - return ( - - - - - - rotateFigure(figureData.direction + 1) } /> - rotateFigure(figureData.direction - 1) } /> - - - ); -} diff --git a/src/components/avatar-editor/views/AvatarEditorIcon.tsx b/src/components/avatar-editor/views/AvatarEditorIcon.tsx deleted file mode 100644 index a05baa1..0000000 --- a/src/components/avatar-editor/views/AvatarEditorIcon.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { FC, useMemo } from 'react'; -import { Base, BaseProps } from '../../../common'; - -type AvatarIconType = 'male' | 'female' | 'clear' | 'sellable' | string; - -export interface AvatarEditorIconProps extends BaseProps -{ - icon: AvatarIconType; - selected?: boolean; -} - -export const AvatarEditorIcon: FC = props => -{ - const { icon = null, selected = false, classNames = [], children = null, ...rest } = props; - - const getClassNames = useMemo(() => - { - const newClassNames: string[] = [ 'nitro-avatar-editor-spritesheet' ]; - - if(icon && icon.length) newClassNames.push(icon + '-icon'); - - if(selected) newClassNames.push('selected'); - - if(classNames.length) newClassNames.push(...classNames); - - return newClassNames; - }, [ icon, selected, classNames ]); - - return -} diff --git a/src/components/avatar-editor/views/AvatarEditorModelView.tsx b/src/components/avatar-editor/views/AvatarEditorModelView.tsx deleted file mode 100644 index 6eb8fe3..0000000 --- a/src/components/avatar-editor/views/AvatarEditorModelView.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { Dispatch, FC, SetStateAction, useCallback, useEffect, useState } from 'react'; -import { CategoryData, FigureData, IAvatarEditorCategoryModel } from '../../../api'; -import { Column, Flex, Grid } from '../../../common'; -import { AvatarEditorIcon } from './AvatarEditorIcon'; -import { AvatarEditorFigureSetView } from './figure-set/AvatarEditorFigureSetView'; -import { AvatarEditorPaletteSetView } from './palette-set/AvatarEditorPaletteSetView'; -export interface AvatarEditorModelViewProps -{ - model: IAvatarEditorCategoryModel; - gender: string; - setGender: Dispatch>; -} - -export const AvatarEditorModelView: FC = props => -{ - const { model = null, gender = null, setGender = null } = props; - const [ activeCategory, setActiveCategory ] = useState(null); - const [ maxPaletteCount, setMaxPaletteCount ] = useState(1); - - const selectCategory = useCallback((name: string) => - { - const category = model.categories.get(name); - - if(!category) return; - - category.init(); - - setActiveCategory(category); - - for(const part of category.parts) - { - if(!part || !part.isSelected) continue; - - setMaxPaletteCount(part.maxColorIndex || 1); - - break; - } - }, [ model ]); - - useEffect(() => - { - model.init(); - - for(const name of model.categories.keys()) - { - selectCategory(name); - - break; - } - }, [ model, selectCategory ]); - - if(!model || !activeCategory) return null; - - return ( - - - { model.canSetGender && - <> - setGender(FigureData.MALE) }> - - - setGender(FigureData.FEMALE) }> - - - } - { !model.canSetGender && model.categories && (model.categories.size > 0) && Array.from(model.categories.keys()).map(name => - { - const category = model.categories.get(name); - - return ( - selectCategory(name) }> - - - ); - }) } - - - - - - { (maxPaletteCount >= 1) && - } - { (maxPaletteCount === 2) && - } - - - ); -} diff --git a/src/components/avatar-editor/views/AvatarEditorWardrobeView.tsx b/src/components/avatar-editor/views/AvatarEditorWardrobeView.tsx deleted file mode 100644 index 015d3b1..0000000 --- a/src/components/avatar-editor/views/AvatarEditorWardrobeView.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import { GetAvatarRenderManager, IAvatarFigureContainer, SaveWardrobeOutfitMessageComposer } from '@nitrots/nitro-renderer'; -import { Dispatch, FC, SetStateAction, useCallback, useMemo } from 'react'; -import { FigureData, GetClubMemberLevel, GetConfigurationValue, LocalizeText, SendMessageComposer } from '../../../api'; -import { AutoGrid, Base, Button, Flex, LayoutAvatarImageView, LayoutCurrencyIcon, LayoutGridItem } from '../../../common'; - -export interface AvatarEditorWardrobeViewProps -{ - figureData: FigureData; - savedFigures: [ IAvatarFigureContainer, string ][]; - setSavedFigures: Dispatch>; - loadAvatarInEditor: (figure: string, gender: string, reset?: boolean) => void; -} - -export const AvatarEditorWardrobeView: FC = props => -{ - const { figureData = null, savedFigures = [], setSavedFigures = null, loadAvatarInEditor = null } = props; - - const hcDisabled = GetConfigurationValue('hc.disabled', false); - - const wearFigureAtIndex = useCallback((index: number) => - { - if((index >= savedFigures.length) || (index < 0)) return; - - const [ figure, gender ] = savedFigures[index]; - - loadAvatarInEditor(figure.getFigureString(), gender); - }, [ savedFigures, loadAvatarInEditor ]); - - const saveFigureAtWardrobeIndex = useCallback((index: number) => - { - if(!figureData || (index >= savedFigures.length) || (index < 0)) return; - - const newFigures = [ ...savedFigures ]; - - const figure = figureData.getFigureString(); - const gender = figureData.gender; - - newFigures[index] = [ GetAvatarRenderManager().createFigureContainer(figure), gender ]; - - setSavedFigures(newFigures); - SendMessageComposer(new SaveWardrobeOutfitMessageComposer((index + 1), figure, gender)); - }, [ figureData, savedFigures, setSavedFigures ]); - - const figures = useMemo(() => - { - if(!savedFigures || !savedFigures.length) return []; - - const items: JSX.Element[] = []; - - savedFigures.forEach(([ figureContainer, gender ], index) => - { - let clubLevel = 0; - - if(figureContainer) clubLevel = GetAvatarRenderManager().getFigureClubLevel(figureContainer, gender); - - items.push( - - { figureContainer && - } - - { !hcDisabled && (clubLevel > 0) && } - - - { figureContainer && - } - - - ); - }); - - return items; - }, [ savedFigures, hcDisabled, saveFigureAtWardrobeIndex, wearFigureAtIndex ]); - - return ( - - { figures } - - ); -} diff --git a/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx b/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx deleted file mode 100644 index 3cd6383..0000000 --- a/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { AvatarEditorGridPartItem, GetConfigurationValue } from '../../../../api'; -import { LayoutCurrencyIcon, LayoutGridItem, LayoutGridItemProps } from '../../../../common'; -import { AvatarEditorIcon } from '../AvatarEditorIcon'; - -export interface AvatarEditorFigureSetItemViewProps extends LayoutGridItemProps -{ - partItem: AvatarEditorGridPartItem; -} - -export const AvatarEditorFigureSetItemView: FC = props => -{ - const { partItem = null, children = null, ...rest } = props; - const [ updateId, setUpdateId ] = useState(-1); - - const hcDisabled = GetConfigurationValue('hc.disabled', false); - - useEffect(() => - { - const rerender = () => setUpdateId(prevValue => (prevValue + 1)); - - partItem.notify = rerender; - - return () => partItem.notify = null; - }, [ partItem ]); - - return ( - - { !hcDisabled && partItem.isHC && } - { partItem.isClear && } - { partItem.isSellable && } - { children } - - ); -} diff --git a/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetView.tsx b/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetView.tsx deleted file mode 100644 index 3755731..0000000 --- a/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetView.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { Dispatch, FC, SetStateAction, useCallback, useEffect, useRef } from 'react'; -import { AvatarEditorGridPartItem, CategoryData, IAvatarEditorCategoryModel } from '../../../../api'; -import { AutoGrid } from '../../../../common'; -import { AvatarEditorFigureSetItemView } from './AvatarEditorFigureSetItemView'; - -export interface AvatarEditorFigureSetViewProps -{ - model: IAvatarEditorCategoryModel; - category: CategoryData; - setMaxPaletteCount: Dispatch>; -} - -export const AvatarEditorFigureSetView: FC = props => -{ - const { model = null, category = null, setMaxPaletteCount = null } = props; - const elementRef = useRef(null); - - const selectPart = useCallback((item: AvatarEditorGridPartItem) => - { - const index = category.parts.indexOf(item); - - if(index === -1) return; - - model.selectPart(category.name, index); - - const partItem = category.getCurrentPart(); - - setMaxPaletteCount(partItem.maxColorIndex || 1); - }, [ model, category, setMaxPaletteCount ]); - - useEffect(() => - { - if(!model || !category || !elementRef || !elementRef.current) return; - - elementRef.current.scrollTop = 0; - }, [ model, category ]); - - return ( - - { (category.parts.length > 0) && category.parts.map((item, index) => - selectPart(item) } />) } - - ); -} diff --git a/src/components/avatar-editor/views/figure-set/index.ts b/src/components/avatar-editor/views/figure-set/index.ts deleted file mode 100644 index 0c5880b..0000000 --- a/src/components/avatar-editor/views/figure-set/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './AvatarEditorFigureSetItemView'; -export * from './AvatarEditorFigureSetView'; diff --git a/src/components/avatar-editor/views/index.ts b/src/components/avatar-editor/views/index.ts deleted file mode 100644 index a92b3b7..0000000 --- a/src/components/avatar-editor/views/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './AvatarEditorFigurePreviewView'; -export * from './AvatarEditorIcon'; -export * from './AvatarEditorModelView'; -export * from './AvatarEditorWardrobeView'; -export * from './figure-set'; -export * from './palette-set'; diff --git a/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetItemView.tsx b/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetItemView.tsx deleted file mode 100644 index 7868057..0000000 --- a/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetItemView.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { AvatarEditorGridColorItem, GetConfigurationValue } from '../../../../api'; -import { LayoutCurrencyIcon, LayoutGridItem, LayoutGridItemProps } from '../../../../common'; - -export interface AvatarEditorPaletteSetItemProps extends LayoutGridItemProps -{ - colorItem: AvatarEditorGridColorItem; -} - -export const AvatarEditorPaletteSetItem: FC = props => -{ - const { colorItem = null, children = null, ...rest } = props; - const [ updateId, setUpdateId ] = useState(-1); - - const hcDisabled = GetConfigurationValue('hc.disabled', false); - - useEffect(() => - { - const rerender = () => setUpdateId(prevValue => (prevValue + 1)); - - colorItem.notify = rerender; - - return () => colorItem.notify = null; - }, [ colorItem ]); - - return ( - - { !hcDisabled && colorItem.isHC && } - { children } - - ); -} diff --git a/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetView.tsx b/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetView.tsx deleted file mode 100644 index c55dcb4..0000000 --- a/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetView.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { FC, useCallback, useEffect, useRef } from 'react'; -import { AvatarEditorGridColorItem, CategoryData, IAvatarEditorCategoryModel } from '../../../../api'; -import { AutoGrid } from '../../../../common'; -import { AvatarEditorPaletteSetItem } from './AvatarEditorPaletteSetItemView'; - -export interface AvatarEditorPaletteSetViewProps -{ - model: IAvatarEditorCategoryModel; - category: CategoryData; - paletteSet: AvatarEditorGridColorItem[]; - paletteIndex: number; -} - -export const AvatarEditorPaletteSetView: FC = props => -{ - const { model = null, category = null, paletteSet = [], paletteIndex = -1 } = props; - const elementRef = useRef(null); - - const selectColor = useCallback((item: AvatarEditorGridColorItem) => - { - const index = paletteSet.indexOf(item); - - if(index === -1) return; - - model.selectColor(category.name, index, paletteIndex); - }, [ model, category, paletteSet, paletteIndex ]); - - useEffect(() => - { - if(!model || !category || !elementRef || !elementRef.current) return; - - elementRef.current.scrollTop = 0; - }, [ model, category ]); - - return ( - - { (paletteSet.length > 0) && paletteSet.map((item, index) => - selectColor(item) } />) } - - ); -} diff --git a/src/components/avatar-editor/views/palette-set/index.ts b/src/components/avatar-editor/views/palette-set/index.ts deleted file mode 100644 index 977e5b9..0000000 --- a/src/components/avatar-editor/views/palette-set/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './AvatarEditorPaletteSetItemView'; -export * from './AvatarEditorPaletteSetView'; diff --git a/src/components/camera/CameraWidgetView.scss b/src/components/camera/CameraWidgetView.scss deleted file mode 100644 index aecd0b1..0000000 --- a/src/components/camera/CameraWidgetView.scss +++ /dev/null @@ -1,133 +0,0 @@ -.nitro-camera-capture { - position: relative; - - .header-close { - top: 8px; - right: 8px; - border-radius: $border-radius; - box-shadow: 0 0 0 1.5px $white; - border: 2px solid #921911; - background: repeating-linear-gradient( - rgba(245, 80, 65, 1), - rgba(245, 80, 65, 1) 50%, - rgba(194, 48, 39, 1) 50%, - rgba(194, 48, 39, 1) 100% - ); - cursor: pointer; - line-height: 1; - padding: 1px 3px; - - &:hover { - filter: brightness(1.2); - } - - &:active { - filter: brightness(0.8); - } - } - - .camera-area { - position: absolute; - top: 37px; - left: 10px; - width: 320px; - height: 320px; - } - - .camera-canvas { - position: relative; - width: 340px; - height: 462px; - background-image: url('@/assets/images/room-widgets/camera-widget/camera-spritesheet.png'); - background-position: -1px -1px; - z-index: 2; - - .camera-button { - width: 94px; - height: 94px; - cursor: pointer; - margin-top: 362px; - - background-image: url('@/assets/images/room-widgets/camera-widget/camera-spritesheet.png'); - background-position: -343px -321px; - - &:hover { - background-position: -535px -321px; - } - - &:active { - background-position: -439px -321px; - } - } - - .camera-view-finder { - background-image: url('@/assets/images/room-widgets/camera-widget/camera-spritesheet.png'); - background-position: -343px -1px; - } - - .camera-frame { - .camera-frame-preview-actions { - background: rgba(0, 0, 0, 0.5); - } - } - } - - .camera-roll { - width: 330px; - background: #bab8b4; - border-bottom-left-radius: 10px; - border-bottom-right-radius: 10px; - border: 1px solid black; - box-shadow: inset 1px 0px white, inset -1px -1px white; - - img { - width: 56px; - height: 56px; - border: 1px solid black; - object-fit: contain; - image-rendering: initial; - } - } -} - -.nitro-camera-editor { - width: $camera-editor-width; - height: $camera-editor-height; - - .picture-preview { - width: 320px; - height: 320px; - } - - .layout-grid-item { - height: 60px !important; - max-height: 60px !important; - } - - .effect-thumbnail-image { - img { - width: 50px; - height: 50px; - image-rendering: auto; - object-fit: contain; - } - } - - .remove-effect { - position: absolute; - top: 1px; - right: 1px; - padding: 2px; - font-size: 10px; - min-height: unset; - } -} - -.nitro-camera-checkout { - width: $camera-checkout-width; - - .picture-preview { - width: 320px; - height: 320px; - } -} diff --git a/src/components/camera/CameraWidgetView.tsx b/src/components/camera/CameraWidgetView.tsx deleted file mode 100644 index 62af9ca..0000000 --- a/src/components/camera/CameraWidgetView.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { AddLinkEventTracker, ILinkEventTracker, RemoveLinkEventTracker, RoomSessionEvent } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { useCamera, useNitroEvent } from '../../hooks'; -import { CameraWidgetCaptureView } from './views/CameraWidgetCaptureView'; -import { CameraWidgetCheckoutView } from './views/CameraWidgetCheckoutView'; -import { CameraWidgetEditorView } from './views/editor/CameraWidgetEditorView'; - -const MODE_NONE: number = 0; -const MODE_CAPTURE: number = 1; -const MODE_EDITOR: number = 2; -const MODE_CHECKOUT: number = 3; - -export const CameraWidgetView: FC<{}> = props => -{ - const [ mode, setMode ] = useState(MODE_NONE); - const [ base64Url, setSavedPictureUrl ] = useState(null); - const { availableEffects = [], selectedPictureIndex = -1, cameraRoll = [], setCameraRoll = null, myLevel = 0, price = { credits: 0, duckets: 0, publishDucketPrice: 0 }} = useCamera(); - - const processAction = (type: string) => - { - switch(type) - { - case 'close': - setMode(MODE_NONE); - return; - case 'edit': - setMode(MODE_EDITOR); - return; - case 'delete': - setCameraRoll(prevValue => - { - const clone = [ ...prevValue ]; - - clone.splice(selectedPictureIndex, 1); - - return clone; - }); - return; - case 'editor_cancel': - setMode(MODE_CAPTURE); - return; - } - } - - const checkoutPictureUrl = (pictureUrl: string) => - { - setSavedPictureUrl(pictureUrl); - setMode(MODE_CHECKOUT); - } - - useNitroEvent(RoomSessionEvent.ENDED, event => setMode(MODE_NONE)); - - useEffect(() => - { - const linkTracker: ILinkEventTracker = { - linkReceived: (url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'show': - setMode(MODE_CAPTURE); - return; - case 'hide': - setMode(MODE_NONE); - return; - case 'toggle': - setMode(prevValue => - { - if(!prevValue) return MODE_CAPTURE; - else return MODE_NONE; - }); - return; - } - }, - eventUrlPrefix: 'camera/' - }; - - AddLinkEventTracker(linkTracker); - - return () => RemoveLinkEventTracker(linkTracker); - }, []); - - if(mode === MODE_NONE) return null; - - return ( - <> - { (mode === MODE_CAPTURE) && processAction('close') } onEdit={ () => processAction('edit') } onDelete={ () => processAction('delete') } /> } - { (mode === MODE_EDITOR) && processAction('close') } onCancel={ () => processAction('editor_cancel') } onCheckout={ checkoutPictureUrl } availableEffects={ availableEffects } /> } - { (mode === MODE_CHECKOUT) && processAction('close') } onCancelClick={ () => processAction('editor_cancel') } price={ price }> } - - ); -} diff --git a/src/components/camera/index.ts b/src/components/camera/index.ts deleted file mode 100644 index 43c10cd..0000000 --- a/src/components/camera/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './CameraWidgetView'; -export * from './views'; -export * from './views/editor'; -export * from './views/editor/effect-list'; diff --git a/src/components/camera/views/CameraWidgetCaptureView.tsx b/src/components/camera/views/CameraWidgetCaptureView.tsx deleted file mode 100644 index ef92884..0000000 --- a/src/components/camera/views/CameraWidgetCaptureView.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import { GetRoomEngine, NitroRectangle, TextureUtils } from '@nitrots/nitro-renderer'; -import { FC, useRef } from 'react'; -import { FaTimes } from 'react-icons/fa'; -import { CameraPicture, GetRoomSession, LocalizeText, PlaySound, SoundNames } from '../../../api'; -import { Column, DraggableWindow, Flex } from '../../../common'; -import { useCamera, useNotification } from '../../../hooks'; - -export interface CameraWidgetCaptureViewProps -{ - onClose: () => void; - onEdit: () => void; - onDelete: () => void; -} - -const CAMERA_ROLL_LIMIT: number = 5; - -export const CameraWidgetCaptureView: FC = props => -{ - const { onClose = null, onEdit = null, onDelete = null } = props; - const { cameraRoll = null, setCameraRoll = null, selectedPictureIndex = -1, setSelectedPictureIndex = null } = useCamera(); - const { simpleAlert = null } = useNotification(); - const elementRef = useRef(); - - const selectedPicture = ((selectedPictureIndex > -1) ? cameraRoll[selectedPictureIndex] : null); - - const getCameraBounds = () => - { - if(!elementRef || !elementRef.current) return null; - - const frameBounds = elementRef.current.getBoundingClientRect(); - - return new NitroRectangle(Math.floor(frameBounds.x), Math.floor(frameBounds.y), Math.floor(frameBounds.width), Math.floor(frameBounds.height)); - } - - const takePicture = async () => - { - if(selectedPictureIndex > -1) - { - setSelectedPictureIndex(-1); - return; - } - - const texture = GetRoomEngine().createTextureFromRoom(GetRoomSession().roomId, 1, getCameraBounds()); - - const clone = [ ...cameraRoll ]; - - if(clone.length >= CAMERA_ROLL_LIMIT) - { - simpleAlert(LocalizeText('camera.full.body')); - - clone.pop(); - } - - PlaySound(SoundNames.CAMERA_SHUTTER); - clone.push(new CameraPicture(texture, await TextureUtils.generateImageUrl(texture))); - - setCameraRoll(clone); - } - - return ( - - - { selectedPicture && } -
-
- -
- { !selectedPicture &&
} - { selectedPicture && -
-
- - -
-
} -
-
-
-
- { (cameraRoll.length > 0) && - - { cameraRoll.map((picture, index) => - { - return setSelectedPictureIndex(index) } />; - }) } - } - - - ); -} diff --git a/src/components/camera/views/CameraWidgetCheckoutView.tsx b/src/components/camera/views/CameraWidgetCheckoutView.tsx deleted file mode 100644 index 100e076..0000000 --- a/src/components/camera/views/CameraWidgetCheckoutView.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { CameraPublishStatusMessageEvent, CameraPurchaseOKMessageEvent, CameraStorageUrlMessageEvent, CreateLinkEvent, GetRoomEngine, PublishPhotoMessageComposer, PurchasePhotoMessageComposer } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useMemo, useState } from 'react'; -import { GetConfigurationValue, LocalizeText, SendMessageComposer } from '../../../api'; -import { Button, Column, Flex, LayoutCurrencyIcon, LayoutImage, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; -import { useMessageEvent } from '../../../hooks'; - -export interface CameraWidgetCheckoutViewProps -{ - base64Url: string; - onCloseClick: () => void; - onCancelClick: () => void; - price: { credits: number, duckets: number, publishDucketPrice: number }; -} - -export const CameraWidgetCheckoutView: FC = props => -{ - const { base64Url = null, onCloseClick = null, onCancelClick = null, price = null } = props; - const [ pictureUrl, setPictureUrl ] = useState(null); - const [ publishUrl, setPublishUrl ] = useState(null); - const [ picturesBought, setPicturesBought ] = useState(0); - const [ wasPicturePublished, setWasPicturePublished ] = useState(false); - const [ isWaiting, setIsWaiting ] = useState(false); - const [ publishCooldown, setPublishCooldown ] = useState(0); - - const publishDisabled = useMemo(() => GetConfigurationValue('camera.publish.disabled', false), []); - - useMessageEvent(CameraPurchaseOKMessageEvent, event => - { - setPicturesBought(value => (value + 1)); - setIsWaiting(false); - }); - - useMessageEvent(CameraPublishStatusMessageEvent, event => - { - const parser = event.getParser(); - - setPublishUrl(parser.extraDataId); - setPublishCooldown(parser.secondsToWait); - setWasPicturePublished(parser.ok); - setIsWaiting(false); - }); - - useMessageEvent(CameraStorageUrlMessageEvent, event => - { - const parser = event.getParser(); - - setPictureUrl(GetConfigurationValue('camera.url') + '/' + parser.url); - }); - - const processAction = (type: string, value: string | number = null) => - { - switch(type) - { - case 'close': - onCloseClick(); - return; - case 'buy': - if(isWaiting) return; - - setIsWaiting(true); - SendMessageComposer(new PurchasePhotoMessageComposer('')); - return; - case 'publish': - if(isWaiting) return; - - setIsWaiting(true); - SendMessageComposer(new PublishPhotoMessageComposer()); - return; - case 'cancel': - onCancelClick(); - return; - } - } - - useEffect(() => - { - if(!base64Url) return; - - GetRoomEngine().saveBase64AsScreenshot(base64Url); - }, [ base64Url ]); - - if(!price) return null; - - return ( - - processAction('close') } /> - - - { (pictureUrl && pictureUrl.length) && - } - { (!pictureUrl || !pictureUrl.length) && - - { LocalizeText('camera.loading') } - } - - - - - { LocalizeText('camera.purchase.header') } - - { ((price.credits > 0) || (price.duckets > 0)) && - - { LocalizeText('catalog.purchase.confirmation.dialog.cost') } - { (price.credits > 0) && - - { price.credits } - - } - { (price.duckets > 0) && - - { price.duckets } - - } - } - { (picturesBought > 0) && - - { LocalizeText('camera.purchase.count.info') } { picturesBought } - CreateLinkEvent('inventory/toggle') }>{ LocalizeText('camera.open.inventory') } - } - - - - - - { !publishDisabled && - - - - { LocalizeText(wasPicturePublished ? 'camera.publish.successful' : 'camera.publish.explanation') } - - - { LocalizeText(wasPicturePublished ? 'camera.publish.success.short.info' : 'camera.publish.detailed.explanation') } - - { wasPicturePublished &&
{ LocalizeText('camera.link.to.published') } } - { !wasPicturePublished && (price.publishDucketPrice > 0) && - - { LocalizeText('catalog.purchase.confirmation.dialog.cost') } - - { price.publishDucketPrice } - - - } - { (publishCooldown > 0) &&
{ LocalizeText('camera.publish.wait', [ 'minutes' ], [ Math.ceil( publishCooldown / 60).toString() ]) }
} - - { !wasPicturePublished && - - - } - } - { LocalizeText('camera.warning.disclaimer') } - - - - - - ); -} diff --git a/src/components/camera/views/CameraWidgetShowPhotoView.tsx b/src/components/camera/views/CameraWidgetShowPhotoView.tsx deleted file mode 100644 index 8614695..0000000 --- a/src/components/camera/views/CameraWidgetShowPhotoView.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { FaArrowLeft, FaArrowRight } from 'react-icons/fa'; -import { GetUserProfile, IPhotoData, LocalizeText } from '../../../api'; -import { Flex, Grid, Text } from '../../../common'; - -export interface CameraWidgetShowPhotoViewProps -{ - currentIndex: number; - currentPhotos: IPhotoData[]; -} - -export const CameraWidgetShowPhotoView: FC = props => -{ - const { currentIndex = -1, currentPhotos = null } = props; - const [ imageIndex, setImageIndex ] = useState(0); - - const currentImage = (currentPhotos && currentPhotos.length) ? currentPhotos[imageIndex] : null; - - const next = () => - { - setImageIndex(prevValue => - { - let newIndex = (prevValue + 1); - - if(newIndex >= currentPhotos.length) newIndex = 0; - - return newIndex; - }); - } - - const previous = () => - { - setImageIndex(prevValue => - { - let newIndex = (prevValue - 1); - - if(newIndex < 0) newIndex = (currentPhotos.length - 1); - - return newIndex; - }); - } - - useEffect(() => - { - setImageIndex(currentIndex); - }, [ currentIndex ]); - - if(!currentImage) return null; - - return ( - - - { !currentImage.w && - { LocalizeText('camera.loading') } } - - { currentImage.m && currentImage.m.length && - { currentImage.m } } - - { (currentImage.n || '') } - { new Date(currentImage.t * 1000).toLocaleDateString() } - - { (currentPhotos.length > 1) && - - - GetUserProfile(currentImage.oi) }>{ currentImage.o } - - - } - - ); -} diff --git a/src/components/camera/views/editor/CameraWidgetEditorView.tsx b/src/components/camera/views/editor/CameraWidgetEditorView.tsx deleted file mode 100644 index 1946c64..0000000 --- a/src/components/camera/views/editor/CameraWidgetEditorView.tsx +++ /dev/null @@ -1,243 +0,0 @@ -import { GetRoomCameraWidgetManager, IRoomCameraWidgetEffect, IRoomCameraWidgetSelectedEffect, RoomCameraWidgetSelectedEffect } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { FaSave, FaSearchMinus, FaSearchPlus, FaTrash } from 'react-icons/fa'; -import ReactSlider from 'react-slider'; -import { CameraEditorTabs, CameraPicture, CameraPictureThumbnail, LocalizeText } from '../../../../api'; -import { Button, ButtonGroup, Column, Flex, Grid, LayoutImage, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView, Text } from '../../../../common'; -import { CameraWidgetEffectListView } from './effect-list'; - -export interface CameraWidgetEditorViewProps -{ - picture: CameraPicture; - availableEffects: IRoomCameraWidgetEffect[]; - myLevel: number; - onClose: () => void; - onCancel: () => void; - onCheckout: (pictureUrl: string) => void; -} - -const TABS: string[] = [ CameraEditorTabs.COLORMATRIX, CameraEditorTabs.COMPOSITE ]; - -export const CameraWidgetEditorView: FC = props => -{ - const { picture = null, availableEffects = null, myLevel = 1, onClose = null, onCancel = null, onCheckout = null } = props; - const [ currentTab, setCurrentTab ] = useState(TABS[0]); - const [ selectedEffectName, setSelectedEffectName ] = useState(null); - const [ selectedEffects, setSelectedEffects ] = useState([]); - const [ effectsThumbnails, setEffectsThumbnails ] = useState([]); - const [ isZoomed, setIsZoomed ] = useState(false); - const [ currentPictureUrl, setCurrentPictureUrl ] = useState(''); - - const getColorMatrixEffects = useMemo(() => - { - return availableEffects.filter(effect => effect.colorMatrix); - }, [ availableEffects ]); - - const getCompositeEffects = useMemo(() => - { - return availableEffects.filter(effect => effect.texture); - }, [ availableEffects ]); - - const getEffectList = useCallback(() => - { - if(currentTab === CameraEditorTabs.COLORMATRIX) - { - return getColorMatrixEffects; - } - - return getCompositeEffects; - }, [ currentTab, getColorMatrixEffects, getCompositeEffects ]); - - const getSelectedEffectIndex = useCallback((name: string) => - { - if(!name || !name.length || !selectedEffects || !selectedEffects.length) return -1; - - return selectedEffects.findIndex(effect => (effect.effect.name === name)); - }, [ selectedEffects ]) - - const getCurrentEffectIndex = useMemo(() => - { - return getSelectedEffectIndex(selectedEffectName) - }, [ selectedEffectName, getSelectedEffectIndex ]) - - const getCurrentEffect = useMemo(() => - { - if(!selectedEffectName) return null; - - return (selectedEffects[getCurrentEffectIndex] || null); - }, [ selectedEffectName, getCurrentEffectIndex, selectedEffects ]); - - const setSelectedEffectAlpha = useCallback((alpha: number) => - { - const index = getCurrentEffectIndex; - - if(index === -1) return; - - setSelectedEffects(prevValue => - { - const clone = [ ...prevValue ]; - const currentEffect = clone[index]; - - clone[getCurrentEffectIndex] = new RoomCameraWidgetSelectedEffect(currentEffect.effect, alpha); - - return clone; - }); - }, [ getCurrentEffectIndex, setSelectedEffects ]); - - const processAction = useCallback((type: string, effectName: string = null) => - { - switch(type) - { - case 'close': - onClose(); - return; - case 'cancel': - onCancel(); - return; - case 'checkout': - onCheckout(currentPictureUrl); - return; - case 'change_tab': - setCurrentTab(String(effectName)); - return; - case 'select_effect': { - let existingIndex = getSelectedEffectIndex(effectName); - - if(existingIndex >= 0) return; - - const effect = availableEffects.find(effect => (effect.name === effectName)); - - if(!effect) return; - - setSelectedEffects(prevValue => - { - return [ ...prevValue, new RoomCameraWidgetSelectedEffect(effect, 1) ]; - }); - - setSelectedEffectName(effect.name); - return; - } - case 'remove_effect': { - let existingIndex = getSelectedEffectIndex(effectName); - - if(existingIndex === -1) return; - - setSelectedEffects(prevValue => - { - const clone = [ ...prevValue ]; - - clone.splice(existingIndex, 1); - - return clone; - }); - - if(selectedEffectName === effectName) setSelectedEffectName(null); - return; - } - case 'clear_effects': - setSelectedEffectName(null); - setSelectedEffects([]); - return; - case 'download': { - (async () => - { - const image = new Image(); - - image.src = currentPictureUrl - - const newWindow = window.open(''); - newWindow.document.write(image.outerHTML); - })(); - return; - } - case 'zoom': - setIsZoomed(!isZoomed); - return; - } - }, [ isZoomed, availableEffects, selectedEffectName, currentPictureUrl, getSelectedEffectIndex, onCancel, onCheckout, onClose, setIsZoomed, setSelectedEffects ]); - - useEffect(() => - { - (async () => - { - const thumbnails: CameraPictureThumbnail[] = []; - - for await (const effect of availableEffects) - { - const image = await GetRoomCameraWidgetManager().applyEffects(picture.texture, [ new RoomCameraWidgetSelectedEffect(effect, 1) ], false); - - thumbnails.push(new CameraPictureThumbnail(effect.name, image.src)); - } - - setEffectsThumbnails(thumbnails); - })(); - }, [ picture, availableEffects ]); - - useEffect(() => - { - (async () => - { - const imageUrl = await GetRoomCameraWidgetManager().applyEffects(picture.texture, selectedEffects, isZoomed); - - setCurrentPictureUrl(imageUrl.src); - })(); - }, [ picture, selectedEffects, isZoomed ]); - - return ( - - processAction('close') } /> - - { TABS.map(tab => - { - return processAction('change_tab', tab) }> - }) } - - - - - - - - - - { selectedEffectName && - - { LocalizeText('camera.effect.name.' + selectedEffectName) } - setSelectedEffectAlpha(event) } - renderThumb={ (props, state) =>
{ state.valueNow }
} /> -
} -
- - - - - - - - - - - -
-
-
-
- ); -} diff --git a/src/components/camera/views/editor/effect-list/CameraWidgetEffectListItemView.tsx b/src/components/camera/views/editor/effect-list/CameraWidgetEffectListItemView.tsx deleted file mode 100644 index cac3a34..0000000 --- a/src/components/camera/views/editor/effect-list/CameraWidgetEffectListItemView.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { IRoomCameraWidgetEffect } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { FaLock, FaTimes } from 'react-icons/fa'; -import { LocalizeText } from '../../../../../api'; -import { Button, LayoutGridItem, Text } from '../../../../../common'; - -export interface CameraWidgetEffectListItemViewProps -{ - effect: IRoomCameraWidgetEffect; - thumbnailUrl: string; - isActive: boolean; - isLocked: boolean; - selectEffect: () => void; - removeEffect: () => void; -} - -export const CameraWidgetEffectListItemView: FC = props => -{ - const { effect = null, thumbnailUrl = null, isActive = false, isLocked = false, selectEffect = null, removeEffect = null } = props; - - return ( - (!isActive && selectEffect()) }> - { isActive && - } - { !isLocked && (thumbnailUrl && thumbnailUrl.length > 0) && -
- -
} - { isLocked && - -
- -
- { effect.minLevel } -
} -
- ); -} diff --git a/src/components/camera/views/editor/effect-list/CameraWidgetEffectListView.tsx b/src/components/camera/views/editor/effect-list/CameraWidgetEffectListView.tsx deleted file mode 100644 index 3f67cea..0000000 --- a/src/components/camera/views/editor/effect-list/CameraWidgetEffectListView.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { IRoomCameraWidgetEffect, IRoomCameraWidgetSelectedEffect } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { CameraPictureThumbnail } from '../../../../../api'; -import { Grid } from '../../../../../common'; -import { CameraWidgetEffectListItemView } from './CameraWidgetEffectListItemView'; - -export interface CameraWidgetEffectListViewProps -{ - myLevel: number; - selectedEffects: IRoomCameraWidgetSelectedEffect[]; - effects: IRoomCameraWidgetEffect[]; - thumbnails: CameraPictureThumbnail[]; - processAction: (type: string, name: string) => void; -} - -export const CameraWidgetEffectListView: FC = props => -{ - const { myLevel = 0, selectedEffects = [], effects = [], thumbnails = [], processAction = null } = props; - - return ( - - { effects && (effects.length > 0) && effects.map((effect, index) => - { - const thumbnailUrl = (thumbnails.find(thumbnail => (thumbnail.effectName === effect.name))); - const isActive = (selectedEffects.findIndex(selectedEffect => (selectedEffect.effect.name === effect.name)) > -1); - - return myLevel) } selectEffect={ () => processAction('select_effect', effect.name) } removeEffect={ () => processAction('remove_effect', effect.name) } /> - }) } - - ); -} diff --git a/src/components/camera/views/editor/effect-list/index.ts b/src/components/camera/views/editor/effect-list/index.ts deleted file mode 100644 index 7a4ebdb..0000000 --- a/src/components/camera/views/editor/effect-list/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './CameraWidgetEffectListItemView'; -export * from './CameraWidgetEffectListView'; diff --git a/src/components/camera/views/editor/index.ts b/src/components/camera/views/editor/index.ts deleted file mode 100644 index 49c615e..0000000 --- a/src/components/camera/views/editor/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './CameraWidgetEditorView'; -export * from './effect-list'; diff --git a/src/components/camera/views/index.ts b/src/components/camera/views/index.ts deleted file mode 100644 index cf44449..0000000 --- a/src/components/camera/views/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './CameraWidgetCaptureView'; -export * from './CameraWidgetCheckoutView'; -export * from './CameraWidgetShowPhotoView'; -export * from './editor'; -export * from './editor/effect-list'; diff --git a/src/components/campaign/CalendarItemView.tsx b/src/components/campaign/CalendarItemView.tsx deleted file mode 100644 index 040414b..0000000 --- a/src/components/campaign/CalendarItemView.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { GetRoomEngine, GetSessionDataManager } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { CalendarItemState, GetConfigurationValue, ICalendarItem } from '../../api'; -import { Base, Column, Flex, LayoutImage } from '../../common'; - -interface CalendarItemViewProps -{ - itemId: number; - state: number; - active?: boolean; - product?: ICalendarItem; - onClick: (itemId: number) => void; -} - -export const CalendarItemView: FC = props => -{ - const { itemId = -1, state = null, product = null, active = false, onClick = null } = props; - - const getFurnitureIcon = (name: string) => - { - let furniData = GetSessionDataManager().getFloorItemDataByName(name); - let url = null; - - if(furniData) url = GetRoomEngine().getFurnitureFloorIconUrl(furniData.id); - else - { - furniData = GetSessionDataManager().getWallItemDataByName(name); - - if(furniData) url = GetRoomEngine().getFurnitureWallIconUrl(furniData.id); - } - - return url; - } - - return ( - onClick(itemId) }> - { (state === CalendarItemState.STATE_UNLOCKED) && - - - { product && - ('image.library.url') + product.customImage : getFurnitureIcon(product.productName) } /> } - - } - { (state !== CalendarItemState.STATE_UNLOCKED) && - - { (state === CalendarItemState.STATE_LOCKED_AVAILABLE) && - } - { ((state === CalendarItemState.STATE_LOCKED_EXPIRED) || (state === CalendarItemState.STATE_LOCKED_FUTURE)) && - } - } - - ); -} diff --git a/src/components/campaign/CalendarView.tsx b/src/components/campaign/CalendarView.tsx deleted file mode 100644 index 3178f91..0000000 --- a/src/components/campaign/CalendarView.tsx +++ /dev/null @@ -1,144 +0,0 @@ -import { GetSessionDataManager } from '@nitrots/nitro-renderer'; -import { FC, useState } from 'react'; -import { CalendarItemState, ICalendarItem, LocalizeText } from '../../api'; -import { Base, Button, Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; -import { CalendarItemView } from './CalendarItemView'; - -interface CalendarViewProps -{ - onClose(): void; - openPackage(id: number, asStaff: boolean): void; - receivedProducts: Map; - campaignName: string; - currentDay: number; - numDays: number; - openedDays: number[]; - missedDays: number[]; -} - -const TOTAL_SHOWN_ITEMS = 5; - -export const CalendarView: FC = props => -{ - const { onClose = null, campaignName = null, currentDay = null, numDays = null, missedDays = null, openedDays = null, openPackage = null, receivedProducts = null } = props; - const [ selectedDay, setSelectedDay ] = useState(currentDay); - const [ index, setIndex ] = useState(Math.max(0, (selectedDay - 1))); - - const getDayState = (day: number) => - { - if(openedDays.includes(day)) return CalendarItemState.STATE_UNLOCKED; - - if(day > currentDay) return CalendarItemState.STATE_LOCKED_FUTURE; - - if(missedDays.includes(day)) return CalendarItemState.STATE_LOCKED_EXPIRED; - - return CalendarItemState.STATE_LOCKED_AVAILABLE; - } - - const dayMessage = (day: number) => - { - const state = getDayState(day); - - switch(state) - { - case CalendarItemState.STATE_UNLOCKED: - return LocalizeText('campaign.calendar.info.unlocked'); - case CalendarItemState.STATE_LOCKED_FUTURE: - return LocalizeText('campaign.calendar.info.future'); - case CalendarItemState.STATE_LOCKED_EXPIRED: - return LocalizeText('campaign.calendar.info.expired'); - default: - return LocalizeText('campaign.calendar.info.available.desktop'); - } - } - - const onClickNext = () => - { - const nextDay = (selectedDay + 1); - - if(nextDay === numDays) return; - - setSelectedDay(nextDay); - - if((index + TOTAL_SHOWN_ITEMS) < (nextDay + 1)) setIndex(index + 1); - } - - const onClickPrev = () => - { - const prevDay = (selectedDay - 1); - - if(prevDay < 0) return; - - setSelectedDay(prevDay); - - if(index > prevDay) setIndex(index - 1); - } - - const onClickItem = (item: number) => - { - if(selectedDay === item) - { - const state = getDayState(item); - - if(state === CalendarItemState.STATE_LOCKED_AVAILABLE) openPackage(item, false); - - return; - } - - setSelectedDay(item); - } - - const forceOpen = () => - { - const id = selectedDay; - const state = getDayState(id); - - if(state !== CalendarItemState.STATE_UNLOCKED) openPackage(id, true); - } - - return ( - - - - - - - - - { LocalizeText('campaign.calendar.heading.day', [ 'number' ], [ (selectedDay + 1).toString() ]) } - { dayMessage(selectedDay) } - -
- { GetSessionDataManager().isModerator && - } -
-
-
- -
- - - - - - - { [ ...Array(TOTAL_SHOWN_ITEMS) ].map((e, i) => - { - const day = (index + i); - - return ( - - - - ); - }) } - - - - - - -
-
- ) -} diff --git a/src/components/campaign/CampaignView.scss b/src/components/campaign/CampaignView.scss deleted file mode 100644 index cea973f..0000000 --- a/src/components/campaign/CampaignView.scss +++ /dev/null @@ -1,71 +0,0 @@ -.nitro-campaign-calendar { - width: $nitro-calendar-width; - height: $nitro-calendar-height; - - .calendar-item { - filter: brightness(80%); - - &.active { - filter: brightness(100%); - } - } -} - -.campaign-spritesheet { - display: block; - background: transparent url('@/assets/images/campaign/campaign_spritesheet.png') no-repeat; - - &.available { - width: 69px; - height: 78px; - background-position: -5px -5px; - } - - &.campaign-day-generic-bg { - max-width: 202px; - height: 447px; - background-position: -84px -5px; - } - - &.campaign-opened { - width: 96px; - height: 66px; - background-position: -296px -5px; - } - - &.locked { - width: 42px; - height: 42px; - background-position: -296px -81px; - } - - &.locked-bg { - width: 132px; - height: 132px; - background-position: -402px -5px; - } - - &.next { - width: 33px; - height: 34px; - background-position: -5px -147px; - } - - &.prev { - width: 33px; - height: 34px; - background-position: -296px -147px; - } - - &.unavailable { - width: 68px; - height: 78px; - background-position: -339px -147px; - } - - &.unlocked-bg { - width: 190px; - height: 189px; - background-position: -296px -235px; - } -} diff --git a/src/components/campaign/CampaignView.tsx b/src/components/campaign/CampaignView.tsx deleted file mode 100644 index 5e10927..0000000 --- a/src/components/campaign/CampaignView.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import { AddLinkEventTracker, CampaignCalendarData, CampaignCalendarDataMessageEvent, CampaignCalendarDoorOpenedMessageEvent, ILinkEventTracker, OpenCampaignCalendarDoorAsStaffComposer, OpenCampaignCalendarDoorComposer, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { CalendarItem, SendMessageComposer } from '../../api'; -import { useMessageEvent } from '../../hooks'; -import { CalendarView } from './CalendarView'; - -export const CampaignView: FC<{}> = props => -{ - const [ calendarData, setCalendarData ] = useState(null); - const [ lastOpenAttempt, setLastOpenAttempt ] = useState(-1); - const [ receivedProducts, setReceivedProducts ] = useState>(new Map()); - const [ isCalendarOpen, setCalendarOpen ] = useState(false); - - const openPackage = (id: number, asStaff = false) => - { - if(!calendarData) return; - - setLastOpenAttempt(id); - - if(asStaff) - { - SendMessageComposer(new OpenCampaignCalendarDoorAsStaffComposer(calendarData.campaignName, id)); - } - - else - { - SendMessageComposer(new OpenCampaignCalendarDoorComposer(calendarData.campaignName, id)); - } - } - - useMessageEvent(CampaignCalendarDataMessageEvent, event => - { - const parser = event.getParser(); - - if(!parser) return; - - setCalendarData(parser.calendarData); - }); - - useMessageEvent(CampaignCalendarDoorOpenedMessageEvent, event => - { - const parser = event.getParser(); - - if(!parser) return; - - const lastAttempt = lastOpenAttempt; - - if(parser.doorOpened) - { - setCalendarData(prev => - { - const copy = prev.clone(); - copy.openedDays.push(lastOpenAttempt); - - return copy; - }); - - setReceivedProducts(prev => - { - const copy = new Map(prev); - copy.set(lastAttempt, new CalendarItem(parser.productName, parser.customImage,parser.furnitureClassName)); - - return copy; - }); - } - - setLastOpenAttempt(-1); - }); - - useEffect(() => - { - const linkTracker: ILinkEventTracker = { - linkReceived: (url: string) => - { - const value = url.split('/'); - - if(value.length < 2) return; - - switch(value[1]) - { - case 'calendar': - setCalendarOpen(true); - break; - } - }, - eventUrlPrefix: 'openView/' - }; - - AddLinkEventTracker(linkTracker); - - return () => RemoveLinkEventTracker(linkTracker); - }, []); - - return ( - <> - { (calendarData && isCalendarOpen) && - setCalendarOpen(false) } campaignName={ calendarData.campaignName } currentDay={ calendarData.currentDay } numDays={ calendarData.campaignDays } openedDays={ calendarData.openedDays } missedDays={ calendarData.missedDays } openPackage={ openPackage } receivedProducts={ receivedProducts } /> - } - - ) -} diff --git a/src/components/catalog/CatalogView.scss b/src/components/catalog/CatalogView.scss deleted file mode 100644 index 824ddb7..0000000 --- a/src/components/catalog/CatalogView.scss +++ /dev/null @@ -1,158 +0,0 @@ -.nitro-catalog { - width: $catalog-width; - height: $catalog-height; - - font[size='16'] { - font-size: 20px; - } - - .catalog-search-button { - min-width: 30px; - width: 30px; - } - - .quantity-input { - min-height: 17px; - height: 17px; - width: 28px; - padding: 0 4px; - text-align: right; - } -} - -.nitro-catalog-gift { - width: 325px; - - .gift-preview { - width: 80px; - height: 80px; - overflow: hidden; - display: flex; - justify-content: center; - align-items: center; - } - - .gift-color { - width: 15px; - height: 15px; - border-radius: $border-radius; - } -} - -.nitro-catalog-navigation-grid-container { - border-color: #b6bec5 !important; - background-color: #cdd3d9; - border: 2px solid; - - .nitro-catalog-navigation-section { - display: grid; - - .nitro-catalog-navigation-section { - padding-left: 5px; - border-left: 2px solid #b6bec5; - } - } - - .layout-grid-item { - font-size: $font-size-sm; - height: 23px !important; - border-color: unset !important; - background-color: #cdd3d9; - border: 0 !important; - padding: 1px 3px; - - .svg-inline--fa { - color: $black; - font-size: 10px; - padding: 1px; - } - } -} - -.nitro-catalog-layout-info-loyalty { - .info-loyalty-content { - background-repeat: no-repeat; - background-position: top right; - background-image: url('@/assets/images/catalog/diamond_info_illustration.gif'); - padding-right: 123px; - } - - .info-image { - width: 123px; - height: 350px; - background-image: url('@/assets/images/catalog/diamond_info_illustration.gif'); - } -} - -.nitro-catalog-layout-vip-buy-grid { - .layout-grid-item { - height: 50px !important; - max-height: 50px !important; - - .icon-hc-banner { - width: 68px; - height: 40px; - background: url('@/assets/images/catalog/hc_big.png') center - no-repeat; - } - } -} - -.nitro-catalog-layout-marketplace-grid { - .layout-grid-item { - height: 75px !important; - } -} - -.nitro-catalog-layout-vip-gifts-grid { - .layout-grid-item { - height: 55px !important; - max-height: 55px !important; - } -} - -.nitro-catalog-layout-marketplace-post-offer { - width: $marketplace-post-offer-width; - height: $marketplace-post-offer-height; -} - -.nitro-catalog-layout-bundle-grid { - .layout-grid-item { - background-color: transparent; - } -} - -.nitro-catalog-header { - width: 290px; - height: 60px; -} - -.autocomplete-gift-container { - background: #fff; - padding: 8px; - list-style-type: none; - min-width: 307px; - border-radius: 0.2rem; - position: absolute; - font-size: 0.7875rem; - top: 81px; - left: 8px; - border: 1px solid #b6c1ce; - margin: 0; - border-radius: 2px; - margin: 0; - box-sizing: border-box; - max-height: 280px; - overflow-y: auto; - z-index: 1; - - .autocomplete-gift-item { - width: 100%; - box-sizing: border-box; - &:hover { - background-color: #ebf4ff; - } - } -} - -@import './views/targeted-offer/Offer.scss'; diff --git a/src/components/catalog/CatalogView.tsx b/src/components/catalog/CatalogView.tsx deleted file mode 100644 index 3df32be..0000000 --- a/src/components/catalog/CatalogView.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import { AddLinkEventTracker, ILinkEventTracker, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; -import { FC, useEffect } from 'react'; -import { GetConfigurationValue, LocalizeText } from '../../api'; -import { Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common'; -import { useCatalog } from '../../hooks'; -import { CatalogIconView } from './views/catalog-icon/CatalogIconView'; -import { CatalogGiftView } from './views/gift/CatalogGiftView'; -import { CatalogNavigationView } from './views/navigation/CatalogNavigationView'; -import { GetCatalogLayout } from './views/page/layout/GetCatalogLayout'; -import { MarketplacePostOfferView } from './views/page/layout/marketplace/MarketplacePostOfferView'; - -export const CatalogView: FC<{}> = props => -{ - const { isVisible = false, setIsVisible = null, rootNode = null, currentPage = null, navigationHidden = false, setNavigationHidden = null, activeNodes = [], searchResult = null, setSearchResult = null, openPageByName = null, openPageByOfferId = null, activateNode = null, getNodeById } = useCatalog(); - - useEffect(() => - { - const linkTracker: ILinkEventTracker = { - linkReceived: (url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'show': - setIsVisible(true); - return; - case 'hide': - setIsVisible(false); - return; - case 'toggle': - setIsVisible(prevValue => !prevValue); - return; - case 'open': - if(parts.length > 2) - { - if(parts.length === 4) - { - switch(parts[2]) - { - case 'offerId': - openPageByOfferId(parseInt(parts[3])); - return; - } - } - else - { - openPageByName(parts[2]); - } - } - else - { - setIsVisible(true); - } - - return; - } - }, - eventUrlPrefix: 'catalog/' - }; - - AddLinkEventTracker(linkTracker); - - return () => RemoveLinkEventTracker(linkTracker); - }, [ setIsVisible, openPageByOfferId, openPageByName ]); - - return ( - <> - { isVisible && - - setIsVisible(false) } /> - - { rootNode && (rootNode.children.length > 0) && rootNode.children.map(child => - { - if(!child.isVisible) return null; - - return ( - - { - if(searchResult) setSearchResult(null); - - activateNode(child); - } } > - - { GetConfigurationValue('catalog.tab.icons') && } - { child.localization } - - - ); - }) } - - - - { !navigationHidden && - - { activeNodes && (activeNodes.length > 0) && - } - } - - { GetCatalogLayout(currentPage, () => setNavigationHidden(true)) } - - - - } - - - - ); -} diff --git a/src/components/catalog/views/CatalogPurchaseConfirmView.tsx b/src/components/catalog/views/CatalogPurchaseConfirmView.tsx deleted file mode 100644 index 30dcfc3..0000000 --- a/src/components/catalog/views/CatalogPurchaseConfirmView.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { FC } from 'react'; - -export const CatalogPurchaseConfirmView: FC<{}> = props => -{ - const {} = props; - - return ( -
- ); -} diff --git a/src/components/catalog/views/catalog-header/CatalogHeaderView.tsx b/src/components/catalog/views/catalog-header/CatalogHeaderView.tsx deleted file mode 100644 index 9c6bbe0..0000000 --- a/src/components/catalog/views/catalog-header/CatalogHeaderView.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { GetConfigurationValue } from '../../../../api'; -import { Flex } from '../../../../common'; - -export interface CatalogHeaderViewProps -{ - imageUrl?: string; -} - -export const CatalogHeaderView: FC = props => -{ - const { imageUrl = null } = props; - const [ displayImageUrl, setDisplayImageUrl ] = useState(''); - - useEffect(() => - { - setDisplayImageUrl(imageUrl ?? GetConfigurationValue('catalog.asset.image.url').replace('%name%', 'catalog_header_roombuilder')); - }, [ imageUrl ]); - - return - - { - currentTarget.src = GetConfigurationValue('catalog.asset.image.url').replace('%name%', 'catalog_header_roombuilder'); - } } /> - ; -} diff --git a/src/components/catalog/views/catalog-icon/CatalogIconView.tsx b/src/components/catalog/views/catalog-icon/CatalogIconView.tsx deleted file mode 100644 index 2376047..0000000 --- a/src/components/catalog/views/catalog-icon/CatalogIconView.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { FC, useMemo } from 'react'; -import { GetConfigurationValue } from '../../../../api'; -import { LayoutImage } from '../../../../common'; - -export interface CatalogIconViewProps -{ - icon: number; -} - -export const CatalogIconView: FC = props => -{ - const { icon = 0 } = props; - - const getIconUrl = useMemo(() => - { - return ((GetConfigurationValue('catalog.asset.icon.url')).replace('%name%', icon.toString())); - }, [ icon ]); - - return ; -} diff --git a/src/components/catalog/views/catalog-room-previewer/CatalogRoomPreviewerView.tsx b/src/components/catalog/views/catalog-room-previewer/CatalogRoomPreviewerView.tsx deleted file mode 100644 index 0e460e5..0000000 --- a/src/components/catalog/views/catalog-room-previewer/CatalogRoomPreviewerView.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { GetEventDispatcher, NitroToolbarAnimateIconEvent, TextureUtils, ToolbarIconEnum } from '@nitrots/nitro-renderer'; -import { FC, useRef } from 'react'; -import { LayoutRoomPreviewerView, LayoutRoomPreviewerViewProps } from '../../../../common'; -import { CatalogPurchasedEvent } from '../../../../events'; -import { useUiEvent } from '../../../../hooks'; - -export const CatalogRoomPreviewerView: FC = props => -{ - const { roomPreviewer = null } = props; - const elementRef = useRef(null); - - useUiEvent(CatalogPurchasedEvent.PURCHASE_SUCCESS, event => - { - if(!elementRef) return; - - const renderTexture = roomPreviewer.getRoomObjectCurrentImage(); - - if(!renderTexture) return; - - (async () => - { - const image = await TextureUtils.generateImage(renderTexture); - - if(!image) return; - - const bounds = elementRef.current.getBoundingClientRect(); - - const x = (bounds.x + (bounds.width / 2)); - const y = (bounds.y + (bounds.height / 2)); - - const animateEvent = new NitroToolbarAnimateIconEvent(image, x, y); - - animateEvent.iconName = ToolbarIconEnum.INVENTORY; - - GetEventDispatcher().dispatchEvent(animateEvent); - })(); - }); - - return ( -
- -
- ); -} diff --git a/src/components/catalog/views/gift/CatalogGiftView.tsx b/src/components/catalog/views/gift/CatalogGiftView.tsx deleted file mode 100644 index 3ac6f25..0000000 --- a/src/components/catalog/views/gift/CatalogGiftView.tsx +++ /dev/null @@ -1,289 +0,0 @@ -import { GetSessionDataManager, GiftReceiverNotFoundEvent, PurchaseFromCatalogAsGiftComposer } from '@nitrots/nitro-renderer'; -import { ChangeEvent, FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { FaChevronLeft, FaChevronRight } from 'react-icons/fa'; -import { ColorUtils, LocalizeText, MessengerFriend, ProductTypeEnum, SendMessageComposer } from '../../../../api'; -import { Base, Button, ButtonGroup, Column, Flex, FormGroup, LayoutCurrencyIcon, LayoutFurniImageView, LayoutGiftTagView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text, classNames } from '../../../../common'; -import { CatalogEvent, CatalogInitGiftEvent, CatalogPurchasedEvent } from '../../../../events'; -import { useCatalog, useFriends, useMessageEvent, useUiEvent } from '../../../../hooks'; - -export const CatalogGiftView: FC<{}> = props => -{ - const [ isVisible, setIsVisible ] = useState(false); - const [ pageId, setPageId ] = useState(0); - const [ offerId, setOfferId ] = useState(0); - const [ extraData, setExtraData ] = useState(''); - const [ receiverName, setReceiverName ] = useState(''); - const [ showMyFace, setShowMyFace ] = useState(true); - const [ message, setMessage ] = useState(''); - const [ colors, setColors ] = useState<{ id: number, color: string }[]>([]); - const [ selectedBoxIndex, setSelectedBoxIndex ] = useState(0); - const [ selectedRibbonIndex, setSelectedRibbonIndex ] = useState(0); - const [ selectedColorId, setSelectedColorId ] = useState(0); - const [ maxBoxIndex, setMaxBoxIndex ] = useState(0); - const [ maxRibbonIndex, setMaxRibbonIndex ] = useState(0); - const [ receiverNotFound, setReceiverNotFound ] = useState(false); - const { catalogOptions = null } = useCatalog(); - const { friends } = useFriends(); - const { giftConfiguration = null } = catalogOptions; - const [ boxTypes, setBoxTypes ] = useState([]); - const [ suggestions, setSuggestions ] = useState([]); - const [ isAutocompleteVisible, setIsAutocompleteVisible ] = useState(true); - - const onClose = useCallback(() => - { - setIsVisible(false); - setPageId(0); - setOfferId(0); - setExtraData(''); - setReceiverName(''); - setShowMyFace(true); - setMessage(''); - setSelectedBoxIndex(0); - setSelectedRibbonIndex(0); - setIsAutocompleteVisible(false); - setSuggestions([]); - - if(colors.length) setSelectedColorId(colors[0].id); - }, [ colors ]); - - const isBoxDefault = useMemo(() => - { - return giftConfiguration ? (giftConfiguration.defaultStuffTypes.findIndex(s => (s === boxTypes[selectedBoxIndex])) > -1) : false; - }, [ boxTypes, giftConfiguration, selectedBoxIndex ]); - - const boxExtraData = useMemo(() => - { - if (!giftConfiguration) return ''; - - return ((boxTypes[selectedBoxIndex] * 1000) + giftConfiguration.ribbonTypes[selectedRibbonIndex]).toString(); - }, [ giftConfiguration, selectedBoxIndex, selectedRibbonIndex, boxTypes ]); - - const isColorable = useMemo(() => - { - if (!giftConfiguration) return false; - - if (isBoxDefault) return false; - - const boxType = boxTypes[selectedBoxIndex]; - - return (boxType === 8 || (boxType >= 3 && boxType <= 6)) ? false : true; - }, [ giftConfiguration, selectedBoxIndex, isBoxDefault, boxTypes ]); - - const colourId = useMemo(() => - { - return isBoxDefault ? boxTypes[selectedBoxIndex] : selectedColorId; - },[ isBoxDefault, boxTypes, selectedBoxIndex, selectedColorId ]) - - const allFriends = friends.filter( (friend: MessengerFriend) => friend.id !== -1 ); - - const onTextChanged = (e: ChangeEvent) => - { - const value = e.target.value; - - let suggestions = []; - - if (value.length > 0) - { - suggestions = allFriends.sort().filter((friend: MessengerFriend) => friend.name.includes(value)); - } - - setReceiverName(value); - setIsAutocompleteVisible(true); - setSuggestions(suggestions); - }; - - const selectedReceiverName = (friendName: string) => - { - setReceiverName(friendName); - setIsAutocompleteVisible(false); - } - - const handleAction = useCallback((action: string) => - { - switch(action) - { - case 'prev_box': - setSelectedBoxIndex(value => (value === 0 ? maxBoxIndex : value - 1)); - return; - case 'next_box': - setSelectedBoxIndex(value => (value === maxBoxIndex ? 0 : value + 1)); - return; - case 'prev_ribbon': - setSelectedRibbonIndex(value => (value === 0 ? maxRibbonIndex : value - 1)); - return; - case 'next_ribbon': - setSelectedRibbonIndex(value => (value === maxRibbonIndex ? 0 : value + 1)); - return; - case 'buy': - if(!receiverName || (receiverName.length === 0)) - { - setReceiverNotFound(true); - return; - } - - SendMessageComposer(new PurchaseFromCatalogAsGiftComposer(pageId, offerId, extraData, receiverName, message, colourId , selectedBoxIndex, selectedRibbonIndex, showMyFace)); - return; - } - }, [ colourId, extraData, maxBoxIndex, maxRibbonIndex, message, offerId, pageId, receiverName, selectedBoxIndex, selectedRibbonIndex, showMyFace ]); - - useMessageEvent(GiftReceiverNotFoundEvent, event => setReceiverNotFound(true)); - - useUiEvent([ - CatalogPurchasedEvent.PURCHASE_SUCCESS, - CatalogEvent.INIT_GIFT ], event => - { - switch(event.type) - { - case CatalogPurchasedEvent.PURCHASE_SUCCESS: - onClose(); - return; - case CatalogEvent.INIT_GIFT: - const castedEvent = (event as CatalogInitGiftEvent); - - onClose(); - - setPageId(castedEvent.pageId); - setOfferId(castedEvent.offerId); - setExtraData(castedEvent.extraData); - setIsVisible(true); - return; - } - }); - - useEffect(() => - { - setReceiverNotFound(false); - }, [ receiverName ]); - - const createBoxTypes = useCallback(() => - { - if (!giftConfiguration) return; - - setBoxTypes(prev => - { - let newPrev = [ ...giftConfiguration.boxTypes ]; - - newPrev.push(giftConfiguration.defaultStuffTypes[ Math.floor((Math.random() * (giftConfiguration.defaultStuffTypes.length - 1))) ]); - - setMaxBoxIndex(newPrev.length- 1); - setMaxRibbonIndex(newPrev.length - 1); - - return newPrev; - }) - },[ giftConfiguration ]) - - useEffect(() => - { - if(!giftConfiguration) return; - - const newColors: { id: number, color: string }[] = []; - - for(const colorId of giftConfiguration.stuffTypes) - { - const giftData = GetSessionDataManager().getFloorItemData(colorId); - - if(!giftData) continue; - - if(giftData.colors && giftData.colors.length > 0) newColors.push({ id: colorId, color: ColorUtils.makeColorNumberHex(giftData.colors[0]) }); - } - - createBoxTypes(); - - if(newColors.length) - { - setSelectedColorId(newColors[0].id); - setColors(newColors); - } - }, [ giftConfiguration, createBoxTypes ]); - - useEffect(() => - { - if (!isVisible) return; - - createBoxTypes(); - },[ createBoxTypes, isVisible ]) - - if(!giftConfiguration || !giftConfiguration.isEnabled || !isVisible) return null; - - const boxName = 'catalog.gift_wrapping_new.box.' + (isBoxDefault ? 'default' : boxTypes[selectedBoxIndex]); - const ribbonName = `catalog.gift_wrapping_new.ribbon.${ selectedRibbonIndex }`; - const priceText = 'catalog.gift_wrapping_new.' + (isBoxDefault ? 'freeprice' : 'price'); - - return ( - - - - - { LocalizeText('catalog.gift_wrapping.receiver') } - onTextChanged(e) } /> - { (suggestions.length > 0 && isAutocompleteVisible) && - - { suggestions.map((friend: MessengerFriend) => ( - selectedReceiverName(friend.name) }>{ friend.name } - )) } - - } - { receiverNotFound && - { LocalizeText('catalog.gift_wrapping.receiver_not_found.title') } } - - setMessage(value) } /> - - setShowMyFace(value => !value) } /> - - - - { selectedColorId && - - - } - - - - - - - - { LocalizeText(boxName) } - - { LocalizeText(priceText, [ 'price' ], [ giftConfiguration.price.toString() ]) } - - - - - - - - - - { LocalizeText(ribbonName) } - - - - - - { LocalizeText('catalog.gift_wrapping.pick_color') } - - - { colors.map(color => - - - - - ); -}; diff --git a/src/components/catalog/views/navigation/CatalogNavigationItemView.tsx b/src/components/catalog/views/navigation/CatalogNavigationItemView.tsx deleted file mode 100644 index 45f7f43..0000000 --- a/src/components/catalog/views/navigation/CatalogNavigationItemView.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { FC } from 'react'; -import { FaCaretDown, FaCaretUp } from 'react-icons/fa'; -import { ICatalogNode } from '../../../../api'; -import { Base, LayoutGridItem, Text } from '../../../../common'; -import { useCatalog } from '../../../../hooks'; -import { CatalogIconView } from '../catalog-icon/CatalogIconView'; -import { CatalogNavigationSetView } from './CatalogNavigationSetView'; - -export interface CatalogNavigationItemViewProps -{ - node: ICatalogNode; - child?: boolean; -} - -export const CatalogNavigationItemView: FC = props => -{ - const { node = null, child = false } = props; - const { activateNode = null } = useCatalog(); - - return ( - - activateNode(node) } className={ child ? 'inset' : '' }> - - { node.localization } - { node.isBranch && - <> - { node.isOpen && } - { !node.isOpen && } - } - - { node.isOpen && node.isBranch && - } - - ); -} diff --git a/src/components/catalog/views/navigation/CatalogNavigationSetView.tsx b/src/components/catalog/views/navigation/CatalogNavigationSetView.tsx deleted file mode 100644 index 8bfdd48..0000000 --- a/src/components/catalog/views/navigation/CatalogNavigationSetView.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { FC } from 'react'; -import { ICatalogNode } from '../../../../api'; -import { CatalogNavigationItemView } from './CatalogNavigationItemView'; - -export interface CatalogNavigationSetViewProps -{ - node: ICatalogNode; - child?: boolean; -} - -export const CatalogNavigationSetView: FC = props => -{ - const { node = null, child = false } = props; - - return ( - <> - { node && (node.children.length > 0) && node.children.map((n, index) => - { - if(!n.isVisible) return null; - - return - }) } - - ); -} diff --git a/src/components/catalog/views/navigation/CatalogNavigationView.tsx b/src/components/catalog/views/navigation/CatalogNavigationView.tsx deleted file mode 100644 index 2d03f06..0000000 --- a/src/components/catalog/views/navigation/CatalogNavigationView.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { FC } from 'react'; -import { ICatalogNode } from '../../../../api'; -import { AutoGrid, Column } from '../../../../common'; -import { useCatalog } from '../../../../hooks'; -import { CatalogSearchView } from '../page/common/CatalogSearchView'; -import { CatalogNavigationItemView } from './CatalogNavigationItemView'; -import { CatalogNavigationSetView } from './CatalogNavigationSetView'; - -export interface CatalogNavigationViewProps -{ - node: ICatalogNode; -} - -export const CatalogNavigationView: FC = props => -{ - const { node = null } = props; - const { searchResult = null } = useCatalog(); - - return ( - <> - - - - { searchResult && (searchResult.filteredNodes.length > 0) && searchResult.filteredNodes.map((n, index) => - { - return ; - }) } - { !searchResult && - } - - - - ); -} diff --git a/src/components/catalog/views/page/common/CatalogGridOfferView.tsx b/src/components/catalog/views/page/common/CatalogGridOfferView.tsx deleted file mode 100644 index 507bb6c..0000000 --- a/src/components/catalog/views/page/common/CatalogGridOfferView.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import { MouseEventType } from '@nitrots/nitro-renderer'; -import { FC, MouseEvent, useMemo, useState } from 'react'; -import { IPurchasableOffer, Offer, ProductTypeEnum } from '../../../../../api'; -import { LayoutAvatarImageView, LayoutGridItem, LayoutGridItemProps } from '../../../../../common'; -import { useCatalog, useInventoryFurni } from '../../../../../hooks'; - -interface CatalogGridOfferViewProps extends LayoutGridItemProps -{ - offer: IPurchasableOffer; - selectOffer: (offer: IPurchasableOffer) => void; -} - -export const CatalogGridOfferView: FC = props => -{ - const { offer = null, selectOffer = null, itemActive = false, ...rest } = props; - const [ isMouseDown, setMouseDown ] = useState(false); - const { requestOfferToMover = null } = useCatalog(); - const { isVisible = false } = useInventoryFurni(); - - const iconUrl = useMemo(() => - { - if(offer.pricingModel === Offer.PRICING_MODEL_BUNDLE) - { - return null; - } - - return offer.product.getIconUrl(offer); - }, [ offer ]); - - const onMouseEvent = (event: MouseEvent) => - { - switch(event.type) - { - case MouseEventType.MOUSE_DOWN: - selectOffer(offer); - setMouseDown(true); - return; - case MouseEventType.MOUSE_UP: - setMouseDown(false); - return; - case MouseEventType.ROLL_OUT: - if(!isMouseDown || !itemActive || !isVisible) return; - - requestOfferToMover(offer); - return; - } - } - - const product = offer.product; - - if(!product) return null; - - return ( - - { (offer.product.productType === ProductTypeEnum.ROBOT) && - } - - ); -} diff --git a/src/components/catalog/views/page/common/CatalogRedeemVoucherView.tsx b/src/components/catalog/views/page/common/CatalogRedeemVoucherView.tsx deleted file mode 100644 index 504bd4b..0000000 --- a/src/components/catalog/views/page/common/CatalogRedeemVoucherView.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { RedeemVoucherMessageComposer, VoucherRedeemErrorMessageEvent, VoucherRedeemOkMessageEvent } from '@nitrots/nitro-renderer'; -import { FC, useState } from 'react'; -import { FaTag } from 'react-icons/fa'; -import { LocalizeText, SendMessageComposer } from '../../../../../api'; -import { Button, Flex } from '../../../../../common'; -import { useMessageEvent, useNotification } from '../../../../../hooks'; - -export interface CatalogRedeemVoucherViewProps -{ - text: string; -} - -export const CatalogRedeemVoucherView: FC = props => -{ - const { text = null } = props; - const [ voucher, setVoucher ] = useState(''); - const [ isWaiting, setIsWaiting ] = useState(false); - const { simpleAlert = null } = useNotification(); - - const redeemVoucher = () => - { - if(!voucher || !voucher.length || isWaiting) return; - - SendMessageComposer(new RedeemVoucherMessageComposer(voucher)); - - setIsWaiting(true); - } - - useMessageEvent(VoucherRedeemOkMessageEvent, event => - { - const parser = event.getParser(); - - let message = LocalizeText('catalog.alert.voucherredeem.ok.description'); - - if(parser.productName) message = LocalizeText('catalog.alert.voucherredeem.ok.description.furni', [ 'productName', 'productDescription' ], [ parser.productName, parser.productDescription ]); - - simpleAlert(message, null, null, null, LocalizeText('catalog.alert.voucherredeem.ok.title')); - - setIsWaiting(false); - setVoucher(''); - }); - - useMessageEvent(VoucherRedeemErrorMessageEvent, event => - { - const parser = event.getParser(); - - simpleAlert(LocalizeText(`catalog.alert.voucherredeem.error.description.${ parser.errorCode }`), null, null, null, LocalizeText('catalog.alert.voucherredeem.error.title')); - - setIsWaiting(false); - }); - - return ( - - setVoucher(event.target.value) } /> - - - ); -} diff --git a/src/components/catalog/views/page/common/CatalogSearchView.tsx b/src/components/catalog/views/page/common/CatalogSearchView.tsx deleted file mode 100644 index e117f90..0000000 --- a/src/components/catalog/views/page/common/CatalogSearchView.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import { GetSessionDataManager, IFurnitureData } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { FaSearch, FaTimes } from 'react-icons/fa'; -import { CatalogPage, CatalogType, FilterCatalogNode, FurnitureOffer, GetOfferNodes, ICatalogNode, ICatalogPage, IPurchasableOffer, LocalizeText, PageLocalization, SearchResult } from '../../../../../api'; -import { Button, Flex } from '../../../../../common'; -import { useCatalog } from '../../../../../hooks'; - -export const CatalogSearchView: FC<{}> = props => -{ - const [ searchValue, setSearchValue ] = useState(''); - const { currentType = null, rootNode = null, offersToNodes = null, searchResult = null, setSearchResult = null, setCurrentPage = null } = useCatalog(); - - useEffect(() => - { - let search = searchValue?.toLocaleLowerCase().replace(' ', ''); - - if(!search || !search.length) - { - setSearchResult(null); - - return; - } - - const timeout = setTimeout(() => - { - const furnitureDatas = GetSessionDataManager().getAllFurnitureData(); - - if(!furnitureDatas || !furnitureDatas.length) return; - - const foundFurniture: IFurnitureData[] = []; - const foundFurniLines: string[] = []; - - for(const furniture of furnitureDatas) - { - if((currentType === CatalogType.BUILDER) && !furniture.availableForBuildersClub) continue; - - if((currentType === CatalogType.NORMAL) && furniture.excludeDynamic) continue; - - const searchValues = [ furniture.className, furniture.name, furniture.description ].join(' ').replace(/ /gi, '').toLowerCase(); - - if((currentType === CatalogType.BUILDER) && (furniture.purchaseOfferId === -1) && (furniture.rentOfferId === -1)) - { - if((furniture.furniLine !== '') && (foundFurniLines.indexOf(furniture.furniLine) < 0)) - { - if(searchValues.indexOf(search) >= 0) foundFurniLines.push(furniture.furniLine); - } - } - else - { - const foundNodes = [ - ...GetOfferNodes(offersToNodes, furniture.purchaseOfferId), - ...GetOfferNodes(offersToNodes, furniture.rentOfferId) - ]; - - if(foundNodes.length) - { - if(searchValues.indexOf(search) >= 0) foundFurniture.push(furniture); - - if(foundFurniture.length === 250) break; - } - } - } - - const offers: IPurchasableOffer[] = []; - - for(const furniture of foundFurniture) offers.push(new FurnitureOffer(furniture)); - - let nodes: ICatalogNode[] = []; - - FilterCatalogNode(search, foundFurniLines, rootNode, nodes); - - setSearchResult(new SearchResult(search, offers, nodes.filter(node => (node.isVisible)))); - setCurrentPage((new CatalogPage(-1, 'default_3x3', new PageLocalization([], []), offers, false, 1) as ICatalogPage)); - }, 300); - - return () => clearTimeout(timeout); - }, [ offersToNodes, currentType, rootNode, searchValue, setCurrentPage, setSearchResult ]); - - return ( - - - setSearchValue(event.target.value) } /> - - { (!searchValue || !searchValue.length) && - } - { searchValue && !!searchValue.length && - } - - ); -} diff --git a/src/components/catalog/views/page/layout/CatalogLayout.types.ts b/src/components/catalog/views/page/layout/CatalogLayout.types.ts deleted file mode 100644 index b05bccf..0000000 --- a/src/components/catalog/views/page/layout/CatalogLayout.types.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ICatalogPage } from '../../../../../api'; - -export interface CatalogLayoutProps -{ - page: ICatalogPage; - hideNavigation: () => void; -} diff --git a/src/components/catalog/views/page/layout/CatalogLayoutBadgeDisplayView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutBadgeDisplayView.tsx deleted file mode 100644 index 9b6ec6a..0000000 --- a/src/components/catalog/views/page/layout/CatalogLayoutBadgeDisplayView.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { FC } from 'react'; -import { LocalizeText } from '../../../../../api'; -import { Base, Column, Flex, Grid, Text } from '../../../../../common'; -import { useCatalog } from '../../../../../hooks'; -import { CatalogBadgeSelectorWidgetView } from '../widgets/CatalogBadgeSelectorWidgetView'; -import { CatalogFirstProductSelectorWidgetView } from '../widgets/CatalogFirstProductSelectorWidgetView'; -import { CatalogItemGridWidgetView } from '../widgets/CatalogItemGridWidgetView'; -import { CatalogLimitedItemWidgetView } from '../widgets/CatalogLimitedItemWidgetView'; -import { CatalogPurchaseWidgetView } from '../widgets/CatalogPurchaseWidgetView'; -import { CatalogTotalPriceWidget } from '../widgets/CatalogTotalPriceWidget'; -import { CatalogViewProductWidgetView } from '../widgets/CatalogViewProductWidgetView'; -import { CatalogLayoutProps } from './CatalogLayout.types'; - -export const CatalogLayoutBadgeDisplayView: FC = props => -{ - const { page = null } = props; - const { currentOffer = null } = useCatalog(); - - return ( - <> - - - - - - { LocalizeText('catalog_selectbadge') } - - - - - { !currentOffer && - <> - { !!page.localization.getImage(1) && } - - } - { currentOffer && - <> - - - - - - { currentOffer.localizationName } - - - - - - } - - - - ); -} diff --git a/src/components/catalog/views/page/layout/CatalogLayoutColorGroupingView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutColorGroupingView.tsx deleted file mode 100644 index 60ccdba..0000000 --- a/src/components/catalog/views/page/layout/CatalogLayoutColorGroupingView.tsx +++ /dev/null @@ -1,176 +0,0 @@ -import { ColorConverter } from '@nitrots/nitro-renderer'; -import { FC, useMemo, useState } from 'react'; -import { FaFillDrip } from 'react-icons/fa'; -import { IPurchasableOffer } from '../../../../../api'; -import { AutoGrid, Base, Button, Column, Flex, Grid, LayoutGridItem, Text } from '../../../../../common'; -import { useCatalog } from '../../../../../hooks'; -import { CatalogGridOfferView } from '../common/CatalogGridOfferView'; -import { CatalogAddOnBadgeWidgetView } from '../widgets/CatalogAddOnBadgeWidgetView'; -import { CatalogLimitedItemWidgetView } from '../widgets/CatalogLimitedItemWidgetView'; -import { CatalogPurchaseWidgetView } from '../widgets/CatalogPurchaseWidgetView'; -import { CatalogSpinnerWidgetView } from '../widgets/CatalogSpinnerWidgetView'; -import { CatalogTotalPriceWidget } from '../widgets/CatalogTotalPriceWidget'; -import { CatalogViewProductWidgetView } from '../widgets/CatalogViewProductWidgetView'; -import { CatalogLayoutProps } from './CatalogLayout.types'; - -export interface CatalogLayoutColorGroupViewProps extends CatalogLayoutProps -{ - -} - -export const CatalogLayoutColorGroupingView : FC = props => -{ - const { page = null } = props; - const [ colorableItems, setColorableItems ] = useState>(new Map()); - const { currentOffer = null, setCurrentOffer = null } = useCatalog(); - const [ colorsShowing, setColorsShowing ] = useState(false); - - const sortByColorIndex = (a: IPurchasableOffer, b: IPurchasableOffer) => - { - if (((!(a.product.furnitureData.colorIndex)) || (!(b.product.furnitureData.colorIndex)))) - { - return 1; - } - if (a.product.furnitureData.colorIndex > b.product.furnitureData.colorIndex) - { - return 1; - } - if (a == b) - { - return 0; - } - return -1; - } - - const sortyByFurnitureClassName = (a: IPurchasableOffer, b: IPurchasableOffer) => - { - if (a.product.furnitureData.className > b.product.furnitureData.className) - { - return 1; - } - if (a == b) - { - return 0; - } - return -1; - } - - const selectOffer = (offer: IPurchasableOffer) => - { - offer.activate(); - setCurrentOffer(offer); - } - - const selectColor = (colorIndex: number, productName: string) => - { - const fullName = `${ productName }*${ colorIndex }`; - const index = page.offers.findIndex(offer => offer.product.furnitureData.fullName === fullName); - if (index > -1) - { - selectOffer(page.offers[index]); - } - } - - const offers = useMemo(() => - { - const offers: IPurchasableOffer[] = []; - const addedColorableItems = new Map(); - const updatedColorableItems = new Map(); - - page.offers.sort(sortByColorIndex); - - page.offers.forEach(offer => - { - if(!offer.product) return; - - const furniData = offer.product.furnitureData; - - if(!furniData || !furniData.hasIndexedColor) - { - offers.push(offer); - } - else - { - const name = furniData.className; - const colorIndex = furniData.colorIndex; - - if(!updatedColorableItems.has(name)) - { - updatedColorableItems.set(name, []); - } - - let selectedColor = 0xFFFFFF; - - if(furniData.colors) - { - for(let color of furniData.colors) - { - if(color !== 0xFFFFFF) // skip the white colors - { - selectedColor = color; - } - } - - if(updatedColorableItems.get(name).indexOf(selectedColor) === -1) - { - updatedColorableItems.get(name)[colorIndex] = selectedColor; - } - - } - - if(!addedColorableItems.has(name)) - { - offers.push(offer); - addedColorableItems.set(name, true); - } - } - }); - offers.sort(sortyByFurnitureClassName); - setColorableItems(updatedColorableItems); - return offers; - }, [ page.offers ]); - - return ( - - - - { (!colorsShowing || !currentOffer || !colorableItems.has(currentOffer.product.furnitureData.className)) && - offers.map((offer, index) => ) - } - { (colorsShowing && currentOffer && colorableItems.has(currentOffer.product.furnitureData.className)) && - colorableItems.get(currentOffer.product.furnitureData.className).map((color, index) => selectColor(index, currentOffer.product.furnitureData.className) } />) - } - - - - { !currentOffer && - <> - { !!page.localization.getImage(1) && } - - } - { currentOffer && - <> - - - - { currentOffer.product.furnitureData.hasIndexedColor && - } - - - - { currentOffer.localizationName } - - - - - - - - - } - - - ); -} diff --git a/src/components/catalog/views/page/layout/CatalogLayoutDefaultView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutDefaultView.tsx deleted file mode 100644 index f1cfab3..0000000 --- a/src/components/catalog/views/page/layout/CatalogLayoutDefaultView.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { FC } from 'react'; -import { GetConfigurationValue, ProductTypeEnum } from '../../../../../api'; -import { Column, Flex, Grid, LayoutImage, Text } from '../../../../../common'; -import { useCatalog } from '../../../../../hooks'; -import { CatalogHeaderView } from '../../catalog-header/CatalogHeaderView'; -import { CatalogAddOnBadgeWidgetView } from '../widgets/CatalogAddOnBadgeWidgetView'; -import { CatalogItemGridWidgetView } from '../widgets/CatalogItemGridWidgetView'; -import { CatalogLimitedItemWidgetView } from '../widgets/CatalogLimitedItemWidgetView'; -import { CatalogPurchaseWidgetView } from '../widgets/CatalogPurchaseWidgetView'; -import { CatalogSpinnerWidgetView } from '../widgets/CatalogSpinnerWidgetView'; -import { CatalogTotalPriceWidget } from '../widgets/CatalogTotalPriceWidget'; -import { CatalogViewProductWidgetView } from '../widgets/CatalogViewProductWidgetView'; -import { CatalogLayoutProps } from './CatalogLayout.types'; - -export const CatalogLayoutDefaultView: FC = props => -{ - const { page = null } = props; - const { currentOffer = null, currentPage = null } = useCatalog(); - - return ( - <> - - - { GetConfigurationValue('catalog.headers') && - } - - - - { !currentOffer && - <> - { !!page.localization.getImage(1) && - } - - } - { currentOffer && - <> - - { (currentOffer.product.productType !== ProductTypeEnum.BADGE) && - <> - - - } - { (currentOffer.product.productType === ProductTypeEnum.BADGE) && } - - - - { currentOffer.localizationName } - - - - - - - - - } - - - - ); -} diff --git a/src/components/catalog/views/page/layout/CatalogLayoutGuildCustomFurniView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutGuildCustomFurniView.tsx deleted file mode 100644 index cf12951..0000000 --- a/src/components/catalog/views/page/layout/CatalogLayoutGuildCustomFurniView.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { FC } from 'react'; -import { Base, Column, Flex, Grid, Text } from '../../../../../common'; -import { useCatalog } from '../../../../../hooks'; -import { CatalogGuildBadgeWidgetView } from '../widgets/CatalogGuildBadgeWidgetView'; -import { CatalogGuildSelectorWidgetView } from '../widgets/CatalogGuildSelectorWidgetView'; -import { CatalogItemGridWidgetView } from '../widgets/CatalogItemGridWidgetView'; -import { CatalogPurchaseWidgetView } from '../widgets/CatalogPurchaseWidgetView'; -import { CatalogTotalPriceWidget } from '../widgets/CatalogTotalPriceWidget'; -import { CatalogViewProductWidgetView } from '../widgets/CatalogViewProductWidgetView'; -import { CatalogLayoutProps } from './CatalogLayout.types'; - -export const CatalogLayouGuildCustomFurniView: FC = props => -{ - const { page = null } = props; - const { currentOffer = null } = useCatalog(); - - return ( - - - - - - { !currentOffer && - <> - { !!page.localization.getImage(1) && } - - } - { currentOffer && - <> - - - - - - { currentOffer.localizationName } - - - - - - - - - } - - - ); -} diff --git a/src/components/catalog/views/page/layout/CatalogLayoutGuildForumView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutGuildForumView.tsx deleted file mode 100644 index b5a89ca..0000000 --- a/src/components/catalog/views/page/layout/CatalogLayoutGuildForumView.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { CatalogGroupsComposer } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { SendMessageComposer } from '../../../../../api'; -import { Base, Column, Flex, Grid, Text } from '../../../../../common'; -import { useCatalog } from '../../../../../hooks'; -import { CatalogFirstProductSelectorWidgetView } from '../widgets/CatalogFirstProductSelectorWidgetView'; -import { CatalogGuildSelectorWidgetView } from '../widgets/CatalogGuildSelectorWidgetView'; -import { CatalogPurchaseWidgetView } from '../widgets/CatalogPurchaseWidgetView'; -import { CatalogTotalPriceWidget } from '../widgets/CatalogTotalPriceWidget'; -import { CatalogLayoutProps } from './CatalogLayout.types'; - -export const CatalogLayouGuildForumView: FC = props => -{ - const { page = null } = props; - const [ selectedGroupIndex, setSelectedGroupIndex ] = useState(0); - const { currentOffer = null, setCurrentOffer = null, catalogOptions = null } = useCatalog(); - const { groups = null } = catalogOptions; - - useEffect(() => - { - SendMessageComposer(new CatalogGroupsComposer()); - }, [ page ]); - - return ( - <> - - - - - - - { !!currentOffer && - <> - - { currentOffer.localizationName } - - - - - - - - - } - - - - ); -} diff --git a/src/components/catalog/views/page/layout/CatalogLayoutGuildFrontpageView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutGuildFrontpageView.tsx deleted file mode 100644 index 01cbcf1..0000000 --- a/src/components/catalog/views/page/layout/CatalogLayoutGuildFrontpageView.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { CreateLinkEvent } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { LocalizeText } from '../../../../../api'; -import { Base } from '../../../../../common/Base'; -import { Button } from '../../../../../common/Button'; -import { Column } from '../../../../../common/Column'; -import { Grid } from '../../../../../common/Grid'; -import { LayoutImage } from '../../../../../common/layout/LayoutImage'; -import { CatalogLayoutProps } from './CatalogLayout.types'; - -export const CatalogLayouGuildFrontpageView: FC = props => -{ - const { page = null } = props; - - return ( - - - - - - - - - - - - ); -} diff --git a/src/components/catalog/views/page/layout/CatalogLayoutInfoLoyaltyView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutInfoLoyaltyView.tsx deleted file mode 100644 index 06c4c03..0000000 --- a/src/components/catalog/views/page/layout/CatalogLayoutInfoLoyaltyView.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { FC } from 'react'; -import { CatalogLayoutProps } from './CatalogLayout.types'; - -export const CatalogLayoutInfoLoyaltyView: FC = props => -{ - const { page = null } = props; - - return ( -
-
-
-
-
- ); -} diff --git a/src/components/catalog/views/page/layout/CatalogLayoutPets2View.tsx b/src/components/catalog/views/page/layout/CatalogLayoutPets2View.tsx deleted file mode 100644 index 38ad284..0000000 --- a/src/components/catalog/views/page/layout/CatalogLayoutPets2View.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { FC } from 'react'; -import { CatalogLayoutProps } from './CatalogLayout.types'; -import { CatalogLayoutPets3View } from './CatalogLayoutPets3View'; - -export const CatalogLayoutPets2View: FC = props => -{ - return -} diff --git a/src/components/catalog/views/page/layout/CatalogLayoutPets3View.tsx b/src/components/catalog/views/page/layout/CatalogLayoutPets3View.tsx deleted file mode 100644 index 7aec846..0000000 --- a/src/components/catalog/views/page/layout/CatalogLayoutPets3View.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { FC } from 'react'; -import { Base, Column, Flex } from '../../../../../common'; -import { CatalogLayoutProps } from './CatalogLayout.types'; - -export const CatalogLayoutPets3View: FC = props => -{ - const { page = null } = props; - - const imageUrl = page.localization.getImage(1); - - return ( - - - { imageUrl && } - - - - - - - - - - ); -} diff --git a/src/components/catalog/views/page/layout/CatalogLayoutRoomAdsView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutRoomAdsView.tsx deleted file mode 100644 index 92dd4bf..0000000 --- a/src/components/catalog/views/page/layout/CatalogLayoutRoomAdsView.tsx +++ /dev/null @@ -1,113 +0,0 @@ -import { GetRoomAdPurchaseInfoComposer, GetUserEventCatsMessageComposer, PurchaseRoomAdMessageComposer, RoomAdPurchaseInfoEvent, RoomEntryData } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, SendMessageComposer } from '../../../../../api'; -import { Base, Button, Column, Text } from '../../../../../common'; -import { useCatalog, useMessageEvent, useNavigator, useRoomPromote } from '../../../../../hooks'; -import { CatalogLayoutProps } from './CatalogLayout.types'; - -export const CatalogLayoutRoomAdsView: FC = props => -{ - const { page = null } = props; - const [ eventName, setEventName ] = useState(''); - const [ eventDesc, setEventDesc ] = useState(''); - const [ roomId, setRoomId ] = useState(-1); - const [ availableRooms, setAvailableRooms ] = useState([]); - const [ extended, setExtended ] = useState(false); - const [ categoryId, setCategoryId ] = useState(1); - const { categories = null } = useNavigator(); - const { setIsVisible = null } = useCatalog(); - const { promoteInformation, isExtended, setIsExtended } = useRoomPromote(); - - useEffect(() => - { - if(isExtended) - { - setRoomId(promoteInformation.data.flatId); - setEventName(promoteInformation.data.eventName); - setEventDesc(promoteInformation.data.eventDescription); - setCategoryId(promoteInformation.data.categoryId); - setExtended(isExtended); // This is for sending to packet - setIsExtended(false); // This is from hook useRoomPromotte - } - - }, [ isExtended, eventName, eventDesc, categoryId ]); - - const resetData = () => - { - setRoomId(-1); - setEventName(''); - setEventDesc(''); - setCategoryId(1); - setIsExtended(false); - setIsVisible(false); - } - - const purchaseAd = () => - { - const pageId = page.pageId; - const offerId = page.offers.length >= 1 ? page.offers[0].offerId : -1; - const flatId = roomId; - const name = eventName; - const desc = eventDesc; - const catId = categoryId; - - SendMessageComposer(new PurchaseRoomAdMessageComposer(pageId, offerId, flatId, name, extended, desc, catId)); - resetData(); - } - - useMessageEvent(RoomAdPurchaseInfoEvent, event => - { - const parser = event.getParser(); - - if(!parser) return; - - setAvailableRooms(parser.rooms); - }); - - useEffect(() => - { - SendMessageComposer(new GetRoomAdPurchaseInfoComposer()); - // TODO: someone needs to fix this for morningstar - SendMessageComposer(new GetUserEventCatsMessageComposer()); - }, []); - - return (<> - { LocalizeText('roomad.catalog_header') } - - { LocalizeText('roomad.catalog_text', [ 'duration' ], [ '120' ]) } - - - { LocalizeText('navigator.category') } - - - - { LocalizeText('roomad.catalog_name') } - setEventName(event.target.value) } readOnly={ extended } /> - - - { LocalizeText('roomad.catalog_description') } - - { LocalizeText('friendlist.invite.note') } - - - - - - - ); -}; diff --git a/src/components/friends/views/friends-list/FriendsListSearchView.tsx b/src/components/friends/views/friends-list/FriendsListSearchView.tsx deleted file mode 100644 index 69073a2..0000000 --- a/src/components/friends/views/friends-list/FriendsListSearchView.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import { HabboSearchComposer, HabboSearchResultData, HabboSearchResultEvent } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, OpenMessengerChat, SendMessageComposer } from '../../../../api'; -import { Base, Column, Flex, NitroCardAccordionItemView, NitroCardAccordionSetView, NitroCardAccordionSetViewProps, Text, UserProfileIconView } from '../../../../common'; -import { useFriends, useMessageEvent } from '../../../../hooks'; - -interface FriendsSearchViewProps extends NitroCardAccordionSetViewProps -{ - -} - -export const FriendsSearchView: FC = props => -{ - const { ...rest } = props; - const [ searchValue, setSearchValue ] = useState(''); - const [ friendResults, setFriendResults ] = useState(null); - const [ otherResults, setOtherResults ] = useState(null); - const { canRequestFriend = null, requestFriend = null } = useFriends(); - - useMessageEvent(HabboSearchResultEvent, event => - { - const parser = event.getParser(); - - setFriendResults(parser.friends); - setOtherResults(parser.others); - }); - - useEffect(() => - { - if(!searchValue || !searchValue.length) return; - - const timeout = setTimeout(() => - { - if(!searchValue || !searchValue.length) return; - - SendMessageComposer(new HabboSearchComposer(searchValue)); - }, 500); - - return () => clearTimeout(timeout); - }, [ searchValue ]); - - return ( - - setSearchValue(event.target.value) } /> - - { friendResults && - <> - { (friendResults.length === 0) && - { LocalizeText('friendlist.search.nofriendsfound') } } - { (friendResults.length > 0) && - - { LocalizeText('friendlist.search.friendscaption', [ 'cnt' ], [ friendResults.length.toString() ]) } -
- - { friendResults.map(result => - { - return ( - - - -
{ result.avatarName }
-
- - { result.isAvatarOnline && - OpenMessengerChat(result.avatarId) } title={ LocalizeText('friendlist.tip.im') } /> } - -
- ) - }) } -
-
} - } - { otherResults && - <> - { (otherResults.length === 0) && - { LocalizeText('friendlist.search.noothersfound') } } - { (otherResults.length > 0) && - - { LocalizeText('friendlist.search.otherscaption', [ 'cnt' ], [ otherResults.length.toString() ]) } -
- - { otherResults.map(result => - { - return ( - - - -
{ result.avatarName }
-
- - { canRequestFriend(result.avatarId) && - requestFriend(result.avatarId, result.avatarName) } title={ LocalizeText('friendlist.tip.addfriend') } /> } - -
- ) - }) } -
-
} - } -
-
- ); -} diff --git a/src/components/friends/views/friends-list/FriendsListView.tsx b/src/components/friends/views/friends-list/FriendsListView.tsx deleted file mode 100644 index 9561d0f..0000000 --- a/src/components/friends/views/friends-list/FriendsListView.tsx +++ /dev/null @@ -1,150 +0,0 @@ -import { AddLinkEventTracker, ILinkEventTracker, RemoveFriendComposer, RemoveLinkEventTracker, SendRoomInviteComposer } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { LocalizeText, MessengerFriend, SendMessageComposer } from '../../../../api'; -import { Button, Flex, NitroCardAccordionSetView, NitroCardAccordionView, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; -import { useFriends } from '../../../../hooks'; -import { FriendsRemoveConfirmationView } from './FriendsListRemoveConfirmationView'; -import { FriendsRoomInviteView } from './FriendsListRoomInviteView'; -import { FriendsSearchView } from './FriendsListSearchView'; -import { FriendsListGroupView } from './friends-list-group/FriendsListGroupView'; -import { FriendsListRequestView } from './friends-list-request/FriendsListRequestView'; - -export const FriendsListView: FC<{}> = props => -{ - const [ isVisible, setIsVisible ] = useState(false); - const [ selectedFriendsIds, setSelectedFriendsIds ] = useState([]); - const [ showRoomInvite, setShowRoomInvite ] = useState(false); - const [ showRemoveFriendsConfirmation, setShowRemoveFriendsConfirmation ] = useState(false); - const { onlineFriends = [], offlineFriends = [], requests = [], requestFriend = null } = useFriends(); - - const removeFriendsText = useMemo(() => - { - if(!selectedFriendsIds || !selectedFriendsIds.length) return ''; - - const userNames: string[] = []; - - for(const userId of selectedFriendsIds) - { - let existingFriend: MessengerFriend = onlineFriends.find(f => f.id === userId); - - if(!existingFriend) existingFriend = offlineFriends.find(f => f.id === userId); - - if(!existingFriend) continue; - - userNames.push(existingFriend.name); - } - - return LocalizeText('friendlist.removefriendconfirm.userlist', [ 'user_names' ], [ userNames.join(', ') ]); - }, [ offlineFriends, onlineFriends, selectedFriendsIds ]); - - const selectFriend = useCallback((userId: number) => - { - if(userId < 0) return; - - setSelectedFriendsIds(prevValue => - { - const newValue = [ ...prevValue ]; - - const existingUserIdIndex: number = newValue.indexOf(userId); - - if(existingUserIdIndex > -1) - { - newValue.splice(existingUserIdIndex, 1) - } - else - { - newValue.push(userId); - } - - return newValue; - }); - }, [ setSelectedFriendsIds ]); - - const sendRoomInvite = (message: string) => - { - if(!selectedFriendsIds.length || !message || !message.length || (message.length > 255)) return; - - SendMessageComposer(new SendRoomInviteComposer(message, selectedFriendsIds)); - - setShowRoomInvite(false); - } - - const removeSelectedFriends = () => - { - if(selectedFriendsIds.length === 0) return; - - setSelectedFriendsIds(prevValue => - { - SendMessageComposer(new RemoveFriendComposer(...prevValue)); - - return []; - }); - - setShowRemoveFriendsConfirmation(false); - } - - useEffect(() => - { - const linkTracker: ILinkEventTracker = { - linkReceived: (url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'show': - setIsVisible(true); - return; - case 'hide': - setIsVisible(false); - return; - case 'toggle': - setIsVisible(prevValue => !prevValue); - return; - case 'request': - if(parts.length < 4) return; - - requestFriend(parseInt(parts[2]), parts[3]); - } - }, - eventUrlPrefix: 'friends/' - }; - - AddLinkEventTracker(linkTracker); - - return () => RemoveLinkEventTracker(linkTracker); - }, [ requestFriend ]); - - if(!isVisible) return null; - - return ( - <> - - setIsVisible(false) } /> - - - - - - - - - - - - { selectedFriendsIds && selectedFriendsIds.length > 0 && - - - - } - - - { showRoomInvite && - setShowRoomInvite(false) } sendRoomInvite={ sendRoomInvite } /> } - { showRemoveFriendsConfirmation && - setShowRemoveFriendsConfirmation(false) } removeSelectedFriends={ removeSelectedFriends } /> } - - ); -}; diff --git a/src/components/friends/views/friends-list/friends-list-group/FriendsListGroupItemView.tsx b/src/components/friends/views/friends-list/friends-list-group/FriendsListGroupItemView.tsx deleted file mode 100644 index 03cd7e9..0000000 --- a/src/components/friends/views/friends-list/friends-list-group/FriendsListGroupItemView.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { FC, MouseEvent, useState } from 'react'; -import { LocalizeText, MessengerFriend, OpenMessengerChat } from '../../../../../api'; -import { Base, Flex, NitroCardAccordionItemView, UserProfileIconView } from '../../../../../common'; -import { useFriends } from '../../../../../hooks'; - -export const FriendsListGroupItemView: FC<{ friend: MessengerFriend, selected: boolean, selectFriend: (userId: number) => void }> = props => -{ - const { friend = null, selected = false, selectFriend = null } = props; - const [ isRelationshipOpen, setIsRelationshipOpen ] = useState(false); - const { followFriend = null, updateRelationship = null } = useFriends(); - - const clickFollowFriend = (event: MouseEvent) => - { - event.stopPropagation(); - - followFriend(friend); - } - - const openMessengerChat = (event: MouseEvent) => - { - event.stopPropagation(); - - OpenMessengerChat(friend.id); - } - - const openRelationship = (event: MouseEvent) => - { - event.stopPropagation(); - - setIsRelationshipOpen(true); - } - - const clickUpdateRelationship = (event: MouseEvent, type: number) => - { - event.stopPropagation(); - - updateRelationship(friend, type); - - setIsRelationshipOpen(false); - } - - const getCurrentRelationshipName = () => - { - if(!friend) return 'none'; - - switch(friend.relationshipStatus) - { - case MessengerFriend.RELATIONSHIP_HEART: return 'heart'; - case MessengerFriend.RELATIONSHIP_SMILE: return 'smile'; - case MessengerFriend.RELATIONSHIP_BOBBA: return 'bobba'; - default: return 'none'; - } - } - - if(!friend) return null; - - return ( - selectFriend(friend.id) }> - - event.stopPropagation() }> - - -
{ friend.name }
-
- - { !isRelationshipOpen && - <> - { friend.followingAllowed && - } - { friend.online && - } - { (friend.id > 0) && - } - } - { isRelationshipOpen && - <> - clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_HEART) } /> - clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_SMILE) } /> - clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_BOBBA) } /> - clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_NONE) } /> - } - -
- ); -} diff --git a/src/components/friends/views/friends-list/friends-list-group/FriendsListGroupView.tsx b/src/components/friends/views/friends-list/friends-list-group/FriendsListGroupView.tsx deleted file mode 100644 index c593003..0000000 --- a/src/components/friends/views/friends-list/friends-list-group/FriendsListGroupView.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { FC } from 'react'; -import { MessengerFriend } from '../../../../../api'; -import { FriendsListGroupItemView } from './FriendsListGroupItemView'; - -interface FriendsListGroupViewProps -{ - list: MessengerFriend[]; - selectedFriendsIds: number[]; - selectFriend: (userId: number) => void; -} - -export const FriendsListGroupView: FC = props => -{ - const { list = null, selectedFriendsIds = null, selectFriend = null } = props; - - if(!list || !list.length) return null; - - return ( - <> - { list.map((item, index) => = 0) } selectFriend={ selectFriend } />) } - - ); -} diff --git a/src/components/friends/views/friends-list/friends-list-request/FriendsListRequestItemView.tsx b/src/components/friends/views/friends-list/friends-list-request/FriendsListRequestItemView.tsx deleted file mode 100644 index de5d3a3..0000000 --- a/src/components/friends/views/friends-list/friends-list-request/FriendsListRequestItemView.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { FC } from 'react'; -import { MessengerRequest } from '../../../../../api'; -import { Base, Flex, NitroCardAccordionItemView, UserProfileIconView } from '../../../../../common'; -import { useFriends } from '../../../../../hooks'; - -export const FriendsListRequestItemView: FC<{ request: MessengerRequest }> = props => -{ - const { request = null } = props; - const { requestResponse = null } = useFriends(); - - if(!request) return null; - - return ( - - - -
{ request.name }
-
- - requestResponse(request.id, true) } /> - requestResponse(request.id, false) } /> - -
- ); -} diff --git a/src/components/friends/views/friends-list/friends-list-request/FriendsListRequestView.tsx b/src/components/friends/views/friends-list/friends-list-request/FriendsListRequestView.tsx deleted file mode 100644 index 5f6e991..0000000 --- a/src/components/friends/views/friends-list/friends-list-request/FriendsListRequestView.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { FC } from 'react'; -import { LocalizeText } from '../../../../../api'; -import { Button, Column, Flex, NitroCardAccordionSetView, NitroCardAccordionSetViewProps } from '../../../../../common'; -import { useFriends } from '../../../../../hooks'; -import { FriendsListRequestItemView } from './FriendsListRequestItemView'; - -export const FriendsListRequestView: FC = props => -{ - const { children = null, ...rest } = props; - const { requests = [], requestResponse = null } = useFriends(); - - if(!requests.length) return null; - - return ( - - - - { requests.map((request, index) => ) } - - - - - - { children } - - ); -} diff --git a/src/components/friends/views/messenger/FriendsMessengerView.tsx b/src/components/friends/views/messenger/FriendsMessengerView.tsx deleted file mode 100644 index 932e71d..0000000 --- a/src/components/friends/views/messenger/FriendsMessengerView.tsx +++ /dev/null @@ -1,177 +0,0 @@ -import { AddLinkEventTracker, FollowFriendMessageComposer, GetSessionDataManager, ILinkEventTracker, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; -import { FC, KeyboardEvent, useEffect, useRef, useState } from 'react'; -import { FaTimes } from 'react-icons/fa'; -import { GetUserProfile, LocalizeText, ReportType, SendMessageComposer } from '../../../../api'; -import { Base, Button, ButtonGroup, Column, Flex, Grid, LayoutAvatarImageView, LayoutBadgeImageView, LayoutGridItem, LayoutItemCountView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; -import { useHelp, useMessenger } from '../../../../hooks'; -import { FriendsMessengerThreadView } from './messenger-thread/FriendsMessengerThreadView'; - -export const FriendsMessengerView: FC<{}> = props => -{ - const [ isVisible, setIsVisible ] = useState(false); - const [ lastThreadId, setLastThreadId ] = useState(-1); - const [ messageText, setMessageText ] = useState(''); - const { visibleThreads = [], activeThread = null, getMessageThread = null, sendMessage = null, setActiveThreadId = null, closeThread = null } = useMessenger(); - const { report = null } = useHelp(); - const messagesBox = useRef(); - - const followFriend = () => (activeThread && activeThread.participant && SendMessageComposer(new FollowFriendMessageComposer(activeThread.participant.id))); - const openProfile = () => (activeThread && activeThread.participant && GetUserProfile(activeThread.participant.id)); - - const send = () => - { - if(!activeThread || !messageText.length) return; - - sendMessage(activeThread, GetSessionDataManager().userId, messageText); - - setMessageText(''); - } - - const onKeyDown = (event: KeyboardEvent) => - { - if(event.key !== 'Enter') return; - - send(); - } - - useEffect(() => - { - const linkTracker: ILinkEventTracker = { - linkReceived: (url: string) => - { - const parts = url.split('/'); - - if(parts.length === 2) - { - if(parts[1] === 'open') - { - setIsVisible(true); - - return; - } - - if(parts[1] === 'toggle') - { - setIsVisible(prevValue => !prevValue); - - return; - } - - const thread = getMessageThread(parseInt(parts[1])); - - if(!thread) return; - - setActiveThreadId(thread.threadId); - setIsVisible(true); - } - }, - eventUrlPrefix: 'friends-messenger/' - }; - - AddLinkEventTracker(linkTracker); - - return () => RemoveLinkEventTracker(linkTracker); - }, [ getMessageThread, setActiveThreadId ]); - - useEffect(() => - { - if(!isVisible || !activeThread) return; - - messagesBox.current.scrollTop = messagesBox.current.scrollHeight; - }, [ isVisible, activeThread ]); - - useEffect(() => - { - if(isVisible && !activeThread) - { - if(lastThreadId > 0) - { - setActiveThreadId(lastThreadId); - } - else - { - if(visibleThreads.length > 0) setActiveThreadId(visibleThreads[0].threadId); - } - - return; - } - - if(!isVisible && activeThread) - { - setLastThreadId(activeThread.threadId); - setActiveThreadId(-1); - } - }, [ isVisible, activeThread, lastThreadId, visibleThreads, setActiveThreadId ]); - - if(!isVisible) return null; - - return ( - - setIsVisible(false) } /> - - - - { LocalizeText('toolbar.icon.label.messenger') } - - - { visibleThreads && (visibleThreads.length > 0) && visibleThreads.map(thread => - { - return ( - setActiveThreadId(thread.threadId) }> - { thread.unread && - } - - - { (thread.participant.id > 0) && - } - { (thread.participant.id <= 0) && - } - - { thread.participant.name } - - - ); - }) } - - - - - { activeThread && - <> - { LocalizeText('messenger.window.separator', [ 'FRIEND_NAME' ], [ activeThread.participant.name ]) } - - - - - - - - - - - - - - - - - setMessageText(event.target.value) } onKeyDown={ onKeyDown } /> - - - } - - - - - ); -} diff --git a/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadGroup.tsx b/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadGroup.tsx deleted file mode 100644 index 4ed6c99..0000000 --- a/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadGroup.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import { GetSessionDataManager } from '@nitrots/nitro-renderer'; -import { FC, useMemo } from 'react'; -import { GetGroupChatData, LocalizeText, MessengerGroupType, MessengerThread, MessengerThreadChat, MessengerThreadChatGroup } from '../../../../../api'; -import { Base, Flex, LayoutAvatarImageView } from '../../../../../common'; - -export const FriendsMessengerThreadGroup: FC<{ thread: MessengerThread, group: MessengerThreadChatGroup }> = props => -{ - const { thread = null, group = null } = props; - - const groupChatData = useMemo(() => ((group.type === MessengerGroupType.GROUP_CHAT) && GetGroupChatData(group.chats[0].extraData)), [ group ]); - - const isOwnChat = useMemo(() => - { - if(!thread || !group) return false; - - if((group.type === MessengerGroupType.PRIVATE_CHAT) && (group.userId === GetSessionDataManager().userId)) return true; - - if(groupChatData && group.chats.length && (groupChatData.userId === GetSessionDataManager().userId)) return true; - - return false; - }, [ thread, group, groupChatData ]); - - if(!thread || !group) return null; - - if(!group.userId) - { - return ( - <> - { group.chats.map((chat, index) => - { - return ( - - - { (chat.type === MessengerThreadChat.SECURITY_NOTIFICATION) && - - - { chat.message } - } - { (chat.type === MessengerThreadChat.ROOM_INVITE) && - - - { (LocalizeText('messenger.invitation') + ' ') }{ chat.message } - } - - - ); - }) } - - ); - } - - return ( - - - { ((group.type === MessengerGroupType.PRIVATE_CHAT) && !isOwnChat) && - } - { (groupChatData && !isOwnChat) && - } - - - - { isOwnChat && GetSessionDataManager().userName } - { !isOwnChat && (groupChatData ? groupChatData.username : thread.participant.name) } - - { group.chats.map((chat, index) => { chat.message }) } - - { isOwnChat && - - - } - - ); -} diff --git a/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadView.tsx b/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadView.tsx deleted file mode 100644 index 962a668..0000000 --- a/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadView.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { FC } from 'react'; -import { MessengerThread } from '../../../../../api'; -import { FriendsMessengerThreadGroup } from './FriendsMessengerThreadGroup'; - -export const FriendsMessengerThreadView: FC<{ thread: MessengerThread }> = props => -{ - const { thread = null } = props; - - thread.setRead(); - - return ( - <> - { (thread.groups.length > 0) && thread.groups.map((group, index) => ) } - - ); -} diff --git a/src/components/game-center/GameCenterView.scss b/src/components/game-center/GameCenterView.scss deleted file mode 100644 index 246278d..0000000 --- a/src/components/game-center/GameCenterView.scss +++ /dev/null @@ -1,44 +0,0 @@ -.game-center-stage { - width: 100%; - height: calc(100% - 55px); - background-color: black; - position: absolute; - inset: 0; -} -.game-center-main { - width: 1280px; - height: calc(100% - 55px); - background: #93d4f3; - - .game-view { - background-position: bottom center; - background-repeat: no-repeat; - - > div { - color: inherit; - } - } - - .gameList-container { - min-height: 107px; - - .game-icon { - width: 83px; - height: 83px; - background-position: center; - background-repeat: no-repeat; - - &.selected { - position: relative; - &::after { - content: ''; - background-image: url('@/assets/images/gamecenter/selectedIcon.png'); - width: 83px; - height: 83px; - position: absolute; - inset: 0; - } - } - } - } -} diff --git a/src/components/game-center/GameCenterView.tsx b/src/components/game-center/GameCenterView.tsx deleted file mode 100644 index 885908e..0000000 --- a/src/components/game-center/GameCenterView.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { AddLinkEventTracker, ILinkEventTracker, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; -import { useEffect } from 'react'; -import { Flex } from '../../common'; -import { useGameCenter } from '../../hooks'; -import { GameListView } from './views/GameListView'; -import { GameStageView } from './views/GameStageView'; -import { GameView } from './views/GameView'; - -export const GameCenterView = () => -{ - const{ isVisible, setIsVisible, games, accountStatus } = useGameCenter(); - - useEffect(() => - { - const toggleGameCenter = () => - { - setIsVisible(prev => !prev); - } - - const linkTracker: ILinkEventTracker = { - linkReceived: (url: string) => - { - const value = url.split('/'); - - switch(value[1]) - { - case 'toggle': - toggleGameCenter(); - break; - } - }, - eventUrlPrefix: 'games/' - }; - - AddLinkEventTracker(linkTracker); - - return () => RemoveLinkEventTracker(linkTracker); - }, [ setIsVisible ]); - - if(!isVisible || !games || !accountStatus) return; - - return - - - - - - -} diff --git a/src/components/game-center/views/GameListView.tsx b/src/components/game-center/views/GameListView.tsx deleted file mode 100644 index 1211bc7..0000000 --- a/src/components/game-center/views/GameListView.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { GameConfigurationData } from '@nitrots/nitro-renderer'; -import { LocalizeText } from '../../../api'; -import { Base, Flex } from '../../../common'; -import { useGameCenter } from '../../../hooks'; - -export const GameListView = () => -{ - const { games,selectedGame, setSelectedGame } = useGameCenter(); - - const getClasses = (game: GameConfigurationData) => - { - let classes = [ 'game-icon' ]; - - if(selectedGame === game) classes.push('selected'); - - return classes.join(' '); - } - - const getIconImage = (game: GameConfigurationData): string => - { - return `url(${ game.assetUrl }${ game.gameNameId }_icon.png)` - } - - return - { LocalizeText('gamecenter.game_list_title') } - - { games && games.map((game,index) => - setSelectedGame(game) } style={ { backgroundImage: getIconImage(game) } }/> - ) } - - -} diff --git a/src/components/game-center/views/GameStageView.tsx b/src/components/game-center/views/GameStageView.tsx deleted file mode 100644 index 0a26fea..0000000 --- a/src/components/game-center/views/GameStageView.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { Game2ExitGameMessageComposer } from '@nitrots/nitro-renderer'; -import { useEffect, useRef, useState } from 'react'; -import { SendMessageComposer } from '../../../api'; -import { Base } from '../../../common'; -import { useGameCenter } from '../../../hooks'; - -export const GameStageView = () => -{ - const { gameURL,setGameURL } = useGameCenter(); - const [ loadTimes, setLoadTimes ] = useState(0); - const ref = useRef(); - - useEffect(()=> - { - if(!ref || ref && !ref.current) return; - - setLoadTimes(0); - - let frame: HTMLIFrameElement = document.createElement('iframe'); - - frame.src = gameURL; - frame.classList.add('game-center-stage'); - frame.classList.add('h-100'); - - frame.onload = () => - { - setLoadTimes(prev => prev += 1) - } - - ref.current.innerHTML = ''; - ref.current.appendChild(frame); - - },[ ref, gameURL ]); - - useEffect(()=> - { - if(loadTimes > 1) - { - setGameURL(null); - SendMessageComposer(new Game2ExitGameMessageComposer()); - } - },[ loadTimes,setGameURL ]) - - if(!gameURL) return null; - - return -} diff --git a/src/components/game-center/views/GameView.tsx b/src/components/game-center/views/GameView.tsx deleted file mode 100644 index a9d641f..0000000 --- a/src/components/game-center/views/GameView.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { Game2GetAccountGameStatusMessageComposer, GetGameStatusMessageComposer, JoinQueueMessageComposer } from '@nitrots/nitro-renderer'; -import { useEffect } from 'react'; -import { ColorUtils, LocalizeText, SendMessageComposer } from '../../../api'; -import { Base, Button, Flex, LayoutItemCountView, Text } from '../../../common'; -import { useGameCenter } from '../../../hooks'; - -export const GameView = () => -{ - const { selectedGame, accountStatus } = useGameCenter(); - - useEffect(()=> - { - if(selectedGame) - { - SendMessageComposer(new GetGameStatusMessageComposer(selectedGame.gameId)); - SendMessageComposer(new Game2GetAccountGameStatusMessageComposer(selectedGame.gameId)); - } - },[ selectedGame ]) - - const getBgColour = (): string => - { - return ColorUtils.uintHexColor(selectedGame.bgColor) - } - - const getBgImage = (): string => - { - return `url(${ selectedGame.assetUrl }${ selectedGame.gameNameId }_theme.png)` - } - - const getColor = () => - { - return ColorUtils.uintHexColor(selectedGame.textColor); - } - - const onPlay = () => - { - SendMessageComposer(new JoinQueueMessageComposer(selectedGame.gameId)); - } - - return - - { LocalizeText(`gamecenter.${ selectedGame.gameNameId }.description_title`) } - - { (accountStatus.hasUnlimitedGames || accountStatus.freeGamesLeft > 0) && <> - - } - { LocalizeText(`gamecenter.${ selectedGame.gameNameId }.description_content`) } - - - - - - -} diff --git a/src/components/groups/GroupView.scss b/src/components/groups/GroupView.scss deleted file mode 100644 index 8882b93..0000000 --- a/src/components/groups/GroupView.scss +++ /dev/null @@ -1,190 +0,0 @@ -.nitro-group-tab-image { - width: 122px; - height: 68px; - background: url('@/assets/images/groups/creator_images.png') no-repeat; - - &.tab-1 { - background-position: 0px 0px; - width: 99px; - height: 50px; - } - - &.tab-2 { - background-position: -99px 0px; - width: 98px; - height: 62px; - } - - &.tab-3 { - background-position: 0px -50px; - width: 96px; - height: 45px; - } - - &.tab-4, - &.tab-5 { - background-position: 0px -95px; - width: 114px; - height: 61px; - } -} - -.group-information { - width: 100%; - height: 100%; - display: flex; - - .group-badge { - width: 78px; - height: 78px; - - .badge-image { - background-size: contain; - } - } - - .group-description { - height: 55px; - } -} - -.nitro-group-information-standalone { - width: 500px; -} - -.nitro-group-members { - width: 400px; - max-height: 380px; - - .nitro-group-members-list-grid { - - .member-list-item { - height: 50px; - max-height: 50px; - - .avatar-head { - position: relative; - overflow: hidden; - width: 40px; - height: 50px; - - .avatar-image { - position: absolute; - left: -25px; - top: -20px; - } - } - } - } -} - -.group-badge-preview { - width: 42px; - height: 42px; - background-color: $grid-bg-color; - - &.active { - border-color: $grid-active-border-color !important; - background-color: $grid-active-bg-color; - - &:before { - position: absolute; - content: ' '; - width: 0; - height: 0; - border-top: 10px solid white; - border-left: 10px solid transparent; - border-right: 10px solid transparent; - bottom: -10px; - } - } -} - -.group-badge-color-swatch, -.group-badge-position-swatch { - position: relative; - border-radius: $border-radius; - width: 16px; - height: 16px; - background: $white; - border: 2px solid $white; - box-shadow: inset 3px 3px rgba(0, 0, 0, .1); - - &.active { - box-shadow: none; - } -} - -.group-badge-position-swatch { - box-shadow: inset 3px 3px rgba(0, 0, 0, .1); - - &.active { - background: $primary; - } -} - -.group-badge-color-swatch { - box-shadow: inset 2px 2px rgba(0, 0, 0, .2); -} - -.group-color-swatch { - width: 30px; - height: 40px; -} - -.nitro-group-manager { - height: $nitro-group-manager-height; - width: $nitro-group-manager-width; -} - -.nitro-group-creator { - height: $nitro-group-manager-height; - width: $nitro-group-manager-width; - - .creator-tabs { - - .tab { - position: relative; - margin-left: -6px; - background-image: url('@/assets/images/groups/creator_tabs.png'); - background-repeat: no-repeat; - - &:first-child { - margin-left: 0; - } - - &.tab-blue-flat { - width: 84px; - height: 24px; - background-position: 0px 0px; - - &.active { - height: 28px; - background-position: 0px -24px; - } - } - - &.tab-blue-arrow { - width: 83px; - height: 24px; - background-position: 0px -52px; - - &.active { - height: 28px; - background-position: 0px -76px; - } - } - - &.tab-yellow { - width: 133px; - height: 28px; - background-position: 0px -104px; - - &.active { - height: 33px; - background-position: 0px -132px; - } - } - } - } -} diff --git a/src/components/groups/GroupsView.tsx b/src/components/groups/GroupsView.tsx deleted file mode 100644 index a8a000b..0000000 --- a/src/components/groups/GroupsView.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { AddLinkEventTracker, GroupPurchasedEvent, GroupSettingsComposer, ILinkEventTracker, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { SendMessageComposer, TryVisitRoom } from '../../api'; -import { useGroup, useMessageEvent } from '../../hooks'; -import { GroupCreatorView } from './views/GroupCreatorView'; -import { GroupInformationStandaloneView } from './views/GroupInformationStandaloneView'; -import { GroupManagerView } from './views/GroupManagerView'; -import { GroupMembersView } from './views/GroupMembersView'; - -export const GroupsView: FC<{}> = props => -{ - const [ isCreatorVisible, setCreatorVisible ] = useState(false); - const {} = useGroup(); - - useMessageEvent(GroupPurchasedEvent, event => - { - const parser = event.getParser(); - - setCreatorVisible(false); - TryVisitRoom(parser.roomId); - }); - - useEffect(() => - { - const linkTracker: ILinkEventTracker = { - linkReceived: (url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'create': - setCreatorVisible(true); - return; - case 'manage': - if(!parts[2]) return; - - setCreatorVisible(false); - SendMessageComposer(new GroupSettingsComposer(Number(parts[2]))); - return; - } - }, - eventUrlPrefix: 'groups/' - }; - - AddLinkEventTracker(linkTracker); - - return () => RemoveLinkEventTracker(linkTracker); - }, []); - - return ( - <> - { isCreatorVisible && - setCreatorVisible(false) } /> } - { !isCreatorVisible && - } - - - - ); -}; diff --git a/src/components/groups/views/GroupBadgeCreatorView.tsx b/src/components/groups/views/GroupBadgeCreatorView.tsx deleted file mode 100644 index 8e32c92..0000000 --- a/src/components/groups/views/GroupBadgeCreatorView.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import { Dispatch, FC, SetStateAction, useState } from 'react'; -import { FaPlus, FaTimes } from 'react-icons/fa'; -import { GroupBadgePart } from '../../../api'; -import { Base, Column, Flex, Grid, LayoutBadgeImageView } from '../../../common'; -import { useGroup } from '../../../hooks'; - -interface GroupBadgeCreatorViewProps -{ - badgeParts: GroupBadgePart[]; - setBadgeParts: Dispatch>; -} - -const POSITIONS: number[] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]; - -export const GroupBadgeCreatorView: FC = props => -{ - const { badgeParts = [], setBadgeParts = null } = props; - const [ selectedIndex, setSelectedIndex ] = useState(-1); - const { groupCustomize = null } = useGroup(); - - const setPartProperty = (partIndex: number, property: string, value: number) => - { - const newBadgeParts = [ ...badgeParts ]; - - newBadgeParts[partIndex][property] = value; - - setBadgeParts(newBadgeParts); - - if(property === 'key') setSelectedIndex(-1); - } - - if(!badgeParts || !badgeParts.length) return null; - - return ( - <> - { ((selectedIndex < 0) && badgeParts && (badgeParts.length > 0)) && badgeParts.map((part, index) => - { - return ( - - setSelectedIndex(index) }> - { (badgeParts[index].code && (badgeParts[index].code.length > 0)) && - } - { (!badgeParts[index].code || !badgeParts[index].code.length) && - - - } - - { (part.type !== GroupBadgePart.BASE) && - - { POSITIONS.map((position, posIndex) => - { - return setPartProperty(index, 'position', position) }> - }) } - } - - { (groupCustomize.badgePartColors.length > 0) && groupCustomize.badgePartColors.map((item, colorIndex) => - { - return setPartProperty(index, 'color', (colorIndex + 1)) }> - }) } - - - ); - }) } - { (selectedIndex >= 0) && - - { (badgeParts[selectedIndex].type === GroupBadgePart.SYMBOL) && - setPartProperty(selectedIndex, 'key', 0) }> - - - - } - { ((badgeParts[selectedIndex].type === GroupBadgePart.BASE) ? groupCustomize.badgeBases : groupCustomize.badgeSymbols).map((item, index) => - { - return ( - setPartProperty(selectedIndex, 'key', item.id) }> - - - ); - }) } - } - - ); -} diff --git a/src/components/groups/views/GroupCreatorView.tsx b/src/components/groups/views/GroupCreatorView.tsx deleted file mode 100644 index cd64ef3..0000000 --- a/src/components/groups/views/GroupCreatorView.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import { GroupBuyComposer, GroupBuyDataComposer, GroupBuyDataEvent } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { HasHabboClub, IGroupData, LocalizeText, SendMessageComposer } from '../../../api'; -import { Base, Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; -import { useMessageEvent } from '../../../hooks'; -import { GroupTabBadgeView } from './tabs/GroupTabBadgeView'; -import { GroupTabColorsView } from './tabs/GroupTabColorsView'; -import { GroupTabCreatorConfirmationView } from './tabs/GroupTabCreatorConfirmationView'; -import { GroupTabIdentityView } from './tabs/GroupTabIdentityView'; - -interface GroupCreatorViewProps -{ - onClose: () => void; -} - -const TABS: number[] = [ 1, 2, 3, 4 ]; - -export const GroupCreatorView: FC = props => -{ - const { onClose = null } = props; - const [ currentTab, setCurrentTab ] = useState(1); - const [ closeAction, setCloseAction ] = useState<{ action: () => boolean }>(null); - const [ groupData, setGroupData ] = useState(null); - const [ availableRooms, setAvailableRooms ] = useState<{ id: number, name: string }[]>(null); - const [ purchaseCost, setPurchaseCost ] = useState(0); - - const onCloseClose = () => - { - setCloseAction(null); - setGroupData(null); - - if(onClose) onClose(); - } - - const buyGroup = () => - { - if(!groupData) return; - - const badge = []; - - groupData.groupBadgeParts.forEach(part => - { - if(part.code) - { - badge.push(part.key); - badge.push(part.color); - badge.push(part.position); - } - }); - - SendMessageComposer(new GroupBuyComposer(groupData.groupName, groupData.groupDescription, groupData.groupHomeroomId, groupData.groupColors[0], groupData.groupColors[1], badge)); - } - - const previousStep = () => - { - if(closeAction && closeAction.action) - { - if(!closeAction.action()) return; - } - - if(currentTab === 1) - { - onClose(); - - return; - } - - setCurrentTab(value => value - 1); - } - - const nextStep = () => - { - if(closeAction && closeAction.action) - { - if(!closeAction.action()) return; - } - - if(currentTab === 4) - { - buyGroup(); - - return; - } - - setCurrentTab(value => (value === 4 ? value : value + 1)); - } - - useMessageEvent(GroupBuyDataEvent, event => - { - const parser = event.getParser(); - - const rooms: { id: number, name: string }[] = []; - - parser.availableRooms.forEach((name, id) => rooms.push({ id, name })); - - setAvailableRooms(rooms); - setPurchaseCost(parser.groupCost); - }); - - useEffect(() => - { - setCurrentTab(1); - - setGroupData({ - groupId: -1, - groupName: null, - groupDescription: null, - groupHomeroomId: -1, - groupState: 1, - groupCanMembersDecorate: true, - groupColors: null, - groupBadgeParts: null - }); - - SendMessageComposer(new GroupBuyDataComposer()); - }, [ setGroupData ]); - - if(!groupData) return null; - - return ( - - - - - { TABS.map((tab, index) => - { - return ( - - { LocalizeText(`group.create.steplabel.${ tab }`) } - - ); - }) } - - - - - - { LocalizeText(`group.create.stepcaption.${ currentTab }`) } - { LocalizeText(`group.create.stepdesc.${ currentTab }`) } - - - - { (currentTab === 1) && - } - { (currentTab === 2) && - } - { (currentTab === 3) && - } - { (currentTab === 4) && - } - - - - - - - - - ); -}; diff --git a/src/components/groups/views/GroupInformationStandaloneView.tsx b/src/components/groups/views/GroupInformationStandaloneView.tsx deleted file mode 100644 index d4206d7..0000000 --- a/src/components/groups/views/GroupInformationStandaloneView.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { GroupInformationEvent, GroupInformationParser } from '@nitrots/nitro-renderer'; -import { FC, useState } from 'react'; -import { LocalizeText } from '../../../api'; -import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../common'; -import { useMessageEvent } from '../../../hooks'; -import { GroupInformationView } from './GroupInformationView'; - -export const GroupInformationStandaloneView: FC<{}> = props => -{ - const [ groupInformation, setGroupInformation ] = useState(null); - - useMessageEvent(GroupInformationEvent, event => - { - const parser = event.getParser(); - - if((groupInformation && (groupInformation.id === parser.id)) || parser.flag) setGroupInformation(parser); - }); - - if(!groupInformation) return null; - - return ( - - setGroupInformation(null) } /> - - setGroupInformation(null) } /> - - - ); -}; diff --git a/src/components/groups/views/GroupInformationView.tsx b/src/components/groups/views/GroupInformationView.tsx deleted file mode 100644 index a13408b..0000000 --- a/src/components/groups/views/GroupInformationView.tsx +++ /dev/null @@ -1,146 +0,0 @@ -import { CreateLinkEvent, GetSessionDataManager, GroupInformationParser, GroupRemoveMemberComposer } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { CatalogPageName, GetGroupManager, GetGroupMembers, GroupMembershipType, GroupType, LocalizeText, SendMessageComposer, TryJoinGroup, TryVisitRoom } from '../../../api'; -import { Button, Column, Flex, Grid, GridProps, LayoutBadgeImageView, Text } from '../../../common'; -import { useNotification } from '../../../hooks'; - -const STATES: string[] = [ 'regular', 'exclusive', 'private' ]; - -interface GroupInformationViewProps extends GridProps -{ - groupInformation: GroupInformationParser; - onJoin?: () => void; - onClose?: () => void; -} - -export const GroupInformationView: FC = props => -{ - const { groupInformation = null, onClose = null, overflow = 'hidden', ...rest } = props; - const { showConfirm = null } = useNotification(); - - const isRealOwner = (groupInformation && (groupInformation.ownerName === GetSessionDataManager().userName)); - - const joinGroup = () => (groupInformation && TryJoinGroup(groupInformation.id)); - - const leaveGroup = () => - { - showConfirm(LocalizeText('group.leaveconfirm.desc'), () => - { - SendMessageComposer(new GroupRemoveMemberComposer(groupInformation.id, GetSessionDataManager().userId)); - - if(onClose) onClose(); - }, null); - } - - const getRoleIcon = () => - { - if(groupInformation.membershipType === GroupMembershipType.NOT_MEMBER || groupInformation.membershipType === GroupMembershipType.REQUEST_PENDING) return null; - - if(isRealOwner) return ; - - if(groupInformation.isAdmin) return ; - - return ; - } - - const getButtonText = () => - { - if(isRealOwner) return 'group.youareowner'; - - if(groupInformation.type === GroupType.PRIVATE && groupInformation.membershipType !== GroupMembershipType.MEMBER) return ''; - - if(groupInformation.membershipType === GroupMembershipType.MEMBER) return 'group.leave'; - - if((groupInformation.membershipType === GroupMembershipType.NOT_MEMBER) && groupInformation.type === GroupType.REGULAR) return 'group.join'; - - if(groupInformation.membershipType === GroupMembershipType.REQUEST_PENDING) return 'group.membershippending'; - - if((groupInformation.membershipType === GroupMembershipType.NOT_MEMBER) && groupInformation.type === GroupType.EXCLUSIVE) return 'group.requestmembership'; - } - - const handleButtonClick = () => - { - if((groupInformation.type === GroupType.PRIVATE) && (groupInformation.membershipType === GroupMembershipType.NOT_MEMBER)) return; - - if(groupInformation.membershipType === GroupMembershipType.MEMBER) - { - leaveGroup(); - - return; - } - - joinGroup(); - } - - const handleAction = (action: string) => - { - switch(action) - { - case 'members': - GetGroupMembers(groupInformation.id); - break; - case 'members_pending': - GetGroupMembers(groupInformation.id, 2); - break; - case 'manage': - GetGroupManager(groupInformation.id); - break; - case 'homeroom': - TryVisitRoom(groupInformation.roomId); - break; - case 'furniture': - CreateLinkEvent('catalog/open/' + CatalogPageName.GUILD_CUSTOM_FURNI); - break; - case 'popular_groups': - CreateLinkEvent('navigator/search/groups'); - break; - } - } - - if(!groupInformation) return null; - - return ( - - - - - - - handleAction('members') }>{ LocalizeText('group.membercount', [ 'totalMembers' ], [ groupInformation.membersCount.toString() ]) } - { (groupInformation.pendingRequestsCount > 0) && - handleAction('members_pending') }>{ LocalizeText('group.pendingmembercount', [ 'amount' ], [ groupInformation.pendingRequestsCount.toString() ]) } } - { groupInformation.isOwner && - handleAction('manage') }>{ LocalizeText('group.manage') } } - - { getRoleIcon() } - - - - - - { groupInformation.title } - - - { groupInformation.canMembersDecorate && - } - - - { LocalizeText('group.created', [ 'date', 'owner' ], [ groupInformation.createdAt, groupInformation.ownerName ]) } - - { groupInformation.description } - - - - handleAction('homeroom') }>{ LocalizeText('group.linktobase') } - handleAction('furniture') }>{ LocalizeText('group.buyfurni') } - handleAction('popular_groups') }>{ LocalizeText('group.showgroups') } - - { (groupInformation.type !== GroupType.PRIVATE || groupInformation.type === GroupType.PRIVATE && groupInformation.membershipType === GroupMembershipType.MEMBER) && - } - - - - ); -}; diff --git a/src/components/groups/views/GroupManagerView.tsx b/src/components/groups/views/GroupManagerView.tsx deleted file mode 100644 index 9e1d625..0000000 --- a/src/components/groups/views/GroupManagerView.tsx +++ /dev/null @@ -1,119 +0,0 @@ -import { GroupBadgePart, GroupInformationEvent, GroupSettingsEvent } from '@nitrots/nitro-renderer'; -import { FC, useState } from 'react'; -import { IGroupData, LocalizeText } from '../../../api'; -import { Base, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView, Text } from '../../../common'; -import { useMessageEvent } from '../../../hooks'; -import { GroupTabBadgeView } from './tabs/GroupTabBadgeView'; -import { GroupTabColorsView } from './tabs/GroupTabColorsView'; -import { GroupTabIdentityView } from './tabs/GroupTabIdentityView'; -import { GroupTabSettingsView } from './tabs/GroupTabSettingsView'; - -const TABS: number[] = [ 1, 2, 3, 5 ]; - -export const GroupManagerView: FC<{}> = props => -{ - const [ currentTab, setCurrentTab ] = useState(1); - const [ closeAction, setCloseAction ] = useState<{ action: () => boolean }>(null); - const [ groupData, setGroupData ] = useState(null); - - const onClose = () => - { - setCloseAction(prevValue => - { - if(prevValue && prevValue.action) prevValue.action(); - - return null; - }); - - setGroupData(null); - } - - const changeTab = (tab: number) => - { - if(closeAction && closeAction.action) closeAction.action(); - - setCurrentTab(tab); - } - - useMessageEvent(GroupInformationEvent, event => - { - const parser = event.getParser(); - - if(!groupData || (groupData.groupId !== parser.id)) return; - - setGroupData(prevValue => - { - const newValue = { ...prevValue }; - - newValue.groupName = parser.title; - newValue.groupDescription = parser.description; - newValue.groupState = parser.type; - newValue.groupCanMembersDecorate = parser.canMembersDecorate; - - return newValue; - }); - }); - - useMessageEvent(GroupSettingsEvent, event => - { - const parser = event.getParser(); - - const groupBadgeParts: GroupBadgePart[] = []; - - parser.badgeParts.forEach((part, id) => - { - groupBadgeParts.push(new GroupBadgePart( - part.isBase ? GroupBadgePart.BASE : GroupBadgePart.SYMBOL, - part.key, - part.color, - part.position - )); - }); - - setGroupData({ - groupId: parser.id, - groupName: parser.title, - groupDescription: parser.description, - groupHomeroomId: parser.roomId, - groupState: parser.state, - groupCanMembersDecorate: parser.canMembersDecorate, - groupColors: [ parser.colorA, parser.colorB ], - groupBadgeParts - }); - }); - - if(!groupData || (groupData.groupId <= 0)) return null; - - return ( - - - - { TABS.map(tab => - { - return ( changeTab(tab) }> - { LocalizeText(`group.edit.tab.${ tab }`) } - ); - }) } - - - - - - { LocalizeText(`group.edit.tabcaption.${ currentTab }`) } - { LocalizeText(`group.edit.tabdesc.${ currentTab }`) } - - - - { (currentTab === 1) && - } - { (currentTab === 2) && - } - { (currentTab === 3) && - } - { (currentTab === 5) && - } - - - - ); -}; diff --git a/src/components/groups/views/GroupMembersView.tsx b/src/components/groups/views/GroupMembersView.tsx deleted file mode 100644 index 5cf1be8..0000000 --- a/src/components/groups/views/GroupMembersView.tsx +++ /dev/null @@ -1,210 +0,0 @@ -import { AddLinkEventTracker, GetSessionDataManager, GroupAdminGiveComposer, GroupAdminTakeComposer, GroupConfirmMemberRemoveEvent, GroupConfirmRemoveMemberComposer, GroupMemberParser, GroupMembersComposer, GroupMembersEvent, GroupMembershipAcceptComposer, GroupMembershipDeclineComposer, GroupMembersParser, GroupRank, GroupRemoveMemberComposer, ILinkEventTracker, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; -import { FaChevronLeft, FaChevronRight } from 'react-icons/fa'; -import { GetUserProfile, LocalizeText, SendMessageComposer } from '../../../api'; -import { Base, Button, Column, Flex, Grid, LayoutAvatarImageView, LayoutBadgeImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; -import { useMessageEvent, useNotification } from '../../../hooks'; - -export const GroupMembersView: FC<{}> = props => -{ - const [ groupId, setGroupId ] = useState(-1); - const [ levelId, setLevelId ] = useState(-1); - const [ membersData, setMembersData ] = useState(null); - const [ pageId, setPageId ] = useState(-1); - const [ totalPages, setTotalPages ] = useState(0); - const [ searchQuery, setSearchQuery ] = useState(''); - const [ removingMemberName, setRemovingMemberName ] = useState(null); - const { showConfirm = null } = useNotification(); - - const getRankDescription = (member: GroupMemberParser) => - { - if(member.rank === GroupRank.OWNER) return 'group.members.owner'; - - if(membersData.admin) - { - if(member.rank === GroupRank.ADMIN) return 'group.members.removerights'; - - if(member.rank === GroupRank.MEMBER) return 'group.members.giverights'; - } - - return ''; - } - - const refreshMembers = useCallback(() => - { - if((groupId === -1) || (levelId === -1) || (pageId === -1)) return; - - SendMessageComposer(new GroupMembersComposer(groupId, pageId, searchQuery, levelId)); - }, [ groupId, levelId, pageId, searchQuery ]); - - const toggleAdmin = (member: GroupMemberParser) => - { - if(!membersData.admin || (member.rank === GroupRank.OWNER)) return; - - if(member.rank !== GroupRank.ADMIN) SendMessageComposer(new GroupAdminGiveComposer(membersData.groupId, member.id)); - else SendMessageComposer(new GroupAdminTakeComposer(membersData.groupId, member.id)); - - refreshMembers(); - } - - const acceptMembership = (member: GroupMemberParser) => - { - if(!membersData.admin || (member.rank !== GroupRank.REQUESTED)) return; - - SendMessageComposer(new GroupMembershipAcceptComposer(membersData.groupId, member.id)); - - refreshMembers(); - } - - const removeMemberOrDeclineMembership = (member: GroupMemberParser) => - { - if(!membersData.admin) return; - - if(member.rank === GroupRank.REQUESTED) - { - SendMessageComposer(new GroupMembershipDeclineComposer(membersData.groupId, member.id)); - - refreshMembers(); - - return; - } - - setRemovingMemberName(member.name); - SendMessageComposer(new GroupConfirmRemoveMemberComposer(membersData.groupId, member.id)); - } - - useMessageEvent(GroupMembersEvent, event => - { - const parser = event.getParser(); - - setMembersData(parser); - setLevelId(parser.level); - setTotalPages(Math.ceil(parser.totalMembersCount / parser.pageSize)); - }); - - useMessageEvent(GroupConfirmMemberRemoveEvent, event => - { - const parser = event.getParser(); - - showConfirm(LocalizeText(((parser.furnitureCount > 0) ? 'group.kickconfirm.desc' : 'group.kickconfirm_nofurni.desc'), [ 'user', 'amount' ], [ removingMemberName, parser.furnitureCount.toString() ]), () => - { - SendMessageComposer(new GroupRemoveMemberComposer(membersData.groupId, parser.userId)); - - refreshMembers(); - }, null); - - setRemovingMemberName(null); - }); - - useEffect(() => - { - const linkTracker: ILinkEventTracker = { - linkReceived: (url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - const groupId = (parseInt(parts[1]) || -1); - const levelId = (parseInt(parts[2]) || 3); - - setGroupId(groupId); - setLevelId(levelId); - setPageId(0); - }, - eventUrlPrefix: 'group-members/' - }; - - AddLinkEventTracker(linkTracker); - - return () => RemoveLinkEventTracker(linkTracker); - }, []); - - useEffect(() => - { - setPageId(0); - }, [ groupId, levelId, searchQuery ]); - - useEffect(() => - { - if((groupId === -1) || (levelId === -1) || (pageId === -1)) return; - - SendMessageComposer(new GroupMembersComposer(groupId, pageId, searchQuery, levelId)); - }, [ groupId, levelId, pageId, searchQuery ]); - - useEffect(() => - { - if(groupId === -1) return; - - setLevelId(-1); - setMembersData(null); - setTotalPages(0); - setSearchQuery(''); - setRemovingMemberName(null); - }, [ groupId ]); - - if((groupId === -1) || !membersData) return null; - - return ( - - setGroupId(-1) } /> - - - - - - - setSearchQuery(event.target.value) } /> - - - - - { membersData.result.map((member, index) => - { - return ( - -
GetUserProfile(member.id) }> - -
- - GetUserProfile(member.id) }>{ member.name } - { (member.rank !== GroupRank.REQUESTED) && - { LocalizeText('group.members.since', [ 'date' ], [ member.joinedAt ]) } } - - - { (member.rank !== GroupRank.REQUESTED) && - - toggleAdmin(member) } /> - } - { membersData.admin && (member.rank === GroupRank.REQUESTED) && - - acceptMembership(member) }> - } - { membersData.admin && (member.rank !== GroupRank.OWNER) && (member.id !== GetSessionDataManager().userId) && - - removeMemberOrDeclineMembership(member) }> - } - -
- ); - }) } -
- - - - { LocalizeText('group.members.pageinfo', [ 'amount', 'page', 'totalPages' ], [ membersData.totalMembersCount.toString(), (membersData.pageIndex + 1).toString(), totalPages.toString() ]) } - - - -
-
- ); -}; diff --git a/src/components/groups/views/GroupRoomInformationView.tsx b/src/components/groups/views/GroupRoomInformationView.tsx deleted file mode 100644 index c8c8d99..0000000 --- a/src/components/groups/views/GroupRoomInformationView.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import { DesktopViewEvent, GetGuestRoomResultEvent, GetSessionDataManager, GroupInformationComposer, GroupInformationEvent, GroupInformationParser, GroupRemoveMemberComposer, HabboGroupDeactivatedMessageEvent, RoomEntryInfoMessageEvent } from '@nitrots/nitro-renderer'; -import { FC, useState } from 'react'; -import { FaChevronDown, FaChevronUp } from 'react-icons/fa'; -import { GetGroupInformation, GetGroupManager, GroupMembershipType, GroupType, LocalizeText, SendMessageComposer, TryJoinGroup } from '../../../api'; -import { Base, Button, Column, Flex, LayoutBadgeImageView, Text } from '../../../common'; -import { useMessageEvent, useNotification } from '../../../hooks'; - -export const GroupRoomInformationView: FC<{}> = props => -{ - const [ expectedGroupId, setExpectedGroupId ] = useState(0); - const [ groupInformation, setGroupInformation ] = useState(null); - const [ isOpen, setIsOpen ] = useState(true); - const { showConfirm = null } = useNotification(); - - useMessageEvent(DesktopViewEvent, event => - { - setExpectedGroupId(0); - setGroupInformation(null); - }); - - useMessageEvent(RoomEntryInfoMessageEvent, event => - { - setExpectedGroupId(0); - setGroupInformation(null); - }); - - useMessageEvent(GetGuestRoomResultEvent, event => - { - const parser = event.getParser(); - - if(!parser.roomEnter) return; - - if(parser.data.habboGroupId > 0) - { - setExpectedGroupId(parser.data.habboGroupId); - SendMessageComposer(new GroupInformationComposer(parser.data.habboGroupId, false)); - } - else - { - setExpectedGroupId(0); - setGroupInformation(null); - } - }); - - useMessageEvent(HabboGroupDeactivatedMessageEvent, event => - { - const parser = event.getParser(); - - if(!groupInformation || ((parser.groupId !== groupInformation.id) && (parser.groupId !== expectedGroupId))) return; - - setExpectedGroupId(0); - setGroupInformation(null); - }); - - useMessageEvent(GroupInformationEvent, event => - { - const parser = event.getParser(); - - if(parser.id !== expectedGroupId) return; - - setGroupInformation(parser); - }); - - const leaveGroup = () => - { - showConfirm(LocalizeText('group.leaveconfirm.desc'), () => - { - SendMessageComposer(new GroupRemoveMemberComposer(groupInformation.id, GetSessionDataManager().userId)); - }, null); - } - - const isRealOwner = (groupInformation && (groupInformation.ownerName === GetSessionDataManager().userName)); - - const getButtonText = () => - { - if(isRealOwner) return 'group.manage'; - - if(groupInformation.type === GroupType.PRIVATE) return ''; - - if(groupInformation.membershipType === GroupMembershipType.MEMBER) return 'group.leave'; - - if((groupInformation.membershipType === GroupMembershipType.NOT_MEMBER) && groupInformation.type === GroupType.REGULAR) return 'group.join'; - - if(groupInformation.membershipType === GroupMembershipType.REQUEST_PENDING) return 'group.membershippending'; - - if((groupInformation.membershipType === GroupMembershipType.NOT_MEMBER) && groupInformation.type === GroupType.EXCLUSIVE) return 'group.requestmembership'; - } - - const handleButtonClick = () => - { - if(isRealOwner) return GetGroupManager(groupInformation.id); - - if((groupInformation.type === GroupType.PRIVATE) && (groupInformation.membershipType === GroupMembershipType.NOT_MEMBER)) return; - - if(groupInformation.membershipType === GroupMembershipType.MEMBER) - { - leaveGroup(); - - return; - } - - TryJoinGroup(groupInformation.id); - } - - if(!groupInformation) return null; - - return ( - - - setIsOpen(value => !value) }> - { LocalizeText('group.homeroominfo.title') } - { isOpen && } - { !isOpen && } - - { isOpen && - <> - GetGroupInformation(groupInformation.id) }> - - - - { groupInformation.title } - - { (groupInformation.type !== GroupType.PRIVATE || isRealOwner) && - - } - } - - - ); -}; diff --git a/src/components/groups/views/tabs/GroupTabBadgeView.tsx b/src/components/groups/views/tabs/GroupTabBadgeView.tsx deleted file mode 100644 index 73d65c0..0000000 --- a/src/components/groups/views/tabs/GroupTabBadgeView.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import { GroupSaveBadgeComposer } from '@nitrots/nitro-renderer'; -import { Dispatch, FC, SetStateAction, useCallback, useEffect, useState } from 'react'; -import { GroupBadgePart, IGroupData, SendMessageComposer } from '../../../../api'; -import { Column, Flex, Grid, LayoutBadgeImageView } from '../../../../common'; -import { useGroup } from '../../../../hooks'; -import { GroupBadgeCreatorView } from '../GroupBadgeCreatorView'; - -interface GroupTabBadgeViewProps -{ - skipDefault?: boolean; - setCloseAction: Dispatch boolean }>>; - groupData: IGroupData; - setGroupData: Dispatch>; -} - -export const GroupTabBadgeView: FC = props => -{ - const { groupData = null, setGroupData = null, setCloseAction = null, skipDefault = null } = props; - const [ badgeParts, setBadgeParts ] = useState(null); - const { groupCustomize = null } = useGroup(); - - const getModifiedBadgeCode = () => - { - if(!badgeParts || !badgeParts.length) return ''; - - let badgeCode = ''; - - badgeParts.forEach(part => (part.code && (badgeCode += part.code))); - - return badgeCode; - } - - const saveBadge = useCallback(() => - { - if(!groupData || !badgeParts || !badgeParts.length) return false; - - if((groupData.groupBadgeParts === badgeParts)) return true; - - if(groupData.groupId <= 0) - { - setGroupData(prevValue => - { - const newValue = { ...prevValue }; - - newValue.groupBadgeParts = badgeParts; - - return newValue; - }); - - return true; - } - - const badge = []; - - badgeParts.forEach(part => - { - if(!part.code) return; - - badge.push(part.key); - badge.push(part.color); - badge.push(part.position); - }); - - SendMessageComposer(new GroupSaveBadgeComposer(groupData.groupId, badge)); - - return true; - }, [ groupData, badgeParts, setGroupData ]); - - useEffect(() => - { - if(groupData.groupBadgeParts) return; - - const badgeParts = [ - new GroupBadgePart(GroupBadgePart.BASE, groupCustomize.badgeBases[0].id, groupCustomize.badgePartColors[0].id), - new GroupBadgePart(GroupBadgePart.SYMBOL, 0, groupCustomize.badgePartColors[0].id), - new GroupBadgePart(GroupBadgePart.SYMBOL, 0, groupCustomize.badgePartColors[0].id), - new GroupBadgePart(GroupBadgePart.SYMBOL, 0, groupCustomize.badgePartColors[0].id), - new GroupBadgePart(GroupBadgePart.SYMBOL, 0, groupCustomize.badgePartColors[0].id) - ]; - - setGroupData(prevValue => - { - const groupBadgeParts = badgeParts; - - return { ...prevValue, groupBadgeParts }; - }); - }, [ groupData.groupBadgeParts, groupCustomize, setGroupData ]); - - useEffect(() => - { - if(groupData.groupId <= 0) - { - setBadgeParts(groupData.groupBadgeParts ? [ ...groupData.groupBadgeParts ] : null); - - return; - } - - setBadgeParts(groupData.groupBadgeParts); - }, [ groupData ]); - - useEffect(() => - { - setCloseAction({ action: saveBadge }); - - return () => setCloseAction(null); - }, [ setCloseAction, saveBadge ]); - - return ( - - - - - - - - - - - ); -}; diff --git a/src/components/groups/views/tabs/GroupTabColorsView.tsx b/src/components/groups/views/tabs/GroupTabColorsView.tsx deleted file mode 100644 index 61f3c86..0000000 --- a/src/components/groups/views/tabs/GroupTabColorsView.tsx +++ /dev/null @@ -1,127 +0,0 @@ -import { GroupSaveColorsComposer } from '@nitrots/nitro-renderer'; -import { Dispatch, FC, SetStateAction, useCallback, useEffect, useState } from 'react'; -import { IGroupData, LocalizeText, SendMessageComposer } from '../../../../api'; -import { AutoGrid, Base, classNames, Column, Flex, Grid, Text } from '../../../../common'; -import { useGroup } from '../../../../hooks'; - -interface GroupTabColorsViewProps -{ - groupData: IGroupData; - setGroupData: Dispatch>; - setCloseAction: Dispatch boolean }>>; -} - -export const GroupTabColorsView: FC = props => -{ - const { groupData = null, setGroupData = null, setCloseAction = null } = props; - const [ colors, setColors ] = useState(null); - const { groupCustomize = null } = useGroup(); - - const getGroupColor = (colorIndex: number) => - { - if(colorIndex === 0) return groupCustomize.groupColorsA.find(color => (color.id === colors[colorIndex])).color; - - return groupCustomize.groupColorsB.find(color => (color.id === colors[colorIndex])).color; - } - - const selectColor = (colorIndex: number, colorId: number) => - { - setColors(prevValue => - { - const newColors = [ ...prevValue ]; - - newColors[colorIndex] = colorId; - - return newColors; - }); - } - - const saveColors = useCallback(() => - { - if(!groupData || !colors || !colors.length) return false; - - if(groupData.groupColors === colors) return true; - - if(groupData.groupId <= 0) - { - setGroupData(prevValue => - { - const newValue = { ...prevValue }; - - newValue.groupColors = [ ...colors ]; - - return newValue; - }); - - return true; - } - - SendMessageComposer(new GroupSaveColorsComposer(groupData.groupId, colors[0], colors[1])); - - return true; - }, [ groupData, colors, setGroupData ]); - - useEffect(() => - { - if(!groupCustomize.groupColorsA || !groupCustomize.groupColorsB || groupData.groupColors) return; - - const groupColors = [ groupCustomize.groupColorsA[0].id, groupCustomize.groupColorsB[0].id ]; - - setGroupData(prevValue => - { - return { ...prevValue, groupColors }; - }); - }, [ groupCustomize, groupData.groupColors, setGroupData ]); - - useEffect(() => - { - if(groupData.groupId <= 0) - { - setColors(groupData.groupColors ? [ ...groupData.groupColors ] : null); - - return; - } - - setColors(groupData.groupColors); - }, [ groupData ]); - - useEffect(() => - { - setCloseAction({ action: saveColors }); - - return () => setCloseAction(null); - }, [ setCloseAction, saveColors ]); - - if(!colors) return null; - - return ( - - - { LocalizeText('group.edit.color.guild.color') } - { groupData.groupColors && (groupData.groupColors.length > 0) && - - - - } - - - { LocalizeText('group.edit.color.primary.color') } - - { groupData.groupColors && groupCustomize.groupColorsA && groupCustomize.groupColorsA.map((item, index) => - { - return
selectColor(0, item.id) }>
- }) } -
-
- - { LocalizeText('group.edit.color.secondary.color') } - - { groupData.groupColors && groupCustomize.groupColorsB && groupCustomize.groupColorsB.map((item, index) => - { - return
selectColor(1, item.id) }>
- }) } -
-
-
- ); -}; diff --git a/src/components/groups/views/tabs/GroupTabCreatorConfirmationView.tsx b/src/components/groups/views/tabs/GroupTabCreatorConfirmationView.tsx deleted file mode 100644 index 3046038..0000000 --- a/src/components/groups/views/tabs/GroupTabCreatorConfirmationView.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { Dispatch, FC, SetStateAction } from 'react'; -import { IGroupData, LocalizeText } from '../../../../api'; -import { Base, Column, Flex, Grid, LayoutBadgeImageView, Text } from '../../../../common'; -import { useGroup } from '../../../../hooks'; - -interface GroupTabCreatorConfirmationViewProps -{ - groupData: IGroupData; - setGroupData: Dispatch>; - purchaseCost: number; -} - -export const GroupTabCreatorConfirmationView: FC = props => -{ - const { groupData = null, setGroupData = null, purchaseCost = 0 } = props; - const { groupCustomize = null } = useGroup(); - - const getCompleteBadgeCode = () => - { - if(!groupData || !groupData.groupBadgeParts || !groupData.groupBadgeParts.length) return ''; - - let badgeCode = ''; - - groupData.groupBadgeParts.forEach(part => (part.code && (badgeCode += part.code))); - - return badgeCode; - } - - const getGroupColor = (colorIndex: number) => - { - if(colorIndex === 0) return groupCustomize.groupColorsA.find(c => c.id === groupData.groupColors[colorIndex]).color; - - return groupCustomize.groupColorsB.find(c => c.id === groupData.groupColors[colorIndex]).color; - } - - if(!groupData) return null; - - return ( - - - - { LocalizeText('group.create.confirm.guildbadge') } - - - - { LocalizeText('group.edit.color.guild.color') } - - - - - - - - - - { groupData.groupName } - { groupData.groupDescription } - - { LocalizeText('group.create.confirm.info') } - - - { LocalizeText('group.create.confirm.buyinfo', [ 'amount' ], [ purchaseCost.toString() ]) } - - - - ); -}; diff --git a/src/components/groups/views/tabs/GroupTabIdentityView.tsx b/src/components/groups/views/tabs/GroupTabIdentityView.tsx deleted file mode 100644 index 3a35d47..0000000 --- a/src/components/groups/views/tabs/GroupTabIdentityView.tsx +++ /dev/null @@ -1,116 +0,0 @@ -import { CreateLinkEvent, GroupDeleteComposer, GroupSaveInformationComposer } from '@nitrots/nitro-renderer'; -import { Dispatch, FC, SetStateAction, useCallback, useEffect, useState } from 'react'; -import { IGroupData, LocalizeText, SendMessageComposer } from '../../../../api'; -import { Base, Button, Column, Flex, Text } from '../../../../common'; -import { useNotification } from '../../../../hooks'; - -interface GroupTabIdentityViewProps -{ - groupData: IGroupData; - setGroupData: Dispatch>; - setCloseAction: Dispatch boolean }>>; - onClose: () => void; - isCreator?: boolean; - availableRooms?: { id: number, name: string }[]; -} - -export const GroupTabIdentityView: FC = props => -{ - const { groupData = null, setGroupData = null, setCloseAction = null, onClose = null, isCreator = false, availableRooms = [] } = props; - const [ groupName, setGroupName ] = useState(''); - const [ groupDescription, setGroupDescription ] = useState(''); - const [ groupHomeroomId, setGroupHomeroomId ] = useState(-1); - const { showConfirm = null } = useNotification(); - - const deleteGroup = () => - { - if(!groupData || (groupData.groupId <= 0)) return; - - showConfirm(LocalizeText('group.deleteconfirm.desc'), () => - { - SendMessageComposer(new GroupDeleteComposer(groupData.groupId)); - - if(onClose) onClose(); - }, null, null, null, LocalizeText('group.deleteconfirm.title')); - } - - const saveIdentity = useCallback(() => - { - if(!groupData || !groupName || !groupName.length) return false; - - if((groupName === groupData.groupName) && (groupDescription === groupData.groupDescription)) return true; - - if(groupData.groupId <= 0) - { - if(groupHomeroomId <= 0) return false; - - setGroupData(prevValue => - { - const newValue = { ...prevValue }; - - newValue.groupName = groupName; - newValue.groupDescription = groupDescription; - newValue.groupHomeroomId = groupHomeroomId; - - return newValue; - }); - - return true; - } - - SendMessageComposer(new GroupSaveInformationComposer(groupData.groupId, groupName, (groupDescription || ''))); - - return true; - }, [ groupData, groupName, groupDescription, groupHomeroomId, setGroupData ]); - - useEffect(() => - { - setGroupName(groupData.groupName || ''); - setGroupDescription(groupData.groupDescription || ''); - setGroupHomeroomId(groupData.groupHomeroomId); - }, [ groupData ]); - - useEffect(() => - { - setCloseAction({ action: saveIdentity }); - - return () => setCloseAction(null); - }, [ setCloseAction, saveIdentity ]); - - if(!groupData) return null; - - return ( - - - - { LocalizeText('group.edit.name') } - setGroupName(event.target.value) } /> - - - { LocalizeText('group.edit.desc') } - - - - ); -}; diff --git a/src/components/guide-tool/views/GuideToolUserFeedbackView.tsx b/src/components/guide-tool/views/GuideToolUserFeedbackView.tsx deleted file mode 100644 index 9ec7280..0000000 --- a/src/components/guide-tool/views/GuideToolUserFeedbackView.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { GuideSessionFeedbackMessageComposer } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { LocalizeText, SendMessageComposer } from '../../../api'; -import { Button, Column, Flex, Text } from '../../../common'; - -interface GuideToolUserFeedbackViewProps -{ - userName: string; -} - -export const GuideToolUserFeedbackView: FC = props => -{ - const { userName = null } = props; - - const giveFeedback = (recommend: boolean) => SendMessageComposer(new GuideSessionFeedbackMessageComposer(recommend)); - - return ( - - - - { userName } - { LocalizeText('guide.help.request.user.feedback.guide.desc') } - - - - - { LocalizeText('guide.help.request.user.feedback.closed.title') } - { LocalizeText('guide.help.request.user.feedback.closed.desc') } - - { userName && (userName.length > 0) && - <> -
- - { LocalizeText('guide.help.request.user.feedback.question') } - - - - - - } -
- ); -}; diff --git a/src/components/guide-tool/views/GuideToolUserNoHelpersView.tsx b/src/components/guide-tool/views/GuideToolUserNoHelpersView.tsx deleted file mode 100644 index 6fcbfd5..0000000 --- a/src/components/guide-tool/views/GuideToolUserNoHelpersView.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { FC } from 'react'; -import { LocalizeText } from '../../../api'; -import { Column, Text } from '../../../common'; - -export const GuideToolUserNoHelpersView: FC<{}> = props => -{ - return ( - - { LocalizeText('guide.help.request.no_tour_guides.title') } - { LocalizeText('guide.help.request.no_tour_guides.message') } - - ); -}; \ No newline at end of file diff --git a/src/components/guide-tool/views/GuideToolUserPendingView.tsx b/src/components/guide-tool/views/GuideToolUserPendingView.tsx deleted file mode 100644 index 81faaff..0000000 --- a/src/components/guide-tool/views/GuideToolUserPendingView.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { GuideSessionRequesterCancelsMessageComposer } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { LocalizeText, SendMessageComposer } from '../../../api'; -import { Button, Column, Text } from '../../../common'; - -interface GuideToolUserPendingViewProps -{ - helpRequestDescription: string; - helpRequestAverageTime: number; -} - -export const GuideToolUserPendingView: FC = props => -{ - const { helpRequestDescription = null, helpRequestAverageTime = 0 } = props; - - const cancelRequest = () => SendMessageComposer(new GuideSessionRequesterCancelsMessageComposer()); - - return ( - - - { LocalizeText('guide.help.request.guide.accept.request.title') } - { LocalizeText('guide.help.request.type.1') } - { helpRequestDescription } - - - { LocalizeText('guide.help.request.user.pending.info.title') } - { LocalizeText('guide.help.request.user.pending.info.message') } - { LocalizeText('guide.help.request.user.pending.info.waiting', [ 'waitingtime' ], [ helpRequestAverageTime.toString() ]) } - - - - ); -}; diff --git a/src/components/guide-tool/views/GuideToolUserSomethingWrogView.tsx b/src/components/guide-tool/views/GuideToolUserSomethingWrogView.tsx deleted file mode 100644 index 1e8ec5e..0000000 --- a/src/components/guide-tool/views/GuideToolUserSomethingWrogView.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { FC } from 'react'; -import { LocalizeText } from '../../../api'; -import { Column, Text } from '../../../common'; - -export const GuideToolUserSomethingWrogView: FC<{}> = props => -{ - return ( - - { LocalizeText('guide.help.request.user.guide.disconnected.error.desc') } - - ); -}; \ No newline at end of file diff --git a/src/components/guide-tool/views/GuideToolUserThanksView.tsx b/src/components/guide-tool/views/GuideToolUserThanksView.tsx deleted file mode 100644 index 4953b0f..0000000 --- a/src/components/guide-tool/views/GuideToolUserThanksView.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { FC } from 'react'; -import { LocalizeText } from '../../../api'; -import { Column, Text } from '../../../common'; - -export const GuideToolUserThanksView: FC<{}> = props => -{ - return ( - - { LocalizeText('guide.help.request.user.thanks.info.title') } - { LocalizeText('guide.help.request.user.thanks.info.desc') } - - ); -}; diff --git a/src/components/hc-center/HcCenterView.scss b/src/components/hc-center/HcCenterView.scss deleted file mode 100644 index a6af9fa..0000000 --- a/src/components/hc-center/HcCenterView.scss +++ /dev/null @@ -1,44 +0,0 @@ -.nitro-hc-center { - width: 430px; - resize: none; - - .hc-logo { - width: 213px; - height: 37px; - background-image: url('@/assets/images/hc-center/hc_logo.gif'); - } - - .payday-special { - height: 128px; - } - - .payday { - width: 222px; - height: 150px; - background-image: url('@/assets/images/hc-center/payday.png'); - z-index: 3; - color: #6b3502; - } - - .clock { - width: 24px; - height: 24px; - background-image: url('@/assets/images/hc-center/clock.png'); - } - - .streak-info { - min-height: 64px; - line-height: 16px; - } - - .habbo-avatar { - z-index: 4; - } - - .benefits { - background-image: url('@/assets/images/hc-center/benefits.png'); - background-position: right top; - background-repeat: no-repeat; - height: 100%; - } -} diff --git a/src/components/hc-center/HcCenterView.tsx b/src/components/hc-center/HcCenterView.tsx deleted file mode 100644 index 08c6172..0000000 --- a/src/components/hc-center/HcCenterView.tsx +++ /dev/null @@ -1,204 +0,0 @@ -import { AddLinkEventTracker, ClubGiftInfoEvent, CreateLinkEvent, GetClubGiftInfo, ILinkEventTracker, RemoveLinkEventTracker, ScrGetKickbackInfoMessageComposer, ScrKickbackData, ScrSendKickbackInfoMessageEvent } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { OverlayTrigger, Popover } from 'react-bootstrap'; -import { ClubStatus, FriendlyTime, GetClubBadge, GetConfigurationValue, LocalizeText, SendMessageComposer } from '../../api'; -import { Base, Button, Column, Flex, LayoutAvatarImageView, LayoutBadgeImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; -import { useInventoryBadges, useMessageEvent, usePurse, useSessionInfo } from '../../hooks'; - - -export const HcCenterView: FC<{}> = props => -{ - const [ isVisible, setIsVisible ] = useState(false); - const [ kickbackData, setKickbackData ] = useState(null); - const [ unclaimedGifts, setUnclaimedGifts ] = useState(0); - const [ badgeCode, setBadgeCode ] = useState(null); - const { userFigure = null } = useSessionInfo(); - const { purse = null, clubStatus = null } = usePurse(); - const { badgeCodes = [], activate = null, deactivate = null } = useInventoryBadges(); - - const getClubText = () => - { - if(purse.clubDays <= 0) return LocalizeText('purse.clubdays.zero.amount.text'); - - if((purse.minutesUntilExpiration > -1) && (purse.minutesUntilExpiration < (60 * 24))) - { - return FriendlyTime.shortFormat(purse.minutesUntilExpiration * 60); - } - - return FriendlyTime.shortFormat(((purse.clubPeriods * 31) + purse.clubDays) * 86400); - } - - const getInfoText = () => - { - switch(clubStatus) - { - case ClubStatus.ACTIVE: - return LocalizeText(`hccenter.status.${ clubStatus }.info`, [ 'timeleft', 'joindate', 'streakduration' ], [ getClubText(), kickbackData?.firstSubscriptionDate, FriendlyTime.shortFormat(kickbackData?.currentHcStreak * 86400) ]); - case ClubStatus.EXPIRED: - return LocalizeText(`hccenter.status.${ clubStatus }.info`, [ 'joindate' ], [ kickbackData?.firstSubscriptionDate ]); - default: - return LocalizeText(`hccenter.status.${ clubStatus }.info`); - } - } - - const getHcPaydayTime = () => (!kickbackData || kickbackData.timeUntilPayday < 60) ? LocalizeText('hccenter.special.time.soon') : FriendlyTime.shortFormat(kickbackData.timeUntilPayday * 60); - const getHcPaydayAmount = () => LocalizeText('hccenter.special.sum', [ 'credits' ], [ (kickbackData?.creditRewardForStreakBonus + kickbackData?.creditRewardForMonthlySpent).toString() ]); - - useMessageEvent(ClubGiftInfoEvent, event => - { - const parser = event.getParser(); - - setUnclaimedGifts(parser.giftsAvailable); - }); - - useMessageEvent(ScrSendKickbackInfoMessageEvent, event => - { - const parser = event.getParser(); - - setKickbackData(parser.data); - }); - - useEffect(() => - { - const linkTracker: ILinkEventTracker = { - linkReceived: (url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'open': - if(parts.length > 2) - { - switch(parts[2]) - { - case 'hccenter': - setIsVisible(true); - break; - } - } - return; - } - }, - eventUrlPrefix: 'habboUI/' - }; - - AddLinkEventTracker(linkTracker); - - return () => RemoveLinkEventTracker(linkTracker); - }, []); - - useEffect(() => - { - setBadgeCode(GetClubBadge(badgeCodes)); - }, [ badgeCodes ]); - - useEffect(() => - { - if(!isVisible) return; - - const id = activate(); - - return () => deactivate(id); - }, [ isVisible, activate, deactivate ]); - - useEffect(() => - { - SendMessageComposer(new GetClubGiftInfo()); - SendMessageComposer(new ScrGetKickbackInfoMessageComposer()); - }, []); - - if(!isVisible) return null; - - const popover = ( - - -
{ LocalizeText('hccenter.breakdown.title') }
-
{ LocalizeText('hccenter.breakdown.creditsspent', [ 'credits' ], [ kickbackData?.totalCreditsSpent.toString() ]) }
-
{ LocalizeText('hccenter.breakdown.paydayfactor.percent', [ 'percent' ], [ (kickbackData?.kickbackPercentage * 100).toString() ]) }
-
{ LocalizeText('hccenter.breakdown.streakbonus', [ 'credits' ], [ kickbackData?.creditRewardForStreakBonus.toString() ]) }
-
-
{ LocalizeText('hccenter.breakdown.total', [ 'credits', 'actual' ], [ getHcPaydayAmount(), ((((kickbackData?.kickbackPercentage * kickbackData?.totalCreditsSpent) + kickbackData?.creditRewardForStreakBonus) * 100) / 100).toString() ]) }
-
CreateLinkEvent('habbopages/' + GetConfigurationValue('hc.center')['payday.habbopage']) }> - { LocalizeText('hccenter.special.infolink') } -
-
-
- ); - - return ( - - setIsVisible(false) } /> - - -
- - - - - - - - - - - - - { LocalizeText('hccenter.status.' + clubStatus) } - - - - { GetConfigurationValue('hc.center')['payday.info'] && - - - -

{ LocalizeText('hccenter.special.title') }

-
{ LocalizeText('hccenter.special.info') }
-
CreateLinkEvent('habbopages/' + GetConfigurationValue('hc.center')['payday.habbopage']) }>{ LocalizeText('hccenter.special.infolink') }
-
-
-
{ LocalizeText('hccenter.special.time.title') }
-
-
-
{ getHcPaydayTime() }
-
- { clubStatus === ClubStatus.ACTIVE && -
-
{ LocalizeText('hccenter.special.amount.title') }
-
-
{ getHcPaydayAmount() }
- -
- { LocalizeText('hccenter.breakdown.infolink') } -
-
-
-
} -
- } - { GetConfigurationValue('hc.center')['gift.info'] && -
-
-

{ LocalizeText('hccenter.gift.title') }

-
0 ? LocalizeText('hccenter.unclaimedgifts', [ 'unclaimedgifts' ], [ unclaimedGifts.toString() ]) : LocalizeText('hccenter.gift.info') } }>
-
- -
} - { GetConfigurationValue('hc.center')['benefits.info'] && -
-
{ LocalizeText('hccenter.general.title') }
-
- -
} - - - ); -} diff --git a/src/components/help/HelpView.scss b/src/components/help/HelpView.scss deleted file mode 100644 index abe4189..0000000 --- a/src/components/help/HelpView.scss +++ /dev/null @@ -1,18 +0,0 @@ -.nitro-help { - height: $help-height; - width: $help-width; - - .index-image { - background: url('@/assets/images/help/help_index.png'); - width: 126px; - height: 105px; - } -} - -.nitro-cfh-sanction-status { - width: 400px; -} - -.nitro-change-username { - width: 300px; -} diff --git a/src/components/help/HelpView.tsx b/src/components/help/HelpView.tsx deleted file mode 100644 index f37e42e..0000000 --- a/src/components/help/HelpView.tsx +++ /dev/null @@ -1,116 +0,0 @@ -import { AddLinkEventTracker, ILinkEventTracker, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, ReportState } from '../../api'; -import { Base, Column, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../common'; -import { useHelp } from '../../hooks'; -import { DescribeReportView } from './views/DescribeReportView'; -import { HelpIndexView } from './views/HelpIndexView'; -import { ReportSummaryView } from './views/ReportSummaryView'; -import { SanctionSatusView } from './views/SanctionStatusView'; -import { SelectReportedChatsView } from './views/SelectReportedChatsView'; -import { SelectReportedUserView } from './views/SelectReportedUserView'; -import { SelectTopicView } from './views/SelectTopicView'; -import { NameChangeView } from './views/name-change/NameChangeView'; - -export const HelpView: FC<{}> = props => -{ - const [ isVisible, setIsVisible ] = useState(false); - const { activeReport = null, setActiveReport = null, report = null } = useHelp(); - - const onClose = () => - { - setActiveReport(null); - setIsVisible(false); - } - - useEffect(() => - { - const linkTracker: ILinkEventTracker = { - linkReceived: (url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'show': - setIsVisible(true); - return; - case 'hide': - setIsVisible(false); - return; - case 'toggle': - setIsVisible(prevValue => !prevValue); - return; - case 'tour': - // todo: launch tour - return; - case 'report': - if((parts.length >= 5) && (parts[2] === 'room')) - { - const roomId = parseInt(parts[3]); - const unknown = unescape(parts.splice(4).join('/')); - //this.reportRoom(roomId, unknown, ""); - } - return; - } - }, - eventUrlPrefix: 'help/' - }; - - AddLinkEventTracker(linkTracker); - - return () => RemoveLinkEventTracker(linkTracker); - }, []); - - useEffect(() => - { - if(!activeReport) return; - - setIsVisible(true); - }, [ activeReport ]); - - const CurrentStepView = () => - { - if(activeReport) - { - switch(activeReport.currentStep) - { - case ReportState.SELECT_USER: - return ; - case ReportState.SELECT_CHATS: - return ; - case ReportState.SELECT_TOPICS: - return ; - case ReportState.INPUT_REPORT_MESSAGE: - return ; - case ReportState.REPORT_SUMMARY: - return ; - } - } - - return ; - } - - return ( - <> - { isVisible && - - - - - - - - - - - - - } - - - - ); -} diff --git a/src/components/help/views/DescribeReportView.tsx b/src/components/help/views/DescribeReportView.tsx deleted file mode 100644 index 5f231d3..0000000 --- a/src/components/help/views/DescribeReportView.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { FC, useState } from 'react'; -import { LocalizeText, ReportState, ReportType } from '../../../api'; -import { Button, Column, Flex, Text } from '../../../common'; -import { useHelp } from '../../../hooks'; - -export const DescribeReportView: FC<{}> = props => -{ - const [ message, setMessage ] = useState(''); - const { activeReport = null, setActiveReport = null } = useHelp(); - - const submitMessage = () => - { - if(message.length < 15) return; - - setActiveReport(prevValue => - { - const currentStep = ReportState.REPORT_SUMMARY; - - return { ...prevValue, message, currentStep }; - }); - } - - const back = () => - { - setActiveReport(prevValue => - { - return { ...prevValue, currentStep: (prevValue.currentStep - 1) }; - }); - } - - return ( - <> - - { LocalizeText('help.emergency.chat_report.subtitle') } - { LocalizeText('help.cfh.input.text') } - - - - - - - - - ); -} diff --git a/src/components/mod-tools/views/tickets/CfhChatlogView.tsx b/src/components/mod-tools/views/tickets/CfhChatlogView.tsx deleted file mode 100644 index c8bdd7b..0000000 --- a/src/components/mod-tools/views/tickets/CfhChatlogView.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { CfhChatlogData, CfhChatlogEvent, GetCfhChatlogMessageComposer } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { SendMessageComposer } from '../../../../api'; -import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; -import { useMessageEvent } from '../../../../hooks'; -import { ChatlogView } from '../chatlog/ChatlogView'; - -interface CfhChatlogViewProps -{ - issueId: number; - onCloseClick(): void; -} - -export const CfhChatlogView: FC = props => -{ - const { onCloseClick = null, issueId = null } = props; - const [ chatlogData, setChatlogData ] = useState(null); - - useMessageEvent(CfhChatlogEvent, event => - { - const parser = event.getParser(); - - if(!parser || parser.data.issueId !== issueId) return; - - setChatlogData(parser.data); - }); - - useEffect(() => - { - SendMessageComposer(new GetCfhChatlogMessageComposer(issueId)); - }, [ issueId ]); - - return ( - - - - { chatlogData && } - - - ); -} diff --git a/src/components/mod-tools/views/tickets/ModToolsIssueInfoView.tsx b/src/components/mod-tools/views/tickets/ModToolsIssueInfoView.tsx deleted file mode 100644 index 1179d41..0000000 --- a/src/components/mod-tools/views/tickets/ModToolsIssueInfoView.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { CloseIssuesMessageComposer, ReleaseIssuesMessageComposer } from '@nitrots/nitro-renderer'; -import { FC, useState } from 'react'; -import { GetIssueCategoryName, LocalizeText, SendMessageComposer } from '../../../../api'; -import { Button, Column, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; -import { useModTools } from '../../../../hooks'; -import { CfhChatlogView } from './CfhChatlogView'; - -interface IssueInfoViewProps -{ - issueId: number; - onIssueInfoClosed(issueId: number): void; -} - -export const ModToolsIssueInfoView: FC = props => -{ - const { issueId = null, onIssueInfoClosed = null } = props; - const [ cfhChatlogOpen, setcfhChatlogOpen ] = useState(false); - const { tickets = [], openUserInfo = null } = useModTools(); - const ticket = tickets.find(issue => (issue.issueId === issueId)); - - const releaseIssue = (issueId: number) => - { - SendMessageComposer(new ReleaseIssuesMessageComposer([ issueId ])); - - onIssueInfoClosed(issueId); - } - - const closeIssue = (resolutionType: number) => - { - SendMessageComposer(new CloseIssuesMessageComposer([ issueId ], resolutionType)); - - onIssueInfoClosed(issueId) - } - - return ( - <> - - onIssueInfoClosed(issueId) } /> - - Issue Information - - - - - - - - - - - - - - - - - - - - - - - - - -
Source{ GetIssueCategoryName(ticket.categoryId) }
Category{ LocalizeText('help.cfh.topic.' + ticket.reportedCategoryId) }
Description{ ticket.message }
Caller - openUserInfo(ticket.reporterUserId) }>{ ticket.reporterUserName } -
Reported User - openUserInfo(ticket.reportedUserId) }>{ ticket.reportedUserName } -
-
- - - - - - - -
-
-
- { cfhChatlogOpen && - setcfhChatlogOpen(false) }/> } - - ); -} diff --git a/src/components/mod-tools/views/tickets/ModToolsMyIssuesTabView.tsx b/src/components/mod-tools/views/tickets/ModToolsMyIssuesTabView.tsx deleted file mode 100644 index 2e1827a..0000000 --- a/src/components/mod-tools/views/tickets/ModToolsMyIssuesTabView.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { IssueMessageData, ReleaseIssuesMessageComposer } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { SendMessageComposer } from '../../../../api'; -import { Base, Button, Column, Grid } from '../../../../common'; - -interface ModToolsMyIssuesTabViewProps -{ - myIssues: IssueMessageData[]; - handleIssue: (issueId: number) => void; -} - -export const ModToolsMyIssuesTabView: FC = props => -{ - const { myIssues = null, handleIssue = null } = props; - - return ( - - - - Type - Room/Player - Opened - - - - - - { myIssues && (myIssues.length > 0) && myIssues.map(issue => - { - return ( - - { issue.categoryId } - { issue.reportedUserName } - { new Date(Date.now() - issue.issueAgeInMilliseconds).toLocaleTimeString() } - - - - - - - - ); - }) } - - - ); -} diff --git a/src/components/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx b/src/components/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx deleted file mode 100644 index 6ee23cd..0000000 --- a/src/components/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { IssueMessageData, PickIssuesMessageComposer } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { SendMessageComposer } from '../../../../api'; -import { Base, Button, Column, Grid } from '../../../../common'; - -interface ModToolsOpenIssuesTabViewProps -{ - openIssues: IssueMessageData[]; -} - -export const ModToolsOpenIssuesTabView: FC = props => -{ - const { openIssues = null } = props; - - return ( - - - - Type - Room/Player - Opened - - - - - { openIssues && (openIssues.length > 0) && openIssues.map(issue => - { - return ( - - { issue.categoryId } - { issue.reportedUserName } - { new Date(Date.now() - issue.issueAgeInMilliseconds).toLocaleTimeString() } - - - - - ); - }) } - - - ); -} diff --git a/src/components/mod-tools/views/tickets/ModToolsPickedIssuesTabView.tsx b/src/components/mod-tools/views/tickets/ModToolsPickedIssuesTabView.tsx deleted file mode 100644 index 19b899b..0000000 --- a/src/components/mod-tools/views/tickets/ModToolsPickedIssuesTabView.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { IssueMessageData } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { Base, Column, Grid } from '../../../../common'; - -interface ModToolsPickedIssuesTabViewProps -{ - pickedIssues: IssueMessageData[]; -} - -export const ModToolsPickedIssuesTabView: FC = props => -{ - const { pickedIssues = null } = props; - - return ( - - - - Type - Room/Player - Opened - Picker - - - - { pickedIssues && (pickedIssues.length > 0) && pickedIssues.map(issue => - { - return ( - - { issue.categoryId } - { issue.reportedUserName } - { new Date(Date.now() - issue.issueAgeInMilliseconds).toLocaleTimeString() } - { issue.pickerUserName } - - ); - }) } - - - ); -} diff --git a/src/components/mod-tools/views/tickets/ModToolsTicketsView.tsx b/src/components/mod-tools/views/tickets/ModToolsTicketsView.tsx deleted file mode 100644 index 76d6abd..0000000 --- a/src/components/mod-tools/views/tickets/ModToolsTicketsView.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import { GetSessionDataManager, IssueMessageData } from '@nitrots/nitro-renderer'; -import { FC, useState } from 'react'; -import { NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../../../common'; -import { useModTools } from '../../../../hooks'; -import { ModToolsIssueInfoView } from './ModToolsIssueInfoView'; -import { ModToolsMyIssuesTabView } from './ModToolsMyIssuesTabView'; -import { ModToolsOpenIssuesTabView } from './ModToolsOpenIssuesTabView'; -import { ModToolsPickedIssuesTabView } from './ModToolsPickedIssuesTabView'; - -interface ModToolsTicketsViewProps -{ - onCloseClick: () => void; -} - -const TABS: string[] = [ - 'Open Issues', - 'My Issues', - 'Picked Issues' -]; - -export const ModToolsTicketsView: FC = props => -{ - const { onCloseClick = null } = props; - const [ currentTab, setCurrentTab ] = useState(0); - const [ issueInfoWindows, setIssueInfoWindows ] = useState([]); - const { tickets = [] } = useModTools(); - - const openIssues = tickets.filter(issue => issue.state === IssueMessageData.STATE_OPEN); - const myIssues = tickets.filter(issue => (issue.state === IssueMessageData.STATE_PICKED) && (issue.pickerUserId === GetSessionDataManager().userId)); - const pickedIssues = tickets.filter(issue => issue.state === IssueMessageData.STATE_PICKED); - - const closeIssue = (issueId: number) => - { - setIssueInfoWindows(prevValue => - { - const newValue = [ ...prevValue ]; - const existingIndex = newValue.indexOf(issueId); - - if(existingIndex >= 0) newValue.splice(existingIndex, 1); - - return newValue; - }); - } - - const handleIssue = (issueId: number) => - { - setIssueInfoWindows(prevValue => - { - const newValue = [ ...prevValue ]; - const existingIndex = newValue.indexOf(issueId); - - if(existingIndex === -1) newValue.push(issueId); - else newValue.splice(existingIndex, 1); - - return newValue; - }) - } - - const CurrentTabComponent = () => - { - switch(currentTab) - { - case 0: return ; - case 1: return ; - case 2: return ; - } - - return null; - } - - return ( - <> - - - - { TABS.map((tab, index) => - { - return ( setCurrentTab(index) }> - { tab } - ); - }) } - - - - - - { issueInfoWindows && (issueInfoWindows.length > 0) && issueInfoWindows.map(issueId => ) } - - ); -} diff --git a/src/components/mod-tools/views/user/ModToolsUserChatlogView.tsx b/src/components/mod-tools/views/user/ModToolsUserChatlogView.tsx deleted file mode 100644 index 7bfb2e1..0000000 --- a/src/components/mod-tools/views/user/ModToolsUserChatlogView.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { ChatRecordData, GetUserChatlogMessageComposer, UserChatlogEvent } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { SendMessageComposer } from '../../../../api'; -import { DraggableWindowPosition, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; -import { useMessageEvent } from '../../../../hooks'; -import { ChatlogView } from '../chatlog/ChatlogView'; - -interface ModToolsUserChatlogViewProps -{ - userId: number; - onCloseClick: () => void; -} - -export const ModToolsUserChatlogView: FC = props => -{ - const { userId = null, onCloseClick = null } = props; - const [ userChatlog, setUserChatlog ] = useState(null); - const [ username, setUsername ] = useState(null); - - useMessageEvent(UserChatlogEvent, event => - { - const parser = event.getParser(); - - if(!parser || parser.data.userId !== userId) return; - - setUsername(parser.data.username); - setUserChatlog(parser.data.roomChatlogs); - }); - - useEffect(() => - { - SendMessageComposer(new GetUserChatlogMessageComposer(userId)); - }, [ userId ]); - - return ( - - - - { userChatlog && - } - - - ); -} diff --git a/src/components/mod-tools/views/user/ModToolsUserModActionView.tsx b/src/components/mod-tools/views/user/ModToolsUserModActionView.tsx deleted file mode 100644 index bd4c2d5..0000000 --- a/src/components/mod-tools/views/user/ModToolsUserModActionView.tsx +++ /dev/null @@ -1,176 +0,0 @@ -import { CallForHelpTopicData, DefaultSanctionMessageComposer, ModAlertMessageComposer, ModBanMessageComposer, ModKickMessageComposer, ModMessageMessageComposer, ModMuteMessageComposer, ModTradingLockMessageComposer } from '@nitrots/nitro-renderer'; -import { FC, useMemo, useState } from 'react'; -import { ISelectedUser, LocalizeText, ModActionDefinition, NotificationAlertType, SendMessageComposer } from '../../../../api'; -import { Button, Column, DraggableWindowPosition, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; -import { useModTools, useNotification } from '../../../../hooks'; - -interface ModToolsUserModActionViewProps -{ - user: ISelectedUser; - onCloseClick: () => void; -} - -const MOD_ACTION_DEFINITIONS = [ - new ModActionDefinition(1, 'Alert', ModActionDefinition.ALERT, 1, 0), - new ModActionDefinition(2, 'Mute 1h', ModActionDefinition.MUTE, 2, 0), - new ModActionDefinition(3, 'Ban 18h', ModActionDefinition.BAN, 3, 0), - new ModActionDefinition(4, 'Ban 7 days', ModActionDefinition.BAN, 4, 0), - new ModActionDefinition(5, 'Ban 30 days (step 1)', ModActionDefinition.BAN, 5, 0), - new ModActionDefinition(7, 'Ban 30 days (step 2)', ModActionDefinition.BAN, 7, 0), - new ModActionDefinition(6, 'Ban 100 years', ModActionDefinition.BAN, 6, 0), - new ModActionDefinition(106, 'Ban avatar-only 100 years', ModActionDefinition.BAN, 6, 0), - new ModActionDefinition(101, 'Kick', ModActionDefinition.KICK, 0, 0), - new ModActionDefinition(102, 'Lock trade 1 week', ModActionDefinition.TRADE_LOCK, 0, 168), - new ModActionDefinition(104, 'Lock trade permanent', ModActionDefinition.TRADE_LOCK, 0, 876000), - new ModActionDefinition(105, 'Message', ModActionDefinition.MESSAGE, 0, 0), -]; - -export const ModToolsUserModActionView: FC = props => -{ - const { user = null, onCloseClick = null } = props; - const [ selectedTopic, setSelectedTopic ] = useState(-1); - const [ selectedAction, setSelectedAction ] = useState(-1); - const [ message, setMessage ] = useState(''); - const { cfhCategories = null, settings = null } = useModTools(); - const { simpleAlert = null } = useNotification(); - - const topics = useMemo(() => - { - const values: CallForHelpTopicData[] = []; - - if(cfhCategories && cfhCategories.length) - { - for(const category of cfhCategories) - { - for(const topic of category.topics) values.push(topic); - } - } - - return values; - }, [ cfhCategories ]); - - const sendAlert = (message: string) => simpleAlert(message, NotificationAlertType.DEFAULT, null, null, 'Error'); - - const sendDefaultSanction = () => - { - let errorMessage: string = null; - - const category = topics[selectedTopic]; - - if(selectedTopic === -1) errorMessage = 'You must select a CFH topic'; - - if(errorMessage) return sendAlert(errorMessage); - - const messageOrDefault = (message.trim().length === 0) ? LocalizeText(`help.cfh.topic.${ category.id }`) : message; - - SendMessageComposer(new DefaultSanctionMessageComposer(user.userId, selectedTopic, messageOrDefault)); - - onCloseClick(); - } - - const sendSanction = () => - { - let errorMessage: string = null; - - const category = topics[selectedTopic]; - const sanction = MOD_ACTION_DEFINITIONS[selectedAction]; - - if((selectedTopic === -1) || (selectedAction === -1)) errorMessage = 'You must select a CFH topic and Sanction'; - else if(!settings || !settings.cfhPermission) errorMessage = 'You do not have permission to do this'; - else if(!category) errorMessage = 'You must select a CFH topic'; - else if(!sanction) errorMessage = 'You must select a sanction'; - - if(errorMessage) - { - sendAlert(errorMessage); - - return; - } - - const messageOrDefault = (message.trim().length === 0) ? LocalizeText(`help.cfh.topic.${ category.id }`) : message; - - switch(sanction.actionType) - { - case ModActionDefinition.ALERT: { - if(!settings.alertPermission) - { - sendAlert('You have insufficient permissions'); - - return; - } - - SendMessageComposer(new ModAlertMessageComposer(user.userId, messageOrDefault, category.id)); - break; - } - case ModActionDefinition.MUTE: - SendMessageComposer(new ModMuteMessageComposer(user.userId, messageOrDefault, category.id)); - break; - case ModActionDefinition.BAN: { - if(!settings.banPermission) - { - sendAlert('You have insufficient permissions'); - - return; - } - - SendMessageComposer(new ModBanMessageComposer(user.userId, messageOrDefault, category.id, selectedAction, (sanction.actionId === 106))); - break; - } - case ModActionDefinition.KICK: { - if(!settings.kickPermission) - { - sendAlert('You have insufficient permissions'); - return; - } - - SendMessageComposer(new ModKickMessageComposer(user.userId, messageOrDefault, category.id)); - break; - } - case ModActionDefinition.TRADE_LOCK: { - const numSeconds = (sanction.actionLengthHours * 60); - - SendMessageComposer(new ModTradingLockMessageComposer(user.userId, messageOrDefault, numSeconds, category.id)); - break; - } - case ModActionDefinition.MESSAGE: { - if(message.trim().length === 0) - { - sendAlert('Please write a message to user'); - - return; - } - - SendMessageComposer(new ModMessageMessageComposer(user.userId, message, category.id)); - break; - } - } - - onCloseClick(); - } - - if(!user) return null; - - return ( - - onCloseClick() } /> - - - - - Optional message type, overrides default - - - - - ); -} diff --git a/src/components/mod-tools/views/user/ModToolsUserView.tsx b/src/components/mod-tools/views/user/ModToolsUserView.tsx deleted file mode 100644 index 0ceb8a2..0000000 --- a/src/components/mod-tools/views/user/ModToolsUserView.tsx +++ /dev/null @@ -1,156 +0,0 @@ -import { CreateLinkEvent, GetModeratorUserInfoMessageComposer, ModeratorUserInfoData, ModeratorUserInfoEvent } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useMemo, useState } from 'react'; -import { FriendlyTime, LocalizeText, SendMessageComposer } from '../../../../api'; -import { Button, Column, DraggableWindowPosition, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; -import { useMessageEvent } from '../../../../hooks'; -import { ModToolsUserModActionView } from './ModToolsUserModActionView'; -import { ModToolsUserRoomVisitsView } from './ModToolsUserRoomVisitsView'; -import { ModToolsUserSendMessageView } from './ModToolsUserSendMessageView'; - -interface ModToolsUserViewProps -{ - userId: number; - onCloseClick: () => void; -} - -export const ModToolsUserView: FC = props => -{ - const { onCloseClick = null, userId = null } = props; - const [ userInfo, setUserInfo ] = useState(null); - const [ sendMessageVisible, setSendMessageVisible ] = useState(false); - const [ modActionVisible, setModActionVisible ] = useState(false); - const [ roomVisitsVisible, setRoomVisitsVisible ] = useState(false); - - const userProperties = useMemo(() => - { - if(!userInfo) return null; - - return [ - { - localeKey: 'modtools.userinfo.userName', - value: userInfo.userName, - showOnline: true - }, - { - localeKey: 'modtools.userinfo.cfhCount', - value: userInfo.cfhCount.toString() - }, - { - localeKey: 'modtools.userinfo.abusiveCfhCount', - value: userInfo.abusiveCfhCount.toString() - }, - { - localeKey: 'modtools.userinfo.cautionCount', - value: userInfo.cautionCount.toString() - }, - { - localeKey: 'modtools.userinfo.banCount', - value: userInfo.banCount.toString() - }, - { - localeKey: 'modtools.userinfo.lastSanctionTime', - value: userInfo.lastSanctionTime - }, - { - localeKey: 'modtools.userinfo.tradingLockCount', - value: userInfo.tradingLockCount.toString() - }, - { - localeKey: 'modtools.userinfo.tradingExpiryDate', - value: userInfo.tradingExpiryDate - }, - { - localeKey: 'modtools.userinfo.minutesSinceLastLogin', - value: FriendlyTime.format(userInfo.minutesSinceLastLogin * 60, '.ago', 2) - }, - { - localeKey: 'modtools.userinfo.lastPurchaseDate', - value: userInfo.lastPurchaseDate - }, - { - localeKey: 'modtools.userinfo.primaryEmailAddress', - value: userInfo.primaryEmailAddress - }, - { - localeKey: 'modtools.userinfo.identityRelatedBanCount', - value: userInfo.identityRelatedBanCount.toString() - }, - { - localeKey: 'modtools.userinfo.registrationAgeInMinutes', - value: FriendlyTime.format(userInfo.registrationAgeInMinutes * 60, '.ago', 2) - }, - { - localeKey: 'modtools.userinfo.userClassification', - value: userInfo.userClassification - } - ]; - }, [ userInfo ]); - - useMessageEvent(ModeratorUserInfoEvent, event => - { - const parser = event.getParser(); - - if(!parser || parser.data.userId !== userId) return; - - setUserInfo(parser.data); - }); - - useEffect(() => - { - SendMessageComposer(new GetModeratorUserInfoMessageComposer(userId)); - }, [ userId ]); - - if(!userInfo) return null; - - return ( - <> - - onCloseClick() } /> - - - - - - { userProperties.map( (property, index) => - { - - return ( - - - - - ); - }) } - -
{ LocalizeText(property.localeKey) } - { property.value } - { property.showOnline && - } -
-
- - - - - - -
-
-
- { sendMessageVisible && - setSendMessageVisible(false) } /> } - { modActionVisible && - setModActionVisible(false) } /> } - { roomVisitsVisible && - setRoomVisitsVisible(false) } /> } - - ); -} diff --git a/src/components/navigator/NavigatorView.scss b/src/components/navigator/NavigatorView.scss deleted file mode 100644 index ef235bc..0000000 --- a/src/components/navigator/NavigatorView.scss +++ /dev/null @@ -1,65 +0,0 @@ -.nitro-navigator { - width: $navigator-width; - height: $navigator-height; - - .navigator-grid { - - .navigator-item { - - .badge { - width: 35px; - min-width: 35px; - } - } - - &:not(.two-columns) { - - .navigator-item { - - &:nth-child(odd) { - background-color: $grid-active-bg-color; - } - } - } - - &.two-columns { - - .navigator-item { - - &:nth-child(4n-2), - &:nth-child(4n-3) { - background: $grid-active-bg-color; - } - } - } - } -} - -.nitro-navigator-doorbell, -.nitro-navigator-password { - width: 250px; -} - -.nitro-room-info { - width: $room-info-width; -} - -.nitro-room-link { - width: 400px; -} - -.nitro-room-settings { - width: 400px; - - .list-container { - height: 100px; - - .list-item { - background-color: $grid-active-bg-color; - } - } -} - -.room-info { - width: 275px; -} diff --git a/src/components/navigator/NavigatorView.tsx b/src/components/navigator/NavigatorView.tsx deleted file mode 100644 index e772db8..0000000 --- a/src/components/navigator/NavigatorView.tsx +++ /dev/null @@ -1,233 +0,0 @@ -import { AddLinkEventTracker, ConvertGlobalRoomIdMessageComposer, HabboWebTools, ILinkEventTracker, LegacyExternalInterface, NavigatorInitComposer, NavigatorSearchComposer, RemoveLinkEventTracker, RoomSessionEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useRef, useState } from 'react'; -import { FaPlus } from 'react-icons/fa'; -import { LocalizeText, SendMessageComposer, TryVisitRoom } from '../../api'; -import { Base, Column, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common'; -import { useNavigator, useNitroEvent } from '../../hooks'; -import { NavigatorDoorStateView } from './views/NavigatorDoorStateView'; -import { NavigatorRoomCreatorView } from './views/NavigatorRoomCreatorView'; -import { NavigatorRoomInfoView } from './views/NavigatorRoomInfoView'; -import { NavigatorRoomLinkView } from './views/NavigatorRoomLinkView'; -import { NavigatorRoomSettingsView } from './views/room-settings/NavigatorRoomSettingsView'; -import { NavigatorSearchResultView } from './views/search/NavigatorSearchResultView'; -import { NavigatorSearchView } from './views/search/NavigatorSearchView'; - -export const NavigatorView: FC<{}> = props => -{ - const [ isVisible, setIsVisible ] = useState(false); - const [ isReady, setIsReady ] = useState(false); - const [ isCreatorOpen, setCreatorOpen ] = useState(false); - const [ isRoomInfoOpen, setRoomInfoOpen ] = useState(false); - const [ isRoomLinkOpen, setRoomLinkOpen ] = useState(false); - const [ isLoading, setIsLoading ] = useState(false); - const [ needsInit, setNeedsInit ] = useState(true); - const [ needsSearch, setNeedsSearch ] = useState(false); - const { searchResult = null, topLevelContext = null, topLevelContexts = null, navigatorData = null } = useNavigator(); - const pendingSearch = useRef<{ value: string, code: string }>(null); - const elementRef = useRef(); - - useNitroEvent(RoomSessionEvent.CREATED, event => - { - setIsVisible(false); - setCreatorOpen(false); - }); - - const sendSearch = useCallback((searchValue: string, contextCode: string) => - { - setCreatorOpen(false); - - SendMessageComposer(new NavigatorSearchComposer(contextCode, searchValue)); - - setIsLoading(true); - }, []); - - const reloadCurrentSearch = useCallback(() => - { - if(!isReady) - { - setNeedsSearch(true); - - return; - } - - if(pendingSearch.current) - { - sendSearch(pendingSearch.current.value, pendingSearch.current.code); - - pendingSearch.current = null; - - return; - } - - if(searchResult) - { - sendSearch(searchResult.data, searchResult.code); - - return; - } - - if(!topLevelContext) return; - - sendSearch('', topLevelContext.code); - }, [ isReady, searchResult, topLevelContext, sendSearch ]); - - useEffect(() => - { - const linkTracker: ILinkEventTracker = { - linkReceived: (url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'show': { - setIsVisible(true); - setNeedsSearch(true); - return; - } - case 'hide': - setIsVisible(false); - return; - case 'toggle': { - if(isVisible) - { - setIsVisible(false); - - return; - } - - setIsVisible(true); - setNeedsSearch(true); - return; - } - case 'toggle-room-info': - setRoomInfoOpen(value => !value); - return; - case 'toggle-room-link': - setRoomLinkOpen(value => !value); - return; - case 'goto': - if(parts.length <= 2) return; - - switch(parts[2]) - { - case 'home': - if(navigatorData.homeRoomId <= 0) return; - - TryVisitRoom(navigatorData.homeRoomId); - break; - default: { - const roomId = parseInt(parts[2]); - - TryVisitRoom(roomId); - } - } - return; - case 'create': - setIsVisible(true); - setCreatorOpen(true); - return; - case 'search': - if(parts.length > 2) - { - const topLevelContextCode = parts[2]; - - let searchValue = ''; - - if(parts.length > 3) searchValue = parts[3]; - - pendingSearch.current = { value: searchValue, code: topLevelContextCode }; - - setIsVisible(true); - setNeedsSearch(true); - } - return; - } - }, - eventUrlPrefix: 'navigator/' - }; - - AddLinkEventTracker(linkTracker); - - return () => RemoveLinkEventTracker(linkTracker); - }, [ isVisible, navigatorData ]); - - useEffect(() => - { - if(!searchResult) return; - - setIsLoading(false); - - if(elementRef && elementRef.current) elementRef.current.scrollTop = 0; - }, [ searchResult ]); - - useEffect(() => - { - if(!isVisible || !isReady || !needsSearch) return; - - reloadCurrentSearch(); - - setNeedsSearch(false); - }, [ isVisible, isReady, needsSearch, reloadCurrentSearch ]); - - useEffect(() => - { - if(isReady || !topLevelContext) return; - - setIsReady(true); - }, [ isReady, topLevelContext ]); - - useEffect(() => - { - if(!isVisible || !needsInit) return; - - SendMessageComposer(new NavigatorInitComposer()); - - setNeedsInit(false); - }, [ isVisible, needsInit ]); - - useEffect(() => - { - LegacyExternalInterface.addCallback(HabboWebTools.OPENROOM, (k: string, _arg_2: boolean = false, _arg_3: string = null) => SendMessageComposer(new ConvertGlobalRoomIdMessageComposer(k))); - }, []); - - return ( - <> - { isVisible && - - setIsVisible(false) } /> - - { topLevelContexts && (topLevelContexts.length > 0) && topLevelContexts.map((context, index) => - { - return ( - sendSearch('', context.code) }> - { LocalizeText(('navigator.toplevelview.' + context.code)) } - - ); - }) } - setCreatorOpen(true) }> - - - - - { isLoading && - } - { !isCreatorOpen && - <> - - - { (searchResult && searchResult.results.map((result, index) => )) } - - } - { isCreatorOpen && } - - } - - { isRoomInfoOpen && setRoomInfoOpen(false) } /> } - { isRoomLinkOpen && setRoomLinkOpen(false) } /> } - - - ); -} diff --git a/src/components/navigator/views/NavigatorDoorStateView.tsx b/src/components/navigator/views/NavigatorDoorStateView.tsx deleted file mode 100644 index 4c8a3e2..0000000 --- a/src/components/navigator/views/NavigatorDoorStateView.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { CreateRoomSession, DoorStateType, GoToDesktop, LocalizeText } from '../../../api'; -import { Button, Column, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; -import { useNavigator } from '../../../hooks'; - -const VISIBLE_STATES = [ DoorStateType.START_DOORBELL, DoorStateType.STATE_WAITING, DoorStateType.STATE_NO_ANSWER, DoorStateType.START_PASSWORD, DoorStateType.STATE_WRONG_PASSWORD ]; -const DOORBELL_STATES = [ DoorStateType.START_DOORBELL, DoorStateType.STATE_WAITING, DoorStateType.STATE_NO_ANSWER ]; -const PASSWORD_STATES = [ DoorStateType.START_PASSWORD, DoorStateType.STATE_WRONG_PASSWORD ]; - -export const NavigatorDoorStateView: FC<{}> = props => -{ - const [ password, setPassword ] = useState(''); - const { doorData = null, setDoorData = null } = useNavigator(); - - const onClose = () => - { - if(doorData && (doorData.state === DoorStateType.STATE_WAITING)) GoToDesktop(); - - setDoorData(null); - } - - const ring = () => - { - if(!doorData || !doorData.roomInfo) return; - - CreateRoomSession(doorData.roomInfo.roomId); - - setDoorData(prevValue => - { - const newValue = { ...prevValue }; - - newValue.state = DoorStateType.STATE_PENDING_SERVER; - - return newValue; - }); - } - - const tryEntering = () => - { - if(!doorData || !doorData.roomInfo) return; - - CreateRoomSession(doorData.roomInfo.roomId, password); - - setDoorData(prevValue => - { - const newValue = { ...prevValue }; - - newValue.state = DoorStateType.STATE_PENDING_SERVER; - - return newValue; - }); - } - - useEffect(() => - { - if(!doorData || (doorData.state !== DoorStateType.STATE_NO_ANSWER)) return; - - GoToDesktop(); - }, [ doorData ]); - - if(!doorData || (doorData.state === DoorStateType.NONE) || (VISIBLE_STATES.indexOf(doorData.state) === -1)) return null; - - const isDoorbell = (DOORBELL_STATES.indexOf(doorData.state) >= 0); - - return ( - - - - - { doorData && doorData.roomInfo && doorData.roomInfo.roomName } - { (doorData.state === DoorStateType.START_DOORBELL) && - { LocalizeText('navigator.doorbell.info') } } - { (doorData.state === DoorStateType.STATE_WAITING) && - { LocalizeText('navigator.doorbell.waiting') } } - { (doorData.state === DoorStateType.STATE_NO_ANSWER) && - { LocalizeText('navigator.doorbell.no.answer') } } - { (doorData.state === DoorStateType.START_PASSWORD) && - { LocalizeText('navigator.password.info') } } - { (doorData.state === DoorStateType.STATE_WRONG_PASSWORD) && - { LocalizeText('navigator.password.retryinfo') } } - - { isDoorbell && - - { (doorData.state === DoorStateType.START_DOORBELL) && - } - - } - { !isDoorbell && - <> - - { LocalizeText('navigator.password.enter') } - setPassword(event.target.value) } /> - - - - - - } - - - ); -} diff --git a/src/components/navigator/views/NavigatorRoomCreatorView.tsx b/src/components/navigator/views/NavigatorRoomCreatorView.tsx deleted file mode 100644 index 95a5bd6..0000000 --- a/src/components/navigator/views/NavigatorRoomCreatorView.tsx +++ /dev/null @@ -1,122 +0,0 @@ -/* eslint-disable no-template-curly-in-string */ -import { CreateFlatMessageComposer, HabboClubLevelEnum } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { GetClubMemberLevel, GetConfigurationValue, IRoomModel, LocalizeText, SendMessageComposer } from '../../../api'; -import { Button, Column, Flex, Grid, LayoutCurrencyIcon, LayoutGridItem, Text } from '../../../common'; -import { useNavigator } from '../../../hooks'; - -export const NavigatorRoomCreatorView: FC<{}> = props => -{ - const [ maxVisitorsList, setMaxVisitorsList ] = useState(null); - const [ name, setName ] = useState(null); - const [ description, setDescription ] = useState(null); - const [ category, setCategory ] = useState(null); - const [ visitorsCount, setVisitorsCount ] = useState(null); - const [ tradesSetting, setTradesSetting ] = useState(0); - const [ roomModels, setRoomModels ] = useState([]); - const [ selectedModelName, setSelectedModelName ] = useState(''); - const { categories = null } = useNavigator(); - - const hcDisabled = GetConfigurationValue('hc.disabled', false); - - const getRoomModelImage = (name: string) => GetConfigurationValue('images.url') + `/navigator/models/model_${ name }.png`; - - const selectModel = (model: IRoomModel, index: number) => - { - if(!model || (model.clubLevel > GetClubMemberLevel())) return; - - setSelectedModelName(roomModels[index].name); - }; - - const createRoom = () => - { - SendMessageComposer(new CreateFlatMessageComposer(name, description, 'model_' + selectedModelName, Number(category), Number(visitorsCount), tradesSetting)); - }; - - useEffect(() => - { - if(!maxVisitorsList) - { - const list = []; - - for(let i = 10; i <= 100; i = i + 10) list.push(i); - - setMaxVisitorsList(list); - setVisitorsCount(list[0]); - } - }, [ maxVisitorsList ]); - - useEffect(() => - { - if(categories && categories.length) setCategory(categories[0].id); - }, [ categories ]); - - useEffect(() => - { - const models = GetConfigurationValue('navigator.room.models'); - - if(models && models.length) - { - setRoomModels(models); - setSelectedModelName(models[0].name); - } - }, []); - - return ( - - - - - { LocalizeText('navigator.createroom.roomnameinfo') } - setName(event.target.value) } placeholder={ LocalizeText('navigator.createroom.roomnameinfo') } /> - - - { LocalizeText('navigator.createroom.roomdescinfo') } - -
-
- - ); -} diff --git a/src/components/room/widgets/furniture/FurnitureStackHeightView.tsx b/src/components/room/widgets/furniture/FurnitureStackHeightView.tsx deleted file mode 100644 index d4d1039..0000000 --- a/src/components/room/widgets/furniture/FurnitureStackHeightView.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { FurnitureStackHeightComposer } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import ReactSlider from 'react-slider'; -import { LocalizeText, SendMessageComposer } from '../../../../api'; -import { Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; -import { useFurnitureStackHeightWidget } from '../../../../hooks'; - -export const FurnitureStackHeightView: FC<{}> = props => -{ - const { objectId = -1, height = 0, maxHeight = 40, onClose = null, updateHeight = null } = useFurnitureStackHeightWidget(); - const [ tempHeight, setTempHeight ] = useState(''); - - const updateTempHeight = (value: string) => - { - setTempHeight(value); - - const newValue = parseFloat(value); - - if(isNaN(newValue) || (newValue === height)) return; - - updateHeight(newValue); - } - - useEffect(() => - { - setTempHeight(height.toString()); - }, [ height ]); - - if(objectId === -1) return null; - - return ( - - - - { LocalizeText('widget.custom.stack.height.text') } - - updateHeight(event) } - renderThumb={ (props, state) =>
{ state.valueNow }
} /> - updateTempHeight(event.target.value) } /> -
- - - - -
-
- ); -} diff --git a/src/components/room/widgets/furniture/FurnitureStickieView.tsx b/src/components/room/widgets/furniture/FurnitureStickieView.tsx deleted file mode 100644 index 2f0e0fe..0000000 --- a/src/components/room/widgets/furniture/FurnitureStickieView.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { ColorUtils } from '../../../../api'; -import { DraggableWindow, DraggableWindowPosition } from '../../../../common'; -import { useFurnitureStickieWidget } from '../../../../hooks'; - -const STICKIE_COLORS = [ '9CCEFF','FF9CFF', '9CFF9C','FFFF33' ]; -const STICKIE_COLOR_NAMES = [ 'blue', 'pink', 'green', 'yellow' ]; -const STICKIE_TYPES = [ 'post_it','post_it_shakesp', 'post_it_dreams','post_it_xmas', 'post_it_vd', 'post_it_juninas' ]; -const STICKIE_TYPE_NAMES = [ 'post_it', 'shakesp', 'dreams', 'christmas', 'heart', 'juninas' ]; - -const getStickieColorName = (color: string) => -{ - let index = STICKIE_COLORS.indexOf(color); - - if(index === -1) index = 0; - - return STICKIE_COLOR_NAMES[index]; -} - -const getStickieTypeName = (type: string) => -{ - let index = STICKIE_TYPES.indexOf(type); - - if(index === -1) index = 0; - - return STICKIE_TYPE_NAMES[index]; -} - -export const FurnitureStickieView: FC<{}> = props => -{ - const { objectId = -1, color = '0', text = '', type = '', canModify = false, updateColor = null, updateText = null, trash = null, onClose = null } = useFurnitureStickieWidget(); - const [ isEditing, setIsEditing ] = useState(false); - - useEffect(() => - { - setIsEditing(false); - }, [ objectId, color, text, type ]); - - if(objectId === -1) return null; - - return ( - -
-
-
- { canModify && - <> -
- { type == 'post_it' && - <> - { STICKIE_COLORS.map(color => - { - return
updateColor(color) } style={ { backgroundColor: ColorUtils.makeColorHex(color) } } /> - }) } - } - } -
-
-
-
- { (!isEditing || !canModify) ?
(canModify && setIsEditing(true)) }>{ text }
: } -
-
- - ); -} diff --git a/src/components/room/widgets/furniture/FurnitureTrophyView.tsx b/src/components/room/widgets/furniture/FurnitureTrophyView.tsx deleted file mode 100644 index 7977097..0000000 --- a/src/components/room/widgets/furniture/FurnitureTrophyView.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { FC } from 'react'; -import { LayoutTrophyView } from '../../../../common'; -import { useFurnitureTrophyWidget } from '../../../../hooks'; - -export const FurnitureTrophyView: FC<{}> = props => -{ - const { objectId = -1, color = '1', senderName = '', date = '', message = '', onClose = null } = useFurnitureTrophyWidget(); - - if(objectId === -1) return null; - - return ; -} diff --git a/src/components/room/widgets/furniture/FurnitureWidgets.scss b/src/components/room/widgets/furniture/FurnitureWidgets.scss deleted file mode 100644 index 65b6559..0000000 --- a/src/components/room/widgets/furniture/FurnitureWidgets.scss +++ /dev/null @@ -1,526 +0,0 @@ -.nitro-room-widgets { - pointer-events: none; -} - -.nitro-widget-custom-stack-height { - width: $nitro-widget-custom-stack-height-width; - height: $nitro-widget-custom-stack-height-height; -} - -.nitro-room-widget-toner { - width: 190px; -} - -.nitro-room-widget-dimmer { - width: 275px; - - .dimmer-banner { - width: 56px; - height: 79px; - background: url('@/assets/images/room-widgets/dimmer-widget/dimmer_banner.png') - center no-repeat; - } - - .color-swatch { - height: 30px; - border: 2px solid $white; - box-shadow: inset 3px 3px rgba(0, 0, 0, 0.2); - - &.active { - box-shadow: none; - } - } -} - -.nitro-widget-crafting { - width: $nitro-widget-crafting-width; - height: $nitro-widget-crafting-height; -} - -.nitro-widget-exchange-credit { - width: $nitro-widget-exchange-credit-width; - height: $nitro-widget-exchange-credit-height; - - .exchange-image { - background-image: url('@/assets/images/room-widgets/exchange-credit/exchange-credit-image.png'); - width: 103px; - height: 103px; - } -} - -.nitro-external-image-widget { - .picture-preview { - width: 320px; - height: 320px; - } - - .picture-preview-buttons { - display: flex; - align-items: center; - justify-content: space-between; - color: black; - } - - .picture-preview-buttons-previous, - .picture-preview-buttons-next { - color: #222; - background-color: white; - padding: 10px; - border-radius: 50%; - } -} - -.nitro-gift-opening { - width: 340px; - resize: none; -} - -.nitro-mannequin { - width: 300px; - - .mannequin-preview { - display: flex; - justify-content: center; - align-items: center; - width: 83px; - height: 130px; - background-image: url('@/assets/images/room-widgets/mannequin-widget/mannequin-spritesheet.png'); - overflow: hidden; - - .avatar-image { - background-position: unset; - top: -8px; - } - } -} - -.nitro-stickie { - position: relative; - width: 185px; - height: 178px; - top: 25px; - left: 25px; - padding: 1px; - pointer-events: all; - - .stickie-header { - width: 183px; - height: 18px; - padding: 0 7px; - - .header-trash, - .header-close { - cursor: pointer; - } - - .stickie-color { - width: 10px; - height: 10px; - cursor: pointer; - } - } - - .stickie-context { - width: 183px; - height: 145px; - padding: 2px 7px; - font-size: 12px; - color: $black; - - .context-text { - width: 100%; - height: 100%; - padding: 0; - overflow-wrap: break-word; - white-space: break-spaces; - overflow-y: auto; - } - - textarea { - background: transparent; - border: 0; - outline: none; - box-shadow: none; - resize: none; - font-style: italic; - - &:active { - border: 0; - outline: none; - box-shadow: none; - } - } - } -} - -.nitro-stickie-image { - background-image: url('@/assets/images/room-widgets/stickie-widget/stickie-spritesheet.png'); - - &.stickie-blue, - &.stickie-yellow, - &.stickie-green, - &.stickie-pink { - width: 185px; - height: 178px; - } - - &.stickie-blue { - background-position: -2px -2px; - } - - &.stickie-yellow { - background-image: url('@/assets/images/room-widgets/stickie-widget/stickie-yellow.png'); - //background-position: -191px -184px; - } - - &.stickie-green { - background-position: -191px -2px; - } - - &.stickie-pink { - background-position: -2px -184px; - } - - &.stickie-christmas { - background-image: url('@/assets/images/room-widgets/stickie-widget/stickie-christmas.png'); - } - - &.stickie-shakesp { - background-image: url('@/assets/images/room-widgets/stickie-widget/stickie-shakesp.png'); - } - - &.stickie-dreams { - background-image: url('@/assets/images/room-widgets/stickie-widget/stickie-dreams.png'); - } - - &.stickie-heart { - background-image: url('@/assets/images/room-widgets/stickie-widget/stickie-heart.png'); - } - - &.stickie-juninas { - background-image: url('@/assets/images/room-widgets/stickie-widget/stickie-juninas.png'); - } - - &.stickie-close { - width: 10px; - height: 10px; - background-position: -2px -366px; - } - - &.stickie-trash { - width: 9px; - height: 10px; - background-position: -16px -366px; - } -} - -.nitro-engraving-lock { - width: 300px; - - .engraving-lock-stage-1 { - width: 31px; - height: 39px; - background-position: -380px -43px; - background-image: url('@/assets/images/room-widgets/engraving-lock-widget/engraving-lock-spritesheet.png'); - } - - .engraving-lock-stage-2 { - width: 36px; - height: 43px; - background-position: -375px 0px; - background-image: url('@/assets/images/room-widgets/engraving-lock-widget/engraving-lock-spritesheet.png'); - } -} - -.nitro-engraving-lock-view { - width: 375px; - height: 210px; - background-position: 0px 0px; - background-image: url('@/assets/images/room-widgets/engraving-lock-widget/engraving-lock-spritesheet.png'); - - color: #622e54; - font-weight: bold; - font-size: 16px; - text-shadow: 0px 1px white; - - &.engraving-lock-3 { - background-position: 0px -210px; - color: #614110; - } - - &.engraving-lock-4 { - background-position: 0px -420px; - color: #f1dcc8; - text-shadow: 0px 2px rgba(0, 0, 0, 0.4); - - .engraving-lock-avatar { - margin-bottom: 10px; - } - } - - .engraving-lock-close { - position: absolute; - cursor: pointer; - width: 15px; - height: 15px; - top: 34px; - right: 27px; - } - - .engraving-lock-avatar { - width: 70px; - height: 120px; - - div { - position: absolute; - margin-top: -5px; - } - - &:nth-child(1) { - div { - margin-left: -10px; - } - } - - &:nth-child(2) { - div { - margin-left: -15px; - } - } - } -} - -.nitro-widget-high-score { - width: 250px; - max-width: 250px; - height: 200px; -} - -.youtube-tv-widget { - width: 600px; - height: 380px; - - .youtube-video-container { - .empty-video { - background-color: black; - color: white; - width: 100%; - height: 100%; - text-align: center; - } - - .youtubeContainer { - position: relative; - width: 100%; - height: 100%; - overflow: hidden; - margin-bottom: 50px; - } - - .youtubeContainer iframe { - width: 100%; - height: 100%; - position: absolute; - top: 0; - left: 0; - } - } - - .playlist-container { - overflow-y: auto; - margin-right: -10px; - color: black; - height: 100%; - - .playlist-controls { - width: 100%; - .icon { - margin-right: 10px; - margin-bottom: 10px; - } - } - - .playlist-grid { - height: 100%; - width: 100%; - } - } -} - -.nitro-playlist-editor-widget { - width: 625px; - height: 440px; - - img.my-music { - position: absolute; - top: -4px; - left: -4px; - z-index: 0; - } - - img.playlist-img { - position: absolute; - top: -4px; - left: 0; - z-index: 0; - } - - img.get-more, - img.add-songs { - position: absolute; - bottom: 0; - left: 0; - z-index: 0; - } - - .playlist-bottom { - z-index: 3; - } - - .move-disk { - width: 22px; - height: 18px; - background-image: url('@/assets/images/room-widgets/playlist-editor/move.png'); - } - - .disk-2, - .disk-image { - background-blend-mode: multiply; - } - - .disk-2 { - width: 38px; - height: 38px; - background-image: url('@/assets/images/room-widgets/playlist-editor/disk_2.png'); - background-position: center; - background-repeat: no-repeat; - - &.playing-song { - background-image: url('@/assets/images/room-widgets/playlist-editor/playing.png'); - } - - &.selected-song { - background-image: url('@/assets/images/room-widgets/playlist-editor/move.png'); - transform: scaleX(-1); - } - - &:not(.playing-song):not(.selected-song) { - -webkit-mask-image: url('@/assets/images/room-widgets/playlist-editor/disk_2.png'); - mask-image: url('@/assets/images/room-widgets/playlist-editor/disk_2.png'); - } - } - - .pause-song { - width: 18px; - height: 20px; - background-image: url('@/assets/images/room-widgets/playlist-editor/pause.png'); - } - - .pause-btn { - width: 16px; - height: 16px; - - background-image: url('@/assets/images/room-widgets/playlist-editor/pause-btn.png'); - } - - .music-note { - width: 38px; - height: 38px; - background-image: url('@/assets/images/room-widgets/playlist-editor/playing.png'); - } - - .preview-song { - width: 16px; - height: 16px; - background-image: url('@/assets/images/room-widgets/playlist-editor/preview.png'); - } - - .layout-grid-item { - min-height: 95px; - min-width: 95px; - position: relative; - - .disk-image { - background: url('@/assets/images/room-widgets/playlist-editor/disk_image.png'); - -webkit-mask-image: url('@/assets/images/room-widgets/playlist-editor/disk_image.png'); - mask-image: url('@/assets/images/room-widgets/playlist-editor/disk_image.png'); - height: 76px; - width: 76px; - } - } -} - -.nitro-mysterybox-dialog { - width: 375px; - height: 210px; - - .prize-container { - height: 80px; - width: 81px; - background-image: url('@/assets/images/prize/prize_background.png'); - background-repeat: no-repeat; - background-position: center; - } -} - -.nitro-mysterytrophy-dialog -{ - .mysterytrophy-dialog-top - { - width: 400px; - height: 120px; - border-radius: 2px; - background-color: #0E3F52; - - .mysterytrophy-image - { - width: 80px; - height: 84px; - position: relative; - background-image: url('@/assets/images/mysterytrophy/frank_mystery_trophy.png'); - background-repeat: no-repeat; - } - - .mysterytrophy-text-big - { - font-size: 16px; - } - } - - .mysterytrophy-dialog-bottom - { - display: flex; - justify-content: center; - width: 400px; - height: 120px; - border-radius: 2px; - background-color: #E9E9E1; - - .input-mysterytrophy-dialog - { - width: 380px; - border: 1px solid black; - - .input-mysterytrophy - { - width: 350px; - border: 0; - outline: 0; - } - - .mysterytrophy-pencil-image - { - width: 16px; - height: 16px; - position: relative; - background-image: url('@/assets/images/infostand/pencil-icon.png'); - background-repeat: no-repeat; - } - } - - .text-decoration - { - text-decoration: underline; - } - } -} diff --git a/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx b/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx deleted file mode 100644 index d0e4066..0000000 --- a/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { FC } from 'react'; -import { Base } from '../../../../common'; -import { FurnitureContextMenuView } from './context-menu/FurnitureContextMenuView'; -import { FurnitureBackgroundColorView } from './FurnitureBackgroundColorView'; -import { FurnitureBadgeDisplayView } from './FurnitureBadgeDisplayView'; -import { FurnitureCraftingView } from './FurnitureCraftingView'; -import { FurnitureDimmerView } from './FurnitureDimmerView'; -import { FurnitureExchangeCreditView } from './FurnitureExchangeCreditView'; -import { FurnitureExternalImageView } from './FurnitureExternalImageView'; -import { FurnitureFriendFurniView } from './FurnitureFriendFurniView'; -import { FurnitureGiftOpeningView } from './FurnitureGiftOpeningView'; -import { FurnitureHighScoreView } from './FurnitureHighScoreView'; -import { FurnitureInternalLinkView } from './FurnitureInternalLinkView'; -import { FurnitureMannequinView } from './FurnitureMannequinView'; -import { FurnitureRoomLinkView } from './FurnitureRoomLinkView'; -import { FurnitureSpamWallPostItView } from './FurnitureSpamWallPostItView'; -import { FurnitureStackHeightView } from './FurnitureStackHeightView'; -import { FurnitureStickieView } from './FurnitureStickieView'; -import { FurnitureTrophyView } from './FurnitureTrophyView'; -import { FurnitureYoutubeDisplayView } from './FurnitureYoutubeDisplayView'; -import { FurniturePlaylistEditorWidgetView } from './playlist-editor/FurniturePlaylistEditorWidgetView'; - -export const FurnitureWidgetsView: FC<{}> = props => -{ - return ( - - - - - - - - - - - - - - - - - - - - - - ); -} diff --git a/src/components/room/widgets/furniture/FurnitureYoutubeDisplayView.tsx b/src/components/room/widgets/furniture/FurnitureYoutubeDisplayView.tsx deleted file mode 100644 index fba0f67..0000000 --- a/src/components/room/widgets/furniture/FurnitureYoutubeDisplayView.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import YouTube, { Options } from 'react-youtube'; -import { YouTubePlayer } from 'youtube-player/dist/types'; -import { LocalizeText, YoutubeVideoPlaybackStateEnum } from '../../../../api'; -import { AutoGrid, AutoGridProps, LayoutGridItem, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; -import { useFurnitureYoutubeWidget } from '../../../../hooks'; - -interface FurnitureYoutubeDisplayViewProps extends AutoGridProps -{ - -} - -export const FurnitureYoutubeDisplayView: FC<{}> = FurnitureYoutubeDisplayViewProps => -{ - const [ player, setPlayer ] = useState(null); - const { objectId = -1, videoId = null, videoStart = 0, videoEnd = 0, currentVideoState = null, selectedVideo = null, playlists = [], onClose = null, previous = null, next = null, pause = null, play = null, selectVideo = null } = useFurnitureYoutubeWidget(); - - const onStateChange = (event: { target: YouTubePlayer; data: number }) => - { - setPlayer(event.target); - - if(objectId === -1) return; - - switch(event.target.getPlayerState()) - { - case -1: - case 1: - if(currentVideoState === 2) - { - //event.target.pauseVideo(); - } - - if(currentVideoState !== 1) play(); - return; - case 2: - if(currentVideoState !== 2) pause(); - } - } - - useEffect(() => - { - if((currentVideoState === null) || !player) return; - - if((currentVideoState === YoutubeVideoPlaybackStateEnum.PLAYING) && (player.getPlayerState() !== YoutubeVideoPlaybackStateEnum.PLAYING)) - { - player.playVideo(); - - return; - } - - if((currentVideoState === YoutubeVideoPlaybackStateEnum.PAUSED) && (player.getPlayerState() !== YoutubeVideoPlaybackStateEnum.PAUSED)) - { - player.pauseVideo(); - - return; - } - }, [ currentVideoState, player ]); - - if(objectId === -1) return null; - - const youtubeOptions: Options = { - height: '375', - width: '500', - playerVars: { - autoplay: 1, - disablekb: 1, - controls: 0, - origin: window.origin, - modestbranding: 1, - start: videoStart, - end: videoEnd - } - } - - return ( - - - -
-
- { (videoId && videoId.length > 0) && - setPlayer(event.target) } onStateChange={ onStateChange } containerClassName={ 'youtubeContainer' } /> - } - { (!videoId || videoId.length === 0) && -
{ LocalizeText('widget.furni.video_viewer.no_videos') }
- } -
-
- - - - -
{ LocalizeText('widget.furni.video_viewer.playlists') }
- - { playlists && playlists.map((entry, index) => - { - return ( - selectVideo(entry.video) } itemActive={ (entry.video === selectedVideo) }> - { entry.title } - - ) - }) } - -
-
-
-
- ) -} diff --git a/src/components/room/widgets/furniture/context-menu/EffectBoxConfirmView.tsx b/src/components/room/widgets/furniture/context-menu/EffectBoxConfirmView.tsx deleted file mode 100644 index f7e35b9..0000000 --- a/src/components/room/widgets/furniture/context-menu/EffectBoxConfirmView.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { FC } from 'react'; -import { LocalizeText } from '../../../../../api'; -import { Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { useRoom } from '../../../../../hooks'; - -interface EffectBoxConfirmViewProps -{ - objectId: number; - onClose: () => void; -} - -export const EffectBoxConfirmView: FC = props => -{ - const { objectId = -1, onClose = null } = props; - const { roomSession = null } = useRoom(); - - const useProduct = () => - { - roomSession.useMultistateItem(objectId); - - onClose(); - } - - return ( - - - - - - { LocalizeText('effectbox.header.description') } - - - - - - - - - ); -} diff --git a/src/components/room/widgets/furniture/context-menu/FurnitureContextMenuView.tsx b/src/components/room/widgets/furniture/context-menu/FurnitureContextMenuView.tsx deleted file mode 100644 index d58d369..0000000 --- a/src/components/room/widgets/furniture/context-menu/FurnitureContextMenuView.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import { ContextMenuEnum, CustomUserNotificationMessageEvent, GetSessionDataManager, RoomObjectCategory } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { GetGroupInformation, LocalizeText } from '../../../../../api'; -import { EFFECTBOX_OPEN, GROUP_FURNITURE, MONSTERPLANT_SEED_CONFIRMATION, MYSTERYTROPHY_OPEN_DIALOG, PURCHASABLE_CLOTHING_CONFIRMATION, useFurnitureContextMenuWidget, useMessageEvent, useNotification } from '../../../../../hooks'; -import { ContextMenuHeaderView } from '../../context-menu/ContextMenuHeaderView'; -import { ContextMenuListItemView } from '../../context-menu/ContextMenuListItemView'; -import { ContextMenuView } from '../../context-menu/ContextMenuView'; -import { FurnitureMysteryBoxOpenDialogView } from '../FurnitureMysteryBoxOpenDialogView'; -import { FurnitureMysteryTrophyOpenDialogView } from '../FurnitureMysteryTrophyOpenDialogView'; -import { EffectBoxConfirmView } from './EffectBoxConfirmView'; -import { MonsterPlantSeedConfirmView } from './MonsterPlantSeedConfirmView'; -import { PurchasableClothingConfirmView } from './PurchasableClothingConfirmView'; - -export const FurnitureContextMenuView: FC<{}> = props => -{ - const { closeConfirm = null, processAction = null, onClose = null, objectId = -1, mode = null, confirmMode = null, confirmingObjectId = -1, groupData = null, isGroupMember = false, objectOwnerId = -1 } = useFurnitureContextMenuWidget(); - const { simpleAlert = null } = useNotification(); - - useMessageEvent(CustomUserNotificationMessageEvent, event => - { - const parser = event.getParser(); - - if(!parser) return; - - // HOPPER_NO_COSTUME = 1; HOPPER_NO_HC = 2; GATE_NO_HC = 3; STARS_NOT_CANDIDATE = 4 (not coded in Emulator); STARS_NOT_ENOUGH_USERS = 5 (not coded in Emulator); - - switch(parser.count) - { - case 1: - simpleAlert(LocalizeText('costumehopper.costumerequired.bodytext'), null, 'catalog/open/temporary_effects' , LocalizeText('costumehopper.costumerequired.buy'), LocalizeText('costumehopper.costumerequired.header'), null); - break; - case 2: - simpleAlert(LocalizeText('viphopper.viprequired.bodytext'), null, 'catalog/open/habbo_club' , LocalizeText('viprequired.buy.vip'), LocalizeText('viprequired.header'), null); - break; - case 3: - simpleAlert(LocalizeText('gate.viprequired.bodytext'), null, 'catalog/open/habbo_club' , LocalizeText('viprequired.buy.vip'), LocalizeText('gate.viprequired.title'), null); - break; - } - }); - - const isOwner = GetSessionDataManager().userId === objectOwnerId; - - return ( - <> - { (confirmMode === MONSTERPLANT_SEED_CONFIRMATION) && - } - { (confirmMode === PURCHASABLE_CLOTHING_CONFIRMATION) && - } - { (confirmMode === EFFECTBOX_OPEN) && - } - { (confirmMode === MYSTERYTROPHY_OPEN_DIALOG) && - } - - { (objectId >= 0) && mode && - - { (mode === ContextMenuEnum.FRIEND_FURNITURE) && - <> - - { LocalizeText('friendfurni.context.title') } - - processAction('use_friend_furni') }> - { LocalizeText('friendfurni.context.use') } - - } - { (mode === ContextMenuEnum.MONSTERPLANT_SEED) && - <> - - { LocalizeText('furni.mnstr_seed.name') } - - processAction('use_monsterplant_seed') }> - { LocalizeText('widget.monsterplant_seed.button.use') } - - } - { (mode === ContextMenuEnum.RANDOM_TELEPORT) && - <> - - { LocalizeText('furni.random_teleport.name') } - - processAction('use_random_teleport') }> - { LocalizeText('widget.random_teleport.button.use') } - - } - { (mode === ContextMenuEnum.PURCHASABLE_CLOTHING) && - <> - - { LocalizeText('furni.generic_usable.name') } - - processAction('use_purchaseable_clothing') }> - { LocalizeText('widget.generic_usable.button.use') } - - } - { (mode === ContextMenuEnum.MYSTERY_BOX) && - <> - - { LocalizeText('mysterybox.context.title') } - - processAction('use_mystery_box') }> - { LocalizeText('mysterybox.context.' + ((isOwner) ? 'owner' : 'other') + '.use') } - - } - { (mode === ContextMenuEnum.MYSTERY_TROPHY) && - <> - - { LocalizeText('mysterytrophy.header.title') } - - processAction('use_mystery_trophy') }> - { LocalizeText('friendfurni.context.use') } - - } - { (mode === GROUP_FURNITURE) && groupData && - <> - GetGroupInformation(groupData.guildId) }> - { groupData.guildName } - - { !isGroupMember && - processAction('join_group') }> - { LocalizeText('widget.furniture.button.join.group') } - } - processAction('go_to_group_homeroom') }> - { LocalizeText('widget.furniture.button.go.to.group.home.room') } - - { groupData.guildHasReadableForum && - processAction('open_forum') }> - { LocalizeText('widget.furniture.button.open_group_forum') } - } - } - } - - ) -} diff --git a/src/components/room/widgets/furniture/context-menu/MonsterPlantSeedConfirmView.tsx b/src/components/room/widgets/furniture/context-menu/MonsterPlantSeedConfirmView.tsx deleted file mode 100644 index b7163cc..0000000 --- a/src/components/room/widgets/furniture/context-menu/MonsterPlantSeedConfirmView.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { IFurnitureData, RoomObjectCategory } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { FurniCategory, GetFurnitureDataForRoomObject, LocalizeText } from '../../../../../api'; -import { Base, Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { useRoom } from '../../../../../hooks'; - -interface MonsterPlantSeedConfirmViewProps -{ - objectId: number; - onClose: () => void; -} - -const MODE_DEFAULT: number = -1; -const MODE_MONSTERPLANT_SEED: number = 0; - -export const MonsterPlantSeedConfirmView: FC = props => -{ - const { objectId = -1, onClose = null } = props; - const [ furniData, setFurniData ] = useState(null); - const [ mode, setMode ] = useState(MODE_DEFAULT); - const { roomSession = null } = useRoom(); - - const useProduct = () => - { - roomSession.useMultistateItem(objectId); - - onClose(); - } - - useEffect(() => - { - if(!roomSession || (objectId === -1)) return; - - const furniData = GetFurnitureDataForRoomObject(roomSession.roomId, objectId, RoomObjectCategory.FLOOR); - - if(!furniData) return; - - setFurniData(furniData); - - let mode = MODE_DEFAULT; - - switch(furniData.specialType) - { - case FurniCategory.MONSTERPLANT_SEED: - mode = MODE_MONSTERPLANT_SEED; - break; - } - - if(mode === MODE_DEFAULT) - { - onClose(); - - return; - } - - setMode(mode); - }, [ roomSession, objectId, onClose ]); - - if(mode === MODE_DEFAULT) return null; - - return ( - - - - - - - - - - - - { LocalizeText('useproduct.widget.text.plant_seed', [ 'productName' ], [ furniData.name ] ) } - { LocalizeText('useproduct.widget.info.plant_seed') } - - - - - - - - - - ); -} diff --git a/src/components/room/widgets/furniture/context-menu/PurchasableClothingConfirmView.tsx b/src/components/room/widgets/furniture/context-menu/PurchasableClothingConfirmView.tsx deleted file mode 100644 index 5ba9905..0000000 --- a/src/components/room/widgets/furniture/context-menu/PurchasableClothingConfirmView.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { GetAvatarRenderManager, GetSessionDataManager, RedeemItemClothingComposer, RoomObjectCategory, UserFigureComposer } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { FigureData, FurniCategory, GetFurnitureDataForRoomObject, LocalizeText, SendMessageComposer } from '../../../../../api'; -import { Base, Button, Column, Flex, LayoutAvatarImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { useRoom } from '../../../../../hooks'; - -interface PurchasableClothingConfirmViewProps -{ - objectId: number; - onClose: () => void; -} - -const MODE_DEFAULT: number = -1; -const MODE_PURCHASABLE_CLOTHING: number = 0; - -export const PurchasableClothingConfirmView: FC = props => -{ - const { objectId = -1, onClose = null } = props; - const [ mode, setMode ] = useState(MODE_DEFAULT); - const [ gender, setGender ] = useState(FigureData.MALE); - const [ newFigure, setNewFigure ] = useState(null); - const { roomSession = null } = useRoom(); - - const useProduct = () => - { - SendMessageComposer(new RedeemItemClothingComposer(objectId)); - SendMessageComposer(new UserFigureComposer(gender, newFigure)); - - onClose(); - } - - useEffect(() => - { - let mode = MODE_DEFAULT; - - const figure = GetSessionDataManager().figure; - const gender = GetSessionDataManager().gender; - const validSets: number[] = []; - - if(roomSession && (objectId >= 0)) - { - const furniData = GetFurnitureDataForRoomObject(roomSession.roomId, objectId, RoomObjectCategory.FLOOR); - - if(furniData) - { - switch(furniData.specialType) - { - case FurniCategory.FIGURE_PURCHASABLE_SET: - mode = MODE_PURCHASABLE_CLOTHING; - - const setIds = furniData.customParams.split(',').map(part => parseInt(part)); - - for(const setId of setIds) - { - if(GetAvatarRenderManager().isValidFigureSetForGender(setId, gender)) validSets.push(setId); - } - - break; - } - } - } - - if(mode === MODE_DEFAULT) - { - onClose(); - - return; - } - - setGender(gender); - setNewFigure(GetAvatarRenderManager().getFigureStringWithFigureIds(figure, gender, validSets)); - - // if owns clothing, change to it - - setMode(mode); - }, [ roomSession, objectId, onClose ]); - - if(mode === MODE_DEFAULT) return null; - - return ( - - - - - - - - - - - - { LocalizeText('useproduct.widget.text.bind_clothing') } - { LocalizeText('useproduct.widget.info.bind_clothing') } - - - - - - - - - - ); -} diff --git a/src/components/room/widgets/furniture/playlist-editor/DiskInventoryView.tsx b/src/components/room/widgets/furniture/playlist-editor/DiskInventoryView.tsx deleted file mode 100644 index baf1bbf..0000000 --- a/src/components/room/widgets/furniture/playlist-editor/DiskInventoryView.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import { CreateLinkEvent, GetSoundManager, IAdvancedMap, MusicPriorities } from '@nitrots/nitro-renderer'; -import { FC, MouseEvent, useCallback, useEffect, useState } from 'react'; -import { CatalogPageName, GetConfigurationValue, GetDiskColor, LocalizeText } from '../../../../../api'; -import { AutoGrid, Base, Button, Flex, LayoutGridItem, Text } from '../../../../../common'; - -export interface DiskInventoryViewProps -{ - diskInventory: IAdvancedMap; - addToPlaylist: (diskId: number, slotNumber: number) => void; -} - -export const DiskInventoryView: FC = props => -{ - const { diskInventory = null, addToPlaylist = null } = props; - const [ selectedItem, setSelectedItem ] = useState(-1); - const [ previewSongId, setPreviewSongId ] = useState(-1); - - const previewSong = useCallback((event: MouseEvent, songId: number) => - { - event.stopPropagation(); - - setPreviewSongId(prevValue => (prevValue === songId) ? -1 : songId); - }, []); - - const addSong = useCallback((event: MouseEvent, diskId: number) => - { - event.stopPropagation(); - - addToPlaylist(diskId, GetSoundManager().musicController?.getRoomItemPlaylist()?.length) - }, [ addToPlaylist ]); - - const openCatalogPage = () => - { - CreateLinkEvent('catalog/open/' + CatalogPageName.TRAX_SONGS); - } - - useEffect(() => - { - if(previewSongId === -1) return; - - GetSoundManager().musicController?.playSong(previewSongId, MusicPriorities.PRIORITY_SONG_PLAY, 0, 0, 0, 0); - - return () => - { - GetSoundManager().musicController?.stop(MusicPriorities.PRIORITY_SONG_PLAY); - } - }, [ previewSongId ]); - - useEffect(() => - { - return () => setPreviewSongId(-1); - }, []); - - return (<> -
- -

{ LocalizeText('playlist.editor.my.music') }

-
-
- - { diskInventory && diskInventory.getKeys().map( (key, index) => - { - const diskId = diskInventory.getKey(index); - const songId = diskInventory.getWithIndex(index); - const songInfo = GetSoundManager().musicController?.getSongInfo(songId); - - return ( - setSelectedItem(prev => prev === index ? -1 : index) } classNames={ [ 'text-black' ] }> -
-
- { songInfo?.name } - { (selectedItem === index) && - - - - - } -
) - }) } -
-
-
-
{ LocalizeText('playlist.editor.text.get.more.music') }
-
{ LocalizeText('playlist.editor.text.you.have.no.songdisks.available') }
-
{ LocalizeText('playlist.editor.text.you.can.buy.some.from.the.catalogue') }
- -
- - ); -} diff --git a/src/components/room/widgets/furniture/playlist-editor/FurniturePlaylistEditorWidgetView.tsx b/src/components/room/widgets/furniture/playlist-editor/FurniturePlaylistEditorWidgetView.tsx deleted file mode 100644 index ceb0db9..0000000 --- a/src/components/room/widgets/furniture/playlist-editor/FurniturePlaylistEditorWidgetView.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { FC } from 'react'; -import { LocalizeText } from '../../../../../api'; -import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../common'; -import { useFurniturePlaylistEditorWidget } from '../../../../../hooks'; -import { DiskInventoryView } from './DiskInventoryView'; -import { SongPlaylistView } from './SongPlaylistView'; - -export const FurniturePlaylistEditorWidgetView: FC<{}> = props => -{ - const { objectId = -1, currentPlayingIndex = -1, playlist = null, diskInventory = null, onClose = null, togglePlayPause = null, removeFromPlaylist = null, addToPlaylist = null } = useFurniturePlaylistEditorWidget(); - - if(objectId === -1) return null; - - return ( - - - -
-
- -
-
- -
-
-
-
- ); -} diff --git a/src/components/room/widgets/furniture/playlist-editor/SongPlaylistView.tsx b/src/components/room/widgets/furniture/playlist-editor/SongPlaylistView.tsx deleted file mode 100644 index 3e88329..0000000 --- a/src/components/room/widgets/furniture/playlist-editor/SongPlaylistView.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import { ISongInfo } from '@nitrots/nitro-renderer'; -import { FC, useState } from 'react'; -import { GetConfigurationValue, GetDiskColor, LocalizeText } from '../../../../../api'; -import { Base, Button, Flex, Text } from '../../../../../common'; - -export interface SongPlaylistViewProps -{ - furniId: number; - playlist: ISongInfo[]; - currentPlayingIndex: number; - removeFromPlaylist(slotNumber: number): void; - togglePlayPause(furniId: number, position: number): void; -} - -export const SongPlaylistView: FC = props => -{ - const { furniId = -1, playlist = null, currentPlayingIndex = -1, removeFromPlaylist = null, togglePlayPause = null } = props; - const [ selectedItem, setSelectedItem ] = useState(-1); - - const action = (index: number) => - { - if(selectedItem === index) removeFromPlaylist(index); - } - - const playPause = (furniId: number, selectedItem: number) => - { - togglePlayPause(furniId, selectedItem !== -1 ? selectedItem : 0 ) - } - - return (<> -
- -

{ LocalizeText('playlist.editor.playlist') }

-
-
- - { playlist && playlist.map( (songInfo, index) => - { - return setSelectedItem(prev => prev === index ? -1 : index) }> - action(index) } className={ 'disk-2 ' + (selectedItem === index ? 'selected-song' : '') } style={ { backgroundColor: (selectedItem === index ? '' : GetDiskColor(songInfo.songData)) } }/> - { songInfo.name } - - }) } - - -
- { (!playlist || playlist.length === 0 ) && - <>
-
{ LocalizeText('playlist.editor.add.songs.to.your.playlist') }
-
{ LocalizeText('playlist.editor.text.click.song.to.choose.click.again.to.move') }
-
- - } - { (playlist && playlist.length > 0) && - <> - { (currentPlayingIndex === -1) && - - } - { (currentPlayingIndex !== -1) && - - - - { LocalizeText('playlist.editor.text.now.playing.in.your.room') } - - { playlist[currentPlayingIndex]?.name + ' - ' + playlist[currentPlayingIndex]?.creator } - - - - - } - - } - - ); -} diff --git a/src/components/room/widgets/mysterybox/MysteryBoxExtensionView.scss b/src/components/room/widgets/mysterybox/MysteryBoxExtensionView.scss deleted file mode 100644 index 254821c..0000000 --- a/src/components/room/widgets/mysterybox/MysteryBoxExtensionView.scss +++ /dev/null @@ -1,52 +0,0 @@ -.mysterybox-extension { - - .mysterybox-container { - max-width: 50px; - max-height: 50px; - width: 50px; - height: 50px; - - background-color: rgba(28, 28, 32, 0.95); - box-shadow: inset 0px 5px rgb(34 34 39 / 60%), inset 0 -4px rgb(18 18 21 / 60%); - border-color: #5b5a57; - } - - .box-image { - width: 31px; - height: 36px; - position: relative; - background-image: url('@/assets/images/mysterybox/mystery_box.png'); - -webkit-mask-image: url('@/assets/images/mysterybox/mystery_box.png'); - mask-image: url('@/assets/images/mysterybox/mystery_box.png'); - - .chain-overlay-image { - width: 31px; - height: 36px; - position: absolute; - background-image: url('@/assets/images/mysterybox/chain_mysterybox_box_overlay.png'); - } - } - - .key-image { - width: 39px; - height: 39px; - position: relative; - background-image: url('@/assets/images/mysterybox/mystery_box_key.png'); - -webkit-mask-image: url('@/assets/images/mysterybox/mystery_box_key.png'); - mask-image: url('@/assets/images/mysterybox/mystery_box_key.png'); - - .key-overlay-image { - width: 39px; - height: 39px; - position: absolute; - background-image: url('@/assets/images/mysterybox/key_overlay.png'); - } - } - - .box-image, - .key-image { - background-blend-mode: multiply; - background-position: center; - background-repeat: no-repeat; - } -} diff --git a/src/components/room/widgets/mysterybox/MysteryBoxExtensionView.tsx b/src/components/room/widgets/mysterybox/MysteryBoxExtensionView.tsx deleted file mode 100644 index 3f69826..0000000 --- a/src/components/room/widgets/mysterybox/MysteryBoxExtensionView.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { MysteryBoxKeysUpdateEvent } from '@nitrots/nitro-renderer'; -import { FC, useState } from 'react'; -import { FaChevronDown, FaChevronUp } from 'react-icons/fa'; -import { ColorUtils, LocalizeText } from '../../../../api'; -import { Base, Column, Flex, LayoutGridItem, Text } from '../../../../common'; -import { useNitroEvent } from '../../../../hooks'; - -const colorMap = { - 'purple': 9452386, - 'blue': 3891856, - 'green': 6459451, - 'yellow': 10658089, - 'lilac': 6897548, - 'orange': 10841125, - 'turquoise': 2661026, - 'red': 10104881 -} - -export const MysteryBoxExtensionView: FC<{}> = props => -{ - const [ isOpen, setIsOpen ] = useState(true); - const [ keyColor, setKeyColor ] = useState(''); - const [ boxColor, setBoxColor ] = useState(''); - - useNitroEvent(MysteryBoxKeysUpdateEvent.MYSTERY_BOX_KEYS_UPDATE, event => - { - setKeyColor(event.keyColor); - setBoxColor(event.boxColor); - }); - - const getRgbColor = (color: string) => - { - const colorInt = colorMap[color]; - - return ColorUtils.int2rgb(colorInt); - } - - if(keyColor === '' && boxColor === '') return null; - - return ( - - - setIsOpen(value => !value) }> - { LocalizeText('mysterybox.tracker.title') } - { isOpen && } - { !isOpen && } - - { isOpen && - <> - { LocalizeText('mysterybox.tracker.description') } - - -
-
-
- - -
-
-
- - - } - - - ); -} diff --git a/src/components/room/widgets/object-location/ObjectLocationView.tsx b/src/components/room/widgets/object-location/ObjectLocationView.tsx deleted file mode 100644 index 237090b..0000000 --- a/src/components/room/widgets/object-location/ObjectLocationView.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { GetTicker } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useRef, useState } from 'react'; -import { GetRoomObjectBounds, GetRoomSession } from '../../../../api'; -import { Base, BaseProps } from '../../../../common'; - -interface ObjectLocationViewProps extends BaseProps -{ - objectId: number; - category: number; - noFollow?: boolean; -} - -export const ObjectLocationView: FC = props => -{ - const { objectId = -1, category = -1, noFollow = false, position = 'absolute', ...rest } = props; - const [ pos, setPos ] = useState<{ x: number, y: number }>({ x: -1, y: -1 }); - const elementRef = useRef(); - - useEffect(() => - { - let remove = false; - - const getObjectLocation = () => - { - const roomSession = GetRoomSession(); - const objectBounds = GetRoomObjectBounds(roomSession.roomId, objectId, category, 1); - - return objectBounds; - } - - const updatePosition = () => - { - const bounds = getObjectLocation(); - - if(!bounds || !elementRef.current) return; - - setPos({ - x: Math.round(((bounds.left + (bounds.width / 2)) - (elementRef.current.offsetWidth / 2))), - y: Math.round((bounds.top - elementRef.current.offsetHeight) + 10) - }); - } - - if(noFollow) - { - updatePosition(); - } - else - { - remove = true; - - GetTicker().add(updatePosition); - } - - return () => - { - if(remove) GetTicker().remove(updatePosition); - } - }, [ objectId, category, noFollow ]); - - return -1 } className="object-location" style={ { left: pos.x, top: pos.y } } { ...rest } />; -} diff --git a/src/components/room/widgets/pet-package/PetPackageWidgetView.scss b/src/components/room/widgets/pet-package/PetPackageWidgetView.scss deleted file mode 100644 index 97a6d2e..0000000 --- a/src/components/room/widgets/pet-package/PetPackageWidgetView.scss +++ /dev/null @@ -1,106 +0,0 @@ -.nitro-pet-package -{ - .pet-package-container-top - { - width: 400px; - height: 120px; - border-radius: 2px; - background-color: #0E3F52; - - .package-image-gnome_box - { - width: 80px; - height: 84px; - position: relative; - background-image: url('@/assets/images/pets/pet-package/gnome.png'); - background-repeat: no-repeat; - } - - .package-image-leprechaun_box - { - width: 80px; - height: 84px; - position: relative; - background-image: url('@/assets/images/pets/pet-package/leprechaun_box.png'); - background-repeat: no-repeat; - } - - .package-image-val11_present - { - width: 80px; - height: 84px; - position: relative; - background-image: url('@/assets/images/pets/pet-package/val11_present.png'); - background-repeat: no-repeat; - } - - .package-image-velociraptor_egg - { - width: 80px; - height: 84px; - position: relative; - background-image: url('@/assets/images/pets/pet-package/velociraptor_egg.png'); - background-repeat: no-repeat; - } - - .package-image-pterosaur_egg - { - width: 80px; - height: 84px; - position: relative; - background-image: url('@/assets/images/pets/pet-package/pterosaur_egg.png'); - background-repeat: no-repeat; - } - - .package-image-petbox_epic - { - width: 80px; - height: 84px; - position: relative; - background-image: url('@/assets/images/pets/pet-package/petbox_epic.png'); - background-repeat: no-repeat; - } - - .package-text-big - { - font-size: 16px; - } - } - - .pet-package-container-bottom - { - display: flex; - justify-content: center; - width: 400px; - height: 120px; - border-radius: 2px; - background-color: #E9E9E1; - - .input-pet-package-container - { - width: 380px; - border: 1px solid black; - - .input-pet-package - { - width: 350px; - border: 0; - outline: 0; - } - - .package-pencil-image - { - width: 16px; - height: 16px; - position: relative; - background-image: url('@/assets/images/infostand/pencil-icon.png'); - background-repeat: no-repeat; - } - } - - .text-decoration - { - text-decoration: underline; - } - } -} diff --git a/src/components/room/widgets/pet-package/PetPackageWidgetView.tsx b/src/components/room/widgets/pet-package/PetPackageWidgetView.tsx deleted file mode 100644 index e204f5e..0000000 --- a/src/components/room/widgets/pet-package/PetPackageWidgetView.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { FC } from 'react'; -import { Button } from 'react-bootstrap'; -import { GetConfigurationValue, LocalizeText } from '../../../../api'; -import { Base, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; -import { usePetPackageWidget } from '../../../../hooks'; - -export const PetPackageWidgetView: FC<{}> = props => -{ - const { isVisible = false, errorResult = null, petName = null, objectType = null, onChangePetName = null, onConfirm = null, onClose = null } = usePetPackageWidget(); - - return ( - <> - { isVisible && - - onClose() } /> - - -
-
- { objectType === 'gnome_box' ? LocalizeText('widgets.gnomepackage.name.title') : LocalizeText('furni.petpackage') } -
-
- - - - onChangePetName(event.target.value) } /> -
-
- { (errorResult.length > 0) && - { errorResult } } - - onClose() }>{ LocalizeText('cancel') } - - -
-
-
-
- } - - ); -} diff --git a/src/components/room/widgets/room-filter-words/RoomFilterWordsWidgetView.tsx b/src/components/room/widgets/room-filter-words/RoomFilterWordsWidgetView.tsx deleted file mode 100644 index 4f7825f..0000000 --- a/src/components/room/widgets/room-filter-words/RoomFilterWordsWidgetView.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import { UpdateRoomFilterMessageComposer } from '@nitrots/nitro-renderer'; -import { FC, useState } from 'react'; -import { LocalizeText, SendMessageComposer } from '../../../../api'; -import { Button, classNames, Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; -import { useFilterWordsWidget, useNavigator } from '../../../../hooks'; - -export const RoomFilterWordsWidgetView: FC<{}> = props => -{ - const [ word, setWord ] = useState('bobba'); - const [ selectedWord, setSelectedWord ] = useState(''); - const [ isSelectingWord, setIsSelectingWord ] = useState(false); - const { wordsFilter = [], isVisible = null, setWordsFilter, onClose = null } = useFilterWordsWidget(); - const { navigatorData = null } = useNavigator(); - - const processAction = (isAddingWord: boolean) => - { - if ((isSelectingWord) ? (!selectedWord) : (!word)) return; - - SendMessageComposer(new UpdateRoomFilterMessageComposer(navigatorData.enteredGuestRoom.roomId, isAddingWord, (isSelectingWord ? selectedWord : word))); - setSelectedWord(''); - setWord('bobba'); - setIsSelectingWord(false); - - if (isAddingWord && wordsFilter.includes((isSelectingWord ? selectedWord : word))) return; - - setWordsFilter(prevValue => - { - const newWords = [ ...prevValue ]; - - isAddingWord ? newWords.push((isSelectingWord ? selectedWord : word)) : newWords.splice(newWords.indexOf((isSelectingWord ? selectedWord : word)), 1); - - return newWords; - }); - } - - const onTyping = (word: string) => - { - setWord(word); - setIsSelectingWord(false); - } - - const onSelectedWord = (word: string) => - { - setSelectedWord(word); - setIsSelectingWord(true); - } - - if (!isVisible) return null; - - return ( - - onClose() } /> - - - onTyping(event.target.value) } /> - - - - { wordsFilter && (wordsFilter.length > 0) && wordsFilter.map((word, index) => - { - return ( - onSelectedWord(word) }> - { word } - - ) - }) } - - - - - - - ); -}; diff --git a/src/components/room/widgets/room-promotes/RoomPromotesWidgetView.tsx b/src/components/room/widgets/room-promotes/RoomPromotesWidgetView.tsx deleted file mode 100644 index b97b35a..0000000 --- a/src/components/room/widgets/room-promotes/RoomPromotesWidgetView.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { DesktopViewEvent, GetSessionDataManager } from '@nitrots/nitro-renderer'; -import { FC, useState } from 'react'; -import { FaChevronDown, FaChevronUp } from 'react-icons/fa'; -import { Base, Column, Flex, Text } from '../../../../common'; -import { useMessageEvent, useRoomPromote } from '../../../../hooks'; -import { RoomPromoteEditWidgetView, RoomPromoteMyOwnEventWidgetView, RoomPromoteOtherEventWidgetView } from './views'; - -export const RoomPromotesWidgetView: FC<{}> = props => -{ - const [ isEditingPromote, setIsEditingPromote ] = useState(false); - const [ isOpen, setIsOpen ] = useState(true); - const { promoteInformation, setPromoteInformation } = useRoomPromote(); - - useMessageEvent(DesktopViewEvent, event => - { - setPromoteInformation(null); - }); - - if(!promoteInformation) return null; - - return ( - <> - { promoteInformation.data.adId !== -1 && - - - setIsOpen(value => !value) }> - { promoteInformation.data.eventName } - { isOpen && } - { !isOpen && } - - { (isOpen && GetSessionDataManager().userId !== promoteInformation.data.ownerAvatarId) && - - } - { (isOpen && GetSessionDataManager().userId === promoteInformation.data.ownerAvatarId) && - setIsEditingPromote(true) } - /> - } - { isEditingPromote && - setIsEditingPromote(false) } - /> - } - - - } - - ); -}; diff --git a/src/components/room/widgets/room-promotes/views/RoomPromoteEditWidgetView.tsx b/src/components/room/widgets/room-promotes/views/RoomPromoteEditWidgetView.tsx deleted file mode 100644 index f9b8462..0000000 --- a/src/components/room/widgets/room-promotes/views/RoomPromoteEditWidgetView.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { EditEventMessageComposer } from '@nitrots/nitro-renderer'; -import { FC, useState } from 'react'; -import { LocalizeText, SendMessageComposer } from '../../../../../api'; -import { Button, Column, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; - -interface RoomPromoteEditWidgetViewProps -{ - eventId: number; - eventName: string; - eventDescription: string; - setIsEditingPromote: (value: boolean) => void; -} - -export const RoomPromoteEditWidgetView: FC = props => -{ - const { eventId = -1, eventName = '', eventDescription = '', setIsEditingPromote = null } = props; - const [ newEventName, setNewEventName ] = useState(eventName); - const [ newEventDescription, setNewEventDescription ] = useState(eventDescription); - - const updatePromote = () => - { - SendMessageComposer(new EditEventMessageComposer(eventId, newEventName, newEventDescription)); - setIsEditingPromote(false); - } - - return ( - - setIsEditingPromote(false) } /> - - - { LocalizeText('navigator.eventsettings.name') } - setNewEventName(event.target.value) } /> - - - { LocalizeText('navigator.eventsettings.desc') } - - - - - - - - ); -}; diff --git a/src/components/room/widgets/room-promotes/views/RoomPromoteMyOwnEventWidgetView.tsx b/src/components/room/widgets/room-promotes/views/RoomPromoteMyOwnEventWidgetView.tsx deleted file mode 100644 index 01a5f78..0000000 --- a/src/components/room/widgets/room-promotes/views/RoomPromoteMyOwnEventWidgetView.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { CreateLinkEvent } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { LocalizeText } from '../../../../../api'; -import { Button, Flex, Grid, Text } from '../../../../../common'; -import { useRoomPromote } from '../../../../../hooks'; - -interface RoomPromoteMyOwnEventWidgetViewProps -{ - eventDescription: string; - setIsEditingPromote: (value: boolean) => void; -} - -export const RoomPromoteMyOwnEventWidgetView: FC = props => -{ - const { eventDescription = '', setIsEditingPromote = null } = props; - const { setIsExtended } = useRoomPromote(); - - const extendPromote = () => - { - setIsExtended(true); - CreateLinkEvent('catalog/open/room_event'); - } - - return ( - <> - - { eventDescription } - -

- - - - - - ); -}; diff --git a/src/components/room/widgets/room-promotes/views/RoomPromoteOtherEventWidgetView.tsx b/src/components/room/widgets/room-promotes/views/RoomPromoteOtherEventWidgetView.tsx deleted file mode 100644 index 5adb517..0000000 --- a/src/components/room/widgets/room-promotes/views/RoomPromoteOtherEventWidgetView.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { FC } from 'react'; -import { LocalizeText } from '../../../../../api'; -import { Base, Column, Flex, Text } from '../../../../../common'; - -interface RoomPromoteOtherEventWidgetViewProps -{ - eventDescription: string; -} - -export const RoomPromoteOtherEventWidgetView: FC = props => -{ - const { eventDescription = '' } = props; - - return ( - <> - - { eventDescription } - -

- - - - { LocalizeText('navigator.eventinprogress') } - -   - - - - ); -}; diff --git a/src/components/room/widgets/room-promotes/views/index.ts b/src/components/room/widgets/room-promotes/views/index.ts deleted file mode 100644 index da74691..0000000 --- a/src/components/room/widgets/room-promotes/views/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './RoomPromoteEditWidgetView'; -export * from './RoomPromoteMyOwnEventWidgetView'; -export * from './RoomPromoteOtherEventWidgetView'; diff --git a/src/components/room/widgets/room-thumbnail/RoomThumbnailWidgetView.tsx b/src/components/room/widgets/room-thumbnail/RoomThumbnailWidgetView.tsx deleted file mode 100644 index edcb3ec..0000000 --- a/src/components/room/widgets/room-thumbnail/RoomThumbnailWidgetView.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { GetRoomEngine, NitroRenderTexture } from '@nitrots/nitro-renderer'; -import { FC, useState } from 'react'; -import { LayoutMiniCameraView } from '../../../../common'; -import { RoomWidgetThumbnailEvent } from '../../../../events'; -import { useRoom, useUiEvent } from '../../../../hooks'; - -export const RoomThumbnailWidgetView: FC<{}> = props => -{ - const [ isVisible, setIsVisible ] = useState(false); - const { roomSession = null } = useRoom(); - - useUiEvent([ - RoomWidgetThumbnailEvent.SHOW_THUMBNAIL, - RoomWidgetThumbnailEvent.HIDE_THUMBNAIL, - RoomWidgetThumbnailEvent.TOGGLE_THUMBNAIL ], event => - { - switch(event.type) - { - case RoomWidgetThumbnailEvent.SHOW_THUMBNAIL: - setIsVisible(true); - return; - case RoomWidgetThumbnailEvent.HIDE_THUMBNAIL: - setIsVisible(false); - return; - case RoomWidgetThumbnailEvent.TOGGLE_THUMBNAIL: - setIsVisible(value => !value); - return; - } - }); - - const receiveTexture = async (texture: NitroRenderTexture) => - { - await GetRoomEngine().saveTextureAsScreenshot(texture, true); - - setIsVisible(false); - } - - if(!isVisible) return null; - - return setIsVisible(false) } /> -}; diff --git a/src/components/room/widgets/room-tools/RoomToolsWidgetView.tsx b/src/components/room/widgets/room-tools/RoomToolsWidgetView.tsx deleted file mode 100644 index 76fd022..0000000 --- a/src/components/room/widgets/room-tools/RoomToolsWidgetView.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import { CreateLinkEvent, GetGuestRoomResultEvent, GetRoomEngine, NavigatorSearchComposer, RateFlatMessageComposer } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, SendMessageComposer } from '../../../../api'; -import { Base, Column, Flex, Text, TransitionAnimation, TransitionAnimationTypes, classNames } from '../../../../common'; -import { useMessageEvent, useNavigator, useRoom } from '../../../../hooks'; - -export const RoomToolsWidgetView: FC<{}> = props => -{ - const [ isZoomedIn, setIsZoomedIn ] = useState(false); - const [ roomName, setRoomName ] = useState(null); - const [ roomOwner, setRoomOwner ] = useState(null); - const [ roomTags, setRoomTags ] = useState(null); - const [ isOpen, setIsOpen ] = useState(false); - const { navigatorData = null } = useNavigator(); - const { roomSession = null } = useRoom(); - - const handleToolClick = (action: string, value?: string) => - { - switch(action) - { - case 'settings': - CreateLinkEvent('navigator/toggle-room-info'); - return; - case 'zoom': - setIsZoomedIn(prevValue => - { - let scale = GetRoomEngine().getRoomInstanceRenderingCanvasScale(roomSession.roomId, 1); - - if(!prevValue) scale /= 2; - else scale *= 2; - - GetRoomEngine().setRoomInstanceRenderingCanvasScale(roomSession.roomId, 1, scale); - - return !prevValue; - }); - return; - case 'chat_history': - CreateLinkEvent('chat-history/toggle'); - return; - case 'like_room': - SendMessageComposer(new RateFlatMessageComposer(1)); - return; - case 'toggle_room_link': - CreateLinkEvent('navigator/toggle-room-link'); - return; - case 'navigator_search_tag': - CreateLinkEvent(`navigator/search/${ value }`); - SendMessageComposer(new NavigatorSearchComposer('hotel_view', `tag:${ value }`)); - return; - } - } - - useMessageEvent(GetGuestRoomResultEvent, event => - { - const parser = event.getParser(); - - if(!parser.roomEnter || (parser.data.roomId !== roomSession.roomId)) return; - - if(roomName !== parser.data.roomName) setRoomName(parser.data.roomName); - if(roomOwner !== parser.data.ownerName) setRoomOwner(parser.data.ownerName); - if(roomTags !== parser.data.tags) setRoomTags(parser.data.tags); - }); - - useEffect(() => - { - setIsOpen(true); - - const timeout = setTimeout(() => setIsOpen(false), 5000); - - return () => clearTimeout(timeout); - }, [ roomName, roomOwner, roomTags ]); - - return ( - - - handleToolClick('settings') } /> - handleToolClick('zoom') } className={ classNames('icon', (!isZoomedIn && 'icon-zoom-less'), (isZoomedIn && 'icon-zoom-more')) } /> - handleToolClick('chat_history') } className="icon icon-chat-history" /> - { navigatorData.canRate && - handleToolClick('like_room') } className="icon icon-like-room" /> } - - - - - - - { roomName } - { roomOwner } - - { roomTags && roomTags.length > 0 && - - { roomTags.map((tag, index) => handleToolClick('navigator_search_tag', tag) }>#{ tag }) } - } - - - - - - ); -} diff --git a/src/components/room/widgets/user-location/UserLocationView.tsx b/src/components/room/widgets/user-location/UserLocationView.tsx deleted file mode 100644 index ca281ec..0000000 --- a/src/components/room/widgets/user-location/UserLocationView.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { RoomObjectCategory } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { BaseProps } from '../../../../common'; -import { useRoom } from '../../../../hooks'; -import { ObjectLocationView } from '../object-location/ObjectLocationView'; - -interface UserLocationViewProps extends BaseProps -{ - userId: number; -} - -export const UserLocationView: FC = props => -{ - const { userId = -1, ...rest } = props; - const { roomSession = null } = useRoom(); - - if((userId === -1) || !roomSession) return null; - - const userData = roomSession.userDataManager.getUserData(userId); - - if(!userData) return null; - - return ; -} diff --git a/src/components/room/widgets/word-quiz/WordQuizQuestionView.tsx b/src/components/room/widgets/word-quiz/WordQuizQuestionView.tsx deleted file mode 100644 index 3b4d051..0000000 --- a/src/components/room/widgets/word-quiz/WordQuizQuestionView.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { FC } from 'react'; -import { VALUE_KEY_DISLIKE, VALUE_KEY_LIKE } from '../../../../api'; -import { Base, Column, Flex, Text } from '../../../../common'; - -interface WordQuizQuestionViewProps -{ - question: string; - canVote: boolean; - vote(value: string): void; - noVotes: number; - yesVotes: number; -} - -export const WordQuizQuestionView: FC = props => -{ - const { question = null, canVote = null, vote = null, noVotes = null, yesVotes = null } = props; - - return ( - - { !canVote && - - - { noVotes } - - { question } - - { yesVotes } - - } - { canVote && - - { question } - - vote(VALUE_KEY_DISLIKE) }> - - - vote(VALUE_KEY_LIKE) }> - - - - } - - ); -} diff --git a/src/components/room/widgets/word-quiz/WordQuizVoteView.tsx b/src/components/room/widgets/word-quiz/WordQuizVoteView.tsx deleted file mode 100644 index 8437d76..0000000 --- a/src/components/room/widgets/word-quiz/WordQuizVoteView.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { RoomObjectCategory } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { VALUE_KEY_DISLIKE } from '../../../../api'; -import { Base, BaseProps, Flex } from '../../../../common'; -import { ObjectLocationView } from '../object-location/ObjectLocationView'; - -interface WordQuizVoteViewProps extends BaseProps -{ - userIndex: number; - vote: string; -} - -export const WordQuizVoteView: FC = props => -{ - const { userIndex = null, vote = null, ...rest } = props; - - return ( - - - - - - ); -} diff --git a/src/components/room/widgets/word-quiz/WordQuizWidgetView.tsx b/src/components/room/widgets/word-quiz/WordQuizWidgetView.tsx deleted file mode 100644 index a04cfd8..0000000 --- a/src/components/room/widgets/word-quiz/WordQuizWidgetView.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { FC } from 'react'; -import { VALUE_KEY_DISLIKE, VALUE_KEY_LIKE } from '../../../../api'; -import { useWordQuizWidget } from '../../../../hooks'; -import { WordQuizQuestionView } from './WordQuizQuestionView'; -import { WordQuizVoteView } from './WordQuizVoteView'; - -export const WordQuizWidgetView: FC<{}> = props => -{ - const { question = null, answerSent = false, answerCounts = null, userAnswers = null, vote = null } = useWordQuizWidget(); - - return ( - <> - { question && - } - { userAnswers && - Array.from(userAnswers.entries()).map(([ key, value ], index) => ) } - - ); -} diff --git a/src/components/toolbar/ToolbarMeView.tsx b/src/components/toolbar/ToolbarMeView.tsx deleted file mode 100644 index d0329cc..0000000 --- a/src/components/toolbar/ToolbarMeView.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { CreateLinkEvent, GetRoomEngine, GetSessionDataManager, MouseEventType, RoomObjectCategory } from '@nitrots/nitro-renderer'; -import { Dispatch, FC, PropsWithChildren, SetStateAction, useEffect, useRef } from 'react'; -import { DispatchUiEvent, GetConfigurationValue, GetRoomSession, GetUserProfile } from '../../api'; -import { Base, Flex, LayoutItemCountView } from '../../common'; -import { GuideToolEvent } from '../../events'; - -interface ToolbarMeViewProps -{ - useGuideTool: boolean; - unseenAchievementCount: number; - setMeExpanded: Dispatch>; -} - -export const ToolbarMeView: FC> = props => -{ - const { useGuideTool = false, unseenAchievementCount = 0, setMeExpanded = null, children = null, ...rest } = props; - const elementRef = useRef(); - - useEffect(() => - { - const roomSession = GetRoomSession(); - - if(!roomSession) return; - - GetRoomEngine().selectRoomObject(roomSession.roomId, roomSession.ownRoomIndex, RoomObjectCategory.UNIT); - }, []); - - useEffect(() => - { - const onClick = (event: MouseEvent) => setMeExpanded(false); - - document.addEventListener('click', onClick); - - return () => document.removeEventListener(MouseEventType.MOUSE_CLICK, onClick); - }, [ setMeExpanded ]); - - return ( - - { (GetConfigurationValue('guides.enabled') && useGuideTool) && - DispatchUiEvent(new GuideToolEvent(GuideToolEvent.TOGGLE_GUIDE_TOOL)) } /> } - CreateLinkEvent('achievements/toggle') }> - { (unseenAchievementCount > 0) && - } - - GetUserProfile(GetSessionDataManager().userId) } /> - CreateLinkEvent('navigator/search/myworld_view') } /> - CreateLinkEvent('avatar-editor/toggle') } /> - CreateLinkEvent('user-settings/toggle') } /> - { children } - - ); -} diff --git a/src/components/toolbar/ToolbarView.scss b/src/components/toolbar/ToolbarView.scss deleted file mode 100644 index 6e7f651..0000000 --- a/src/components/toolbar/ToolbarView.scss +++ /dev/null @@ -1,81 +0,0 @@ -.nitro-toolbar { - position: absolute; - bottom: 0; - left: 0; - width: 100%; - height: $toolbar-height; - z-index: $toolbar-zindex; - pointer-events: all; - background: rgba($dark, 0.95); - box-shadow: inset 0px 5px lighten(rgba($dark, 0.6), 2.5), - inset 0 -4px darken(rgba($dark, 0.6), 4); - - .navigation-item { - position: relative; - - &.item-avatar { - width: 50px; - height: 45px; - overflow: hidden; - - .avatar-image { - margin-left: -5px; - margin-top: 25px; - } - } - - &:hover { - -webkit-transform: translate(-1px, -1px); - transform: translate(-1px, -1px); - filter: drop-shadow(2px 2px 0 rgba($black, 0.8)); - } - - &.active, - &:active { - -webkit-transform: unset; - transform: unset; - filter: none; - } - } - - #toolbar-chat-input-container { - - @include media-breakpoint-down(sm) { - width: 0px; - height: 0px; - } - } -} - -.nitro-toolbar-me { - position: absolute; - bottom: 60px; - left: 15px; - z-index: $toolbar-memenu-zindex; - background: rgba(20, 20, 20, .95); - border: 1px solid #101010; - box-shadow: inset 2px 2px rgba(255, 255, 255, .1), inset -2px -2px rgba(255, 255, 255, .1); - border-radius: $border-radius; - - .navigation-item { - transition: filter .2s ease-out; - filter: grayscale(1); - - &:hover { - filter: grayscale(0) drop-shadow(2px 2px 0 rgba($black, 0.8)); - } - } -} - -.toolbar-icon-animation { - position: absolute; - object-fit: cover; - height: auto; - width: auto; - max-width: 120px; - max-height: 150px; - z-index: 500; - filter: drop-shadow(2px 1px 0 rgba($white, 1)) - drop-shadow(-2px 1px 0 rgba($white, 1)) - drop-shadow(0 -2px 0 rgba($white, 1)); -} diff --git a/src/components/toolbar/ToolbarView.tsx b/src/components/toolbar/ToolbarView.tsx deleted file mode 100644 index 1fd6d2d..0000000 --- a/src/components/toolbar/ToolbarView.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import { CreateLinkEvent, Dispose, DropBounce, EaseOut, GetSessionDataManager, JumpBy, Motions, NitroToolbarAnimateIconEvent, PerkAllowancesMessageEvent, PerkEnum, Queue, Wait } from '@nitrots/nitro-renderer'; -import { FC, useState } from 'react'; -import { GetConfigurationValue, MessengerIconState, OpenMessengerChat, VisitDesktop } from '../../api'; -import { Base, Flex, LayoutAvatarImageView, LayoutItemCountView, TransitionAnimation, TransitionAnimationTypes } from '../../common'; -import { useAchievements, useFriends, useInventoryUnseenTracker, useMessageEvent, useMessenger, useNitroEvent, useSessionInfo } from '../../hooks'; -import { ToolbarMeView } from './ToolbarMeView'; - -export const ToolbarView: FC<{ isInRoom: boolean }> = props => -{ - const { isInRoom } = props; - const [ isMeExpanded, setMeExpanded ] = useState(false); - const [ useGuideTool, setUseGuideTool ] = useState(false); - const { userFigure = null } = useSessionInfo(); - const { getFullCount = 0 } = useInventoryUnseenTracker(); - const { getTotalUnseen = 0 } = useAchievements(); - const { requests = [] } = useFriends(); - const { iconState = MessengerIconState.HIDDEN } = useMessenger(); - const isMod = GetSessionDataManager().isModerator; - - useMessageEvent(PerkAllowancesMessageEvent, event => - { - const parser = event.getParser(); - - setUseGuideTool(parser.isAllowed(PerkEnum.USE_GUIDE_TOOL)); - }); - - useNitroEvent(NitroToolbarAnimateIconEvent.ANIMATE_ICON, event => - { - const animationIconToToolbar = (iconName: string, image: HTMLImageElement, x: number, y: number) => - { - const target = (document.body.getElementsByClassName(iconName)[0] as HTMLElement); - - if(!target) return; - - image.className = 'toolbar-icon-animation'; - image.style.visibility = 'visible'; - image.style.left = (x + 'px'); - image.style.top = (y + 'px'); - - document.body.append(image); - - const targetBounds = target.getBoundingClientRect(); - const imageBounds = image.getBoundingClientRect(); - - const left = (imageBounds.x - targetBounds.x); - const top = (imageBounds.y - targetBounds.y); - const squared = Math.sqrt(((left * left) + (top * top))); - const wait = (500 - Math.abs(((((1 / squared) * 100) * 500) * 0.5))); - const height = 20; - - const motionName = (`ToolbarBouncing[${ iconName }]`); - - if(!Motions.getMotionByTag(motionName)) - { - Motions.runMotion(new Queue(new Wait((wait + 8)), new DropBounce(target, 400, 12))).tag = motionName; - } - - const motion = new Queue(new EaseOut(new JumpBy(image, wait, ((targetBounds.x - imageBounds.x) + height), (targetBounds.y - imageBounds.y), 100, 1), 1), new Dispose(image)); - - Motions.runMotion(motion); - } - - animationIconToToolbar('icon-inventory', event.image, event.x, event.y); - }); - - return ( - <> - - - - - - - setMeExpanded(!isMeExpanded) }> - - { (getTotalUnseen > 0) && - } - - { isInRoom && - VisitDesktop() } /> } - { !isInRoom && - CreateLinkEvent('navigator/goto/home') } /> } - CreateLinkEvent('navigator/toggle') } /> - { GetConfigurationValue('game.center.enabled') && CreateLinkEvent('games/toggle') } /> } - CreateLinkEvent('catalog/toggle') } /> - CreateLinkEvent('inventory/toggle') }> - { (getFullCount > 0) && - } - - { isInRoom && - CreateLinkEvent('camera/toggle') } /> } - { isMod && - CreateLinkEvent('mod-tools/toggle') } /> } - - - - - - CreateLinkEvent('friends/toggle') }> - { (requests.length > 0) && - } - - { ((iconState === MessengerIconState.SHOW) || (iconState === MessengerIconState.UNREAD)) && - OpenMessengerChat() } /> } - - - - - - ); -} diff --git a/src/components/user-profile/UserProfileVew.scss b/src/components/user-profile/UserProfileVew.scss deleted file mode 100644 index edcfde6..0000000 --- a/src/components/user-profile/UserProfileVew.scss +++ /dev/null @@ -1,67 +0,0 @@ -.user-profile { - width: $user-profile-width; - height: $user-profile-height; - - .user-container { - border-right: 1px solid gray; - - .avatar-container { - width: 75px; - height: 120px; - } - } - - .rooms-button-container { - border-top: 1px solid gray; - border-bottom: 1px solid gray; - } - - .user-relationship { - height: 25px; - - .avatar-image-container { - width: 50px; - height: 50px; - - .avatar-image { - top: 20px; - right: -8pxpx; - } - } - } - - .user-relationship-count { - margin-top: 2px; - margin-left: 5px; - color: #939392 !important; - } - - .user-groups-container { - - .layout-grid-item { - width: 50px; - } - } - - .no-group-spritesheet { - background: transparent url('@/assets/images/groups/no-group-spritesheet.png') no-repeat; - - &.image-1 { - width: 95px; - height: 136px; - background-position: -3px -3px; - } - - &.image-2 { - width: 95px; - height: 136px; - background-position: -104px -3px; - } - - &.image-3 { - width: 95px; - height: 136px; - background-position: -205px -3px; - } - } -} diff --git a/src/components/user-profile/UserProfileView.tsx b/src/components/user-profile/UserProfileView.tsx deleted file mode 100644 index 64349b2..0000000 --- a/src/components/user-profile/UserProfileView.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import { CreateLinkEvent, ExtendedProfileChangedMessageEvent, GetSessionDataManager, RelationshipStatusInfoEvent, RelationshipStatusInfoMessageParser, RoomEngineObjectEvent, RoomObjectCategory, RoomObjectType, UserCurrentBadgesComposer, UserCurrentBadgesEvent, UserProfileEvent, UserProfileParser, UserRelationshipsComposer } from '@nitrots/nitro-renderer'; -import { FC, useState } from 'react'; -import { GetRoomSession, GetUserProfile, LocalizeText, SendMessageComposer } from '../../api'; -import { Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; -import { useMessageEvent, useNitroEvent } from '../../hooks'; -import { BadgesContainerView } from './views/BadgesContainerView'; -import { FriendsContainerView } from './views/FriendsContainerView'; -import { GroupsContainerView } from './views/GroupsContainerView'; -import { UserContainerView } from './views/UserContainerView'; - -export const UserProfileView: FC<{}> = props => -{ - const [ userProfile, setUserProfile ] = useState(null); - const [ userBadges, setUserBadges ] = useState([]); - const [ userRelationships, setUserRelationships ] = useState(null); - - const onClose = () => - { - setUserProfile(null); - setUserBadges([]); - setUserRelationships(null); - } - - const onLeaveGroup = () => - { - if(!userProfile || (userProfile.id !== GetSessionDataManager().userId)) return; - - GetUserProfile(userProfile.id); - } - - useMessageEvent(UserCurrentBadgesEvent, event => - { - const parser = event.getParser(); - - if(!userProfile || (parser.userId !== userProfile.id)) return; - - setUserBadges(parser.badges); - }); - - useMessageEvent(RelationshipStatusInfoEvent, event => - { - const parser = event.getParser(); - - if(!userProfile || (parser.userId !== userProfile.id)) return; - - setUserRelationships(parser); - }); - - useMessageEvent(UserProfileEvent, event => - { - const parser = event.getParser(); - - let isSameProfile = false; - - setUserProfile(prevValue => - { - if(prevValue && prevValue.id) isSameProfile = (prevValue.id === parser.id); - - return parser; - }); - - if(!isSameProfile) - { - setUserBadges([]); - setUserRelationships(null); - } - - SendMessageComposer(new UserCurrentBadgesComposer(parser.id)); - SendMessageComposer(new UserRelationshipsComposer(parser.id)); - }); - - useMessageEvent(ExtendedProfileChangedMessageEvent, event => - { - const parser = event.getParser(); - - if(parser.userId != userProfile?.id) return; - - GetUserProfile(parser.userId); - }); - - useNitroEvent(RoomEngineObjectEvent.SELECTED, event => - { - if(!userProfile) return; - - if(event.category !== RoomObjectCategory.UNIT) return; - - const userData = GetRoomSession().userDataManager.getUserDataByIndex(event.objectId); - - if(userData.type !== RoomObjectType.USER) return; - - GetUserProfile(userData.webID); - }); - - if(!userProfile) return null; - - return ( - - - - - - - - - - - - { userRelationships && - } - - - - CreateLinkEvent(`navigator/search/hotel_view/owner:${ userProfile.username }`) }> - - { LocalizeText('extendedprofile.rooms') } - - - - - - ) -} diff --git a/src/components/user-profile/views/BadgesContainerView.tsx b/src/components/user-profile/views/BadgesContainerView.tsx deleted file mode 100644 index ca59fc2..0000000 --- a/src/components/user-profile/views/BadgesContainerView.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { FC } from 'react'; -import { Column, FlexProps, LayoutBadgeImageView } from '../../../common'; - -interface BadgesContainerViewProps extends FlexProps -{ - badges: string[]; -} - -export const BadgesContainerView: FC = props => -{ - const { badges = null, gap = 1, justifyContent = 'between', ...rest } = props; - - return ( - <> - { badges && (badges.length > 0) && badges.map((badge, index) => - { - return ( - - - - ); - }) } - - ); -} diff --git a/src/components/user-profile/views/FriendsContainerView.tsx b/src/components/user-profile/views/FriendsContainerView.tsx deleted file mode 100644 index f5449d1..0000000 --- a/src/components/user-profile/views/FriendsContainerView.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { RelationshipStatusInfoMessageParser } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { LocalizeText } from '../../../api'; -import { Column, Text } from '../../../common'; -import { RelationshipsContainerView } from './RelationshipsContainerView'; - -interface FriendsContainerViewProps -{ - relationships: RelationshipStatusInfoMessageParser; - friendsCount: number; -} - -export const FriendsContainerView: FC = props => -{ - const { relationships = null, friendsCount = null } = props; - - return ( - - - { LocalizeText('extendedprofile.friends.count') } { friendsCount } - - { LocalizeText('extendedprofile.relstatus') } - - - - - ) -} diff --git a/src/components/user-profile/views/GroupsContainerView.tsx b/src/components/user-profile/views/GroupsContainerView.tsx deleted file mode 100644 index bd598ee..0000000 --- a/src/components/user-profile/views/GroupsContainerView.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import { GroupInformationComposer, GroupInformationEvent, GroupInformationParser, HabboGroupEntryData } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { SendMessageComposer, ToggleFavoriteGroup } from '../../../api'; -import { AutoGrid, Base, Column, Flex, Grid, GridProps, LayoutBadgeImageView, LayoutGridItem } from '../../../common'; -import { useMessageEvent } from '../../../hooks'; -import { GroupInformationView } from '../../groups/views/GroupInformationView'; - -interface GroupsContainerViewProps extends GridProps -{ - itsMe: boolean; - groups: HabboGroupEntryData[]; - onLeaveGroup: () => void; -} - -export const GroupsContainerView: FC = props => -{ - const { itsMe = null, groups = null, onLeaveGroup = null, overflow = 'hidden', gap = 2, ...rest } = props; - const [ selectedGroupId, setSelectedGroupId ] = useState(null); - const [ groupInformation, setGroupInformation ] = useState(null); - - useMessageEvent(GroupInformationEvent, event => - { - const parser = event.getParser(); - - if(!selectedGroupId || (selectedGroupId !== parser.id) || parser.flag) return; - - setGroupInformation(parser); - }); - - useEffect(() => - { - if(!selectedGroupId) return; - - SendMessageComposer(new GroupInformationComposer(selectedGroupId, false)); - }, [ selectedGroupId ]); - - useEffect(() => - { - setGroupInformation(null); - - if(groups.length > 0) - { - setSelectedGroupId(prevValue => - { - if(prevValue === groups[0].groupId) - { - SendMessageComposer(new GroupInformationComposer(groups[0].groupId, false)); - } - - return groups[0].groupId; - }); - } - }, [ groups ]); - - if(!groups || !groups.length) - { - return ( - - - - - - - - ); - } - - return ( - - - - { groups.map((group, index) => - { - return ( - setSelectedGroupId(group.groupId) } className="p-1"> - { itsMe && - ToggleFavoriteGroup(group) } /> } - - - ) - }) } - - - - { groupInformation && - } - - - ); -} diff --git a/src/components/user-profile/views/RelationshipsContainerView.tsx b/src/components/user-profile/views/RelationshipsContainerView.tsx deleted file mode 100644 index 9b698ec..0000000 --- a/src/components/user-profile/views/RelationshipsContainerView.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { RelationshipStatusEnum, RelationshipStatusInfoMessageParser } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { GetUserProfile, LocalizeText } from '../../../api'; -import { Column, Flex, LayoutAvatarImageView, Text } from '../../../common'; - -interface RelationshipsContainerViewProps -{ - relationships: RelationshipStatusInfoMessageParser; -} - -interface RelationshipsContainerRelationshipViewProps -{ - type: number; -} - -export const RelationshipsContainerView: FC = props => -{ - const { relationships = null } = props; - - const RelationshipComponent = ({ type }: RelationshipsContainerRelationshipViewProps) => - { - const relationshipInfo = (relationships && relationships.relationshipStatusMap.hasKey(type)) ? relationships.relationshipStatusMap.getValue(type) : null; - const relationshipName = RelationshipStatusEnum.RELATIONSHIP_NAMES[type].toLocaleLowerCase(); - - return ( - - - - - - - (relationshipInfo && (relationshipInfo.randomFriendId >= 1) && GetUserProfile(relationshipInfo.randomFriendId)) }> - { (!relationshipInfo || (relationshipInfo.friendCount === 0)) && - LocalizeText('extendedprofile.add.friends') } - { (relationshipInfo && (relationshipInfo.friendCount >= 1)) && - relationshipInfo.randomFriendName } - - { (relationshipInfo && (relationshipInfo.friendCount >= 1)) && - - - } - - - { (!relationshipInfo || (relationshipInfo.friendCount === 0)) && - LocalizeText('extendedprofile.no.friends.in.this.category') } - { (relationshipInfo && (relationshipInfo.friendCount > 1)) && - LocalizeText(`extendedprofile.relstatus.others.${ relationshipName }`, [ 'count' ], [ (relationshipInfo.friendCount - 1).toString() ]) } -   - - - - ); - } - - return ( - <> - - - - - ); -} diff --git a/src/components/user-profile/views/UserContainerView.tsx b/src/components/user-profile/views/UserContainerView.tsx deleted file mode 100644 index a83fb96..0000000 --- a/src/components/user-profile/views/UserContainerView.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import { GetSessionDataManager, RequestFriendComposer, UserProfileParser } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { FriendlyTime, LocalizeText, SendMessageComposer } from '../../../api'; -import { Column, Flex, LayoutAvatarImageView, Text } from '../../../common'; - -interface UserContainerViewProps -{ - userProfile: UserProfileParser; -} - -export const UserContainerView: FC = props => -{ - const { userProfile = null } = props; - const [ requestSent, setRequestSent ] = useState(userProfile.requestSent); - const isOwnProfile = (userProfile.id === GetSessionDataManager().userId); - const canSendFriendRequest = !requestSent && (!isOwnProfile && !userProfile.isMyFriend && !userProfile.requestSent); - - const addFriend = () => - { - setRequestSent(true); - - SendMessageComposer(new RequestFriendComposer(userProfile.username)); - } - - useEffect(() => - { - setRequestSent(userProfile.requestSent); - }, [ userProfile ]) - - return ( - - - - - - - { userProfile.username } - { userProfile.motto }  - - - - { LocalizeText('extendedprofile.created') } { userProfile.registration } - - - { LocalizeText('extendedprofile.last.login') } { FriendlyTime.format(userProfile.secondsSinceLastVisit, '.ago', 2) } - - - { LocalizeText('extendedprofile.achievementscore') } { userProfile.achievementPoints } - - - - { userProfile.isOnline && - } - { !userProfile.isOnline && - } - - { canSendFriendRequest && - { LocalizeText('extendedprofile.addasafriend') } } - { !canSendFriendRequest && - <> - - { isOwnProfile && - { LocalizeText('extendedprofile.me') } } - { userProfile.isMyFriend && - { LocalizeText('extendedprofile.friend') } } - { (requestSent || userProfile.requestSent) && - { LocalizeText('extendedprofile.friendrequestsent') } } - } - - - - - ) -} diff --git a/src/components/user-settings/UserSettingsView.tsx b/src/components/user-settings/UserSettingsView.tsx deleted file mode 100644 index 43a4f51..0000000 --- a/src/components/user-settings/UserSettingsView.tsx +++ /dev/null @@ -1,187 +0,0 @@ -import { AddLinkEventTracker, ILinkEventTracker, NitroSettingsEvent, RemoveLinkEventTracker, UserSettingsCameraFollowComposer, UserSettingsEvent, UserSettingsOldChatComposer, UserSettingsRoomInvitesComposer, UserSettingsSoundComposer } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { FaVolumeDown, FaVolumeMute, FaVolumeUp } from 'react-icons/fa'; -import { DispatchMainEvent, DispatchUiEvent, LocalizeText, SendMessageComposer } from '../../api'; -import { Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text, classNames } from '../../common'; -import { useCatalogPlaceMultipleItems, useCatalogSkipPurchaseConfirmation, useMessageEvent } from '../../hooks'; - -export const UserSettingsView: FC<{}> = props => -{ - const [ isVisible, setIsVisible ] = useState(false); - const [ userSettings, setUserSettings ] = useState(null); - const [ catalogPlaceMultipleObjects, setCatalogPlaceMultipleObjects ] = useCatalogPlaceMultipleItems(); - const [ catalogSkipPurchaseConfirmation, setCatalogSkipPurchaseConfirmation ] = useCatalogSkipPurchaseConfirmation(); - - const processAction = (type: string, value?: boolean | number | string) => - { - let doUpdate = true; - - const clone = userSettings.clone(); - - switch(type) - { - case 'close_view': - setIsVisible(false); - doUpdate = false; - return; - case 'oldchat': - clone.oldChat = value as boolean; - SendMessageComposer(new UserSettingsOldChatComposer(clone.oldChat)); - break; - case 'room_invites': - clone.roomInvites = value as boolean; - SendMessageComposer(new UserSettingsRoomInvitesComposer(clone.roomInvites)); - break; - case 'camera_follow': - clone.cameraFollow = value as boolean; - SendMessageComposer(new UserSettingsCameraFollowComposer(clone.cameraFollow)); - break; - case 'system_volume': - clone.volumeSystem = value as number; - clone.volumeSystem = Math.max(0, clone.volumeSystem); - clone.volumeSystem = Math.min(100, clone.volumeSystem); - break; - case 'furni_volume': - clone.volumeFurni = value as number; - clone.volumeFurni = Math.max(0, clone.volumeFurni); - clone.volumeFurni = Math.min(100, clone.volumeFurni); - break; - case 'trax_volume': - clone.volumeTrax = value as number; - clone.volumeTrax = Math.max(0, clone.volumeTrax); - clone.volumeTrax = Math.min(100, clone.volumeTrax); - break; - } - - if(doUpdate) setUserSettings(clone); - - DispatchMainEvent(clone) - } - - const saveRangeSlider = (type: string) => - { - switch(type) - { - case 'volume': - SendMessageComposer(new UserSettingsSoundComposer(Math.round(userSettings.volumeSystem), Math.round(userSettings.volumeFurni), Math.round(userSettings.volumeTrax))); - break; - } - } - - useMessageEvent(UserSettingsEvent, event => - { - const parser = event.getParser(); - const settingsEvent = new NitroSettingsEvent(); - - settingsEvent.volumeSystem = parser.volumeSystem; - settingsEvent.volumeFurni = parser.volumeFurni; - settingsEvent.volumeTrax = parser.volumeTrax; - settingsEvent.oldChat = parser.oldChat; - settingsEvent.roomInvites = parser.roomInvites; - settingsEvent.cameraFollow = parser.cameraFollow; - settingsEvent.flags = parser.flags; - settingsEvent.chatType = parser.chatType; - - setUserSettings(settingsEvent); - DispatchMainEvent(settingsEvent); - }); - - useEffect(() => - { - const linkTracker: ILinkEventTracker = { - linkReceived: (url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'show': - setIsVisible(true); - return; - case 'hide': - setIsVisible(false); - return; - case 'toggle': - setIsVisible(prevValue => !prevValue); - return; - } - }, - eventUrlPrefix: 'user-settings/' - }; - - AddLinkEventTracker(linkTracker); - - return () => RemoveLinkEventTracker(linkTracker); - }, []); - - useEffect(() => - { - if(!userSettings) return; - - DispatchUiEvent(userSettings); - }, [ userSettings ]); - - if(!isVisible || !userSettings) return null; - - return ( - - processAction('close_view') } /> - - - - processAction('oldchat', event.target.checked) } /> - { LocalizeText('memenu.settings.chat.prefer.old.chat') } - - - processAction('room_invites', event.target.checked) } /> - { LocalizeText('memenu.settings.other.ignore.room.invites') } - - - processAction('camera_follow', event.target.checked) } /> - { LocalizeText('memenu.settings.other.disable.room.camera.follow') } - - - setCatalogPlaceMultipleObjects(event.target.checked) } /> - { LocalizeText('memenu.settings.other.place.multiple.objects') } - - - setCatalogSkipPurchaseConfirmation(event.target.checked) } /> - { LocalizeText('memenu.settings.other.skip.purchase.confirmation') } - - - - { LocalizeText('widget.memenu.settings.volume') } - - { LocalizeText('widget.memenu.settings.volume.ui') } - - { (userSettings.volumeSystem === 0) && = 50) && 'text-muted', 'fa-icon') } /> } - { (userSettings.volumeSystem > 0) && = 50) && 'text-muted', 'fa-icon') } /> } - processAction('system_volume', event.target.value) } onMouseUp={ () => saveRangeSlider('volume') }/> - - - - - { LocalizeText('widget.memenu.settings.volume.furni') } - - { (userSettings.volumeFurni === 0) && = 50) && 'text-muted', 'fa-icon') } /> } - { (userSettings.volumeFurni > 0) && = 50) && 'text-muted', 'fa-icon') } /> } - processAction('furni_volume', event.target.value) } onMouseUp={ () => saveRangeSlider('volume') }/> - - - - - { LocalizeText('widget.memenu.settings.volume.trax') } - - { (userSettings.volumeTrax === 0) && = 50) && 'text-muted', 'fa-icon') } /> } - { (userSettings.volumeTrax > 0) && = 50) && 'text-muted', 'fa-icon') } /> } - processAction('trax_volume', event.target.value) } onMouseUp={ () => saveRangeSlider('volume') }/> - - - - - - - ); -} diff --git a/src/components/wired/WiredView.scss b/src/components/wired/WiredView.scss deleted file mode 100644 index 06569ad..0000000 --- a/src/components/wired/WiredView.scss +++ /dev/null @@ -1,175 +0,0 @@ -.nitro-wired { - width: 300px; - - .icon { - background-repeat: no-repeat; - background-position: center; - - &.icon-mv-1 { - width: 16px; - height: 9px; - background-image: url('@/assets/images/wired/icon_wired_around.png'); - } - &.icon-mv-2 { - width: 16px; - height: 9px; - background-image: url('@/assets/images/wired/icon_wired_up_down.png'); - } - &.icon-mv-3 { - width: 16px; - height: 9px; - background-image: url('@/assets/images/wired/icon_wired_left_right.png'); - } - &.icon-ne { - width: 16px; - height: 9px; - background-image: url('@/assets/images/wired/icon_wired_north_east.png'); - } - &.icon-se { - width: 16px; - height: 9px; - background-image: url('@/assets/images/wired/icon_wired_south_east.png'); - } - &.icon-sw { - width: 16px; - height: 9px; - background-image: url('@/assets/images/wired/icon_wired_south_west.png'); - } - &.icon-nw { - width: 16px; - height: 9px; - background-image: url('@/assets/images/wired/icon_wired_north_west.png'); - } - &.icon-rot-1 { - width: 16px; - height: 9px; - background-image: url('@/assets/images/wired/icon_wired_rotate_clockwise.png'); - } - &.icon-rot-2 { - width: 16px; - height: 9px; - background-image: url('@/assets/images/wired/icon_wired_rotate_counter_clockwise.png'); - } - } - - .nitro-wired-header { - color: #000; - margin-bottom:3px; - - .nitro-wired-title, .nitro-wired-close { - border:1px solid rgba($black,.8); - background-image: linear-gradient(45deg, #00d9cb 25%, #00bdb0 25%, #00bdb0 50%, #00d9cb 50%, #00d9cb 75%, #00bdb0 75%, #00bdb0 100%); - background-size: 197.99px 197.99px; - animation: wiredSlider 3s linear infinite; - text-align: center; - box-shadow:inset 0 0 0 2px rgba($white,.6), 0 2px rgba($black,.4); - } - - .nitro-wired-title { - margin-right:3px; - } - - .nitro-wired-close { - min-width: 23px; - } - } - - &.nitro-wired-trigger { - background-color: #3b2516 !important; - border: 1px solid #000 !important; - box-shadow: inset 0px -2px #50321f, - inset 0px -3px #86583b, - inset 0 0 0 1px #86583b, - inset 0 0 0 3px #644029, - inset 0 0 0 4px rgba($black,.4) !important; - - .bg-light,.bg-primary { - background-color: transparent !important; - } - - .bg-dark { - background-color: #000 !important; - } - } - - &.nitro-wired-action { - background-color: #686868 !important; - border: 1px solid #000 !important; - box-shadow: inset 0px -2px #9d9d9d, - inset 0px -3px #c5c5c5, - inset 0 0 0 1px #c5c5c5, - inset 0 0 0 3px #9d9d9d, - inset 0 0 0 4px rgba($black,.4) !important; - - .bg-light,.bg-primary { - background-color: transparent !important; - } - - .bg-dark { - background-color: #000 !important; - } - - &::before, - &::after, - .content-area::before, - .content-area::after { - content: ''; - height: 6px; - width: 6px; - position: absolute; - background-image: url('@/assets/images/wired/card-action-corners.png'); - } - - &::before { - background-position: 0 0; - top: 0; - left: 0; - } - - &::after { - background-position: 6px 0; - top: 0; - right: 0; - } - - .content-area { - &::before { - background-position: 0 6px; - bottom: 0; - left: 0; - } - - &::after { - background-position: 6px 6px; - bottom: 0; - right: 0; - } - } - } - - &.nitro-wired-condition { - background-color: #cfd2dd !important; - border: 1px solid #000 !important; - box-shadow: inset 0 0 0 3px #efefef, inset 4px 4px #abaeb9 !important; - color: #000; - - .bg-light,.bg-primary { - background-color: transparent !important; - } - - .bg-dark { - background-color: #000 !important; - } - } -} - - -@keyframes wiredSlider { - 0% { - background-position: 0 0; - } - - 100% { - background-position: 0 -197.99px; - } -} diff --git a/src/components/wired/WiredView.tsx b/src/components/wired/WiredView.tsx deleted file mode 100644 index cb3b4ba..0000000 --- a/src/components/wired/WiredView.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { ConditionDefinition, TriggerDefinition, WiredActionDefinition } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { useWired } from '../../hooks'; -import { WiredActionLayoutView } from './views/actions/WiredActionLayoutView'; -import { WiredConditionLayoutView } from './views/conditions/WiredConditionLayoutView'; -import { WiredTriggerLayoutView } from './views/triggers/WiredTriggerLayoutView'; - -export const WiredView: FC<{}> = props => -{ - const { trigger = null } = useWired(); - - if(!trigger) return null; - - if(trigger instanceof WiredActionDefinition) return WiredActionLayoutView(trigger.code); - - if(trigger instanceof TriggerDefinition) return WiredTriggerLayoutView(trigger.code); - - if(trigger instanceof ConditionDefinition) return WiredConditionLayoutView(trigger.code); - - return null; -}; diff --git a/src/components/wired/views/WiredBaseView.tsx b/src/components/wired/views/WiredBaseView.tsx deleted file mode 100644 index df5adc1..0000000 --- a/src/components/wired/views/WiredBaseView.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import { GetSessionDataManager } from '@nitrots/nitro-renderer'; -import { FC, PropsWithChildren, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType, WiredSelectionVisualizer } from '../../../api'; -import { Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; -import { useWired } from '../../../hooks'; -import { WiredFurniSelectorView } from './WiredFurniSelectorView'; - -export interface WiredBaseViewProps -{ - wiredType: string; - requiresFurni: number; - hasSpecialInput: boolean; - save: () => void; - validate?: () => boolean; -} - -export const WiredBaseView: FC> = props => -{ - const { wiredType = '', requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, validate = null, children = null, hasSpecialInput = false } = props; - const [ wiredName, setWiredName ] = useState(null); - const [ wiredDescription, setWiredDescription ] = useState(null); - const [ needsSave, setNeedsSave ] = useState(false); - const { trigger = null, setTrigger = null, setIntParams = null, setStringParam = null, setFurniIds = null, setAllowsFurni = null, saveWired = null } = useWired(); - - const onClose = () => setTrigger(null); - - const onSave = () => - { - if(validate && !validate()) return; - - if(save) save(); - - setNeedsSave(true); - } - - useEffect(() => - { - if(!needsSave) return; - - saveWired(); - - setNeedsSave(false); - }, [ needsSave, saveWired ]); - - useEffect(() => - { - if(!trigger) return; - - const spriteId = (trigger.spriteId || -1); - const furniData = GetSessionDataManager().getFloorItemData(spriteId); - - if(!furniData) - { - setWiredName(('NAME: ' + spriteId)); - setWiredDescription(('NAME: ' + spriteId)); - } - else - { - setWiredName(furniData.name); - setWiredDescription(furniData.description); - } - - if(hasSpecialInput) - { - setIntParams(trigger.intData); - setStringParam(trigger.stringData); - } - - if(requiresFurni > WiredFurniType.STUFF_SELECTION_OPTION_NONE) - { - setFurniIds(prevValue => - { - if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); - - if(trigger.selectedItems && trigger.selectedItems.length) - { - WiredSelectionVisualizer.applySelectionShaderToFurni(trigger.selectedItems); - - return trigger.selectedItems; - } - - return []; - }); - } - - setAllowsFurni(requiresFurni); - }, [ trigger, hasSpecialInput, requiresFurni, setIntParams, setStringParam, setFurniIds, setAllowsFurni ]); - - return ( - - - - - - - { wiredName } - - { wiredDescription } - - { !!children &&
} - { children } - { (requiresFurni > WiredFurniType.STUFF_SELECTION_OPTION_NONE) && - <> -
- - } - - - - -
-
- ); -} diff --git a/src/components/wired/views/WiredFurniSelectorView.tsx b/src/components/wired/views/WiredFurniSelectorView.tsx deleted file mode 100644 index 9b38f97..0000000 --- a/src/components/wired/views/WiredFurniSelectorView.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { FC } from 'react'; -import { LocalizeText } from '../../../api'; -import { Column, Text } from '../../../common'; -import { useWired } from '../../../hooks'; - -export const WiredFurniSelectorView: FC<{}> = props => -{ - const { trigger = null, furniIds = [] } = useWired(); - - return ( - - { LocalizeText('wiredfurni.pickfurnis.caption', [ 'count', 'limit' ], [ furniIds.length.toString(), trigger.maximumItemSelectionCount.toString() ]) } - { LocalizeText('wiredfurni.pickfurnis.desc') } - - ); -} diff --git a/src/components/wired/views/actions/WiredActionBaseView.tsx b/src/components/wired/views/actions/WiredActionBaseView.tsx deleted file mode 100644 index 6c7a86e..0000000 --- a/src/components/wired/views/actions/WiredActionBaseView.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { WiredActionDefinition } from '@nitrots/nitro-renderer'; -import { FC, PropsWithChildren, useEffect } from 'react'; -import ReactSlider from 'react-slider'; -import { GetWiredTimeLocale, LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredBaseView } from '../WiredBaseView'; - -export interface WiredActionBaseViewProps -{ - hasSpecialInput: boolean; - requiresFurni: number; - save: () => void; -} - -export const WiredActionBaseView: FC> = props => -{ - const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, hasSpecialInput = false, children = null } = props; - const { trigger = null, actionDelay = 0, setActionDelay = null } = useWired(); - - useEffect(() => - { - setActionDelay((trigger as WiredActionDefinition).delayInPulses); - }, [ trigger, setActionDelay ]); - - return ( - - { children } - { !!children &&
} - - { LocalizeText('wiredfurni.params.delay', [ 'seconds' ], [ GetWiredTimeLocale(actionDelay) ]) } - setActionDelay(event) } /> - -
- ); -} diff --git a/src/components/wired/views/actions/WiredActionBotChangeFigureView.tsx b/src/components/wired/views/actions/WiredActionBotChangeFigureView.tsx deleted file mode 100644 index 783e00a..0000000 --- a/src/components/wired/views/actions/WiredActionBotChangeFigureView.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { GetSessionDataManager } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WIRED_STRING_DELIMETER, WiredFurniType } from '../../../../api'; -import { Button, Column, Flex, LayoutAvatarImageView, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -const DEFAULT_FIGURE: string = 'hd-180-1.ch-210-66.lg-270-82.sh-290-81'; - -export const WiredActionBotChangeFigureView: FC<{}> = props => -{ - const [ botName, setBotName ] = useState(''); - const [ figure, setFigure ] = useState(''); - const { trigger = null, setStringParam = null } = useWired(); - - const save = () => setStringParam((botName + WIRED_STRING_DELIMETER + figure)); - - useEffect(() => - { - const data = trigger.stringData.split(WIRED_STRING_DELIMETER); - - if(data.length > 0) setBotName(data[0]); - if(data.length > 1) setFigure(data[1].length > 0 ? data[1] : DEFAULT_FIGURE); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.bot.name') } - setBotName(event.target.value) } /> - - - - - - - ); -} diff --git a/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx b/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx deleted file mode 100644 index 2acb5cc..0000000 --- a/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -export const WiredActionBotFollowAvatarView: FC<{}> = props => -{ - const [ botName, setBotName ] = useState(''); - const [ followMode, setFollowMode ] = useState(-1); - const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); - - const save = () => - { - setStringParam(botName); - setIntParams([ followMode ]); - } - - useEffect(() => - { - setBotName(trigger.stringData); - setFollowMode((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.bot.name') } - setBotName(event.target.value) } /> - - - - setFollowMode(1) } /> - { LocalizeText('wiredfurni.params.start.following') } - - - setFollowMode(0) } /> - { LocalizeText('wiredfurni.params.stop.following') } - - - - ); -} diff --git a/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx b/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx deleted file mode 100644 index c93d0de..0000000 --- a/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -const ALLOWED_HAND_ITEM_IDS: number[] = [ 2, 5, 7, 8, 9, 10, 27 ]; - -export const WiredActionBotGiveHandItemView: FC<{}> = props => -{ - const [ botName, setBotName ] = useState(''); - const [ handItemId, setHandItemId ] = useState(-1); - const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); - - const save = () => - { - setStringParam(botName); - setIntParams([ handItemId ]); - } - - useEffect(() => - { - setBotName(trigger.stringData); - setHandItemId((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.bot.name') } - setBotName(event.target.value) } /> - - - { LocalizeText('wiredfurni.params.handitem') } - - - - ); -} diff --git a/src/components/wired/views/actions/WiredActionBotMoveView.tsx b/src/components/wired/views/actions/WiredActionBotMoveView.tsx deleted file mode 100644 index d09a359..0000000 --- a/src/components/wired/views/actions/WiredActionBotMoveView.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -export const WiredActionBotMoveView: FC<{}> = props => -{ - const [ botName, setBotName ] = useState(''); - const { trigger = null, setStringParam = null } = useWired(); - - const save = () => setStringParam(botName); - - useEffect(() => - { - setBotName(trigger.stringData); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.bot.name') } - setBotName(event.target.value) } /> - - - ); -} diff --git a/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx b/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx deleted file mode 100644 index d32cc17..0000000 --- a/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { GetConfigurationValue, LocalizeText, WIRED_STRING_DELIMETER, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -export const WiredActionBotTalkToAvatarView: FC<{}> = props => -{ - const [ botName, setBotName ] = useState(''); - const [ message, setMessage ] = useState(''); - const [ talkMode, setTalkMode ] = useState(-1); - const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); - - const save = () => - { - setStringParam(botName + WIRED_STRING_DELIMETER + message); - setIntParams([ talkMode ]); - } - - useEffect(() => - { - const data = trigger.stringData.split(WIRED_STRING_DELIMETER); - - if(data.length > 0) setBotName(data[0]); - if(data.length > 1) setMessage(data[1].length > 0 ? data[1] : ''); - - setTalkMode((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.bot.name') } - setBotName(event.target.value) } /> - - - { LocalizeText('wiredfurni.params.message') } - ('wired.action.bot.talk.to.avatar.max.length', 64) } value={ message } onChange={ event => setMessage(event.target.value) } /> - - - - setTalkMode(0) } /> - { LocalizeText('wiredfurni.params.talk') } - - - setTalkMode(1) } /> - { LocalizeText('wiredfurni.params.whisper') } - - - - ); -} diff --git a/src/components/wired/views/actions/WiredActionBotTalkView.tsx b/src/components/wired/views/actions/WiredActionBotTalkView.tsx deleted file mode 100644 index 18e6467..0000000 --- a/src/components/wired/views/actions/WiredActionBotTalkView.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { GetConfigurationValue, LocalizeText, WIRED_STRING_DELIMETER, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -export const WiredActionBotTalkView: FC<{}> = props => -{ - const [ botName, setBotName ] = useState(''); - const [ message, setMessage ] = useState(''); - const [ talkMode, setTalkMode ] = useState(-1); - const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); - - const save = () => - { - setStringParam(botName + WIRED_STRING_DELIMETER + message); - setIntParams([ talkMode ]); - } - - useEffect(() => - { - const data = trigger.stringData.split(WIRED_STRING_DELIMETER); - - if(data.length > 0) setBotName(data[0]); - if(data.length > 1) setMessage(data[1].length > 0 ? data[1] : ''); - - setTalkMode((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.bot.name') } - setBotName(event.target.value) } /> - - - { LocalizeText('wiredfurni.params.message') } - ('wired.action.bot.talk.max.length', 64) } value={ message } onChange={ event => setMessage(event.target.value) } /> - - - - setTalkMode(0) } /> - { LocalizeText('wiredfurni.params.talk') } - - - setTalkMode(1) } /> - { LocalizeText('wiredfurni.params.shout') } - - - - ); -} diff --git a/src/components/wired/views/actions/WiredActionBotTeleportView.tsx b/src/components/wired/views/actions/WiredActionBotTeleportView.tsx deleted file mode 100644 index 5d767b1..0000000 --- a/src/components/wired/views/actions/WiredActionBotTeleportView.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -export const WiredActionBotTeleportView: FC<{}> = props => -{ - const [ botName, setBotName ] = useState(''); - const { trigger = null, setStringParam = null } = useWired(); - - const save = () => setStringParam(botName); - - useEffect(() => - { - setBotName(trigger.stringData); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.bot.name') } - setBotName(event.target.value) } /> - - - ); -} diff --git a/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx b/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx deleted file mode 100644 index ee6d547..0000000 --- a/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -export const WiredActionCallAnotherStackView: FC<{}> = props => -{ - return ; -} diff --git a/src/components/wired/views/actions/WiredActionChaseView.tsx b/src/components/wired/views/actions/WiredActionChaseView.tsx deleted file mode 100644 index c494503..0000000 --- a/src/components/wired/views/actions/WiredActionChaseView.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -export const WiredActionChaseView: FC<{}> = props => -{ - return ; -} diff --git a/src/components/wired/views/actions/WiredActionChatView.tsx b/src/components/wired/views/actions/WiredActionChatView.tsx deleted file mode 100644 index 62d9519..0000000 --- a/src/components/wired/views/actions/WiredActionChatView.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { GetConfigurationValue, LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -export const WiredActionChatView: FC<{}> = props => -{ - const [ message, setMessage ] = useState(''); - const { trigger = null, setStringParam = null } = useWired(); - - const save = () => setStringParam(message); - - useEffect(() => - { - setMessage(trigger.stringData); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.message') } - setMessage(event.target.value) } maxLength={ GetConfigurationValue('wired.action.chat.max.length', 100) } /> - - - ); -} diff --git a/src/components/wired/views/actions/WiredActionFleeView.tsx b/src/components/wired/views/actions/WiredActionFleeView.tsx deleted file mode 100644 index a80ab43..0000000 --- a/src/components/wired/views/actions/WiredActionFleeView.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -export const WiredActionFleeView: FC<{}> = props => -{ - return ; -} diff --git a/src/components/wired/views/actions/WiredActionGiveRewardView.tsx b/src/components/wired/views/actions/WiredActionGiveRewardView.tsx deleted file mode 100644 index a255fe3..0000000 --- a/src/components/wired/views/actions/WiredActionGiveRewardView.tsx +++ /dev/null @@ -1,160 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { FaPlus, FaTrash } from 'react-icons/fa'; -import ReactSlider from 'react-slider'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Button, Column, Flex, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -export const WiredActionGiveRewardView: FC<{}> = props => -{ - const [ limitEnabled, setLimitEnabled ] = useState(false); - const [ rewardTime, setRewardTime ] = useState(1); - const [ uniqueRewards, setUniqueRewards ] = useState(false); - const [ rewardsLimit, setRewardsLimit ] = useState(1); - const [ limitationInterval, setLimitationInterval ] = useState(1); - const [ rewards, setRewards ] = useState<{ isBadge: boolean, itemCode: string, probability: number }[]>([]); - const { trigger = null, setIntParams = null, setStringParam = null } = useWired(); - - const addReward = () => setRewards(rewards => [ ...rewards, { isBadge: false, itemCode: '', probability: null } ]); - - const removeReward = (index: number) => - { - setRewards(prevValue => - { - const newValues = Array.from(prevValue); - - newValues.splice(index, 1); - - return newValues; - }); - } - - const updateReward = (index: number, isBadge: boolean, itemCode: string, probability: number) => - { - const rewardsClone = Array.from(rewards); - const reward = rewardsClone[index]; - - if(!reward) return; - - reward.isBadge = isBadge; - reward.itemCode = itemCode; - reward.probability = probability; - - setRewards(rewardsClone); - } - - const save = () => - { - let stringRewards = []; - - for(const reward of rewards) - { - if(!reward.itemCode) continue; - - const rewardsString = [ reward.isBadge ? '0' : '1', reward.itemCode, reward.probability.toString() ]; - stringRewards.push(rewardsString.join(',')); - } - - if(stringRewards.length > 0) - { - setStringParam(stringRewards.join(';')); - setIntParams([ rewardTime, uniqueRewards ? 1 : 0, rewardsLimit, limitationInterval ]); - } - } - - useEffect(() => - { - const readRewards: { isBadge: boolean, itemCode: string, probability: number }[] = []; - - if(trigger.stringData.length > 0 && trigger.stringData.includes(';')) - { - const splittedRewards = trigger.stringData.split(';'); - - for(const rawReward of splittedRewards) - { - const reward = rawReward.split(','); - - if(reward.length !== 3) continue; - - readRewards.push({ isBadge: reward[0] === '0', itemCode: reward[1], probability: Number(reward[2]) }); - } - } - - if(readRewards.length === 0) readRewards.push({ isBadge: false, itemCode: '', probability: null }); - - setRewardTime((trigger.intData.length > 0) ? trigger.intData[0] : 0); - setUniqueRewards((trigger.intData.length > 1) ? (trigger.intData[1] === 1) : false); - setRewardsLimit((trigger.intData.length > 2) ? trigger.intData[2] : 0); - setLimitationInterval((trigger.intData.length > 3) ? trigger.intData[3] : 0); - setLimitEnabled((trigger.intData.length > 3) ? trigger.intData[3] > 0 : false); - setRewards(readRewards); - }, [ trigger ]); - - return ( - - - setLimitEnabled(event.target.checked) } /> - { LocalizeText('wiredfurni.params.prizelimit', [ 'amount' ], [ limitEnabled ? rewardsLimit.toString() : '' ]) } - - { !limitEnabled && - - Reward limit not set. Make sure rewards are badges or non-tradeable items. - } - { limitEnabled && - setRewardsLimit(event) } /> } -
- - How often can a user be rewarded? - - - { (rewardTime > 0) && setLimitationInterval(Number(event.target.value)) } /> } - - -
- - setUniqueRewards(e.target.checked) } /> - Unique rewards - - - If checked each reward will be given once to each user. This will disable the probabilities option. - -
- - Rewards - - - - { rewards && rewards.map((reward, index) => - { - return ( - - - updateReward(index, e.target.checked, reward.itemCode, reward.probability) } /> - Badge? - - updateReward(index, reward.isBadge, e.target.value, reward.probability) } placeholder="Item Code" /> - updateReward(index, reward.isBadge, reward.itemCode, Number(e.target.value)) } placeholder="Probability" /> - { (index > 0) && - } - - ) - }) } - -
- ); -} diff --git a/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx b/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx deleted file mode 100644 index 43ab240..0000000 --- a/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import ReactSlider from 'react-slider'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -export const WiredActionGiveScoreToPredefinedTeamView: FC<{}> = props => -{ - const [ points, setPoints ] = useState(1); - const [ time, setTime ] = useState(1); - const [ selectedTeam, setSelectedTeam ] = useState(1); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => setIntParams([ points, time, selectedTeam ]); - - useEffect(() => - { - if(trigger.intData.length >= 2) - { - setPoints(trigger.intData[0]); - setTime(trigger.intData[1]); - setSelectedTeam(trigger.intData[2]); - } - else - { - setPoints(1); - setTime(1); - setSelectedTeam(1); - } - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.setpoints', [ 'points' ], [ points.toString() ]) } - setPoints(event) } /> - - - { LocalizeText('wiredfurni.params.settimesingame', [ 'times' ], [ time.toString() ]) } - setTime(event) } /> - - - { LocalizeText('wiredfurni.params.team') } - { [ 1, 2, 3, 4 ].map(value => - { - return ( - - setSelectedTeam(value) } /> - { LocalizeText('wiredfurni.params.team.' + value) } - - ); - }) } - - - ); -} diff --git a/src/components/wired/views/actions/WiredActionGiveScoreView.tsx b/src/components/wired/views/actions/WiredActionGiveScoreView.tsx deleted file mode 100644 index 28bfb0b..0000000 --- a/src/components/wired/views/actions/WiredActionGiveScoreView.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import ReactSlider from 'react-slider'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -export const WiredActionGiveScoreView: FC<{}> = props => -{ - const [ points, setPoints ] = useState(1); - const [ time, setTime ] = useState(1); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => setIntParams([ points, time ]); - - useEffect(() => - { - if(trigger.intData.length >= 2) - { - setPoints(trigger.intData[0]); - setTime(trigger.intData[1]); - } - else - { - setPoints(1); - setTime(1); - } - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.setpoints', [ 'points' ], [ points.toString() ]) } - setPoints(event) } /> - - - { LocalizeText('wiredfurni.params.settimesingame', [ 'times' ], [ time.toString() ]) } - setTime(event) } /> - - - ); -} diff --git a/src/components/wired/views/actions/WiredActionJoinTeamView.tsx b/src/components/wired/views/actions/WiredActionJoinTeamView.tsx deleted file mode 100644 index 7580564..0000000 --- a/src/components/wired/views/actions/WiredActionJoinTeamView.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -export const WiredActionJoinTeamView: FC<{}> = props => -{ - const [ selectedTeam, setSelectedTeam ] = useState(-1); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => setIntParams([ selectedTeam ]); - - useEffect(() => - { - setSelectedTeam((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.team') } - { [ 1, 2, 3, 4 ].map(team => - { - return ( - - setSelectedTeam(team) } /> - { LocalizeText(`wiredfurni.params.team.${ team }`) } - - ) - }) } - - - ); -} diff --git a/src/components/wired/views/actions/WiredActionKickFromRoomView.tsx b/src/components/wired/views/actions/WiredActionKickFromRoomView.tsx deleted file mode 100644 index ba6033f..0000000 --- a/src/components/wired/views/actions/WiredActionKickFromRoomView.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { GetConfigurationValue, LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -export const WiredActionKickFromRoomView: FC<{}> = props => -{ - const [ message, setMessage ] = useState(''); - const { trigger = null, setStringParam = null } = useWired(); - - const save = () => setStringParam(message); - - useEffect(() => - { - setMessage(trigger.stringData); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.message') } - setMessage(event.target.value) } maxLength={ GetConfigurationValue('wired.action.kick.from.room.max.length', 100) } /> - - - ); -} diff --git a/src/components/wired/views/actions/WiredActionLayoutView.tsx b/src/components/wired/views/actions/WiredActionLayoutView.tsx deleted file mode 100644 index f43666a..0000000 --- a/src/components/wired/views/actions/WiredActionLayoutView.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { WiredActionLayoutCode } from '../../../../api'; -import { WiredActionBotChangeFigureView } from './WiredActionBotChangeFigureView'; -import { WiredActionBotFollowAvatarView } from './WiredActionBotFollowAvatarView'; -import { WiredActionBotGiveHandItemView } from './WiredActionBotGiveHandItemView'; -import { WiredActionBotMoveView } from './WiredActionBotMoveView'; -import { WiredActionBotTalkToAvatarView } from './WiredActionBotTalkToAvatarView'; -import { WiredActionBotTalkView } from './WiredActionBotTalkView'; -import { WiredActionBotTeleportView } from './WiredActionBotTeleportView'; -import { WiredActionCallAnotherStackView } from './WiredActionCallAnotherStackView'; -import { WiredActionChaseView } from './WiredActionChaseView'; -import { WiredActionChatView } from './WiredActionChatView'; -import { WiredActionFleeView } from './WiredActionFleeView'; -import { WiredActionGiveRewardView } from './WiredActionGiveRewardView'; -import { WiredActionGiveScoreToPredefinedTeamView } from './WiredActionGiveScoreToPredefinedTeamView'; -import { WiredActionGiveScoreView } from './WiredActionGiveScoreView'; -import { WiredActionJoinTeamView } from './WiredActionJoinTeamView'; -import { WiredActionKickFromRoomView } from './WiredActionKickFromRoomView'; -import { WiredActionLeaveTeamView } from './WiredActionLeaveTeamView'; -import { WiredActionMoveAndRotateFurniView } from './WiredActionMoveAndRotateFurniView'; -import { WiredActionMoveFurniToView } from './WiredActionMoveFurniToView'; -import { WiredActionMoveFurniView } from './WiredActionMoveFurniView'; -import { WiredActionMuteUserView } from './WiredActionMuteUserView'; -import { WiredActionResetView } from './WiredActionResetView'; -import { WiredActionSetFurniStateToView } from './WiredActionSetFurniStateToView'; -import { WiredActionTeleportView } from './WiredActionTeleportView'; -import { WiredActionToggleFurniStateView } from './WiredActionToggleFurniStateView'; - -export const WiredActionLayoutView = (code: number) => -{ - switch(code) - { - case WiredActionLayoutCode.BOT_CHANGE_FIGURE: - return ; - case WiredActionLayoutCode.BOT_FOLLOW_AVATAR: - return ; - case WiredActionLayoutCode.BOT_GIVE_HAND_ITEM: - return ; - case WiredActionLayoutCode.BOT_MOVE: - return ; - case WiredActionLayoutCode.BOT_TALK: - return ; - case WiredActionLayoutCode.BOT_TALK_DIRECT_TO_AVTR: - return ; - case WiredActionLayoutCode.BOT_TELEPORT: - return ; - case WiredActionLayoutCode.CALL_ANOTHER_STACK: - return ; - case WiredActionLayoutCode.CHASE: - return ; - case WiredActionLayoutCode.CHAT: - return ; - case WiredActionLayoutCode.FLEE: - return ; - case WiredActionLayoutCode.GIVE_REWARD: - return ; - case WiredActionLayoutCode.GIVE_SCORE: - return ; - case WiredActionLayoutCode.GIVE_SCORE_TO_PREDEFINED_TEAM: - return ; - case WiredActionLayoutCode.JOIN_TEAM: - return ; - case WiredActionLayoutCode.KICK_FROM_ROOM: - return ; - case WiredActionLayoutCode.LEAVE_TEAM: - return ; - case WiredActionLayoutCode.MOVE_FURNI: - return ; - case WiredActionLayoutCode.MOVE_AND_ROTATE_FURNI: - return ; - case WiredActionLayoutCode.MOVE_FURNI_TO: - return ; - case WiredActionLayoutCode.MUTE_USER: - return ; - case WiredActionLayoutCode.RESET: - return ; - case WiredActionLayoutCode.SET_FURNI_STATE: - return ; - case WiredActionLayoutCode.TELEPORT: - return ; - case WiredActionLayoutCode.TOGGLE_FURNI_STATE: - return ; - } - - return null; -} diff --git a/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx b/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx deleted file mode 100644 index eaa834f..0000000 --- a/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -export const WiredActionLeaveTeamView: FC<{}> = props => -{ - return ; -} diff --git a/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx b/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx deleted file mode 100644 index 62801af..0000000 --- a/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -const directionOptions: { value: number, icon: string }[] = [ - { - value: 0, - icon: 'ne' - }, - { - value: 2, - icon: 'se' - }, - { - value: 4, - icon: 'sw' - }, - { - value: 6, - icon: 'nw' - } -]; - -const rotationOptions: number[] = [ 0, 1, 2, 3, 4, 5, 6 ]; - -export const WiredActionMoveAndRotateFurniView: FC<{}> = props => -{ - const [ movement, setMovement ] = useState(-1); - const [ rotation, setRotation ] = useState(-1); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => setIntParams([ movement, rotation ]); - - useEffect(() => - { - if(trigger.intData.length >= 2) - { - setMovement(trigger.intData[0]); - setRotation(trigger.intData[1]); - } - else - { - setMovement(-1); - setRotation(-1); - } - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.startdir') } - - { directionOptions.map(option => - { - return ( - - setMovement(option.value) } /> - - - - - ) - }) } - - - - { LocalizeText('wiredfurni.params.turn') } - { rotationOptions.map(option => - { - return ( - - setRotation(option) } /> - { LocalizeText(`wiredfurni.params.turn.${ option }`) } - - ) - }) } - - - ); -} diff --git a/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx b/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx deleted file mode 100644 index 56bdb6b..0000000 --- a/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import ReactSlider from 'react-slider'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -const directionOptions: { value: number, icon: string }[] = [ - { - value: 0, - icon: 'ne' - }, - { - value: 2, - icon: 'se' - }, - { - value: 4, - icon: 'sw' - }, - { - value: 6, - icon: 'nw' - } -]; - -export const WiredActionMoveFurniToView: FC<{}> = props => -{ - const [ spacing, setSpacing ] = useState(-1); - const [ movement, setMovement ] = useState(-1); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => setIntParams([ movement, spacing ]); - - useEffect(() => - { - if(trigger.intData.length >= 2) - { - setSpacing(trigger.intData[1]); - setMovement(trigger.intData[0]); - } - else - { - setSpacing(-1); - setMovement(-1); - } - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.emptytiles', [ 'tiles' ], [ spacing.toString() ]) } - setSpacing(event) } /> - - - { LocalizeText('wiredfurni.params.startdir') } - - { directionOptions.map(value => - { - return ( - - setMovement(value.value) } /> - - - ) - }) } - - - - ); -} diff --git a/src/components/wired/views/actions/WiredActionMoveFurniView.tsx b/src/components/wired/views/actions/WiredActionMoveFurniView.tsx deleted file mode 100644 index b5a0888..0000000 --- a/src/components/wired/views/actions/WiredActionMoveFurniView.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -const directionOptions: { value: number, icon: string }[] = [ - { - value: 4, - icon: 'ne' - }, - { - value: 5, - icon: 'se' - }, - { - value: 6, - icon: 'sw' - }, - { - value: 7, - icon: 'nw' - }, - { - value: 2, - icon: 'mv-2' - }, - { - value: 3, - icon: 'mv-3' - }, - { - value: 1, - icon: 'mv-1' - } -]; - -const rotationOptions: number[] = [ 0, 1, 2, 3 ]; - -export const WiredActionMoveFurniView: FC<{}> = props => -{ - const [ movement, setMovement ] = useState(-1); - const [ rotation, setRotation ] = useState(-1); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => setIntParams([ movement, rotation ]); - - useEffect(() => - { - if(trigger.intData.length >= 2) - { - setMovement(trigger.intData[0]); - setRotation(trigger.intData[1]); - } - else - { - setMovement(-1); - setRotation(-1); - } - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.movefurni') } - - setMovement(0) } /> - { LocalizeText('wiredfurni.params.movefurni.0') } - - - { directionOptions.map(option => - { - return ( - - setMovement(option.value) } /> - - - ) - }) } -
- - - - { LocalizeText('wiredfurni.params.rotatefurni') } - { rotationOptions.map(option => - { - return ( - - setRotation(option) } /> - - { [ 1, 2 ].includes(option) && } - { LocalizeText(`wiredfurni.params.rotatefurni.${ option }`) } - - - ) - }) } - - - ); -} diff --git a/src/components/wired/views/actions/WiredActionMuteUserView.tsx b/src/components/wired/views/actions/WiredActionMuteUserView.tsx deleted file mode 100644 index 15ecfd5..0000000 --- a/src/components/wired/views/actions/WiredActionMuteUserView.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import ReactSlider from 'react-slider'; -import { GetConfigurationValue, LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -export const WiredActionMuteUserView: FC<{}> = props => -{ - const [ time, setTime ] = useState(-1); - const [ message, setMessage ] = useState(''); - const { trigger = null, setIntParams = null, setStringParam = null } = useWired(); - - const save = () => - { - setIntParams([ time ]); - setStringParam(message); - } - - useEffect(() => - { - setTime((trigger.intData.length > 0) ? trigger.intData[0] : 0); - setMessage(trigger.stringData); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.length.minutes', [ 'minutes' ], [ time.toString() ]) } - setTime(event) } /> - - - { LocalizeText('wiredfurni.params.message') } - setMessage(event.target.value) } maxLength={ GetConfigurationValue('wired.action.mute.user.max.length', 100) } /> - - - ); -} diff --git a/src/components/wired/views/actions/WiredActionResetView.tsx b/src/components/wired/views/actions/WiredActionResetView.tsx deleted file mode 100644 index 9245c67..0000000 --- a/src/components/wired/views/actions/WiredActionResetView.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -export const WiredActionResetView: FC<{}> = props => -{ - return ; -} diff --git a/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx b/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx deleted file mode 100644 index 587254c..0000000 --- a/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -export const WiredActionSetFurniStateToView: FC<{}> = props => -{ - const [ stateFlag, setStateFlag ] = useState(0); - const [ directionFlag, setDirectionFlag ] = useState(0); - const [ positionFlag, setPositionFlag ] = useState(0); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => setIntParams([ stateFlag, directionFlag, positionFlag ]); - - useEffect(() => - { - setStateFlag(trigger.getBoolean(0) ? 1 : 0); - setDirectionFlag(trigger.getBoolean(1) ? 1 : 0); - setPositionFlag(trigger.getBoolean(2) ? 1 : 0); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.conditions') } - - setStateFlag(event.target.checked ? 1 : 0) } /> - { LocalizeText('wiredfurni.params.condition.state') } - - - setDirectionFlag(event.target.checked ? 1 : 0) } /> - { LocalizeText('wiredfurni.params.condition.direction') } - - - setPositionFlag(event.target.checked ? 1 : 0) } /> - { LocalizeText('wiredfurni.params.condition.position') } - - - - ); -} diff --git a/src/components/wired/views/actions/WiredActionTeleportView.tsx b/src/components/wired/views/actions/WiredActionTeleportView.tsx deleted file mode 100644 index 652da61..0000000 --- a/src/components/wired/views/actions/WiredActionTeleportView.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -export const WiredActionTeleportView: FC<{}> = props => -{ - return ; -} diff --git a/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx b/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx deleted file mode 100644 index 37b5d2e..0000000 --- a/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; -import { WiredActionBaseView } from './WiredActionBaseView'; - -export const WiredActionToggleFurniStateView: FC<{}> = props => -{ - return ; -} diff --git a/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx b/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx deleted file mode 100644 index 24e89ed..0000000 --- a/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredConditionBaseView } from './WiredConditionBaseView'; - -const ALLOWED_HAND_ITEM_IDS: number[] = [ 2, 5, 7, 8, 9, 10, 27 ]; - -export const WiredConditionActorHasHandItemView: FC<{}> = props => -{ - const [ handItemId, setHandItemId ] = useState(-1); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => setIntParams([ handItemId ]); - - useEffect(() => - { - setHandItemId((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.handitem') } - - - - ); -} diff --git a/src/components/wired/views/conditions/WiredConditionActorIsGroupMemberView.tsx b/src/components/wired/views/conditions/WiredConditionActorIsGroupMemberView.tsx deleted file mode 100644 index e278eab..0000000 --- a/src/components/wired/views/conditions/WiredConditionActorIsGroupMemberView.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; -import { WiredConditionBaseView } from './WiredConditionBaseView'; - -export const WiredConditionActorIsGroupMemberView: FC<{}> = props => -{ - return ; -} diff --git a/src/components/wired/views/conditions/WiredConditionActorIsOnFurniView.tsx b/src/components/wired/views/conditions/WiredConditionActorIsOnFurniView.tsx deleted file mode 100644 index 10cddf5..0000000 --- a/src/components/wired/views/conditions/WiredConditionActorIsOnFurniView.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; -import { WiredConditionBaseView } from './WiredConditionBaseView'; - -export const WiredConditionActorIsOnFurniView: FC<{}> = props => -{ - return ; -} diff --git a/src/components/wired/views/conditions/WiredConditionActorIsTeamMemberView.tsx b/src/components/wired/views/conditions/WiredConditionActorIsTeamMemberView.tsx deleted file mode 100644 index 20db3ac..0000000 --- a/src/components/wired/views/conditions/WiredConditionActorIsTeamMemberView.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredConditionBaseView } from './WiredConditionBaseView'; - -const teamIds: number[] = [ 1, 2, 3, 4 ]; - -export const WiredConditionActorIsTeamMemberView: FC<{}> = props => -{ - const [ selectedTeam, setSelectedTeam ] = useState(-1); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => setIntParams([ selectedTeam ]); - - useEffect(() => - { - setSelectedTeam((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.team') } - { teamIds.map(value => - { - return ( - - setSelectedTeam(value) } /> - { LocalizeText(`wiredfurni.params.team.${ value }`) } - - ) - }) } - - - ); -} diff --git a/src/components/wired/views/conditions/WiredConditionActorIsWearingBadgeView.tsx b/src/components/wired/views/conditions/WiredConditionActorIsWearingBadgeView.tsx deleted file mode 100644 index 01e6d3b..0000000 --- a/src/components/wired/views/conditions/WiredConditionActorIsWearingBadgeView.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredConditionBaseView } from './WiredConditionBaseView'; - -export const WiredConditionActorIsWearingBadgeView: FC<{}> = props => -{ - const [ badge, setBadge ] = useState(''); - const { trigger = null, setStringParam = null } = useWired(); - - const save = () => setStringParam(badge); - - useEffect(() => - { - setBadge(trigger.stringData); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.badgecode') } - setBadge(event.target.value) } /> - - - ); -} diff --git a/src/components/wired/views/conditions/WiredConditionActorIsWearingEffectView.tsx b/src/components/wired/views/conditions/WiredConditionActorIsWearingEffectView.tsx deleted file mode 100644 index 00d7fa6..0000000 --- a/src/components/wired/views/conditions/WiredConditionActorIsWearingEffectView.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredConditionBaseView } from './WiredConditionBaseView'; - -export const WiredConditionActorIsWearingEffectView: FC<{}> = props => -{ - const [ effect, setEffect ] = useState(-1); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => setIntParams([ effect ]); - - useEffect(() => - { - setEffect(trigger?.intData[0] ?? 0); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.tooltip.effectid') } - setEffect(parseInt(event.target.value)) } /> - - - ); -} diff --git a/src/components/wired/views/conditions/WiredConditionBaseView.tsx b/src/components/wired/views/conditions/WiredConditionBaseView.tsx deleted file mode 100644 index fc49215..0000000 --- a/src/components/wired/views/conditions/WiredConditionBaseView.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { FC, PropsWithChildren } from 'react'; -import { WiredFurniType } from '../../../../api'; -import { WiredBaseView } from '../WiredBaseView'; - -export interface WiredConditionBaseViewProps -{ - hasSpecialInput: boolean; - requiresFurni: number; - save: () => void; -} - -export const WiredConditionBaseView: FC> = props => -{ - const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, hasSpecialInput = false, children = null } = props; - - const onSave = () => (save && save()); - - return ( - - { children } - - ); -} diff --git a/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx b/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx deleted file mode 100644 index 36832e1..0000000 --- a/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredDateToString, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredConditionBaseView } from './WiredConditionBaseView'; - -export const WiredConditionDateRangeView: FC<{}> = props => -{ - const [ startDate, setStartDate ] = useState(''); - const [ endDate, setEndDate ] = useState(''); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => - { - let startDateMili = 0; - let endDateMili = 0; - - const startDateInstance = new Date(startDate); - const endDateInstance = new Date(endDate); - - if(startDateInstance && endDateInstance) - { - startDateMili = startDateInstance.getTime() / 1000; - endDateMili = endDateInstance.getTime() / 1000; - } - - setIntParams([ startDateMili, endDateMili ]); - } - - useEffect(() => - { - if(trigger.intData.length >= 2) - { - let startDate = new Date(); - let endDate = new Date(); - - if(trigger.intData[0] > 0) startDate = new Date((trigger.intData[0] * 1000)); - - if(trigger.intData[1] > 0) endDate = new Date((trigger.intData[1] * 1000)); - - setStartDate(WiredDateToString(startDate)); - setEndDate(WiredDateToString(endDate)); - } - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.startdate') } - setStartDate(e.target.value) } /> - - - { LocalizeText('wiredfurni.params.enddate') } - setEndDate(e.target.value) } /> - - - ); -} diff --git a/src/components/wired/views/conditions/WiredConditionFurniHasAvatarOnView.tsx b/src/components/wired/views/conditions/WiredConditionFurniHasAvatarOnView.tsx deleted file mode 100644 index aa3ba14..0000000 --- a/src/components/wired/views/conditions/WiredConditionFurniHasAvatarOnView.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; -import { WiredConditionBaseView } from './WiredConditionBaseView'; - -export const WiredConditionFurniHasAvatarOnView: FC<{}> = props => -{ - return ; -} diff --git a/src/components/wired/views/conditions/WiredConditionFurniHasFurniOnView.tsx b/src/components/wired/views/conditions/WiredConditionFurniHasFurniOnView.tsx deleted file mode 100644 index 1a9d0ef..0000000 --- a/src/components/wired/views/conditions/WiredConditionFurniHasFurniOnView.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredConditionBaseView } from './WiredConditionBaseView'; - -export const WiredConditionFurniHasFurniOnView: FC<{}> = props => -{ - const [ requireAll, setRequireAll ] = useState(-1); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => setIntParams([ requireAll ]); - - useEffect(() => - { - setRequireAll((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.requireall') } - { [ 0, 1 ].map(value => - { - return ( - - setRequireAll(value) } /> - { LocalizeText('wiredfurni.params.requireall.' + value) } - - ) - }) } - - - ); -} diff --git a/src/components/wired/views/conditions/WiredConditionFurniHasNotFurniOnView.tsx b/src/components/wired/views/conditions/WiredConditionFurniHasNotFurniOnView.tsx deleted file mode 100644 index 031ec08..0000000 --- a/src/components/wired/views/conditions/WiredConditionFurniHasNotFurniOnView.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredConditionBaseView } from './WiredConditionBaseView'; - -export const WiredConditionFurniHasNotFurniOnView: FC<{}> = props => -{ - const [ requireAll, setRequireAll ] = useState(-1); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => setIntParams([ requireAll ]); - - useEffect(() => - { - setRequireAll((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.not_requireall') } - { [ 0, 1 ].map(value => - { - return ( - - setRequireAll(value) } /> - { LocalizeText(`wiredfurni.params.not_requireall.${ value }`) } - - ) - }) } - - - ); -} diff --git a/src/components/wired/views/conditions/WiredConditionFurniIsOfTypeView.tsx b/src/components/wired/views/conditions/WiredConditionFurniIsOfTypeView.tsx deleted file mode 100644 index 2b0ddf4..0000000 --- a/src/components/wired/views/conditions/WiredConditionFurniIsOfTypeView.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; -import { WiredConditionBaseView } from './WiredConditionBaseView'; - -export const WiredConditionFurniIsOfTypeView: FC<{}> = props => -{ - return ; -} diff --git a/src/components/wired/views/conditions/WiredConditionFurniMatchesSnapshotView.tsx b/src/components/wired/views/conditions/WiredConditionFurniMatchesSnapshotView.tsx deleted file mode 100644 index 47a555e..0000000 --- a/src/components/wired/views/conditions/WiredConditionFurniMatchesSnapshotView.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredConditionBaseView } from './WiredConditionBaseView'; - -export const WiredConditionFurniMatchesSnapshotView: FC<{}> = props => -{ - const [ stateFlag, setStateFlag ] = useState(0); - const [ directionFlag, setDirectionFlag ] = useState(0); - const [ positionFlag, setPositionFlag ] = useState(0); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => setIntParams([ stateFlag, directionFlag, positionFlag ]); - - useEffect(() => - { - setStateFlag(trigger.getBoolean(0) ? 1 : 0); - setDirectionFlag(trigger.getBoolean(1) ? 1 : 0); - setPositionFlag(trigger.getBoolean(2) ? 1 : 0); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.conditions') } - - setStateFlag(event.target.checked ? 1 : 0) } /> - { LocalizeText('wiredfurni.params.condition.state') } - - - setDirectionFlag(event.target.checked ? 1 : 0) } /> - { LocalizeText('wiredfurni.params.condition.direction') } - - - setPositionFlag(event.target.checked ? 1 : 0) } /> - { LocalizeText('wiredfurni.params.condition.position') } - - - - ); -} diff --git a/src/components/wired/views/conditions/WiredConditionLayoutView.tsx b/src/components/wired/views/conditions/WiredConditionLayoutView.tsx deleted file mode 100644 index c7c49b2..0000000 --- a/src/components/wired/views/conditions/WiredConditionLayoutView.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { WiredConditionlayout } from '../../../../api'; -import { WiredConditionActorHasHandItemView } from './WiredConditionActorHasHandItem'; -import { WiredConditionActorIsGroupMemberView } from './WiredConditionActorIsGroupMemberView'; -import { WiredConditionActorIsOnFurniView } from './WiredConditionActorIsOnFurniView'; -import { WiredConditionActorIsTeamMemberView } from './WiredConditionActorIsTeamMemberView'; -import { WiredConditionActorIsWearingBadgeView } from './WiredConditionActorIsWearingBadgeView'; -import { WiredConditionActorIsWearingEffectView } from './WiredConditionActorIsWearingEffectView'; -import { WiredConditionDateRangeView } from './WiredConditionDateRangeView'; -import { WiredConditionFurniHasAvatarOnView } from './WiredConditionFurniHasAvatarOnView'; -import { WiredConditionFurniHasFurniOnView } from './WiredConditionFurniHasFurniOnView'; -import { WiredConditionFurniHasNotFurniOnView } from './WiredConditionFurniHasNotFurniOnView'; -import { WiredConditionFurniIsOfTypeView } from './WiredConditionFurniIsOfTypeView'; -import { WiredConditionFurniMatchesSnapshotView } from './WiredConditionFurniMatchesSnapshotView'; -import { WiredConditionTimeElapsedLessView } from './WiredConditionTimeElapsedLessView'; -import { WiredConditionTimeElapsedMoreView } from './WiredConditionTimeElapsedMoreView'; -import { WiredConditionUserCountInRoomView } from './WiredConditionUserCountInRoomView'; - -export const WiredConditionLayoutView = (code: number) => -{ - switch(code) - { - case WiredConditionlayout.ACTOR_HAS_HANDITEM: - return ; - case WiredConditionlayout.ACTOR_IS_GROUP_MEMBER: - case WiredConditionlayout.NOT_ACTOR_IN_GROUP: - return ; - case WiredConditionlayout.ACTOR_IS_ON_FURNI: - case WiredConditionlayout.NOT_ACTOR_ON_FURNI: - return ; - case WiredConditionlayout.ACTOR_IS_IN_TEAM: - case WiredConditionlayout.NOT_ACTOR_IN_TEAM: - return ; - case WiredConditionlayout.ACTOR_IS_WEARING_BADGE: - case WiredConditionlayout.NOT_ACTOR_WEARS_BADGE: - return ; - case WiredConditionlayout.ACTOR_IS_WEARING_EFFECT: - case WiredConditionlayout.NOT_ACTOR_WEARING_EFFECT: - return ; - case WiredConditionlayout.DATE_RANGE_ACTIVE: - return ; - case WiredConditionlayout.FURNIS_HAVE_AVATARS: - case WiredConditionlayout.FURNI_NOT_HAVE_HABBO: - return ; - case WiredConditionlayout.HAS_STACKED_FURNIS: - return ; - case WiredConditionlayout.NOT_HAS_STACKED_FURNIS: - return ; - case WiredConditionlayout.STUFF_TYPE_MATCHES: - case WiredConditionlayout.NOT_FURNI_IS_OF_TYPE: - return ; - case WiredConditionlayout.STATES_MATCH: - case WiredConditionlayout.NOT_STATES_MATCH: - return ; - case WiredConditionlayout.TIME_ELAPSED_LESS: - return ; - case WiredConditionlayout.TIME_ELAPSED_MORE: - return ; - case WiredConditionlayout.USER_COUNT_IN: - case WiredConditionlayout.NOT_USER_COUNT_IN: - return ; - } - - return null; -} diff --git a/src/components/wired/views/conditions/WiredConditionTimeElapsedLessView.tsx b/src/components/wired/views/conditions/WiredConditionTimeElapsedLessView.tsx deleted file mode 100644 index 31d6d79..0000000 --- a/src/components/wired/views/conditions/WiredConditionTimeElapsedLessView.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import ReactSlider from 'react-slider'; -import { GetWiredTimeLocale, LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredConditionBaseView } from './WiredConditionBaseView'; - -export const WiredConditionTimeElapsedLessView: FC<{}> = props => -{ - const [ time, setTime ] = useState(-1); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => setIntParams([ time ]); - - useEffect(() => - { - setTime((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.allowbefore', [ 'seconds' ], [ GetWiredTimeLocale(time) ]) } - setTime(event) } /> - - - ); -} diff --git a/src/components/wired/views/conditions/WiredConditionTimeElapsedMoreView.tsx b/src/components/wired/views/conditions/WiredConditionTimeElapsedMoreView.tsx deleted file mode 100644 index cb158e6..0000000 --- a/src/components/wired/views/conditions/WiredConditionTimeElapsedMoreView.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import ReactSlider from 'react-slider'; -import { GetWiredTimeLocale, LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredConditionBaseView } from './WiredConditionBaseView'; - -export const WiredConditionTimeElapsedMoreView: FC<{}> = props => -{ - const [ time, setTime ] = useState(-1); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => setIntParams([ time ]); - - useEffect(() => - { - setTime((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.allowafter', [ 'seconds' ], [ GetWiredTimeLocale(time) ]) } - setTime(event) } /> - - - ); -} diff --git a/src/components/wired/views/conditions/WiredConditionUserCountInRoomView.tsx b/src/components/wired/views/conditions/WiredConditionUserCountInRoomView.tsx deleted file mode 100644 index 8ef5914..0000000 --- a/src/components/wired/views/conditions/WiredConditionUserCountInRoomView.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import ReactSlider from 'react-slider'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredConditionBaseView } from './WiredConditionBaseView'; - -export const WiredConditionUserCountInRoomView: FC<{}> = props => -{ - const [ min, setMin ] = useState(1); - const [ max, setMax ] = useState(0); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => setIntParams([ min, max ]); - - useEffect(() => - { - if(trigger.intData.length >= 2) - { - setMin(trigger.intData[0]); - setMax(trigger.intData[1]); - } - else - { - setMin(1); - setMax(0); - } - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.usercountmin', [ 'value' ], [ min.toString() ]) } - setMin(event) } /> - - - { LocalizeText('wiredfurni.params.usercountmax', [ 'value' ], [ max.toString() ]) } - setMax(event) } /> - - - ); -} diff --git a/src/components/wired/views/triggers/WiredTriggerAvatarEnterRoomView.tsx b/src/components/wired/views/triggers/WiredTriggerAvatarEnterRoomView.tsx deleted file mode 100644 index b14eafb..0000000 --- a/src/components/wired/views/triggers/WiredTriggerAvatarEnterRoomView.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredTriggerBaseView } from './WiredTriggerBaseView'; - -export const WiredTriggerAvatarEnterRoomView: FC<{}> = props => -{ - const [ username, setUsername ] = useState(''); - const [ avatarMode, setAvatarMode ] = useState(0); - const { trigger = null, setStringParam = null } = useWired(); - - const save = () => setStringParam((avatarMode === 1) ? username : ''); - - useEffect(() => - { - setUsername(trigger.stringData); - setAvatarMode(trigger.stringData ? 1 : 0); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.picktriggerer') } - - setAvatarMode(0) } /> - { LocalizeText('wiredfurni.params.anyavatar') } - - - setAvatarMode(1) } /> - { LocalizeText('wiredfurni.params.certainavatar') } - - { (avatarMode === 1) && - setUsername(event.target.value) } /> } - - - ); -} diff --git a/src/components/wired/views/triggers/WiredTriggerAvatarSaysSomethingView.tsx b/src/components/wired/views/triggers/WiredTriggerAvatarSaysSomethingView.tsx deleted file mode 100644 index 4aaf8fe..0000000 --- a/src/components/wired/views/triggers/WiredTriggerAvatarSaysSomethingView.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { GetSessionDataManager } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredTriggerBaseView } from './WiredTriggerBaseView'; - -export const WiredTriggerAvatarSaysSomethingView: FC<{}> = props => -{ - const [ message, setMessage ] = useState(''); - const [ triggererAvatar, setTriggererAvatar ] = useState(-1); - const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); - - const save = () => - { - setStringParam(message); - setIntParams([ triggererAvatar ]); - } - - useEffect(() => - { - setMessage(trigger.stringData); - setTriggererAvatar((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.whatissaid') } - setMessage(event.target.value) } /> - - - { LocalizeText('wiredfurni.params.picktriggerer') } - - setTriggererAvatar(0) } /> - { LocalizeText('wiredfurni.params.anyavatar') } - - - setTriggererAvatar(1) } /> - { GetSessionDataManager().userName } - - - - ); -} diff --git a/src/components/wired/views/triggers/WiredTriggerAvatarWalksOffFurniView.tsx b/src/components/wired/views/triggers/WiredTriggerAvatarWalksOffFurniView.tsx deleted file mode 100644 index 0b98a56..0000000 --- a/src/components/wired/views/triggers/WiredTriggerAvatarWalksOffFurniView.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; -import { WiredTriggerBaseView } from './WiredTriggerBaseView'; - -export const WiredTriggerAvatarWalksOffFurniView: FC<{}> = props => -{ - return ; -} diff --git a/src/components/wired/views/triggers/WiredTriggerAvatarWalksOnFurni.tsx b/src/components/wired/views/triggers/WiredTriggerAvatarWalksOnFurni.tsx deleted file mode 100644 index 25572e7..0000000 --- a/src/components/wired/views/triggers/WiredTriggerAvatarWalksOnFurni.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; -import { WiredTriggerBaseView } from './WiredTriggerBaseView'; - -export const WiredTriggerAvatarWalksOnFurniView: FC<{}> = props => -{ - return ; -} diff --git a/src/components/wired/views/triggers/WiredTriggerBaseView.tsx b/src/components/wired/views/triggers/WiredTriggerBaseView.tsx deleted file mode 100644 index f8f1575..0000000 --- a/src/components/wired/views/triggers/WiredTriggerBaseView.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { FC, PropsWithChildren } from 'react'; -import { WiredFurniType } from '../../../../api'; -import { WiredBaseView } from '../WiredBaseView'; - -export interface WiredTriggerBaseViewProps -{ - hasSpecialInput: boolean; - requiresFurni: number; - save: () => void; -} - -export const WiredTriggerBaseView: FC> = props => -{ - const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, hasSpecialInput = false, children = null } = props; - - const onSave = () => (save && save()); - - return ( - - { children } - - ); -} diff --git a/src/components/wired/views/triggers/WiredTriggerBotReachedAvatarView.tsx b/src/components/wired/views/triggers/WiredTriggerBotReachedAvatarView.tsx deleted file mode 100644 index 6984dc6..0000000 --- a/src/components/wired/views/triggers/WiredTriggerBotReachedAvatarView.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredTriggerBaseView } from './WiredTriggerBaseView'; - -export const WiredTriggerBotReachedAvatarView: FC<{}> = props => -{ - const [ botName, setBotName ] = useState(''); - const { trigger = null, setStringParam = null } = useWired(); - - const save = () => setStringParam(botName); - - useEffect(() => - { - setBotName(trigger.stringData); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.bot.name') } - setBotName(event.target.value) } /> - - - ); -} diff --git a/src/components/wired/views/triggers/WiredTriggerBotReachedStuffView.tsx b/src/components/wired/views/triggers/WiredTriggerBotReachedStuffView.tsx deleted file mode 100644 index 9cde173..0000000 --- a/src/components/wired/views/triggers/WiredTriggerBotReachedStuffView.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredTriggerBaseView } from './WiredTriggerBaseView'; - -export const WiredTriggerBotReachedStuffView: FC<{}> = props => -{ - const [ botName, setBotName ] = useState(''); - const { trigger = null, setStringParam = null } = useWired(); - - const save = () => setStringParam(botName); - - useEffect(() => - { - setBotName(trigger.stringData); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.bot.name') } - setBotName(event.target.value) } /> - - - ); -} diff --git a/src/components/wired/views/triggers/WiredTriggerCollisionView.tsx b/src/components/wired/views/triggers/WiredTriggerCollisionView.tsx deleted file mode 100644 index be23a6b..0000000 --- a/src/components/wired/views/triggers/WiredTriggerCollisionView.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; -import { WiredTriggerBaseView } from './WiredTriggerBaseView'; - -export const WiredTriggerCollisionView: FC<{}> = props => -{ - return ; -} diff --git a/src/components/wired/views/triggers/WiredTriggerExecuteOnceView.tsx b/src/components/wired/views/triggers/WiredTriggerExecuteOnceView.tsx deleted file mode 100644 index ea3d61b..0000000 --- a/src/components/wired/views/triggers/WiredTriggerExecuteOnceView.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import ReactSlider from 'react-slider'; -import { GetWiredTimeLocale, LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredTriggerBaseView } from './WiredTriggerBaseView'; - -export const WiredTriggeExecuteOnceView: FC<{}> = props => -{ - const [ time, setTime ] = useState(1); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => setIntParams([ time ]); - - useEffect(() => - { - setTime((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.settime', [ 'seconds' ], [ GetWiredTimeLocale(time) ]) } - setTime(event) } /> - - - ); -} diff --git a/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyLongView.tsx b/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyLongView.tsx deleted file mode 100644 index 5a698dd..0000000 --- a/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyLongView.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import ReactSlider from 'react-slider'; -import { FriendlyTime, LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredTriggerBaseView } from './WiredTriggerBaseView'; - -export const WiredTriggeExecutePeriodicallyLongView: FC<{}> = props => -{ - const [ time, setTime ] = useState(1); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => setIntParams([ time ]); - - useEffect(() => - { - setTime((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.setlongtime', [ 'time' ], [ FriendlyTime.format(time * 5).toString() ]) } - setTime(event) } /> - - - ); -} diff --git a/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyView.tsx b/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyView.tsx deleted file mode 100644 index b77e642..0000000 --- a/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyView.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import ReactSlider from 'react-slider'; -import { GetWiredTimeLocale, LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredTriggerBaseView } from './WiredTriggerBaseView'; - -export const WiredTriggeExecutePeriodicallyView: FC<{}> = props => -{ - const [ time, setTime ] = useState(1); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => setIntParams([ time ]); - - useEffect(() => - { - setTime((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.settime', [ 'seconds' ], [ GetWiredTimeLocale(time) ]) } - setTime(event) } /> - - - ); -} diff --git a/src/components/wired/views/triggers/WiredTriggerGameEndsView.tsx b/src/components/wired/views/triggers/WiredTriggerGameEndsView.tsx deleted file mode 100644 index c6f1c67..0000000 --- a/src/components/wired/views/triggers/WiredTriggerGameEndsView.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; -import { WiredTriggerBaseView } from './WiredTriggerBaseView'; - -export const WiredTriggerGameEndsView: FC<{}> = props => -{ - return ; -} diff --git a/src/components/wired/views/triggers/WiredTriggerGameStartsView.tsx b/src/components/wired/views/triggers/WiredTriggerGameStartsView.tsx deleted file mode 100644 index 6e43a2c..0000000 --- a/src/components/wired/views/triggers/WiredTriggerGameStartsView.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; -import { WiredTriggerBaseView } from './WiredTriggerBaseView'; - -export const WiredTriggerGameStartsView: FC<{}> = props => -{ - return ; -} diff --git a/src/components/wired/views/triggers/WiredTriggerLayoutView.tsx b/src/components/wired/views/triggers/WiredTriggerLayoutView.tsx deleted file mode 100644 index e45b2ea..0000000 --- a/src/components/wired/views/triggers/WiredTriggerLayoutView.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { WiredTriggerLayout } from '../../../../api'; -import { WiredTriggerAvatarEnterRoomView } from './WiredTriggerAvatarEnterRoomView'; -import { WiredTriggerAvatarSaysSomethingView } from './WiredTriggerAvatarSaysSomethingView'; -import { WiredTriggerAvatarWalksOffFurniView } from './WiredTriggerAvatarWalksOffFurniView'; -import { WiredTriggerAvatarWalksOnFurniView } from './WiredTriggerAvatarWalksOnFurni'; -import { WiredTriggerBotReachedAvatarView } from './WiredTriggerBotReachedAvatarView'; -import { WiredTriggerBotReachedStuffView } from './WiredTriggerBotReachedStuffView'; -import { WiredTriggerCollisionView } from './WiredTriggerCollisionView'; -import { WiredTriggeExecuteOnceView } from './WiredTriggerExecuteOnceView'; -import { WiredTriggeExecutePeriodicallyLongView } from './WiredTriggerExecutePeriodicallyLongView'; -import { WiredTriggeExecutePeriodicallyView } from './WiredTriggerExecutePeriodicallyView'; -import { WiredTriggerGameEndsView } from './WiredTriggerGameEndsView'; -import { WiredTriggerGameStartsView } from './WiredTriggerGameStartsView'; -import { WiredTriggeScoreAchievedView } from './WiredTriggerScoreAchievedView'; -import { WiredTriggerToggleFurniView } from './WiredTriggerToggleFurniView'; - -export const WiredTriggerLayoutView = (code: number) => -{ - switch(code) - { - case WiredTriggerLayout.AVATAR_ENTERS_ROOM: - return ; - case WiredTriggerLayout.AVATAR_SAYS_SOMETHING: - return ; - case WiredTriggerLayout.AVATAR_WALKS_OFF_FURNI: - return ; - case WiredTriggerLayout.AVATAR_WALKS_ON_FURNI: - return ; - case WiredTriggerLayout.BOT_REACHED_AVATAR: - return ; - case WiredTriggerLayout.BOT_REACHED_STUFF: - return ; - case WiredTriggerLayout.COLLISION: - return ; - case WiredTriggerLayout.EXECUTE_ONCE: - return ; - case WiredTriggerLayout.EXECUTE_PERIODICALLY: - return ; - case WiredTriggerLayout.EXECUTE_PERIODICALLY_LONG: - return ; - case WiredTriggerLayout.GAME_ENDS: - return ; - case WiredTriggerLayout.GAME_STARTS: - return ; - case WiredTriggerLayout.SCORE_ACHIEVED: - return ; - case WiredTriggerLayout.TOGGLE_FURNI: - return ; - } - - return null; -} diff --git a/src/components/wired/views/triggers/WiredTriggerScoreAchievedView.tsx b/src/components/wired/views/triggers/WiredTriggerScoreAchievedView.tsx deleted file mode 100644 index 883503b..0000000 --- a/src/components/wired/views/triggers/WiredTriggerScoreAchievedView.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import ReactSlider from 'react-slider'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; -import { useWired } from '../../../../hooks'; -import { WiredTriggerBaseView } from './WiredTriggerBaseView'; - -export const WiredTriggeScoreAchievedView: FC<{}> = props => -{ - const [ points, setPoints ] = useState(1); - const { trigger = null, setIntParams = null } = useWired(); - - const save = () => setIntParams([ points ]); - - useEffect(() => - { - setPoints((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }, [ trigger ]); - - return ( - - - { LocalizeText('wiredfurni.params.setscore', [ 'points' ], [ points.toString() ]) } - setPoints(event) } /> - - - ); -} diff --git a/src/components/wired/views/triggers/WiredTriggerToggleFurniView.tsx b/src/components/wired/views/triggers/WiredTriggerToggleFurniView.tsx deleted file mode 100644 index 865006b..0000000 --- a/src/components/wired/views/triggers/WiredTriggerToggleFurniView.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; -import { WiredTriggerBaseView } from './WiredTriggerBaseView'; - -export const WiredTriggerToggleFurniView: FC<{}> = props => -{ - return ; -} diff --git a/src/events/catalog/CatalogEvent.ts b/src/events/catalog/CatalogEvent.ts deleted file mode 100644 index 893775a..0000000 --- a/src/events/catalog/CatalogEvent.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class CatalogEvent extends NitroEvent -{ - public static SHOW_CATALOG: string = 'CE_SHOW_CATALOG'; - public static HIDE_CATALOG: string = 'CE_HIDE_CATALOG'; - public static TOGGLE_CATALOG: string = 'CE_TOGGLE_CATALOG'; - public static SOLD_OUT: string = 'CE_SOLD_OUT'; - public static APPROVE_NAME_RESULT: string = 'CE_APPROVE_NAME_RESULT'; - public static PURCHASE_APPROVED: string = 'CE_PURCHASE_APPROVED'; - public static INIT_GIFT: string = 'CE_INIT_GIFT'; - public static CATALOG_RESET: string = 'CE_RESET'; - public static CATALOG_INVISIBLE_PAGE_VISITED: string = 'CE_CATALOG_INVISIBLE_PAGE_VISITED'; -} diff --git a/src/events/catalog/CatalogInitGiftEvent.ts b/src/events/catalog/CatalogInitGiftEvent.ts deleted file mode 100644 index fd9c926..0000000 --- a/src/events/catalog/CatalogInitGiftEvent.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { CatalogEvent } from './CatalogEvent'; - -export class CatalogInitGiftEvent extends CatalogEvent -{ - private _pageId: number; - private _offerId: number; - private _extraData: string; - - constructor(pageId: number, offerId: number, extraData: string) - { - super(CatalogEvent.INIT_GIFT); - - this._pageId = pageId; - this._offerId = offerId; - this._extraData = extraData; - } - - public get pageId(): number - { - return this._pageId; - } - - public get offerId(): number - { - return this._offerId; - } - - public get extraData(): string - { - return this._extraData; - } -} diff --git a/src/events/catalog/CatalogPostMarketplaceOfferEvent.ts b/src/events/catalog/CatalogPostMarketplaceOfferEvent.ts deleted file mode 100644 index d54c6c4..0000000 --- a/src/events/catalog/CatalogPostMarketplaceOfferEvent.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { CatalogEvent } from '.'; -import { FurnitureItem } from '../../api'; - -export class CatalogPostMarketplaceOfferEvent extends CatalogEvent -{ - public static readonly POST_MARKETPLACE = 'CE_POST_MARKETPLACE'; - - private _item: FurnitureItem; - - constructor(item: FurnitureItem) - { - super(CatalogPostMarketplaceOfferEvent.POST_MARKETPLACE); - this._item = item; - } - - public get item(): FurnitureItem - { - return this._item; - } -} diff --git a/src/events/catalog/CatalogPurchaseFailureEvent.ts b/src/events/catalog/CatalogPurchaseFailureEvent.ts deleted file mode 100644 index 59f0633..0000000 --- a/src/events/catalog/CatalogPurchaseFailureEvent.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class CatalogPurchaseFailureEvent extends NitroEvent -{ - public static PURCHASE_FAILED: string = 'CPFE_PURCHASE_FAILED'; - - private _code: number; - - constructor(code: number) - { - super(CatalogPurchaseFailureEvent.PURCHASE_FAILED); - - this._code = code; - } - - public get code(): number - { - return this._code; - } -} diff --git a/src/events/catalog/CatalogPurchaseNotAllowedEvent.ts b/src/events/catalog/CatalogPurchaseNotAllowedEvent.ts deleted file mode 100644 index 78d012b..0000000 --- a/src/events/catalog/CatalogPurchaseNotAllowedEvent.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class CatalogPurchaseNotAllowedEvent extends NitroEvent -{ - public static NOT_ALLOWED: string = 'CPNAE_NOT_ALLOWED'; - - private _code: number; - - constructor(code: number) - { - super(CatalogPurchaseNotAllowedEvent.NOT_ALLOWED); - - this._code = code; - } - - public get code(): number - { - return this._code; - } -} diff --git a/src/events/catalog/CatalogPurchaseOverrideEvent.ts b/src/events/catalog/CatalogPurchaseOverrideEvent.ts deleted file mode 100644 index 7c0b8b5..0000000 --- a/src/events/catalog/CatalogPurchaseOverrideEvent.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { CatalogWidgetEvent } from './CatalogWidgetEvent'; - -export class CatalogPurchaseOverrideEvent extends NitroEvent -{ - private _callback: Function; - - constructor(callback: Function) - { - super(CatalogWidgetEvent.PURCHASE_OVERRIDE); - - this._callback = callback; - } - - public get callback(): Function - { - return this._callback; - } -} diff --git a/src/events/catalog/CatalogPurchaseSoldOutEvent.ts b/src/events/catalog/CatalogPurchaseSoldOutEvent.ts deleted file mode 100644 index a3a43a3..0000000 --- a/src/events/catalog/CatalogPurchaseSoldOutEvent.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class CatalogPurchaseSoldOutEvent extends NitroEvent -{ - public static SOLD_OUT: string = 'CPSOE_SOLD_OUT'; - - constructor() - { - super(CatalogPurchaseSoldOutEvent.SOLD_OUT); - } -} diff --git a/src/events/catalog/CatalogPurchasedEvent.ts b/src/events/catalog/CatalogPurchasedEvent.ts deleted file mode 100644 index dedba46..0000000 --- a/src/events/catalog/CatalogPurchasedEvent.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NitroEvent, PurchaseOKMessageOfferData } from '@nitrots/nitro-renderer'; - -export class CatalogPurchasedEvent extends NitroEvent -{ - public static PURCHASE_SUCCESS: string = 'CPE_PURCHASE_SUCCESS'; - - private _purchase: PurchaseOKMessageOfferData; - - constructor(purchase: PurchaseOKMessageOfferData) - { - super(CatalogPurchasedEvent.PURCHASE_SUCCESS); - - this._purchase = purchase; - } - - public get purchase(): PurchaseOKMessageOfferData - { - return this._purchase; - } -} diff --git a/src/events/catalog/CatalogSetRoomPreviewerStuffDataEvent.ts b/src/events/catalog/CatalogSetRoomPreviewerStuffDataEvent.ts deleted file mode 100644 index 24e91a7..0000000 --- a/src/events/catalog/CatalogSetRoomPreviewerStuffDataEvent.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { IObjectData, NitroEvent } from '@nitrots/nitro-renderer'; -import { CatalogWidgetEvent } from './CatalogWidgetEvent'; - -export class CatalogSetRoomPreviewerStuffDataEvent extends NitroEvent -{ - private _stuffData: IObjectData; - - constructor(stuffData: IObjectData) - { - super(CatalogWidgetEvent.SET_PREVIEWER_STUFFDATA); - - this._stuffData = stuffData; - } - - public get stuffData(): IObjectData - { - return this._stuffData; - } -} diff --git a/src/events/catalog/CatalogWidgetEvent.ts b/src/events/catalog/CatalogWidgetEvent.ts deleted file mode 100644 index fd0e602..0000000 --- a/src/events/catalog/CatalogWidgetEvent.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class CatalogWidgetEvent extends NitroEvent -{ - public static WIDGETS_INITIALIZED: string = 'CWE_CWE_WIDGETS_INITIALIZED'; - public static SELECT_PRODUCT: string = 'CWE_SELECT_PRODUCT'; - public static SET_EXTRA_PARM: string = 'CWE_CWE_SET_EXTRA_PARM'; - public static PURCHASE: string = 'CWE_PURCHASE'; - public static COLOUR_ARRAY: string = 'CWE_COLOUR_ARRAY'; - public static MULTI_COLOUR_ARRAY: string = 'CWE_MULTI_COLOUR_ARRAY'; - public static COLOUR_INDEX: string = 'CWE_COLOUR_INDEX'; - public static TEXT_INPUT: string = 'CWE_TEXT_INPUT'; - public static DROPMENU_SELECT: string = 'CWE_CWE_DROPMENU_SELECT'; - public static PURCHASE_OVERRIDE: string = 'CWE_PURCHASE_OVERRIDE'; - public static SELLABLE_PET_PALETTES: string = 'CWE_SELLABLE_PET_PALETTES'; - public static UPDATE_ROOM_PREVIEW: string = 'CWE_UPDATE_ROOM_PREVIEW'; - public static GUILD_SELECTED: string = 'CWE_GUILD_SELECTED'; - public static TOTAL_PRICE_WIDGET_INITIALIZED: string = 'CWE_TOTAL_PRICE_WIDGET_INITIALIZED'; - public static PRODUCT_OFFER_UPDATED: string = 'CWE_CWE_PRODUCT_OFFER_UPDATED'; - public static SET_PREVIEWER_STUFFDATA: string = 'CWE_CWE_SET_PREVIEWER_STUFFDATA'; - public static EXTRA_PARAM_REQUIRED_FOR_BUY: string = 'CWE_CWE_EXTRA_PARAM_REQUIRED_FOR_BUY'; - public static TOGGLE: string = 'CWE_CWE_TOGGLE'; - public static BUILDER_SUBSCRIPTION_UPDATED: string = 'CWE_CWE_BUILDER_SUBSCRIPTION_UPDATED'; - public static ROOM_CHANGED: string = 'CWE_CWE_ROOM_CHANGED'; - public static SHOW_WARNING_TEXT: string = 'CWE_CWE_SHOW_WARNING_TEXT'; -} diff --git a/src/events/catalog/SetRoomPreviewerStuffDataEvent.ts b/src/events/catalog/SetRoomPreviewerStuffDataEvent.ts deleted file mode 100644 index 5332dfd..0000000 --- a/src/events/catalog/SetRoomPreviewerStuffDataEvent.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { IObjectData, NitroEvent } from '@nitrots/nitro-renderer'; -import { IPurchasableOffer } from '../../api'; - -export class SetRoomPreviewerStuffDataEvent extends NitroEvent -{ - public static UPDATE_STUFF_DATA: string = 'SRPSA_UPDATE_STUFF_DATA'; - - private _offer: IPurchasableOffer; - private _stuffData: IObjectData; - - constructor(offer: IPurchasableOffer, stuffData: IObjectData) - { - super(SetRoomPreviewerStuffDataEvent.UPDATE_STUFF_DATA); - - this._offer = offer; - this._stuffData = stuffData; - } - - public get offer(): IPurchasableOffer - { - return this._offer; - } - - public get stuffData(): IObjectData - { - return this._stuffData; - } -} diff --git a/src/events/catalog/index.ts b/src/events/catalog/index.ts deleted file mode 100644 index a7c1572..0000000 --- a/src/events/catalog/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * from './CatalogEvent'; -export * from './CatalogInitGiftEvent'; -export * from './CatalogPostMarketplaceOfferEvent'; -export * from './CatalogPurchasedEvent'; -export * from './CatalogPurchaseFailureEvent'; -export * from './CatalogPurchaseNotAllowedEvent'; -export * from './CatalogPurchaseOverrideEvent'; -export * from './CatalogPurchaseSoldOutEvent'; -export * from './CatalogSetRoomPreviewerStuffDataEvent'; -export * from './CatalogWidgetEvent'; -export * from './SetRoomPreviewerStuffDataEvent'; diff --git a/src/events/guide-tool/GuideToolEvent.ts b/src/events/guide-tool/GuideToolEvent.ts deleted file mode 100644 index f77cec3..0000000 --- a/src/events/guide-tool/GuideToolEvent.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class GuideToolEvent extends NitroEvent -{ - public static readonly SHOW_GUIDE_TOOL: string = 'GTE_SHOW_GUIDE_TOOL'; - public static readonly HIDE_GUIDE_TOOL: string = 'GTE_HIDE_GUIDE_TOOL'; - public static readonly TOGGLE_GUIDE_TOOL: string = 'GTE_TOGGLE_GUIDE_TOOL'; - public static readonly CREATE_HELP_REQUEST: string = 'GTE_CREATE_HELP_REQUEST'; - public static readonly CREATE_BULLY_REQUEST: string = 'GTE_CREATE_BULLY_REQUEST'; -} diff --git a/src/events/guide-tool/index.ts b/src/events/guide-tool/index.ts deleted file mode 100644 index 6cbff54..0000000 --- a/src/events/guide-tool/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './GuideToolEvent'; diff --git a/src/events/help/HelpNameChangeEvent.ts b/src/events/help/HelpNameChangeEvent.ts deleted file mode 100644 index 44597d0..0000000 --- a/src/events/help/HelpNameChangeEvent.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class HelpNameChangeEvent extends NitroEvent -{ - public static INIT: string = 'HC_NAME_CHANGE_INIT'; -} diff --git a/src/events/help/index.ts b/src/events/help/index.ts deleted file mode 100644 index e89f307..0000000 --- a/src/events/help/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './HelpNameChangeEvent'; diff --git a/src/events/index.ts b/src/events/index.ts deleted file mode 100644 index 4c5e757..0000000 --- a/src/events/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './catalog'; -export * from './guide-tool'; -export * from './help'; -export * from './inventory'; -export * from './room-widgets'; -export * from './room-widgets/thumbnail'; diff --git a/src/events/inventory/InventoryFurniAddedEvent.ts b/src/events/inventory/InventoryFurniAddedEvent.ts deleted file mode 100644 index 409f0be..0000000 --- a/src/events/inventory/InventoryFurniAddedEvent.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class InventoryFurniAddedEvent extends NitroEvent -{ - public static FURNI_ADDED: string = 'IFAE_FURNI_ADDED'; - - constructor( - public readonly id: number, - public readonly spriteId: number, - public readonly category: number) - { - super(InventoryFurniAddedEvent.FURNI_ADDED); - } -} diff --git a/src/events/inventory/index.ts b/src/events/inventory/index.ts deleted file mode 100644 index 58503ea..0000000 --- a/src/events/inventory/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './InventoryFurniAddedEvent'; diff --git a/src/events/room-widgets/index.ts b/src/events/room-widgets/index.ts deleted file mode 100644 index d4ab7a5..0000000 --- a/src/events/room-widgets/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './thumbnail'; diff --git a/src/events/room-widgets/thumbnail/RoomWidgetThumbnailEvent.ts b/src/events/room-widgets/thumbnail/RoomWidgetThumbnailEvent.ts deleted file mode 100644 index dc62c6f..0000000 --- a/src/events/room-widgets/thumbnail/RoomWidgetThumbnailEvent.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class RoomWidgetThumbnailEvent extends NitroEvent -{ - public static SHOW_THUMBNAIL: string = 'NE_SHOW_THUMBNAIL'; - public static HIDE_THUMBNAIL: string = 'NE_HIDE_THUMBNAIL'; - public static TOGGLE_THUMBNAIL: string = 'NE_TOGGLE_THUMBNAIL'; -} diff --git a/src/events/room-widgets/thumbnail/index.ts b/src/events/room-widgets/thumbnail/index.ts deleted file mode 100644 index 56f116d..0000000 --- a/src/events/room-widgets/thumbnail/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './RoomWidgetThumbnailEvent'; diff --git a/src/hooks/UseMountEffect.tsx b/src/hooks/UseMountEffect.tsx deleted file mode 100644 index 0ead14b..0000000 --- a/src/hooks/UseMountEffect.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import { EffectCallback, useEffect } from 'react'; - - -// eslint-disable-next-line react-hooks/exhaustive-deps -const useEffectOnce = (effect: EffectCallback) => useEffect(effect, []); - -export const UseMountEffect = (fn: Function) => useEffectOnce(() => fn()); diff --git a/src/hooks/achievements/index.ts b/src/hooks/achievements/index.ts deleted file mode 100644 index 1a2a81e..0000000 --- a/src/hooks/achievements/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './useAchievements'; diff --git a/src/hooks/achievements/useAchievements.ts b/src/hooks/achievements/useAchievements.ts deleted file mode 100644 index a067ff7..0000000 --- a/src/hooks/achievements/useAchievements.ts +++ /dev/null @@ -1,185 +0,0 @@ -import { AchievementData, AchievementEvent, AchievementsEvent, AchievementsScoreEvent, RequestAchievementsMessageComposer } from '@nitrots/nitro-renderer'; -import { useCallback, useEffect, useMemo, useState } from 'react'; -import { useBetween } from 'use-between'; -import { AchievementCategory, AchievementUtilities, CloneObject, SendMessageComposer } from '../../api'; -import { useMessageEvent } from '../events'; - -const useAchievementsState = () => -{ - const [ needsUpdate, setNeedsUpdate ] = useState(true); - const [ achievementCategories, setAchievementCategories ] = useState([]); - const [ selectedCategoryCode, setSelectedCategoryCode ] = useState(null); - const [ selectedAchievementId, setSelectedAchievementId ] = useState(-1); - const [ achievementScore, setAchievementScore ] = useState(0); - - const getTotalUnseen = useMemo(() => - { - let unseen = 0; - - achievementCategories.forEach(category => unseen += AchievementUtilities.getAchievementCategoryTotalUnseen(category)); - - return unseen; - }, [ achievementCategories ]); - - const getProgress = useMemo(() => - { - let progress = 0; - - achievementCategories.forEach(category => (progress += category.getProgress())); - - return progress; - }, [ achievementCategories ]); - - const getMaxProgress = useMemo(() => - { - let progress = 0; - - achievementCategories.forEach(category => (progress += category.getMaxProgress())); - - return progress; - }, [ achievementCategories ]); - - const scaledProgressPercent = useMemo(() => - { - return ~~((((getProgress - 0) * (100 - 0)) / (getMaxProgress - 0)) + 0); - }, [ getProgress, getMaxProgress ]); - - const selectedCategory = useMemo(() => - { - if(selectedCategoryCode === null) return null; - - return achievementCategories.find(category => (category.code === selectedCategoryCode)); - }, [ achievementCategories, selectedCategoryCode ]); - - const selectedAchievement = useMemo(() => - { - if((selectedAchievementId === -1) || !selectedCategory) return null; - - return selectedCategory.achievements.find(achievement => (achievement.achievementId === selectedAchievementId)); - }, [ selectedCategory, selectedAchievementId ]); - - const setAchievementSeen = useCallback((categoryCode: string, achievementId: number) => - { - setAchievementCategories(prevValue => - { - const newValue = [ ...prevValue ]; - - for(const category of newValue) - { - if(category.code !== categoryCode) continue; - - for(const achievement of category.achievements) - { - if(achievement.achievementId !== achievementId) continue; - - achievement.unseen = 0; - } - } - - return newValue; - }); - }, []); - - useMessageEvent(AchievementEvent, event => - { - const parser = event.getParser(); - const achievement = parser.achievement; - - setAchievementCategories(prevValue => - { - const newValue = [ ...prevValue ]; - const categoryIndex = newValue.findIndex(existing => (existing.code === achievement.category)); - - if(categoryIndex === -1) - { - const category = new AchievementCategory(achievement.category); - - category.achievements.push(achievement); - - newValue.push(category); - } - else - { - const category = CloneObject(newValue[categoryIndex]); - const newAchievements = [ ...category.achievements ]; - const achievementIndex = newAchievements.findIndex(existing => (existing.achievementId === achievement.achievementId)); - let previousAchievement: AchievementData = null; - - if(achievementIndex === -1) - { - newAchievements.push(achievement); - } - else - { - previousAchievement = newAchievements[achievementIndex]; - - newAchievements[achievementIndex] = achievement; - } - - if(!AchievementUtilities.getAchievementIsIgnored(achievement)) - { - achievement.unseen++; - - if(previousAchievement) achievement.unseen += previousAchievement.unseen; - } - - category.achievements = newAchievements; - - newValue[categoryIndex] = category; - } - - return newValue; - }); - }); - - useMessageEvent(AchievementsEvent, event => - { - const parser = event.getParser(); - const categories: AchievementCategory[] = []; - - for(const achievement of parser.achievements) - { - const categoryName = achievement.category; - - let existing = categories.find(category => (category.code === categoryName)); - - if(!existing) - { - existing = new AchievementCategory(categoryName); - - categories.push(existing); - } - - existing.achievements.push(achievement); - } - - setAchievementCategories(categories); - }); - - useMessageEvent(AchievementsScoreEvent, event => - { - const parser = event.getParser(); - - setAchievementScore(parser.score); - }); - - useEffect(() => - { - if(!needsUpdate) return; - - SendMessageComposer(new RequestAchievementsMessageComposer()); - - setNeedsUpdate(false); - }, [ needsUpdate ]); - - useEffect(() => - { - if(!selectedCategoryCode || (selectedAchievementId === -1)) return; - - setAchievementSeen(selectedCategoryCode, selectedAchievementId); - }, [ selectedCategoryCode, selectedAchievementId, setAchievementSeen ]); - - return { achievementCategories, selectedCategoryCode, setSelectedCategoryCode, selectedAchievementId, setSelectedAchievementId, achievementScore, getTotalUnseen, getProgress, getMaxProgress, scaledProgressPercent, selectedCategory, selectedAchievement, setAchievementSeen }; -} - -export const useAchievements = () => useBetween(useAchievementsState); diff --git a/src/hooks/avatar-editor/index.ts b/src/hooks/avatar-editor/index.ts deleted file mode 100644 index ab8a733..0000000 --- a/src/hooks/avatar-editor/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './useAvatarEditor'; -export * from './useFigureData'; diff --git a/src/hooks/avatar-editor/useAvatarEditor.ts b/src/hooks/avatar-editor/useAvatarEditor.ts deleted file mode 100644 index 82dd433..0000000 --- a/src/hooks/avatar-editor/useAvatarEditor.ts +++ /dev/null @@ -1,244 +0,0 @@ -import { AvatarEditorFigureCategory, FigureSetIdsMessageEvent, GetAvatarRenderManager, GetSessionDataManager, IFigurePartSet, IPartColor } from '@nitrots/nitro-renderer'; -import { useCallback, useEffect, useMemo, useState } from 'react'; -import { useBetween } from 'use-between'; -import { AvatarEditorThumbnailsHelper, FigureData, GetClubMemberLevel, IAvatarEditorCategory, IAvatarEditorCategoryPartItem } from '../../api'; -import { useMessageEvent } from '../events'; -import { useFigureData } from './useFigureData'; - -const MAX_PALETTES: number = 2; - -const useAvatarEditorState = () => -{ - const [ isVisible, setIsVisible ] = useState(false); - const [ avatarModels, setAvatarModels ] = useState<{ [index: string]: IAvatarEditorCategory[] }>({}); - const [ activeModelKey, setActiveModelKey ] = useState(''); - const [ maxPaletteCount, setMaxPaletteCount ] = useState(1); - const [ figureSetIds, setFigureSetIds ] = useState([]); - const [ boundFurnitureNames, setBoundFurnitureNames ] = useState([]); - const { gender, selectedParts, selectedColors, loadAvatarData, selectPart, selectColor, getFigureStringWithFace } = useFigureData(); - - const activeModel = useMemo(() => (avatarModels[activeModelKey] ?? null), [ activeModelKey, avatarModels ]); - - const selectedColorParts = useMemo(() => - { - const colorSets: { [index: string]: IPartColor[] } = {}; - - for(const setType of Object.keys(selectedColors)) - { - if(!selectedColors[setType]) continue; - - const parts: IPartColor[] = []; - - for(const paletteId of Object.keys(selectedColors[setType])) - { - const partColor = activeModel.find(category => (category.setType === setType))?.colorItems[paletteId]?.find(partColor => (partColor.id === selectedColors[setType][paletteId])); - - if(partColor) parts.push(partColor); - } - - colorSets[setType] = parts; - } - - return colorSets; - - }, [ activeModel, selectedColors ]); - - const selectEditorPart = useCallback((setType: string, partId: number) => - { - if(!setType || !setType.length) return; - - const category = activeModel.find(category => (category.setType === setType)); - - if(!category || !category.partItems || !category.partItems.length) return; - - const partItem = category.partItems.find(partItem => partItem.id === partId); - - if(!partItem) return; - - if(partItem.isClear) - { - // clear the part - return; - } - - if(GetClubMemberLevel() < partItem.partSet.clubLevel) return; - - setMaxPaletteCount(partItem.maxPaletteCount || 1); - - selectPart(setType, partId); - }, [ activeModel, selectPart ]); - - const selectEditorColor = useCallback((setType: string, paletteId: number, colorId: number) => - { - if(!setType || !setType.length) return; - - const category = activeModel.find(category => (category.setType === setType)); - - if(!category || !category.colorItems || !category.colorItems.length) return; - - const palette = category.colorItems[paletteId]; - - if(!palette || !palette.length) return; - - const partColor = palette.find(partColor => (partColor.id === colorId)); - - if(!partColor) return; - - if(GetClubMemberLevel() < partColor.clubLevel) return; - - selectColor(setType, paletteId, colorId); - }, [ activeModel, selectColor ]); - - useMessageEvent(FigureSetIdsMessageEvent, event => - { - const parser = event.getParser(); - - setFigureSetIds(parser.figureSetIds); - setBoundFurnitureNames(parser.boundsFurnitureNames); - }); - - useEffect(() => - { - AvatarEditorThumbnailsHelper.clearCache(); - }, [ selectedColorParts ]); - - useEffect(() => - { - if(!isVisible) return; - - const newAvatarModels: { [index: string]: IAvatarEditorCategory[] } = {}; - - const buildCategory = (setType: string) => - { - const partItems: IAvatarEditorCategoryPartItem[] = []; - const colorItems: IPartColor[][] = []; - - for(let i = 0; i < MAX_PALETTES; i++) colorItems.push([]); - - const set = GetAvatarRenderManager().structureData.getSetType(setType); - const palette = GetAvatarRenderManager().structureData.getPalette(set.paletteID); - - if(!set || !palette) return null; - - for(const partColor of palette.colors.getValues()) - { - if(!partColor || !partColor.isSelectable) continue; - - for(let i = 0; i < MAX_PALETTES; i++) colorItems[i].push(partColor); - - // TODO - check what this does - /* if(setType !== FigureData.FACE) - { - let i = 0; - - while(i < colorIds.length) - { - if(partColor.id === colorIds[i]) partColors[i] = partColor; - - i++; - } - } */ - } - - let mandatorySetIds: string[] = GetAvatarRenderManager().getMandatoryAvatarPartSetIds(gender, GetClubMemberLevel()); - - const isntMandatorySet = (mandatorySetIds.indexOf(setType) === -1); - - if(isntMandatorySet) partItems.push({ id: -1, isClear: true }); - - const usesColor = (setType !== FigureData.FACE); - const partSets = set.partSets; - - for(let i = (partSets.length); i >= 0; i--) - { - const partSet = partSets.getWithIndex(i); - - if(!partSet || !partSet.isSelectable || ((partSet.gender !== gender) && (partSet.gender !== FigureData.UNISEX))) continue; - - if(partSet.isSellable && figureSetIds.indexOf(partSet.id) === -1) continue; - - let maxPaletteCount = 0; - - for(const part of partSet.parts) maxPaletteCount = Math.max(maxPaletteCount, part.colorLayerIndex); - - partItems.push({ id: partSet.id, partSet, usesColor, maxPaletteCount }); - } - - partItems.sort(partSorter(false)); - - for(let i = 0; i < MAX_PALETTES; i++) colorItems[i].sort(colorSorter); - - return { setType, partItems, colorItems }; - } - - newAvatarModels[AvatarEditorFigureCategory.GENERIC] = [ FigureData.FACE ].map(setType => buildCategory(setType)); - newAvatarModels[AvatarEditorFigureCategory.HEAD] = [ FigureData.HAIR, FigureData.HAT, FigureData.HEAD_ACCESSORIES, FigureData.EYE_ACCESSORIES, FigureData.FACE_ACCESSORIES ].map(setType => buildCategory(setType)); - newAvatarModels[AvatarEditorFigureCategory.TORSO] = [ FigureData.SHIRT, FigureData.CHEST_PRINTS, FigureData.JACKET, FigureData.CHEST_ACCESSORIES ].map(setType => buildCategory(setType)); - newAvatarModels[AvatarEditorFigureCategory.LEGS] = [ FigureData.TROUSERS, FigureData.SHOES, FigureData.TROUSER_ACCESSORIES ].map(setType => buildCategory(setType)); - newAvatarModels[AvatarEditorFigureCategory.WARDROBE] = []; - - setAvatarModels(newAvatarModels); - setActiveModelKey(AvatarEditorFigureCategory.GENERIC); - }, [ isVisible, gender, figureSetIds ]); - - useEffect(() => - { - if(!isVisible) return; - - loadAvatarData(GetSessionDataManager().figure, GetSessionDataManager().gender); - }, [ isVisible, loadAvatarData ]); - - return { isVisible, setIsVisible, avatarModels, activeModelKey, setActiveModelKey, selectedParts, selectedColors, maxPaletteCount, selectedColorParts, selectEditorPart, selectEditorColor, getFigureStringWithFace }; -} - -export const useAvatarEditor = () => useBetween(useAvatarEditorState); - -const partSorter = (hcFirst: boolean) => -{ - return (a: { partSet: IFigurePartSet, usesColor: boolean, isClear?: boolean }, b: { partSet: IFigurePartSet, usesColor: boolean, isClear?: boolean }) => - { - const clubLevelA = (!a.partSet ? -1 : a.partSet.clubLevel); - const clubLevelB = (!b.partSet ? -1 : b.partSet.clubLevel); - const isSellableA = (!a.partSet ? false : a.partSet.isSellable); - const isSellableB = (!b.partSet ? false : b.partSet.isSellable); - - if(isSellableA && !isSellableB) return 1; - - if(isSellableB && !isSellableA) return -1; - - if(hcFirst) - { - if(clubLevelA > clubLevelB) return -1; - - if(clubLevelA < clubLevelB) return 1; - } - else - { - if(clubLevelA < clubLevelB) return -1; - - if(clubLevelA > clubLevelB) return 1; - } - - if(a.partSet.id < b.partSet.id) return -1; - - if(a.partSet.id > b.partSet.id) return 1; - - return 0; - } -} - -const colorSorter = (a: IPartColor, b: IPartColor) => -{ - const clubLevelA = (!a ? -1 : a.clubLevel); - const clubLevelB = (!b ? -1 : b.clubLevel); - - if(clubLevelA < clubLevelB) return -1; - - if(clubLevelA > clubLevelB) return 1; - - if(a.index < b.index) return -1; - - if(a.index > b.index) return 1; - - return 0; -} diff --git a/src/hooks/avatar-editor/useFigureData.ts b/src/hooks/avatar-editor/useFigureData.ts deleted file mode 100644 index 5d68730..0000000 --- a/src/hooks/avatar-editor/useFigureData.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { useCallback, useState } from 'react'; -import { FigureData } from '../../api'; - -const useFigureDataState = () => -{ - const [ selectedParts, setSelectedParts ] = useState<{ [index: string]: number }>({}); - const [ selectedColors, setSelectedColors ] = useState<{ [index: string]: number[] }>({}); - const [ gender, setGender ] = useState(FigureData.MALE); - - const loadAvatarData = useCallback((figureString: string, gender: string) => - { - const parse = (figure: string) => - { - const sets = figure.split('.'); - - if(!sets || !sets.length) return; - - const partSets: { [index: string]: number } = {}; - const colorSets: { [index: string]: number[] } = {}; - - for(const set of sets) - { - const parts = set.split('-'); - - if(!parts.length) continue; - - const setType = parts[0]; - const partId = parseInt(parts[1]); - const colorIds: number[] = []; - - let offset = 2; - - while(offset < parts.length) - { - colorIds.push(parseInt(parts[offset])); - - offset++; - } - - if(!colorIds.length) colorIds.push(0); - - if(partId >= 0) partSets[setType] = partId; - - if(colorIds.length) colorSets[setType] = colorIds; - } - - return { partSets, colorSets }; - } - - const { partSets, colorSets } = parse(figureString); - - setSelectedParts(partSets); - setSelectedColors(colorSets); - setGender(gender); - }, []); - - const selectPart = useCallback((setType: string, partId: number) => - { - if(!setType || !setType.length) return; - - setSelectedParts(prevValue => - { - const newValue = { ...prevValue }; - - newValue[setType] = partId; - - return newValue; - }); - }, []); - - const selectColor = useCallback((setType: string, paletteId: number, colorId: number) => - { - if(!setType || !setType.length) return; - - setSelectedColors(prevValue => - { - const newValue = { ...prevValue }; - - if(!newValue[setType]) newValue[setType] = []; - - if(!newValue[setType][paletteId]) newValue[setType][paletteId] = 0; - - newValue[setType][paletteId] = colorId; - - return newValue; - }) - }, []); - - const getFigureStringWithFace = useCallback((overridePartId: number, override: boolean = true) => - { - const figureSets = [ FigureData.FACE ].map(setType => - { - // Determine the part ID, with an option to override if the set type matches. - let partId = (setType === FigureData.FACE && override) ? overridePartId : selectedParts[setType]; - const colors = selectedColors[setType] || []; - - // Construct the figure set string, including the type, part ID, and any colors. - let figureSet = `${ setType }-${ partId }`; - if (partId >= 0) - { - figureSet += colors.map(color => `-${ color }`).join(''); - } - - return figureSet; - }); - - // Join all figure sets with '.', ensuring to only add '.' between items, not at the end. - return figureSets.join('.'); - }, [ selectedParts, selectedColors ]); - - return { selectedParts, selectedColors, gender, loadAvatarData, selectPart, selectColor, getFigureStringWithFace }; -} - -export const useFigureData = useFigureDataState; diff --git a/src/hooks/camera/index.ts b/src/hooks/camera/index.ts deleted file mode 100644 index 20bea9c..0000000 --- a/src/hooks/camera/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './useCamera'; diff --git a/src/hooks/camera/useCamera.ts b/src/hooks/camera/useCamera.ts deleted file mode 100644 index 78b2eb4..0000000 --- a/src/hooks/camera/useCamera.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { GetRoomCameraWidgetManager, InitCameraMessageEvent, IRoomCameraWidgetEffect, RequestCameraConfigurationComposer, RoomCameraWidgetManagerEvent } from '@nitrots/nitro-renderer'; -import { useEffect, useState } from 'react'; -import { useBetween } from 'use-between'; -import { CameraPicture, SendMessageComposer } from '../../api'; -import { useMessageEvent, useNitroEvent } from '../events'; - -const useCameraState = () => -{ - const [ availableEffects, setAvailableEffects ] = useState([]); - const [ cameraRoll, setCameraRoll ] = useState([]); - const [ selectedPictureIndex, setSelectedPictureIndex ] = useState(-1); - const [ myLevel, setMyLevel ] = useState(10); - const [ price, setPrice ] = useState<{ credits: number, duckets: number, publishDucketPrice: number }>(null); - - useNitroEvent(RoomCameraWidgetManagerEvent.INITIALIZED, event => - { - setAvailableEffects(Array.from(GetRoomCameraWidgetManager().effects.values())); - }); - - useMessageEvent(InitCameraMessageEvent, event => - { - const parser = event.getParser(); - - setPrice({ credits: parser.creditPrice, duckets: parser.ducketPrice, publishDucketPrice: parser.publishDucketPrice }); - }); - - useEffect(() => - { - if(!GetRoomCameraWidgetManager().isLoaded) - { - GetRoomCameraWidgetManager().init(); - - SendMessageComposer(new RequestCameraConfigurationComposer()); - - return; - } - }, []); - - return { availableEffects, cameraRoll, setCameraRoll, selectedPictureIndex, setSelectedPictureIndex, myLevel, price }; -} - -export const useCamera = () => useBetween(useCameraState); diff --git a/src/hooks/catalog/index.ts b/src/hooks/catalog/index.ts deleted file mode 100644 index 75d2984..0000000 --- a/src/hooks/catalog/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './useCatalog'; -export * from './useCatalogPlaceMultipleItems'; -export * from './useCatalogSkipPurchaseConfirmation'; diff --git a/src/hooks/catalog/useCatalog.ts b/src/hooks/catalog/useCatalog.ts deleted file mode 100644 index 2b9d209..0000000 --- a/src/hooks/catalog/useCatalog.ts +++ /dev/null @@ -1,913 +0,0 @@ -import { BuildersClubFurniCountMessageEvent, BuildersClubPlaceRoomItemMessageComposer, BuildersClubPlaceWallItemMessageComposer, BuildersClubQueryFurniCountMessageComposer, BuildersClubSubscriptionStatusMessageEvent, CatalogPageMessageEvent, CatalogPagesListEvent, CatalogPublishedMessageEvent, ClubGiftInfoEvent, CreateLinkEvent, FrontPageItem, FurniturePlaceComposer, FurniturePlacePaintComposer, GetCatalogIndexComposer, GetCatalogPageComposer, GetClubGiftInfo, GetGiftWrappingConfigurationComposer, GetRoomEngine, GetTickerTime, GiftWrappingConfigurationEvent, GuildMembershipsMessageEvent, HabboClubOffersMessageEvent, LegacyDataType, LimitedEditionSoldOutEvent, MarketplaceMakeOfferResult, NodeData, ProductOfferEvent, PurchaseErrorMessageEvent, PurchaseFromCatalogComposer, PurchaseNotAllowedMessageEvent, PurchaseOKMessageEvent, RoomControllerLevel, RoomEngineObjectPlacedEvent, RoomObjectCategory, RoomObjectPlacementSource, RoomObjectType, RoomObjectVariable, RoomPreviewer, SellablePetPalettesMessageEvent, Vector3d } from '@nitrots/nitro-renderer'; -import { useCallback, useEffect, useRef, useState } from 'react'; -import { useBetween } from 'use-between'; -import { BuilderFurniPlaceableStatus, CatalogNode, CatalogPage, CatalogPetPalette, CatalogType, DispatchUiEvent, FurniCategory, GetFurnitureData, GetProductDataForLocalization, GetRoomSession, GiftWrappingConfiguration, ICatalogNode, ICatalogOptions, ICatalogPage, IPageLocalization, IProduct, IPurchasableOffer, IPurchaseOptions, LocalizeText, NotificationAlertType, Offer, PageLocalization, PlacedObjectPurchaseData, PlaySound, Product, ProductTypeEnum, RequestedPage, SearchResult, SendMessageComposer, SoundNames } from '../../api'; -import { CatalogPurchaseFailureEvent, CatalogPurchaseNotAllowedEvent, CatalogPurchaseSoldOutEvent, CatalogPurchasedEvent, InventoryFurniAddedEvent } from '../../events'; -import { useMessageEvent, useNitroEvent, useUiEvent } from '../events'; -import { useNotification } from '../notification'; -import { useCatalogPlaceMultipleItems } from './useCatalogPlaceMultipleItems'; -import { useCatalogSkipPurchaseConfirmation } from './useCatalogSkipPurchaseConfirmation'; - -const DUMMY_PAGE_ID_FOR_OFFER_SEARCH = -12345678; -const DRAG_AND_DROP_ENABLED = true; - -const useCatalogState = () => -{ - const [ isVisible, setIsVisible ] = useState(false); - const [ isBusy, setIsBusy ] = useState(false); - const [ pageId, setPageId ] = useState(-1); - const [ previousPageId, setPreviousPageId ] = useState(-1); - const [ currentType, setCurrentType ] = useState(CatalogType.NORMAL); - const [ rootNode, setRootNode ] = useState(null); - const [ offersToNodes, setOffersToNodes ] = useState>(null); - const [ currentPage, setCurrentPage ] = useState(null); - const [ currentOffer, setCurrentOffer ] = useState(null); - const [ activeNodes, setActiveNodes ] = useState([]); - const [ searchResult, setSearchResult ] = useState(null); - const [ frontPageItems, setFrontPageItems ] = useState([]); - const [ roomPreviewer, setRoomPreviewer ] = useState(null); - const [ navigationHidden, setNavigationHidden ] = useState(false); - const [ purchaseOptions, setPurchaseOptions ] = useState({ quantity: 1, extraData: null, extraParamRequired: false, previewStuffData: null }); - const [ catalogOptions, setCatalogOptions ] = useState({}); - const [ objectMoverRequested, setObjectMoverRequested ] = useState(false); - const [ catalogPlaceMultipleObjects, setCatalogPlaceMultipleObjects ] = useCatalogPlaceMultipleItems(); - const [ catalogSkipPurchaseConfirmation, setCatalogSkipPurchaseConfirmation ] = useCatalogSkipPurchaseConfirmation(); - const [ purchasableOffer, setPurchaseableOffer ] = useState(null); - const [ placedObjectPurchaseData, setPlacedObjectPurchaseData ] = useState(null); - const [ furniCount, setFurniCount ] = useState(0); - const [ furniLimit, setFurniLimit ] = useState(0); - const [ maxFurniLimit, setMaxFurniLimit ] = useState(0); - const [ secondsLeft, setSecondsLeft ] = useState(0); - const [ updateTime, setUpdateTime ] = useState(0); - const [ secondsLeftWithGrace, setSecondsLeftWithGrace ] = useState(0); - const { simpleAlert = null } = useNotification(); - const requestedPage = useRef(new RequestedPage()); - - const resetState = useCallback(() => - { - setPageId(-1); - setPreviousPageId(-1); - setRootNode(null); - setOffersToNodes(null); - setCurrentPage(null); - setCurrentOffer(null); - setActiveNodes([]); - setSearchResult(null); - setFrontPageItems([]); - setIsVisible(false); - }, []); - - const getBuilderFurniPlaceableStatus = useCallback((offer: IPurchasableOffer) => - { - if(!offer) return BuilderFurniPlaceableStatus.MISSING_OFFER; - - if((furniCount < 0) || (furniCount >= furniLimit)) return BuilderFurniPlaceableStatus.FURNI_LIMIT_REACHED; - - const roomSession = GetRoomSession(); - - if(!roomSession) return BuilderFurniPlaceableStatus.NOT_IN_ROOM; - - if(!roomSession.isRoomOwner) return BuilderFurniPlaceableStatus.NOT_ROOM_OWNER; - - if(secondsLeft <= 0) - { - const roomEngine = GetRoomEngine(); - - let objectCount = roomEngine.getRoomObjectCount(roomSession.roomId, RoomObjectCategory.UNIT); - - while(objectCount > 0) - { - const roomObject = roomEngine.getRoomObjectByIndex(roomSession.roomId, objectCount, RoomObjectCategory.UNIT); - const userData = roomSession.userDataManager.getUserDataByIndex(roomObject.id); - - if(userData && (userData.type === RoomObjectType.USER) && (userData.roomIndex !== roomSession.ownRoomIndex) && !userData.isModerator) return BuilderFurniPlaceableStatus.VISITORS_IN_ROOM; - - objectCount--; - } - } - - return BuilderFurniPlaceableStatus.OKAY; - }, [ furniCount, furniLimit, secondsLeft ]); - - const isDraggable = useCallback((offer: IPurchasableOffer) => - { - const roomSession = GetRoomSession(); - - if(((DRAG_AND_DROP_ENABLED && roomSession && offer.page && (offer.page.layoutCode !== 'sold_ltd_items') && (currentType === CatalogType.NORMAL) && (roomSession.isRoomOwner || (roomSession.isGuildRoom && (roomSession.controllerLevel >= RoomControllerLevel.GUILD_MEMBER)))) || ((currentType === CatalogType.BUILDER) && (getBuilderFurniPlaceableStatus(offer) === BuilderFurniPlaceableStatus.OKAY))) && (offer.pricingModel !== Offer.PRICING_MODEL_BUNDLE) && (offer.product.productType !== ProductTypeEnum.EFFECT) && (offer.product.productType !== ProductTypeEnum.HABBO_CLUB)) return true; - - return false; - }, [ currentType, getBuilderFurniPlaceableStatus ]); - - const requestOfferToMover = useCallback((offer: IPurchasableOffer) => - { - if(!isDraggable(offer)) return; - - const product = offer.product; - - if(!product) return; - - let category = 0; - - switch(product.productType) - { - case ProductTypeEnum.FLOOR: - category = RoomObjectCategory.FLOOR; - break; - case ProductTypeEnum.WALL: - category = RoomObjectCategory.WALL; - break; - } - - if(GetRoomEngine().processRoomObjectPlacement(RoomObjectPlacementSource.CATALOG, -(offer.offerId), category, product.productClassId, product.extraParam)) - { - setPurchaseableOffer(offer); - setObjectMoverRequested(true); - - setIsVisible(false); - } - }, [ isDraggable ]); - - const resetRoomPaint = useCallback((planeType: string, type: string) => - { - const roomEngine = GetRoomEngine(); - - let wallType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_WALL_TYPE); - let floorType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_FLOOR_TYPE); - let landscapeType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_LANDSCAPE_TYPE); - - wallType = (wallType && wallType.length) ? wallType : '101'; - floorType = (floorType && floorType.length) ? floorType : '101'; - landscapeType = (landscapeType && landscapeType.length) ? landscapeType : '1.1'; - - switch(planeType) - { - case 'floor': - roomEngine.updateRoomInstancePlaneType(roomEngine.activeRoomId, type, wallType, landscapeType, true); - return; - case 'wallpaper': - roomEngine.updateRoomInstancePlaneType(roomEngine.activeRoomId, floorType, type, landscapeType, true); - return; - case 'landscape': - roomEngine.updateRoomInstancePlaneType(roomEngine.activeRoomId, floorType, wallType, type, true); - return; - default: - roomEngine.updateRoomInstancePlaneType(roomEngine.activeRoomId, floorType, wallType, landscapeType, true); - return; - } - }, []); - - const cancelObjectMover = useCallback(() => - { - if(!purchasableOffer) return; - - GetRoomEngine().cancelRoomObjectInsert(); - - setObjectMoverRequested(false); - setPurchaseableOffer(null); - }, [ purchasableOffer ]); - - const resetObjectMover = useCallback((flag: boolean = true) => - { - setObjectMoverRequested(prevValue => - { - if(prevValue && flag) - { - CreateLinkEvent('catalog/open'); - } - - return false; - }); - }, []); - - const resetPlacedOfferData = useCallback((flag: boolean = false) => - { - if(!flag) resetObjectMover(); - - setPlacedObjectPurchaseData(prevValue => - { - if(prevValue) - { - switch(prevValue.category) - { - case RoomObjectCategory.FLOOR: - GetRoomEngine().removeRoomObjectFloor(prevValue.roomId, prevValue.objectId); - break; - case RoomObjectCategory.WALL: { - - switch(prevValue.furniData.className) - { - case 'floor': - case 'wallpaper': - case 'landscape': - resetRoomPaint('reset', ''); - break; - default: - GetRoomEngine().removeRoomObjectWall(prevValue.roomId, prevValue.objectId); - break; - } - break; - } - default: - GetRoomEngine().deleteRoomObject(prevValue.objectId, prevValue.category); - break; - } - } - - return null; - }); - }, [ resetObjectMover, resetRoomPaint ]); - - const getNodeById = useCallback((id: number, node: ICatalogNode) => - { - if((node.pageId === id) && (node !== rootNode)) return node; - - for(const child of node.children) - { - const found = (getNodeById(id, child) as ICatalogNode); - - if(found) return found; - } - - return null; - }, [ rootNode ]); - - const getNodeByName = useCallback((name: string, node: ICatalogNode) => - { - if((node.pageName === name) && (node !== rootNode)) return node; - - for(const child of node.children) - { - const found = (getNodeByName(name, child) as ICatalogNode); - - if(found) return found; - } - - return null; - }, [ rootNode ]); - - const getNodesByOfferId = useCallback((offerId: number, flag: boolean = false) => - { - if(!offersToNodes || !offersToNodes.size) return null; - - if(flag) - { - const nodes: ICatalogNode[] = []; - const offers = offersToNodes.get(offerId); - - if(offers && offers.length) for(const offer of offers) (offer.isVisible && nodes.push(offer)); - - if(nodes.length) return nodes; - } - - return offersToNodes.get(offerId); - }, [ offersToNodes ]); - - const loadCatalogPage = useCallback((pageId: number, offerId: number) => - { - if(pageId < 0) return; - - setIsBusy(true); - setPageId(pageId); - - if(pageId > -1) SendMessageComposer(new GetCatalogPageComposer(pageId, offerId, currentType)); - }, [ currentType ]); - - const showCatalogPage = useCallback((pageId: number, layoutCode: string, localization: IPageLocalization, offers: IPurchasableOffer[], offerId: number, acceptSeasonCurrencyAsCredits: boolean) => - { - const catalogPage = (new CatalogPage(pageId, layoutCode, localization, offers, acceptSeasonCurrencyAsCredits) as ICatalogPage); - - setCurrentPage(catalogPage); - setPreviousPageId(prevValue => ((pageId !== -1) ? pageId : prevValue)); - setNavigationHidden(false); - - if((offerId > -1) && catalogPage.offers.length) - { - for(const offer of catalogPage.offers) - { - if(offer.offerId !== offerId) continue; - - setCurrentOffer(offer) - - break; - } - } - }, []); - - const activateNode = useCallback((targetNode: ICatalogNode, offerId: number = -1) => - { - cancelObjectMover(); - - if(targetNode.parent.pageName === 'root') - { - if(targetNode.children.length) - { - for(const child of targetNode.children) - { - if(!child.isVisible) continue; - - targetNode = child; - - break; - } - } - } - - const nodes: ICatalogNode[] = []; - - let node = targetNode; - - while(node && (node.pageName !== 'root')) - { - nodes.push(node); - - node = node.parent; - } - - nodes.reverse(); - - setActiveNodes(prevValue => - { - const isActive = (prevValue.indexOf(targetNode) >= 0); - const isOpen = targetNode.isOpen; - - for(const existing of prevValue) - { - existing.deactivate(); - - if(nodes.indexOf(existing) === -1) existing.close(); - } - - for(const n of nodes) - { - n.activate(); - - if(n.parent) n.open(); - - if((n === targetNode.parent) && n.children.length) n.open(); - } - - if(isActive && isOpen) targetNode.close(); - else targetNode.open(); - - return nodes; - }); - - if(targetNode.pageId > -1) loadCatalogPage(targetNode.pageId, offerId); - }, [ setActiveNodes, loadCatalogPage, cancelObjectMover ]); - - const openPageById = useCallback((id: number) => - { - if(id !== -1) setSearchResult(null); - - if(!isVisible) - { - requestedPage.current.requestById = id; - - setIsVisible(true); - } - else - { - const node = getNodeById(id, rootNode); - - if(node) activateNode(node); - } - }, [ isVisible, rootNode, getNodeById, activateNode ]); - - const openPageByName = useCallback((name: string) => - { - setSearchResult(null); - - if(!isVisible) - { - requestedPage.current.requestByName = name; - - setIsVisible(true); - } - else - { - const node = getNodeByName(name, rootNode); - - if(node) activateNode(node); - } - }, [ isVisible, rootNode, getNodeByName, activateNode ]); - - const openPageByOfferId = useCallback((offerId: number) => - { - setSearchResult(null); - - if(!isVisible) - { - requestedPage.current.requestedByOfferId = offerId; - - setIsVisible(true); - } - else - { - const nodes = getNodesByOfferId(offerId); - - if(!nodes || !nodes.length) return; - - activateNode(nodes[0], offerId); - } - }, [ isVisible, getNodesByOfferId, activateNode ]); - - const refreshBuilderStatus = useCallback(() => - { - - }, []); - - useMessageEvent(CatalogPagesListEvent, event => - { - const parser = event.getParser(); - const offers: Map = new Map(); - - const getCatalogNode = (node: NodeData, depth: number, parent: ICatalogNode) => - { - const catalogNode = (new CatalogNode(node, depth, parent) as ICatalogNode); - - for(const offerId of catalogNode.offerIds) - { - if(offers.has(offerId)) offers.get(offerId).push(catalogNode); - else offers.set(offerId, [ catalogNode ]); - } - - depth++; - - for(const child of node.children) catalogNode.addChild(getCatalogNode(child, depth, catalogNode)); - - return catalogNode; - } - - setRootNode(getCatalogNode(parser.root, 0, null)); - setOffersToNodes(offers); - }); - - useMessageEvent(CatalogPageMessageEvent, event => - { - const parser = event.getParser(); - - if(parser.catalogType !== currentType) return; - - const purchasableOffers: IPurchasableOffer[] = []; - - for(const offer of parser.offers) - { - const products: IProduct[] = []; - const productData = GetProductDataForLocalization(offer.localizationId); - - for(const product of offer.products) - { - const furnitureData = GetFurnitureData(product.furniClassId, product.productType); - - products.push(new Product(product.productType, product.furniClassId, product.extraParam, product.productCount, productData, furnitureData, product.uniqueLimitedItem, product.uniqueLimitedSeriesSize, product.uniqueLimitedItemsLeft)); - } - - if(!products.length) continue; - - const purchasableOffer = new Offer(offer.offerId, offer.localizationId, offer.rent, offer.priceCredits, offer.priceActivityPoints, offer.priceActivityPointsType, offer.giftable, offer.clubLevel, products, offer.bundlePurchaseAllowed); - - if((currentType === CatalogType.NORMAL) || ((purchasableOffer.pricingModel !== Offer.PRICING_MODEL_BUNDLE) && (purchasableOffer.pricingModel !== Offer.PRICING_MODEL_MULTI))) purchasableOffers.push(purchasableOffer); - } - - if(parser.frontPageItems && parser.frontPageItems.length) setFrontPageItems(parser.frontPageItems); - - setIsBusy(false); - - if(pageId === parser.pageId) - { - showCatalogPage(parser.pageId, parser.layoutCode, new PageLocalization(parser.localization.images.concat(), parser.localization.texts.concat()), purchasableOffers, parser.offerId, parser.acceptSeasonCurrencyAsCredits); - } - }); - - useMessageEvent(PurchaseOKMessageEvent, event => - { - const parser = event.getParser(); - - DispatchUiEvent(new CatalogPurchasedEvent(parser.offer)); - }); - - useMessageEvent(PurchaseErrorMessageEvent, event => - { - const parser = event.getParser(); - - DispatchUiEvent(new CatalogPurchaseFailureEvent(parser.code)); - }); - - useMessageEvent(PurchaseNotAllowedMessageEvent, event => - { - const parser = event.getParser(); - - DispatchUiEvent(new CatalogPurchaseNotAllowedEvent(parser.code)); - }); - - useMessageEvent(LimitedEditionSoldOutEvent, event => - { - const parser = event.getParser(); - - DispatchUiEvent(new CatalogPurchaseSoldOutEvent()); - }); - - useMessageEvent(ProductOfferEvent, event => - { - const parser = event.getParser(); - const offerData = parser.offer; - - if(!offerData || !offerData.products.length) return; - - const offerProductData = offerData.products[0]; - - if(offerProductData.uniqueLimitedItem) - { - // update unique - } - - const products: IProduct[] = []; - const productData = GetProductDataForLocalization(offerData.localizationId); - - for(const product of offerData.products) - { - const furnitureData = GetFurnitureData(product.furniClassId, product.productType); - - products.push(new Product(product.productType, product.furniClassId, product.extraParam, product.productCount, productData, furnitureData, product.uniqueLimitedItem, product.uniqueLimitedSeriesSize, product.uniqueLimitedItemsLeft)); - } - - const offer = new Offer(offerData.offerId, offerData.localizationId, offerData.rent, offerData.priceCredits, offerData.priceActivityPoints, offerData.priceActivityPointsType, offerData.giftable, offerData.clubLevel, products, offerData.bundlePurchaseAllowed); - - if(!((currentType === CatalogType.NORMAL) || ((offer.pricingModel !== Offer.PRICING_MODEL_BUNDLE) && (offer.pricingModel !== Offer.PRICING_MODEL_MULTI)))) return; - - offer.page = currentPage; - - setCurrentOffer(offer); - - if(offer.product && (offer.product.productType === ProductTypeEnum.WALL)) - { - setPurchaseOptions(prevValue => - { - const newValue = { ...prevValue }; - - newValue.extraData =( offer.product.extraParam || null); - - return newValue; - }); - } - - // (this._isObjectMoverRequested) && (this._purchasableOffer) - }); - - useMessageEvent(SellablePetPalettesMessageEvent, event => - { - const parser = event.getParser(); - const petPalette = new CatalogPetPalette(parser.productCode, parser.palettes.slice()); - - setCatalogOptions(prevValue => - { - const petPalettes = []; - - if(prevValue.petPalettes) petPalettes.push(...prevValue.petPalettes); - - for(let i = 0; i < petPalettes.length; i++) - { - const palette = petPalettes[i]; - - if(palette.breed === petPalette.breed) - { - petPalettes.splice(i, 1); - - break; - } - } - - petPalettes.push(petPalette); - - return { ...prevValue, petPalettes }; - }); - }); - - useMessageEvent(HabboClubOffersMessageEvent, event => - { - const parser = event.getParser(); - - setCatalogOptions(prevValue => - { - const clubOffers = parser.offers; - - return { ...prevValue, clubOffers }; - }); - }); - - useMessageEvent(GuildMembershipsMessageEvent, event => - { - const parser = event.getParser(); - - setCatalogOptions(prevValue => - { - const groups = parser.groups; - - return { ...prevValue, groups }; - }); - }); - - useMessageEvent(GiftWrappingConfigurationEvent, event => - { - const parser = event.getParser(); - - setCatalogOptions(prevValue => - { - const giftConfiguration = new GiftWrappingConfiguration(parser); - - return { ...prevValue, giftConfiguration }; - }); - }); - - useMessageEvent(MarketplaceMakeOfferResult, event => - { - const parser = event.getParser(); - - if(!parser) return; - - let title = ''; - if(parser.result === 1) - { - title = LocalizeText('inventory.marketplace.result.title.success'); - } - else - { - title = LocalizeText('inventory.marketplace.result.title.failure'); - } - - const message = LocalizeText(`inventory.marketplace.result.${ parser.result }`); - - simpleAlert(message, NotificationAlertType.DEFAULT, null, null, title); - }); - - useMessageEvent(ClubGiftInfoEvent, event => - { - const parser = event.getParser(); - - setCatalogOptions(prevValue => - { - const clubGifts = parser; - - return { ...prevValue, clubGifts }; - }); - }); - - useMessageEvent(CatalogPublishedMessageEvent, event => - { - const wasVisible = isVisible; - - resetState(); - - if(wasVisible) simpleAlert(LocalizeText('catalog.alert.published.description'), NotificationAlertType.ALERT, null, null, LocalizeText('catalog.alert.published.title')); - }); - - useMessageEvent(BuildersClubFurniCountMessageEvent, event => - { - const parser = event.getParser(); - - setFurniCount(parser.furniCount); - - refreshBuilderStatus(); - }); - - useMessageEvent(BuildersClubSubscriptionStatusMessageEvent, event => - { - const parser = event.getParser(); - - setFurniLimit(parser.furniLimit); - setMaxFurniLimit(parser.maxFurniLimit); - setSecondsLeft(parser.secondsLeft); - setUpdateTime(GetTickerTime()); - setSecondsLeftWithGrace(parser.secondsLeftWithGrace); - - refreshBuilderStatus(); - }); - - useUiEvent(CatalogPurchasedEvent.PURCHASE_SUCCESS, event => PlaySound(SoundNames.CREDITS)); - - useNitroEvent(RoomEngineObjectPlacedEvent.PLACED, event => - { - if(!objectMoverRequested || (event.type !== RoomEngineObjectPlacedEvent.PLACED)) return; - - resetPlacedOfferData(true); - - if(!purchasableOffer) - { - resetObjectMover(); - - return; - } - - let placed = false; - - const product = purchasableOffer.product; - - if(event.category === RoomObjectCategory.WALL) - { - switch(product.furnitureData.className) - { - case 'floor': - case 'wallpaper': - case 'landscape': - placed = (event.placedOnFloor || event.placedOnWall); - break; - default: - placed = event.placedInRoom; - break; - } - } - else - { - placed = event.placedInRoom; - } - - if(!placed) - { - resetObjectMover(); - - return; - } - - setPlacedObjectPurchaseData(new PlacedObjectPurchaseData(event.roomId, event.objectId, event.category, event.wallLocation, event.x, event.y, event.direction, purchasableOffer)); - - switch(currentType) - { - case CatalogType.NORMAL: { - switch(event.category) - { - case RoomObjectCategory.FLOOR: - GetRoomEngine().addFurnitureFloor(event.roomId, event.objectId, product.productClassId, new Vector3d(event.x, event.y, event.z), new Vector3d(event.direction), 0, new LegacyDataType()); - break; - case RoomObjectCategory.WALL: { - switch(product.furnitureData.className) - { - case 'floor': - case 'wallpaper': - case 'landscape': - resetRoomPaint(product.furnitureData.className, product.extraParam); - break; - default: - GetRoomEngine().addFurnitureWall(event.roomId, event.objectId, product.productClassId, new Vector3d(event.x, event.y, event.z), new Vector3d(event.direction * 45), 0, event.instanceData, 0); - break; - } - } - } - - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - - if(roomObject) roomObject.model.setValue(RoomObjectVariable.FURNITURE_ALPHA_MULTIPLIER, 0.5); - - if(catalogSkipPurchaseConfirmation) - { - SendMessageComposer(new PurchaseFromCatalogComposer(pageId, purchasableOffer.offerId, product.extraParam, 1)); - - if(catalogPlaceMultipleObjects) requestOfferToMover(purchasableOffer); - } - else - { - // confirm - - if(catalogPlaceMultipleObjects) requestOfferToMover(purchasableOffer); - } - break; - } - case CatalogType.BUILDER: { - let pageId = purchasableOffer.page.pageId; - - if(pageId === DUMMY_PAGE_ID_FOR_OFFER_SEARCH) - { - pageId = -1; - } - - switch(event.category) - { - case RoomObjectCategory.FLOOR: - SendMessageComposer(new BuildersClubPlaceRoomItemMessageComposer(pageId, purchasableOffer.offerId, product.extraParam, event.x, event.y, event.direction)); - break; - case RoomObjectCategory.WALL: - SendMessageComposer(new BuildersClubPlaceWallItemMessageComposer(pageId, purchasableOffer.offerId, product.extraParam, event.wallLocation)); - break; - } - - if(catalogPlaceMultipleObjects) requestOfferToMover(purchasableOffer); - break; - } - } - }); - - useUiEvent(InventoryFurniAddedEvent.FURNI_ADDED, event => - { - const roomEngine = GetRoomEngine(); - - if(!placedObjectPurchaseData || (placedObjectPurchaseData.productClassId !== event.spriteId) || (placedObjectPurchaseData.roomId !== roomEngine.activeRoomId)) return; - - switch(event.category) - { - case FurniCategory.FLOOR: { - const floorType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_FLOOR_TYPE); - - if(placedObjectPurchaseData.extraParam !== floorType) SendMessageComposer(new FurniturePlacePaintComposer(event.id)); - break; - } - case FurniCategory.WALL_PAPER: { - const wallType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_WALL_TYPE); - - if(placedObjectPurchaseData.extraParam !== wallType) SendMessageComposer(new FurniturePlacePaintComposer(event.id)); - break; - } - case FurniCategory.LANDSCAPE: { - const landscapeType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_LANDSCAPE_TYPE); - - if(placedObjectPurchaseData.extraParam !== landscapeType) SendMessageComposer(new FurniturePlacePaintComposer(event.id)); - break; - } - default: - SendMessageComposer(new FurniturePlaceComposer(event.id, placedObjectPurchaseData.category, placedObjectPurchaseData.wallLocation, placedObjectPurchaseData.x, placedObjectPurchaseData.y, placedObjectPurchaseData.direction)); - } - - if(!catalogPlaceMultipleObjects) resetPlacedOfferData(); - }); - - useEffect(() => - { - return () => setCurrentOffer(null); - }, [ currentPage ]); - - useEffect(() => - { - if(!isVisible || !rootNode || !offersToNodes || !requestedPage.current) return; - - switch(requestedPage.current.requestType) - { - case RequestedPage.REQUEST_TYPE_NONE: - if(currentPage) return; - - if(rootNode.isBranch) - { - for(const child of rootNode.children) - { - if(child && child.isVisible) - { - activateNode(child); - - return; - } - } - } - return; - case RequestedPage.REQUEST_TYPE_ID: - openPageById(requestedPage.current.requestById); - requestedPage.current.resetRequest(); - return; - case RequestedPage.REQUEST_TYPE_OFFER: - openPageByOfferId(requestedPage.current.requestedByOfferId); - requestedPage.current.resetRequest(); - return; - case RequestedPage.REQUEST_TYPE_NAME: - openPageByName(requestedPage.current.requestByName); - requestedPage.current.resetRequest(); - return; - } - }, [ isVisible, rootNode, offersToNodes, currentPage, activateNode, openPageById, openPageByOfferId, openPageByName ]); - - useEffect(() => - { - if(!searchResult && currentPage && (currentPage.pageId === -1)) openPageById(previousPageId); - }, [ searchResult, currentPage, previousPageId, openPageById ]); - - useEffect(() => - { - if(!currentOffer) return; - - setPurchaseOptions({ quantity: 1, extraData: null, extraParamRequired: false, previewStuffData: null }); - }, [ currentOffer ]); - - useEffect(() => - { - if(!isVisible || rootNode) return; - - SendMessageComposer(new GetGiftWrappingConfigurationComposer()); - SendMessageComposer(new GetClubGiftInfo()); - SendMessageComposer(new GetCatalogIndexComposer(currentType)); - SendMessageComposer(new BuildersClubQueryFurniCountMessageComposer()); - }, [ isVisible, rootNode, currentType ]); - - useEffect(() => - { - setRoomPreviewer(new RoomPreviewer(GetRoomEngine(), ++RoomPreviewer.PREVIEW_COUNTER)); - - return () => - { - setRoomPreviewer(prevValue => - { - prevValue.dispose(); - - return null; - }); - } - }, []); - - return { isVisible, setIsVisible, isBusy, pageId, previousPageId, currentType, rootNode, offersToNodes, currentPage, setCurrentPage, currentOffer, setCurrentOffer, activeNodes, searchResult, setSearchResult, frontPageItems, roomPreviewer, navigationHidden, setNavigationHidden, purchaseOptions, setPurchaseOptions, catalogOptions, setCatalogOptions, getNodeById, getNodeByName, activateNode, openPageById, openPageByName, openPageByOfferId, requestOfferToMover }; -} - -export const useCatalog = () => useBetween(useCatalogState); diff --git a/src/hooks/catalog/useCatalogPlaceMultipleItems.ts b/src/hooks/catalog/useCatalogPlaceMultipleItems.ts deleted file mode 100644 index 39cfd28..0000000 --- a/src/hooks/catalog/useCatalogPlaceMultipleItems.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { useBetween } from 'use-between'; -import { LocalStorageKeys } from '../../api'; -import { useLocalStorage } from '../useLocalStorage'; - -const useCatalogPlaceMultipleItemsState = () => useLocalStorage(LocalStorageKeys.CATALOG_PLACE_MULTIPLE_OBJECTS, false); - -export const useCatalogPlaceMultipleItems = () => useBetween(useCatalogPlaceMultipleItemsState); diff --git a/src/hooks/catalog/useCatalogSkipPurchaseConfirmation.ts b/src/hooks/catalog/useCatalogSkipPurchaseConfirmation.ts deleted file mode 100644 index b2d69a2..0000000 --- a/src/hooks/catalog/useCatalogSkipPurchaseConfirmation.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { useBetween } from 'use-between'; -import { LocalStorageKeys } from '../../api'; -import { useLocalStorage } from '../useLocalStorage'; - -const useCatalogSkipPurchaseConfirmationState = () => useLocalStorage(LocalStorageKeys.CATALOG_SKIP_PURCHASE_CONFIRMATION, false); - -export const useCatalogSkipPurchaseConfirmation = () => useBetween(useCatalogSkipPurchaseConfirmationState); diff --git a/src/hooks/chat-history/index.ts b/src/hooks/chat-history/index.ts deleted file mode 100644 index 970d90f..0000000 --- a/src/hooks/chat-history/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './useChatHistory'; diff --git a/src/hooks/chat-history/useChatHistory.ts b/src/hooks/chat-history/useChatHistory.ts deleted file mode 100644 index b8545a0..0000000 --- a/src/hooks/chat-history/useChatHistory.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { GetGuestRoomResultEvent, NewConsoleMessageEvent, RoomInviteEvent, RoomSessionEvent } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { useBetween } from 'use-between'; -import { ChatEntryType, ChatHistoryCurrentDate, IChatEntry, IRoomHistoryEntry, MessengerHistoryCurrentDate } from '../../api'; -import { useMessageEvent, useNitroEvent } from '../events'; - -const CHAT_HISTORY_MAX = 1000; -const ROOM_HISTORY_MAX = 10; -const MESSENGER_HISTORY_MAX = 1000; - -let CHAT_HISTORY_COUNTER: number = 0; -let MESSENGER_HISTORY_COUNTER: number = 0; - -const useChatHistoryState = () => -{ - const [ chatHistory, setChatHistory ] = useState([]); - const [ roomHistory, setRoomHistory ] = useState([]); - const [ messengerHistory, setMessengerHistory ] = useState([]); - const [ needsRoomInsert, setNeedsRoomInsert ] = useState(false); - - const addChatEntry = (entry: IChatEntry) => - { - entry.id = CHAT_HISTORY_COUNTER++; - - setChatHistory(prevValue => - { - const newValue = [ ...prevValue ]; - - newValue.push(entry); - - if(newValue.length > CHAT_HISTORY_MAX) newValue.shift(); - - return newValue; - }); - } - - const addRoomHistoryEntry = (entry: IRoomHistoryEntry) => - { - setRoomHistory(prevValue => - { - const newValue = [ ...prevValue ]; - - newValue.push(entry); - - if(newValue.length > ROOM_HISTORY_MAX) newValue.shift(); - - return newValue; - }); - } - - const addMessengerEntry = (entry: IChatEntry) => - { - entry.id = MESSENGER_HISTORY_COUNTER++; - - setMessengerHistory(prevValue => - { - const newValue = [ ...prevValue ]; - - newValue.push(entry); - - if(newValue.length > MESSENGER_HISTORY_MAX) newValue.shift(); - - return newValue; - }); - } - - useNitroEvent(RoomSessionEvent.STARTED, event => setNeedsRoomInsert(true)); - - useMessageEvent(GetGuestRoomResultEvent, event => - { - if(!needsRoomInsert) return; - - const parser = event.getParser(); - - if(roomHistory.length) - { - if(roomHistory[(roomHistory.length - 1)].id === parser.data.roomId) return; - } - - addChatEntry({ id: -1, webId: -1, entityId: -1, name: parser.data.roomName, timestamp: ChatHistoryCurrentDate(), type: ChatEntryType.TYPE_ROOM_INFO, roomId: parser.data.roomId }); - - addRoomHistoryEntry({ id: parser.data.roomId, name: parser.data.roomName }); - - setNeedsRoomInsert(false); - }); - - useMessageEvent(NewConsoleMessageEvent, event => - { - const parser = event.getParser(); - - addMessengerEntry({ id: -1, webId: parser.senderId, entityId: -1, name: '', message: parser.messageText, roomId: -1, timestamp: MessengerHistoryCurrentDate(parser.secondsSinceSent), type: ChatEntryType.TYPE_IM }); - }); - - useMessageEvent(RoomInviteEvent, event => - { - const parser = event.getParser(); - - addMessengerEntry({ id: -1, webId: parser.senderId, entityId: -1, name: '', message: parser.messageText, roomId: -1, timestamp: MessengerHistoryCurrentDate(), type: ChatEntryType.TYPE_IM }); - }); - - return { addChatEntry, chatHistory, roomHistory, messengerHistory }; -} - -export const useChatHistory = () => useBetween(useChatHistoryState); diff --git a/src/hooks/events/index.ts b/src/hooks/events/index.ts deleted file mode 100644 index 6d9903b..0000000 --- a/src/hooks/events/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './useEventDispatcher'; -export * from './useMessageEvent'; -export * from './useNitroEvent'; -export * from './useUiEvent'; diff --git a/src/hooks/events/useEventDispatcher.tsx b/src/hooks/events/useEventDispatcher.tsx deleted file mode 100644 index 60555f2..0000000 --- a/src/hooks/events/useEventDispatcher.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { IEventDispatcher, NitroEvent } from '@nitrots/nitro-renderer'; -import { useEffect } from 'react'; - -export const useEventDispatcher = (type: string | string[], eventDispatcher: IEventDispatcher, handler: (event: T) => void, enabled: boolean = true) => -{ - useEffect(() => - { - if(!enabled) return; - - if(Array.isArray(type)) - { - type.map(name => eventDispatcher.addEventListener(name, handler)); - } - else - { - eventDispatcher.addEventListener(type, handler); - } - - return () => - { - if(Array.isArray(type)) - { - type.map(name => eventDispatcher.removeEventListener(name, handler)); - } - else - { - eventDispatcher.removeEventListener(type, handler); - } - } - }, [ type, eventDispatcher, enabled, handler ]); -} diff --git a/src/hooks/events/useMessageEvent.tsx b/src/hooks/events/useMessageEvent.tsx deleted file mode 100644 index 9c4b031..0000000 --- a/src/hooks/events/useMessageEvent.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { GetCommunication, IMessageEvent, MessageEvent } from '@nitrots/nitro-renderer'; -import { useEffect } from 'react'; - -export const useMessageEvent = (eventType: typeof MessageEvent, handler: (event: T) => void) => -{ - useEffect(() => - { - //@ts-ignore - const event = new eventType(handler); - - GetCommunication().registerMessageEvent(event); - - return () => GetCommunication().removeMessageEvent(event); - }, [ eventType, handler ]); -} diff --git a/src/hooks/events/useNitroEvent.tsx b/src/hooks/events/useNitroEvent.tsx deleted file mode 100644 index d8cf60b..0000000 --- a/src/hooks/events/useNitroEvent.tsx +++ /dev/null @@ -1,4 +0,0 @@ -import { GetEventDispatcher, NitroEvent } from '@nitrots/nitro-renderer'; -import { useEventDispatcher } from './useEventDispatcher'; - -export const useNitroEvent = (type: string | string[], handler: (event: T) => void, enabled = true) => useEventDispatcher(type, GetEventDispatcher(), handler, enabled); diff --git a/src/hooks/events/useUiEvent.tsx b/src/hooks/events/useUiEvent.tsx deleted file mode 100644 index 02c0aff..0000000 --- a/src/hooks/events/useUiEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { UI_EVENT_DISPATCHER } from '../../api'; -import { useEventDispatcher } from './useEventDispatcher'; - -export const useUiEvent = (type: string | string[], handler: (event: T) => void, enabled: boolean = true) => useEventDispatcher(type, UI_EVENT_DISPATCHER, handler, enabled); diff --git a/src/hooks/friends/index.ts b/src/hooks/friends/index.ts deleted file mode 100644 index 45c983f..0000000 --- a/src/hooks/friends/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './useFriends'; -export * from './useMessenger'; diff --git a/src/hooks/friends/useFriends.ts b/src/hooks/friends/useFriends.ts deleted file mode 100644 index 603dc54..0000000 --- a/src/hooks/friends/useFriends.ts +++ /dev/null @@ -1,252 +0,0 @@ -import { AcceptFriendMessageComposer, DeclineFriendMessageComposer, FollowFriendMessageComposer, FriendListFragmentEvent, FriendListUpdateComposer, FriendListUpdateEvent, FriendParser, FriendRequestsEvent, GetFriendRequestsComposer, GetSessionDataManager, MessengerInitComposer, MessengerInitEvent, NewFriendRequestEvent, RequestFriendComposer, SetRelationshipStatusComposer } from '@nitrots/nitro-renderer'; -import { useEffect, useMemo, useState } from 'react'; -import { useBetween } from 'use-between'; -import { CloneObject, MessengerFriend, MessengerRequest, MessengerSettings, SendMessageComposer } from '../../api'; -import { useMessageEvent } from '../events'; - -const useFriendsState = () => -{ - const [ friends, setFriends ] = useState([]); - const [ requests, setRequests ] = useState([]); - const [ sentRequests, setSentRequests ] = useState([]); - const [ dismissedRequestIds, setDismissedRequestIds ] = useState([]); - const [ settings, setSettings ] = useState(null); - - const onlineFriends = useMemo(() => - { - const onlineFriends = friends.filter(friend => friend.online); - - onlineFriends.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase())); - - return onlineFriends; - }, [ friends ]); - - const offlineFriends = useMemo(() => - { - const offlineFriends = friends.filter(friend => !friend.online); - - offlineFriends.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase())); - - return offlineFriends; - }, [ friends ]); - - const followFriend = (friend: MessengerFriend) => SendMessageComposer(new FollowFriendMessageComposer(friend.id)); - - const updateRelationship = (friend: MessengerFriend, type: number) => ((type !== friend.relationshipStatus) && SendMessageComposer(new SetRelationshipStatusComposer(friend.id, type))); - - const getFriend = (userId: number) => - { - for(const friend of friends) - { - if(friend.id === userId) return friend; - } - - return null; - } - - const canRequestFriend = (userId: number) => - { - if(userId === GetSessionDataManager().userId) return false; - - if(getFriend(userId)) return false; - - if(requests.find(request => (request.requesterUserId === userId))) return false; - - if(sentRequests.indexOf(userId) >= 0) return false; - - return true; - } - - const requestFriend = (userId: number, userName: string) => - { - if(!canRequestFriend(userId)) return false; - - setSentRequests(prevValue => - { - const newSentRequests = [ ...prevValue ]; - - newSentRequests.push(userId); - - return newSentRequests; - }); - - SendMessageComposer(new RequestFriendComposer(userName)); - } - - const requestResponse = (requestId: number, flag: boolean) => - { - if(requestId === -1 && !flag) - { - SendMessageComposer(new DeclineFriendMessageComposer(true)); - - setRequests([]); - } - else - { - setRequests(prevValue => - { - const newRequests = [ ...prevValue ]; - const index = newRequests.findIndex(request => (request.id === requestId)); - - if(index === -1) return prevValue; - - if(flag) - { - SendMessageComposer(new AcceptFriendMessageComposer(newRequests[index].id)); - } - else - { - SendMessageComposer(new DeclineFriendMessageComposer(false, newRequests[index].id)); - } - - newRequests.splice(index, 1); - - return newRequests; - }); - } - } - - useMessageEvent(MessengerInitEvent, event => - { - const parser = event.getParser(); - - setSettings(new MessengerSettings( - parser.userFriendLimit, - parser.normalFriendLimit, - parser.extendedFriendLimit, - parser.categories)); - - SendMessageComposer(new GetFriendRequestsComposer()); - }); - - useMessageEvent(FriendListFragmentEvent, event => - { - const parser = event.getParser(); - - setFriends(prevValue => - { - const newValue = [ ...prevValue ]; - - for(const friend of parser.fragment) - { - const index = newValue.findIndex(existingFriend => (existingFriend.id === friend.id)); - const newFriend = new MessengerFriend(); - newFriend.populate(friend); - - if(index > -1) newValue[index] = newFriend; - else newValue.push(newFriend); - } - - return newValue; - }); - }); - - useMessageEvent(FriendListUpdateEvent, event => - { - const parser = event.getParser(); - - setFriends(prevValue => - { - const newValue = [ ...prevValue ]; - - const processUpdate = (friend: FriendParser) => - { - const index = newValue.findIndex(existingFriend => (existingFriend.id === friend.id)); - - if(index === -1) - { - const newFriend = new MessengerFriend(); - newFriend.populate(friend); - - newValue.unshift(newFriend); - } - else - { - newValue[index].populate(friend); - } - } - - for(const friend of parser.addedFriends) processUpdate(friend); - - for(const friend of parser.updatedFriends) processUpdate(friend); - - for(const removedFriendId of parser.removedFriendIds) - { - const index = newValue.findIndex(existingFriend => (existingFriend.id === removedFriendId)); - - if(index > -1) newValue.splice(index, 1); - } - - return newValue; - }); - }); - - useMessageEvent(FriendRequestsEvent, event => - { - const parser = event.getParser(); - - setRequests(prevValue => - { - const newValue = [ ...prevValue ]; - - for(const request of parser.requests) - { - const index = newValue.findIndex(existing => (existing.requesterUserId === request.requesterUserId)); - - if(index > 0) - { - newValue[index] = CloneObject(newValue[index]); - newValue[index].populate(request); - } - else - { - const newRequest = new MessengerRequest(); - newRequest.populate(request); - - newValue.push(newRequest); - } - } - - return newValue; - }); - }); - - useMessageEvent(NewFriendRequestEvent, event => - { - const parser = event.getParser(); - const request = parser.request; - - setRequests(prevValue => - { - const newRequests = [ ...prevValue ]; - - const index = newRequests.findIndex(existing => (existing.requesterUserId === request.requesterUserId)); - - if(index === -1) - { - const newRequest = new MessengerRequest(); - newRequest.populate(request); - - newRequests.push(newRequest); - } - - return newRequests; - }); - }); - - useEffect(() => - { - SendMessageComposer(new MessengerInitComposer()); - - const interval = setInterval(() => SendMessageComposer(new FriendListUpdateComposer()), 120000); - - return () => - { - clearInterval(interval); - } - }, []); - - return { friends, requests, sentRequests, dismissedRequestIds, setDismissedRequestIds, settings, onlineFriends, offlineFriends, getFriend, canRequestFriend, requestFriend, requestResponse, followFriend, updateRelationship }; -} - -export const useFriends = () => useBetween(useFriendsState); diff --git a/src/hooks/friends/useMessenger.ts b/src/hooks/friends/useMessenger.ts deleted file mode 100644 index 2b668d5..0000000 --- a/src/hooks/friends/useMessenger.ts +++ /dev/null @@ -1,187 +0,0 @@ -import { GetSessionDataManager, NewConsoleMessageEvent, RoomInviteErrorEvent, RoomInviteEvent, SendMessageComposer as SendMessageComposerPacket } from '@nitrots/nitro-renderer'; -import { useEffect, useMemo, useState } from 'react'; -import { useBetween } from 'use-between'; -import { CloneObject, LocalizeText, MessengerIconState, MessengerThread, MessengerThreadChat, NotificationAlertType, PlaySound, SendMessageComposer, SoundNames } from '../../api'; -import { useMessageEvent } from '../events'; -import { useNotification } from '../notification'; -import { useFriends } from './useFriends'; - -const useMessengerState = () => -{ - const [ messageThreads, setMessageThreads ] = useState([]); - const [ activeThreadId, setActiveThreadId ] = useState(-1); - const [ hiddenThreadIds, setHiddenThreadIds ] = useState([]); - const [ iconState, setIconState ] = useState(MessengerIconState.HIDDEN); - const { getFriend = null } = useFriends(); - const { simpleAlert = null } = useNotification(); - - const visibleThreads = useMemo(() => messageThreads.filter(thread => (hiddenThreadIds.indexOf(thread.threadId) === -1)), [ messageThreads, hiddenThreadIds ]); - const activeThread = useMemo(() => ((activeThreadId > 0) && visibleThreads.find(thread => (thread.threadId === activeThreadId) || null)), [ activeThreadId, visibleThreads ]); - - const getMessageThread = (userId: number) => - { - let thread = messageThreads.find(thread => (thread.participant && (thread.participant.id === userId))); - - if(!thread) - { - const friend = getFriend(userId); - - if(!friend) return null; - - thread = new MessengerThread(friend); - - thread.addMessage(null, LocalizeText('messenger.moderationinfo'), 0, null, MessengerThreadChat.SECURITY_NOTIFICATION); - - thread.setRead(); - - setMessageThreads(prevValue => - { - const newValue = [ ...prevValue ]; - - newValue.push(thread); - - return newValue; - }); - } - else - { - const hiddenIndex = hiddenThreadIds.indexOf(thread.threadId); - - if(hiddenIndex >= 0) - { - setHiddenThreadIds(prevValue => - { - const newValue = [ ...prevValue ]; - - newValue.splice(hiddenIndex, 1); - - return newValue; - }) - } - } - - return thread; - } - - const closeThread = (threadId: number) => - { - setHiddenThreadIds(prevValue => - { - const newValue = [ ...prevValue ]; - - if(newValue.indexOf(threadId) >= 0) return prevValue; - - newValue.push(threadId); - - return newValue; - }); - - if(activeThreadId === threadId) setActiveThreadId(-1); - } - - const sendMessage = (thread: MessengerThread, senderId: number, messageText: string, secondsSinceSent: number = 0, extraData: string = null, messageType: number = MessengerThreadChat.CHAT) => - { - if(!thread || !messageText || !messageText.length) return; - - const ownMessage = (senderId === GetSessionDataManager().userId); - - if(ownMessage && (messageText.length <= 255)) SendMessageComposer(new SendMessageComposerPacket(thread.participant.id, messageText)); - - setMessageThreads(prevValue => - { - const newValue = [ ...prevValue ]; - const index = newValue.findIndex(newThread => (newThread.threadId === thread.threadId)); - - if(index === -1) return prevValue; - - thread = CloneObject(newValue[index]); - - if(ownMessage && (thread.groups.length === 1)) PlaySound(SoundNames.MESSENGER_NEW_THREAD); - - thread.addMessage(((messageType === MessengerThreadChat.ROOM_INVITE) ? null : senderId), messageText, secondsSinceSent, extraData, messageType); - - if(activeThreadId === thread.threadId) thread.setRead(); - - newValue[index] = thread; - - if(!ownMessage && thread.unread) PlaySound(SoundNames.MESSENGER_MESSAGE_RECEIVED); - - return newValue; - }); - } - - useMessageEvent(NewConsoleMessageEvent, event => - { - const parser = event.getParser(); - const thread = getMessageThread(parser.senderId); - - if(!thread) return; - - sendMessage(thread, parser.senderId, parser.messageText, parser.secondsSinceSent, parser.extraData); - }); - - useMessageEvent(RoomInviteEvent, event => - { - const parser = event.getParser(); - const thread = getMessageThread(parser.senderId); - - if(!thread) return; - - sendMessage(thread, parser.senderId, parser.messageText, 0, null, MessengerThreadChat.ROOM_INVITE); - }); - - useMessageEvent(RoomInviteErrorEvent, event => - { - const parser = event.getParser(); - - simpleAlert(`Received room invite error: ${ parser.errorCode },recipients: ${ parser.failedRecipients }`, NotificationAlertType.DEFAULT, null, null, LocalizeText('friendlist.alert.title')); - }); - - useEffect(() => - { - if(activeThreadId <= 0) return; - - setMessageThreads(prevValue => - { - const newValue = [ ...prevValue ]; - const index = newValue.findIndex(newThread => (newThread.threadId === activeThreadId)); - - if(index >= 0) - { - newValue[index] = CloneObject(newValue[index]); - - newValue[index].setRead(); - } - - return newValue; - }); - }, [ activeThreadId ]); - - useEffect(() => - { - setIconState(prevValue => - { - if(!visibleThreads.length) return MessengerIconState.HIDDEN; - - let isUnread = false; - - for(const thread of visibleThreads) - { - if(thread.unreadCount > 0) - { - isUnread = true; - - break; - } - } - - if(isUnread) return MessengerIconState.UNREAD; - - return MessengerIconState.SHOW; - }); - }, [ visibleThreads ]); - - return { messageThreads, activeThread, iconState, visibleThreads, getMessageThread, setActiveThreadId, closeThread, sendMessage }; -} - -export const useMessenger = () => useBetween(useMessengerState); diff --git a/src/hooks/game-center/index.ts b/src/hooks/game-center/index.ts deleted file mode 100644 index 59f0472..0000000 --- a/src/hooks/game-center/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './useGameCenter'; diff --git a/src/hooks/game-center/useGameCenter.ts b/src/hooks/game-center/useGameCenter.ts deleted file mode 100644 index 0b9dbcb..0000000 --- a/src/hooks/game-center/useGameCenter.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { Game2AccountGameStatusMessageEvent, Game2AccountGameStatusMessageParser, GameConfigurationData, GameListMessageEvent, GameStatusMessageEvent, GetGameListMessageComposer, LoadGameUrlEvent } from '@nitrots/nitro-renderer'; -import { useEffect, useState } from 'react'; -import { useBetween } from 'use-between'; -import { SendMessageComposer, VisitDesktop } from '../../api'; -import { useMessageEvent } from '../events'; - -const useGameCenterState = () => -{ - const [ isVisible, setIsVisible ] = useState(false); - const [ games, setGames ] = useState(null); - const [ selectedGame, setSelectedGame ] = useState(null); - const [ accountStatus, setAccountStatus ] = useState(null); - const [ gameOffline, setGameOffline ] = useState(false); - const [ gameURL, setGameURL ] = useState(null); - - useMessageEvent(GameListMessageEvent, event => - { - let parser = event.getParser(); - - if(!parser || parser && !parser.games.length) return; - - setSelectedGame(parser.games[0]); - - setGames(parser.games); - }); - - useMessageEvent(Game2AccountGameStatusMessageEvent, event => - { - let parser = event.getParser(); - - if(!parser) return; - - setAccountStatus(parser); - }); - - useMessageEvent(GameStatusMessageEvent, event => - { - let parser = event.getParser(); - - if(!parser) return; - - setGameOffline(parser.isInMaintenance); - }) - - useMessageEvent(LoadGameUrlEvent, event => - { - let parser = event.getParser(); - - if(!parser) return; - - switch(parser.gameTypeId) - { - case 2: - return console.log('snowwar') - default: - return setGameURL(parser.url); - } - }); - - useEffect(()=> - { - if(isVisible) - { - SendMessageComposer(new GetGameListMessageComposer()); - VisitDesktop(); - } - else - { - // dispose or wtv - } - },[ isVisible ]); - - return { - isVisible, setIsVisible, - games, - accountStatus, - selectedGame, setSelectedGame, - gameOffline, - gameURL, setGameURL - } -} - -export const useGameCenter = () => useBetween(useGameCenterState); diff --git a/src/hooks/groups/index.ts b/src/hooks/groups/index.ts deleted file mode 100644 index 95ef733..0000000 --- a/src/hooks/groups/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './useGroup'; diff --git a/src/hooks/groups/useGroup.ts b/src/hooks/groups/useGroup.ts deleted file mode 100644 index 7a9fd22..0000000 --- a/src/hooks/groups/useGroup.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { GroupBadgePartsComposer, GroupBadgePartsEvent } from '@nitrots/nitro-renderer'; -import { useEffect, useState } from 'react'; -import { useBetween } from 'use-between'; -import { IGroupCustomize, SendMessageComposer } from '../../api'; -import { useMessageEvent } from '../events'; - -const useGroupState = () => -{ - const [ groupCustomize, setGroupCustomize ] = useState(null); - - useMessageEvent(GroupBadgePartsEvent, event => - { - const parser = event.getParser(); - - const customize: IGroupCustomize = { - badgeBases: [], - badgeSymbols: [], - badgePartColors: [], - groupColorsA: [], - groupColorsB: [] - }; - - parser.bases.forEach((images, id) => customize.badgeBases.push({ id, images })); - parser.symbols.forEach((images, id) => customize.badgeSymbols.push({ id, images })); - parser.partColors.forEach((color, id) => customize.badgePartColors.push({ id, color })); - parser.colorsA.forEach((color, id) => customize.groupColorsA.push({ id, color })); - parser.colorsB.forEach((color, id) => customize.groupColorsB.push({ id, color })); - - const CompareId = (a: { id: number }, b: { id: number }) => - { - if(a.id < b.id) return -1; - - if(a.id > b.id) return 1; - - return 0; - } - - customize.badgeBases.sort(CompareId); - customize.badgeSymbols.sort(CompareId); - customize.badgePartColors.sort(CompareId); - customize.groupColorsA.sort(CompareId); - customize.groupColorsB.sort(CompareId); - - setGroupCustomize(customize); - }); - - useEffect(() => - { - SendMessageComposer(new GroupBadgePartsComposer()); - }, []); - - return { groupCustomize }; -} - -export const useGroup = () => useBetween(useGroupState); diff --git a/src/hooks/help/index.ts b/src/hooks/help/index.ts deleted file mode 100644 index f03e754..0000000 --- a/src/hooks/help/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './useHelp'; diff --git a/src/hooks/help/useHelp.ts b/src/hooks/help/useHelp.ts deleted file mode 100644 index 1c74b62..0000000 --- a/src/hooks/help/useHelp.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { CallForHelpDisabledNotifyMessageEvent, CallForHelpPendingCallsDeletedMessageEvent, CallForHelpPendingCallsMessageEvent, CallForHelpReplyMessageEvent, CallForHelpResultMessageEvent, DeletePendingCallsForHelpMessageComposer, GetPendingCallsForHelpMessageComposer, IssueCloseNotificationMessageEvent, SanctionStatusEvent, SanctionStatusMessageParser } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { useBetween } from 'use-between'; -import { CallForHelpResult, GetCloseReasonKey, IHelpReport, LocalizeText, NotificationAlertType, ReportState, ReportType, SendMessageComposer } from '../../api'; -import { useMessageEvent } from '../events'; -import { useNotification } from '../notification'; - -const useHelpState = () => -{ - const [ activeReport, setActiveReport ] = useState(null); - const [ sanctionInfo, setSanctionInfo ] = useState(null); - const { simpleAlert = null, showConfirm = null } = useNotification(); - - const report = (type: number, options: Partial) => - { - const newReport: IHelpReport = { - reportType: type, - reportedUserId: -1, - reportedChats: [], - cfhCategory: -1, - cfhTopic: -1, - roomId: -1, - roomName: '', - messageId: -1, - threadId: -1, - groupId: -1, - extraData: '', - roomObjectId: -1, - message: '', - currentStep: 0 - }; - - switch(type) - { - case ReportType.BULLY: - case ReportType.EMERGENCY: - case ReportType.IM: - newReport.reportedUserId = options.reportedUserId; - newReport.currentStep = ReportState.SELECT_CHATS; - break; - case ReportType.ROOM: - newReport.roomId = options.roomId; - newReport.roomName = options.roomName; - newReport.currentStep = ReportState.SELECT_TOPICS; - break; - case ReportType.THREAD: - newReport.groupId = options.groupId; - newReport.threadId = options.threadId; - newReport.currentStep = ReportState.SELECT_TOPICS; - break; - case ReportType.MESSAGE: - newReport.groupId = options.groupId; - newReport.threadId = options.threadId; - newReport.messageId = options.messageId; - newReport.currentStep = ReportState.SELECT_TOPICS; - break; - case ReportType.PHOTO: - newReport.extraData = options.extraData; - newReport.roomId = options.roomId; - newReport.reportedUserId = options.reportedUserId; - newReport.roomObjectId = options.roomObjectId; - newReport.currentStep = ReportState.SELECT_TOPICS; - break; - case ReportType.GUIDE: - break; - } - - setActiveReport(newReport); - } - - useMessageEvent(CallForHelpResultMessageEvent, event => - { - const parser = event.getParser(); - - let message = parser.messageText; - - switch(parser.resultType) - { - case CallForHelpResult.TOO_MANY_PENDING_CALLS_CODE: - SendMessageComposer(new GetPendingCallsForHelpMessageComposer()); - simpleAlert(LocalizeText('help.cfh.error.pending'), NotificationAlertType.MODERATION, null, null, LocalizeText('help.cfh.error.title')); - break; - case CallForHelpResult.HAS_ABUSIVE_CALL_CODE: - simpleAlert(LocalizeText('help.cfh.error.abusive'), NotificationAlertType.MODERATION, null, null, LocalizeText('help.cfh.error.title')); - break; - default: - if(message.trim().length === 0) - { - message = LocalizeText('help.cfh.sent.text'); - } - - simpleAlert(message, NotificationAlertType.MODERATION, null, null, LocalizeText('help.cfh.sent.title')); - } - }); - - useMessageEvent(IssueCloseNotificationMessageEvent, event => - { - const parser = event.getParser(); - - const message = parser.messageText.length === 0 ? LocalizeText('help.cfh.closed.' + GetCloseReasonKey(parser.closeReason)) : parser.messageText; - - simpleAlert(message, NotificationAlertType.MODERATION, null, null, LocalizeText('mod.alert.title')); - }); - - useMessageEvent(CallForHelpPendingCallsMessageEvent, event => - { - const parser = event.getParser(); - - if(parser.count > 0) - { - showConfirm(LocalizeText('help.emergency.pending.title') + '\n' + parser.pendingCalls[0].message, () => - { - SendMessageComposer(new DeletePendingCallsForHelpMessageComposer()); - }, null, LocalizeText('help.emergency.pending.button.discard'), LocalizeText('help.emergency.pending.button.keep'), LocalizeText('help.emergency.pending.message.subtitle')); - } - }); - - useMessageEvent(CallForHelpPendingCallsDeletedMessageEvent, event => - { - const message = 'Your pending calls were deleted'; // todo: add localization - - simpleAlert(message, NotificationAlertType.MODERATION, null, null, LocalizeText('mod.alert.title')); - }); - - useMessageEvent(CallForHelpReplyMessageEvent, event => - { - const parser = event.getParser(); - - simpleAlert(parser.message, NotificationAlertType.MODERATION, null, null, LocalizeText('help.cfh.reply.title')); - }); - - useMessageEvent(CallForHelpDisabledNotifyMessageEvent, event => - { - const parser = event.getParser(); - - simpleAlert(LocalizeText('help.emergency.global_mute.message'), NotificationAlertType.MODERATION, parser.infoUrl, LocalizeText('help.emergency.global_mute.link'), LocalizeText('help.emergency.global_mute.subtitle')) - }); - - useMessageEvent(SanctionStatusEvent, event => - { - const parser = event.getParser(); - - setSanctionInfo(parser); - }); - - return { activeReport, setActiveReport, sanctionInfo, setSanctionInfo, report }; -} - -export const useHelp = () => useBetween(useHelpState); diff --git a/src/hooks/index.ts b/src/hooks/index.ts deleted file mode 100644 index 58b4afc..0000000 --- a/src/hooks/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -export * from './UseMountEffect'; -export * from './achievements'; -export * from './avatar-editor'; -export * from './camera'; -export * from './catalog'; -export * from './chat-history'; -export * from './events'; -export * from './friends'; -export * from './game-center'; -export * from './groups'; -export * from './help'; -export * from './inventory'; -export * from './mod-tools'; -export * from './navigator'; -export * from './notification'; -export * from './purse'; -export * from './rooms'; -export * from './rooms/engine'; -export * from './rooms/promotes'; -export * from './rooms/widgets'; -export * from './rooms/widgets/furniture'; -export * from './session'; -export * from './useLocalStorage'; -export * from './useSharedVisibility'; -export * from './wired'; diff --git a/src/hooks/inventory/index.ts b/src/hooks/inventory/index.ts deleted file mode 100644 index 4e70819..0000000 --- a/src/hooks/inventory/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './useInventoryBadges'; -export * from './useInventoryBots'; -export * from './useInventoryFurni'; -export * from './useInventoryPets'; -export * from './useInventoryTrade'; -export * from './useInventoryUnseenTracker'; diff --git a/src/hooks/inventory/useInventoryBadges.ts b/src/hooks/inventory/useInventoryBadges.ts deleted file mode 100644 index 766c668..0000000 --- a/src/hooks/inventory/useInventoryBadges.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { BadgeReceivedEvent, BadgesEvent, RequestBadgesComposer, SetActivatedBadgesComposer } from '@nitrots/nitro-renderer'; -import { useEffect, useState } from 'react'; -import { useBetween } from 'use-between'; -import { GetConfigurationValue, SendMessageComposer, UnseenItemCategory } from '../../api'; -import { useMessageEvent } from '../events'; -import { useSharedVisibility } from '../useSharedVisibility'; -import { useInventoryUnseenTracker } from './useInventoryUnseenTracker'; - -const useInventoryBadgesState = () => -{ - const [ needsUpdate, setNeedsUpdate ] = useState(true); - const [ badgeCodes, setBadgeCodes ] = useState([]); - const [ badgeIds, setBadgeIds ] = useState>(new Map()); - const [ activeBadgeCodes, setActiveBadgeCodes ] = useState([]); - const [ selectedBadgeCode, setSelectedBadgeCode ] = useState(null); - const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility(); - const { isUnseen = null, resetCategory = null } = useInventoryUnseenTracker(); - - const maxBadgeCount = GetConfigurationValue('user.badges.max.slots', 5); - const isWearingBadge = (badgeCode: string) => (activeBadgeCodes.indexOf(badgeCode) >= 0); - const canWearBadges = () => (activeBadgeCodes.length < maxBadgeCount); - - const toggleBadge = (badgeCode: string) => - { - setActiveBadgeCodes(prevValue => - { - const newValue = [ ...prevValue ]; - - const index = newValue.indexOf(badgeCode); - - if(index === -1) - { - if(!canWearBadges()) return prevValue; - - newValue.push(badgeCode); - } - else - { - newValue.splice(index, 1); - } - - const composer = new SetActivatedBadgesComposer(); - - for(let i = 0; i < maxBadgeCount; i++) composer.addActivatedBadge(newValue[i] ?? ''); - - SendMessageComposer(composer); - - return newValue; - }); - } - - const getBadgeId = (badgeCode: string) => - { - const index = badgeCodes.indexOf(badgeCode); - - if(index === -1) return 0; - - return (badgeIds.get(badgeCode) ?? 0); - } - - useMessageEvent(BadgesEvent, event => - { - const parser = event.getParser(); - const badgesToAdd: string[] = []; - - setBadgeIds(prevValue => - { - const newValue = new Map(prevValue); - - parser.getAllBadgeCodes().forEach(code => - { - const exists = badgeCodes.indexOf(code) >= 0; - const badgeId = parser.getBadgeId(code); - - newValue.set(code, badgeId); - - if(exists) return; - - badgesToAdd.push(code); - }); - - return newValue; - }); - - setActiveBadgeCodes(parser.getActiveBadgeCodes()); - setBadgeCodes(prev => [ ...prev, ...badgesToAdd ]); - }); - - useMessageEvent(BadgeReceivedEvent, event => - { - const parser = event.getParser(); - const unseen = isUnseen(UnseenItemCategory.BADGE, parser.badgeId); - - setBadgeCodes(prevValue => - { - const newValue = [ ...prevValue ]; - - if(unseen) newValue.unshift(parser.badgeCode) - else newValue.push(parser.badgeCode); - - return newValue; - }); - - setBadgeIds(prevValue => - { - const newValue = new Map(prevValue); - - newValue.set(parser.badgeCode, parser.badgeId); - - return newValue; - }); - }); - - useEffect(() => - { - if(!badgeCodes || !badgeCodes.length) return; - - setSelectedBadgeCode(prevValue => - { - let newValue = prevValue; - - if(newValue && (badgeCodes.indexOf(newValue) === -1)) newValue = null; - - if(!newValue) newValue = badgeCodes[0]; - - return newValue; - }); - }, [ badgeCodes ]); - - useEffect(() => - { - if(!isVisible) return; - - return () => - { - resetCategory(UnseenItemCategory.BADGE); - } - }, [ isVisible, resetCategory ]); - - useEffect(() => - { - if(!isVisible || !needsUpdate) return; - - SendMessageComposer(new RequestBadgesComposer()); - - setNeedsUpdate(false); - }, [ isVisible, needsUpdate ]); - - return { badgeCodes, activeBadgeCodes, selectedBadgeCode, setSelectedBadgeCode, isWearingBadge, canWearBadges, toggleBadge, getBadgeId, activate, deactivate }; -} - -export const useInventoryBadges = () => useBetween(useInventoryBadgesState); diff --git a/src/hooks/inventory/useInventoryBots.ts b/src/hooks/inventory/useInventoryBots.ts deleted file mode 100644 index 55663a5..0000000 --- a/src/hooks/inventory/useInventoryBots.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { BotAddedToInventoryEvent, BotData, BotInventoryMessageEvent, BotRemovedFromInventoryEvent, CreateLinkEvent, GetBotInventoryComposer } from '@nitrots/nitro-renderer'; -import { useEffect, useState } from 'react'; -import { useBetween } from 'use-between'; -import { IBotItem, SendMessageComposer, UnseenItemCategory, cancelRoomObjectPlacement, getPlacingItemId } from '../../api'; -import { useMessageEvent } from '../events'; -import { useSharedVisibility } from '../useSharedVisibility'; -import { useInventoryUnseenTracker } from './useInventoryUnseenTracker'; - -const useInventoryBotsState = () => -{ - const [ needsUpdate, setNeedsUpdate ] = useState(true); - const [ botItems, setBotItems ] = useState([]); - const [ selectedBot, setSelectedBot ] = useState(null); - const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility(); - const { isUnseen = null, resetCategory = null } = useInventoryUnseenTracker(); - - useMessageEvent(BotInventoryMessageEvent, event => - { - const parser = event.getParser(); - - setBotItems(prevValue => - { - const newValue = [ ...prevValue ]; - const existingIds = newValue.map(item => item.botData.id); - const addedDatas: BotData[] = []; - - for(const botData of parser.items.values()) ((existingIds.indexOf(botData.id) === -1) && addedDatas.push(botData)); - - for(const existingId of existingIds) - { - let remove = true; - - for(const botData of parser.items.values()) - { - if(botData.id === existingId) - { - remove = false; - - break; - } - } - - if(!remove) continue; - - const index = newValue.findIndex(item => (item.botData.id === existingId)); - const botItem = newValue[index]; - - if((index === -1) || !botItem) continue; - - if(getPlacingItemId() === botItem.botData.id) - { - cancelRoomObjectPlacement(); - - CreateLinkEvent('inventory/open'); - } - - newValue.splice(index, 1); - } - - for(const botData of addedDatas) - { - const botItem = { botData } as IBotItem; - const unseen = isUnseen(UnseenItemCategory.BOT, botData.id); - - if(unseen) newValue.unshift(botItem); - else newValue.push(botItem); - } - - return newValue; - }); - }); - - useMessageEvent(BotAddedToInventoryEvent, event => - { - const parser = event.getParser(); - - setBotItems(prevValue => - { - const newValue = [ ...prevValue ]; - - const index = newValue.findIndex(item => (item.botData.id === parser.item.id)); - - if(index >= 0) return prevValue; - - const botItem = { botData: parser.item } as IBotItem; - const unseen = isUnseen(UnseenItemCategory.BOT, botItem.botData.id); - - if(unseen) newValue.unshift(botItem); - else newValue.push(botItem); - - return newValue; - }); - }); - - useMessageEvent(BotRemovedFromInventoryEvent, event => - { - const parser = event.getParser(); - - setBotItems(prevValue => - { - const newValue = [ ...prevValue ]; - - const index = newValue.findIndex(item => (item.botData.id === parser.itemId)); - - if(index === -1) return prevValue; - - newValue.splice(index, 1); - - if(getPlacingItemId() === parser.itemId) - { - cancelRoomObjectPlacement(); - - CreateLinkEvent('inventory/show'); - } - - return newValue; - }); - }); - - useEffect(() => - { - if(!botItems || !botItems.length) return; - - setSelectedBot(prevValue => - { - let newValue = prevValue; - - if(newValue && (botItems.indexOf(newValue) === -1)) newValue = null; - - if(!newValue) newValue = botItems[0]; - - return newValue; - }); - }, [ botItems ]); - - useEffect(() => - { - if(!isVisible) return; - - return () => - { - resetCategory(UnseenItemCategory.BOT); - } - }, [ isVisible, resetCategory ]); - - useEffect(() => - { - if(!isVisible || !needsUpdate) return; - - SendMessageComposer(new GetBotInventoryComposer()); - - setNeedsUpdate(false); - }, [ isVisible, needsUpdate ]); - - return { botItems, selectedBot, setSelectedBot, activate, deactivate }; -} - -export const useInventoryBots = () => useBetween(useInventoryBotsState); diff --git a/src/hooks/inventory/useInventoryFurni.ts b/src/hooks/inventory/useInventoryFurni.ts deleted file mode 100644 index b8a6d0d..0000000 --- a/src/hooks/inventory/useInventoryFurni.ts +++ /dev/null @@ -1,298 +0,0 @@ -import { CreateLinkEvent, FurnitureListAddOrUpdateEvent, FurnitureListComposer, FurnitureListEvent, FurnitureListInvalidateEvent, FurnitureListItemParser, FurnitureListRemovedEvent, FurniturePostItPlacedEvent } from '@nitrots/nitro-renderer'; -import { useEffect, useState } from 'react'; -import { useBetween } from 'use-between'; -import { CloneObject, DispatchUiEvent, FurnitureItem, GroupItem, SendMessageComposer, UnseenItemCategory, addFurnitureItem, attemptItemPlacement, cancelRoomObjectPlacement, getAllItemIds, getPlacingItemId, mergeFurniFragments } from '../../api'; -import { InventoryFurniAddedEvent } from '../../events'; -import { useMessageEvent } from '../events'; -import { useSharedVisibility } from '../useSharedVisibility'; -import { useInventoryUnseenTracker } from './useInventoryUnseenTracker'; - -let furniMsgFragments: Map[] = null; - -const useInventoryFurniState = () => -{ - const [ needsUpdate, setNeedsUpdate ] = useState(true); - const [ groupItems, setGroupItems ] = useState([]); - const [ selectedItem, setSelectedItem ] = useState(null); - const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility(); - const { isUnseen = null, resetCategory = null } = useInventoryUnseenTracker(); - - const getItemsByType = (type: number) => - { - if(!groupItems || !groupItems.length) return; - - return groupItems.filter((i) => i.type === type); - } - - const getWallItemById = (id: number) => - { - if(!groupItems || !groupItems.length) return; - - for(const groupItem of groupItems) - { - const item = groupItem.getItemById(id); - - if(item && item.isWallItem) return groupItem; - } - - return null; - } - - const getFloorItemById = (id: number) => - { - if(!groupItems || !groupItems.length) return; - - for(const groupItem of groupItems) - { - const item = groupItem.getItemById(id); - - if(item && !item.isWallItem) return groupItem; - } - - return null; - } - - useMessageEvent(FurnitureListAddOrUpdateEvent, event => - { - const parser = event.getParser(); - - setGroupItems(prevValue => - { - const newValue = [ ...prevValue ]; - - for(const item of parser.items) - { - let i = 0; - let groupItem: GroupItem = null; - - while(i < newValue.length) - { - const group = newValue[i]; - - let j = 0; - - while(j < group.items.length) - { - const furniture = group.items[j]; - - if(furniture.id === item.itemId) - { - furniture.update(item); - - const newFurniture = [ ...group.items ]; - - newFurniture[j] = furniture; - - group.items = newFurniture; - - groupItem = group; - - break; - } - - j++ - } - - if(groupItem) break; - - i++; - } - - if(groupItem) - { - groupItem.hasUnseenItems = true; - - newValue[i] = CloneObject(groupItem); - } - else - { - const furniture = new FurnitureItem(item); - - addFurnitureItem(newValue, furniture, isUnseen(UnseenItemCategory.FURNI, item.itemId)); - - DispatchUiEvent(new InventoryFurniAddedEvent(furniture.id, furniture.type, furniture.category)); - } - } - - return newValue; - }); - }); - - useMessageEvent(FurnitureListEvent, event => - { - const parser = event.getParser(); - - if(!furniMsgFragments) furniMsgFragments = new Array(parser.totalFragments); - - const fragment = mergeFurniFragments(parser.fragment, parser.totalFragments, parser.fragmentNumber, furniMsgFragments); - - if(!fragment) return; - - setGroupItems(prevValue => - { - const newValue = [ ...prevValue ]; - const existingIds = getAllItemIds(newValue); - - for(const existingId of existingIds) - { - if(fragment.get(existingId)) continue; - - let index = 0; - - while(index < newValue.length) - { - const group = newValue[index]; - const item = group.remove(existingId); - - if(!item) - { - index++; - - continue; - } - - if(getPlacingItemId() === item.ref) - { - cancelRoomObjectPlacement(); - - if(!attemptItemPlacement(group)) - { - CreateLinkEvent('inventory/show'); - } - } - - if(group.getTotalCount() <= 0) - { - newValue.splice(index, 1); - - group.dispose(); - } - - break; - } - } - - for(const itemId of fragment.keys()) - { - if(existingIds.indexOf(itemId) >= 0) continue; - - const parser = fragment.get(itemId); - - if(!parser) continue; - - const item = new FurnitureItem(parser); - - addFurnitureItem(newValue, item, isUnseen(UnseenItemCategory.FURNI, itemId)); - - DispatchUiEvent(new InventoryFurniAddedEvent(item.id, item.type, item.category)); - - } - - return newValue; - }); - - furniMsgFragments = null; - }); - - useMessageEvent(FurnitureListInvalidateEvent, event => - { - setNeedsUpdate(true); - }); - - useMessageEvent(FurnitureListRemovedEvent, event => - { - const parser = event.getParser(); - - setGroupItems(prevValue => - { - const newValue = [ ...prevValue ]; - - let index = 0; - - while(index < newValue.length) - { - const group = newValue[index]; - const item = group.remove(parser.itemId); - - if(!item) - { - index++; - - continue; - } - - if(getPlacingItemId() === item.ref) - { - cancelRoomObjectPlacement(); - - if(!attemptItemPlacement(group)) CreateLinkEvent('inventory/show'); - } - - if(group.getTotalCount() <= 0) - { - newValue.splice(index, 1); - - group.dispose(); - } - - break; - } - - return newValue; - }); - }); - - useMessageEvent(FurniturePostItPlacedEvent, event => - { - - }); - - useEffect(() => - { - if(!groupItems || !groupItems.length) return; - - setSelectedItem(prevValue => - { - let newValue = prevValue; - - if(newValue && (groupItems.indexOf(newValue) === -1)) newValue = null; - - if(!newValue) newValue = groupItems[0]; - - return newValue; - }); - }, [ groupItems ]); - - useEffect(() => - { - if(!isVisible) return; - - return () => - { - if(resetCategory(UnseenItemCategory.FURNI)) - { - setGroupItems(prevValue => - { - const newValue = [ ...prevValue ]; - - for(const newGroup of newValue) newGroup.hasUnseenItems = false; - - return newValue; - }); - } - } - }, [ isVisible, resetCategory ]); - - useEffect(() => - { - if(!isVisible || !needsUpdate) return; - - SendMessageComposer(new FurnitureListComposer()); - - setNeedsUpdate(false); - }, [ isVisible, needsUpdate ]); - - return { isVisible, groupItems, setGroupItems, selectedItem, setSelectedItem, activate, deactivate, getWallItemById, getFloorItemById, getItemsByType }; -} - -export const useInventoryFurni = () => useBetween(useInventoryFurniState); diff --git a/src/hooks/inventory/useInventoryPets.ts b/src/hooks/inventory/useInventoryPets.ts deleted file mode 100644 index d95e8bf..0000000 --- a/src/hooks/inventory/useInventoryPets.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { PetAddedToInventoryEvent, PetData, PetInventoryEvent, PetRemovedFromInventory, RequestPetsComposer } from '@nitrots/nitro-renderer'; -import { useEffect, useState } from 'react'; -import { useBetween } from 'use-between'; -import { addSinglePetItem, IPetItem, mergePetFragments, processPetFragment, removePetItemById, SendMessageComposer, UnseenItemCategory } from '../../api'; -import { useMessageEvent } from '../events'; -import { useSharedVisibility } from '../useSharedVisibility'; -import { useInventoryUnseenTracker } from './useInventoryUnseenTracker'; - -let petMsgFragments: Map[] = null; - -const useInventoryPetsState = () => -{ - const [ needsUpdate, setNeedsUpdate ] = useState(true); - const [ petItems, setPetItems ] = useState([]); - const [ selectedPet, setSelectedPet ] = useState(null); - const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility(); - const { isUnseen = null, resetCategory = null } = useInventoryUnseenTracker(); - - useMessageEvent(PetInventoryEvent, event => - { - const parser = event.getParser(); - - if(!petMsgFragments) petMsgFragments = new Array(parser.totalFragments); - - const fragment = mergePetFragments(parser.fragment, parser.totalFragments, parser.fragmentNumber, petMsgFragments); - - if(!fragment) return; - - setPetItems(prevValue => - { - const newValue = [ ...prevValue ]; - - processPetFragment(newValue, fragment, isUnseen); - - return newValue; - }); - - petMsgFragments = null; - }); - - useMessageEvent(PetAddedToInventoryEvent, event => - { - const parser = event.getParser(); - - setPetItems(prevValue => - { - const newValue = [ ...prevValue ]; - - addSinglePetItem(parser.pet, newValue, isUnseen(UnseenItemCategory.PET, parser.pet.id)); - - return newValue; - }); - }); - - useMessageEvent(PetRemovedFromInventory, event => - { - const parser = event.getParser(); - - setPetItems(prevValue => - { - const newValue = [ ...prevValue ]; - - removePetItemById(parser.petId, newValue); - - return newValue; - }); - }); - - useEffect(() => - { - if(!petItems || !petItems.length) return; - - setSelectedPet(prevValue => - { - let newValue = prevValue; - - if(newValue && (petItems.indexOf(newValue) === -1)) newValue = null; - - if(!newValue) newValue = petItems[0]; - - return newValue; - }); - }, [ petItems ]); - - useEffect(() => - { - if(!isVisible) return; - - return () => - { - resetCategory(UnseenItemCategory.PET); - } - }, [ isVisible, resetCategory ]); - - useEffect(() => - { - if(!isVisible || !needsUpdate) return; - - SendMessageComposer(new RequestPetsComposer()); - - setNeedsUpdate(false); - }, [ isVisible, needsUpdate ]); - - return { petItems, selectedPet, setSelectedPet, activate, deactivate }; -} - -export const useInventoryPets = () => useBetween(useInventoryPetsState); diff --git a/src/hooks/inventory/useInventoryTrade.ts b/src/hooks/inventory/useInventoryTrade.ts deleted file mode 100644 index bb83022..0000000 --- a/src/hooks/inventory/useInventoryTrade.ts +++ /dev/null @@ -1,288 +0,0 @@ -import { AdvancedMap, GetSessionDataManager, TradingAcceptComposer, TradingAcceptEvent, TradingCancelComposer, TradingCloseComposer, TradingCloseEvent, TradingCloseParser, TradingCompletedEvent, TradingConfirmationComposer, TradingConfirmationEvent, TradingListItemEvent, TradingListItemRemoveComposer, TradingNotOpenEvent, TradingOpenEvent, TradingOpenFailedEvent, TradingOtherNotAllowedEvent, TradingUnacceptComposer, TradingYouAreNotAllowedEvent } from '@nitrots/nitro-renderer'; -import { useEffect, useState } from 'react'; -import { useBetween } from 'use-between'; -import { CloneObject, GetRoomSession, GroupItem, LocalizeText, SendMessageComposer, TradeState, TradeUserData, TradingNotificationType, parseTradeItems } from '../../api'; -import { useMessageEvent } from '../events'; -import { useNotification } from '../notification'; -import { useInventoryFurni } from './useInventoryFurni'; - -const useInventoryTradeState = () => -{ - const [ ownUser, setOwnUser ] = useState(null); - const [ otherUser, setOtherUser ] = useState(null); - const [ tradeState, setTradeState ] = useState(TradeState.TRADING_STATE_READY); - const { groupItems = [], setGroupItems = null, activate = null, deactivate = null } = useInventoryFurni(); - const { simpleAlert = null, showTradeAlert = null } = useNotification(); - const isTrading = (tradeState >= TradeState.TRADING_STATE_RUNNING); - - const progressTrade = () => - { - switch(tradeState) - { - case TradeState.TRADING_STATE_RUNNING: - if(!otherUser.itemCount && !ownUser.accepts) - { - simpleAlert(LocalizeText('inventory.trading.warning.other_not_offering'), null, null, null); - } - - if(ownUser.accepts) - { - SendMessageComposer(new TradingUnacceptComposer()); - } - else - { - SendMessageComposer(new TradingAcceptComposer()); - } - return; - case TradeState.TRADING_STATE_CONFIRMING: - SendMessageComposer(new TradingConfirmationComposer()); - - setTradeState(TradeState.TRADING_STATE_CONFIRMED); - return; - } - } - - const removeItem = (group: GroupItem) => - { - const item = group.getLastItem(); - - if(!item) return; - - SendMessageComposer(new TradingListItemRemoveComposer(item.id)); - } - - const stopTrading = () => - { - if(!isTrading) return; - - switch(tradeState) - { - case TradeState.TRADING_STATE_RUNNING: - SendMessageComposer(new TradingCloseComposer()); - return; - default: - SendMessageComposer(new TradingCancelComposer()); - return; - } - } - - useMessageEvent(TradingAcceptEvent, event => - { - const parser = event.getParser(); - - if(!ownUser || !otherUser) return; - - if(ownUser.userId === parser.userID) - { - setOwnUser(prevValue => - { - const newValue = CloneObject(prevValue); - - newValue.accepts = parser.userAccepts; - - return newValue; - }); - } - - else if(otherUser.userId === parser.userID) - { - setOtherUser(prevValue => - { - const newValue = CloneObject(prevValue); - - newValue.accepts = parser.userAccepts; - - return newValue; - }); - } - }); - - useMessageEvent(TradingCloseEvent, event => - { - const parser = event.getParser(); - - if(parser.reason === TradingCloseParser.ERROR_WHILE_COMMIT) - { - showTradeAlert(TradingNotificationType.ERROR_WHILE_COMMIT); - } - else - { - if(ownUser && (parser.userID !== ownUser.userId)) - { - showTradeAlert(TradingNotificationType.THEY_CANCELLED); - } - } - - setOwnUser(null); - setOtherUser(null); - setTradeState(TradeState.TRADING_STATE_READY); - }); - - useMessageEvent(TradingCompletedEvent, event => - { - const parser = event.getParser(); - - setOwnUser(null); - setOtherUser(null); - setTradeState(TradeState.TRADING_STATE_READY); - }); - - useMessageEvent(TradingConfirmationEvent, event => - { - const parser = event.getParser(); - - setTradeState(TradeState.TRADING_STATE_COUNTDOWN); - }); - - useMessageEvent(TradingListItemEvent, event => - { - const parser = event.getParser(); - const firstUserItems = parseTradeItems(parser.firstUserItemArray); - const secondUserItems = parseTradeItems(parser.secondUserItemArray); - - setOwnUser(prevValue => - { - const newValue = CloneObject(prevValue); - - if(newValue.userId === parser.firstUserID) - { - newValue.creditsCount = parser.firstUserNumCredits; - newValue.itemCount = parser.firstUserNumItems; - newValue.userItems = firstUserItems; - } - else - { - newValue.creditsCount = parser.secondUserNumCredits; - newValue.itemCount = parser.secondUserNumItems; - newValue.userItems = secondUserItems; - } - - const tradeIds: number[] = []; - - for(const groupItem of newValue.userItems.getValues()) - { - let i = 0; - - while(i < groupItem.getTotalCount()) - { - const item = groupItem.getItemByIndex(i); - - if(item) tradeIds.push(item.ref); - - i++; - } - } - - setGroupItems(prevValue => - { - const newValue = [ ...prevValue ]; - - for(const groupItem of newValue) groupItem.lockItemIds(tradeIds); - - return newValue; - }); - - return newValue; - }); - - setOtherUser(prevValue => - { - const newValue = CloneObject(prevValue); - - if(newValue.userId === parser.firstUserID) - { - newValue.creditsCount = parser.firstUserNumCredits; - newValue.itemCount = parser.firstUserNumItems; - newValue.userItems = firstUserItems; - } - else - { - newValue.creditsCount = parser.secondUserNumCredits; - newValue.itemCount = parser.secondUserNumItems; - newValue.userItems = secondUserItems; - } - - return newValue; - }); - }); - - useMessageEvent(TradingNotOpenEvent, event => - { - const parser = event.getParser(); - }); - - useMessageEvent(TradingOpenEvent, event => - { - const parser = event.getParser(); - - const firstUser = new TradeUserData(); - const firstUserData = GetRoomSession().userDataManager.getUserData(parser.userID); - - firstUser.userItems = new AdvancedMap(); - - const secondUser = new TradeUserData(); - const secondUserData = GetRoomSession().userDataManager.getUserData(parser.otherUserID); - - secondUser.userItems = new AdvancedMap(); - - if(firstUserData.webID === GetSessionDataManager().userId) - { - firstUser.userId = firstUserData.webID; - firstUser.userName = firstUserData.name; - firstUser.canTrade = parser.userCanTrade; - - secondUser.userId = secondUserData.webID; - secondUser.userName = secondUserData.name; - secondUser.canTrade = parser.otherUserCanTrade; - } - - else if(secondUserData.webID === GetSessionDataManager().userId) - { - firstUser.userId = secondUserData.webID; - firstUser.userName = secondUserData.name; - firstUser.canTrade = parser.otherUserCanTrade; - - secondUser.userId = firstUserData.webID; - secondUser.userName = firstUserData.name; - secondUser.canTrade = parser.userCanTrade; - } - - setOwnUser(firstUser); - setOtherUser(secondUser); - setTradeState(TradeState.TRADING_STATE_RUNNING); - }); - - useMessageEvent(TradingOpenFailedEvent, event => - { - const parser = event.getParser(); - - showTradeAlert(parser.reason, parser.otherUserName); - }); - - useMessageEvent(TradingOtherNotAllowedEvent, event => - { - const parser = event.getParser(); - - showTradeAlert(TradingNotificationType.THEY_NOT_ALLOWED); - }); - - useMessageEvent(TradingYouAreNotAllowedEvent, event => - { - const parser = event.getParser(); - - showTradeAlert(TradingNotificationType.YOU_NOT_ALLOWED); - }); - - useEffect(() => - { - if(tradeState === TradeState.TRADING_STATE_READY) return; - - const id = activate(); - - return () => deactivate(id); - }, [ tradeState, activate, deactivate ]); - - return { ownUser, otherUser, tradeState, setTradeState, isTrading, groupItems, progressTrade, removeItem, stopTrading }; -} - -export const useInventoryTrade = () => useBetween(useInventoryTradeState); diff --git a/src/hooks/inventory/useInventoryUnseenTracker.ts b/src/hooks/inventory/useInventoryUnseenTracker.ts deleted file mode 100644 index 90ba66e..0000000 --- a/src/hooks/inventory/useInventoryUnseenTracker.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { UnseenItemsEvent, UnseenResetCategoryComposer, UnseenResetItemsComposer } from '@nitrots/nitro-renderer'; -import { useCallback, useMemo, useState } from 'react'; -import { useBetween } from 'use-between'; -import { SendMessageComposer } from '../../api'; -import { useMessageEvent } from '../events'; - -const sendResetCategoryMessage = (category: number) => SendMessageComposer(new UnseenResetCategoryComposer(category)); -const sendResetItemsMessage = (category: number, itemIds: number[]) => SendMessageComposer(new UnseenResetItemsComposer(category, ...itemIds)); - -const useInventoryUnseenTrackerState = () => -{ - const [ unseenItems, setUnseenItems ] = useState>(new Map()); - - const getCount = useCallback((category: number) => (unseenItems.get(category)?.length || 0), [ unseenItems ]); - - const getFullCount = useMemo(() => - { - let count = 0; - - for(const key of unseenItems.keys()) count += getCount(key); - - return count; - }, [ unseenItems, getCount ]); - - const resetCategory = useCallback((category: number) => - { - let didReset = true; - - setUnseenItems(prevValue => - { - if(!prevValue.has(category)) - { - didReset = false; - - return prevValue; - } - - const newValue = new Map(prevValue); - - newValue.delete(category); - - sendResetCategoryMessage(category); - - return newValue; - }); - - return didReset; - }, []); - - const resetItems = useCallback((category: number, itemIds: number[]) => - { - let didReset = true; - - setUnseenItems(prevValue => - { - if(!prevValue.has(category)) - { - didReset = false; - - return prevValue; - } - - const newValue = new Map(prevValue); - const existing = newValue.get(category); - - if(existing) for(const itemId of itemIds) existing.splice(existing.indexOf(itemId), 1); - - sendResetItemsMessage(category, itemIds); - - return newValue; - }); - - return didReset; - }, []); - - const isUnseen = useCallback((category: number, itemId: number) => - { - if(!unseenItems.has(category)) return false; - - const items = unseenItems.get(category); - - return (items.indexOf(itemId) >= 0); - }, [ unseenItems ]); - - const removeUnseen = useCallback((category: number, itemId: number) => - { - setUnseenItems(prevValue => - { - if(!prevValue.has(category)) return prevValue; - - const newValue = new Map(prevValue); - const items = newValue.get(category); - const index = items.indexOf(itemId); - - if(index >= 0) items.splice(index, 1); - - return newValue; - }); - }, []); - - useMessageEvent(UnseenItemsEvent, event => - { - const parser = event.getParser(); - - setUnseenItems(prevValue => - { - const newValue = new Map(prevValue); - - for(const category of parser.categories) - { - let existing = newValue.get(category); - - if(!existing) - { - existing = []; - - newValue.set(category, existing); - } - - const itemIds = parser.getItemsByCategory(category); - - for(const itemId of itemIds) ((existing.indexOf(itemId) === -1) && existing.push(itemId)); - } - - return newValue; - }); - }); - - return { getCount, getFullCount, resetCategory, resetItems, isUnseen, removeUnseen }; -} - -export const useInventoryUnseenTracker = () => useBetween(useInventoryUnseenTrackerState); diff --git a/src/hooks/mod-tools/index.ts b/src/hooks/mod-tools/index.ts deleted file mode 100644 index 26546fd..0000000 --- a/src/hooks/mod-tools/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './useModTools'; diff --git a/src/hooks/mod-tools/useModTools.ts b/src/hooks/mod-tools/useModTools.ts deleted file mode 100644 index 93628f1..0000000 --- a/src/hooks/mod-tools/useModTools.ts +++ /dev/null @@ -1,207 +0,0 @@ -import { CallForHelpCategoryData, CfhSanctionMessageEvent, CfhTopicsInitEvent, IssueDeletedMessageEvent, IssueInfoMessageEvent, IssueMessageData, IssuePickFailedMessageEvent, ModeratorActionResultMessageEvent, ModeratorInitData, ModeratorInitMessageEvent, ModeratorToolPreferencesEvent } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { useBetween } from 'use-between'; -import { NotificationAlertType, PlaySound, SoundNames } from '../../api'; -import { useMessageEvent } from '../events'; -import { useNotification } from '../notification'; - -const useModToolsState = () => -{ - const [ settings, setSettings ] = useState(null); - const [ openRooms, setOpenRooms ] = useState([]); - const [ openRoomChatlogs, setOpenRoomChatlogs ] = useState([]); - const [ openUserInfos, setOpenUserInfos ] = useState([]); - const [ openUserChatlogs, setOpenUserChatlogs ] = useState([]); - const [ tickets, setTickets ] = useState([]); - const [ cfhCategories, setCfhCategories ] = useState([]); - const { simpleAlert = null } = useNotification(); - - const openRoomInfo = (roomId: number) => - { - if(openRooms.indexOf(roomId) >= 0) return; - - setOpenRooms(prevValue => [ ...prevValue, roomId ]); - } - - const closeRoomInfo = (roomId: number) => - { - setOpenRooms(prevValue => - { - const newValue = [ ...prevValue ]; - const existingIndex = newValue.indexOf(roomId); - - if(existingIndex >= 0) newValue.splice(existingIndex); - - return newValue; - }); - } - - const toggleRoomInfo = (roomId: number) => - { - if(openRooms.indexOf(roomId) >= 0) closeRoomInfo(roomId); - else openRoomInfo(roomId); - } - - const openRoomChatlog = (roomId: number) => - { - if(openRoomChatlogs.indexOf(roomId) >= 0) return; - - setOpenRoomChatlogs(prevValue => [ ...prevValue, roomId ]); - } - - const closeRoomChatlog = (roomId: number) => - { - setOpenRoomChatlogs(prevValue => - { - const newValue = [ ...prevValue ]; - const existingIndex = newValue.indexOf(roomId); - - if(existingIndex >= 0) newValue.splice(existingIndex); - - return newValue; - }); - } - - const toggleRoomChatlog = (roomId: number) => - { - if(openRoomChatlogs.indexOf(roomId) >= 0) closeRoomChatlog(roomId); - else openRoomChatlog(roomId); - } - - const openUserInfo = (userId: number) => - { - if(openUserInfos.indexOf(userId) >= 0) return; - - setOpenUserInfos(prevValue => [ ...prevValue, userId ]); - } - - const closeUserInfo = (userId: number) => - { - setOpenUserInfos(prevValue => - { - const newValue = [ ...prevValue ]; - const existingIndex = newValue.indexOf(userId); - - if(existingIndex >= 0) newValue.splice(existingIndex); - - return newValue; - }); - } - - const toggleUserInfo = (userId: number) => - { - if(openUserInfos.indexOf(userId) >= 0) closeUserInfo(userId); - else openUserInfo(userId); - } - - const openUserChatlog = (userId: number) => - { - if(openUserChatlogs.indexOf(userId) >= 0) return; - - setOpenUserChatlogs(prevValue => [ ...prevValue, userId ]); - } - - const closeUserChatlog = (userId: number) => - { - setOpenUserChatlogs(prevValue => - { - const newValue = [ ...prevValue ]; - const existingIndex = newValue.indexOf(userId); - - if(existingIndex >= 0) newValue.splice(existingIndex); - - return newValue; - }); - } - - const toggleUserChatlog = (userId: number) => - { - if(openRoomChatlogs.indexOf(userId) >= 0) closeUserChatlog(userId); - else openUserChatlog(userId); - } - - useMessageEvent(ModeratorInitMessageEvent, event => - { - const parser = event.getParser(); - const data = parser.data; - - setSettings(data); - setTickets(data.issues); - }); - - useMessageEvent(IssueInfoMessageEvent, event => - { - const parser = event.getParser(); - - setTickets(prevValue => - { - const newValue = [ ...prevValue ]; - const existingIndex = newValue.findIndex(ticket => (ticket.issueId === parser.issueData.issueId)); - - if(existingIndex >= 0) newValue[existingIndex] = parser.issueData; - else - { - newValue.push(parser.issueData); - - PlaySound(SoundNames.MODTOOLS_NEW_TICKET); - } - - return newValue; - }); - }); - - useMessageEvent(ModeratorToolPreferencesEvent, event => - { - const parser = event.getParser(); - }); - - useMessageEvent(IssuePickFailedMessageEvent, event => - { - const parser = event.getParser(); - - if(!parser) return; - - simpleAlert('Failed to pick issue', NotificationAlertType.DEFAULT, null, null, 'Error') - }); - - useMessageEvent(IssueDeletedMessageEvent, event => - { - const parser = event.getParser(); - - setTickets(prevValue => - { - const newValue = [ ...prevValue ]; - const existingIndex = newValue.findIndex(ticket => (ticket.issueId === parser.issueId)); - - if(existingIndex >= 0) newValue.splice(existingIndex, 1); - - return newValue; - }); - }); - - useMessageEvent(ModeratorActionResultMessageEvent, event => - { - const parser = event.getParser(); - - if(parser.success) simpleAlert('Moderation action was successfull', NotificationAlertType.MODERATION, null, null, 'Success'); - else simpleAlert('There was a problem applying tht moderation action', NotificationAlertType.MODERATION, null, null, 'Error'); - }); - - useMessageEvent(CfhTopicsInitEvent, event => - { - const parser = event.getParser(); - - setCfhCategories(parser.callForHelpCategories); - }); - - useMessageEvent(CfhSanctionMessageEvent, event => - { - const parser = event.getParser(); - - // todo: update sanction data - }); - - return { settings, openRooms, openRoomChatlogs, openUserChatlogs, openUserInfos, cfhCategories, tickets, openRoomInfo, closeRoomInfo, toggleRoomInfo, openRoomChatlog, closeRoomChatlog, toggleRoomChatlog, openUserInfo, closeUserInfo, toggleUserInfo, openUserChatlog, closeUserChatlog, toggleUserChatlog }; -} - -export const useModTools = () => useBetween(useModToolsState); diff --git a/src/hooks/navigator/index.ts b/src/hooks/navigator/index.ts deleted file mode 100644 index 1f6f053..0000000 --- a/src/hooks/navigator/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './useNavigator'; diff --git a/src/hooks/navigator/useNavigator.ts b/src/hooks/navigator/useNavigator.ts deleted file mode 100644 index 87d2de3..0000000 --- a/src/hooks/navigator/useNavigator.ts +++ /dev/null @@ -1,442 +0,0 @@ -import { CanCreateRoomEventEvent, CantConnectMessageParser, CreateLinkEvent, DoorbellMessageEvent, FlatAccessDeniedMessageEvent, FlatCreatedEvent, FollowFriendMessageComposer, GenericErrorEvent, GetGuestRoomMessageComposer, GetGuestRoomResultEvent, GetSessionDataManager, GetUserEventCatsMessageComposer, GetUserFlatCatsMessageComposer, HabboWebTools, LegacyExternalInterface, NavigatorCategoryDataParser, NavigatorEventCategoryDataParser, NavigatorHomeRoomEvent, NavigatorMetadataEvent, NavigatorOpenRoomCreatorEvent, NavigatorSearchEvent, NavigatorSearchResultSet, NavigatorTopLevelContext, RoomDataParser, RoomDoorbellAcceptedEvent, RoomEnterErrorEvent, RoomEntryInfoMessageEvent, RoomForwardEvent, RoomScoreEvent, RoomSettingsUpdatedEvent, SecurityLevel, UserEventCatsEvent, UserFlatCatsEvent, UserInfoEvent, UserPermissionsEvent } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { useBetween } from 'use-between'; -import { CreateRoomSession, DoorStateType, GetConfigurationValue, INavigatorData, LocalizeText, NotificationAlertType, SendMessageComposer, TryVisitRoom, VisitDesktop } from '../../api'; -import { useMessageEvent } from '../events'; -import { useNotification } from '../notification'; - -const useNavigatorState = () => -{ - const [ categories, setCategories ] = useState(null); - const [ eventCategories, setEventCategories ] = useState(null); - const [ topLevelContext, setTopLevelContext ] = useState(null); - const [ topLevelContexts, setTopLevelContexts ] = useState(null); - const [ doorData, setDoorData ] = useState<{ roomInfo: RoomDataParser, state: number }>({ roomInfo: null, state: DoorStateType.NONE }); - const [ searchResult, setSearchResult ] = useState(null); - const [ navigatorData, setNavigatorData ] = useState({ - settingsReceived: false, - homeRoomId: 0, - enteredGuestRoom: null, - currentRoomOwner: false, - currentRoomId: 0, - currentRoomIsStaffPick: false, - createdFlatId: 0, - avatarId: 0, - roomPicker: false, - eventMod: false, - currentRoomRating: 0, - canRate: true - }); - const { simpleAlert = null } = useNotification(); - - useMessageEvent(RoomSettingsUpdatedEvent, event => - { - const parser = event.getParser(); - - SendMessageComposer(new GetGuestRoomMessageComposer(parser.roomId, false, false)); - }); - - useMessageEvent(CanCreateRoomEventEvent, event => - { - const parser = event.getParser(); - - if(parser.canCreate) - { - // show room event cvreate - - return; - } - - simpleAlert(LocalizeText(`navigator.cannotcreateevent.error.${ parser.errorCode }`), null, null, null, LocalizeText('navigator.cannotcreateevent.title')); - }); - - useMessageEvent(UserInfoEvent, event => - { - SendMessageComposer(new GetUserFlatCatsMessageComposer()); - SendMessageComposer(new GetUserEventCatsMessageComposer()); - }); - - useMessageEvent(UserPermissionsEvent, event => - { - const parser = event.getParser(); - - setNavigatorData(prevValue => - { - const newValue = { ...prevValue }; - - newValue.eventMod = (parser.securityLevel >= SecurityLevel.MODERATOR); - newValue.roomPicker = (parser.securityLevel >= SecurityLevel.COMMUNITY); - - return newValue; - }); - }); - - useMessageEvent(RoomForwardEvent, event => - { - const parser = event.getParser(); - - TryVisitRoom(parser.roomId); - }); - - useMessageEvent(RoomEntryInfoMessageEvent, event => - { - const parser = event.getParser(); - - setNavigatorData(prevValue => - { - const newValue = { ...prevValue }; - - newValue.enteredGuestRoom = null; - newValue.currentRoomOwner = parser.isOwner; - newValue.currentRoomId = parser.roomId; - - return newValue; - }); - - // close room info - // close room settings - // close room filter - - SendMessageComposer(new GetGuestRoomMessageComposer(parser.roomId, true, false)); - - if(LegacyExternalInterface.available) LegacyExternalInterface.call('legacyTrack', 'navigator', 'private', [ parser.roomId ]); - }); - - useMessageEvent(GetGuestRoomResultEvent, event => - { - const parser = event.getParser(); - - if(parser.roomEnter) - { - setDoorData({ roomInfo: null, state: DoorStateType.NONE }); - - setNavigatorData(prevValue => - { - const newValue = { ...prevValue }; - - newValue.enteredGuestRoom = parser.data; - newValue.currentRoomIsStaffPick = parser.staffPick; - - const isCreated = (newValue.createdFlatId === parser.data.roomId); - - if(!isCreated && parser.data.displayRoomEntryAd) - { - if(GetConfigurationValue('roomenterad.habblet.enabled', false)) HabboWebTools.openRoomEnterAd(); - } - - newValue.createdFlatId = 0; - - if(newValue.enteredGuestRoom && (newValue.enteredGuestRoom.habboGroupId > 0)) - { - // close event info - } - - return newValue; - }); - } - else if(parser.roomForward) - { - if((parser.data.ownerName !== GetSessionDataManager().userName) && !parser.isGroupMember) - { - switch(parser.data.doorMode) - { - case RoomDataParser.DOORBELL_STATE: - setDoorData(prevValue => - { - const newValue = { ...prevValue }; - - newValue.roomInfo = parser.data; - newValue.state = DoorStateType.START_DOORBELL; - - return newValue; - }); - return; - case RoomDataParser.PASSWORD_STATE: - setDoorData(prevValue => - { - const newValue = { ...prevValue }; - - newValue.roomInfo = parser.data; - newValue.state = DoorStateType.START_PASSWORD; - - return newValue; - }); - return; - } - } - - if((parser.data.doorMode === RoomDataParser.NOOB_STATE) && !GetSessionDataManager().isAmbassador && !GetSessionDataManager().isRealNoob && !GetSessionDataManager().isModerator) return; - - CreateRoomSession(parser.data.roomId); - } - else - { - setNavigatorData(prevValue => - { - const newValue = { ...prevValue }; - - newValue.enteredGuestRoom = parser.data; - newValue.currentRoomIsStaffPick = parser.staffPick; - - return newValue; - }); - } - }); - - useMessageEvent(RoomScoreEvent, event => - { - const parser = event.getParser(); - - setNavigatorData(prevValue => - { - const newValue = { ...prevValue }; - - newValue.currentRoomRating = parser.totalLikes; - newValue.canRate = parser.canLike; - - return newValue; - }); - }); - - useMessageEvent(DoorbellMessageEvent, event => - { - const parser = event.getParser(); - - if(!parser.userName || (parser.userName.length === 0)) - { - setDoorData(prevValue => - { - const newValue = { ...prevValue }; - - newValue.state = DoorStateType.STATE_WAITING; - - return newValue; - }); - } - }); - - useMessageEvent(RoomDoorbellAcceptedEvent, event => - { - const parser = event.getParser(); - - if(!parser.userName || (parser.userName.length === 0)) - { - setDoorData(prevValue => - { - const newValue = { ...prevValue }; - - newValue.state = DoorStateType.STATE_ACCEPTED; - - return newValue; - }); - } - }); - - useMessageEvent(FlatAccessDeniedMessageEvent, event => - { - const parser = event.getParser(); - - if(!parser.userName || (parser.userName.length === 0)) - { - setDoorData(prevValue => - { - const newValue = { ...prevValue }; - - newValue.state = DoorStateType.STATE_NO_ANSWER; - - return newValue; - }); - } - }); - - useMessageEvent(GenericErrorEvent, event => - { - const parser = event.getParser(); - - switch(parser.errorCode) - { - case -100002: - setDoorData(prevValue => - { - const newValue = { ...prevValue }; - - newValue.state = DoorStateType.STATE_WRONG_PASSWORD; - - return newValue; - }); - return; - case 4009: - simpleAlert(LocalizeText('navigator.alert.need.to.be.vip'), NotificationAlertType.DEFAULT, null, null, LocalizeText('generic.alert.title')); - - return; - case 4010: - simpleAlert(LocalizeText('navigator.alert.invalid_room_name'), NotificationAlertType.DEFAULT, null, null, LocalizeText('generic.alert.title')); - - return; - case 4011: - simpleAlert(LocalizeText('navigator.alert.cannot_perm_ban'), NotificationAlertType.DEFAULT, null, null, LocalizeText('generic.alert.title')); - - return; - case 4013: - simpleAlert(LocalizeText('navigator.alert.room_in_maintenance'), NotificationAlertType.DEFAULT, null, null, LocalizeText('generic.alert.title')); - - return; - } - }); - - useMessageEvent(NavigatorMetadataEvent, event => - { - const parser = event.getParser(); - - setTopLevelContexts(parser.topLevelContexts); - setTopLevelContext(parser.topLevelContexts.length ? parser.topLevelContexts[0] : null); - }); - - useMessageEvent(NavigatorSearchEvent, event => - { - const parser = event.getParser(); - - setTopLevelContext(prevValue => - { - let newValue = prevValue; - - if(!newValue) newValue = ((topLevelContexts && topLevelContexts.length && topLevelContexts[0]) || null); - - if(!newValue) return null; - - if((parser.result.code !== newValue.code) && topLevelContexts && topLevelContexts.length) - { - for(const context of topLevelContexts) - { - if(context.code !== parser.result.code) continue; - - newValue = context; - } - } - - for(const context of topLevelContexts) - { - if(context.code !== parser.result.code) continue; - - newValue = context; - } - - return newValue; - }); - - setSearchResult(parser.result); - }); - - useMessageEvent(UserFlatCatsEvent, event => - { - const parser = event.getParser(); - - setCategories(parser.categories); - }); - - useMessageEvent(UserEventCatsEvent, event => - { - const parser = event.getParser(); - - setEventCategories(parser.categories); - }); - - useMessageEvent(FlatCreatedEvent, event => - { - const parser = event.getParser(); - - CreateRoomSession(parser.roomId); - }); - - useMessageEvent(NavigatorHomeRoomEvent, event => - { - const parser = event.getParser(); - - let prevSettingsReceived = false; - - setNavigatorData(prevValue => - { - prevSettingsReceived = prevValue.settingsReceived; - - const newValue = { ...prevValue }; - - newValue.homeRoomId = parser.homeRoomId; - newValue.settingsReceived = true; - - return newValue; - }); - - if(prevSettingsReceived) - { - // refresh room info window - return; - } - - let forwardType = -1; - let forwardId = -1; - - if((GetConfigurationValue('friend.id') !== undefined) && (parseInt(GetConfigurationValue('friend.id')) > 0)) - { - forwardType = 0; - SendMessageComposer(new FollowFriendMessageComposer(parseInt(GetConfigurationValue('friend.id')))); - } - - if((GetConfigurationValue('forward.type') !== undefined) && (GetConfigurationValue('forward.id') !== undefined)) - { - forwardType = parseInt(GetConfigurationValue('forward.type')); - forwardId = parseInt(GetConfigurationValue('forward.id')) - } - - if(forwardType === 2) - { - TryVisitRoom(forwardId); - } - - else if((forwardType === -1) && (parser.roomIdToEnter > 0)) - { - CreateLinkEvent('navigator/close'); - - if(parser.roomIdToEnter !== parser.homeRoomId) - { - CreateRoomSession(parser.roomIdToEnter); - } - else - { - CreateRoomSession(parser.homeRoomId); - } - } - }); - - useMessageEvent(RoomEnterErrorEvent, event => - { - const parser = event.getParser(); - - switch(parser.reason) - { - case CantConnectMessageParser.REASON_FULL: - simpleAlert(LocalizeText('navigator.guestroomfull.text'), NotificationAlertType.DEFAULT, null, null, LocalizeText('navigator.guestroomfull.title')); - - break; - case CantConnectMessageParser.REASON_QUEUE_ERROR: - simpleAlert(LocalizeText(`room.queue.error.${ parser.parameter }`), NotificationAlertType.DEFAULT, null, null, LocalizeText('room.queue.error.title')); - - break; - case CantConnectMessageParser.REASON_BANNED: - simpleAlert(LocalizeText('navigator.banned.text'), NotificationAlertType.DEFAULT, null, null, LocalizeText('navigator.banned.title')); - - break; - default: - simpleAlert(LocalizeText('room.queue.error.title'), NotificationAlertType.DEFAULT, null, null, LocalizeText('room.queue.error.title')); - - break; - } - - VisitDesktop(); - }); - - useMessageEvent(NavigatorOpenRoomCreatorEvent, event => CreateLinkEvent('navigator/show')); - - return { categories, doorData, setDoorData, topLevelContext, topLevelContexts, searchResult, navigatorData }; -} - -export const useNavigator = () => useBetween(useNavigatorState); diff --git a/src/hooks/notification/index.ts b/src/hooks/notification/index.ts deleted file mode 100644 index b5a8561..0000000 --- a/src/hooks/notification/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './useNotification'; diff --git a/src/hooks/notification/useNotification.ts b/src/hooks/notification/useNotification.ts deleted file mode 100644 index 2343b8e..0000000 --- a/src/hooks/notification/useNotification.ts +++ /dev/null @@ -1,433 +0,0 @@ -import { AchievementNotificationMessageEvent, ActivityPointNotificationMessageEvent, ClubGiftNotificationEvent, ClubGiftSelectedEvent, ConnectionErrorEvent, GetLocalizationManager, GetRoomEngine, GetSessionDataManager, HabboBroadcastMessageEvent, HotelClosedAndOpensEvent, HotelClosesAndWillOpenAtEvent, HotelWillCloseInMinutesEvent, InfoFeedEnableMessageEvent, MaintenanceStatusMessageEvent, ModeratorCautionEvent, ModeratorMessageEvent, MOTDNotificationEvent, NotificationDialogMessageEvent, PetLevelNotificationEvent, PetReceivedMessageEvent, RespectReceivedEvent, RoomEnterEffect, RoomEnterEvent, SimpleAlertMessageEvent, UserBannedMessageEvent, Vector3d } from '@nitrots/nitro-renderer'; -import { useCallback, useState } from 'react'; -import { useBetween } from 'use-between'; -import { GetConfigurationValue, LocalizeBadgeName, LocalizeText, NotificationAlertItem, NotificationAlertType, NotificationBubbleItem, NotificationBubbleType, NotificationConfirmItem, PlaySound, ProductImageUtility, TradingNotificationType } from '../../api'; -import { useMessageEvent } from '../events'; - -const cleanText = (text: string) => (text && text.length) ? text.replace(/\\r/g, '\r') : ''; - -const getTimeZeroPadded = (time: number) => -{ - const text = ('0' + time); - - return text.substr((text.length - 2), text.length); -} - -let modDisclaimerTimeout: ReturnType = null; - -const useNotificationState = () => -{ - const [ alerts, setAlerts ] = useState([]); - const [ bubbleAlerts, setBubbleAlerts ] = useState([]); - const [ confirms, setConfirms ] = useState([]); - const [ bubblesDisabled, setBubblesDisabled ] = useState(false); - const [ modDisclaimerShown, setModDisclaimerShown ] = useState(false); - - const getMainNotificationConfig = () => GetConfigurationValue<{ [key: string]: { delivery?: string, display?: string; title?: string; image?: string }}>('notification', {}); - - const getNotificationConfig = (key: string) => - { - const mainConfig = getMainNotificationConfig(); - - if(!mainConfig) return null; - - return mainConfig[key]; - } - - const getNotificationPart = (options: Map, type: string, key: string, localize: boolean) => - { - if(options.has(key)) return options.get(key); - - const localizeKey = [ 'notification', type, key ].join('.'); - - if(GetLocalizationManager().hasValue(localizeKey) || localize) return LocalizeText(localizeKey, Array.from(options.keys()), Array.from(options.values())); - - return null; - } - - const getNotificationImageUrl = (options: Map, type: string) => - { - let imageUrl = options.get('image'); - - if(!imageUrl) imageUrl = GetConfigurationValue('image.library.notifications.url', '').replace('%image%', type.replace(/\./g, '_')); - - return LocalizeText(imageUrl); - } - - const simpleAlert = useCallback((message: string, type: string = null, clickUrl: string = null, clickUrlText: string = null, title: string = null, imageUrl: string = null) => - { - if(!title || !title.length) title = LocalizeText('notifications.broadcast.title'); - - if(!type || !type.length) type = NotificationAlertType.DEFAULT; - - const alertItem = new NotificationAlertItem([ cleanText(message) ], type, clickUrl, clickUrlText, title, imageUrl); - - setAlerts(prevValue => [ alertItem, ...prevValue ]); - }, []); - - const showNitroAlert = useCallback(() => simpleAlert(null, NotificationAlertType.NITRO), [ simpleAlert ]); - - const showSingleBubble = useCallback((message: string, type: string, imageUrl: string = null, internalLink: string = null) => - { - if(bubblesDisabled) return; - - const notificationItem = new NotificationBubbleItem(message, type, imageUrl, internalLink); - - setBubbleAlerts(prevValue => [ notificationItem, ...prevValue ]); - }, [ bubblesDisabled ]); - - const showNotification = (type: string, options: Map = null) => - { - if(!options) options = new Map(); - - const configuration = getNotificationConfig(('notification.' + type)); - - if(configuration) for(const key in configuration) options.set(key, configuration[key]); - - if (type === 'floorplan_editor.error') options.set('message', options.get('message').replace(/[^a-zA-Z._ ]/g, '')); - - const title = getNotificationPart(options, type, 'title', true); - const message = getNotificationPart(options, type, 'message', true).replace(/\\r/g, '\r'); - const linkTitle = getNotificationPart(options, type, 'linkTitle', false); - const linkUrl = getNotificationPart(options, type, 'linkUrl', false); - const image = getNotificationImageUrl(options, type); - - if(options.get('display') === 'BUBBLE') - { - showSingleBubble(LocalizeText(message), NotificationBubbleType.INFO, image, linkUrl); - } - else - { - simpleAlert(LocalizeText(message), type, linkUrl, linkTitle, title, image); - } - - if(options.get('sound')) PlaySound(options.get('sound')); - } - - const showConfirm = useCallback((message: string, onConfirm: () => void, onCancel: () => void, confirmText: string = null, cancelText: string = null, title: string = null, type: string = null) => - { - if(!confirmText || !confirmText.length) confirmText = LocalizeText('generic.confirm'); - - if(!cancelText || !cancelText.length) cancelText = LocalizeText('generic.cancel'); - - if(!title || !title.length) title = LocalizeText('notifications.broadcast.title'); - - const confirmItem = new NotificationConfirmItem(type, message, onConfirm, onCancel, confirmText, cancelText, title); - - setConfirms(prevValue => [ confirmItem, ...prevValue ]); - }, []); - - const showModeratorMessage = (message: string, url: string = null, showHabboWay: boolean = true) => - { - simpleAlert(message, NotificationAlertType.DEFAULT, url, LocalizeText('mod.alert.link'), LocalizeText('mod.alert.title')); - } - - const showTradeAlert = useCallback((type: number, otherUsername: string = '') => - { - switch(type) - { - case TradingNotificationType.ALERT_SCAM: - simpleAlert(LocalizeText('inventory.trading.warning.other_not_offering'), null, null, null, LocalizeText('inventory.trading.notification.title')); - return; - case TradingNotificationType.HOTEL_TRADING_DISABLED: - case TradingNotificationType.YOU_NOT_ALLOWED: - case TradingNotificationType.THEY_NOT_ALLOWED: - case TradingNotificationType.ROOM_DISABLED: - case TradingNotificationType.YOU_OPEN: - case TradingNotificationType.THEY_OPEN: - simpleAlert(LocalizeText(`inventory.trading.openfail.${ type }`, [ 'otherusername' ], [ otherUsername ]), null, null, null, LocalizeText('inventory.trading.openfail.title')); - return; - case TradingNotificationType.ERROR_WHILE_COMMIT: - simpleAlert(`${ LocalizeText('inventory.trading.notification.caption') }, ${ LocalizeText('inventory.trading.notification.commiterror.info') }`, null, null, null, LocalizeText('inventory.trading.notification.title')); - return; - case TradingNotificationType.THEY_CANCELLED: - simpleAlert(LocalizeText('inventory.trading.info.closed'), null, null, null, LocalizeText('inventory.trading.notification.title')); - return; - } - }, [ simpleAlert ]); - - const closeAlert = useCallback((alert: NotificationAlertItem) => - { - setAlerts(prevValue => - { - const newAlerts = [ ...prevValue ]; - const index = newAlerts.findIndex(value => (alert === value)); - - if(index >= 0) newAlerts.splice(index, 1); - - return newAlerts; - }); - }, []); - - const closeBubbleAlert = useCallback((item: NotificationBubbleItem) => - { - setBubbleAlerts(prevValue => - { - const newAlerts = [ ...prevValue ]; - const index = newAlerts.findIndex(value => (item === value)); - - if(index >= 0) newAlerts.splice(index, 1); - - return newAlerts; - }) - }, []); - - const closeConfirm = useCallback((item: NotificationConfirmItem) => - { - setConfirms(prevValue => - { - const newConfirms = [ ...prevValue ]; - const index = newConfirms.findIndex(value => (item === value)); - - if(index >= 0) newConfirms.splice(index, 1); - - return newConfirms; - }) - }, []); - - useMessageEvent(RespectReceivedEvent, event => - { - const parser = event.getParser(); - - if(parser.userId !== GetSessionDataManager().userId) return; - - const text1 = LocalizeText('notifications.text.respect.1'); - const text2 = LocalizeText('notifications.text.respect.2', [ 'count' ], [ parser.respectsReceived.toString() ]); - - showSingleBubble(text1, NotificationBubbleType.RESPECT); - showSingleBubble(text2, NotificationBubbleType.RESPECT); - }); - - useMessageEvent(HabboBroadcastMessageEvent, event => - { - const parser = event.getParser(); - - simpleAlert(parser.message.replace(/\\r/g, '\r'), null, null, LocalizeText('notifications.broadcast.title')); - }); - - useMessageEvent(AchievementNotificationMessageEvent, event => - { - const parser = event.getParser(); - - const text1 = LocalizeText('achievements.levelup.desc'); - const badgeName = LocalizeBadgeName(parser.data.badgeCode); - const badgeImage = GetSessionDataManager().getBadgeUrl(parser.data.badgeCode); - const internalLink = 'questengine/achievements/' + parser.data.category; - - showSingleBubble((text1 + ' ' + badgeName), NotificationBubbleType.ACHIEVEMENT, badgeImage, internalLink); - }); - - useMessageEvent(ClubGiftNotificationEvent, event => - { - const parser = event.getParser(); - - if(parser.numGifts <= 0) return; - - showSingleBubble(parser.numGifts.toString(), NotificationBubbleType.CLUBGIFT, null, ('catalog/open/' + GetConfigurationValue('catalog.links')['hc.hc_gifts'])); - }); - - useMessageEvent(ModeratorMessageEvent, event => - { - const parser = event.getParser(); - - showModeratorMessage(parser.message, parser.url, false); - }); - - useMessageEvent(ActivityPointNotificationMessageEvent, event => - { - const parser = event.getParser(); - - if((parser.amountChanged <= 0) || (parser.type !== 5)) return; - - const imageUrl = GetConfigurationValue('currency.asset.icon.url', '').replace('%type%', parser.type.toString()); - - showSingleBubble(LocalizeText('notifications.text.loyalty.received', [ 'AMOUNT' ], [ parser.amountChanged.toString() ]), NotificationBubbleType.INFO, imageUrl); - }); - - useMessageEvent(UserBannedMessageEvent, event => - { - const parser = event.getParser(); - - showModeratorMessage(parser.message); - }); - - useMessageEvent(HotelClosesAndWillOpenAtEvent, event => - { - const parser = event.getParser(); - - simpleAlert( LocalizeText(('opening.hours.' + (parser.userThrowOutAtClose ? 'disconnected' : 'closed')), [ 'h', 'm' ], [ getTimeZeroPadded(parser.openHour), getTimeZeroPadded(parser.openMinute) ]), NotificationAlertType.DEFAULT, null, null, LocalizeText('opening.hours.title')); - }); - - useMessageEvent(PetReceivedMessageEvent, async event => - { - const parser = event.getParser(); - - const text = LocalizeText('notifications.text.' + (parser.boughtAsGift ? 'petbought' : 'petreceived')); - - let imageUrl: string = null; - - const imageResult = GetRoomEngine().getRoomObjectPetImage(parser.pet.typeId, parser.pet.paletteId, parseInt(parser.pet.color, 16), new Vector3d(45 * 3), 64, null, true); - - if(imageResult) imageUrl = (await imageResult.getImage())?.src; - - showSingleBubble(text, NotificationBubbleType.PETLEVEL, imageUrl); - }); - - useMessageEvent(MOTDNotificationEvent, event => - { - const parser = event.getParser(); - - const messages = parser.messages.map(message => cleanText(message)); - - const alertItem = new NotificationAlertItem(messages, NotificationAlertType.MOTD, null, null, LocalizeText('notifications.motd.title')); - - setAlerts(prevValue => [ alertItem, ...prevValue ]); - }); - - useMessageEvent(PetLevelNotificationEvent, async event => - { - const parser = event.getParser(); - - let imageUrl: string = null; - - const imageResult = GetRoomEngine().getRoomObjectPetImage(parser.figureData.typeId, parser.figureData.paletteId, parseInt(parser.figureData.color, 16), new Vector3d(45 * 3), 64, null, true); - - if(imageResult) imageUrl = (await imageResult.getImage())?.src; - - showSingleBubble(LocalizeText('notifications.text.petlevel', [ 'pet_name', 'level' ], [ parser.petName, parser.level.toString() ]), NotificationBubbleType.PETLEVEL, imageUrl); - }); - - useMessageEvent(InfoFeedEnableMessageEvent, event => - { - const parser = event.getParser(); - - setBubblesDisabled(!parser.enabled); - }); - - useMessageEvent(ClubGiftSelectedEvent, event => - { - const parser = event.getParser(); - - if(!parser.products || !parser.products.length) return; - - const productData = parser.products[0]; - - if(!productData) return; - - showSingleBubble(LocalizeText('notifications.text.club_gift.selected'), NotificationBubbleType.INFO, ProductImageUtility.getProductImageUrl(productData.productType, productData.furniClassId, productData.extraParam)); - }); - - useMessageEvent(MaintenanceStatusMessageEvent, event => - { - const parser = event.getParser(); - - simpleAlert(LocalizeText('maintenance.shutdown', [ 'm', 'd' ], [ parser.minutesUntilMaintenance.toString(), parser.duration.toString() ]), NotificationAlertType.DEFAULT, null, null, LocalizeText('opening.hours.title')); - }); - - useMessageEvent(ModeratorCautionEvent, event => - { - const parser = event.getParser(); - - showModeratorMessage(parser.message, parser.url); - }); - - useMessageEvent(NotificationDialogMessageEvent, event => - { - const parser = event.getParser(); - - showNotification(parser.type, parser.parameters); - }); - - useMessageEvent(HotelWillCloseInMinutesEvent, event => - { - const parser = event.getParser(); - - simpleAlert(LocalizeText('opening.hours.shutdown', [ 'm' ], [ parser.openMinute.toString() ]), NotificationAlertType.DEFAULT, null, null, LocalizeText('opening.hours.title')); - }); - - useMessageEvent(HotelClosedAndOpensEvent, event => - { - const parser = event.getParser(); - - simpleAlert(LocalizeText('opening.hours.disconnected', [ 'h', 'm' ], [ parser.openHour.toString(), parser.openMinute.toString() ]), NotificationAlertType.DEFAULT, null, null, LocalizeText('opening.hours.title')); - }); - - useMessageEvent(ConnectionErrorEvent, event => - { - const parser = event.getParser(); - - switch(parser.errorCode) - { - default: - case 0: - simpleAlert(LocalizeText('connection.server.error.desc', [ 'errorCode' ], [ parser.errorCode.toString() ]), NotificationAlertType.ALERT, null, null, LocalizeText('connection.server.error.title')); - break; - case 1001: - case 1002: - case 1003: - case 1004: - case 1005: - case 1006: - case 1007: - case 1008: - case 1009: - case 1010: - case 1011: - case 1012: - case 1013: - case 1014: - case 1015: - case 1016: - case 1017: - case 1018: - case 1019: - // TODO: fix dispose - //event.connection.dispose(); - break; - case 4013: - simpleAlert(LocalizeText('connection.room.maintenance.desc'), NotificationAlertType.ALERT, null, null, LocalizeText('connection.room.maintenance.title')); - break; - } - }); - - useMessageEvent(SimpleAlertMessageEvent, event => - { - const parser = event.getParser(); - - simpleAlert(LocalizeText(parser.alertMessage), NotificationAlertType.DEFAULT, null, null, LocalizeText(parser.titleMessage ? parser.titleMessage : 'notifications.broadcast.title')); - }); - - const onRoomEnterEvent = useCallback(() => - { - if(modDisclaimerShown) return; - - if(RoomEnterEffect.isRunning()) - { - if(modDisclaimerTimeout) return; - - modDisclaimerTimeout = setTimeout(() => - { - onRoomEnterEvent(); - }, (RoomEnterEffect.totalRunningTime + 5000)); - } - else - { - if(modDisclaimerTimeout) - { - clearTimeout(modDisclaimerTimeout); - - modDisclaimerTimeout = null; - } - - showSingleBubble(LocalizeText('mod.chatdisclaimer'), NotificationBubbleType.INFO); - - setModDisclaimerShown(true); - } - }, [ modDisclaimerShown, showSingleBubble ]); - - useMessageEvent(RoomEnterEvent, onRoomEnterEvent); - - return { alerts, bubbleAlerts, confirms, simpleAlert, showNitroAlert, showTradeAlert, showConfirm, showSingleBubble, closeAlert, closeBubbleAlert, closeConfirm }; -} - -export const useNotification = () => useBetween(useNotificationState); diff --git a/src/hooks/purse/index.ts b/src/hooks/purse/index.ts deleted file mode 100644 index d9d1ff7..0000000 --- a/src/hooks/purse/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './usePurse'; diff --git a/src/hooks/purse/usePurse.ts b/src/hooks/purse/usePurse.ts deleted file mode 100644 index e8155ce..0000000 --- a/src/hooks/purse/usePurse.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { ActivityPointNotificationMessageEvent, UserCreditsEvent, UserCurrencyComposer, UserCurrencyEvent, UserSubscriptionComposer, UserSubscriptionEvent, UserSubscriptionParser } from '@nitrots/nitro-renderer'; -import { useEffect, useMemo, useState } from 'react'; -import { useBetween } from 'use-between'; -import { CloneObject, ClubStatus, GetConfigurationValue, IPurse, PlaySound, Purse, SendMessageComposer, SoundNames } from '../../api'; -import { useMessageEvent } from '../events'; - -const usePurseState = () => -{ - const [ purse, setPurse ] = useState(new Purse()); - const hcDisabled = useMemo(() => GetConfigurationValue('hc.disabled', false), []); - - const clubStatus = useMemo(() => - { - if(hcDisabled || (purse.clubDays > 0)) return ClubStatus.ACTIVE; - - if((purse.pastVipDays > 0) || (purse.pastVipDays > 0)) return ClubStatus.EXPIRED; - - return ClubStatus.NONE; - }, [ purse, hcDisabled ]); - - const getCurrencyAmount = (type: number) => - { - if(type === -1) return purse.credits; - - for(const [ key, value ] of purse.activityPoints.entries()) - { - if(key !== type) continue; - - return value; - } - - return 0; - } - - useMessageEvent(UserCreditsEvent, event => - { - const parser = event.getParser(); - - setPurse(prevValue => - { - const newValue = CloneObject(prevValue); - - newValue.credits = parseFloat(parser.credits); - - if(prevValue.credits !== newValue.credits) PlaySound(SoundNames.CREDITS); - - return newValue; - }); - }); - - useMessageEvent(UserCurrencyEvent, event => - { - const parser = event.getParser(); - - setPurse(prevValue => - { - const newValue = CloneObject(prevValue); - - newValue.activityPoints = parser.currencies; - - return newValue; - }); - }); - - useMessageEvent(ActivityPointNotificationMessageEvent, event => - { - const parser = event.getParser(); - - setPurse(prevValue => - { - const newValue = CloneObject(prevValue); - - newValue.activityPoints = new Map(newValue.activityPoints); - - newValue.activityPoints.set(parser.type, parser.amount); - - if(parser.type === 0) PlaySound(SoundNames.DUCKETS) - - return newValue; - }); - }); - - useMessageEvent(UserSubscriptionEvent, event => - { - const parser = event.getParser(); - const productName = parser.productName; - - if((productName !== 'club_habbo') && (productName !== 'habbo_club')) return; - - setPurse(prevValue => - { - const newValue = CloneObject(prevValue); - - newValue.clubDays = Math.max(0, parser.daysToPeriodEnd); - newValue.clubPeriods = Math.max(0, parser.periodsSubscribedAhead); - newValue.isVip = parser.isVip; - newValue.pastClubDays = parser.pastClubDays; - newValue.pastVipDays = parser.pastVipDays; - newValue.isExpiring = ((parser.responseType === UserSubscriptionParser.RESPONSE_TYPE_DISCOUNT_AVAILABLE) ? true : false); - newValue.minutesUntilExpiration = parser.minutesUntilExpiration; - newValue.minutesSinceLastModified = parser.minutesSinceLastModified; - - return newValue; - }); - }); - - useEffect(() => - { - if(hcDisabled) return; - - SendMessageComposer(new UserSubscriptionComposer('habbo_club')); - - const interval = setInterval(() => SendMessageComposer(new UserSubscriptionComposer('habbo_club')), 50000); - - return () => clearInterval(interval); - }, [ hcDisabled ]); - - useEffect(() => - { - SendMessageComposer(new UserCurrencyComposer()); - }, []); - - return { purse, hcDisabled, clubStatus, getCurrencyAmount }; -} - -export const usePurse = () => useBetween(usePurseState); diff --git a/src/hooks/rooms/engine/index.ts b/src/hooks/rooms/engine/index.ts deleted file mode 100644 index 42364b6..0000000 --- a/src/hooks/rooms/engine/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * from './useFurniAddedEvent'; -export * from './useFurniRemovedEvent'; -export * from './useObjectDeselectedEvent'; -export * from './useObjectDoubleClickedEvent'; -export * from './useObjectRollOutEvent'; -export * from './useObjectRollOverEvent'; -export * from './useObjectSelectedEvent'; -export * from './useUserAddedEvent'; -export * from './useUserRemovedEvent'; diff --git a/src/hooks/rooms/engine/useFurniAddedEvent.ts b/src/hooks/rooms/engine/useFurniAddedEvent.ts deleted file mode 100644 index f5422c6..0000000 --- a/src/hooks/rooms/engine/useFurniAddedEvent.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { useEffect } from 'react'; -import { RoomWidgetUpdateRoomObjectEvent, UI_EVENT_DISPATCHER } from '../../../api'; - -export const useFurniAddedEvent = (isActive: boolean, handler: (event: RoomWidgetUpdateRoomObjectEvent) => void) => -{ - useEffect(() => - { - if(!isActive) return; - - const onRoomWidgetUpdateRoomObjectEvent = (event: RoomWidgetUpdateRoomObjectEvent) => handler(event); - - UI_EVENT_DISPATCHER.addEventListener(RoomWidgetUpdateRoomObjectEvent.FURNI_ADDED, onRoomWidgetUpdateRoomObjectEvent); - - return () => - { - UI_EVENT_DISPATCHER.removeEventListener(RoomWidgetUpdateRoomObjectEvent.FURNI_ADDED, onRoomWidgetUpdateRoomObjectEvent); - } - }, [ isActive, handler ]); -} diff --git a/src/hooks/rooms/engine/useFurniRemovedEvent.ts b/src/hooks/rooms/engine/useFurniRemovedEvent.ts deleted file mode 100644 index ddd1be2..0000000 --- a/src/hooks/rooms/engine/useFurniRemovedEvent.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { useEffect } from 'react'; -import { RoomWidgetUpdateRoomObjectEvent, UI_EVENT_DISPATCHER } from '../../../api'; - -export const useFurniRemovedEvent = (isActive: boolean, handler: (event: RoomWidgetUpdateRoomObjectEvent) => void) => -{ - useEffect(() => - { - if(!isActive) return; - - const onRoomWidgetUpdateRoomObjectEvent = (event: RoomWidgetUpdateRoomObjectEvent) => handler(event); - - UI_EVENT_DISPATCHER.addEventListener(RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED, onRoomWidgetUpdateRoomObjectEvent); - - return () => - { - UI_EVENT_DISPATCHER.removeEventListener(RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED, onRoomWidgetUpdateRoomObjectEvent); - } - }, [ isActive, handler ]); -} diff --git a/src/hooks/rooms/engine/useObjectDeselectedEvent.ts b/src/hooks/rooms/engine/useObjectDeselectedEvent.ts deleted file mode 100644 index ba54981..0000000 --- a/src/hooks/rooms/engine/useObjectDeselectedEvent.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { RoomWidgetUpdateRoomObjectEvent } from '../../../api'; -import { useUiEvent } from '../../events'; - -export const useObjectDeselectedEvent = (handler: (event: RoomWidgetUpdateRoomObjectEvent) => void) => -{ - useUiEvent(RoomWidgetUpdateRoomObjectEvent.OBJECT_DESELECTED, handler); -} diff --git a/src/hooks/rooms/engine/useObjectDoubleClickedEvent.ts b/src/hooks/rooms/engine/useObjectDoubleClickedEvent.ts deleted file mode 100644 index 66e3673..0000000 --- a/src/hooks/rooms/engine/useObjectDoubleClickedEvent.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { RoomWidgetUpdateRoomObjectEvent } from '../../../api'; -import { useUiEvent } from '../../events'; - -export const useObjectDoubleClickedEvent = (handler: (event: RoomWidgetUpdateRoomObjectEvent) => void) => -{ - useUiEvent(RoomWidgetUpdateRoomObjectEvent.OBJECT_DOUBLE_CLICKED, handler); -} diff --git a/src/hooks/rooms/engine/useObjectRollOutEvent.ts b/src/hooks/rooms/engine/useObjectRollOutEvent.ts deleted file mode 100644 index 433ca91..0000000 --- a/src/hooks/rooms/engine/useObjectRollOutEvent.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { RoomWidgetUpdateRoomObjectEvent } from '../../../api'; -import { useUiEvent } from '../../events'; - -export const useObjectRollOutEvent = (handler: (event: RoomWidgetUpdateRoomObjectEvent) => void) => -{ - useUiEvent(RoomWidgetUpdateRoomObjectEvent.OBJECT_ROLL_OUT, handler); -} diff --git a/src/hooks/rooms/engine/useObjectRollOverEvent.ts b/src/hooks/rooms/engine/useObjectRollOverEvent.ts deleted file mode 100644 index 2774ef2..0000000 --- a/src/hooks/rooms/engine/useObjectRollOverEvent.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { RoomWidgetUpdateRoomObjectEvent } from '../../../api'; -import { useUiEvent } from '../../events'; - -export const useObjectRollOverEvent = (handler: (event: RoomWidgetUpdateRoomObjectEvent) => void) => -{ - useUiEvent(RoomWidgetUpdateRoomObjectEvent.OBJECT_ROLL_OVER, handler); -} diff --git a/src/hooks/rooms/engine/useObjectSelectedEvent.ts b/src/hooks/rooms/engine/useObjectSelectedEvent.ts deleted file mode 100644 index 38db66f..0000000 --- a/src/hooks/rooms/engine/useObjectSelectedEvent.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { RoomWidgetUpdateRoomObjectEvent } from '../../../api'; -import { useUiEvent } from '../../events'; - -export const useObjectSelectedEvent = (handler: (event: RoomWidgetUpdateRoomObjectEvent) => void) => -{ - useUiEvent(RoomWidgetUpdateRoomObjectEvent.OBJECT_SELECTED, handler); -} diff --git a/src/hooks/rooms/engine/useUserAddedEvent.ts b/src/hooks/rooms/engine/useUserAddedEvent.ts deleted file mode 100644 index d3c761b..0000000 --- a/src/hooks/rooms/engine/useUserAddedEvent.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { useEffect } from 'react'; -import { RoomWidgetUpdateRoomObjectEvent, UI_EVENT_DISPATCHER } from '../../../api'; - -export const useUserAddedEvent = (isActive: boolean, handler: (event: RoomWidgetUpdateRoomObjectEvent) => void) => -{ - useEffect(() => - { - if(!isActive) return; - - const onRoomWidgetUpdateRoomObjectEvent = (event: RoomWidgetUpdateRoomObjectEvent) => handler(event); - - UI_EVENT_DISPATCHER.addEventListener(RoomWidgetUpdateRoomObjectEvent.USER_ADDED, onRoomWidgetUpdateRoomObjectEvent); - - return () => - { - UI_EVENT_DISPATCHER.removeEventListener(RoomWidgetUpdateRoomObjectEvent.USER_ADDED, onRoomWidgetUpdateRoomObjectEvent); - } - }, [ isActive, handler ]); -} diff --git a/src/hooks/rooms/engine/useUserRemovedEvent.ts b/src/hooks/rooms/engine/useUserRemovedEvent.ts deleted file mode 100644 index 2820241..0000000 --- a/src/hooks/rooms/engine/useUserRemovedEvent.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { useEffect } from 'react'; -import { RoomWidgetUpdateRoomObjectEvent, UI_EVENT_DISPATCHER } from '../../../api'; - -export const useUserRemovedEvent = (isActive: boolean, handler: (event: RoomWidgetUpdateRoomObjectEvent) => void) => -{ - useEffect(() => - { - if(!isActive) return; - - const onRoomWidgetUpdateRoomObjectEvent = (event: RoomWidgetUpdateRoomObjectEvent) => handler(event); - - UI_EVENT_DISPATCHER.addEventListener(RoomWidgetUpdateRoomObjectEvent.USER_REMOVED, onRoomWidgetUpdateRoomObjectEvent); - - return () => - { - UI_EVENT_DISPATCHER.removeEventListener(RoomWidgetUpdateRoomObjectEvent.USER_REMOVED, onRoomWidgetUpdateRoomObjectEvent); - } - }, [ isActive, handler ]); -} diff --git a/src/hooks/rooms/index.ts b/src/hooks/rooms/index.ts deleted file mode 100644 index e57ecfb..0000000 --- a/src/hooks/rooms/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './engine'; -export * from './promotes'; -export * from './useRoom'; -export * from './widgets'; diff --git a/src/hooks/rooms/promotes/index.ts b/src/hooks/rooms/promotes/index.ts deleted file mode 100644 index b1fd0d3..0000000 --- a/src/hooks/rooms/promotes/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './useRoomPromote'; diff --git a/src/hooks/rooms/promotes/useRoomPromote.ts b/src/hooks/rooms/promotes/useRoomPromote.ts deleted file mode 100644 index e534d18..0000000 --- a/src/hooks/rooms/promotes/useRoomPromote.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { RoomEventEvent, RoomEventMessageParser } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { useBetween } from 'use-between'; -import { useMessageEvent } from '../../events'; - -const useRoomPromoteState = () => -{ - const [ promoteInformation, setPromoteInformation ] = useState(null); - const [ isExtended, setIsExtended ] = useState(false); - - useMessageEvent(RoomEventEvent, event => - { - const parser = event.getParser(); - - if (!parser) return; - - setPromoteInformation(parser); - }); - - return { promoteInformation, isExtended, setPromoteInformation, setIsExtended }; -} - -export const useRoomPromote = () => useBetween(useRoomPromoteState); diff --git a/src/hooks/rooms/useRoom.ts b/src/hooks/rooms/useRoom.ts deleted file mode 100644 index 0ad1732..0000000 --- a/src/hooks/rooms/useRoom.ts +++ /dev/null @@ -1,283 +0,0 @@ -import { ColorConverter, GetRenderer, GetRoomEngine, GetStage, IRoomSession, NitroAdjustmentFilter, NitroSprite, NitroTexture, RoomBackgroundColorEvent, RoomEngineEvent, RoomEngineObjectEvent, RoomGeometry, RoomId, RoomObjectCategory, RoomObjectHSLColorEnabledEvent, RoomObjectOperationType, RoomSessionEvent, RoomVariableEnum, Vector3d } from '@nitrots/nitro-renderer'; -import { useEffect, useState } from 'react'; -import { useBetween } from 'use-between'; -import { CanManipulateFurniture, DispatchUiEvent, GetRoomSession, InitializeRoomInstanceRenderingCanvas, IsFurnitureSelectionDisabled, ProcessRoomObjectOperation, RoomWidgetUpdateBackgroundColorPreviewEvent, RoomWidgetUpdateRoomObjectEvent, SetActiveRoomId, StartRoomSession } from '../../api'; -import { useNitroEvent, useUiEvent } from '../events'; - -const useRoomState = () => -{ - const [ roomSession, setRoomSession ] = useState(null); - const [ roomBackground, setRoomBackground ] = useState(null); - const [ roomFilter, setRoomFilter ] = useState(null); - const [ originalRoomBackgroundColor, setOriginalRoomBackgroundColor ] = useState(0); - - const updateRoomBackgroundColor = (hue: number, saturation: number, lightness: number, original: boolean = false) => - { - if(!roomBackground) return; - - const newColor = ColorConverter.hslToRGB(((((hue & 0xFF) << 16) + ((saturation & 0xFF) << 8)) + (lightness & 0xFF))); - - if(original) setOriginalRoomBackgroundColor(newColor); - - if(!hue && !saturation && !lightness) - { - roomBackground.tint = 0; - } - else - { - roomBackground.tint = newColor; - } - } - - const updateRoomFilter = (color: number) => - { - if(!roomFilter) return; - - const r = ((color >> 16) & 0xFF); - const g = ((color >> 8) & 0xFF); - const b = (color & 0xFF); - - roomFilter.red = (r / 255); - roomFilter.green = (g / 255); - roomFilter.blue = (b / 255); - } - - useUiEvent(RoomWidgetUpdateBackgroundColorPreviewEvent.PREVIEW, event => updateRoomBackgroundColor(event.hue, event.saturation, event.lightness)); - - useUiEvent(RoomWidgetUpdateBackgroundColorPreviewEvent.CLEAR_PREVIEW, event => - { - if(!roomBackground) return; - - roomBackground.tint = originalRoomBackgroundColor; - }); - - useNitroEvent(RoomObjectHSLColorEnabledEvent.ROOM_BACKGROUND_COLOR, event => - { - if(RoomId.isRoomPreviewerId(event.roomId)) return; - - if(event.enable) updateRoomBackgroundColor(event.hue, event.saturation, event.lightness, true); - else updateRoomBackgroundColor(0, 0, 0, true); - }); - - useNitroEvent(RoomBackgroundColorEvent.ROOM_COLOR, event => - { - if(RoomId.isRoomPreviewerId(event.roomId)) return; - - let color = 0x000000; - let brightness = 0xFF; - - if(!event.bgOnly) - { - color = event.color; - brightness = event.brightness; - } - - updateRoomFilter(ColorConverter.hslToRGB(((ColorConverter.rgbToHSL(color) & 0xFFFF00) + brightness))); - }); - - useNitroEvent([ - RoomEngineEvent.INITIALIZED, - RoomEngineEvent.DISPOSED - ], event => - { - if(RoomId.isRoomPreviewerId(event.roomId)) return; - - const session = GetRoomSession(); - - if(!session) return; - - switch(event.type) - { - case RoomEngineEvent.INITIALIZED: - SetActiveRoomId(event.roomId); - setRoomSession(session); - return; - case RoomEngineEvent.DISPOSED: - setRoomSession(null); - return; - } - }); - - useNitroEvent([ - RoomSessionEvent.CREATED, - RoomSessionEvent.ENDED - ], event => - { - switch(event.type) - { - case RoomSessionEvent.CREATED: - StartRoomSession(event.session); - return; - case RoomSessionEvent.ENDED: - setRoomSession(null); - return; - } - }); - - useNitroEvent([ - RoomEngineObjectEvent.SELECTED, - RoomEngineObjectEvent.DESELECTED, - RoomEngineObjectEvent.ADDED, - RoomEngineObjectEvent.REMOVED, - RoomEngineObjectEvent.PLACED, - RoomEngineObjectEvent.REQUEST_MOVE, - RoomEngineObjectEvent.REQUEST_ROTATE, - RoomEngineObjectEvent.MOUSE_ENTER, - RoomEngineObjectEvent.MOUSE_LEAVE, - RoomEngineObjectEvent.DOUBLE_CLICK - ], event => - { - if(RoomId.isRoomPreviewerId(event.roomId)) return; - - let updateEvent: RoomWidgetUpdateRoomObjectEvent = null; - - switch(event.type) - { - case RoomEngineObjectEvent.SELECTED: - if(!IsFurnitureSelectionDisabled(event)) updateEvent = new RoomWidgetUpdateRoomObjectEvent(RoomWidgetUpdateRoomObjectEvent.OBJECT_SELECTED, event.objectId, event.category, event.roomId); - break; - case RoomEngineObjectEvent.DESELECTED: - updateEvent = new RoomWidgetUpdateRoomObjectEvent(RoomWidgetUpdateRoomObjectEvent.OBJECT_DESELECTED, event.objectId, event.category, event.roomId); - break; - case RoomEngineObjectEvent.ADDED: { - let addedEventType: string = null; - - switch(event.category) - { - case RoomObjectCategory.FLOOR: - case RoomObjectCategory.WALL: - addedEventType = RoomWidgetUpdateRoomObjectEvent.FURNI_ADDED; - break; - case RoomObjectCategory.UNIT: - addedEventType = RoomWidgetUpdateRoomObjectEvent.USER_ADDED; - break; - } - - if(addedEventType) updateEvent = new RoomWidgetUpdateRoomObjectEvent(addedEventType, event.objectId, event.category, event.roomId); - break; - } - case RoomEngineObjectEvent.REMOVED: { - let removedEventType: string = null; - - switch(event.category) - { - case RoomObjectCategory.FLOOR: - case RoomObjectCategory.WALL: - removedEventType = RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED; - break; - case RoomObjectCategory.UNIT: - removedEventType = RoomWidgetUpdateRoomObjectEvent.USER_REMOVED; - break; - } - - if(removedEventType) updateEvent = new RoomWidgetUpdateRoomObjectEvent(removedEventType, event.objectId, event.category, event.roomId); - break; - } - case RoomEngineObjectEvent.REQUEST_MOVE: - if(CanManipulateFurniture(roomSession, event.objectId, event.category)) ProcessRoomObjectOperation(event.objectId, event.category, RoomObjectOperationType.OBJECT_MOVE); - break; - case RoomEngineObjectEvent.REQUEST_ROTATE: - if(CanManipulateFurniture(roomSession, event.objectId, event.category)) ProcessRoomObjectOperation(event.objectId, event.category, RoomObjectOperationType.OBJECT_ROTATE_POSITIVE); - break; - case RoomEngineObjectEvent.MOUSE_ENTER: - updateEvent = new RoomWidgetUpdateRoomObjectEvent(RoomWidgetUpdateRoomObjectEvent.OBJECT_ROLL_OVER, event.objectId, event.category, event.roomId); - break; - case RoomEngineObjectEvent.MOUSE_LEAVE: - updateEvent = new RoomWidgetUpdateRoomObjectEvent(RoomWidgetUpdateRoomObjectEvent.OBJECT_ROLL_OUT, event.objectId, event.category, event.roomId); - break; - case RoomEngineObjectEvent.DOUBLE_CLICK: - updateEvent = new RoomWidgetUpdateRoomObjectEvent(RoomWidgetUpdateRoomObjectEvent.OBJECT_DOUBLE_CLICKED, event.objectId, event.category, event.roomId); - break; - } - - if(updateEvent) DispatchUiEvent(updateEvent); - }); - - useEffect(() => - { - if(!roomSession) return; - - const roomEngine = GetRoomEngine(); - const roomId = roomSession.roomId; - const canvasId = 1; - const width = Math.floor(window.innerWidth); - const height = Math.floor(window.innerHeight); - const renderer = GetRenderer(); - - if(renderer) renderer.resize(width, height); - - const displayObject = roomEngine.getRoomInstanceDisplay(roomId, canvasId, width, height, RoomGeometry.SCALE_ZOOMED_IN); - const canvas = GetRoomEngine().getRoomInstanceRenderingCanvas(roomId, canvasId); - - if(!displayObject || !canvas) return; - - const background = new NitroSprite(NitroTexture.WHITE); - const filter = new NitroAdjustmentFilter(); - const master = canvas.master; - - background.tint = 0; - background.width = width; - background.height = height; - - master.addChildAt(background, 0); - master.filters = [ filter ]; - - setRoomBackground(background); - setRoomFilter(filter); - - const geometry = (roomEngine.getRoomInstanceGeometry(roomId, canvasId) as RoomGeometry); - - if(geometry) - { - const minX = (roomEngine.getRoomInstanceVariable(roomId, RoomVariableEnum.ROOM_MIN_X) || 0); - const maxX = (roomEngine.getRoomInstanceVariable(roomId, RoomVariableEnum.ROOM_MAX_X) || 0); - const minY = (roomEngine.getRoomInstanceVariable(roomId, RoomVariableEnum.ROOM_MIN_Y) || 0); - const maxY = (roomEngine.getRoomInstanceVariable(roomId, RoomVariableEnum.ROOM_MAX_Y) || 0); - - let x = ((minX + maxX) / 2); - let y = ((minY + maxY) / 2); - - const offset = 20; - - x = (x + (offset - 1)); - y = (y + (offset - 1)); - - const z = (Math.sqrt(((offset * offset) + (offset * offset))) * Math.tan(((30 / 180) * Math.PI))); - - geometry.location = new Vector3d(x, y, z); - } - - GetStage().addChild(displayObject); - - SetActiveRoomId(roomSession.roomId); - - const resize = (event: UIEvent) => - { - const width = Math.floor(window.innerWidth); - const height = Math.floor(window.innerHeight); - - renderer.resolution = window.devicePixelRatio; - renderer.resize(width, height); - - background.width = width; - background.height = height; - - InitializeRoomInstanceRenderingCanvas(width, height, 1); - } - - window.addEventListener('resize', resize); - - return () => - { - setRoomBackground(null); - setRoomFilter(null); - setOriginalRoomBackgroundColor(0); - - window.removeEventListener('resize', resize); - } - }, [ roomSession ]); - - return { roomSession }; -} - -export const useRoom = () => useBetween(useRoomState); diff --git a/src/hooks/rooms/widgets/furniture/index.ts b/src/hooks/rooms/widgets/furniture/index.ts deleted file mode 100644 index 37fa573..0000000 --- a/src/hooks/rooms/widgets/furniture/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -export * from './useFurnitureBackgroundColorWidget'; -export * from './useFurnitureBadgeDisplayWidget'; -export * from './useFurnitureContextMenuWidget'; -export * from './useFurnitureCraftingWidget'; -export * from './useFurnitureDimmerWidget'; -export * from './useFurnitureExchangeWidget'; -export * from './useFurnitureExternalImageWidget'; -export * from './useFurnitureFriendFurniWidget'; -export * from './useFurnitureHighScoreWidget'; -export * from './useFurnitureInternalLinkWidget'; -export * from './useFurnitureMannequinWidget'; -export * from './useFurniturePlaylistEditorWidget'; -export * from './useFurniturePresentWidget'; -export * from './useFurnitureRoomLinkWidget'; -export * from './useFurnitureSpamWallPostItWidget'; -export * from './useFurnitureStackHeightWidget'; -export * from './useFurnitureStickieWidget'; -export * from './useFurnitureTrophyWidget'; -export * from './useFurnitureYoutubeWidget'; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureBackgroundColorWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureBackgroundColorWidget.ts deleted file mode 100644 index a605f28..0000000 --- a/src/hooks/rooms/widgets/furniture/useFurnitureBackgroundColorWidget.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { ApplyTonerComposer, ColorConverter, GetRoomEngine, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { useEffect, useState } from 'react'; -import { CanManipulateFurniture, ColorUtils, DispatchUiEvent, RoomWidgetUpdateBackgroundColorPreviewEvent, SendMessageComposer } from '../../../../api'; -import { useNitroEvent } from '../../../events'; -import { useFurniRemovedEvent } from '../../engine'; -import { useRoom } from '../../useRoom'; - -const useFurnitureBackgroundColorWidgetState = () => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ category, setCategory ] = useState(-1); - const [ color, setColor ] = useState(0); - const { roomSession = null } = useRoom(); - - const applyToner = () => - { - const hsl = ColorConverter.rgbToHSL(color); - const [ _, hue, saturation, lightness ] = ColorUtils.int_to_8BitVals(hsl); - SendMessageComposer(new ApplyTonerComposer(objectId, hue, saturation, lightness)); - } - - const toggleToner = () => roomSession.useMultistateItem(objectId); - - const onClose = () => - { - DispatchUiEvent(new RoomWidgetUpdateBackgroundColorPreviewEvent(RoomWidgetUpdateBackgroundColorPreviewEvent.CLEAR_PREVIEW)); - - setObjectId(-1); - setCategory(-1); - setColor(0); - } - - useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_BACKGROUND_COLOR, event => - { - if(!CanManipulateFurniture(roomSession, event.objectId, event.category)) return; - - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - const model = roomObject.model; - - setObjectId(event.objectId); - setCategory(event.category) - const hue = parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_HUE)); - const saturation = parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_SATURATION)); - const light = parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_LIGHTNESS)); - - const hsl = ColorUtils.eight_bitVals_to_int(0, hue,saturation,light); - - const rgbColor = ColorConverter.hslToRGB(hsl); - setColor(rgbColor); - }); - - useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => - { - if((event.id !== objectId) || (event.category !== category)) return; - - onClose(); - }); - - useEffect(() => - { - if((objectId === -1) || (category === -1)) return; - - const hls = ColorConverter.rgbToHSL(color); - const [ _, hue, saturation, lightness ] = ColorUtils.int_to_8BitVals(hls); - DispatchUiEvent(new RoomWidgetUpdateBackgroundColorPreviewEvent(RoomWidgetUpdateBackgroundColorPreviewEvent.PREVIEW, hue, saturation, lightness)); - }, [ objectId, category, color ]); - - return { objectId, color, setColor, applyToner, toggleToner, onClose }; -} - -export const useFurnitureBackgroundColorWidget = useFurnitureBackgroundColorWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureBadgeDisplayWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureBadgeDisplayWidget.ts deleted file mode 100644 index 1cc513c..0000000 --- a/src/hooks/rooms/widgets/furniture/useFurnitureBadgeDisplayWidget.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { GetRoomEngine, GetSessionDataManager, RoomEngineTriggerWidgetEvent, RoomObjectVariable, StringDataType } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../../../api'; -import { useNitroEvent } from '../../../events'; -import { useNotification } from '../../../notification'; -import { useFurniRemovedEvent } from '../../engine'; - -const useFurnitureBadgeDisplayWidgetState = () => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ category, setCategory ] = useState(-1); - const [ color, setColor ] = useState('1'); - const [ badgeName, setBadgeName ] = useState(''); - const [ badgeDesc, setBadgeDesc ] = useState(''); - const [ date, setDate ] = useState(''); - const [ senderName, setSenderName ] = useState(''); - const { simpleAlert = null } = useNotification(); - - const onClose = () => - { - setObjectId(-1); - setCategory(-1); - setColor('1'); - setBadgeName(''); - setBadgeDesc(''); - setDate(''); - setSenderName(''); - } - - useNitroEvent([ - RoomEngineTriggerWidgetEvent.REQUEST_BADGE_DISPLAY_ENGRAVING, - RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING - ], event => - { - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - - if(!roomObject) return; - - const stringStuff = new StringDataType(); - - stringStuff.initializeFromRoomObjectModel(roomObject.model); - - setObjectId(event.objectId); - setCategory(event.category); - setColor('1'); - setBadgeName(LocalizeBadgeName(stringStuff.getValue(1))); - setBadgeDesc(LocalizeBadgeDescription(stringStuff.getValue(1))); - setDate(stringStuff.getValue(2)); - setSenderName(stringStuff.getValue(3)); - }); - - useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_FAILED, event => - { - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - - if(!roomObject) return; - - const ownerId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_OWNER_ID); - - if(ownerId !== GetSessionDataManager().userId) return; - - simpleAlert(`${ LocalizeText('resolution.failed.subtitle') } ${ LocalizeText('resolution.failed.text') }`, null, null, null, LocalizeText('resolution.failed.title')); - }); - - useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => - { - if((event.id !== objectId) || (event.category !== category)) return; - - onClose(); - }); - - return { objectId, category, color, badgeName, badgeDesc, date, senderName, onClose }; -} - -export const useFurnitureBadgeDisplayWidget = useFurnitureBadgeDisplayWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureContextMenuWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureContextMenuWidget.ts deleted file mode 100644 index c9616bb..0000000 --- a/src/hooks/rooms/widgets/furniture/useFurnitureContextMenuWidget.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { ContextMenuEnum, GetRoomEngine, GroupFurniContextMenuInfoMessageEvent, GroupFurniContextMenuInfoMessageParser, RoomEngineTriggerWidgetEvent, RoomObjectCategory, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { IsOwnerOfFurniture, TryJoinGroup, TryVisitRoom } from '../../../../api'; -import { useMessageEvent, useNitroEvent } from '../../../events'; -import { useRoom } from '../../useRoom'; - -export const MONSTERPLANT_SEED_CONFIRMATION: string = 'MONSTERPLANT_SEED_CONFIRMATION'; -export const PURCHASABLE_CLOTHING_CONFIRMATION: string = 'PURCHASABLE_CLOTHING_CONFIRMATION'; -export const GROUP_FURNITURE: string = 'GROUP_FURNITURE'; -export const EFFECTBOX_OPEN: string = 'EFFECTBOX_OPEN'; -export const MYSTERYTROPHY_OPEN_DIALOG: string = 'MYSTERYTROPHY_OPEN_DIALOG'; - -const useFurnitureContextMenuWidgetState = () => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ mode, setMode ] = useState(null); - const [ confirmMode, setConfirmMode ] = useState(null); - const [ confirmingObjectId, setConfirmingObjectId ] = useState(-1); - const [ groupData, setGroupData ] = useState(null); - const [ isGroupMember, setIsGroupMember ] = useState(false); - const [ objectOwnerId, setObjectOwnerId ] = useState(-1); - const { roomSession = null } = useRoom(); - - const onClose = () => - { - setObjectId(-1); - setGroupData(null); - setIsGroupMember(false); - setMode(null); - } - - const closeConfirm = () => - { - setConfirmMode(null); - setConfirmingObjectId(-1); - } - - const processAction = (name: string) => - { - if(name) - { - switch(name) - { - case 'use_friend_furni': - roomSession.useMultistateItem(objectId); - break; - case 'use_monsterplant_seed': - setConfirmMode(MONSTERPLANT_SEED_CONFIRMATION); - setConfirmingObjectId(objectId); - break; - case 'use_random_teleport': - GetRoomEngine().useRoomObject(objectId, RoomObjectCategory.FLOOR); - break; - case 'use_purchaseable_clothing': - setConfirmMode(PURCHASABLE_CLOTHING_CONFIRMATION); - setConfirmingObjectId(objectId); - break; - case 'use_mystery_box': - roomSession.useMultistateItem(objectId); - break; - case 'use_mystery_trophy': - setConfirmMode(MYSTERYTROPHY_OPEN_DIALOG); - setConfirmingObjectId(objectId); - break; - case 'join_group': - TryJoinGroup(groupData.guildId); - setIsGroupMember(true); - return; - case 'go_to_group_homeroom': - if(groupData) TryVisitRoom(groupData.guildHomeRoomId); - break; - } - } - - onClose(); - } - - useNitroEvent([ - RoomEngineTriggerWidgetEvent.OPEN_FURNI_CONTEXT_MENU, - RoomEngineTriggerWidgetEvent.CLOSE_FURNI_CONTEXT_MENU, - RoomEngineTriggerWidgetEvent.REQUEST_MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG, - RoomEngineTriggerWidgetEvent.REQUEST_PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG, - RoomEngineTriggerWidgetEvent.REQUEST_EFFECTBOX_OPEN_DIALOG, - RoomEngineTriggerWidgetEvent.REQUEST_MYSTERYBOX_OPEN_DIALOG, - RoomEngineTriggerWidgetEvent.REQUEST_MYSTERYTROPHY_OPEN_DIALOG - ], event => - { - const object = GetRoomEngine().getRoomObject(roomSession.roomId, event.objectId, event.category); - - if(!object) return; - - setObjectOwnerId(object.model.getValue(RoomObjectVariable.FURNITURE_OWNER_ID)); - - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.REQUEST_MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG: - if(!IsOwnerOfFurniture(object)) return; - - setConfirmingObjectId(object.id); - setConfirmMode(MONSTERPLANT_SEED_CONFIRMATION); - - onClose(); - return; - case RoomEngineTriggerWidgetEvent.REQUEST_EFFECTBOX_OPEN_DIALOG: - if(!IsOwnerOfFurniture(object)) return; - - setConfirmingObjectId(object.id); - setConfirmMode(EFFECTBOX_OPEN); - - onClose(); - return; - case RoomEngineTriggerWidgetEvent.REQUEST_PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG: - if(!IsOwnerOfFurniture(object)) return; - - setConfirmingObjectId(object.id); - setConfirmMode(PURCHASABLE_CLOTHING_CONFIRMATION); - - onClose(); - return; - case RoomEngineTriggerWidgetEvent.REQUEST_MYSTERYBOX_OPEN_DIALOG: - roomSession.useMultistateItem(object.id); - - onClose(); - return; - case RoomEngineTriggerWidgetEvent.REQUEST_MYSTERYTROPHY_OPEN_DIALOG: - if(!IsOwnerOfFurniture(object)) return; - - setConfirmingObjectId(object.id); - setConfirmMode(MYSTERYTROPHY_OPEN_DIALOG); - - onClose(); - return; - case RoomEngineTriggerWidgetEvent.OPEN_FURNI_CONTEXT_MENU: - - setObjectId(object.id); - - switch(event.contextMenu) - { - case ContextMenuEnum.FRIEND_FURNITURE: - setMode(ContextMenuEnum.FRIEND_FURNITURE); - return; - case ContextMenuEnum.MONSTERPLANT_SEED: - if(IsOwnerOfFurniture(object)) setMode(ContextMenuEnum.MONSTERPLANT_SEED); - return; - case ContextMenuEnum.MYSTERY_BOX: - setMode(ContextMenuEnum.MYSTERY_BOX); - return; - case ContextMenuEnum.MYSTERY_TROPHY: - if(IsOwnerOfFurniture(object)) setMode(ContextMenuEnum.MYSTERY_TROPHY); - return; - case ContextMenuEnum.RANDOM_TELEPORT: - setMode(ContextMenuEnum.RANDOM_TELEPORT); - return; - case ContextMenuEnum.PURCHASABLE_CLOTHING: - if(IsOwnerOfFurniture(object)) setMode(ContextMenuEnum.PURCHASABLE_CLOTHING); - return; - } - - return; - case RoomEngineTriggerWidgetEvent.CLOSE_FURNI_CONTEXT_MENU: - if(object.id === objectId) onClose(); - return; - } - }); - - useMessageEvent(GroupFurniContextMenuInfoMessageEvent, event => - { - const parser = event.getParser(); - - setObjectId(parser.objectId); - setGroupData(parser); - setIsGroupMember(parser.userIsMember); - setMode(GROUP_FURNITURE); - }); - - return { objectId, mode, confirmMode, confirmingObjectId, groupData, isGroupMember, objectOwnerId, closeConfirm, processAction, onClose }; -} - -export const useFurnitureContextMenuWidget = useFurnitureContextMenuWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureCraftingWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureCraftingWidget.ts deleted file mode 100644 index d2bca20..0000000 --- a/src/hooks/rooms/widgets/furniture/useFurnitureCraftingWidget.ts +++ /dev/null @@ -1,166 +0,0 @@ -import { CraftableProductsEvent, CraftComposer, CraftingRecipeEvent, CraftingRecipeIngredientParser, CraftingRecipesAvailableEvent, CraftingResultEvent, GetCraftableProductsComposer, GetCraftingRecipeComposer, GetRoomContentLoader, GetRoomEngine, RoomEngineTriggerWidgetEvent, RoomWidgetEnum } from '@nitrots/nitro-renderer'; -import { useEffect, useState } from 'react'; -import { ICraftingIngredient, ICraftingRecipe, LocalizeText, SendMessageComposer } from '../../../../api'; -import { useMessageEvent, useNitroEvent } from '../../../events'; -import { useInventoryFurni } from '../../../inventory'; -import { useNotification } from './../../../notification'; - -const useFurnitureCraftingWidgetState = () => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ recipes, setRecipes ] = useState([]); - const [ selectedRecipe, setSelectedRecipe ] = useState(null); - const [ ingredients, setIngredients ] = useState([]); - const [ ingredientNames, setIngredientNames ] = useState(null); - const [ cachedIngredients, setCachedIngredients ] = useState>(new Map()); - const [ isCrafting, setIsCrafting ] = useState(false); - const { groupItems = [], getItemsByType = null, activate = null, deactivate = null } = useInventoryFurni(); - const { simpleAlert = null } = useNotification(); - - const requiredIngredients = ((selectedRecipe && cachedIngredients.get(selectedRecipe.name) || null)); - - const resetData = () => - { - setRecipes([]); - setSelectedRecipe(null); - setIngredients([]); - setCachedIngredients(new Map()); - }; - - const onClose = () => - { - setObjectId(-1); - resetData(); - }; - - const craft = () => - { - setIsCrafting(true); - - SendMessageComposer(new CraftComposer(objectId, selectedRecipe.name)); - }; - - const selectRecipe = (recipe: ICraftingRecipe) => - { - setSelectedRecipe(recipe); - - const cache = cachedIngredients.get(recipe.name); - - if(!cache) SendMessageComposer(new GetCraftingRecipeComposer(recipe.name)); - } - - useNitroEvent(RoomEngineTriggerWidgetEvent.OPEN_WIDGET, event => - { - if (event.widget !== RoomWidgetEnum.CRAFTING) return; - - setObjectId(event.objectId); - resetData(); - SendMessageComposer(new GetCraftableProductsComposer(event.objectId)); - }); - - useMessageEvent(CraftableProductsEvent, event => - { - const parser = event.getParser(); - - if (!parser.isActive()) - { - setObjectId(-1); - - return; - } - - setRecipes(prevValue => - { - const newValue: ICraftingRecipe[] = []; - - for(const recipe of parser.recipes) - { - //@ts-ignore - const itemId = GetRoomContentLoader()._activeObjectTypeIds.get(recipe.itemName); - const iconUrl = GetRoomEngine().getFurnitureFloorIconUrl(itemId); - - newValue.push({ - name: recipe.recipeName, - localizedName: LocalizeText('roomItem.name.' + itemId), - iconUrl - }); - } - - return newValue; - }); - - setIngredientNames(parser.ingredients); - }); - - useMessageEvent(CraftingRecipeEvent, event => - { - const parser = event.getParser(); - - setCachedIngredients(prevValue => - { - const newValue = new Map(prevValue); - - newValue.set(selectedRecipe.name, parser.ingredients); - - return newValue; - }); - }); - - useMessageEvent(CraftingResultEvent, event => - { - setSelectedRecipe(null); - setIsCrafting(false); - - const parser = event.getParser(); - - if(parser.result) simpleAlert(LocalizeText('crafting.info.result.ok')); - }); - - useMessageEvent(CraftingRecipesAvailableEvent, event => - { - }); - - useEffect(() => - { - if(!ingredientNames || !ingredientNames.length) return; - - setIngredients(prevValue => - { - const newValue: ICraftingIngredient[] = []; - - for(const name of ingredientNames) - { - //@ts-ignore - const itemId = GetRoomContentLoader()._activeObjectTypeIds.get(name); - const iconUrl = GetRoomEngine().getFurnitureFloorIconUrl(itemId); - - const inventoryItems = getItemsByType(itemId); - - let amountAvailable = 0; - - if (inventoryItems) for (const inventoryItem of inventoryItems) amountAvailable += inventoryItem.items.length; - - newValue.push({ - name: name, - iconUrl, - count: amountAvailable - }); - } - - return newValue; - }); - }, [ groupItems, ingredientNames, getItemsByType ]); - - useEffect(() => - { - if((objectId === -1)) return; - - const id = activate(); - - return () => deactivate(id); - }, [ objectId, activate, deactivate ]); - - return { objectId, recipes, ingredients, selectedRecipe, requiredIngredients, isCrafting, selectRecipe, craft, onClose }; -} - -export const useFurnitureCraftingWidget = useFurnitureCraftingWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureDimmerWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureDimmerWidget.ts deleted file mode 100644 index 5c206a7..0000000 --- a/src/hooks/rooms/widgets/furniture/useFurnitureDimmerWidget.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { GetSessionDataManager, RoomControllerLevel, RoomEngineDimmerStateEvent, RoomEngineTriggerWidgetEvent, RoomId, RoomSessionDimmerPresetsEvent } from '@nitrots/nitro-renderer'; -import { useEffect, useState } from 'react'; -import { DimmerFurnitureWidgetPresetItem, FurnitureDimmerUtilities } from '../../../../api'; -import { useNitroEvent } from '../../../events'; -import { useRoom } from '../../useRoom'; - -const useFurnitureDimmerWidgetState = () => -{ - const [ presets, setPresets ] = useState([]); - const [ selectedPresetId, setSelectedPresetId ] = useState(0); - const [ dimmerState, setDimmerState ] = useState(0); - const [ lastDimmerState, setLastDimmerState ] = useState(0); - const [ effectId, setEffectId ] = useState(0); - const [ color, setColor ] = useState(0xFFFFFF); - const [ brightness, setBrightness ] = useState(0xFF); - const [ selectedEffectId, setSelectedEffectId ] = useState(0); - const [ selectedColor, setSelectedColor ] = useState(0); - const [ selectedBrightness, setSelectedBrightness ] = useState(0); - const { roomSession = null } = useRoom(); - - const canOpenWidget = () => (roomSession.isRoomOwner || (roomSession.controllerLevel >= RoomControllerLevel.GUEST) || GetSessionDataManager().isModerator); - - const selectPresetId = (id: number) => - { - const preset = presets[(id - 1)]; - - if(!preset) return; - - setSelectedPresetId(preset.id); - setSelectedEffectId(preset.type); - setSelectedColor(preset.color); - setSelectedBrightness(preset.light); - } - - const applyChanges = () => - { - if(dimmerState === 0) return; - - const selectedPresetIndex = (selectedPresetId - 1); - - if((selectedPresetId < 1) || (selectedPresetId > presets.length)) return; - - const preset = presets[selectedPresetIndex]; - - if(!preset || ((selectedEffectId === preset.type) && (selectedColor === preset.color) && (selectedBrightness === preset.light))) return; - - setPresets(prevValue => - { - const newValue = [ ...prevValue ]; - - newValue[selectedPresetIndex] = new DimmerFurnitureWidgetPresetItem(preset.id, selectedEffectId, selectedColor, selectedBrightness); - - return newValue; - }); - - FurnitureDimmerUtilities.savePreset(preset.id, selectedEffectId, selectedColor, selectedBrightness, true); - } - - useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_DIMMER, event => - { - if(!canOpenWidget()) return; - - roomSession.requestMoodlightSettings(); - }); - - useNitroEvent(RoomSessionDimmerPresetsEvent.ROOM_DIMMER_PRESETS, event => - { - const presets: DimmerFurnitureWidgetPresetItem[] = []; - - let i = 0; - - while(i < event.presetCount) - { - const preset = event.getPreset(i); - - if(preset) presets.push(new DimmerFurnitureWidgetPresetItem(preset.id, preset.type, preset.color, preset.brightness)); - - i++; - } - - setPresets(presets); - setSelectedPresetId(event.selectedPresetId); - }); - - useNitroEvent(RoomEngineDimmerStateEvent.ROOM_COLOR, event => - { - if(RoomId.isRoomPreviewerId(event.roomId)) return; - - setLastDimmerState(dimmerState); - setDimmerState(event.state); - setSelectedPresetId(event.presetId); - setEffectId(event.effectId); - setSelectedEffectId(event.effectId); - setColor(event.color); - setSelectedColor(event.color); - setBrightness(event.brightness); - setSelectedBrightness(event.brightness); - }); - - useEffect(() => - { - if((dimmerState === 0) && (lastDimmerState === 0)) return; - - FurnitureDimmerUtilities.previewDimmer(selectedColor, selectedBrightness, (selectedEffectId === 2)); - }, [ dimmerState, lastDimmerState, selectedColor, selectedBrightness, selectedEffectId ]); - - return { presets, selectedPresetId, dimmerState, lastDimmerState, effectId, color, brightness, selectedEffectId, setSelectedEffectId, selectedColor, setSelectedColor, selectedBrightness, setSelectedBrightness, selectPresetId, applyChanges }; -} - -export const useFurnitureDimmerWidget = useFurnitureDimmerWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureExchangeWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureExchangeWidget.ts deleted file mode 100644 index dc3404f..0000000 --- a/src/hooks/rooms/widgets/furniture/useFurnitureExchangeWidget.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { FurnitureExchangeComposer, GetRoomEngine, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { IsOwnerOfFurniture, SendMessageComposer } from '../../../../api'; -import { useNitroEvent } from '../../../events'; -import { useFurniRemovedEvent } from '../../engine'; - -const useFurnitureExchangeWidgetState = () => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ category, setCategory ] = useState(-1); - const [ value, setValue ] = useState(0); - - const onClose = () => - { - setObjectId(-1); - setCategory(-1); - setValue(0); - } - - const redeem = () => - { - SendMessageComposer(new FurnitureExchangeComposer(objectId)); - - onClose(); - } - - useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_CREDITFURNI, event => - { - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - - if(!roomObject || !IsOwnerOfFurniture(roomObject)) return; - - setObjectId(event.objectId); - setCategory(event.category); - setValue(roomObject.model.getValue(RoomObjectVariable.FURNITURE_CREDIT_VALUE) || 0); - }); - - useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => - { - if((event.id !== objectId) || (event.category !== category)) return; - - onClose(); - }); - - return { objectId, value, redeem, onClose }; -} - -export const useFurnitureExchangeWidget = useFurnitureExchangeWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureExternalImageWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureExternalImageWidget.ts deleted file mode 100644 index 5e5aa99..0000000 --- a/src/hooks/rooms/widgets/furniture/useFurnitureExternalImageWidget.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { GetRoomEngine, RoomEngineTriggerWidgetEvent, RoomObjectCategory, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { IPhotoData } from '../../../../api'; -import { useNitroEvent } from '../../../events'; -import { useFurniRemovedEvent } from '../../engine'; -import { useRoom } from '../../useRoom'; - -const useFurnitureExternalImageWidgetState = () => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ category, setCategory ] = useState(-1); - const [ currentPhotoIndex, setCurrentPhotoIndex ] = useState(-1); - const [ currentPhotos, setCurrentPhotos ] = useState([]); - const { roomSession = null } = useRoom(); - - const onClose = () => - { - setObjectId(-1); - setCategory(-1); - setCurrentPhotoIndex(-1); - setCurrentPhotos([]); - } - - useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_EXTERNAL_IMAGE, event => - { - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - const roomTotalImages = GetRoomEngine().getRoomObjects(roomSession?.roomId, RoomObjectCategory.WALL); - - if(!roomObject) return; - - const datas: IPhotoData[] = []; - - roomTotalImages.forEach(object => - { - if (object.type !== 'external_image_wallitem_poster_small') return null; - - const data = object.model.getValue(RoomObjectVariable.FURNITURE_DATA); - const jsonData: IPhotoData = JSON.parse(data); - - datas.push(jsonData); - }); - - setObjectId(event.objectId); - setCategory(event.category); - setCurrentPhotos(datas); - - const roomObjectPhotoData = (JSON.parse(roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA)) as IPhotoData); - - setCurrentPhotoIndex(prevValue => - { - let index = 0; - - if(roomObjectPhotoData) - { - index = datas.findIndex(data => (data.u === roomObjectPhotoData.u)) - } - - if(index < 0) index = 0; - - return index; - }); - }); - - useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => - { - if((event.id !== objectId) || (event.category !== category)) return; - - onClose(); - }); - - return { objectId, currentPhotoIndex, currentPhotos, onClose }; -} - -export const useFurnitureExternalImageWidget = useFurnitureExternalImageWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureFriendFurniWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureFriendFurniWidget.ts deleted file mode 100644 index 3517d39..0000000 --- a/src/hooks/rooms/widgets/furniture/useFurnitureFriendFurniWidget.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { FriendFurniConfirmLockMessageComposer, GetRoomEngine, LoveLockFurniFinishedEvent, LoveLockFurniFriendConfirmedEvent, LoveLockFurniStartEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { SendMessageComposer } from '../../../../api'; -import { useMessageEvent, useNitroEvent } from '../../../events'; -import { useFurniRemovedEvent } from '../../engine'; - -const useFurnitureFriendFurniWidgetState = () => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ category, setCategory ] = useState(-1); - const [ type, setType ] = useState(0); - const [ usernames, setUsernames ] = useState([]); - const [ figures, setFigures ] = useState([]); - const [ date, setDate ] = useState(null); - const [ stage, setStage ] = useState(0); - - const onClose = () => - { - setObjectId(-1); - setCategory(-1); - setType(0); - setUsernames([]); - setFigures([]); - setDate(null); - } - - const respond = (flag: boolean) => - { - SendMessageComposer(new FriendFurniConfirmLockMessageComposer(objectId, flag)); - - onClose(); - } - - useMessageEvent(LoveLockFurniStartEvent, event => - { - const parser = event.getParser(); - - setObjectId(parser.furniId); - setStage(parser.start ? 1 : 2); - }); - - useMessageEvent(LoveLockFurniFinishedEvent, event => onClose()); - useMessageEvent(LoveLockFurniFriendConfirmedEvent, event => onClose()); - - useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_FRIEND_FURNITURE_ENGRAVING, event => - { - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - - if(!roomObject) return; - - const data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); - const type = roomObject.model.getValue(RoomObjectVariable.FURNITURE_FRIENDFURNI_ENGRAVING); - - if((data[0] !== '1') || (data.length !== 6)) return; - - setObjectId(event.objectId); - setCategory(event.category); - setType(type); - setUsernames([ data[1], data[2] ]); - setFigures([ data[3], data[4] ]); - setDate(data[5]); - setStage(0); - }); - - useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => - { - if((event.id !== objectId) || (event.category !== category)) return; - - onClose(); - }); - - return { objectId, type, usernames, figures, date, stage, onClose, respond }; -} - -export const useFurnitureFriendFurniWidget = useFurnitureFriendFurniWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureHighScoreWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureHighScoreWidget.ts deleted file mode 100644 index 08e5038..0000000 --- a/src/hooks/rooms/widgets/furniture/useFurnitureHighScoreWidget.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { GetRoomEngine, HighScoreDataType, ObjectDataFactory, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { useNitroEvent } from '../../../events'; -import { useRoom } from '../../useRoom'; - -const SCORE_TYPES = [ 'perteam', 'mostwins', 'classic' ]; -const CLEAR_TYPES = [ 'alltime', 'daily', 'weekly', 'monthly' ]; - -const useFurnitureHighScoreWidgetState = () => -{ - const [ stuffDatas, setStuffDatas ] = useState>(new Map()); - const { roomSession = null } = useRoom(); - - const getScoreType = (type: number) => SCORE_TYPES[type]; - const getClearType = (type: number) => CLEAR_TYPES[type]; - - useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIGH_SCORE_DISPLAY, event => - { - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - - if(!roomObject) return; - - const formatKey = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA_FORMAT); - const stuffData = (ObjectDataFactory.getData(formatKey) as HighScoreDataType); - - stuffData.initializeFromRoomObjectModel(roomObject.model); - - setStuffDatas(prevValue => - { - const newValue = new Map(prevValue); - - newValue.set(roomObject.id, stuffData); - - return newValue; - }); - }); - - useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIDE_HIGH_SCORE_DISPLAY, event => - { - if(event.roomId !== roomSession.roomId) return; - - setStuffDatas(prevValue => - { - const newValue = new Map(prevValue); - - newValue.delete(event.objectId); - - return newValue; - }); - }); - - return { stuffDatas, getScoreType, getClearType }; -} - -export const useFurnitureHighScoreWidget = useFurnitureHighScoreWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureInternalLinkWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureInternalLinkWidget.ts deleted file mode 100644 index 27e6b2e..0000000 --- a/src/hooks/rooms/widgets/furniture/useFurnitureInternalLinkWidget.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { CreateLinkEvent, GetRoomEngine, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { useNitroEvent } from '../../../events'; - -const INTERNALLINK = 'internalLink'; - -const useFurnitureInternalLinkWidgetState = () => -{ - useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_INTERNAL_LINK, event => - { - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - - if(!roomObject) return; - - const data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); - - let link = data[INTERNALLINK]; - - if(!link || !link.length) link = roomObject.model.getValue(RoomObjectVariable.FURNITURE_INTERNAL_LINK); - - if(link && link.length) CreateLinkEvent(link); - }); - - return {}; -} - -export const useFurnitureInternalLinkWidget = useFurnitureInternalLinkWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureMannequinWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureMannequinWidget.ts deleted file mode 100644 index 3e88457..0000000 --- a/src/hooks/rooms/widgets/furniture/useFurnitureMannequinWidget.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { FurnitureMannequinSaveLookComposer, FurnitureMannequinSaveNameComposer, FurnitureMultiStateComposer, GetAvatarRenderManager, GetRoomEngine, HabboClubLevelEnum, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { MannequinUtilities, SendMessageComposer } from '../../../../api'; -import { useNitroEvent } from '../../../events'; -import { useFurniRemovedEvent } from '../../engine'; - -const useFurnitureMannequinWidgetState = () => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ category, setCategory ] = useState(-1); - const [ figure, setFigure ] = useState(null); - const [ gender, setGender ] = useState(null); - const [ clubLevel, setClubLevel ] = useState(HabboClubLevelEnum.NO_CLUB); - const [ name, setName ] = useState(null); - - const onClose = () => - { - setObjectId(-1); - setCategory(-1); - setFigure(null); - setGender(null); - setName(null); - } - - const saveFigure = () => - { - if(objectId === -1) return; - - SendMessageComposer(new FurnitureMannequinSaveLookComposer(objectId)); - - onClose(); - } - - const wearFigure = () => - { - if(objectId === -1) return; - - SendMessageComposer(new FurnitureMultiStateComposer(objectId)); - - onClose(); - } - - const saveName = () => - { - if(objectId === -1) return; - - SendMessageComposer(new FurnitureMannequinSaveNameComposer(objectId, name)); - } - - useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_MANNEQUIN, event => - { - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - - if(!roomObject) return; - - const model = roomObject.model; - const figure = (model.getValue(RoomObjectVariable.FURNITURE_MANNEQUIN_FIGURE) || null); - const gender = (model.getValue(RoomObjectVariable.FURNITURE_MANNEQUIN_GENDER) || null); - const figureContainer = GetAvatarRenderManager().createFigureContainer(figure); - const figureClubLevel = GetAvatarRenderManager().getFigureClubLevel(figureContainer, gender, MannequinUtilities.MANNEQUIN_CLOTHING_PART_TYPES); - - setObjectId(event.objectId); - setCategory(event.category); - setFigure(figure); - setGender(gender); - setClubLevel(figureClubLevel); - setName(model.getValue(RoomObjectVariable.FURNITURE_MANNEQUIN_NAME) || null); - }); - - useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => - { - if((event.id !== objectId) || (event.category !== category)) return; - - onClose(); - }); - - return { objectId, figure, gender, clubLevel, name, setName, saveFigure, wearFigure, saveName, onClose }; -} - -export const useFurnitureMannequinWidget = useFurnitureMannequinWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurniturePlaylistEditorWidget.ts b/src/hooks/rooms/widgets/furniture/useFurniturePlaylistEditorWidget.ts deleted file mode 100644 index ec89553..0000000 --- a/src/hooks/rooms/widgets/furniture/useFurniturePlaylistEditorWidget.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { AddJukeboxDiskComposer, AdvancedMap, FurnitureListAddOrUpdateEvent, FurnitureListEvent, FurnitureListRemovedEvent, FurnitureMultiStateComposer, GetRoomEngine, GetSessionDataManager, GetSoundManager, IAdvancedMap, IMessageEvent, ISongInfo, NotifyPlayedSongEvent, NowPlayingEvent, PlayListStatusEvent, RemoveJukeboxDiskComposer, RoomControllerLevel, RoomEngineTriggerWidgetEvent, SongDiskInventoryReceivedEvent } from '@nitrots/nitro-renderer'; -import { useCallback, useState } from 'react'; -import { IsOwnerOfFurniture, LocalizeText, NotificationAlertType, NotificationBubbleType, SendMessageComposer } from '../../../../api'; -import { useMessageEvent, useNitroEvent } from '../../../events'; -import { useNotification } from '../../../notification'; -import { useFurniRemovedEvent } from '../../engine'; -import { useRoom } from '../../useRoom'; - -const useFurniturePlaylistEditorWidgetState = () => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ category, setCategory ] = useState(-1); - const [ currentPlayingIndex, setCurrentPlayingIndex ] = useState(-1); - const [ diskInventory, setDiskInventory ] = useState>(new AdvancedMap()); - const [ playlist, setPlaylist ] = useState([]); - const { roomSession = null } = useRoom(); - const { showSingleBubble = null, simpleAlert = null } = useNotification(); - - const onClose = () => - { - setObjectId(-1); - setCategory(-1); - } - - const addToPlaylist = useCallback((diskId: number, slotNumber: number) => SendMessageComposer(new AddJukeboxDiskComposer(diskId, slotNumber)), []); - - const removeFromPlaylist = useCallback((slotNumber: number) => SendMessageComposer(new RemoveJukeboxDiskComposer(slotNumber)), []); - - const togglePlayPause = useCallback((furniId: number, position: number) => SendMessageComposer(new FurnitureMultiStateComposer(furniId, position)), []); - - useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_PLAYLIST_EDITOR, event => - { - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - - if(!roomObject) return; - - if(IsOwnerOfFurniture(roomObject)) - { - // show the editor - setObjectId(event.objectId); - setCategory(event.category); - - GetSoundManager().musicController?.requestUserSongDisks(); - GetSoundManager().musicController?.getRoomItemPlaylist()?.requestPlayList(); - - return; - } - - if(roomSession.isRoomOwner || (roomSession.controllerLevel >= RoomControllerLevel.GUEST) || GetSessionDataManager().isModerator) SendMessageComposer(new FurnitureMultiStateComposer(event.objectId, -2)); - }); - - useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => - { - if((event.id !== objectId) || (event.category !== category)) return; - - onClose(); - }); - - useNitroEvent(NowPlayingEvent.NPE_SONG_CHANGED, event => - { - setCurrentPlayingIndex(event.position); - }); - - useNitroEvent(NotifyPlayedSongEvent.NOTIFY_PLAYED_SONG, event => - { - showSingleBubble(LocalizeText('soundmachine.notification.playing', [ 'songname', 'songauthor' ], [ event.name, event.creator ]), NotificationBubbleType.SOUNDMACHINE) - }); - - useNitroEvent(SongDiskInventoryReceivedEvent.SDIR_SONG_DISK_INVENTORY_RECEIVENT_EVENT, event => - { - setDiskInventory(GetSoundManager().musicController?.songDiskInventory.clone()); - }); - - useNitroEvent(PlayListStatusEvent.PLUE_PLAY_LIST_UPDATED, event => - { - setPlaylist(GetSoundManager().musicController?.getRoomItemPlaylist()?.entries.concat()) - }); - - useNitroEvent(PlayListStatusEvent.PLUE_PLAY_LIST_FULL, event => - { - simpleAlert(LocalizeText('playlist.editor.alert.playlist.full'), NotificationAlertType.ALERT, '', '', LocalizeText('playlist.editor.alert.playlist.full.title')); - }); - - const onFurniListUpdated = (event : IMessageEvent) => - { - if(objectId === -1) return; - - if(event instanceof FurnitureListEvent) - { - if(event.getParser().fragmentNumber === 0) - { - GetSoundManager().musicController?.requestUserSongDisks(); - } - } - else - { - GetSoundManager().musicController?.requestUserSongDisks(); - } - } - - useMessageEvent(FurnitureListEvent, onFurniListUpdated); - useMessageEvent(FurnitureListRemovedEvent, onFurniListUpdated); - useMessageEvent(FurnitureListAddOrUpdateEvent, onFurniListUpdated); - - return { objectId, diskInventory, playlist, currentPlayingIndex, onClose, addToPlaylist, removeFromPlaylist, togglePlayPause }; -} - -export const useFurniturePlaylistEditorWidget = useFurniturePlaylistEditorWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurniturePresentWidget.ts b/src/hooks/rooms/widgets/furniture/useFurniturePresentWidget.ts deleted file mode 100644 index 0058885..0000000 --- a/src/hooks/rooms/widgets/furniture/useFurniturePresentWidget.ts +++ /dev/null @@ -1,235 +0,0 @@ -import { GetRoomEngine, GetSessionDataManager, IFurnitureData, IGetImageListener, PetFigureData, RoomEngineTriggerWidgetEvent, RoomObjectCategory, RoomObjectVariable, RoomSessionPresentEvent, TextureUtils, Vector3d } from '@nitrots/nitro-renderer'; -import { useMemo, useState } from 'react'; -import { IsOwnerOfFurniture, LocalizeText, ProductTypeEnum } from '../../../../api'; -import { useNitroEvent } from '../../../events'; -import { useFurniRemovedEvent } from '../../engine'; -import { useRoom } from '../../useRoom'; - -const FLOOR: string = 'floor'; -const WALLPAPER: string = 'wallpaper'; -const LANDSCAPE: string = 'landscape'; -const POSTER: string = 'poster'; - -const useFurniturePresentWidgetState = () => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ classId, setClassId ] = useState(-1); - const [ itemType, setItemType ] = useState(null); - const [ text, setText ] = useState(null); - const [ isOwnerOfFurniture, setIsOwnerOfFurniture ] = useState(false); - const [ senderName, setSenderName ] = useState(null); - const [ senderFigure, setSenderFigure ] = useState(null); - const [ placedItemId, setPlacedItemId ] = useState(-1); - const [ placedItemType, setPlacedItemType ] = useState(null); - const [ placedInRoom, setPlacedInRoom ] = useState(false); - const [ imageUrl, setImageUrl ] = useState(null); - const { roomSession = null } = useRoom(); - - const onClose = () => - { - setObjectId(-1); - setClassId(-1); - setItemType(null); - setText(null); - setIsOwnerOfFurniture(false); - setSenderName(null); - setSenderFigure(null); - setPlacedItemId(-1); - setPlacedItemType(null); - setPlacedInRoom(false); - setImageUrl(null); - } - - const openPresent = () => - { - if(objectId === -1) return; - - roomSession.openGift(objectId); - - GetRoomEngine().changeObjectModelData(GetRoomEngine().activeRoomId, objectId, RoomObjectCategory.FLOOR, RoomObjectVariable.FURNITURE_DISABLE_PICKING_ANIMATION, 1); - } - - const imageListener: IGetImageListener = useMemo(() => - { - // async fix image - return { - imageReady: (id, texture, image) => - { - (async () => - { - if(!image && texture) - { - image = await TextureUtils.generateImage(texture); - } - - setImageUrl(image.src); - })(); - }, - imageFailed: null - } - }, []); - - useNitroEvent(RoomSessionPresentEvent.RSPE_PRESENT_OPENED, event => - { - let furniData: IFurnitureData = null; - - if(event.itemType === ProductTypeEnum.FLOOR) - { - furniData = GetSessionDataManager().getFloorItemData(event.classId); - } - else if(event.itemType === ProductTypeEnum.WALL) - { - furniData = GetSessionDataManager().getWallItemData(event.classId); - } - - let isOwnerOfFurni = false; - - if(event.placedInRoom) - { - const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, event.placedItemId, RoomObjectCategory.FLOOR); - - if(roomObject) isOwnerOfFurni = IsOwnerOfFurniture(roomObject); - } - - let giftImage: string = null; - - switch(event.itemType) - { - case ProductTypeEnum.WALL: { - if(furniData) - { - switch(furniData.className) - { - case FLOOR: - case LANDSCAPE: - case WALLPAPER: - let imageType = null; - let message = null; - - if(furniData.className === FLOOR) - { - imageType = 'packagecard_icon_floor'; - message = LocalizeText('inventory.furni.item.floor.name'); - } - - else if(furniData.className === LANDSCAPE) - { - imageType = 'packagecard_icon_landscape'; - message = LocalizeText('inventory.furni.item.landscape.name'); - } - - else - { - imageType = 'packagecard_icon_wallpaper'; - message = LocalizeText('inventory.furni.item.wallpaper.name'); - } - - setText(message); - //setImageUrl(getGiftImageUrl(imageType)); - break; - case POSTER: { - const productCode = event.productCode; - - let extras: string = null; - - if(productCode.indexOf('poster') === 0) extras = productCode.replace('poster', ''); - - const productData = GetSessionDataManager().getProductData(productCode); - - let name: string = null; - - if(productData) name = productData.name; - else if(furniData) name = furniData.name; - - setText(name); - setImageUrl(GetRoomEngine().getFurnitureWallIconUrl(event.classId, extras)); - - break; - } - default: { - setText(furniData.name || null); - setImageUrl(GetRoomEngine().getFurnitureWallIconUrl(event.classId)); - break; - } - } - } - - break; - } - case ProductTypeEnum.HABBO_CLUB: - setText(LocalizeText('widget.furni.present.hc')); - //setImageUrl(getGiftImageUrl('packagecard_icon_hc')); - break; - default: { - if(event.placedItemType === ProductTypeEnum.PET) - { - const petfigureString = event.petFigureString; - - if(petfigureString && petfigureString.length) - { - const petFigureData = new PetFigureData(petfigureString); - - (async () => - { - const petImage = GetRoomEngine().getRoomObjectPetImage(petFigureData.typeId, petFigureData.paletteId, petFigureData.color, new Vector3d(90), 64, imageListener, true, 0, petFigureData.customParts); - - if(petImage) setImageUrl((await petImage.getImage()).src); - })(); - } - } - else - { - (async () => - { - const furniImage = GetRoomEngine().getFurnitureFloorImage(event.classId, new Vector3d(90), 64, imageListener); - - if(furniImage) setImageUrl((await furniImage.getImage()).src); - })(); - } - - const productData = GetSessionDataManager().getProductData(event.productCode); - - setText((productData && productData.name) || furniData.name); - break; - } - } - - setObjectId(0); - setClassId(event.classId); - setItemType(event.itemType); - setIsOwnerOfFurniture(isOwnerOfFurni); - setPlacedItemId(event.placedItemId); - setPlacedItemType(event.placedItemType); - setPlacedInRoom(event.placedInRoom); - }); - - useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_PRESENT, event => - { - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - - if(!roomObject) return null; - - onClose(); - - setObjectId(event.objectId); - setClassId(-1); - setText((roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA) || '')); - setIsOwnerOfFurniture(IsOwnerOfFurniture(roomObject)); - setSenderName((roomObject.model.getValue(RoomObjectVariable.FURNITURE_PURCHASER_NAME) || null)); - setSenderFigure((roomObject.model.getValue(RoomObjectVariable.FURNITURE_PURCHASER_FIGURE) || null)); - }); - - useFurniRemovedEvent((objectId !== -1), event => - { - if(event.id === objectId) onClose(); - - if(event.id === placedItemId) - { - if(placedInRoom) setPlacedInRoom(false); - } - }); - - return { objectId, classId, itemType, text, isOwnerOfFurniture, senderName, senderFigure, placedItemId, placedItemType, placedInRoom, imageUrl, openPresent, onClose }; -} - -export const useFurniturePresentWidget = useFurniturePresentWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureRoomLinkWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureRoomLinkWidget.ts deleted file mode 100644 index 31180a0..0000000 --- a/src/hooks/rooms/widgets/furniture/useFurnitureRoomLinkWidget.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { GetGuestRoomMessageComposer, GetGuestRoomResultEvent, GetRoomEngine, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { SendMessageComposer } from '../../../../api'; -import { useMessageEvent, useNitroEvent } from '../../../events'; - -const INTERNALLINK = 'internalLink'; - -const useFurnitureRoomLinkWidgetState = () => -{ - const [ roomIdToEnter, setRoomIdToEnter ] = useState(0); - - useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_ROOM_LINK, event => - { - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - - if(!roomObject) return; - - const data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); - - let roomId = data[INTERNALLINK]; - - if(!roomId || !roomId.length) roomId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_INTERNAL_LINK); - - if(!roomId || !roomId.length) return; - - roomId = parseInt(roomId, 10); - - if(isNaN(roomId)) return; - - setRoomIdToEnter(roomId); - - SendMessageComposer(new GetGuestRoomMessageComposer(roomId, false, false)); - }); - - useMessageEvent(GetGuestRoomResultEvent, event => - { - if(!roomIdToEnter) return; - - const parser = event.getParser(); - - if(parser.data.roomId !== roomIdToEnter) return; - - setRoomIdToEnter(0); - }); - - return {}; -} - -export const useFurnitureRoomLinkWidget = useFurnitureRoomLinkWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureSpamWallPostItWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureSpamWallPostItWidget.ts deleted file mode 100644 index 3226382..0000000 --- a/src/hooks/rooms/widgets/furniture/useFurnitureSpamWallPostItWidget.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { AddSpamWallPostItMessageComposer, GetRoomEngine, RequestSpamWallPostItMessageEvent, RoomObjectCategory } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { SendMessageComposer } from '../../../../api'; -import { useMessageEvent } from '../../../events'; -import { useInventoryFurni } from '../../../inventory'; - -const useFurnitureSpamWallPostItWidgetState = () => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ category, setCategory ] = useState(-1); - const [ itemType, setItemType ] = useState(''); - const [ location, setLocation ] = useState(''); - const [ color, setColor ] = useState('0'); - const [ text, setText ] = useState(''); - const [ canModify, setCanModify ] = useState(false); - const { getWallItemById = null } = useInventoryFurni(); - - const onClose = () => - { - SendMessageComposer(new AddSpamWallPostItMessageComposer(objectId, location, color, text)); - - setObjectId(-1); - setCategory(-1); - setItemType(''); - setLocation(''); - setColor('0'); - setText(''); - setCanModify(false); - } - - useMessageEvent(RequestSpamWallPostItMessageEvent, event => - { - const parser = event.getParser(); - - setObjectId(parser.itemId); - setCategory(RoomObjectCategory.WALL); - - const inventoryItem = getWallItemById(parser.itemId); - - let itemType = 'post_it'; - - if(inventoryItem) - { - const wallItemType = GetRoomEngine().getFurnitureWallName(inventoryItem.type); - - if(wallItemType.match('post_it_')) itemType = wallItemType; - } - - setItemType(itemType); - setLocation(parser.location); - setColor('FFFF33'); - setText(''); - setCanModify(true); - }); - - return { objectId, color, setColor, text, setText, canModify, onClose }; -} - -export const useFurnitureSpamWallPostItWidget = useFurnitureSpamWallPostItWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureStackHeightWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureStackHeightWidget.ts deleted file mode 100644 index 846f14e..0000000 --- a/src/hooks/rooms/widgets/furniture/useFurnitureStackHeightWidget.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { FurnitureStackHeightComposer, FurnitureStackHeightEvent, GetRoomEngine, RoomEngineTriggerWidgetEvent } from '@nitrots/nitro-renderer'; -import { useEffect, useState } from 'react'; -import { CanManipulateFurniture, GetRoomSession, SendMessageComposer } from '../../../../api'; -import { useMessageEvent, useNitroEvent } from '../../../events'; -import { useFurniRemovedEvent } from '../../engine'; - -const MAX_HEIGHT: number = 40; - -const useFurnitureStackHeightWidgetState = () => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ category, setCategory ] = useState(-1); - const [ height, setHeight ] = useState(0); - const [ pendingHeight, setPendingHeight ] = useState(-1); - - const onClose = () => - { - setObjectId(-1); - setCategory(-1); - setHeight(0); - setPendingHeight(-1); - } - - const updateHeight = (height: number, server: boolean = false) => - { - if(!height) height = 0; - - height = Math.abs(height); - - if(!server) ((height > MAX_HEIGHT) && (height = MAX_HEIGHT)); - - setHeight(parseFloat(height.toFixed(2))); - - if(!server) setPendingHeight(height * 100); - } - - useMessageEvent(FurnitureStackHeightEvent, event => - { - const parser = event.getParser(); - - if(objectId !== parser.furniId) return; - - updateHeight(parser.height, true); - }); - - useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_STACK_HEIGHT, event => - { - if(!CanManipulateFurniture(GetRoomSession(), event.objectId, event.category)) return; - - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - - if(!roomObject) return; - - setObjectId(event.objectId); - setCategory(event.category); - setHeight(roomObject.getLocation().z); - setPendingHeight(-1); - }); - - useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => - { - if((event.id !== objectId) || (event.category !== category)) return; - - onClose(); - }); - - useEffect(() => - { - if((objectId === -1) || (pendingHeight === -1)) return; - - const timeout = setTimeout(() => SendMessageComposer(new FurnitureStackHeightComposer(objectId, ~~(pendingHeight))), 10); - - return () => clearTimeout(timeout); - }, [ objectId, pendingHeight ]); - - return { objectId, height, maxHeight: MAX_HEIGHT, onClose, updateHeight }; -} - -export const useFurnitureStackHeightWidget = useFurnitureStackHeightWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureStickieWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureStickieWidget.ts deleted file mode 100644 index 3d745a3..0000000 --- a/src/hooks/rooms/widgets/furniture/useFurnitureStickieWidget.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { GetRoomEngine, GetSessionDataManager, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { GetRoomSession, IsOwnerOfFurniture } from '../../../../api'; -import { useNitroEvent } from '../../../events'; -import { useFurniRemovedEvent } from '../../engine'; - -const useFurnitureStickieWidgetState = () => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ category, setCategory ] = useState(-1); - const [ color, setColor ] = useState('0'); - const [ text, setText ] = useState(''); - const [ type, setType ] = useState(''); - const [ canModify, setCanModify ] = useState(false); - - const onClose = () => - { - setObjectId(-1); - setCategory(-1); - setColor('0'); - setText(''); - setType(''); - setCanModify(false); - } - - const updateColor = (newColor: string) => - { - if(newColor === color) return; - - setColor(newColor); - - GetRoomEngine().modifyRoomObjectData(objectId, category, newColor, text); - } - - const updateText = (newText: string) => - { - setText(newText); - - GetRoomEngine().modifyRoomObjectData(objectId, category, color, newText); - } - - const trash = () => GetRoomEngine().deleteRoomObject(objectId, category); - - useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_STICKIE, event => - { - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - - if(!roomObject) return; - - const data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_ITEMDATA); - - if(data.length < 6) return; - - let color: string = null; - let text: string = null; - - if(data.indexOf(' ') > 0) - { - color = data.slice(0, data.indexOf(' ')); - text = data.slice((data.indexOf(' ') + 1), data.length); - } - else - { - color = data; - } - - setObjectId(event.objectId); - setCategory(event.category); - setColor(color || '0'); - setText(text || ''); - setType(roomObject.type || 'post_it'); - setCanModify(GetRoomSession().isRoomOwner || GetSessionDataManager().isModerator || IsOwnerOfFurniture(roomObject)); - }); - - useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => - { - if((event.id !== objectId) || (event.category !== category)) return; - - onClose(); - }); - - return { objectId, color, text, type, canModify, updateColor, updateText, trash, onClose }; -} - -export const useFurnitureStickieWidget = useFurnitureStickieWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureTrophyWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureTrophyWidget.ts deleted file mode 100644 index 5808b5f..0000000 --- a/src/hooks/rooms/widgets/furniture/useFurnitureTrophyWidget.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { GetRoomEngine, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { useNitroEvent } from '../../../events'; -import { useFurniRemovedEvent } from '../../engine'; - -const useFurnitureTrophyWidgetState = () => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ category, setCategory ] = useState(-1); - const [ color, setColor ] = useState('1'); - const [ senderName, setSenderName ] = useState(''); - const [ date, setDate ] = useState(''); - const [ message, setMessage ] = useState(''); - - const onClose = () => - { - setObjectId(-1); - setCategory(-1); - setColor('1'); - setSenderName(''); - setDate(''); - setMessage(''); - } - - useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_TROPHY, event => - { - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - - if(!roomObject) return; - - let data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); - let extra = roomObject.model.getValue(RoomObjectVariable.FURNITURE_EXTRAS); - - if(!extra) extra = '0'; - - setObjectId(event.objectId); - setCategory(event.category); - setColor(roomObject.model.getValue(RoomObjectVariable.FURNITURE_COLOR) || '1'); - - const senderName = data.substring(0, data.indexOf('\t')); - - data = data.substring((senderName.length + 1), data.length); - - const trophyDate = data.substring(0, data.indexOf('\t')); - const trophyText = data.substr((trophyDate.length + 1), data.length); - - setSenderName(senderName); - setDate(trophyDate); - setMessage(trophyText); - }); - - useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => - { - if((event.id !== objectId) || (event.category !== category)) return; - - onClose(); - }); - - return { objectId, color, senderName, date, message, onClose }; -} - -export const useFurnitureTrophyWidget = useFurnitureTrophyWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureYoutubeWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureYoutubeWidget.ts deleted file mode 100644 index 64c0f0d..0000000 --- a/src/hooks/rooms/widgets/furniture/useFurnitureYoutubeWidget.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { ControlYoutubeDisplayPlaybackMessageComposer, GetRoomEngine, GetSessionDataManager, GetYoutubeDisplayStatusMessageComposer, RoomEngineTriggerWidgetEvent, RoomId, SecurityLevel, SetYoutubeDisplayPlaylistMessageComposer, YoutubeControlVideoMessageEvent, YoutubeDisplayPlaylist, YoutubeDisplayPlaylistsEvent, YoutubeDisplayVideoMessageEvent } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { IsOwnerOfFurniture, SendMessageComposer, YoutubeVideoPlaybackStateEnum } from '../../../../api'; -import { useMessageEvent, useNitroEvent } from '../../../events'; -import { useFurniRemovedEvent } from '../../engine'; - -const CONTROL_COMMAND_PREVIOUS_VIDEO = 0; -const CONTROL_COMMAND_NEXT_VIDEO = 1; -const CONTROL_COMMAND_PAUSE_VIDEO = 2; -const CONTROL_COMMAND_CONTINUE_VIDEO = 3; - -const useFurnitureYoutubeWidgetState = () => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ category, setCategory ] = useState(-1); - const [ videoId, setVideoId ] = useState(null); - const [ videoStart, setVideoStart ] = useState(null); - const [ videoEnd, setVideoEnd ] = useState(null); - const [ currentVideoState, setCurrentVideoState ] = useState(-1); - const [ selectedVideo, setSelectedVideo ] = useState(null); - const [ playlists, setPlaylists ] = useState(null); - const [ hasControl, setHasControl ] = useState(false); - - const onClose = () => - { - setObjectId(-1); - setCategory(-1); - setVideoId(null); - setVideoStart(null); - setVideoEnd(null); - setCurrentVideoState(-1); - setSelectedVideo(null); - setPlaylists(null); - setHasControl(false); - } - - const previous = () => SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, CONTROL_COMMAND_PREVIOUS_VIDEO)); - - const next = () => SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, CONTROL_COMMAND_NEXT_VIDEO)); - - const pause = () => (hasControl && videoId && videoId.length) && SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, CONTROL_COMMAND_PAUSE_VIDEO)); - - const play = () => (hasControl && videoId && videoId.length) && SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, CONTROL_COMMAND_CONTINUE_VIDEO)); - - const selectVideo = (video: string) => - { - if(selectedVideo === video) - { - setSelectedVideo(null); - SendMessageComposer(new SetYoutubeDisplayPlaylistMessageComposer(objectId, '')); - - return; - } - - setSelectedVideo(video); - SendMessageComposer(new SetYoutubeDisplayPlaylistMessageComposer(objectId, video)); - } - - useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_YOUTUBE, event => - { - if(RoomId.isRoomPreviewerId(event.roomId)) return; - - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - - if(!roomObject) return; - - setObjectId(event.objectId); - setCategory(event.category); - setHasControl(GetSessionDataManager().hasSecurity(SecurityLevel.EMPLOYEE) || IsOwnerOfFurniture(roomObject)); - - SendMessageComposer(new GetYoutubeDisplayStatusMessageComposer(event.objectId)); - }); - - useMessageEvent(YoutubeDisplayVideoMessageEvent, event => - { - const parser = event.getParser(); - - if((objectId === -1) || (objectId !== parser.furniId)) return; - - setVideoId(parser.videoId); - setVideoStart(parser.startAtSeconds); - setVideoEnd(parser.endAtSeconds); - setCurrentVideoState(parser.state); - }); - - useMessageEvent(YoutubeDisplayPlaylistsEvent, event => - { - const parser = event.getParser(); - - if((objectId === -1) || (objectId !== parser.furniId)) return; - - setPlaylists(parser.playlists); - setSelectedVideo(parser.selectedPlaylistId); - setVideoId(null); - setCurrentVideoState(-1); - setVideoEnd(null); - setVideoStart(null); - }); - - useMessageEvent(YoutubeControlVideoMessageEvent, event => - { - const parser = event.getParser(); - - if((objectId === -1) || (objectId !== parser.furniId)) return; - - switch(parser.commandId) - { - case 1: - setCurrentVideoState(YoutubeVideoPlaybackStateEnum.PLAYING); - break; - case 2: - setCurrentVideoState(YoutubeVideoPlaybackStateEnum.PAUSED); - break; - } - }); - - useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => - { - if((event.id !== objectId) || (event.category !== category)) return; - - onClose(); - }); - - return { objectId, videoId, videoStart, videoEnd, currentVideoState, selectedVideo, playlists, onClose, previous, next, pause, play, selectVideo }; -} - -export const useFurnitureYoutubeWidget = useFurnitureYoutubeWidgetState; diff --git a/src/hooks/rooms/widgets/index.ts b/src/hooks/rooms/widgets/index.ts deleted file mode 100644 index 9984450..0000000 --- a/src/hooks/rooms/widgets/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -export * from './furniture'; -export * from './useAvatarInfoWidget'; -export * from './useChatInputWidget'; -export * from './useChatWidget'; -export * from './useDoorbellWidget'; -export * from './useFilterWordsWidget'; -export * from './useFriendRequestWidget'; -export * from './useFurniChooserWidget'; -export * from './usePetPackageWidget'; -export * from './usePollWidget'; -export * from './useUserChooserWidget'; -export * from './useWordQuizWidget'; diff --git a/src/hooks/rooms/widgets/useAvatarInfoWidget.ts b/src/hooks/rooms/widgets/useAvatarInfoWidget.ts deleted file mode 100644 index 9f5e213..0000000 --- a/src/hooks/rooms/widgets/useAvatarInfoWidget.ts +++ /dev/null @@ -1,355 +0,0 @@ -import { GetRoomEngine, GetSessionDataManager, RoomEngineObjectEvent, RoomEngineUseProductEvent, RoomObjectCategory, RoomObjectType, RoomObjectVariable, RoomSessionPetInfoUpdateEvent, RoomSessionPetStatusUpdateEvent, RoomSessionUserDataUpdateEvent } from '@nitrots/nitro-renderer'; -import { useEffect, useState } from 'react'; -import { AvatarInfoFurni, AvatarInfoName, AvatarInfoPet, AvatarInfoRentableBot, AvatarInfoUser, AvatarInfoUtilities, CanManipulateFurniture, FurniCategory, IAvatarInfo, IsOwnerOfFurniture, RoomWidgetUpdateRoomObjectEvent, UseProductItem } from '../../../api'; -import { useNitroEvent, useUiEvent } from '../../events'; -import { useFriends } from '../../friends'; -import { useWired } from '../../wired'; -import { useObjectDeselectedEvent, useObjectRollOutEvent, useObjectRollOverEvent, useObjectSelectedEvent } from '../engine'; -import { useRoom } from '../useRoom'; - -const useAvatarInfoWidgetState = () => -{ - const [ avatarInfo, setAvatarInfo ] = useState(null); - const [ activeNameBubble, setActiveNameBubble ] = useState(null); - const [ nameBubbles, setNameBubbles ] = useState([]); - const [ productBubbles, setProductBubbles ] = useState([]); - const [ confirmingProduct, setConfirmingProduct ] = useState(null); - const [ pendingPetId, setPendingPetId ] = useState(-1); - const [ isDecorating, setIsDecorating ] = useState(false); - const { friends = [] } = useFriends(); - const { selectObjectForWired = null } = useWired(); - const { roomSession = null } = useRoom(); - - const removeNameBubble = (index: number) => - { - setNameBubbles(prevValue => - { - const newValue = [ ...prevValue ]; - - newValue.splice(index, 1); - - return newValue; - }); - } - - const removeProductBubble = (index: number) => - { - setProductBubbles(prevValue => - { - const newValue = [ ...prevValue ]; - const item = newValue.splice(index, 1)[0]; - - if(confirmingProduct === item) setConfirmingProduct(null); - - return newValue; - }); - } - - const updateConfirmingProduct = (product: UseProductItem) => - { - setConfirmingProduct(product); - setProductBubbles([]); - } - - const getObjectName = (objectId: number, category: number) => - { - const name = AvatarInfoUtilities.getObjectName(objectId, category); - - if(!name) return; - - setActiveNameBubble(name); - - if(category !== RoomObjectCategory.UNIT) setProductBubbles([]); - } - - const getObjectInfo = (objectId: number, category: number) => - { - let info: IAvatarInfo = null; - - switch(category) - { - case RoomObjectCategory.FLOOR: - case RoomObjectCategory.WALL: - info = AvatarInfoUtilities.getFurniInfo(objectId, category); - - if(info) selectObjectForWired(objectId, category); - break; - case RoomObjectCategory.UNIT: { - const userData = roomSession.userDataManager.getUserDataByIndex(objectId); - - if(!userData) break; - - switch(userData.type) - { - case RoomObjectType.PET: - roomSession.userDataManager.requestPetInfo(userData.webID); - setPendingPetId(userData.webID); - break; - case RoomObjectType.USER: - info = AvatarInfoUtilities.getUserInfo(category, userData); - break; - case RoomObjectType.BOT: - info = AvatarInfoUtilities.getBotInfo(category, userData); - break; - case RoomObjectType.RENTABLE_BOT: - info = AvatarInfoUtilities.getRentableBotInfo(category, userData); - break; - } - } - - } - - if(!info) return; - - setAvatarInfo(info); - } - - const processUsableRoomObject = (objectId: number) => - { - } - - const refreshPetInfo = () => - { - // roomSession.userDataManager.requestPetInfo(petData.id); - } - - useNitroEvent(RoomSessionUserDataUpdateEvent.USER_DATA_UPDATED, event => - { - if(!event.addedUsers.length) return; - - let addedNameBubbles: AvatarInfoName[] = []; - - event.addedUsers.forEach(user => - { - if(user.webID === GetSessionDataManager().userId || user.type !== RoomObjectType.USER) return; - - if(friends.find(friend => (friend.id === user.webID))) - { - addedNameBubbles.push(new AvatarInfoName(user.roomIndex, RoomObjectCategory.UNIT, user.webID, user.name, user.type, true)); - } - }); - - if(!addedNameBubbles.length) return; - - setNameBubbles(prevValue => - { - const newValue = [ ...prevValue ]; - - addedNameBubbles.forEach(bubble => - { - const oldIndex = newValue.findIndex(oldBubble => (oldBubble.id === bubble.id)); - - if(oldIndex > -1) newValue.splice(oldIndex, 1); - - newValue.push(bubble); - }); - - return newValue; - }); - }); - - useNitroEvent(RoomSessionPetInfoUpdateEvent.PET_INFO, event => - { - const petData = event.petInfo; - - if(!petData) return; - - if(petData.id !== pendingPetId) return; - - const petInfo = AvatarInfoUtilities.getPetInfo(petData); - - if(!petInfo) return; - - setAvatarInfo(petInfo); - setPendingPetId(-1); - }); - - useNitroEvent(RoomSessionPetStatusUpdateEvent.PET_STATUS_UPDATE, event => - { - /* var _local_2:Boolean; - var _local_3:Boolean; - var _local_4:Boolean; - var _local_5:Boolean; - var _local_6:RoomUserData; - var _local_7:_Str_4828; - if (((!(this._container == null)) && (!(this._container.events == null)))) - { - _local_2 = k.canBreed; - _local_3 = k.canHarvest; - _local_4 = k.canRevive; - _local_5 = k.hasBreedingPermission; - _local_6 = this._Str_19958(k.petId); - if (_local_6 == null) - { - Logger.log((("Could not find pet with the id: " + k.petId) + " given by petStatusUpdate")); - return; - } - _local_7 = new _Str_4828(_local_6.roomObjectId, _local_2, _local_3, _local_4, _local_5); - this._container.events.dispatchEvent(_local_7); */ - }); - - useNitroEvent(RoomEngineUseProductEvent.USE_PRODUCT_FROM_INVENTORY, event => - { - // this._Str_23199((k as RoomEngineUseProductEvent).inventoryStripId, (k as RoomEngineUseProductEvent).furnitureTypeId); - }); - - useNitroEvent(RoomEngineUseProductEvent.USE_PRODUCT_FROM_ROOM, event => - { - const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, event.objectId, RoomObjectCategory.FLOOR); - - if(!roomObject || !IsOwnerOfFurniture(roomObject)) return; - - const ownerId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_OWNER_ID); - const typeId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); - const furniData = GetSessionDataManager().getFloorItemData(typeId); - const parts = furniData.customParams.split(' '); - const part = (parts.length ? parseInt(parts[0]) : -1); - - if(part === -1) return; - - const useProductBubbles: UseProductItem[] = []; - const roomObjects = GetRoomEngine().getRoomObjects(roomSession.roomId, RoomObjectCategory.UNIT); - - for(const roomObject of roomObjects) - { - const userData = roomSession.userDataManager.getUserDataByIndex(roomObject.id); - - let replace = false; - - if(!userData || (userData.type !== RoomObjectType.PET)) - { - - } - else - { - if(userData.ownerId === ownerId) - { - if(userData.hasSaddle && (furniData.specialType === FurniCategory.PET_SADDLE)) replace = true; - - const figureParts = userData.figure.split(' '); - const figurePart = (figureParts.length ? parseInt(figureParts[0]) : -1); - - if(figurePart === part) - { - if(furniData.specialType === FurniCategory.MONSTERPLANT_REVIVAL) - { - if(!userData.canRevive) continue; - } - - if(furniData.specialType === FurniCategory.MONSTERPLANT_REBREED) - { - if((userData.petLevel < 7) || userData.canRevive || userData.canBreed) continue; - } - - if(furniData.specialType === FurniCategory.MONSTERPLANT_FERTILIZE) - { - if((userData.petLevel >= 7) || userData.canRevive) continue; - } - - useProductBubbles.push(new UseProductItem(userData.roomIndex, RoomObjectCategory.UNIT, userData.name, event.objectId, roomObject.id, -1, replace)); - } - } - } - } - - setConfirmingProduct(null); - - if(useProductBubbles.length) setProductBubbles(useProductBubbles); - }); - - useNitroEvent(RoomEngineObjectEvent.REQUEST_MANIPULATION, event => - { - if(!CanManipulateFurniture(roomSession, event.objectId, event.category)) return; - - setIsDecorating(true); - }); - - useObjectSelectedEvent(event => - { - getObjectInfo(event.id, event.category); - }); - - useObjectDeselectedEvent(event => - { - setAvatarInfo(null); - setProductBubbles([]); - }); - - useObjectRollOverEvent(event => - { - if(avatarInfo || (event.category !== RoomObjectCategory.UNIT)) return; - - getObjectName(event.id, event.category); - }); - - useObjectRollOutEvent(event => - { - if(!activeNameBubble || (event.category !== RoomObjectCategory.UNIT) || (activeNameBubble.roomIndex !== event.id)) return; - - setActiveNameBubble(null); - }); - - useUiEvent([ - RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED, - RoomWidgetUpdateRoomObjectEvent.USER_REMOVED - ], event => - { - if(activeNameBubble && (activeNameBubble.category === event.category) && (activeNameBubble.roomIndex === event.id)) setActiveNameBubble(null); - - if(event.category === RoomObjectCategory.UNIT) - { - let index = nameBubbles.findIndex(bubble => (bubble.roomIndex === event.id)); - - if(index > -1) setNameBubbles(prevValue => prevValue.filter(bubble => (bubble.roomIndex === event.id))); - - index = productBubbles.findIndex(bubble => (bubble.id === event.id)); - - if(index > -1) setProductBubbles(prevValue => prevValue.filter(bubble => (bubble.id !== event.id))); - } - - else if(event.category === RoomObjectCategory.FLOOR) - { - const index = productBubbles.findIndex(bubble => (bubble.id === event.id)); - - if(index > -1) setProductBubbles(prevValue => prevValue.filter(bubble => (bubble.requestRoomObjectId !== event.id))); - } - - if(avatarInfo) - { - if(avatarInfo instanceof AvatarInfoFurni) - { - if(avatarInfo.id === event.id) setAvatarInfo(null); - } - - else if((avatarInfo instanceof AvatarInfoUser) || (avatarInfo instanceof AvatarInfoRentableBot) || (avatarInfo instanceof AvatarInfoPet)) - { - if(avatarInfo.roomIndex === event.id) setAvatarInfo(null); - } - } - }); - - useEffect(() => - { - if(!avatarInfo) return; - - setActiveNameBubble(null); - setNameBubbles([]); - setProductBubbles([]); - }, [ avatarInfo ]); - - useEffect(() => - { - if(!activeNameBubble) return; - - setNameBubbles([]); - }, [ activeNameBubble ]); - - useEffect(() => - { - roomSession.isDecorating = isDecorating; - }, [ roomSession, isDecorating ]); - - return { avatarInfo, setAvatarInfo, activeNameBubble, setActiveNameBubble, nameBubbles, productBubbles, confirmingProduct, isDecorating, setIsDecorating, removeNameBubble, removeProductBubble, updateConfirmingProduct, getObjectName }; -} - -export const useAvatarInfoWidget = useAvatarInfoWidgetState; diff --git a/src/hooks/rooms/widgets/useChatInputWidget.ts b/src/hooks/rooms/widgets/useChatInputWidget.ts deleted file mode 100644 index db47e02..0000000 --- a/src/hooks/rooms/widgets/useChatInputWidget.ts +++ /dev/null @@ -1,282 +0,0 @@ -import { AvatarExpressionEnum, CreateLinkEvent, GetEventDispatcher, GetRoomEngine, GetSessionDataManager, GetTicker, HabboClubLevelEnum, RoomControllerLevel, RoomEngineObjectEvent, RoomObjectCategory, RoomRotatingEffect, RoomSessionChatEvent, RoomSettingsComposer, RoomShakingEffect, RoomZoomEvent, TextureUtils } from '@nitrots/nitro-renderer'; -import { useEffect, useState } from 'react'; -import { ChatMessageTypeEnum, GetClubMemberLevel, GetConfigurationValue, LocalizeText, SendMessageComposer } from '../../../api'; -import { useNitroEvent } from '../../events'; -import { useNotification } from '../../notification'; -import { useObjectSelectedEvent } from '../engine'; -import { useRoom } from '../useRoom'; - -const useChatInputWidgetState = () => -{ - const [ selectedUsername, setSelectedUsername ] = useState(''); - const [ isTyping, setIsTyping ] = useState(false); - const [ typingStartedSent, setTypingStartedSent ] = useState(false); - const [ isIdle, setIsIdle ] = useState(false); - const [ floodBlocked, setFloodBlocked ] = useState(false); - const [ floodBlockedSeconds, setFloodBlockedSeconds ] = useState(0); - const { showNitroAlert = null, showConfirm = null } = useNotification(); - const { roomSession = null } = useRoom(); - - const sendChat = (text: string, chatType: number, recipientName: string = '', styleId: number = 0) => - { - if(text === '') return null; - - const parts = text.split(' '); - - if(parts.length > 0) - { - const firstPart = parts[0]; - let secondPart = ''; - - if(parts.length > 1) secondPart = parts[1]; - - if((firstPart.charAt(0) === ':') && (secondPart === 'x')) - { - const selectedAvatarId = GetRoomEngine().selectedAvatarId; - - if(selectedAvatarId > -1) - { - const userData = roomSession.userDataManager.getUserDataByIndex(selectedAvatarId); - - if(userData) - { - secondPart = userData.name; - text = text.replace(' x', (' ' + userData.name)); - } - } - } - - switch(firstPart.toLowerCase()) - { - case ':shake': - RoomShakingEffect.init(2500, 5000); - RoomShakingEffect.turnVisualizationOn(); - - return null; - - case ':rotate': - RoomRotatingEffect.init(2500, 5000); - RoomRotatingEffect.turnVisualizationOn(); - - return null; - case ':d': - case ';d': - if(GetClubMemberLevel() === HabboClubLevelEnum.VIP) - { - roomSession.sendExpressionMessage(AvatarExpressionEnum.LAUGH.ordinal); - } - - break; - case 'o/': - case '_o/': - roomSession.sendExpressionMessage(AvatarExpressionEnum.WAVE.ordinal); - - return null; - case ':kiss': - if(GetClubMemberLevel() === HabboClubLevelEnum.VIP) - { - roomSession.sendExpressionMessage(AvatarExpressionEnum.BLOW.ordinal); - - return null; - } - - break; - case ':jump': - if(GetClubMemberLevel() === HabboClubLevelEnum.VIP) - { - roomSession.sendExpressionMessage(AvatarExpressionEnum.JUMP.ordinal); - - return null; - } - - break; - case ':idle': - roomSession.sendExpressionMessage(AvatarExpressionEnum.IDLE.ordinal); - - return null; - case '_b': - roomSession.sendExpressionMessage(AvatarExpressionEnum.RESPECT.ordinal); - - return null; - case ':sign': - roomSession.sendSignMessage(parseInt(secondPart)); - - return null; - case ':iddqd': - case ':flip': - GetEventDispatcher().dispatchEvent(new RoomZoomEvent(roomSession.roomId, -1, true)); - - return null; - case ':zoom': - GetEventDispatcher().dispatchEvent(new RoomZoomEvent(roomSession.roomId, parseFloat(secondPart), false)); - - return null; - case ':screenshot': - const texture = GetRoomEngine().createTextureFromRoom(roomSession.roomId, 1); - - (async () => - { - const image = new Image(); - - image.src = await TextureUtils.generateImageUrl(texture); - - const newWindow = window.open(''); - newWindow.document.write(image.outerHTML); - })(); - return null; - case ':pickall': - if(roomSession.isRoomOwner || GetSessionDataManager().isModerator) - { - showConfirm(LocalizeText('room.confirm.pick_all'), () => - { - GetSessionDataManager().sendSpecialCommandMessage(':pickall'); - }, - null, null, null, LocalizeText('generic.alert.title')); - } - - return null; - case ':ejectall': - if (roomSession.isRoomOwner || GetSessionDataManager().isModerator || roomSession.controllerLevel >= RoomControllerLevel.GUEST) - { - showConfirm(LocalizeText('room.confirm.eject_all'), () => - { - GetSessionDataManager().sendSpecialCommandMessage(':ejectall'); - }, - null, null, null, LocalizeText('generic.alert.title')); - } - return null; - case ':furni': - CreateLinkEvent('furni-chooser/'); - return null; - case ':chooser': - CreateLinkEvent('user-chooser/'); - return null; - case ':floor': - case ':bcfloor': - if(roomSession.controllerLevel >= RoomControllerLevel.ROOM_OWNER) CreateLinkEvent('floor-editor/show'); - - return null; - case ':togglefps': { - if(GetTicker().maxFPS > 0) GetTicker().maxFPS = 0; - else GetTicker().maxFPS = GetConfigurationValue('system.animation.fps'); - - return null; - } - case ':client': - case ':nitro': - case ':billsonnn': - showNitroAlert(); - return null; - case ':settings': - if(roomSession.isRoomOwner || GetSessionDataManager().isModerator) - { - SendMessageComposer(new RoomSettingsComposer(roomSession.roomId)); - } - - return null; - } - } - - switch(chatType) - { - case ChatMessageTypeEnum.CHAT_DEFAULT: - roomSession.sendChatMessage(text, styleId); - break; - case ChatMessageTypeEnum.CHAT_SHOUT: - roomSession.sendShoutMessage(text, styleId); - break; - case ChatMessageTypeEnum.CHAT_WHISPER: - roomSession.sendWhisperMessage(recipientName, text, styleId); - break; - } - } - - useNitroEvent(RoomSessionChatEvent.FLOOD_EVENT, event => - { - setFloodBlocked(true); - setFloodBlockedSeconds(parseFloat(event.message)); - }); - - useObjectSelectedEvent(event => - { - if(event.category !== RoomObjectCategory.UNIT) return; - - const userData = roomSession.userDataManager.getUserDataByIndex(event.id); - - if(!userData) return; - - setSelectedUsername(userData.name); - }); - - useNitroEvent(RoomEngineObjectEvent.DESELECTED, event => setSelectedUsername('')); - - useEffect(() => - { - if(!floodBlocked) return; - - let seconds = 0; - - const interval = setInterval(() => - { - setFloodBlockedSeconds(prevValue => - { - seconds = ((prevValue || 0) - 1); - - return seconds; - }); - - if(seconds < 0) - { - clearInterval(interval); - - setFloodBlocked(false); - } - }, 1000); - - return () => clearInterval(interval); - }, [ floodBlocked ]); - - useEffect(() => - { - if(!isIdle) return; - - let timeout: ReturnType = null; - - if(isIdle) - { - timeout = setTimeout(() => - { - setIsIdle(false); - setIsTyping(false) - }, 10000); - } - - return () => clearTimeout(timeout); - }, [ isIdle ]); - - useEffect(() => - { - if(isTyping) - { - if(!typingStartedSent) - { - setTypingStartedSent(true); - - roomSession.sendChatTypingMessage(isTyping); - } - } - else - { - if(typingStartedSent) - { - setTypingStartedSent(false); - - roomSession.sendChatTypingMessage(isTyping); - } - } - }, [ roomSession, isTyping, typingStartedSent ]); - - return { selectedUsername, floodBlocked, floodBlockedSeconds, setIsTyping, setIsIdle, sendChat }; -} - -export const useChatInputWidget = useChatInputWidgetState; diff --git a/src/hooks/rooms/widgets/useChatWidget.ts b/src/hooks/rooms/widgets/useChatWidget.ts deleted file mode 100644 index a723a51..0000000 --- a/src/hooks/rooms/widgets/useChatWidget.ts +++ /dev/null @@ -1,191 +0,0 @@ -import { GetGuestRoomResultEvent, GetRoomEngine, PetFigureData, RoomChatSettings, RoomChatSettingsEvent, RoomDragEvent, RoomObjectCategory, RoomObjectType, RoomObjectVariable, RoomSessionChatEvent, RoomUserData, SystemChatStyleEnum } from '@nitrots/nitro-renderer'; -import { useEffect, useMemo, useRef, useState } from 'react'; -import { ChatBubbleMessage, ChatBubbleUtilities, ChatEntryType, ChatHistoryCurrentDate, GetConfigurationValue, GetRoomObjectScreenLocation, IRoomChatSettings, LocalizeText, PlaySound, RoomChatFormatter } from '../../../api'; -import { useMessageEvent, useNitroEvent } from '../../events'; -import { useRoom } from '../useRoom'; -import { useChatHistory } from './../../chat-history'; - -const useChatWidgetState = () => -{ - const [ chatMessages, setChatMessages ] = useState([]); - const [ chatSettings, setChatSettings ] = useState({ - mode: RoomChatSettings.CHAT_MODE_FREE_FLOW, - weight: RoomChatSettings.CHAT_BUBBLE_WIDTH_NORMAL, - speed: RoomChatSettings.CHAT_SCROLL_SPEED_NORMAL, - distance: 50, - protection: RoomChatSettings.FLOOD_FILTER_NORMAL - }); - const { roomSession = null } = useRoom(); - const { addChatEntry } = useChatHistory(); - const isDisposed = useRef(false); - - const getScrollSpeed = useMemo(() => - { - if(!chatSettings) return 6000; - - switch(chatSettings.speed) - { - case RoomChatSettings.CHAT_SCROLL_SPEED_FAST: - return 3000; - case RoomChatSettings.CHAT_SCROLL_SPEED_NORMAL: - return 6000; - case RoomChatSettings.CHAT_SCROLL_SPEED_SLOW: - return 12000; - } - }, [ chatSettings ]); - - useNitroEvent(RoomSessionChatEvent.CHAT_EVENT, async event => - { - const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, event.objectId, RoomObjectCategory.UNIT); - const bubbleLocation = roomObject ? GetRoomObjectScreenLocation(roomSession.roomId, roomObject?.id, RoomObjectCategory.UNIT) : { x: 0, y: 0 }; - const userData = roomObject ? roomSession.userDataManager.getUserDataByIndex(event.objectId) : new RoomUserData(-1); - - let username = ''; - let avatarColor = 0; - let imageUrl: string = null; - let chatType = event.chatType; - let styleId = event.style; - let userType = 0; - let petType = -1; - let text = event.message; - - if(userData) - { - userType = userData.type; - - const figure = userData.figure; - - switch(userType) - { - case RoomObjectType.PET: - imageUrl = await ChatBubbleUtilities.getPetImage(figure, 2, true, 64, roomObject.model.getValue(RoomObjectVariable.FIGURE_POSTURE)); - petType = new PetFigureData(figure).typeId; - break; - case RoomObjectType.USER: - imageUrl = await ChatBubbleUtilities.getUserImage(figure); - break; - case RoomObjectType.RENTABLE_BOT: - case RoomObjectType.BOT: - styleId = SystemChatStyleEnum.BOT; - break; - } - - avatarColor = ChatBubbleUtilities.AVATAR_COLOR_CACHE.get(figure); - username = userData.name; - } - - switch(chatType) - { - case RoomSessionChatEvent.CHAT_TYPE_RESPECT: - text = LocalizeText('widgets.chatbubble.respect', [ 'username' ], [ username ]); - - if(GetConfigurationValue('respect.options')['enabled']) PlaySound(GetConfigurationValue('respect.options')['sound']); - - break; - case RoomSessionChatEvent.CHAT_TYPE_PETREVIVE: - case RoomSessionChatEvent.CHAT_TYPE_PET_REBREED_FERTILIZE: - case RoomSessionChatEvent.CHAT_TYPE_PET_SPEED_FERTILIZE: { - let textKey = 'widget.chatbubble.petrevived'; - - if(chatType === RoomSessionChatEvent.CHAT_TYPE_PET_REBREED_FERTILIZE) - { - textKey = 'widget.chatbubble.petrefertilized;'; - } - - else if(chatType === RoomSessionChatEvent.CHAT_TYPE_PET_SPEED_FERTILIZE) - { - textKey = 'widget.chatbubble.petspeedfertilized'; - } - - let targetUserName: string = null; - - const newRoomObject = GetRoomEngine().getRoomObject(roomSession.roomId, event.extraParam, RoomObjectCategory.UNIT); - - if(newRoomObject) - { - const newUserData = roomSession.userDataManager.getUserDataByIndex(roomObject.id); - - if(newUserData) targetUserName = newUserData.name; - } - - text = LocalizeText(textKey, [ 'petName', 'userName' ], [ username, targetUserName ]); - break; - } - case RoomSessionChatEvent.CHAT_TYPE_PETRESPECT: - text = LocalizeText('widget.chatbubble.petrespect', [ 'petname' ], [ username ]); - break; - case RoomSessionChatEvent.CHAT_TYPE_PETTREAT: - text = LocalizeText('widget.chatbubble.pettreat', [ 'petname' ], [ username ]); - break; - case RoomSessionChatEvent.CHAT_TYPE_HAND_ITEM_RECEIVED: - text = LocalizeText('widget.chatbubble.handitem', [ 'username', 'handitem' ], [ username, LocalizeText(('handitem' + event.extraParam)) ]); - break; - case RoomSessionChatEvent.CHAT_TYPE_MUTE_REMAINING: { - const hours = ((event.extraParam > 0) ? Math.floor((event.extraParam / 3600)) : 0).toString(); - const minutes = ((event.extraParam > 0) ? Math.floor((event.extraParam % 3600) / 60) : 0).toString(); - const seconds = (event.extraParam % 60).toString(); - - text = LocalizeText('widget.chatbubble.mutetime', [ 'hours', 'minutes', 'seconds' ], [ hours, minutes, seconds ]); - break; - } - } - - const formattedText = RoomChatFormatter(text); - const color = (avatarColor && (('#' + (avatarColor.toString(16).padStart(6, '0'))) || null)); - - const chatMessage = new ChatBubbleMessage( - userData.roomIndex, - RoomObjectCategory.UNIT, - roomSession.roomId, - text, - formattedText, - username, - { x: bubbleLocation.x, y: bubbleLocation.y }, - chatType, - styleId, - imageUrl, - color); - - setChatMessages(prevValue => [ ...prevValue, chatMessage ]); - addChatEntry({ id: -1, webId: userData.webID, entityId: userData.roomIndex, name: username, imageUrl, style: styleId, chatType: chatType, entityType: userData.type, message: formattedText, timestamp: ChatHistoryCurrentDate(), type: ChatEntryType.TYPE_CHAT, roomId: roomSession.roomId, color }); - }); - - useNitroEvent(RoomDragEvent.ROOM_DRAG, event => - { - if(!chatMessages.length || (event.roomId !== roomSession.roomId)) return; - - const offsetX = event.offsetX; - - chatMessages.forEach(chat => (chat.elementRef && (chat.left += offsetX))); - }); - - useMessageEvent(GetGuestRoomResultEvent, event => - { - const parser = event.getParser(); - - if(!parser.roomEnter) return; - - setChatSettings(parser.chat); - }); - - useMessageEvent(RoomChatSettingsEvent, event => - { - const parser = event.getParser(); - - setChatSettings(parser.chat); - }); - - useEffect(() => - { - isDisposed.current = false; - - return () => - { - isDisposed.current = true; - } - }, []); - - return { chatMessages, setChatMessages, chatSettings, getScrollSpeed }; -} - -export const useChatWidget = useChatWidgetState; diff --git a/src/hooks/rooms/widgets/useDoorbellWidget.ts b/src/hooks/rooms/widgets/useDoorbellWidget.ts deleted file mode 100644 index 7cf5051..0000000 --- a/src/hooks/rooms/widgets/useDoorbellWidget.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { RoomSessionDoorbellEvent } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { GetRoomSession } from '../../../api'; -import { useNitroEvent } from '../../events'; - -const useDoorbellWidgetState = () => -{ - const [ users, setUsers ] = useState([]); - - const addUser = (userName: string) => - { - if(users.indexOf(userName) >= 0) return; - - setUsers([ ...users, userName ]); - } - - const removeUser = (userName: string) => - { - const index = users.indexOf(userName); - - if(index === -1) return; - - const newUsers = [ ...users ]; - - newUsers.splice(index, 1); - - setUsers(newUsers); - } - - const answer = (userName: string, flag: boolean) => - { - GetRoomSession().sendDoorbellApprovalMessage(userName, flag); - - removeUser(userName); - } - - useNitroEvent(RoomSessionDoorbellEvent.DOORBELL, event => addUser(event.userName)); - useNitroEvent(RoomSessionDoorbellEvent.RSDE_REJECTED, event => removeUser(event.userName)); - useNitroEvent(RoomSessionDoorbellEvent.RSDE_ACCEPTED, event => removeUser(event.userName)); - - return { users, addUser, removeUser, answer }; -} - -export const useDoorbellWidget = useDoorbellWidgetState; diff --git a/src/hooks/rooms/widgets/useFilterWordsWidget.ts b/src/hooks/rooms/widgets/useFilterWordsWidget.ts deleted file mode 100644 index 3811682..0000000 --- a/src/hooks/rooms/widgets/useFilterWordsWidget.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { RoomFilterSettingsMessageEvent } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { useMessageEvent } from '../../events'; - -const useFilterWordsWidgetState = () => -{ - const [ wordsFilter, setWordsFilter ] = useState(null); - const [ isVisible, setIsVisible ] = useState(false); - - const onClose = () => setIsVisible(false); - - useMessageEvent(RoomFilterSettingsMessageEvent, event => - { - const parser = event.getParser(); - - setIsVisible(true); - setWordsFilter(parser.words); - }); - - return { wordsFilter, isVisible, setWordsFilter, onClose }; -} - -export const useFilterWordsWidget = useFilterWordsWidgetState; diff --git a/src/hooks/rooms/widgets/useFriendRequestWidget.ts b/src/hooks/rooms/widgets/useFriendRequestWidget.ts deleted file mode 100644 index 82bf6a2..0000000 --- a/src/hooks/rooms/widgets/useFriendRequestWidget.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { RoomObjectCategory, RoomObjectUserType } from '@nitrots/nitro-renderer'; -import { useEffect, useMemo, useState } from 'react'; -import { GetRoomSession, MessengerRequest } from '../../../api'; -import { useFriends } from '../../friends'; -import { useUserAddedEvent, useUserRemovedEvent } from '../engine'; - -const useFriendRequestWidgetState = () => -{ - const [ activeRequests, setActiveRequests ] = useState<{ roomIndex: number, request: MessengerRequest }[]>([]); - const { requests = [], dismissedRequestIds = [], setDismissedRequestIds = null } = useFriends(); - - const displayedRequests = useMemo(() => activeRequests.filter(request => (dismissedRequestIds.indexOf(request.request.requesterUserId) === -1)), [ activeRequests, dismissedRequestIds ]); - - const hideFriendRequest = (userId: number) => - { - setDismissedRequestIds(prevValue => - { - if(prevValue.indexOf(userId) >= 0) return prevValue; - - const newValue = [ ...prevValue ]; - - newValue.push(userId); - - return newValue; - }); - } - - useUserAddedEvent(true, event => - { - if(event.category !== RoomObjectCategory.UNIT) return; - - const userData = GetRoomSession().userDataManager.getUserDataByIndex(event.id); - - if(!userData || (userData.type !== RoomObjectUserType.getTypeNumber(RoomObjectUserType.USER))) return; - - const request = requests.find(request => (request.requesterUserId === userData.webID)); - - if(!request || activeRequests.find(request => (request.request.requesterUserId === userData.webID))) return; - - const newValue = [ ...activeRequests ]; - - newValue.push({ roomIndex: userData.roomIndex, request }); - - setActiveRequests(newValue); - }); - - useUserRemovedEvent(true, event => - { - if(event.category !== RoomObjectCategory.UNIT) return; - - const index = activeRequests.findIndex(request => (request.roomIndex === event.id)); - - if(index === -1) return; - - const newValue = [ ...activeRequests ]; - - newValue.splice(index, 1); - - setActiveRequests(newValue); - }); - - useEffect(() => - { - const newDisplayedRequests: { roomIndex: number, request: MessengerRequest }[] = []; - - for(const request of requests) - { - const userData = GetRoomSession().userDataManager.getUserData(request.requesterUserId); - - if(!userData) continue; - - newDisplayedRequests.push({ roomIndex: userData.roomIndex, request }); - } - - setActiveRequests(newDisplayedRequests); - }, [ requests ]); - - return { displayedRequests, hideFriendRequest }; -} - -export const useFriendRequestWidget = useFriendRequestWidgetState; diff --git a/src/hooks/rooms/widgets/useFurniChooserWidget.ts b/src/hooks/rooms/widgets/useFurniChooserWidget.ts deleted file mode 100644 index 428db2c..0000000 --- a/src/hooks/rooms/widgets/useFurniChooserWidget.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { GetRoomEngine, GetSessionDataManager, RoomObjectCategory, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { GetRoomSession, LocalizeText, RoomObjectItem } from '../../../api'; -import { useFurniAddedEvent, useFurniRemovedEvent } from '../engine'; -import { useRoom } from '../useRoom'; - -const useFurniChooserWidgetState = () => -{ - const [ items, setItems ] = useState(null); - const { roomSession = null } = useRoom(); - - const onClose = () => setItems(null); - - const selectItem = (item: RoomObjectItem) => item && GetRoomEngine().selectRoomObject(GetRoomSession().roomId, item.id, item.category); - - const populateChooser = () => - { - const sessionDataManager = GetSessionDataManager(); - const wallObjects = GetRoomEngine().getRoomObjects(roomSession.roomId, RoomObjectCategory.WALL); - const floorObjects = GetRoomEngine().getRoomObjects(roomSession.roomId, RoomObjectCategory.FLOOR); - - const wallItems = wallObjects.map(roomObject => - { - if(roomObject.id < 0) return null; - - let name = roomObject.type; - - if(name.startsWith('poster')) - { - name = LocalizeText(`poster_${ name.replace('poster', '') }_name`); - } - else - { - const typeId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); - const furniData = sessionDataManager.getWallItemData(typeId); - - if(furniData && furniData.name.length) name = furniData.name; - } - - return new RoomObjectItem(roomObject.id, RoomObjectCategory.WALL, name); - }); - - const floorItems = floorObjects.map(roomObject => - { - if(roomObject.id < 0) return null; - - let name = roomObject.type; - - const typeId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); - const furniData = sessionDataManager.getFloorItemData(typeId); - - if(furniData && furniData.name.length) name = furniData.name; - - return new RoomObjectItem(roomObject.id, RoomObjectCategory.FLOOR, name); - }); - - setItems([ ...wallItems, ...floorItems ].sort((a, b) => ((a.name < b.name) ? -1 : 1))); - } - - useFurniAddedEvent(!!items, event => - { - if(event.id < 0) return; - - const roomObject = GetRoomEngine().getRoomObject(GetRoomSession().roomId, event.id, event.category); - - if(!roomObject) return; - - let item: RoomObjectItem = null; - - switch(event.category) - { - case RoomObjectCategory.WALL: { - let name = roomObject.type; - - if(name.startsWith('poster')) - { - name = LocalizeText(`poster_${ name.replace('poster', '') }_name`); - } - else - { - const typeId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); - const furniData = GetSessionDataManager().getWallItemData(typeId); - - if(furniData && furniData.name.length) name = furniData.name; - } - - item = new RoomObjectItem(roomObject.id, RoomObjectCategory.WALL, name); - - break; - } - case RoomObjectCategory.FLOOR: { - let name = roomObject.type; - - const typeId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); - const furniData = GetSessionDataManager().getFloorItemData(typeId); - - if(furniData && furniData.name.length) name = furniData.name; - - item = new RoomObjectItem(roomObject.id, RoomObjectCategory.FLOOR, name); - } - } - - setItems(prevValue => [ ...prevValue, item ].sort((a, b) => ((a.name < b.name) ? -1 : 1))); - }); - - useFurniRemovedEvent(!!items, event => - { - if(event.id < 0) return; - - setItems(prevValue => - { - const newValue = [ ...prevValue ]; - - for(let i = 0; i < newValue.length; i++) - { - const existingValue = newValue[i]; - - if((existingValue.id !== event.id) || (existingValue.category !== event.category)) continue; - - newValue.splice(i, 1); - - break; - } - - return newValue; - }); - }); - - return { items, onClose, selectItem, populateChooser }; -} - -export const useFurniChooserWidget = useFurniChooserWidgetState; diff --git a/src/hooks/rooms/widgets/usePetPackageWidget.ts b/src/hooks/rooms/widgets/usePetPackageWidget.ts deleted file mode 100644 index 1de3f91..0000000 --- a/src/hooks/rooms/widgets/usePetPackageWidget.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { GetRoomEngine, OpenPetPackageMessageComposer, RoomObjectCategory, RoomSessionPetPackageEvent } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { LocalizeText, SendMessageComposer } from '../../../api'; -import { useNitroEvent } from '../../events'; - -const usePetPackageWidgetState = () => -{ - const [ isVisible, setIsVisible ] = useState(false); - const [ objectId, setObjectId ] = useState(-1); - const [ objectType, setObjectType ] = useState(''); - const [ petName, setPetName ] = useState(''); - const [ errorResult, setErrorResult ] = useState(''); - - const onClose = () => - { - setErrorResult(''); - setPetName(''); - setObjectType(''); - setObjectId(-1); - setIsVisible(false); - } - - const onConfirm = () => - { - SendMessageComposer(new OpenPetPackageMessageComposer(objectId, petName)); - } - - const onChangePetName = (petName: string) => - { - setPetName(petName); - if (errorResult.length > 0) setErrorResult(''); - } - - const getErrorResultForCode = (errorCode: number) => - { - if (!errorCode || errorCode === 0) return; - - switch(errorCode) - { - case 1: - return LocalizeText('catalog.alert.petname.long'); - case 2: - return LocalizeText('catalog.alert.petname.short'); - case 3: - return LocalizeText('catalog.alert.petname.chars'); - case 4: - default: - return LocalizeText('catalog.alert.petname.bobba'); - } - } - - useNitroEvent(RoomSessionPetPackageEvent.RSOPPE_OPEN_PET_PACKAGE_REQUESTED, event => - { - if (!event) return; - - const roomObject = GetRoomEngine().getRoomObject(event.session.roomId, event.objectId, RoomObjectCategory.FLOOR); - - setObjectId(event.objectId); - setObjectType(roomObject.type); - setIsVisible(true); - }); - - useNitroEvent(RoomSessionPetPackageEvent.RSOPPE_OPEN_PET_PACKAGE_RESULT, event => - { - if (!event) return; - - if (event.nameValidationStatus === 0) onClose(); - - if (event.nameValidationStatus !== 0) setErrorResult(getErrorResultForCode(event.nameValidationStatus)); - }); - - return { isVisible, errorResult, petName, objectType, onChangePetName, onConfirm, onClose }; -} - -export const usePetPackageWidget = usePetPackageWidgetState; diff --git a/src/hooks/rooms/widgets/usePollWidget.ts b/src/hooks/rooms/widgets/usePollWidget.ts deleted file mode 100644 index 6132378..0000000 --- a/src/hooks/rooms/widgets/usePollWidget.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { RoomSessionPollEvent } from '@nitrots/nitro-renderer'; -import { DispatchUiEvent, RoomWidgetPollUpdateEvent } from '../../../api'; -import { useNitroEvent } from '../../events'; -import { useRoom } from '../useRoom'; - -const usePollWidgetState = () => -{ - const { roomSession = null } = useRoom(); - - const startPoll = (pollId: number) => roomSession.sendPollStartMessage(pollId); - - const rejectPoll = (pollId: number) => roomSession.sendPollRejectMessage(pollId); - - const answerPoll = (pollId: number, questionId: number, answers: string[]) => roomSession.sendPollAnswerMessage(pollId, questionId, answers); - - useNitroEvent(RoomSessionPollEvent.OFFER, event => - { - const pollEvent = new RoomWidgetPollUpdateEvent(RoomWidgetPollUpdateEvent.OFFER, event.id); - - pollEvent.summary = event.summary; - pollEvent.headline = event.headline; - - DispatchUiEvent(pollEvent); - }); - - useNitroEvent(RoomSessionPollEvent.ERROR, event => - { - const pollEvent = new RoomWidgetPollUpdateEvent(RoomWidgetPollUpdateEvent.ERROR, event.id); - - pollEvent.summary = event.summary; - pollEvent.headline = event.headline; - - DispatchUiEvent(pollEvent); - }); - - useNitroEvent(RoomSessionPollEvent.CONTENT, event => - { - const pollEvent = new RoomWidgetPollUpdateEvent(RoomWidgetPollUpdateEvent.CONTENT, event.id); - - pollEvent.startMessage = event.startMessage; - pollEvent.endMessage = event.endMessage; - pollEvent.numQuestions = event.numQuestions; - pollEvent.questionArray = event.questionArray; - pollEvent.npsPoll = event.npsPoll; - - DispatchUiEvent(pollEvent); - }); - - return { startPoll, rejectPoll, answerPoll }; -} - -export const usePollWidget = usePollWidgetState; diff --git a/src/hooks/rooms/widgets/useUserChooserWidget.ts b/src/hooks/rooms/widgets/useUserChooserWidget.ts deleted file mode 100644 index 40202a3..0000000 --- a/src/hooks/rooms/widgets/useUserChooserWidget.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { GetRoomEngine, RoomObjectCategory } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { GetRoomSession, RoomObjectItem } from '../../../api'; -import { useUserAddedEvent, useUserRemovedEvent } from '../engine'; -import { useRoom } from '../useRoom'; - -const useUserChooserWidgetState = () => -{ - const [ items, setItems ] = useState(null); - const { roomSession = null } = useRoom(); - - const onClose = () => setItems(null); - - const selectItem = (item: RoomObjectItem) => item && GetRoomEngine().selectRoomObject(GetRoomSession().roomId, item.id, item.category); - - const populateChooser = () => - { - const roomSession = GetRoomSession(); - const roomObjects = GetRoomEngine().getRoomObjects(roomSession.roomId, RoomObjectCategory.UNIT); - - setItems(roomObjects - .map(roomObject => - { - if(roomObject.id < 0) return null; - - const userData = roomSession.userDataManager.getUserDataByIndex(roomObject.id); - - if(!userData) return null; - - return new RoomObjectItem(userData.roomIndex, RoomObjectCategory.UNIT, userData.name); - }) - .sort((a, b) => ((a.name < b.name) ? -1 : 1))); - } - - useUserAddedEvent(!!items, event => - { - if(event.id < 0) return; - - const userData = GetRoomSession().userDataManager.getUserDataByIndex(event.id); - - if(!userData) return; - - setItems(prevValue => - { - const newValue = [ ...prevValue ]; - - newValue.push(new RoomObjectItem(userData.roomIndex, RoomObjectCategory.UNIT, userData.name)); - newValue.sort((a, b) => ((a.name < b.name) ? -1 : 1)); - - return newValue; - }); - }); - - useUserRemovedEvent(!!items, event => - { - if(event.id < 0) return; - - setItems(prevValue => - { - const newValue = [ ...prevValue ]; - - for(let i = 0; i < newValue.length; i++) - { - const existingValue = newValue[i]; - - if((existingValue.id !== event.id) || (existingValue.category !== event.category)) continue; - - newValue.splice(i, 1); - - break; - } - - return newValue; - }); - }); - - return { items, onClose, selectItem, populateChooser }; -} - -export const useUserChooserWidget = useUserChooserWidgetState; diff --git a/src/hooks/rooms/widgets/useWordQuizWidget.ts b/src/hooks/rooms/widgets/useWordQuizWidget.ts deleted file mode 100644 index 757f763..0000000 --- a/src/hooks/rooms/widgets/useWordQuizWidget.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { AvatarAction, GetRoomEngine, IQuestion, RoomSessionWordQuizEvent } from '@nitrots/nitro-renderer'; -import { useEffect, useState } from 'react'; -import { VoteValue } from '../../../api'; -import { useNitroEvent } from '../../events'; -import { useRoom } from '../useRoom'; -import { usePollWidget } from './usePollWidget'; - -const DEFAULT_DISPLAY_DELAY = 4000; -const SIGN_FADE_DELAY = 3; - -const useWordQuizWidgetState = () => -{ - const [ pollId, setPollId ] = useState(-1); - const [ question, setQuestion ] = useState(null); - const [ answerSent, setAnswerSent ] = useState(false); - const [ questionClearTimeout, setQuestionClearTimeout ] = useState>(null); - const [ answerCounts, setAnswerCounts ] = useState>(new Map()); - const [ userAnswers, setUserAnswers ] = useState>(new Map()); - const { answerPoll = null } = usePollWidget(); - const { roomSession = null } = useRoom(); - - const clearQuestion = () => - { - setPollId(-1); - setQuestion(null); - } - - const vote = (vote: string) => - { - if(answerSent || !question) return; - - answerPoll(pollId, question.id, [ vote ]); - - setAnswerSent(true); - } - - useNitroEvent(RoomSessionWordQuizEvent.ANSWERED, event => - { - const userData = roomSession.userDataManager.getUserData(event.userId); - - if(!userData) return; - - setAnswerCounts(event.answerCounts); - - setUserAnswers(prevValue => - { - if(!prevValue.has(userData.roomIndex)) - { - const newValue = new Map(userAnswers); - - newValue.set(userData.roomIndex, { value: event.value, secondsLeft: SIGN_FADE_DELAY }); - - return newValue; - } - - return prevValue; - }); - - GetRoomEngine().updateRoomObjectUserGesture(roomSession.roomId, userData.roomIndex, AvatarAction.getGestureId((event.value === '0') ? AvatarAction.GESTURE_SAD : AvatarAction.GESTURE_SMILE)); - }); - - useNitroEvent(RoomSessionWordQuizEvent.FINISHED, event => - { - if(question && (question.id === event.questionId)) - { - setAnswerCounts(event.answerCounts); - setAnswerSent(true); - - setQuestionClearTimeout(prevValue => - { - if(prevValue) clearTimeout(prevValue); - - return setTimeout(() => clearQuestion(), DEFAULT_DISPLAY_DELAY); - }); - } - - setUserAnswers(new Map()); - }); - - useNitroEvent(RoomSessionWordQuizEvent.QUESTION, event => - { - setPollId(event.id); - setQuestion(event.question); - setAnswerSent(false); - setAnswerCounts(new Map()); - setUserAnswers(new Map()); - - setQuestionClearTimeout(prevValue => - { - if(prevValue) clearTimeout(prevValue); - - if(event.duration > 0) - { - const delay = event.duration < 1000 ? DEFAULT_DISPLAY_DELAY : event.duration; - - return setTimeout(() => clearQuestion(), delay); - } - - return null; - }); - }); - - useEffect(() => - { - const checkSignFade = () => - { - setUserAnswers(prevValue => - { - const keysToRemove: number[] = []; - - prevValue.forEach((value, key) => - { - value.secondsLeft--; - - if(value.secondsLeft <= 0) keysToRemove.push(key); - }); - - if(keysToRemove.length === 0) return prevValue; - - const copy = new Map(prevValue); - - keysToRemove.forEach(key => copy.delete(key)); - - return copy; - }); - } - - const interval = setInterval(() => checkSignFade(), 1000); - - return () => clearInterval(interval); - }, []); - - useEffect(() => - { - return () => - { - setQuestionClearTimeout(prevValue => - { - if(prevValue) clearTimeout(prevValue); - - return null; - }); - } - }, []); - - return { question, answerSent, answerCounts, userAnswers, vote }; -} - -export const useWordQuizWidget = useWordQuizWidgetState; diff --git a/src/hooks/session/index.ts b/src/hooks/session/index.ts deleted file mode 100644 index e61c7f3..0000000 --- a/src/hooks/session/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './useSessionInfo'; diff --git a/src/hooks/session/useSessionInfo.ts b/src/hooks/session/useSessionInfo.ts deleted file mode 100644 index 122991d..0000000 --- a/src/hooks/session/useSessionInfo.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { FigureUpdateEvent, GetSessionDataManager, RoomUnitChatStyleComposer, UserInfoDataParser, UserInfoEvent, UserSettingsEvent } from '@nitrots/nitro-renderer'; -import { useState } from 'react'; -import { useBetween } from 'use-between'; -import { SendMessageComposer } from '../../api'; -import { useMessageEvent } from '../events'; - -const useSessionInfoState = () => -{ - const [ userInfo, setUserInfo ] = useState(null); - const [ userFigure, setUserFigure ] = useState(null); - const [ chatStyleId, setChatStyleId ] = useState(0); - const [ userRespectRemaining, setUserRespectRemaining ] = useState(0); - const [ petRespectRemaining, setPetRespectRemaining ] = useState(0); - - const updateChatStyleId = (styleId: number) => - { - setChatStyleId(styleId); - - SendMessageComposer(new RoomUnitChatStyleComposer(styleId)); - } - - const respectUser = (userId: number) => - { - GetSessionDataManager().giveRespect(userId); - - setUserRespectRemaining(GetSessionDataManager().respectsLeft); - } - - const respectPet = (petId: number) => - { - GetSessionDataManager().givePetRespect(petId); - - setPetRespectRemaining(GetSessionDataManager().respectsPetLeft); - } - - useMessageEvent(UserInfoEvent, event => - { - const parser = event.getParser(); - - setUserInfo(parser.userInfo); - setUserFigure(parser.userInfo.figure); - setUserRespectRemaining(parser.userInfo.respectsRemaining); - setPetRespectRemaining(parser.userInfo.respectsPetRemaining); - }); - - useMessageEvent(FigureUpdateEvent, event => - { - const parser = event.getParser(); - - setUserFigure(parser.figure); - }); - - useMessageEvent(UserSettingsEvent, event => - { - const parser = event.getParser(); - - setChatStyleId(parser.chatType); - }); - - return { userInfo, userFigure, chatStyleId, userRespectRemaining, petRespectRemaining, respectUser, respectPet, updateChatStyleId }; -} - -export const useSessionInfo = () => useBetween(useSessionInfoState); diff --git a/src/hooks/useLocalStorage.ts b/src/hooks/useLocalStorage.ts deleted file mode 100644 index 1e55fb9..0000000 --- a/src/hooks/useLocalStorage.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { NitroLogger } from '@nitrots/nitro-renderer'; -import { Dispatch, SetStateAction, useState } from 'react'; -import { GetLocalStorage, SetLocalStorage } from '../api'; - -const useLocalStorageState = (key: string, initialValue: T): [ T, Dispatch>] => -{ - const [ storedValue, setStoredValue ] = useState(() => - { - if(typeof window === 'undefined') return initialValue; - - try - { - const item = GetLocalStorage(key); - - return item ?? initialValue; - } - - catch(error) - { - return initialValue; - } - }); - - const setValue = (value: T) => - { - try - { - const valueToStore = value instanceof Function ? value(storedValue) : value; - - setStoredValue(valueToStore); - - if(typeof window !== 'undefined') SetLocalStorage(key, valueToStore); - } - - catch(error) - { - NitroLogger.error(error); - } - } - - return [ storedValue, setValue ]; -} - -export const useLocalStorage = useLocalStorageState; diff --git a/src/hooks/useSharedVisibility.ts b/src/hooks/useSharedVisibility.ts deleted file mode 100644 index b55855b..0000000 --- a/src/hooks/useSharedVisibility.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { useCallback, useMemo, useState } from 'react'; - -export const useSharedVisibility = () => -{ - const [ activeIds, setActiveIds ] = useState([]); - - const isVisible = useMemo(() => !!activeIds.length, [ activeIds ]); - - const activate = useCallback(() => - { - let id = -1; - - setActiveIds(prevValue => - { - const newValue = [ ...prevValue ]; - - id = newValue.length ? (newValue[(newValue.length - 1)] + 1) : 0; - - newValue.push(id); - - return newValue; - }); - - return id; - }, []); - - const deactivate = useCallback((id: number) => - { - setActiveIds(prevValue => - { - const newValue = [ ...prevValue ]; - - const index = newValue.indexOf(id); - - if(index === -1) return prevValue; - - newValue.splice(index, 1); - - return newValue; - }); - }, []); - - return { isVisible, activate, deactivate }; -} diff --git a/src/hooks/wired/index.ts b/src/hooks/wired/index.ts deleted file mode 100644 index dc79020..0000000 --- a/src/hooks/wired/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './useWired'; diff --git a/src/hooks/wired/useWired.ts b/src/hooks/wired/useWired.ts deleted file mode 100644 index 5a6cb65..0000000 --- a/src/hooks/wired/useWired.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { ConditionDefinition, OpenMessageComposer, Triggerable, TriggerDefinition, UpdateActionMessageComposer, UpdateConditionMessageComposer, UpdateTriggerMessageComposer, WiredActionDefinition, WiredFurniActionEvent, WiredFurniConditionEvent, WiredFurniTriggerEvent, WiredOpenEvent, WiredSaveSuccessEvent } from '@nitrots/nitro-renderer'; -import { useEffect, useState } from 'react'; -import { useBetween } from 'use-between'; -import { IsOwnerOfFloorFurniture, LocalizeText, SendMessageComposer, WiredFurniType, WiredSelectionVisualizer } from '../../api'; -import { useMessageEvent } from '../events'; -import { useNotification } from '../notification'; - -const useWiredState = () => -{ - const [ trigger, setTrigger ] = useState(null); - const [ intParams, setIntParams ] = useState([]); - const [ stringParam, setStringParam ] = useState(''); - const [ furniIds, setFurniIds ] = useState([]); - const [ actionDelay, setActionDelay ] = useState(0); - const [ allowsFurni, setAllowsFurni ] = useState(WiredFurniType.STUFF_SELECTION_OPTION_NONE); - const { showConfirm = null } = useNotification(); - - const saveWired = () => - { - const save = (trigger: Triggerable) => - { - if(!trigger) return; - - if(trigger instanceof WiredActionDefinition) - { - SendMessageComposer(new UpdateActionMessageComposer(trigger.id, intParams, stringParam, furniIds, actionDelay, trigger.stuffTypeSelectionCode)); - } - - else if(trigger instanceof TriggerDefinition) - { - SendMessageComposer(new UpdateTriggerMessageComposer(trigger.id, intParams, stringParam, furniIds, trigger.stuffTypeSelectionCode)); - } - - else if(trigger instanceof ConditionDefinition) - { - SendMessageComposer(new UpdateConditionMessageComposer(trigger.id, intParams, stringParam, furniIds, trigger.stuffTypeSelectionCode)); - } - } - - if(!IsOwnerOfFloorFurniture(trigger.id)) - { - showConfirm(LocalizeText('wiredfurni.nonowner.change.confirm.body'), () => - { - save(trigger) - }, null, null, null, LocalizeText('wiredfurni.nonowner.change.confirm.title')); - } - else - { - save(trigger); - } - } - - const selectObjectForWired = (objectId: number, category: number) => - { - if(!trigger || !allowsFurni) return; - - if(objectId <= 0) return; - - setFurniIds(prevValue => - { - const newFurniIds = [ ...prevValue ]; - - const index = prevValue.indexOf(objectId); - - if(index >= 0) - { - newFurniIds.splice(index, 1); - - WiredSelectionVisualizer.hide(objectId); - } - - else if(newFurniIds.length < trigger.maximumItemSelectionCount) - { - newFurniIds.push(objectId); - - WiredSelectionVisualizer.show(objectId); - } - - return newFurniIds; - }); - } - - useMessageEvent(WiredOpenEvent, event => - { - const parser = event.getParser(); - - SendMessageComposer(new OpenMessageComposer(parser.stuffId)); - }); - - useMessageEvent(WiredSaveSuccessEvent, event => - { - const parser = event.getParser(); - - setTrigger(null); - }); - - useMessageEvent(WiredFurniActionEvent, event => - { - const parser = event.getParser(); - - setTrigger(parser.definition); - }); - - useMessageEvent(WiredFurniConditionEvent, event => - { - const parser = event.getParser(); - - setTrigger(parser.definition); - }); - - useMessageEvent(WiredFurniTriggerEvent, event => - { - const parser = event.getParser(); - - setTrigger(parser.definition); - }); - - useEffect(() => - { - if(!trigger) return; - - return () => - { - setIntParams([]); - setStringParam(''); - setActionDelay(0); - setFurniIds(prevValue => - { - if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); - - return []; - }); - setAllowsFurni(WiredFurniType.STUFF_SELECTION_OPTION_NONE); - } - }, [ trigger ]); - - return { trigger, setTrigger, intParams, setIntParams, stringParam, setStringParam, furniIds, setFurniIds, actionDelay, setActionDelay, setAllowsFurni, saveWired, selectObjectForWired }; -} - -export const useWired = () => useBetween(useWiredState); diff --git a/src/index.scss b/src/index.scss deleted file mode 100644 index 5f3ecbb..0000000 --- a/src/index.scss +++ /dev/null @@ -1,26 +0,0 @@ -@import './assets/styles'; - -html, -body { - padding: 0; - width: 100%; - height: 100%; - overflow: hidden; - user-select: none; - scrollbar-width: thin; - - .image-rendering-pixelated { - image-rendering: pixelated; - image-rendering: -moz-crisp-edges; - } - - * { - -webkit-font-smoothing: antialiased; - } -} - -img { - object-fit: none; -} - -@import './App'; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..92db0e5 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,21 @@ +import { AbstractRenderer, BrowserAdapter, DOMAdapter, HelloSystem, TextureSource } from 'pixi.js'; + +HelloSystem.defaultOptions.hello = true; +AbstractRenderer.defaultOptions.failIfMajorPerformanceCaveat = false; +TextureSource.defaultOptions.scaleMode = (!(window.devicePixelRatio % 1)) ? 'nearest' : 'linear'; +DOMAdapter.set(BrowserAdapter); + +export * from '@nitrots/api'; +export * from '@nitrots/assets'; +export * from '@nitrots/avatar'; +export * from '@nitrots/camera'; +export * from '@nitrots/communication'; +export * from '@nitrots/configuration'; +export * from '@nitrots/events'; +export * from '@nitrots/localization'; +export * from '@nitrots/room'; +export * from '@nitrots/session'; +export * from '@nitrots/sound'; +export * from '@nitrots/utils'; +export * from './DevTools'; +export * from './pixi-proxy'; diff --git a/src/index.tsx b/src/index.tsx deleted file mode 100644 index 196309d..0000000 --- a/src/index.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { createRoot } from 'react-dom/client'; -import { App } from './App'; -import './index.scss'; - -createRoot(document.getElementById('root')).render(); diff --git a/src/pixi-proxy/NitroAdjustmentFilter.ts b/src/pixi-proxy/NitroAdjustmentFilter.ts new file mode 100644 index 0000000..7818fa4 --- /dev/null +++ b/src/pixi-proxy/NitroAdjustmentFilter.ts @@ -0,0 +1,4 @@ +import { AdjustmentFilter } from 'pixi-filters'; + +export class NitroAdjustmentFilter extends AdjustmentFilter +{} diff --git a/src/pixi-proxy/NitroAlphaFilter.ts b/src/pixi-proxy/NitroAlphaFilter.ts new file mode 100644 index 0000000..35eb3aa --- /dev/null +++ b/src/pixi-proxy/NitroAlphaFilter.ts @@ -0,0 +1,4 @@ +import { AlphaFilter } from 'pixi.js'; + +export class NitroAlphaFilter extends AlphaFilter +{} diff --git a/src/pixi-proxy/NitroContainer.ts b/src/pixi-proxy/NitroContainer.ts new file mode 100644 index 0000000..978aed2 --- /dev/null +++ b/src/pixi-proxy/NitroContainer.ts @@ -0,0 +1,4 @@ +import { Container } from 'pixi.js'; + +export class NitroContainer extends Container +{} diff --git a/src/pixi-proxy/NitroFilter.ts b/src/pixi-proxy/NitroFilter.ts new file mode 100644 index 0000000..53928e1 --- /dev/null +++ b/src/pixi-proxy/NitroFilter.ts @@ -0,0 +1,4 @@ +import { Filter } from 'pixi.js'; + +export class NitroFilter extends Filter +{} diff --git a/src/pixi-proxy/NitroRectangle.ts b/src/pixi-proxy/NitroRectangle.ts new file mode 100644 index 0000000..9ced33b --- /dev/null +++ b/src/pixi-proxy/NitroRectangle.ts @@ -0,0 +1,4 @@ +import { Rectangle } from 'pixi.js'; + +export class NitroRectangle extends Rectangle +{} diff --git a/src/pixi-proxy/NitroRenderTexture.ts b/src/pixi-proxy/NitroRenderTexture.ts new file mode 100644 index 0000000..fd6f19f --- /dev/null +++ b/src/pixi-proxy/NitroRenderTexture.ts @@ -0,0 +1,4 @@ +import { RenderTexture } from 'pixi.js'; + +export class NitroRenderTexture extends RenderTexture +{} diff --git a/src/pixi-proxy/NitroSprite.ts b/src/pixi-proxy/NitroSprite.ts new file mode 100644 index 0000000..9a994ec --- /dev/null +++ b/src/pixi-proxy/NitroSprite.ts @@ -0,0 +1,5 @@ +import { Sprite as SpriteBase } from 'pixi.js'; + +export class NitroSprite extends SpriteBase +{ +} diff --git a/src/pixi-proxy/NitroTexture.ts b/src/pixi-proxy/NitroTexture.ts new file mode 100644 index 0000000..dd70aeb --- /dev/null +++ b/src/pixi-proxy/NitroTexture.ts @@ -0,0 +1,4 @@ +import { Texture } from 'pixi.js'; + +export class NitroTexture extends Texture +{} diff --git a/src/pixi-proxy/NitroTicker.ts b/src/pixi-proxy/NitroTicker.ts new file mode 100644 index 0000000..0b35d6c --- /dev/null +++ b/src/pixi-proxy/NitroTicker.ts @@ -0,0 +1,3 @@ +import { Ticker } from 'pixi.js'; + +export type NitroTicker = Ticker; diff --git a/src/pixi-proxy/index.ts b/src/pixi-proxy/index.ts new file mode 100644 index 0000000..1ff5b32 --- /dev/null +++ b/src/pixi-proxy/index.ts @@ -0,0 +1,9 @@ +export * from './NitroAdjustmentFilter'; +export * from './NitroAlphaFilter'; +export * from './NitroContainer'; +export * from './NitroFilter'; +export * from './NitroRectangle'; +export * from './NitroRenderTexture'; +export * from './NitroSprite'; +export * from './NitroTexture'; +export * from './NitroTicker'; diff --git a/src/react-app-env.d.ts b/src/react-app-env.d.ts deleted file mode 100644 index 6431bc5..0000000 --- a/src/react-app-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/src/workers/IntervalWebWorker.ts b/src/workers/IntervalWebWorker.ts deleted file mode 100644 index 978c80a..0000000 --- a/src/workers/IntervalWebWorker.ts +++ /dev/null @@ -1,26 +0,0 @@ -export default () => -{ - let interval: ReturnType = null; - - // eslint-disable-next-line no-restricted-globals - self.onmessage = (message: MessageEvent) => - { - if(!message) return; - - const data: { [index: string]: any } = message.data; - - switch(data.action) - { - case 'START': - interval = setInterval(() => postMessage(null), data.content); - break; - case 'STOP': - if(interval) - { - clearInterval(interval); - interval = null; - } - break; - } - } -} diff --git a/src/workers/WorkerBuilder.ts b/src/workers/WorkerBuilder.ts deleted file mode 100644 index b848893..0000000 --- a/src/workers/WorkerBuilder.ts +++ /dev/null @@ -1,10 +0,0 @@ -export class WorkerBuilder extends Worker -{ - constructor(worker) - { - const code = worker.toString(); - const blob = new Blob([ `(${ code })()` ]); - - super(URL.createObjectURL(blob)); - } -} diff --git a/tsconfig.json b/tsconfig.json index 9912440..eceefbc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,29 +1,31 @@ { + "compileOnSave": false, "compilerOptions": { "baseUrl": "./src", - "target": "es6", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], + "outDir": "./dist", + "sourceMap": false, + "declaration": true, + "experimentalDecorators": true, + "moduleResolution": "Node", + "esModuleInterop": true, + "importHelpers": true, + "isolatedModules": true, + "resolveJsonModule": true, + "downlevelIteration": true, + "allowSyntheticDefaultImports": true, "allowJs": true, "skipLibCheck": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "strict": false, - "downlevelIteration": true, - "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": false, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, "noEmit": true, - "jsx": "react-jsx" + "strict": false, + "strictNullChecks": false, + "target": "ES6", + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "module": "ES6" }, "include": [ - "src", - "node_modules/@nitrots/nitro-renderer/src/**/*.ts", - ] + "src", "packages/utils/src/FurniId.ts", "packages/room/src/messages", "packages/room/src/utils", "packages/room/src/object/logic", "packages/room/src/object/visualization", "packages/room/src/object/RoomObject.ts", "packages/room/src/object/RoomObjectModel.ts", "packages/utils/src/NumberBank.ts", "packages/utils/src/RoomId.ts", "packages/utils/src/ColorConverter.ts", "packages/utils/src/PointMath.ts", "packages/room/src/renderer/cache", "packages/room/src/renderer/RoomSpriteCanvas.ts", "packages/room/src/renderer/RoomRendererFactory.ts", "packages/room/src/renderer/RoomRenderer.ts", "packages/room/src/RoomInstance.ts", "packages/room/src/RoomManager.ts", "packages/room/src/RoomObjectManager.ts", "packages/room/src/RoomPreviewer.ts", "packages/room/src/object/RoomWallData.ts", "packages/room/src/object/RoomPlaneParser.ts", "packages/room/src/object/RoomPlaneMaskData.ts", "packages/room/src/object/RoomPlaneData.ts", "packages/room/src/object/RoomPlaneBitmapMaskParser.ts", "packages/room/src/object/RoomPlaneBitmapMaskData.ts", "packages/room/src/RoomObjectVisualizationFactory.ts", "packages/room/src/object/RoomMapMaskData.ts", "packages/room/src/object/RoomMapData.ts", "packages/room/src/object/RoomFloorHole.ts", "packages/room/src/RoomVariableEnum.ts", "packages/room/src/RoomObjectLogicFactory.ts", "packages/room/src/RoomObjectEventHandler.ts", "packages/room/src/RoomMessageHandler.ts", "packages/room/src/RoomEngine.ts", "packages/room/src/RoomContentLoader.ts", "packages/room/src/PetColorResult.ts", "packages/room/src/ImageResult.ts", "packages/utils/src/Node3D.ts", "packages/utils/src/Matrix4x4.ts", "packages/utils/src/LegacyExternalInterface.ts", "packages/utils/src/HabboWebTools.ts", "packages/utils/src/motion", "packages/avatar/src/actions", "packages/avatar/animation", "packages/avatar/cache", "packages/avatar/src/data", "packages/avatar/geometry", "packages/avatar/src/pets", "packages/avatar/src/structure/animation", "packages/avatar/src/structure/figure", "packages/avatar/src/structure/parts", "packages/avatar/structure/AvatarAnimationData.ts", "packages/avatar/structure/AvatarCanvas.ts", "packages/avatar/structure/FigureSetData.ts", "packages/avatar/structure/index.ts", "packages/avatar/structure/PartSetsData.ts", "packages/avatar/src/cache/AvatarImageCache.ts", "packages/localization/src/LocalizationManager.ts", "packages/localization/src/GetLocalization.ts", "packages/localization/src/BadgeBaseAndLevel.ts" ] } diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..92498d8 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,28 @@ +// vite.config.js +import typescript from '@rollup/plugin-typescript'; +import { resolve } from 'path'; +import { defineConfig } from 'vite'; + +const resolvePath = str => resolve(__dirname, str); + +export default defineConfig({ + plugins: [ + typescript({ + 'target': 'es6', + 'rootDir': resolvePath('./src'), + 'declaration': true, + exclude: resolvePath('./node_modules/**'), + allowSyntheticDefaultImports: true + }) + ], + build: { + lib: { + entry: resolve(__dirname, 'src/index.ts'), + name: 'nitro-renderer', + fileName: 'nitro-renderer' + } + }, + server: { + host: '127.0.0.1' + } +}); diff --git a/vite.config.mjs b/vite.config.mjs deleted file mode 100644 index 7d6d25d..0000000 --- a/vite.config.mjs +++ /dev/null @@ -1,32 +0,0 @@ -// vite.config.js -import react from '@vitejs/plugin-react'; -import { resolve } from 'path'; -import { defineConfig } from 'vite'; - -export default defineConfig({ - plugins: [ react() ], - resolve: { - alias: { - '@': resolve(__dirname, 'src'), - '~': resolve(__dirname, 'node_modules') - } - }, - build: { - assetsInlineLimit: 102400, - chunkSizeWarningLimit: 200000, - rollupOptions: { - output: { - assetFileNames: 'src/assets/[name].[ext]', - manualChunks: id => - { - if(id.includes('node_modules')) - { - if(id.includes('@nitrots/nitro-renderer')) return 'nitro-renderer'; - - return 'vendor'; - } - } - } - } - } -}) diff --git a/yarn.lock b/yarn.lock index c54b602..ce04fcd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,334 +7,120 @@ resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== -"@ampproject/remapping@^2.2.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" +"@esbuild/aix-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" + integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== -"@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" - integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== - dependencies: - "@babel/highlight" "^7.24.2" - picocolors "^1.0.0" +"@esbuild/android-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" + integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== -"@babel/compat-data@^7.23.5": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.1.tgz#31c1f66435f2a9c329bb5716a6d6186c516c3742" - integrity sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA== +"@esbuild/android-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" + integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== -"@babel/core@^7.23.5": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.3.tgz#568864247ea10fbd4eff04dda1e05f9e2ea985c3" - integrity sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.1" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.24.1" - "@babel/parser" "^7.24.1" - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.1" - "@babel/types" "^7.24.0" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" +"@esbuild/android-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" + integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== -"@babel/generator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.1.tgz#e67e06f68568a4ebf194d1c6014235344f0476d0" - integrity sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A== - dependencies: - "@babel/types" "^7.24.0" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" +"@esbuild/darwin-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" + integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== -"@babel/helper-compilation-targets@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" - integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== - dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-validator-option" "^7.23.5" - browserslist "^4.22.2" - lru-cache "^5.1.1" - semver "^6.3.1" +"@esbuild/darwin-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" + integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== +"@esbuild/freebsd-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" + integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" +"@esbuild/freebsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" + integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" +"@esbuild/linux-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" + integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== -"@babel/helper-module-imports@^7.22.15": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" - integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== - dependencies: - "@babel/types" "^7.24.0" +"@esbuild/linux-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" + integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== -"@babel/helper-module-transforms@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" - integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" +"@esbuild/linux-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" + integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== -"@babel/helper-plugin-utils@^7.24.0": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" - integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== +"@esbuild/linux-loong64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" + integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" +"@esbuild/linux-mips64el@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" + integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" +"@esbuild/linux-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" + integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== -"@babel/helper-string-parser@^7.23.4": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" - integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== +"@esbuild/linux-riscv64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" + integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@esbuild/linux-s390x@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" + integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== -"@babel/helper-validator-option@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" - integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== +"@esbuild/linux-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" + integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== -"@babel/helpers@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.1.tgz#183e44714b9eba36c3038e442516587b1e0a1a94" - integrity sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg== - dependencies: - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.1" - "@babel/types" "^7.24.0" +"@esbuild/netbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" + integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== -"@babel/highlight@^7.24.2": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" - integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" +"@esbuild/openbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" + integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== -"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.1.tgz#1e416d3627393fab1cb5b0f2f1796a100ae9133a" - integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg== +"@esbuild/sunos-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" + integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== -"@babel/plugin-transform-react-jsx-self@^7.23.3": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz#a21d866d8167e752c6a7c4555dba8afcdfce6268" - integrity sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" +"@esbuild/win32-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" + integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== -"@babel/plugin-transform-react-jsx-source@^7.23.3": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz#a2dedb12b09532846721b5df99e52ef8dc3351d0" - integrity sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" +"@esbuild/win32-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" + integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== -"@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.7": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57" - integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/template@^7.22.15", "@babel/template@^7.24.0": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" - integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.24.0" - "@babel/types" "^7.24.0" - -"@babel/traverse@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" - integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== - dependencies: - "@babel/code-frame" "^7.24.1" - "@babel/generator" "^7.24.1" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.24.1" - "@babel/types" "^7.24.0" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" - integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== - dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - -"@esbuild/aix-ppc64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" - integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== - -"@esbuild/android-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" - integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== - -"@esbuild/android-arm@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" - integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== - -"@esbuild/android-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" - integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== - -"@esbuild/darwin-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" - integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== - -"@esbuild/darwin-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" - integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== - -"@esbuild/freebsd-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" - integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== - -"@esbuild/freebsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" - integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== - -"@esbuild/linux-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" - integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== - -"@esbuild/linux-arm@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" - integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== - -"@esbuild/linux-ia32@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" - integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== - -"@esbuild/linux-loong64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" - integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== - -"@esbuild/linux-mips64el@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" - integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== - -"@esbuild/linux-ppc64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" - integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== - -"@esbuild/linux-riscv64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" - integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== - -"@esbuild/linux-s390x@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" - integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== - -"@esbuild/linux-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" - integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== - -"@esbuild/netbsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" - integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== - -"@esbuild/openbsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" - integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== - -"@esbuild/sunos-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" - integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== - -"@esbuild/win32-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" - integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== - -"@esbuild/win32-ia32@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" - integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== - -"@esbuild/win32-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" - integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== +"@esbuild/win32-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" + integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" @@ -383,41 +169,9 @@ integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/object-schema@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" + version "2.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -440,243 +194,143 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@popperjs/core@^2.11.6": - version "2.11.8" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" - integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== +"@pixi/colord@^2.9.6": + version "2.9.6" + resolved "https://registry.yarnpkg.com/@pixi/colord/-/colord-2.9.6.tgz#7e4e7851480da6fd3cef4e331f008d60be7e1204" + integrity sha512-nezytU2pw587fQstUu1AsJZDVEynjskwOL+kibwcdxsMBFqPsFFNA7xl0ii/gXuDi6M0xj3mfRJj8pBSc2jCfA== -"@react-aria/ssr@^3.5.0": - version "3.9.2" - resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.2.tgz#01b756965cd6e32b95217f968f513eb3bd6ee44b" - integrity sha512-0gKkgDYdnq1w+ey8KzG9l+H5Z821qh9vVjztk55rUg71vTk/Eaebeir+WtzcLLwTjw3m/asIjx8Y59y1lJZhBw== +"@pixi/gif@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@pixi/gif/-/gif-3.0.0.tgz#dbd3e1bfb2a5d83a84965f5b517cc5dcb8407862" + integrity sha512-0am94k1SEwacW6anOiNT9vt3vnefEaiMxkg30nMwvqU3XkIO6sSsFBgQM3UArjDG/quYsujjyZZkyhl7yBF6GQ== + +"@rollup/plugin-typescript@^11.1.6": + version "11.1.6" + resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz#724237d5ec12609ec01429f619d2a3e7d4d1b22b" + integrity sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA== dependencies: - "@swc/helpers" "^0.5.0" + "@rollup/pluginutils" "^5.1.0" + resolve "^1.22.1" -"@restart/hooks@^0.4.9": - version "0.4.16" - resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.16.tgz#95ae8ac1cc7e2bd4fed5e39800ff85604c6d59fb" - integrity sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w== +"@rollup/pluginutils@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0" + integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== dependencies: - dequal "^2.0.3" + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" -"@restart/ui@^1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.6.8.tgz#61b73503d4690e2f0f58992d4d6ae1e89c276791" - integrity sha512-6ndCv3oZ7r9vuP1Ok9KH55TM1/UkdBnP/fSraW0DFDMbPMzWKhVKeFAIEUCRCSdzayjZDcFYK6xbMlipN9dmMA== - dependencies: - "@babel/runtime" "^7.21.0" - "@popperjs/core" "^2.11.6" - "@react-aria/ssr" "^3.5.0" - "@restart/hooks" "^0.4.9" - "@types/warning" "^3.0.0" - dequal "^2.0.3" - dom-helpers "^5.2.0" - uncontrollable "^8.0.1" - warning "^4.0.3" +"@rollup/rollup-android-arm-eabi@4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.1.tgz#11aaa02a933864b87f0b31cf2b755734e1f22787" + integrity sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ== -"@rollup/rollup-android-arm-eabi@4.13.2": - version "4.13.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.2.tgz#fbf098f49d96a8cac9056f22f5fd80906ef3af85" - integrity sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g== +"@rollup/rollup-android-arm64@4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.1.tgz#b1e606fb4b46b38dc32bf010d513449462d669e9" + integrity sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg== -"@rollup/rollup-android-arm64@4.13.2": - version "4.13.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.2.tgz#0d2448251040fce19a98eee505dff5b3c8ec9b98" - integrity sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ== +"@rollup/rollup-darwin-arm64@4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.1.tgz#dc21df1be9402671a8b6b15a93dd5953c68ec114" + integrity sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg== -"@rollup/rollup-darwin-arm64@4.13.2": - version "4.13.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.2.tgz#78db4d4da5b1b84c22adbe25c8a4961b3f22d3af" - integrity sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA== +"@rollup/rollup-darwin-x64@4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.1.tgz#397dcc4427d774f29b9954676893574ac563bf0b" + integrity sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw== -"@rollup/rollup-darwin-x64@4.13.2": - version "4.13.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.2.tgz#fcc05af54379f8ee5c7e954987d4514c6fd0fb42" - integrity sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A== +"@rollup/rollup-linux-arm-gnueabihf@4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.1.tgz#d851fd49d617e7792e7cde8e5a95ca51ea520fe5" + integrity sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ== -"@rollup/rollup-linux-arm-gnueabihf@4.13.2": - version "4.13.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.2.tgz#2ce200efa1ef4a56ee2af7b453edc74a259d7d31" - integrity sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ== +"@rollup/rollup-linux-arm64-gnu@4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.1.tgz#e41a271ae51f79ffee6fb2b5597cc81b4ef66ad9" + integrity sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ== -"@rollup/rollup-linux-arm64-gnu@4.13.2": - version "4.13.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.2.tgz#5a24aac882bff9abfda3f45f6f1db2166c342a4a" - integrity sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ== +"@rollup/rollup-linux-arm64-musl@4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.1.tgz#d3b4cd6ef18d0aa7103129755e0c535701624fac" + integrity sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ== -"@rollup/rollup-linux-arm64-musl@4.13.2": - version "4.13.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.2.tgz#f1fb4c6f961d3f3397231a99e621d199200e4ea9" - integrity sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA== +"@rollup/rollup-linux-riscv64-gnu@4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.1.tgz#215101b2bb768cce2f2227145b8dd5c3c716c259" + integrity sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg== -"@rollup/rollup-linux-powerpc64le-gnu@4.13.2": - version "4.13.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.13.2.tgz#46b2463d94ac3af3e0f7a2947b695397bc13b755" - integrity sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ== +"@rollup/rollup-linux-x64-gnu@4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.1.tgz#34a12fa305e167105eab70dbf577cd41e5199709" + integrity sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ== -"@rollup/rollup-linux-riscv64-gnu@4.13.2": - version "4.13.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.2.tgz#47b932ee59a5395a3a341b0493e361d9e6032cf2" - integrity sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw== +"@rollup/rollup-linux-x64-musl@4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.1.tgz#3f000b5a92a32b844e385e1166979c87882930a3" + integrity sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ== -"@rollup/rollup-linux-s390x-gnu@4.13.2": - version "4.13.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.2.tgz#8e14a1b3c3b9a4440c70a9c1ba12d32aa21f9712" - integrity sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg== +"@rollup/rollup-win32-arm64-msvc@4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.1.tgz#27977d91f5059645ebb3b7fbf4429982de2278d3" + integrity sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw== -"@rollup/rollup-linux-x64-gnu@4.13.2": - version "4.13.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.2.tgz#270e939194b66df77bcb33dd9a5ddf7784bd7997" - integrity sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A== +"@rollup/rollup-win32-ia32-msvc@4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.1.tgz#0d252acd5af0274209c74374867ee8b949843d75" + integrity sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA== -"@rollup/rollup-linux-x64-musl@4.13.2": - version "4.13.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.2.tgz#e8dd0f3c2046acbda2934490b36552e856a3bc6a" - integrity sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA== +"@rollup/rollup-win32-x64-msvc@4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.1.tgz#cd8d175e001c212d5ac71c7827ef1d5c5e14494c" + integrity sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q== -"@rollup/rollup-win32-arm64-msvc@4.13.2": - version "4.13.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.2.tgz#f8b65a4a7e7a6b383e7b14439129b2f474ff123c" - integrity sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA== +"@types/css-font-loading-module@^0.0.12": + version "0.0.12" + resolved "https://registry.yarnpkg.com/@types/css-font-loading-module/-/css-font-loading-module-0.0.12.tgz#65494833928823f998fbe8e86312821875d80db5" + integrity sha512-x2tZZYkSxXqWvTDgveSynfjq/T2HyiZHXb00j/+gy19yp70PHCizM48XFdjBCWH7eHBD0R5i/pw9yMBP/BH5uA== -"@rollup/rollup-win32-ia32-msvc@4.13.2": - version "4.13.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.2.tgz#bc1c5a4fbc4337d6cb15da80a4de95fd53ab3573" - integrity sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw== +"@types/earcut@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@types/earcut/-/earcut-2.1.4.tgz#5811d7d333048f5a7573b22ddc84923e69596da6" + integrity sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ== -"@rollup/rollup-win32-x64-msvc@4.13.2": - version "4.13.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.2.tgz#851959c4c1c3c6647aba1f388198c8243aed6917" - integrity sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ== - -"@swc/helpers@^0.5.0": - version "0.5.8" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.8.tgz#65d56b1961487fd99795ffd8c68edb7a591571fb" - integrity sha512-lruDGw3pnfM3wmZHeW7JuhkGQaJjPyiKjxeGhdmfoOT53Ic9qb5JLDNaK2HUdl1zLDeX28H221UvKjfdvSLVMg== - dependencies: - tslib "^2.4.0" - -"@tanstack/react-virtual@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.2.0.tgz#fb70f9c6baee753a5a0f7618ac886205d5a02af9" - integrity sha512-OEdMByf2hEfDa6XDbGlZN8qO6bTjlNKqjM3im9JG+u3mCL8jALy0T/67oDI001raUUPh1Bdmfn4ZvPOV5knpcg== - dependencies: - "@tanstack/virtual-core" "3.2.0" - -"@tanstack/virtual-core@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.2.0.tgz#874d36135e4badce2719e7bdc556ce240cbaff14" - integrity sha512-P5XgYoAw/vfW65byBbJQCw+cagdXDT/qH6wmABiLt4v4YBT2q2vqCOhihe+D1Nt325F/S/0Tkv6C5z0Lv+VBQQ== - -"@types/babel__core@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.8" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" - integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" - integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== - dependencies: - "@babel/types" "^7.20.7" - -"@types/estree@1.0.5": +"@types/estree@1.0.5", "@types/estree@^1.0.0": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== +"@types/howler@^2.2.11": + version "2.2.11" + resolved "https://registry.yarnpkg.com/@types/howler/-/howler-2.2.11.tgz#a75c4ab5666aee5fcfbd5de15d35dbaaa3d3f070" + integrity sha512-7aBoUL6RbSIrqKnpEgfa1wSNUBK06mn08siP2QI0zYk7MXfEJAaORc4tohamQYqCqVESoDyRWSdQn2BOKWj2Qw== + "@types/json-schema@^7.0.12": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/node@^20.11.30": - version "20.12.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.2.tgz#9facdd11102f38b21b4ebedd9d7999663343d72e" - integrity sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ== - dependencies: - undici-types "~5.26.4" - -"@types/prop-types@*": - version "15.7.12" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" - integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== - -"@types/react-dom@^18.2.22": - version "18.2.23" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.23.tgz#112338760f622a16d64271b408355f2f27f6302c" - integrity sha512-ZQ71wgGOTmDYpnav2knkjr3qXdAFu0vsk8Ci5w3pGAIdj7/kKAyn+VsQDhXsmzzzepAiI9leWMmubXz690AI/A== - dependencies: - "@types/react" "*" - -"@types/react-slider@^1.3.6": - version "1.3.6" - resolved "https://registry.yarnpkg.com/@types/react-slider/-/react-slider-1.3.6.tgz#6f5602be93ab1cb3d273428c87aa227ad2ff68ff" - integrity sha512-RS8XN5O159YQ6tu3tGZIQz1/9StMLTg/FCIPxwqh2gwVixJnlfIodtVx+fpXVMZHe7A58lAX1Q4XTgAGOQaCQg== - dependencies: - "@types/react" "*" - -"@types/react-transition-group@^4.4.6": - version "4.4.10" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.10.tgz#6ee71127bdab1f18f11ad8fb3322c6da27c327ac" - integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q== - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@>=16.9.11", "@types/react@^18.2.67": - version "18.2.73" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.73.tgz#0579548ad122660d99e00499d22e33b81e73ed94" - integrity sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA== - dependencies: - "@types/prop-types" "*" - csstype "^3.0.2" +"@types/pako@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/pako/-/pako-2.0.3.tgz#b6993334f3af27c158f3fe0dfeeba987c578afb1" + integrity sha512-bq0hMV9opAcrmE0Byyo0fY3Ew4tgOevJmQ9grUhpXQhYfyLJ1Kqg3P33JT5fdbT2AjeAjR51zqqVjAL/HMkx7Q== "@types/semver@^7.5.0": version "7.5.8" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== -"@types/warning@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.3.tgz#d1884c8cc4a426d1ac117ca2611bf333834c6798" - integrity sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q== - -"@typescript-eslint/eslint-plugin@^7.3.1": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.5.0.tgz#1dc52fe48454d5b54be2d5f089680452f1628a5a" - integrity sha512-HpqNTH8Du34nLxbKgVMGljZMG0rJd2O9ecvr2QLYp+7512ty1j42KnsFwspPXg1Vh8an9YImf6CokUBltisZFQ== +"@typescript-eslint/eslint-plugin@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.1.tgz#dd71fc5c7ecec745ca26ece506d84d203a205c0e" + integrity sha512-zioDz623d0RHNhvx0eesUmGfIjzrk18nSBC8xewepKXbBvN/7c1qImV7Hg8TI1URTxKax7/zxfxj3Uph8Chcuw== dependencies: "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "7.5.0" - "@typescript-eslint/type-utils" "7.5.0" - "@typescript-eslint/utils" "7.5.0" - "@typescript-eslint/visitor-keys" "7.5.0" + "@typescript-eslint/scope-manager" "7.1.1" + "@typescript-eslint/type-utils" "7.1.1" + "@typescript-eslint/utils" "7.1.1" + "@typescript-eslint/visitor-keys" "7.1.1" debug "^4.3.4" graphemer "^1.4.0" ignore "^5.2.4" @@ -684,47 +338,47 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/parser@^7.3.1": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.5.0.tgz#1eeff36309ac2253c905dd4a88b4b71b72a358ed" - integrity sha512-cj+XGhNujfD2/wzR1tabNsidnYRaFfEkcULdcIyVBYcXjBvBKOes+mpMBP7hMpOyk+gBcfXsrg4NBGAStQyxjQ== +"@typescript-eslint/parser@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.1.1.tgz#6a9d0a5c9ccdf5dbd3cb8c949728c64e24e07d1f" + integrity sha512-ZWUFyL0z04R1nAEgr9e79YtV5LbafdOtN7yapNbn1ansMyaegl2D4bL7vHoJ4HPSc4CaLwuCVas8CVuneKzplQ== dependencies: - "@typescript-eslint/scope-manager" "7.5.0" - "@typescript-eslint/types" "7.5.0" - "@typescript-eslint/typescript-estree" "7.5.0" - "@typescript-eslint/visitor-keys" "7.5.0" + "@typescript-eslint/scope-manager" "7.1.1" + "@typescript-eslint/types" "7.1.1" + "@typescript-eslint/typescript-estree" "7.1.1" + "@typescript-eslint/visitor-keys" "7.1.1" debug "^4.3.4" -"@typescript-eslint/scope-manager@7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.5.0.tgz#70f0a7361430ab1043a5f97386da2a0d8b2f4d56" - integrity sha512-Z1r7uJY0MDeUlql9XJ6kRVgk/sP11sr3HKXn268HZyqL7i4cEfrdFuSSY/0tUqT37l5zT0tJOsuDP16kio85iA== +"@typescript-eslint/scope-manager@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.1.1.tgz#9e301803ff8e21a74f50c6f89a4baccad9a48f93" + integrity sha512-cirZpA8bJMRb4WZ+rO6+mnOJrGFDd38WoXCEI57+CYBqta8Yc8aJym2i7vyqLL1vVYljgw0X27axkUXz32T8TA== dependencies: - "@typescript-eslint/types" "7.5.0" - "@typescript-eslint/visitor-keys" "7.5.0" + "@typescript-eslint/types" "7.1.1" + "@typescript-eslint/visitor-keys" "7.1.1" -"@typescript-eslint/type-utils@7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.5.0.tgz#a8faa403232da3a3901655387c7082111f692cf9" - integrity sha512-A021Rj33+G8mx2Dqh0nMO9GyjjIBK3MqgVgZ2qlKf6CJy51wY/lkkFqq3TqqnH34XyAHUkq27IjlUkWlQRpLHw== +"@typescript-eslint/type-utils@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.1.1.tgz#aee820d5bedd39b83c18585a526cc520ddb7a226" + integrity sha512-5r4RKze6XHEEhlZnJtR3GYeCh1IueUHdbrukV2KSlLXaTjuSfeVF8mZUVPLovidCuZfbVjfhi4c0DNSa/Rdg5g== dependencies: - "@typescript-eslint/typescript-estree" "7.5.0" - "@typescript-eslint/utils" "7.5.0" + "@typescript-eslint/typescript-estree" "7.1.1" + "@typescript-eslint/utils" "7.1.1" debug "^4.3.4" ts-api-utils "^1.0.1" -"@typescript-eslint/types@7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.5.0.tgz#0a284bcdef3cb850ec9fd57992df9f29d6bde1bc" - integrity sha512-tv5B4IHeAdhR7uS4+bf8Ov3k793VEVHd45viRRkehIUZxm0WF82VPiLgHzA/Xl4TGPg1ZD49vfxBKFPecD5/mg== +"@typescript-eslint/types@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.1.1.tgz#ca33ba7cf58224fb46a84fea62593c2c53cd795f" + integrity sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q== -"@typescript-eslint/typescript-estree@7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.5.0.tgz#aa5031c511874420f6b5edd90f8e4021525ee776" - integrity sha512-YklQQfe0Rv2PZEueLTUffiQGKQneiIEKKnfIqPIOxgM9lKSZFCjT5Ad4VqRKj/U4+kQE3fa8YQpskViL7WjdPQ== +"@typescript-eslint/typescript-estree@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.1.tgz#09c54af0151a1b05d0875c0fc7fe2ec7a2476ece" + integrity sha512-9ZOncVSfr+sMXVxxca2OJOPagRwT0u/UHikM2Rd6L/aB+kL/QAuTnsv6MeXtjzCJYb8PzrXarypSGIPx3Jemxw== dependencies: - "@typescript-eslint/types" "7.5.0" - "@typescript-eslint/visitor-keys" "7.5.0" + "@typescript-eslint/types" "7.1.1" + "@typescript-eslint/visitor-keys" "7.1.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -732,25 +386,25 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/utils@7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.5.0.tgz#bbd963647fbbe9ffea033f42c0fb7e89bb19c858" - integrity sha512-3vZl9u0R+/FLQcpy2EHyRGNqAS/ofJ3Ji8aebilfJe+fobK8+LbIFmrHciLVDxjDoONmufDcnVSF38KwMEOjzw== +"@typescript-eslint/utils@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.1.1.tgz#bdeeb789eee4af5d3fb5400a69566d4dbf97ff3b" + integrity sha512-thOXM89xA03xAE0lW7alstvnyoBUbBX38YtY+zAUcpRPcq9EIhXPuJ0YTv948MbzmKh6e1AUszn5cBFK49Umqg== dependencies: "@eslint-community/eslint-utils" "^4.4.0" "@types/json-schema" "^7.0.12" "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "7.5.0" - "@typescript-eslint/types" "7.5.0" - "@typescript-eslint/typescript-estree" "7.5.0" + "@typescript-eslint/scope-manager" "7.1.1" + "@typescript-eslint/types" "7.1.1" + "@typescript-eslint/typescript-estree" "7.1.1" semver "^7.5.4" -"@typescript-eslint/visitor-keys@7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.5.0.tgz#8abcac66f93ef20b093e87a400c2d21e3a6d55ee" - integrity sha512-mcuHM/QircmA6O7fy6nn2w/3ditQkj+SgtOc8DW3uQ10Yfj42amm2i+6F2K4YAOPNNTmE6iM1ynM6lrSwdendA== +"@typescript-eslint/visitor-keys@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.1.tgz#e6538a58c9b157f03bcbb29e3b6a92fe39a6ab0d" + integrity sha512-yTdHDQxY7cSoCcAtiBzVzxleJhkGB9NncSIyMYe2+OGON1ZsP9zOPws/Pqgopa65jvknOjlk/w7ulPlZ78PiLQ== dependencies: - "@typescript-eslint/types" "7.5.0" + "@typescript-eslint/types" "7.1.1" eslint-visitor-keys "^3.4.1" "@ungap/structured-clone@^1.2.0": @@ -758,16 +412,15 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -"@vitejs/plugin-react@^4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz#744d8e4fcb120fc3dbaa471dadd3483f5a304bb9" - integrity sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ== - dependencies: - "@babel/core" "^7.23.5" - "@babel/plugin-transform-react-jsx-self" "^7.23.3" - "@babel/plugin-transform-react-jsx-source" "^7.23.3" - "@types/babel__core" "^7.20.5" - react-refresh "^0.14.0" +"@webgpu/types@^0.1.40": + version "0.1.40" + resolved "https://registry.yarnpkg.com/@webgpu/types/-/types-0.1.40.tgz#cf72d1df6f9f8adc5d39556041f20ff2e8a58885" + integrity sha512-/BBkHLS6/eQjyWhY2H7Dx5DHcVrS2ICj9owvSRdgtQT6KcafLZA86tPze0xAOsd4FbsYKCUBUQyNi87q7gV7kw== + +"@xmldom/xmldom@^0.8.10": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== acorn-jsx@^5.3.2: version "5.3.2" @@ -794,13 +447,6 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -808,164 +454,21 @@ ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== - dependencies: - dequal "^2.0.3" - -array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" - -array-includes@^3.1.6, array-includes@^3.1.7: - version "3.1.8" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" - integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - is-string "^1.0.7" - array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.findlast@^1.2.4: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" - integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.findlastindex@^1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" - integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.toreversed@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" - integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.tosorted@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" - integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.1.0" - es-shim-unscopables "^1.0.2" - -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" - is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" - -ast-types-flow@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" - integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axe-core@=4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" - integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== - -axobject-query@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" - integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== - dependencies: - dequal "^2.0.3" - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -981,53 +484,18 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: +braces@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -browserslist@^4.22.2: - version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== - dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" - -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -caniuse-lite@^1.0.30001587: - version "1.0.30001603" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001603.tgz#605046a5bdc95ba4a92496d67e062522dce43381" - integrity sha512-iL2iSS0eDILMb9n5yKQoTBim9jMZ0Yrk8g0N9K7UzYyWnfIKzXBZD5ngpM37ZcL/cv0Mli8XtVMRYMQAfFpi5Q== - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -1036,33 +504,6 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -"chokidar@>=3.0.0 <4.0.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -classnames@^2.3.2: - version "2.5.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" - integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -1070,11 +511,6 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" @@ -1085,11 +521,6 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -1099,58 +530,7 @@ cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" -csstype@^3.0.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -damerau-levenshtein@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" - integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== - -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -debug@^2.6.6: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -1162,29 +542,6 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -dequal@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -1192,13 +549,6 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -1206,274 +556,45 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" - integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== - dependencies: - "@babel/runtime" "^7.8.7" - csstype "^3.0.2" +earcut@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.4.tgz#6d02fd4d68160c114825d06890a92ecaae60343a" + integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ== -electron-to-chromium@^1.4.668: - version "1.4.723" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.723.tgz#827da30c96b316684d352c3d81430029df01bb8e" - integrity sha512-rxFVtrMGMFROr4qqU6n95rUi9IlfIm+lIAt+hOToy/9r6CDv0XiEcQdC3VP71y1pE5CFTzKV0RvxOGYCPWWHPw== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: - version "1.0.18" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d" - integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-errors "^1.3.0" - es-set-tostringtag "^2.0.3" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - globalthis "^1.0.3" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - internal-slot "^1.0.7" - iterator.prototype "^1.1.2" - safe-array-concat "^1.1.2" - -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== - dependencies: - get-intrinsic "^1.2.4" - has-tostringtag "^1.0.2" - hasown "^2.0.1" - -es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -esbuild@^0.20.1: - version "0.20.2" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" - integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== +esbuild@^0.19.3: + version "0.19.12" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" + integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== optionalDependencies: - "@esbuild/aix-ppc64" "0.20.2" - "@esbuild/android-arm" "0.20.2" - "@esbuild/android-arm64" "0.20.2" - "@esbuild/android-x64" "0.20.2" - "@esbuild/darwin-arm64" "0.20.2" - "@esbuild/darwin-x64" "0.20.2" - "@esbuild/freebsd-arm64" "0.20.2" - "@esbuild/freebsd-x64" "0.20.2" - "@esbuild/linux-arm" "0.20.2" - "@esbuild/linux-arm64" "0.20.2" - "@esbuild/linux-ia32" "0.20.2" - "@esbuild/linux-loong64" "0.20.2" - "@esbuild/linux-mips64el" "0.20.2" - "@esbuild/linux-ppc64" "0.20.2" - "@esbuild/linux-riscv64" "0.20.2" - "@esbuild/linux-s390x" "0.20.2" - "@esbuild/linux-x64" "0.20.2" - "@esbuild/netbsd-x64" "0.20.2" - "@esbuild/openbsd-x64" "0.20.2" - "@esbuild/sunos-x64" "0.20.2" - "@esbuild/win32-arm64" "0.20.2" - "@esbuild/win32-ia32" "0.20.2" - "@esbuild/win32-x64" "0.20.2" - -escalade@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + "@esbuild/aix-ppc64" "0.19.12" + "@esbuild/android-arm" "0.19.12" + "@esbuild/android-arm64" "0.19.12" + "@esbuild/android-x64" "0.19.12" + "@esbuild/darwin-arm64" "0.19.12" + "@esbuild/darwin-x64" "0.19.12" + "@esbuild/freebsd-arm64" "0.19.12" + "@esbuild/freebsd-x64" "0.19.12" + "@esbuild/linux-arm" "0.19.12" + "@esbuild/linux-arm64" "0.19.12" + "@esbuild/linux-ia32" "0.19.12" + "@esbuild/linux-loong64" "0.19.12" + "@esbuild/linux-mips64el" "0.19.12" + "@esbuild/linux-ppc64" "0.19.12" + "@esbuild/linux-riscv64" "0.19.12" + "@esbuild/linux-s390x" "0.19.12" + "@esbuild/linux-x64" "0.19.12" + "@esbuild/netbsd-x64" "0.19.12" + "@esbuild/openbsd-x64" "0.19.12" + "@esbuild/sunos-x64" "0.19.12" + "@esbuild/win32-arm64" "0.19.12" + "@esbuild/win32-ia32" "0.19.12" + "@esbuild/win32-x64" "0.19.12" escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@^2.29.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" - semver "^6.3.1" - tsconfig-paths "^3.15.0" - -eslint-plugin-jsx-a11y@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" - integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== - dependencies: - "@babel/runtime" "^7.23.2" - aria-query "^5.3.0" - array-includes "^3.1.7" - array.prototype.flatmap "^1.3.2" - ast-types-flow "^0.0.8" - axe-core "=4.7.0" - axobject-query "^3.2.1" - damerau-levenshtein "^1.0.8" - emoji-regex "^9.2.2" - es-iterator-helpers "^1.0.15" - hasown "^2.0.0" - jsx-ast-utils "^3.3.5" - language-tags "^1.0.9" - minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" - -eslint-plugin-react-hooks@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== - -eslint-plugin-react@^7.34.1: - version "7.34.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" - integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlast "^1.2.4" - array.prototype.flatmap "^1.3.2" - array.prototype.toreversed "^1.1.2" - array.prototype.tosorted "^1.1.3" - doctrine "^2.1.0" - es-iterator-helpers "^1.0.17" - estraverse "^5.3.0" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" - object.hasown "^1.1.3" - object.values "^1.1.7" - prop-types "^15.8.1" - resolve "^2.0.0-next.5" - semver "^6.3.1" - string.prototype.matchall "^4.0.10" - eslint-scope@^7.2.2: version "7.2.2" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" @@ -1554,17 +675,27 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: +estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -fast-deep-equal@3.1.3, fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -1633,13 +764,6 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1655,47 +779,7 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== - dependencies: - call-bind "^1.0.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -1721,11 +805,6 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - globals@^13.19.0: version "13.24.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" @@ -1733,13 +812,6 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -1752,74 +824,33 @@ globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - graphemer@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: +hasown@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" +howler@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/howler/-/howler-2.2.4.tgz#bd3df4a4f68a0118a51e4bd84a2bfc2e93e6e5a1" + integrity sha512-iARIBPgcQrwtEr+tALF+rapJ8qSc+Set2GJQl7xT1MQzWaVkFebdJhR3alVlSiUf5U7nAANKuj3aWpwerocD5w== + ignore@^5.2.0, ignore@^5.2.4: version "5.3.1" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== -immutable@^4.0.0: - version "4.3.5" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.5.tgz#f8b436e66d59f99760dc577f5c99a4fd2a5cc5a0" - integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw== - import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -1846,128 +877,25 @@ inherits@2: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - -is-async-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" - integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== - dependencies: - has-tostringtag "^1.0.0" - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.13.0, is-core-module@^2.13.1: +is-core-module@^2.13.0: version "2.13.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: hasown "^2.0.0" -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== - dependencies: - is-typed-array "^1.1.13" - -is-date-object@^1.0.1, is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-finalizationregistry@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" - integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== - dependencies: - call-bind "^1.0.2" - -is-generator-function@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-map@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" - integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== - -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -1978,92 +906,15 @@ is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-set@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" - integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== - -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== - dependencies: - call-bind "^1.0.7" - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== - dependencies: - which-typed-array "^1.1.14" - -is-weakmap@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" - integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-weakset@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" - integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== - dependencies: - define-properties "^1.2.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - reflect.getprototypeof "^1.0.4" - set-function-name "^2.0.1" - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +ismobilejs@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ismobilejs/-/ismobilejs-1.1.1.tgz#c56ca0ae8e52b24ca0f22ba5ef3215a2ddbbaa0e" + integrity sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw== js-yaml@^4.1.0: version "4.1.0" @@ -2072,11 +923,6 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -2092,28 +938,6 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: - version "3.3.5" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" - integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - object.assign "^4.1.4" - object.values "^1.1.6" - keyv@^4.5.3: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -2121,18 +945,6 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" -language-subtag-registry@^0.3.20: - version "0.3.22" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" - integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== - -language-tags@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" - integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== - dependencies: - language-subtag-registry "^0.3.20" - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -2141,11 +953,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -load-script@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/load-script/-/load-script-1.0.0.tgz#0491939e0bee5643ee494a7e3da3d2bac70c6ca4" - integrity sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA== - locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -2158,20 +965,6 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -2206,26 +999,11 @@ minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - nanoid@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" @@ -2236,87 +1014,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4, object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.entries@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" - integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -object.fromentries@^2.0.7: - version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.groupby@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.hasown@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" - integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== - dependencies: - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.values@^1.1.6, object.values@^1.1.7: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" - integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -2350,6 +1047,11 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +pako@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -2357,6 +1059,11 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-svg-path@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/parse-svg-path/-/parse-svg-path-0.1.2.tgz#7a7ec0d1eb06fa5325c7d3e009b859a09b5d49eb" + integrity sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ== + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -2387,56 +1094,45 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: +picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== +pixi-filters@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/pixi-filters/-/pixi-filters-6.0.0.tgz#36f480f87b8f66b259db40acb7a6b134e570c473" + integrity sha512-9wJn4bfQKak+lefyk9BSCenhMBvGQi2t4Uz+BVqw6WK8wM2NgqeTC64mhXRtrdYeCG9gIFX0Lc6q1S8rBqwJbg== -postcss@^8.4.38: - version "8.4.38" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== +pixi.js@^8.0.4, pixi.js@~8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/pixi.js/-/pixi.js-8.0.4.tgz#77449a82354d29fb39c78c3ca23602bf6082e136" + integrity sha512-UAa3WU5FV4kjwjYosbG3pi1QvTBKSLPH7BOLkw5X4g12+Xxew3YwMiM+V1EQL4/65hDn5Z3jhFC3xVAsHFJcsQ== + dependencies: + "@pixi/colord" "^2.9.6" + "@types/css-font-loading-module" "^0.0.12" + "@types/earcut" "^2.1.4" + "@webgpu/types" "^0.1.40" + "@xmldom/xmldom" "^0.8.10" + earcut "^2.2.4" + eventemitter3 "^5.0.1" + ismobilejs "^1.1.1" + parse-svg-path "^0.1.2" + +postcss@^8.4.35: + version "8.4.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.35.tgz#60997775689ce09011edf083a549cea44aabe2f7" + integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA== dependencies: nanoid "^3.3.7" picocolors "^1.0.0" - source-map-js "^1.2.0" + source-map-js "^1.0.2" prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prop-types-extra@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b" - integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew== - dependencies: - react-is "^16.3.2" - warning "^4.0.0" - -prop-types@15.7.2: - version "15.7.2" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" - integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.8.1" - -prop-types@^15.6.2, prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -2447,126 +1143,12 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -react-bootstrap@^2.2.2: - version "2.10.2" - resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.10.2.tgz#3b609eb0170e31b3d9ace297d3a016c202a42642" - integrity sha512-UvB7mRqQjivdZNxJNEA2yOQRB7L9N43nBnKc33K47+cH90/ujmnMwatTCwQLu83gLhrzAl8fsa6Lqig/KLghaA== - dependencies: - "@babel/runtime" "^7.22.5" - "@restart/hooks" "^0.4.9" - "@restart/ui" "^1.6.8" - "@types/react-transition-group" "^4.4.6" - classnames "^2.3.2" - dom-helpers "^5.2.1" - invariant "^2.2.4" - prop-types "^15.8.1" - prop-types-extra "^1.1.0" - react-transition-group "^4.4.5" - uncontrollable "^7.2.1" - warning "^4.0.3" - -react-dom@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.0" - -react-icons@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-5.0.1.tgz#1694e11bfa2a2888cab47dcc30154ce90485feee" - integrity sha512-WqLZJ4bLzlhmsvme6iFdgO8gfZP17rfjYEJ2m9RsZjZ+cc4k1hTzknEz63YS1MeT50kVzoa1Nz36f4BEx+Wigw== - -react-is@^16.13.1, react-is@^16.3.2, react-is@^16.8.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== - -react-refresh@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" - integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== - -react-slider@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/react-slider/-/react-slider-2.0.6.tgz#8c7ff0301211f7c3ff32aa0163b33bdab6258559" - integrity sha512-gJxG1HwmuMTJ+oWIRCmVWvgwotNCbByTwRkFZC6U4MBsHqJBmxwbYRJUmxy4Tke1ef8r9jfXjgkmY/uHOCEvbA== - dependencies: - prop-types "^15.8.1" - -react-transition-group@^4.4.5: - version "4.4.5" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" - integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== - dependencies: - "@babel/runtime" "^7.5.5" - dom-helpers "^5.0.1" - loose-envify "^1.4.0" - prop-types "^15.6.2" - -react-youtube@^7.13.1: - version "7.14.0" - resolved "https://registry.yarnpkg.com/react-youtube/-/react-youtube-7.14.0.tgz#0505d86491521ca94ef0afb74af3f7936dc7bc86" - integrity sha512-SUHZ4F4pd1EHmQu0CV0KSQvAs5KHOT5cfYaq4WLCcDbU8fBo1ouTXaAOIASWbrz8fHwg+G1evfoSIYpV2AwSAg== - dependencies: - fast-deep-equal "3.1.3" - prop-types "15.7.2" - youtube-player "5.5.2" - -react@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== - dependencies: - loose-envify "^1.1.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -reflect.getprototypeof@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" - integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.1" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - globalthis "^1.0.3" - which-builtin-type "^1.1.3" - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== - dependencies: - call-bind "^1.0.6" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.1" - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.22.4: +resolve@^1.22.1: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -2575,15 +1157,6 @@ resolve@^1.22.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.5: - version "2.0.0-next.5" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" - integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -2596,28 +1169,26 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -rollup@^4.13.0: - version "4.13.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.13.2.tgz#ac57d2dc48e8f5562f5a6daadb9caee590069262" - integrity sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g== +rollup@^4.2.0: + version "4.12.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.12.1.tgz#0659cb02551cde4c5b210e9bd3af050b5b5b415d" + integrity sha512-ggqQKvx/PsB0FaWXhIvVkSWh7a/PCLQAsMjBc+nA2M8Rv2/HG0X6zvixAB7KyZBRtifBUhy5k8voQX/mRnABPg== dependencies: "@types/estree" "1.0.5" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.13.2" - "@rollup/rollup-android-arm64" "4.13.2" - "@rollup/rollup-darwin-arm64" "4.13.2" - "@rollup/rollup-darwin-x64" "4.13.2" - "@rollup/rollup-linux-arm-gnueabihf" "4.13.2" - "@rollup/rollup-linux-arm64-gnu" "4.13.2" - "@rollup/rollup-linux-arm64-musl" "4.13.2" - "@rollup/rollup-linux-powerpc64le-gnu" "4.13.2" - "@rollup/rollup-linux-riscv64-gnu" "4.13.2" - "@rollup/rollup-linux-s390x-gnu" "4.13.2" - "@rollup/rollup-linux-x64-gnu" "4.13.2" - "@rollup/rollup-linux-x64-musl" "4.13.2" - "@rollup/rollup-win32-arm64-msvc" "4.13.2" - "@rollup/rollup-win32-ia32-msvc" "4.13.2" - "@rollup/rollup-win32-x64-msvc" "4.13.2" + "@rollup/rollup-android-arm-eabi" "4.12.1" + "@rollup/rollup-android-arm64" "4.12.1" + "@rollup/rollup-darwin-arm64" "4.12.1" + "@rollup/rollup-darwin-x64" "4.12.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.12.1" + "@rollup/rollup-linux-arm64-gnu" "4.12.1" + "@rollup/rollup-linux-arm64-musl" "4.12.1" + "@rollup/rollup-linux-riscv64-gnu" "4.12.1" + "@rollup/rollup-linux-x64-gnu" "4.12.1" + "@rollup/rollup-linux-x64-musl" "4.12.1" + "@rollup/rollup-win32-arm64-msvc" "4.12.1" + "@rollup/rollup-win32-ia32-msvc" "4.12.1" + "@rollup/rollup-win32-x64-msvc" "4.12.1" fsevents "~2.3.2" run-parallel@^1.1.9: @@ -2627,46 +1198,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-regex "^1.1.4" - -sass@^1.72.0: - version "1.72.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.72.0.tgz#5b9978943fcfb32b25a6a5acb102fc9dabbbf41c" - integrity sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA== - dependencies: - chokidar ">=3.0.0 <4.0.0" - immutable "^4.0.0" - source-map-js ">=0.6.2 <2.0.0" - -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== - dependencies: - loose-envify "^1.1.0" - -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - semver@^7.5.4: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" @@ -2674,28 +1205,6 @@ semver@^7.5.4: dependencies: lru-cache "^6.0.0" -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.1, set-function-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -2708,76 +1217,15 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel@^1.0.4, side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -sister@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/sister/-/sister-3.0.2.tgz#bb3e39f07b1f75bbe1945f29a27ff1e5a2f26be4" - integrity sha512-p19rtTs+NksBRKW9qn0UhZ8/TUI9BPw9lmtHny+Y3TinWlOa9jWh9xB0AtPSdmOy49NJJJSSe0Ey4C7h0TrcYA== - slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== - -string.prototype.matchall@^4.0.10: - version "4.0.11" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" - integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.7" - regexp.prototype.flags "^1.5.2" - set-function-name "^2.0.2" - side-channel "^1.0.6" - -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-object-atoms "^1.0.0" - -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== strip-ansi@^6.0.1: version "6.0.1" @@ -2786,23 +1234,11 @@ strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -2820,11 +1256,6 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -2837,17 +1268,7 @@ ts-api-utils@^1.0.1: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^2.4.0: +tslib@^2.3.1: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -2864,92 +1285,10 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-typed-array "^1.1.13" - -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - -typescript@^5.4.2: - version "5.4.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" - integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -uncontrollable@^7.2.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738" - integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ== - dependencies: - "@babel/runtime" "^7.6.3" - "@types/react" ">=16.9.11" - invariant "^2.2.4" - react-lifecycles-compat "^3.0.4" - -uncontrollable@^8.0.1: - version "8.0.4" - resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-8.0.4.tgz#a0a8307f638795162fafd0550f4a1efa0f8c5eb6" - integrity sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ== - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" +typescript@~5.4.2: + version "5.4.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.2.tgz#0ae9cebcfae970718474fe0da2c090cad6577372" + integrity sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ== uri-js@^4.2.2: version "4.4.1" @@ -2958,79 +1297,17 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -use-between@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/use-between/-/use-between-1.3.5.tgz#8f9db513414d204e0046c5692828e209cec4d564" - integrity sha512-IP9eJfszZr0aah/6i/pzaM7n/QgMPwWKJ+mnWqT5O0qFhLnztPbkVC6L7zI6ygeBIMJHfmUGvsw0b28pyrEGSA== - -vite@^5.1.6: - version "5.2.7" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.7.tgz#e1b8a985eb54fcb9467d7f7f009d87485016df6e" - integrity sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA== +vite@^5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.1.5.tgz#bdbc2b15e8000d9cc5172f059201178f9c9de5fb" + integrity sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q== dependencies: - esbuild "^0.20.1" - postcss "^8.4.38" - rollup "^4.13.0" + esbuild "^0.19.3" + postcss "^8.4.35" + rollup "^4.2.0" optionalDependencies: fsevents "~2.3.3" -warning@^4.0.0, warning@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" - integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== - dependencies: - loose-envify "^1.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-builtin-type@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" - integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== - dependencies: - function.prototype.name "^1.1.5" - has-tostringtag "^1.0.0" - is-async-function "^2.0.0" - is-date-object "^1.0.5" - is-finalizationregistry "^1.0.2" - is-generator-function "^1.0.10" - is-regex "^1.1.4" - is-weakref "^1.0.2" - isarray "^2.0.5" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" - -which-collection@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" - integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== - dependencies: - is-map "^2.0.3" - is-set "^2.0.3" - is-weakmap "^2.0.2" - is-weakset "^2.0.3" - -which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" - which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -3043,11 +1320,6 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" @@ -3057,12 +1329,3 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -youtube-player@5.5.2: - version "5.5.2" - resolved "https://registry.yarnpkg.com/youtube-player/-/youtube-player-5.5.2.tgz#052b86b1eabe21ff331095ffffeae285fa7f7cb5" - integrity sha512-ZGtsemSpXnDky2AUYWgxjaopgB+shFHgXVpiJFeNB5nWEugpW1KWYDaHKuLqh2b67r24GtP6HoSW5swvf0fFIQ== - dependencies: - debug "^2.6.6" - load-script "^1.0.0" - sister "^3.0.0"