diff --git a/.gitignore b/.gitignore index 7bb75f6..7bbb6a0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,24 +1,24 @@ -*.class -*.jar -*.war -*.ear -/bin -/lib -*.db -.svn -.svn -.project -/nbproject/private/ -/dist/ -/build/ -/testDBs -/.settings -/doc -*.dll -*.exe -*.so -COMMIT_EDITMSG -.DS_Store -/target -/build/output +*.class +*.jar +*.war +*.ear +/bin +/lib +*.db +.svn +.svn +.project +/nbproject/private/ +/dist/ +/build/ +/testDBs +/.settings +/doc +*.dll +*.exe +*.so +COMMIT_EDITMSG +.DS_Store +/target +/build/output /data/worlds \ No newline at end of file diff --git a/.project b/.project index b62a758..736836c 100644 --- a/.project +++ b/.project @@ -1,33 +1,33 @@ - - - MossTest - - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.stateofflow.eclipse.metrics.MetricsBuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.m2e.core.maven2Nature - fr.obeo.dsl.viewpoint.nature.modelingproject - org.eclipse.jdt.core.javanature - com.stateofflow.eclipse.metrics.MetricsNature - - - - - + + + MossTest + + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.stateofflow.eclipse.metrics.MetricsBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + fr.obeo.dsl.viewpoint.nature.modelingproject + org.eclipse.jdt.core.javanature + com.stateofflow.eclipse.metrics.MetricsNature + + + + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index dea3f4c..32eba80 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,22 +1,22 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.codeComplete.argumentPrefixes= -org.eclipse.jdt.core.codeComplete.argumentSuffixes= -org.eclipse.jdt.core.codeComplete.fieldPrefixes= -org.eclipse.jdt.core.codeComplete.fieldSuffixes= -org.eclipse.jdt.core.codeComplete.localPrefixes= -org.eclipse.jdt.core.codeComplete.localSuffixes= -org.eclipse.jdt.core.codeComplete.staticFieldPrefixes= -org.eclipse.jdt.core.codeComplete.staticFieldSuffixes= -org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes= -org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes= -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.7 +eclipse.preferences.version=1 +org.eclipse.jdt.core.codeComplete.argumentPrefixes= +org.eclipse.jdt.core.codeComplete.argumentSuffixes= +org.eclipse.jdt.core.codeComplete.fieldPrefixes= +org.eclipse.jdt.core.codeComplete.fieldSuffixes= +org.eclipse.jdt.core.codeComplete.localPrefixes= +org.eclipse.jdt.core.codeComplete.localSuffixes= +org.eclipse.jdt.core.codeComplete.staticFieldPrefixes= +org.eclipse.jdt.core.codeComplete.staticFieldSuffixes= +org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes= +org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes= +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs index ecaf918..b4c59dd 100644 --- a/.settings/org.eclipse.jdt.ui.prefs +++ b/.settings/org.eclipse.jdt.ui.prefs @@ -1,6 +1,6 @@ -cleanup_settings_version=2 -eclipse.preferences.version=1 -org.eclipse.jdt.ui.exception.name=e -org.eclipse.jdt.ui.gettersetter.use.is=true -org.eclipse.jdt.ui.keywordthis=false -org.eclipse.jdt.ui.overrideannotation=true +cleanup_settings_version=2 +eclipse.preferences.version=1 +org.eclipse.jdt.ui.exception.name=e +org.eclipse.jdt.ui.gettersetter.use.is=true +org.eclipse.jdt.ui.keywordthis=false +org.eclipse.jdt.ui.overrideannotation=true diff --git a/COPYING b/COPYING index 20d40b6..3d90694 100644 --- a/COPYING +++ b/COPYING @@ -1,674 +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 + 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 . \ No newline at end of file diff --git a/README.md b/README.md index 4fdd9ac..63ffe00 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -mosstest -======== - -Open-source Minetest clone. Refer to wiki for details. - -Pull requesters: -Don't touch the thread pool or the scripting interface. -Electrocution, drowning, or security bots attacking you may occur. - -pom.xml refers to non-maven jars in a custom jMonkey reporitory. Please hold as our server will have that repository available for download soon. +mosstest +======== + +Open-source Minetest clone. Refer to wiki for details. + +Pull requesters: +Don't touch the thread pool or the scripting interface. +Electrocution, drowning, or security bots attacking you may occur. + +pom.xml refers to non-maven jars in a custom jMonkey reporitory. Please hold as our server will have that repository available for download soon. diff --git a/ant/javadoc.xml b/ant/javadoc.xml index d426125..1e31218 100644 --- a/ant/javadoc.xml +++ b/ant/javadoc.xml @@ -1,8 +1,8 @@ - - - - - - - - + + + + + + + + diff --git a/assignments.txt b/assignments.txt index 681710b..1fd7c97 100644 --- a/assignments.txt +++ b/assignments.txt @@ -1,18 +1,18 @@ -Assignments: - -===ACh=== -Renderer -Formspecs -Inventory - -===MR=== -JS scipts - -===AA=== -Script API -Event Processor Thread Pool -Node cache -File cache -Mapgen -DB -Mapchunk handling +Assignments: + +===ACh=== +Renderer +Formspecs +Inventory + +===MR=== +JS scipts + +===AA=== +Script API +Event Processor Thread Pool +Node cache +File cache +Mapgen +DB +Mapchunk handling diff --git a/build.xml b/build.xml index 5e202c7..f37f891 100644 --- a/build.xml +++ b/build.xml @@ -1,143 +1,143 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/global.conf b/global.conf index 6e72ca8..cfffba5 100644 --- a/global.conf +++ b/global.conf @@ -1,58 +1,58 @@ -#Mosstest default settings. Categories are [server] and [client]. Names not case-sensitive. -[server-global] - -#Sets server name -serverId=New Mosstest Server -#Sets server failover cluster. Blank for no failover. NOT IMPLEMENTED YET. -failoverCluster= -#Sets in-cluster identifier. 0 for no cluster support. NOT IMPLEMENTED YET. -replicationId - - #port number - port=16511 - #UDP support. Set to 0 to disable UDP. - udpport=16511 - #Maximum number of players - maxplayers=256 - #Maximum number of half-open connections - maxhalfopen=16 - #Max upstream bandwidth - maxupxmit=16K - #maximum downstream bandwidth - maxdownstream=64K - - #Enable rollback - rollback=false - #Enable smartban - smartban=true - - #Performance settings - #Maximum chunks loaded. Remember that a chunk is roughly 16KiB. The setting 16394 equates to just under 300MB of RAM. - maxLoadedChunks=16384 - #Maximum number of events queued for processing. Beyond this events will be dropped. - eventQueueCapacity=40 - - #number of event processor threads at start - initialEventThreads=8 - #maximum number of event threads - maxEventThreads=8 - #How often the event system is checked for load, in milliseconds. - eventQueueTuneSampleInterval=100 - #How many event queue checks are in one round - eventQueueTuneSamples=100 - #for how many samples the queue must be busy for a new thread to start - eventQueueTuneUpshift=90 - #How many idle samples are needed before a thread is shut down - eventQueueTuneDownshift=10 - - #Central authentication server, for user trust. Connection to this server is NOT needed for gameplay, and this field may be blank. - authserver=auth.mosstest.net - - #Easter eggs - enableEasterEggs=true - - #How hard the server insists ITS textures are used over the client's. - texPackInsistence=0 - - +#Mosstest default settings. Categories are [server] and [client]. Names not case-sensitive. +[server-global] + +#Sets server name +serverId=New Mosstest Server +#Sets server failover cluster. Blank for no failover. NOT IMPLEMENTED YET. +failoverCluster= +#Sets in-cluster identifier. 0 for no cluster support. NOT IMPLEMENTED YET. +replicationId + + #port number + port=16511 + #UDP support. Set to 0 to disable UDP. + udpport=16511 + #Maximum number of players + maxplayers=256 + #Maximum number of half-open connections + maxhalfopen=16 + #Max upstream bandwidth + maxupxmit=16K + #maximum downstream bandwidth + maxdownstream=64K + + #Enable rollback + rollback=false + #Enable smartban + smartban=true + + #Performance settings + #Maximum chunks loaded. Remember that a chunk is roughly 16KiB. The setting 16394 equates to just under 300MB of RAM. + maxLoadedChunks=16384 + #Maximum number of events queued for processing. Beyond this events will be dropped. + eventQueueCapacity=40 + + #number of event processor threads at start + initialEventThreads=8 + #maximum number of event threads + maxEventThreads=8 + #How often the event system is checked for load, in milliseconds. + eventQueueTuneSampleInterval=100 + #How many event queue checks are in one round + eventQueueTuneSamples=100 + #for how many samples the queue must be busy for a new thread to start + eventQueueTuneUpshift=90 + #How many idle samples are needed before a thread is shut down + eventQueueTuneDownshift=10 + + #Central authentication server, for user trust. Connection to this server is NOT needed for gameplay, and this field may be blank. + authserver=auth.mosstest.net + + #Easter eggs + enableEasterEggs=true + + #How hard the server insists ITS textures are used over the client's. + texPackInsistence=0 + + \ No newline at end of file diff --git a/lib/.gitignore b/lib/.gitignore index 43e58b9..037b046 100644 --- a/lib/.gitignore +++ b/lib/.gitignore @@ -1 +1 @@ -/com +/com diff --git a/manifest.mf b/manifest.mf index 328e8e5..1574df4 100644 --- a/manifest.mf +++ b/manifest.mf @@ -1,3 +1,3 @@ -Manifest-Version: 1.0 -X-COMMENT: Main-Class will be added automatically by build - +Manifest-Version: 1.0 +X-COMMENT: Main-Class will be added automatically by build + diff --git a/nbproject/build-impl.xml b/nbproject/build-impl.xml index 3e88383..0badc8f 100644 --- a/nbproject/build-impl.xml +++ b/nbproject/build-impl.xml @@ -1,1381 +1,1381 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set src.dir - Must set build.dir - Must set dist.dir - Must set build.classes.dir - Must set dist.javadoc.dir - Must set build.test.classes.dir - Must set build.test.results.dir - Must set build.classes.excludes - Must set dist.jar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - No tests executed. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set JVM to use for profiling in profiler.info.jvm - Must set profiler agent JVM arguments in profiler.info.jvmargs.agent - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - - - - - - java -cp "${run.classpath.with.dist.jar}" ${main.class} - - - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - java -jar "${dist.jar.resolved}" - - - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set run.class - - - - Must select one file in the IDE or set run.class - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set debug.class - - - - - Must select one file in the IDE or set debug.class - - - - - Must set fix.includes - - - - - - - - - - This target only works when run from inside the NetBeans IDE. - - - - - - - - - Must select one file in the IDE or set profile.class - This target only works when run from inside the NetBeans IDE. - - - - - - - - - This target only works when run from inside the NetBeans IDE. - - - - - - - - - - - - - This target only works when run from inside the NetBeans IDE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set run.class - - - - - - Must select some files in the IDE or set test.includes - - - - - Must select one file in the IDE or set run.class - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - Some tests failed; see details above. - - - - - - - - - Must select some files in the IDE or set test.includes - - - - Some tests failed; see details above. - - - - Must select some files in the IDE or set test.class - Must select some method in the IDE or set test.method - - - - Some tests failed; see details above. - - - - - Must select one file in the IDE or set test.class - - - - Must select one file in the IDE or set test.class - Must select some method in the IDE or set test.method - - - - - - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set src.dir + Must set build.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set JVM to use for profiling in profiler.info.jvm + Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + + + + + + java -cp "${run.classpath.with.dist.jar}" ${main.class} + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + java -jar "${dist.jar.resolved}" + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + Must select one file in the IDE or set profile.class + This target only works when run from inside the NetBeans IDE. + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + Must select some files in the IDE or set test.includes + + + + + Must select one file in the IDE or set run.class + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + + + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nbproject/configs/MapDatabase.properties b/nbproject/configs/MapDatabase.properties index 634bbb0..c541371 100644 --- a/nbproject/configs/MapDatabase.properties +++ b/nbproject/configs/MapDatabase.properties @@ -1 +1 @@ -main.class=org.nodetest.servercore.EventProcessor +main.class=org.nodetest.servercore.EventProcessor diff --git a/nbproject/configs/ScriptEnv.properties b/nbproject/configs/ScriptEnv.properties index 729f06e..ea66e7a 100644 --- a/nbproject/configs/ScriptEnv.properties +++ b/nbproject/configs/ScriptEnv.properties @@ -1 +1 @@ -main.class=org.nodetest.common.ScriptEnv +main.class=org.nodetest.common.ScriptEnv diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties index d188cbb..b7e4237 100644 --- a/nbproject/genfiles.properties +++ b/nbproject/genfiles.properties @@ -1,8 +1,8 @@ -build.xml.data.CRC32=23062b59 -build.xml.script.CRC32=9ea92df2 -build.xml.stylesheet.CRC32=28e38971@1.53.1.46 -# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. -# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. -nbproject/build-impl.xml.data.CRC32=23062b59 -nbproject/build-impl.xml.script.CRC32=3b7463a5 -nbproject/build-impl.xml.stylesheet.CRC32=6ddba6b6@1.53.1.46 +build.xml.data.CRC32=23062b59 +build.xml.script.CRC32=9ea92df2 +build.xml.stylesheet.CRC32=28e38971@1.53.1.46 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=23062b59 +nbproject/build-impl.xml.script.CRC32=3b7463a5 +nbproject/build-impl.xml.stylesheet.CRC32=6ddba6b6@1.53.1.46 diff --git a/nbproject/project.properties b/nbproject/project.properties index 410b232..848cc4c 100644 --- a/nbproject/project.properties +++ b/nbproject/project.properties @@ -1,83 +1,83 @@ -annotation.processing.enabled=true -annotation.processing.enabled.in.editor=false -annotation.processing.processor.options= -annotation.processing.processors.list= -annotation.processing.run.all.processors=true -annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output -auxiliary.org-netbeans-modules-projectimport-eclipse-core.key=src=src;file=lib/commons-cli-1.2.jar;file=lib/js-14.jar;file=lib/commons-cli-1.2-sources.jar;file=lib/db4o-8.0.249.16098-all-java5.jar;output=bin; -auxiliary.org-netbeans-modules-projectimport-eclipse-core.project=. -auxiliary.org-netbeans-modules-projectimport-eclipse-core.timestamp=1370875172897 -auxiliary.org-netbeans-modules-projectimport-eclipse-core.workspace=C:\\Users\\Alexander\\workspace -build.classes.dir=${build.dir}/classes -build.classes.excludes=**/*.java,**/*.form -# This directory is removed when the project is cleaned: -build.dir=build -build.generated.dir=${build.dir}/generated -build.generated.sources.dir=${build.dir}/generated-sources -# Only compile against the classpath explicitly listed here: -build.sysclasspath=ignore -build.test.classes.dir=${build.dir}/test/classes -build.test.results.dir=${build.dir}/test/results -# Uncomment to specify the preferred debugger connection transport: -#debug.transport=dt_socket -debug.classpath=\ - ${run.classpath} -debug.test.classpath=\ - ${run.test.classpath} -# This directory is removed when the project is cleaned: -dist.dir=dist -dist.jar=${dist.dir}/MossTest.jar -dist.javadoc.dir=${dist.dir}/javadoc -excludes= -file.reference.commons-cli-1.2-sources.jar=lib/commons-cli-1.2-sources.jar -file.reference.commons-cli-1.2.jar=lib/commons-cli-1.2.jar -file.reference.db4o-8.0.249.16098-all-java5.jar=lib/db4o-8.0.249.16098-all-java5.jar -file.reference.js-14.jar=lib/js-14.jar -file.reference.mosstest-src=src -includes=** -jar.compress=false -javac.classpath=\ - ${file.reference.commons-cli-1.2.jar}:\ - ${file.reference.js-14.jar}:\ - ${file.reference.commons-cli-1.2-sources.jar}:\ - ${file.reference.db4o-8.0.249.16098-all-java5.jar} -# Space-separated list of extra javac options -javac.compilerargs= -javac.deprecation=false -javac.processorpath=\ - ${javac.classpath} -javac.source=1.7 -javac.target=1.7 -javac.test.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir} -javac.test.processorpath=\ - ${javac.test.classpath} -javadoc.additionalparam= -javadoc.author=false -javadoc.encoding=${source.encoding} -javadoc.noindex=false -javadoc.nonavbar=false -javadoc.notree=false -javadoc.private=false -javadoc.splitindex=true -javadoc.use=true -javadoc.version=false -javadoc.windowtitle= -manifest.file=manifest.mf -meta.inf.dir=${src.dir}/META-INF -mkdist.disabled=true -platform.active=default_platform -run.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir} -# Space-separated list of JVM arguments used when running the project. -# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. -# To set system properties for unit tests define test-sys-prop.name=value: -run.jvmargs= -run.test.classpath=\ - ${javac.test.classpath}:\ - ${build.test.classes.dir} -source.encoding=UTF-8 -source.reference.commons-cli-1.2.jar=lib/commons-cli-1.2-sources.jar -src.dir=${file.reference.mosstest-src} +annotation.processing.enabled=true +annotation.processing.enabled.in.editor=false +annotation.processing.processor.options= +annotation.processing.processors.list= +annotation.processing.run.all.processors=true +annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output +auxiliary.org-netbeans-modules-projectimport-eclipse-core.key=src=src;file=lib/commons-cli-1.2.jar;file=lib/js-14.jar;file=lib/commons-cli-1.2-sources.jar;file=lib/db4o-8.0.249.16098-all-java5.jar;output=bin; +auxiliary.org-netbeans-modules-projectimport-eclipse-core.project=. +auxiliary.org-netbeans-modules-projectimport-eclipse-core.timestamp=1370875172897 +auxiliary.org-netbeans-modules-projectimport-eclipse-core.workspace=C:\\Users\\Alexander\\workspace +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +build.generated.sources.dir=${build.dir}/generated-sources +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +# Uncomment to specify the preferred debugger connection transport: +#debug.transport=dt_socket +debug.classpath=\ + ${run.classpath} +debug.test.classpath=\ + ${run.test.classpath} +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/MossTest.jar +dist.javadoc.dir=${dist.dir}/javadoc +excludes= +file.reference.commons-cli-1.2-sources.jar=lib/commons-cli-1.2-sources.jar +file.reference.commons-cli-1.2.jar=lib/commons-cli-1.2.jar +file.reference.db4o-8.0.249.16098-all-java5.jar=lib/db4o-8.0.249.16098-all-java5.jar +file.reference.js-14.jar=lib/js-14.jar +file.reference.mosstest-src=src +includes=** +jar.compress=false +javac.classpath=\ + ${file.reference.commons-cli-1.2.jar}:\ + ${file.reference.js-14.jar}:\ + ${file.reference.commons-cli-1.2-sources.jar}:\ + ${file.reference.db4o-8.0.249.16098-all-java5.jar} +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.processorpath=\ + ${javac.classpath} +javac.source=1.7 +javac.target=1.7 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +javac.test.processorpath=\ + ${javac.test.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +manifest.file=manifest.mf +meta.inf.dir=${src.dir}/META-INF +mkdist.disabled=true +platform.active=default_platform +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +# Space-separated list of JVM arguments used when running the project. +# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. +# To set system properties for unit tests define test-sys-prop.name=value: +run.jvmargs= +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +source.encoding=UTF-8 +source.reference.commons-cli-1.2.jar=lib/commons-cli-1.2-sources.jar +src.dir=${file.reference.mosstest-src} diff --git a/nbproject/project.xml b/nbproject/project.xml index 807c653..f50124b 100644 --- a/nbproject/project.xml +++ b/nbproject/project.xml @@ -1,13 +1,13 @@ - - - org.netbeans.modules.java.j2seproject - - - MossTest - - - - - - - + + + org.netbeans.modules.java.j2seproject + + + MossTest + + + + + + + diff --git a/planning/threadTree.txt b/planning/threadTree.txt index 0852865..45ab8bb 100644 --- a/planning/threadTree.txt +++ b/planning/threadTree.txt @@ -1,28 +1,28 @@ -Main - Net - inBandUDP - OutOFBandUDP - TCPNet - MapManager - Mapgen(Pool?) - MapLookup(Pool?) - Player - PEvents(Pool?) - BlockChange - Movement - Entities - EntActions - EntPathfindingAI - Scripting - ScriptMgr - Administrator - Logging - UserMgmt - Ban/anti-attack - Maintenance - DBManager - DeadlockWatchdog-This shall be simple and never rely on blocked methods - DB - DatabaseAccessors - LoadBalancer - LBCommunicator +Main + Net + inBandUDP + OutOFBandUDP + TCPNet + MapManager + Mapgen(Pool?) + MapLookup(Pool?) + Player + PEvents(Pool?) + BlockChange + Movement + Entities + EntActions + EntPathfindingAI + Scripting + ScriptMgr + Administrator + Logging + UserMgmt + Ban/anti-attack + Maintenance + DBManager + DeadlockWatchdog-This shall be simple and never rely on blocked methods + DB + DatabaseAccessors + LoadBalancer + LBCommunicator diff --git a/src/net/mosstest/sandbox/SandboxClass.java b/src/net/mosstest/sandbox/SandboxClass.java index cc09fc6..717020c 100644 --- a/src/net/mosstest/sandbox/SandboxClass.java +++ b/src/net/mosstest/sandbox/SandboxClass.java @@ -1,75 +1,75 @@ -package net.mosstest.sandbox; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -public class SandboxClass { - Class clazz; - final boolean allowStatic, instantiable, deny, iface; - - public SandboxClass(Class clazz, boolean allowStatic, - boolean instantiable, boolean deny, boolean iface) { - this.clazz = clazz; - this.allowStatic = allowStatic; - this.instantiable = instantiable; - this.deny = deny; - this.iface = iface; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result - + ((this.clazz == null) ? 0 : this.clazz.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (!(obj instanceof SandboxClass)) { - return false; - } - SandboxClass other = (SandboxClass) obj; - if (this.clazz == null) { - if (other.clazz != null) { - return false; - } - } else if (!this.clazz.equals(other.clazz)) { - return false; - } - return true; - } - - public Object invokeStatic(String method, Object... params) - throws NoSuchMethodException, SecurityException, - IllegalAccessException, IllegalArgumentException, - InvocationTargetException { - Class[] clazzes = new Class[params.length]; - for (int i = 0; i < params.length; i++) { - clazzes[i] = params[i].getClass(); - } - Method mth = this.clazz.getMethod(method, clazzes); - return mth.invoke(null); - - } - - public T getInstance(Object... params) throws NoSuchMethodException, - SecurityException, InstantiationException, IllegalAccessException, - IllegalArgumentException, InvocationTargetException { - Class[] clazzes = new Class[params.length]; - for (int i = 0; i < params.length; i++) { - clazzes[i] = params[i].getClass(); - } - Constructor constr = this.clazz.getConstructor(clazzes); - return constr.newInstance(params); - } - -} +package net.mosstest.sandbox; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class SandboxClass { + Class clazz; + final boolean allowStatic, instantiable, deny, iface; + + public SandboxClass(Class clazz, boolean allowStatic, + boolean instantiable, boolean deny, boolean iface) { + this.clazz = clazz; + this.allowStatic = allowStatic; + this.instantiable = instantiable; + this.deny = deny; + this.iface = iface; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + + ((this.clazz == null) ? 0 : this.clazz.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof SandboxClass)) { + return false; + } + SandboxClass other = (SandboxClass) obj; + if (this.clazz == null) { + if (other.clazz != null) { + return false; + } + } else if (!this.clazz.equals(other.clazz)) { + return false; + } + return true; + } + + public Object invokeStatic(String method, Object... params) + throws NoSuchMethodException, SecurityException, + IllegalAccessException, IllegalArgumentException, + InvocationTargetException { + Class[] clazzes = new Class[params.length]; + for (int i = 0; i < params.length; i++) { + clazzes[i] = params[i].getClass(); + } + Method mth = this.clazz.getMethod(method, clazzes); + return mth.invoke(null); + + } + + public T getInstance(Object... params) throws NoSuchMethodException, + SecurityException, InstantiationException, IllegalAccessException, + IllegalArgumentException, InvocationTargetException { + Class[] clazzes = new Class[params.length]; + for (int i = 0; i < params.length; i++) { + clazzes[i] = params[i].getClass(); + } + Constructor constr = this.clazz.getConstructor(clazzes); + return constr.newInstance(params); + } + +} diff --git a/src/net/mosstest/sandbox/lang/Runtime.java b/src/net/mosstest/sandbox/lang/Runtime.java index cebe6d9..3a5900e 100644 --- a/src/net/mosstest/sandbox/lang/Runtime.java +++ b/src/net/mosstest/sandbox/lang/Runtime.java @@ -1,28 +1,28 @@ -package net.mosstest.sandbox.lang; - -public class Runtime { - private java.lang.Runtime runtime = java.lang.Runtime.getRuntime(); - - public int availableProcessors() { - return this.runtime.availableProcessors(); - } - - public long freeMemory() { - return this.runtime.freeMemory(); - } - - public long totalMemory() { - return this.runtime.totalMemory(); - } - - public long maxMemory() { - return this.runtime.maxMemory(); - } - public void gc() { - this.runtime.gc(); - return; - } - - public Runtime() { - } -} +package net.mosstest.sandbox.lang; + +public class Runtime { + private java.lang.Runtime runtime = java.lang.Runtime.getRuntime(); + + public int availableProcessors() { + return this.runtime.availableProcessors(); + } + + public long freeMemory() { + return this.runtime.freeMemory(); + } + + public long totalMemory() { + return this.runtime.totalMemory(); + } + + public long maxMemory() { + return this.runtime.maxMemory(); + } + public void gc() { + this.runtime.gc(); + return; + } + + public Runtime() { + } +} diff --git a/src/net/mosstest/sandbox/lang/System.java b/src/net/mosstest/sandbox/lang/System.java index a18c397..e4f46a9 100644 --- a/src/net/mosstest/sandbox/lang/System.java +++ b/src/net/mosstest/sandbox/lang/System.java @@ -1,38 +1,38 @@ -package net.mosstest.sandbox.lang; - -import java.io.InputStream; -import java.io.PrintStream; - -public final class System { - private System() { - }; - - public static final PrintStream err = java.lang.System.err; - public static final PrintStream out = java.lang.System.out; - public static final InputStream in = java.lang.System.in; - - public static void arraycopy(Object src, int srcPos, Object dest, - int destPos, int length) { - java.lang.System.arraycopy(src, srcPos, dest, destPos, length); - } - - public static long currentTimeMillis() { - return java.lang.System.currentTimeMillis(); - } - - public static void gc() { - java.lang.System.gc(); - } - - public static int identityHashCode(Object o) { - return java.lang.System.identityHashCode(o); - } - - public static String lineSeparator() { - return java.lang.System.lineSeparator(); - } - - public static long nanoTime() { - return java.lang.System.nanoTime(); - } -} +package net.mosstest.sandbox.lang; + +import java.io.InputStream; +import java.io.PrintStream; + +public final class System { + private System() { + }; + + public static final PrintStream err = java.lang.System.err; + public static final PrintStream out = java.lang.System.out; + public static final InputStream in = java.lang.System.in; + + public static void arraycopy(Object src, int srcPos, Object dest, + int destPos, int length) { + java.lang.System.arraycopy(src, srcPos, dest, destPos, length); + } + + public static long currentTimeMillis() { + return java.lang.System.currentTimeMillis(); + } + + public static void gc() { + java.lang.System.gc(); + } + + public static int identityHashCode(Object o) { + return java.lang.System.identityHashCode(o); + } + + public static String lineSeparator() { + return java.lang.System.lineSeparator(); + } + + public static long nanoTime() { + return java.lang.System.nanoTime(); + } +} diff --git a/src/net/mosstest/sandbox/lang/Thread.java b/src/net/mosstest/sandbox/lang/Thread.java index 6cd4051..670aade 100644 --- a/src/net/mosstest/sandbox/lang/Thread.java +++ b/src/net/mosstest/sandbox/lang/Thread.java @@ -1,9 +1,9 @@ -package net.mosstest.sandbox.lang; - -import net.mosstest.scripting.ScriptRunnable; - -public class Thread { - static void spawnThread(ScriptRunnable r) { - //todo todo - } -} +package net.mosstest.sandbox.lang; + +import net.mosstest.scripting.ScriptRunnable; + +public class Thread { + static void spawnThread(ScriptRunnable r) { + //todo todo + } +} diff --git a/src/net/mosstest/sandbox/lang/ThreadGroup.java b/src/net/mosstest/sandbox/lang/ThreadGroup.java index a12a614..182bbaa 100644 --- a/src/net/mosstest/sandbox/lang/ThreadGroup.java +++ b/src/net/mosstest/sandbox/lang/ThreadGroup.java @@ -1,5 +1,5 @@ -package net.mosstest.sandbox.lang; - -public class ThreadGroup { - //todo sandbox -} +package net.mosstest.sandbox.lang; + +public class ThreadGroup { + //todo sandbox +} diff --git a/src/net/mosstest/sandbox/lang/ThreadLocal.java b/src/net/mosstest/sandbox/lang/ThreadLocal.java index a583d93..89504ed 100644 --- a/src/net/mosstest/sandbox/lang/ThreadLocal.java +++ b/src/net/mosstest/sandbox/lang/ThreadLocal.java @@ -1,5 +1,5 @@ -package net.mosstest.sandbox.lang; - -public class ThreadLocal { - //todo sandbox--probably discard, in fact. -} +package net.mosstest.sandbox.lang; + +public class ThreadLocal { + //todo sandbox--probably discard, in fact. +} diff --git a/src/net/mosstest/sandbox/util/Collections.java b/src/net/mosstest/sandbox/util/Collections.java index 9791d82..be6175b 100644 --- a/src/net/mosstest/sandbox/util/Collections.java +++ b/src/net/mosstest/sandbox/util/Collections.java @@ -1,5 +1,5 @@ -package net.mosstest.sandbox.util; - -public class Collections { - //todo sandbox -} +package net.mosstest.sandbox.util; + +public class Collections { + //todo sandbox +} diff --git a/src/net/mosstest/sandbox/util/Enumeration.java b/src/net/mosstest/sandbox/util/Enumeration.java index af6be4b..a5525c8 100644 --- a/src/net/mosstest/sandbox/util/Enumeration.java +++ b/src/net/mosstest/sandbox/util/Enumeration.java @@ -1,5 +1,5 @@ -package net.mosstest.sandbox.util; - -public class Enumeration { - //todo sandbox -} +package net.mosstest.sandbox.util; + +public class Enumeration { + //todo sandbox +} diff --git a/src/net/mosstest/sandbox/util/ResourceBundle.java b/src/net/mosstest/sandbox/util/ResourceBundle.java index 7faac03..3f3578d 100644 --- a/src/net/mosstest/sandbox/util/ResourceBundle.java +++ b/src/net/mosstest/sandbox/util/ResourceBundle.java @@ -1,5 +1,5 @@ -package net.mosstest.sandbox.util; - -public class ResourceBundle { - //todo sandbox -} +package net.mosstest.sandbox.util; + +public class ResourceBundle { + //todo sandbox +} diff --git a/src/net/mosstest/sandbox/util/concurrent/atomic/AtomicReferenceFieldUpdater.java b/src/net/mosstest/sandbox/util/concurrent/atomic/AtomicReferenceFieldUpdater.java index 6d05d49..9231782 100644 --- a/src/net/mosstest/sandbox/util/concurrent/atomic/AtomicReferenceFieldUpdater.java +++ b/src/net/mosstest/sandbox/util/concurrent/atomic/AtomicReferenceFieldUpdater.java @@ -1,5 +1,5 @@ -package net.mosstest.sandbox.util.concurrent.atomic; - -public class AtomicReferenceFieldUpdater { - //todo sandbox -} +package net.mosstest.sandbox.util.concurrent.atomic; + +public class AtomicReferenceFieldUpdater { + //todo sandbox +} diff --git a/src/net/mosstest/scripting/AntiCheatController.java b/src/net/mosstest/scripting/AntiCheatController.java index e23cb25..fb93a40 100644 --- a/src/net/mosstest/scripting/AntiCheatController.java +++ b/src/net/mosstest/scripting/AntiCheatController.java @@ -1,131 +1,131 @@ -package net.mosstest.scripting; - -import java.util.ArrayList; -import java.util.Random; -import java.util.concurrent.atomic.AtomicInteger; - -import net.mosstest.servercore.SessionManager; - -public class AntiCheatController { - protected ArrayList checks = new ArrayList<>(); - protected ArrayList handlers = new ArrayList<>(); - protected MossScriptEnv env; - protected SessionManager sess; - protected volatile boolean run = false; - protected AtomicInteger needDeathsFrom = new AtomicInteger(0); - - public AntiCheatController(MossScriptEnv env, SessionManager sess) { - this.env = env; - this.sess = sess; - } - - public void registerCheck(AntiCheatCheck chk) { - synchronized (this.checks) { - this.checks.add(chk); - } - } - - public void registerHandler(AntiCheatHandler hdl) { - synchronized (this.handlers) { - this.handlers.add(hdl); - } - } - - private ArrayList threads = new ArrayList<>(); - - public void startThreads(int threads, int priority) { - this.run = true; - for (int i = 0; i < threads; i++) { - Thread cThread = new Thread(new AntiCheatRunnable(), "anticheat" - + new Random().nextInt()); - this.threads.add(cThread); - cThread.start(); - cThread.setPriority(priority); - } - } - - public void killThreads(int threads) { - - this.needDeathsFrom.addAndGet(threads); - - } - - public static interface AntiCheatCheck { - /** - * Check that a player is compliant with this anti-cheat check. This - * method is not guaranteed to be called, especially if system resources - * are low. - * - * @param p - * The player to check. The volatile fields xpos, ypos, zpos, - * oldx, oldy, oldz, lastAntiCheatMillis may prove - * particularly useful. - * @param env - * The MossScriptEnv that may be used in case - * moss is not available in javascript global - * scope. - * @return Value representing a violation level. Recommended values are - * 0 for all-OK to 100 for the most severe cheating. - */ - public int check(Player p, MossScriptEnv env); - } - - public static interface AntiCheatHandler { - - /** - * Called if a violation is detected by any check. This method is - * guaranteed to be called upon any violation being detected. - * - * @param p - * The player with a violation. - * @param severity - * Value representing a violation level. Recommended values - * are 0 for all-OK to 100 for the most severe cheating. - * @param env - * The MossScriptEnv that may be used in case - * moss is not available in javascript global - * scope. - */ - public void handleViolation(Player p, int severity, MossScriptEnv env); - } - - private class AntiCheatRunnable implements Runnable { - - @Override - public void run() { - - runLoop: while (AntiCheatController.this.run) { - int needDeaths; - if ((needDeaths = AntiCheatController.this.needDeathsFrom.get()) > 0) { - if (AntiCheatController.this.needDeathsFrom.compareAndSet( - needDeaths, needDeaths - 1)) - break runLoop; - } - - try { - for (Player player : AntiCheatController.this.sess.playerSessions - .keySet()) { - for (AntiCheatCheck chk : AntiCheatController.this.checks) { - int severity; - if ((severity = chk.check(player, - AntiCheatController.this.env)) > 0) { - for (AntiCheatHandler hdl : AntiCheatController.this.handlers) { - hdl.handleViolation(player, severity, - AntiCheatController.this.env); - } - } - } - } - } catch (Exception e) { - // pass for possible ConcurrentModificationException - } - try { - Thread.sleep(100); - } catch (InterruptedException e) { - // pass - } - } - - } - } -} +package net.mosstest.scripting; + +import java.util.ArrayList; +import java.util.Random; +import java.util.concurrent.atomic.AtomicInteger; + +import net.mosstest.servercore.SessionManager; + +public class AntiCheatController { + protected ArrayList checks = new ArrayList<>(); + protected ArrayList handlers = new ArrayList<>(); + protected MossScriptEnv env; + protected SessionManager sess; + protected volatile boolean run = false; + protected AtomicInteger needDeathsFrom = new AtomicInteger(0); + + public AntiCheatController(MossScriptEnv env, SessionManager sess) { + this.env = env; + this.sess = sess; + } + + public void registerCheck(AntiCheatCheck chk) { + synchronized (this.checks) { + this.checks.add(chk); + } + } + + public void registerHandler(AntiCheatHandler hdl) { + synchronized (this.handlers) { + this.handlers.add(hdl); + } + } + + private ArrayList threads = new ArrayList<>(); + + public void startThreads(int threads, int priority) { + this.run = true; + for (int i = 0; i < threads; i++) { + Thread cThread = new Thread(new AntiCheatRunnable(), "anticheat" + + new Random().nextInt()); + this.threads.add(cThread); + cThread.start(); + cThread.setPriority(priority); + } + } + + public void killThreads(int threads) { + + this.needDeathsFrom.addAndGet(threads); + + } + + public static interface AntiCheatCheck { + /** + * Check that a player is compliant with this anti-cheat check. This + * method is not guaranteed to be called, especially if system resources + * are low. + * + * @param p + * The player to check. The volatile fields xpos, ypos, zpos, + * oldx, oldy, oldz, lastAntiCheatMillis may prove + * particularly useful. + * @param env + * The MossScriptEnv that may be used in case + * moss is not available in javascript global + * scope. + * @return Value representing a violation level. Recommended values are + * 0 for all-OK to 100 for the most severe cheating. + */ + public int check(Player p, MossScriptEnv env); + } + + public static interface AntiCheatHandler { + + /** + * Called if a violation is detected by any check. This method is + * guaranteed to be called upon any violation being detected. + * + * @param p + * The player with a violation. + * @param severity + * Value representing a violation level. Recommended values + * are 0 for all-OK to 100 for the most severe cheating. + * @param env + * The MossScriptEnv that may be used in case + * moss is not available in javascript global + * scope. + */ + public void handleViolation(Player p, int severity, MossScriptEnv env); + } + + private class AntiCheatRunnable implements Runnable { + + @Override + public void run() { + + runLoop: while (AntiCheatController.this.run) { + int needDeaths; + if ((needDeaths = AntiCheatController.this.needDeathsFrom.get()) > 0) { + if (AntiCheatController.this.needDeathsFrom.compareAndSet( + needDeaths, needDeaths - 1)) + break runLoop; + } + + try { + for (Player player : AntiCheatController.this.sess.playerSessions + .keySet()) { + for (AntiCheatCheck chk : AntiCheatController.this.checks) { + int severity; + if ((severity = chk.check(player, + AntiCheatController.this.env)) > 0) { + for (AntiCheatHandler hdl : AntiCheatController.this.handlers) { + hdl.handleViolation(player, severity, + AntiCheatController.this.env); + } + } + } + } + } catch (Exception e) { + // pass for possible ConcurrentModificationException + } + try { + Thread.sleep(100); + } catch (InterruptedException e) { + // pass + } + } + + } + } +} diff --git a/src/net/mosstest/scripting/Entity.java b/src/net/mosstest/scripting/Entity.java index c2f56c0..988718a 100644 --- a/src/net/mosstest/scripting/Entity.java +++ b/src/net/mosstest/scripting/Entity.java @@ -1,15 +1,15 @@ -package net.mosstest.scripting; - -public class Entity { - int id; - public String name; - int hp; - int maxHealth; - public void destroy() { - // TODO Auto-generated method stub - - } - protected Entity(String name, int maxHealth) { - //TODO DB lookup for entities - } -} +package net.mosstest.scripting; + +public class Entity { + int id; + public String name; + int hp; + int maxHealth; + public void destroy() { + // TODO Auto-generated method stub + + } + protected Entity(String name, int maxHealth) { + //TODO DB lookup for entities + } +} diff --git a/src/net/mosstest/scripting/EventProcessingCompletedSignal.java b/src/net/mosstest/scripting/EventProcessingCompletedSignal.java index 506f38f..b1f6ec8 100644 --- a/src/net/mosstest/scripting/EventProcessingCompletedSignal.java +++ b/src/net/mosstest/scripting/EventProcessingCompletedSignal.java @@ -1,5 +1,5 @@ -package net.mosstest.scripting; - -public class EventProcessingCompletedSignal extends Throwable { - -} +package net.mosstest.scripting; + +public class EventProcessingCompletedSignal extends Throwable { + +} diff --git a/src/net/mosstest/scripting/Face.java b/src/net/mosstest/scripting/Face.java index 63a7649..57ca19b 100644 --- a/src/net/mosstest/scripting/Face.java +++ b/src/net/mosstest/scripting/Face.java @@ -1,5 +1,5 @@ -package net.mosstest.scripting; - -public enum Face { - TOP, BOTTOM, N, S, E, W -} +package net.mosstest.scripting; + +public enum Face { + TOP, BOTTOM, N, S, E, W +} diff --git a/src/net/mosstest/scripting/IMapGenerator.java b/src/net/mosstest/scripting/IMapGenerator.java index 3752911..21a4110 100644 --- a/src/net/mosstest/scripting/IMapGenerator.java +++ b/src/net/mosstest/scripting/IMapGenerator.java @@ -1,51 +1,51 @@ -package net.mosstest.scripting; - -import net.mosstest.servercore.MapGeneratorException; -import net.mosstest.servercore.NodeManager; - -public interface IMapGenerator { - - void init(long seed, NodeManager nm, Object... params) throws MapGeneratorException; - - public MapChunk generateChunk(Position pos) throws MapGeneratorException; - - /** - * Fills in a chunk as an array of light nodes, where 0 values require - * filling. - * - * @param lightNodes - * A reference to the array that must be updated. - * @param pos - * The position corresponding to the chunk to be filled in. - * @throws MapGeneratorException - * Thrown in case the map generator encounters an inconsistency - * it cannot recover from. - */ - public void fillInChunk(int[][][] lightNodes, Position pos) - throws MapGeneratorException; - - /** - * Register an ore for future generation of chunks. The values given here - * are hints to the map generator and need not be exact. - * - * @param oreNode - * The ore to generate. - * @param minDepth - * The minimum depth(as a positive integer number of nodes below - * sea level. - * @param rarity - * How rare the ore should be. Rarity 1 corresponds to virtually - * every ore-containing node, and rarity 100 would correspond to - * approximately one out of 100 nodes being this ore. - * @param clumping - * Defines how clumped the ore should be. Generally corresponds - * to 0=uniform and 1=most strongly clumped(solid spheres of ore - * clumps to meet rarity goal) - * @param params - * Miscellaneous params for the map generator. - */ - public void registerOre(MapNode oreNode, double minDepth, double rarity, - double clumping, int seed, Object... params); - - -} +package net.mosstest.scripting; + +import net.mosstest.servercore.MapGeneratorException; +import net.mosstest.servercore.NodeManager; + +public interface IMapGenerator { + + void init(long seed, NodeManager nm, Object... params) throws MapGeneratorException; + + public MapChunk generateChunk(Position pos) throws MapGeneratorException; + + /** + * Fills in a chunk as an array of light nodes, where 0 values require + * filling. + * + * @param lightNodes + * A reference to the array that must be updated. + * @param pos + * The position corresponding to the chunk to be filled in. + * @throws MapGeneratorException + * Thrown in case the map generator encounters an inconsistency + * it cannot recover from. + */ + public void fillInChunk(int[][][] lightNodes, Position pos) + throws MapGeneratorException; + + /** + * Register an ore for future generation of chunks. The values given here + * are hints to the map generator and need not be exact. + * + * @param oreNode + * The ore to generate. + * @param minDepth + * The minimum depth(as a positive integer number of nodes below + * sea level. + * @param rarity + * How rare the ore should be. Rarity 1 corresponds to virtually + * every ore-containing node, and rarity 100 would correspond to + * approximately one out of 100 nodes being this ore. + * @param clumping + * Defines how clumped the ore should be. Generally corresponds + * to 0=uniform and 1=most strongly clumped(solid spheres of ore + * clumps to meet rarity goal) + * @param params + * Miscellaneous params for the map generator. + */ + public void registerOre(MapNode oreNode, double minDepth, double rarity, + double clumping, int seed, Object... params); + + +} diff --git a/src/net/mosstest/scripting/INodeParams.java b/src/net/mosstest/scripting/INodeParams.java index 94a12a2..2e02545 100644 --- a/src/net/mosstest/scripting/INodeParams.java +++ b/src/net/mosstest/scripting/INodeParams.java @@ -1,224 +1,224 @@ -package net.mosstest.scripting; - -/** - * Interface to specify handlers to be called when various actions are taken by - * players directed at a node. These handlers are called after the ones defined - * in {@link MossScriptEnv} but before the default handlers. Handlers have a - * chance to throw {@link EventProcessingCompletedSignal} to bypass the default - * handler. - * - * @author rarkenin - * - */ -public interface INodeParams { - /** - * Function that is called when a node is punched. - * - * @param player - * The player punching the node. - * @param tool - * The tool being used to punch the node. - * @param target - * The position of the targeted node. - * @param punchedFace - * The face being punched. - */ - public abstract void onPunch(Player player, MossItem tool, - NodePosition target, Face punchedFace) - throws EventProcessingCompletedSignal; - - /** - * Determines if a fall should continue - * - * @param player - * The player. - * @param height - * The height. - * @return A boolean representing whether the fall should continue or be - * marked as a fall. - */ - public abstract boolean shouldContinueFall(Player player, double height); - - /** - * Called when a node is fully dug. - * - * @param player - * The player digging the node. - * @param tool - * The tool used to dig the node. - * @param target - * The position of the node that has been dug. - * @param punchedFace - * The face on which the the tool was pointed when digging was - * complete. Note that if a dig begins on one face but the player - * moves the aim to another face the onPunch handler may receive - * a different face than this handler. - * @throws EventProcessingCompletedSignal - */ - public abstract void onDig(Player player, MossItem tool, - NodePosition target, Face punchedFace) - throws EventProcessingCompletedSignal; - - /** - * Called when a node is placed directly above, below, left, right, in front - * of, or behind this node. - * - * @param player - * The player placing the node. - * @param target - * @param placed - * @throws EventProcessingCompletedSignal - */ - public abstract void onPlaceNextTo(Player player, NodePosition target, - NodePosition placed) throws EventProcessingCompletedSignal; - - /** - * Called when a right-click is done on a node. Note that this is called - * even if no node is placed, such as if the player is not holding anything, - * or is holding a tool. - * - * @param player - * Player performing the action. - * @param tool - * Tool held by user in active slot during this action. - * @param target - * Position of targeted node - * @param clickedFace - * Face which was right-clicked. - * @throws EventProcessingCompletedSignal - */ - public abstract void onRightClick(Player player, MossItem tool, - NodePosition target, Face clickedFace) - throws EventProcessingCompletedSignal; - - /** - * Called when a player steps on a node either from jumping, falling, or - * walking forward. - * - * @param player - * Player that steps on this node. - * @param pos - * Position of node that is stepped on. - * @return Currently unused. - * @throws EventProcessingCompletedSignal - */ - public abstract boolean onStepOn(Player player, NodePosition pos) - throws EventProcessingCompletedSignal; - - /** - * Calculates the height a player may jump off of this node. One node is - * equal to 1.0. - * - * @param player - * @return The height the player may jump off this node. - */ - public abstract double jumpOffHeight(Player player); - - /** - * Calculates the height a player will bounce when landing on this node. - * - * @param player - * @param fallheight - * The height from which the player has fallen. - * @return A double value representing the height the player is to bounce. - */ - public abstract double calcBounceHeight(Player player, double fallheight); - - /** - * Calculates at which rate a player will sink in after landing on this - * node. - * - * @param player - * The player to calculate sink for. - * @param fallheight - * The height from which they have fallen. 0 if the player walks - * onto the node without jumping or falling. - * @return The rate for the player to sink. - */ - public abstract double calcSinkIn(Player player, double fallheight); - - /** - * Calculates at which rate a player will sink in if they are holding the - * key to actively descend. - * - * @param player - * The player to calculate sink for. - * @param fallheight - * The height from which they have fallen. 0 if the player walks - * onto the node without jumping or falling(feet at surface), or - * negative if they have already sunk in partially. - * @return The rate for the player to sink. - */ - public abstract double calcSinkActive(Player player, double fallheight); - - /** - * Calculates the rate at which a player will rise out of this node if they - * have sunk in and are pressing the jump key. If the player is in multiple - * node the lowermost node at the player's horizontal center is considered. - * - * @param player - * The player to perform the calculation for. - * @param sinkheight - * The depth to which the player has sunk. 0 is the surface at - * the player's feet. 1 corresponds to the player's feet being at - * the bottom of the node, and 2 or more is if the player is - * submerged in multiple nodes. - * @return The rate at which the player should rise when they hold the key - * corresponding to jumping, in nodes per second. - */ - public abstract double calcSinkEscape(Player player, double sinkheight); - - /** - * Calculates the speed at which a player will move across this node when - * walking. - * - * @param player - * The player for which the walk rate is being calculated. - * @return The rate in nodes/second at which the player should walk. - */ - public abstract double calcWalkSpeed(Player player); - - /** - * Calculates the speed at which a player will move across this node when - * sprinting. - * - * @param player - * The player for which the sprint rate is being calculated. - * @return The rate in nodes/second at which the player should sprint. - */ - public abstract double calcSprintSpeed(Player player); - - /** - * Calculates the damage a player will take when falling onto this node. - * - * @param player - * The player falling onto this node. - * @param height - * The fall height. - * @return The damage to be given to the player. A player has a default - * health of 64 units. - */ - public abstract double calcFallDamage(Player player, double height); - - /** - * Calculate whether a ray aimed from the crosshairs should stop at this - * node. - * - * @param player - * The player. - * @param distance - * The distance from the camera to the node. - * @return - */ - public abstract boolean shouldHitAimRay(Player player, double distance); - - /** - * Calculate a dig property. These are generally 0 for inability to dig to 1 - * for digging the node in one second. - * - * @param key - * @return - */ - public abstract double calcInteractProperties(MossTool.InteractType key); - -} +package net.mosstest.scripting; + +/** + * Interface to specify handlers to be called when various actions are taken by + * players directed at a node. These handlers are called after the ones defined + * in {@link MossScriptEnv} but before the default handlers. Handlers have a + * chance to throw {@link EventProcessingCompletedSignal} to bypass the default + * handler. + * + * @author rarkenin + * + */ +public interface INodeParams { + /** + * Function that is called when a node is punched. + * + * @param player + * The player punching the node. + * @param tool + * The tool being used to punch the node. + * @param target + * The position of the targeted node. + * @param punchedFace + * The face being punched. + */ + public abstract void onPunch(Player player, MossItem tool, + NodePosition target, Face punchedFace) + throws EventProcessingCompletedSignal; + + /** + * Determines if a fall should continue + * + * @param player + * The player. + * @param height + * The height. + * @return A boolean representing whether the fall should continue or be + * marked as a fall. + */ + public abstract boolean shouldContinueFall(Player player, double height); + + /** + * Called when a node is fully dug. + * + * @param player + * The player digging the node. + * @param tool + * The tool used to dig the node. + * @param target + * The position of the node that has been dug. + * @param punchedFace + * The face on which the the tool was pointed when digging was + * complete. Note that if a dig begins on one face but the player + * moves the aim to another face the onPunch handler may receive + * a different face than this handler. + * @throws EventProcessingCompletedSignal + */ + public abstract void onDig(Player player, MossItem tool, + NodePosition target, Face punchedFace) + throws EventProcessingCompletedSignal; + + /** + * Called when a node is placed directly above, below, left, right, in front + * of, or behind this node. + * + * @param player + * The player placing the node. + * @param target + * @param placed + * @throws EventProcessingCompletedSignal + */ + public abstract void onPlaceNextTo(Player player, NodePosition target, + NodePosition placed) throws EventProcessingCompletedSignal; + + /** + * Called when a right-click is done on a node. Note that this is called + * even if no node is placed, such as if the player is not holding anything, + * or is holding a tool. + * + * @param player + * Player performing the action. + * @param tool + * Tool held by user in active slot during this action. + * @param target + * Position of targeted node + * @param clickedFace + * Face which was right-clicked. + * @throws EventProcessingCompletedSignal + */ + public abstract void onRightClick(Player player, MossItem tool, + NodePosition target, Face clickedFace) + throws EventProcessingCompletedSignal; + + /** + * Called when a player steps on a node either from jumping, falling, or + * walking forward. + * + * @param player + * Player that steps on this node. + * @param pos + * Position of node that is stepped on. + * @return Currently unused. + * @throws EventProcessingCompletedSignal + */ + public abstract boolean onStepOn(Player player, NodePosition pos) + throws EventProcessingCompletedSignal; + + /** + * Calculates the height a player may jump off of this node. One node is + * equal to 1.0. + * + * @param player + * @return The height the player may jump off this node. + */ + public abstract double jumpOffHeight(Player player); + + /** + * Calculates the height a player will bounce when landing on this node. + * + * @param player + * @param fallheight + * The height from which the player has fallen. + * @return A double value representing the height the player is to bounce. + */ + public abstract double calcBounceHeight(Player player, double fallheight); + + /** + * Calculates at which rate a player will sink in after landing on this + * node. + * + * @param player + * The player to calculate sink for. + * @param fallheight + * The height from which they have fallen. 0 if the player walks + * onto the node without jumping or falling. + * @return The rate for the player to sink. + */ + public abstract double calcSinkIn(Player player, double fallheight); + + /** + * Calculates at which rate a player will sink in if they are holding the + * key to actively descend. + * + * @param player + * The player to calculate sink for. + * @param fallheight + * The height from which they have fallen. 0 if the player walks + * onto the node without jumping or falling(feet at surface), or + * negative if they have already sunk in partially. + * @return The rate for the player to sink. + */ + public abstract double calcSinkActive(Player player, double fallheight); + + /** + * Calculates the rate at which a player will rise out of this node if they + * have sunk in and are pressing the jump key. If the player is in multiple + * node the lowermost node at the player's horizontal center is considered. + * + * @param player + * The player to perform the calculation for. + * @param sinkheight + * The depth to which the player has sunk. 0 is the surface at + * the player's feet. 1 corresponds to the player's feet being at + * the bottom of the node, and 2 or more is if the player is + * submerged in multiple nodes. + * @return The rate at which the player should rise when they hold the key + * corresponding to jumping, in nodes per second. + */ + public abstract double calcSinkEscape(Player player, double sinkheight); + + /** + * Calculates the speed at which a player will move across this node when + * walking. + * + * @param player + * The player for which the walk rate is being calculated. + * @return The rate in nodes/second at which the player should walk. + */ + public abstract double calcWalkSpeed(Player player); + + /** + * Calculates the speed at which a player will move across this node when + * sprinting. + * + * @param player + * The player for which the sprint rate is being calculated. + * @return The rate in nodes/second at which the player should sprint. + */ + public abstract double calcSprintSpeed(Player player); + + /** + * Calculates the damage a player will take when falling onto this node. + * + * @param player + * The player falling onto this node. + * @param height + * The fall height. + * @return The damage to be given to the player. A player has a default + * health of 64 units. + */ + public abstract double calcFallDamage(Player player, double height); + + /** + * Calculate whether a ray aimed from the crosshairs should stop at this + * node. + * + * @param player + * The player. + * @param distance + * The distance from the camera to the node. + * @return + */ + public abstract boolean shouldHitAimRay(Player player, double distance); + + /** + * Calculate a dig property. These are generally 0 for inability to dig to 1 + * for digging the node in one second. + * + * @param key + * @return + */ + public abstract double calcInteractProperties(MossTool.InteractType key); + +} diff --git a/src/net/mosstest/scripting/JavaApi.java b/src/net/mosstest/scripting/JavaApi.java index ff5156c..bb28875 100644 --- a/src/net/mosstest/scripting/JavaApi.java +++ b/src/net/mosstest/scripting/JavaApi.java @@ -1,235 +1,235 @@ -package net.mosstest.scripting; - -import java.awt.geom.AffineTransform; -import java.awt.geom.Dimension2D; -import java.awt.geom.GeneralPath; -import java.awt.geom.Path2D; -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; -import java.awt.geom.RectangularShape; -import java.lang.ref.PhantomReference; -import java.lang.ref.Reference; -import java.lang.ref.SoftReference; -import java.lang.ref.WeakReference; -import java.lang.reflect.InvocationTargetException; -import java.math.BigInteger; -import java.math.RoundingMode; -import java.util.AbstractCollection; -import java.util.AbstractList; -import java.util.AbstractMap; -import java.util.AbstractSequentialList; -import java.util.AbstractSet; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.BitSet; -import java.util.Calendar; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.Currency; -import java.util.Date; -import java.util.Deque; -import java.util.Dictionary; -import java.util.EmptyStackException; -import java.util.EnumMap; -import java.util.EventListener; -import java.util.GregorianCalendar; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Hashtable; -import java.util.IdentityHashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; -import java.util.MissingResourceException; -import java.util.NavigableMap; -import java.util.Properties; -import java.util.Queue; -import java.util.Random; -import java.util.RandomAccess; -import java.util.Set; -import java.util.SortedMap; -import java.util.Stack; -import java.util.StringTokenizer; -import java.util.TimeZone; -import java.util.TreeSet; -import java.util.Vector; -import java.util.WeakHashMap; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.locks.AbstractOwnableSynchronizer; -import java.util.concurrent.locks.AbstractQueuedSynchronizer; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; -import java.util.regex.MatchResult; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import net.mosstest.sandbox.SandboxClass; -import net.mosstest.sandbox.lang.Runtime; -import net.mosstest.sandbox.lang.System; -import net.mosstest.sandbox.lang.Thread; -import net.mosstest.sandbox.lang.ThreadGroup; -import net.mosstest.sandbox.lang.ThreadLocal; -import net.mosstest.sandbox.util.Enumeration; -import net.mosstest.sandbox.util.ResourceBundle; -import net.mosstest.sandbox.util.concurrent.atomic.AtomicReferenceFieldUpdater; - -/** - * Class for scripts to instantiate and access the static methods of various approved classes. - * @author rarkenin - * - */ -public class JavaApi { - - private static final HashMap qualifiedClasses=new HashMap(){{ - put("java.lang.Object", new SandboxClass(java.lang.Object.class, true, true, false, false)); - put("java.lang.String", new SandboxClass(java.lang.String.class, true, true, false, false)); - put("java.lang.Comparable", new SandboxClass(java.lang.Comparable.class, true, true, false, true)); - put("java.lang.CharSequence", new SandboxClass(java.lang.CharSequence.class, true, true, false, true)); - put("java.lang.Class", new SandboxClass(java.lang.Class.class, false, false, true, false)); - put("java.lang.Cloneable", new SandboxClass(java.lang.Cloneable.class, true, true, false, true)); - put("java.lang.ClassLoader", new SandboxClass(java.lang.ClassLoader.class, false, false, true, false)); - put("java.lang.System", new SandboxClass(net.mosstest.sandbox.lang.System.class, true, false, true, false)); - put("java.lang.Throwable", new SandboxClass(java.lang.Throwable.class, true, true, false, false)); - put("java.lang.Error", new SandboxClass(java.lang.Error.class, true, true, false, false)); - put("java.lang.ThreadDeath", new SandboxClass(java.lang.ThreadDeath.class, false, false, true, false)); - put("java.lang.Exception", new SandboxClass(java.lang.Exception.class, true, true, false, false)); - put("java.lang.RuntimeException", new SandboxClass(java.lang.RuntimeException.class, true, true, false, false)); - put("java.lang.ClassCastException", new SandboxClass(java.lang.ClassCastException.class, true, true, false, false)); - put("java.lang.ArrayStoreException", new SandboxClass(java.lang.ArrayStoreException.class, true, true, false, false)); - put("java.lang.ref.Reference", new SandboxClass(java.lang.ref.Reference.class, true, true, false, false)); - put("java.lang.ref.SoftReference", new SandboxClass(java.lang.ref.SoftReference.class, true, true, false, false)); - put("java.lang.ref.WeakReference", new SandboxClass(java.lang.ref.WeakReference.class, true, true, false, false)); - put("java.lang.ref.PhantomReference", new SandboxClass(java.lang.ref.PhantomReference.class, true, true, false, false)); - put("java.lang.Thread", new SandboxClass(net.mosstest.sandbox.lang.Thread.class, true, true, false, false)); - put("java.lang.Runnable", new SandboxClass(java.lang.Runnable.class, true, true, false, true)); - put("java.lang.ref.SoftReference", new SandboxClass(net.mosstest.sandbox.lang.ThreadGroup.class, true, true, false, false)); - put("java.util.Properties", new SandboxClass(java.util.Properties.class, true, true, false, false)); - put("java.util.Hashtable", new SandboxClass(java.util.Hashtable.class, true, true, false, false)); - put("java.util.Map", new SandboxClass(java.util.Map.class, true, true, false, false)); - put("java.util.Dictionary", new SandboxClass(java.util.Dictionary.class, true, true, false, false)); - put("java.util.Vector", new SandboxClass(java.util.Vector.class, true, true, false, false)); - put("java.util.List", new SandboxClass(java.util.List.class, true, true, false, false)); - put("java.util.Collection", new SandboxClass(java.util.Collection.class, true, true, false, true)); - put("java.lang.Iterable", new SandboxClass(java.lang.Iterable.class, true, true, false, true)); - put("java.util.RandomAccess", new SandboxClass(java.util.RandomAccess.class, true, true, false, true)); - put("java.util.AbstractList", new SandboxClass(java.util.AbstractList.class, true, true, false, false)); - put("java.util.AbstractCollection", new SandboxClass(java.util.AbstractCollection.class, true, true, false, false)); - put("java.lang.StringBuffer", new SandboxClass(java.lang.StringBuffer.class, true, true, false, false)); - put("java.lang.Appendable", new SandboxClass(java.lang.Appendable.class, true, true, false, false)); - put("java.lang.StackTraceElement", new SandboxClass(java.lang.StackTraceElement.class, true, true, false, false)); - put("java.lang.Boolean", new SandboxClass(java.lang.Boolean.class, true, true, false, false)); - put("java.lang.Character", new SandboxClass(java.lang.Character.class, true, true, false, false)); - put("java.lang.Float", new SandboxClass(java.lang.Float.class, true, true, false, false)); - put("java.lang.Number", new SandboxClass(java.lang.Number.class, true, true, false, false)); - put("java.lang.Double", new SandboxClass(java.lang.Double.class, true, true, false, false)); - put("java.lang.Byte", new SandboxClass(java.lang.Byte.class, true, true, false, false)); - put("java.lang.Short", new SandboxClass(java.lang.Short.class, true, true, false, false)); - put("java.lang.Integer", new SandboxClass(java.lang.Integer.class, true, true, false, false)); - put("java.lang.Long", new SandboxClass(java.lang.Long.class, true, true, false, false)); - put("java.lang.NullPointerException", new SandboxClass(java.lang.NullPointerException.class, true, true, false, false)); - put("java.lang.ArithmeticException", new SandboxClass(java.lang.ArithmeticException.class, true, true, false, false)); - put("java.util.Comparator", new SandboxClass(java.util.Comparator.class, true, true, false, true)); - put("java.util.AbstractMap", new SandboxClass(java.util.AbstractMap.class, true, true, false, false)); - put("java.util.HashMap", new SandboxClass(java.util.HashMap.class, true, true, false, false)); - put("java.util.Stack", new SandboxClass(java.util.Stack.class, true, true, false, false)); - put("java.util.Enumeration", new SandboxClass(net.mosstest.sandbox.util.Enumeration.class, true, true, false, false)); - put("java.util.Iterator", new SandboxClass(java.util.Iterator.class, true, true, false, false)); - put("java.util.concurrent.atomic.AtomicReferenceFieldUpdater", new SandboxClass(net.mosstest.sandbox.util.concurrent.atomic.AtomicReferenceFieldUpdater.class, true, true, false, false)); - put("java.lang.NoSuchMethodError", new SandboxClass(java.lang.NoSuchMethodError.class, true, true, false, false)); - put("java.util.Collections", new SandboxClass(java.util.Collections.class, true, false, false, false)); - put("java.util.AbstractSet", new SandboxClass(java.util.AbstractSet.class, true, true, false, false)); - put("java.util.Set", new SandboxClass(java.util.Set.class, true, true, false, true)); - put("java.lang.ThreadLocal", new SandboxClass(net.mosstest.sandbox.lang.ThreadLocal.class, false, false, false, false)); - put("java.util.concurrent.atomic.AtomicInteger", new SandboxClass(java.util.concurrent.atomic.AtomicInteger.class, true, true, false, false)); - put("java.util.Arrays", new SandboxClass(java.util.Arrays.class, true, false, false, false)); - put("java.lang.Math", new SandboxClass(java.lang.Math.class, true, false, false, false)); - put("java.lang.StringBuilder", new SandboxClass(java.lang.StringBuilder.class, true, true, false, false)); - put("java.lang.Runtime", new SandboxClass(net.mosstest.sandbox.lang.Runtime.class, true, true, false, false)); - put("java.lang.Readable", new SandboxClass(java.lang.Readable.class, true, true, false, false)); - put("java.util.LinkedHashMap", new SandboxClass(java.util.LinkedHashMap.class, true, true, false, false)); - put("java.util.ArrayList", new SandboxClass(java.util.ArrayList.class, true, true, false, false)); - put("java.util.IdentityHashMap", new SandboxClass(java.util.IdentityHashMap.class, true, true, false, false)); - put("java.util.StringTokenizer", new SandboxClass(java.util.StringTokenizer.class, true, true, false, false)); - put("java.util.concurrent.ConcurrentHashMap", new SandboxClass(java.util.concurrent.ConcurrentHashMap.class, true, true, false, false)); - put("java.util.concurrent", new SandboxClass(java.util.concurrent.ConcurrentMap.class, true, true, false, false)); - put("java.util.concurrent.locks.ReentrantLock", new SandboxClass(java.util.concurrent.locks.ReentrantLock.class, true, true, false, false)); - put("java.util.concurrent.locks.Lock", new SandboxClass(java.util.concurrent.locks.Lock.class, true, true, false, false)); - put("java.util.concurrent.locks.AbstractQueuedSynchronizer", new SandboxClass(java.util.concurrent.locks.AbstractQueuedSynchronizer.class, true, true, false, false)); - put("java.util.concurrent.locks.AbstractOwnableSynchronizer", new SandboxClass(java.util.concurrent.locks.AbstractOwnableSynchronizer.class, true, true, false, false)); - put("java.util.BitSet", new SandboxClass(java.util.BitSet.class, true, true, false, false)); - put("java.util.HashSet", new SandboxClass(java.util.HashSet.class, true, true, false, false)); - put("java.util.LinkedHashSet", new SandboxClass(java.util.LinkedHashSet.class, true, true, false, false)); - put("java.lang.InterruptedException", new SandboxClass(java.lang.InterruptedException.class, true, true, false, false)); - put("java.util.ResourceBundle", new SandboxClass(net.mosstest.sandbox.util.ResourceBundle.class, true, true, false, false)); - put("java.util.EventListener", new SandboxClass(java.util.EventListener.class, true, true, false, true)); - put("java.awt.geom.AffineTransform", new SandboxClass(java.awt.geom.AffineTransform.class, true, true, false, false)); - put("java.lang.Enum", new SandboxClass(java.lang.Enum.class, true, true, false, false)); - put("java.util.WeakHashMap", new SandboxClass(java.util.WeakHashMap.class, true, true, false, false)); - put("java.awt.geom.Dimension2D", new SandboxClass(java.awt.geom.Dimension2D.class, true, true, false, false)); - put("java.util.concurrent.atomic.AtomicBoolean", new SandboxClass(java.util.concurrent.atomic.AtomicBoolean.class, true, true, false, false)); - put("java.lang.NoSuchMethodException", new SandboxClass(java.lang.NoSuchMethodException.class, true, true, false, false)); - put("java.awt.geom.Point2D", new SandboxClass(java.awt.geom.Point2D.class, true, true, false, false)); - put("java.lang.UnsupportedOperationException", new SandboxClass(java.lang.UnsupportedOperationException.class, true, true, false, false)); - put("java.awt.geom.Rectangle2D", new SandboxClass(java.awt.geom.Rectangle2D.class, true, true, false, false)); - put("java.awt.geom.RectangularShape", new SandboxClass(java.awt.geom.RectangularShape.class, true, true, false, false)); - put("java.lang.SecurityException", new SandboxClass(java.lang.SecurityException.class, true, true, false, false)); - put("java.util.IllegalStateException", new SandboxClass(java.lang.IllegalStateException.class, true, true, false, false)); - put("java.awt.geom.Path2D", new SandboxClass(java.awt.geom.Path2D.class, true, true, false, false)); - put("java.awt.geom.GeneralPath", new SandboxClass(java.awt.geom.GeneralPath.class, true, true, false, false)); - put("java.util.MissingResourceException", new SandboxClass(java.util.MissingResourceException.class, true, true, false, false)); - put("java.util.LinkedList", new SandboxClass(java.util.LinkedList.class, true, true, false, false)); - put("java.util.Deque", new SandboxClass(java.util.Deque.class, true, true, false, false)); - put("java.util.Queue", new SandboxClass(java.util.Queue.class, true, true, false, false)); - put("java.util.AbstractSequentialList", new SandboxClass(java.util.AbstractSequentialList.class, true, true, false, false)); - put("java.util.EmptyStackException", new SandboxClass(java.util.EmptyStackException.class, true, true, false, false)); - put("java.util.TreeSet", new SandboxClass(java.util.TreeSet.class, true, true, false, false)); - put("java.util.NavigableMap", new SandboxClass(java.util.NavigableMap.class, true, true, false, false)); - put("java.util.SortedMap", new SandboxClass(java.util.SortedMap.class, true, true, false, false)); - put("java.util.ListIterator", new SandboxClass(java.util.ListIterator.class, true, true, false, false)); - put("java.lang.IllegalAccessException", new SandboxClass(java.lang.IllegalAccessException.class, true, true, false, false)); - put("java.util.regex.Pattern", new SandboxClass(java.util.regex.Pattern.class, true, true, false, false)); - put("java.lang.StrictMath", new SandboxClass(java.lang.StrictMath.class, true, false, false, false)); - put("java.lang.NumberFormatException", new SandboxClass(java.lang.NumberFormatException.class, true, true, false, false)); - put("java.lang.IllegalArgumentException", new SandboxClass(java.lang.IllegalArgumentException.class, true, true, false, false)); - put("java.util.Date", new SandboxClass(java.util.Date.class, true, true, false, false)); - put("java.util.TimeZone", new SandboxClass(java.util.TimeZone.class, true, true, false, false)); - put("java.util.regex.Matcher", new SandboxClass(java.util.regex.Matcher.class, true, true, false, false)); - put("java.util.regex.MathResult", new SandboxClass(java.util.regex.MatchResult.class, true, true, false, false)); - put("java.util.Random", new SandboxClass(java.util.Random.class, true, true, false, false)); - put("java.util.concurrent.atomic.AtomicLong", new SandboxClass(java.util.concurrent.atomic.AtomicLong.class, true, true, false, false)); - put("java.lang.InternalError", new SandboxClass(java.lang.InternalError.class, true, true, false, false)); - put("java.lang.NoSuchFieldException", new SandboxClass(java.lang.NoSuchFieldException.class, true, true, false, false)); - put("java.lang.InstantiationException", new SandboxClass(java.lang.InstantiationException.class, true, true, false, false)); - put("java.lang.ArrayIndexOutOfBoundsException", new SandboxClass(java.lang.ArrayIndexOutOfBoundsException.class, true, true, false, false)); - put("java.lang.IllegalAccessError", new SandboxClass(java.lang.IllegalAccessError.class, true, true, false, false)); - put("java.lang.CloneNotSupportedException", new SandboxClass(java.lang.CloneNotSupportedException.class, true, true, false, false)); - put("java.lang.UnsatisfiedLinkError", new SandboxClass(java.lang.UnsatisfiedLinkError.class, true, true, false, false)); - put("java.util.Calendar", new SandboxClass(java.util.Calendar.class, true, true, false, false)); - put("java.util.GregorianCalendar", new SandboxClass(java.util.GregorianCalendar.class, true, true, false, false)); - put("java.util.Currency", new SandboxClass(java.util.Currency.class, true, true, false, false)); - put("java.math.RoundingMode", new SandboxClass(java.math.RoundingMode.class, true, true, false, false)); - put("java.lang.StringIndexOutOfBoundsException", new SandboxClass(java.lang.StringIndexOutOfBoundsException.class, true, true, false, false)); - put("java.math.BigInteger", new SandboxClass(java.math.BigInteger.class, true, true, false, false)); - put("java.util.EnumMap", new SandboxClass(java.util.EnumMap.class, true, true, false, false)); - }}; - - public static Object getInstance(String clazz, Object... constructorParams) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - SandboxClass sc=qualifiedClasses.get(clazz); - return sc.getInstance(constructorParams); - } - - public static Object invokeStatic(String clazz, String method, - Object... parameters) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - SandboxClass sc=qualifiedClasses.get(clazz); - return sc.invokeStatic(method, parameters); - } -} +package net.mosstest.scripting; + +import java.awt.geom.AffineTransform; +import java.awt.geom.Dimension2D; +import java.awt.geom.GeneralPath; +import java.awt.geom.Path2D; +import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; +import java.awt.geom.RectangularShape; +import java.lang.ref.PhantomReference; +import java.lang.ref.Reference; +import java.lang.ref.SoftReference; +import java.lang.ref.WeakReference; +import java.lang.reflect.InvocationTargetException; +import java.math.BigInteger; +import java.math.RoundingMode; +import java.util.AbstractCollection; +import java.util.AbstractList; +import java.util.AbstractMap; +import java.util.AbstractSequentialList; +import java.util.AbstractSet; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.BitSet; +import java.util.Calendar; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.Currency; +import java.util.Date; +import java.util.Deque; +import java.util.Dictionary; +import java.util.EmptyStackException; +import java.util.EnumMap; +import java.util.EventListener; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.IdentityHashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; +import java.util.MissingResourceException; +import java.util.NavigableMap; +import java.util.Properties; +import java.util.Queue; +import java.util.Random; +import java.util.RandomAccess; +import java.util.Set; +import java.util.SortedMap; +import java.util.Stack; +import java.util.StringTokenizer; +import java.util.TimeZone; +import java.util.TreeSet; +import java.util.Vector; +import java.util.WeakHashMap; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.locks.AbstractOwnableSynchronizer; +import java.util.concurrent.locks.AbstractQueuedSynchronizer; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; +import java.util.regex.MatchResult; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import net.mosstest.sandbox.SandboxClass; +import net.mosstest.sandbox.lang.Runtime; +import net.mosstest.sandbox.lang.System; +import net.mosstest.sandbox.lang.Thread; +import net.mosstest.sandbox.lang.ThreadGroup; +import net.mosstest.sandbox.lang.ThreadLocal; +import net.mosstest.sandbox.util.Enumeration; +import net.mosstest.sandbox.util.ResourceBundle; +import net.mosstest.sandbox.util.concurrent.atomic.AtomicReferenceFieldUpdater; + +/** + * Class for scripts to instantiate and access the static methods of various approved classes. + * @author rarkenin + * + */ +public class JavaApi { + + private static final HashMap qualifiedClasses=new HashMap(){{ + put("java.lang.Object", new SandboxClass(java.lang.Object.class, true, true, false, false)); + put("java.lang.String", new SandboxClass(java.lang.String.class, true, true, false, false)); + put("java.lang.Comparable", new SandboxClass(java.lang.Comparable.class, true, true, false, true)); + put("java.lang.CharSequence", new SandboxClass(java.lang.CharSequence.class, true, true, false, true)); + put("java.lang.Class", new SandboxClass(java.lang.Class.class, false, false, true, false)); + put("java.lang.Cloneable", new SandboxClass(java.lang.Cloneable.class, true, true, false, true)); + put("java.lang.ClassLoader", new SandboxClass(java.lang.ClassLoader.class, false, false, true, false)); + put("java.lang.System", new SandboxClass(net.mosstest.sandbox.lang.System.class, true, false, true, false)); + put("java.lang.Throwable", new SandboxClass(java.lang.Throwable.class, true, true, false, false)); + put("java.lang.Error", new SandboxClass(java.lang.Error.class, true, true, false, false)); + put("java.lang.ThreadDeath", new SandboxClass(java.lang.ThreadDeath.class, false, false, true, false)); + put("java.lang.Exception", new SandboxClass(java.lang.Exception.class, true, true, false, false)); + put("java.lang.RuntimeException", new SandboxClass(java.lang.RuntimeException.class, true, true, false, false)); + put("java.lang.ClassCastException", new SandboxClass(java.lang.ClassCastException.class, true, true, false, false)); + put("java.lang.ArrayStoreException", new SandboxClass(java.lang.ArrayStoreException.class, true, true, false, false)); + put("java.lang.ref.Reference", new SandboxClass(java.lang.ref.Reference.class, true, true, false, false)); + put("java.lang.ref.SoftReference", new SandboxClass(java.lang.ref.SoftReference.class, true, true, false, false)); + put("java.lang.ref.WeakReference", new SandboxClass(java.lang.ref.WeakReference.class, true, true, false, false)); + put("java.lang.ref.PhantomReference", new SandboxClass(java.lang.ref.PhantomReference.class, true, true, false, false)); + put("java.lang.Thread", new SandboxClass(net.mosstest.sandbox.lang.Thread.class, true, true, false, false)); + put("java.lang.Runnable", new SandboxClass(java.lang.Runnable.class, true, true, false, true)); + put("java.lang.ref.SoftReference", new SandboxClass(net.mosstest.sandbox.lang.ThreadGroup.class, true, true, false, false)); + put("java.util.Properties", new SandboxClass(java.util.Properties.class, true, true, false, false)); + put("java.util.Hashtable", new SandboxClass(java.util.Hashtable.class, true, true, false, false)); + put("java.util.Map", new SandboxClass(java.util.Map.class, true, true, false, false)); + put("java.util.Dictionary", new SandboxClass(java.util.Dictionary.class, true, true, false, false)); + put("java.util.Vector", new SandboxClass(java.util.Vector.class, true, true, false, false)); + put("java.util.List", new SandboxClass(java.util.List.class, true, true, false, false)); + put("java.util.Collection", new SandboxClass(java.util.Collection.class, true, true, false, true)); + put("java.lang.Iterable", new SandboxClass(java.lang.Iterable.class, true, true, false, true)); + put("java.util.RandomAccess", new SandboxClass(java.util.RandomAccess.class, true, true, false, true)); + put("java.util.AbstractList", new SandboxClass(java.util.AbstractList.class, true, true, false, false)); + put("java.util.AbstractCollection", new SandboxClass(java.util.AbstractCollection.class, true, true, false, false)); + put("java.lang.StringBuffer", new SandboxClass(java.lang.StringBuffer.class, true, true, false, false)); + put("java.lang.Appendable", new SandboxClass(java.lang.Appendable.class, true, true, false, false)); + put("java.lang.StackTraceElement", new SandboxClass(java.lang.StackTraceElement.class, true, true, false, false)); + put("java.lang.Boolean", new SandboxClass(java.lang.Boolean.class, true, true, false, false)); + put("java.lang.Character", new SandboxClass(java.lang.Character.class, true, true, false, false)); + put("java.lang.Float", new SandboxClass(java.lang.Float.class, true, true, false, false)); + put("java.lang.Number", new SandboxClass(java.lang.Number.class, true, true, false, false)); + put("java.lang.Double", new SandboxClass(java.lang.Double.class, true, true, false, false)); + put("java.lang.Byte", new SandboxClass(java.lang.Byte.class, true, true, false, false)); + put("java.lang.Short", new SandboxClass(java.lang.Short.class, true, true, false, false)); + put("java.lang.Integer", new SandboxClass(java.lang.Integer.class, true, true, false, false)); + put("java.lang.Long", new SandboxClass(java.lang.Long.class, true, true, false, false)); + put("java.lang.NullPointerException", new SandboxClass(java.lang.NullPointerException.class, true, true, false, false)); + put("java.lang.ArithmeticException", new SandboxClass(java.lang.ArithmeticException.class, true, true, false, false)); + put("java.util.Comparator", new SandboxClass(java.util.Comparator.class, true, true, false, true)); + put("java.util.AbstractMap", new SandboxClass(java.util.AbstractMap.class, true, true, false, false)); + put("java.util.HashMap", new SandboxClass(java.util.HashMap.class, true, true, false, false)); + put("java.util.Stack", new SandboxClass(java.util.Stack.class, true, true, false, false)); + put("java.util.Enumeration", new SandboxClass(net.mosstest.sandbox.util.Enumeration.class, true, true, false, false)); + put("java.util.Iterator", new SandboxClass(java.util.Iterator.class, true, true, false, false)); + put("java.util.concurrent.atomic.AtomicReferenceFieldUpdater", new SandboxClass(net.mosstest.sandbox.util.concurrent.atomic.AtomicReferenceFieldUpdater.class, true, true, false, false)); + put("java.lang.NoSuchMethodError", new SandboxClass(java.lang.NoSuchMethodError.class, true, true, false, false)); + put("java.util.Collections", new SandboxClass(java.util.Collections.class, true, false, false, false)); + put("java.util.AbstractSet", new SandboxClass(java.util.AbstractSet.class, true, true, false, false)); + put("java.util.Set", new SandboxClass(java.util.Set.class, true, true, false, true)); + put("java.lang.ThreadLocal", new SandboxClass(net.mosstest.sandbox.lang.ThreadLocal.class, false, false, false, false)); + put("java.util.concurrent.atomic.AtomicInteger", new SandboxClass(java.util.concurrent.atomic.AtomicInteger.class, true, true, false, false)); + put("java.util.Arrays", new SandboxClass(java.util.Arrays.class, true, false, false, false)); + put("java.lang.Math", new SandboxClass(java.lang.Math.class, true, false, false, false)); + put("java.lang.StringBuilder", new SandboxClass(java.lang.StringBuilder.class, true, true, false, false)); + put("java.lang.Runtime", new SandboxClass(net.mosstest.sandbox.lang.Runtime.class, true, true, false, false)); + put("java.lang.Readable", new SandboxClass(java.lang.Readable.class, true, true, false, false)); + put("java.util.LinkedHashMap", new SandboxClass(java.util.LinkedHashMap.class, true, true, false, false)); + put("java.util.ArrayList", new SandboxClass(java.util.ArrayList.class, true, true, false, false)); + put("java.util.IdentityHashMap", new SandboxClass(java.util.IdentityHashMap.class, true, true, false, false)); + put("java.util.StringTokenizer", new SandboxClass(java.util.StringTokenizer.class, true, true, false, false)); + put("java.util.concurrent.ConcurrentHashMap", new SandboxClass(java.util.concurrent.ConcurrentHashMap.class, true, true, false, false)); + put("java.util.concurrent", new SandboxClass(java.util.concurrent.ConcurrentMap.class, true, true, false, false)); + put("java.util.concurrent.locks.ReentrantLock", new SandboxClass(java.util.concurrent.locks.ReentrantLock.class, true, true, false, false)); + put("java.util.concurrent.locks.Lock", new SandboxClass(java.util.concurrent.locks.Lock.class, true, true, false, false)); + put("java.util.concurrent.locks.AbstractQueuedSynchronizer", new SandboxClass(java.util.concurrent.locks.AbstractQueuedSynchronizer.class, true, true, false, false)); + put("java.util.concurrent.locks.AbstractOwnableSynchronizer", new SandboxClass(java.util.concurrent.locks.AbstractOwnableSynchronizer.class, true, true, false, false)); + put("java.util.BitSet", new SandboxClass(java.util.BitSet.class, true, true, false, false)); + put("java.util.HashSet", new SandboxClass(java.util.HashSet.class, true, true, false, false)); + put("java.util.LinkedHashSet", new SandboxClass(java.util.LinkedHashSet.class, true, true, false, false)); + put("java.lang.InterruptedException", new SandboxClass(java.lang.InterruptedException.class, true, true, false, false)); + put("java.util.ResourceBundle", new SandboxClass(net.mosstest.sandbox.util.ResourceBundle.class, true, true, false, false)); + put("java.util.EventListener", new SandboxClass(java.util.EventListener.class, true, true, false, true)); + put("java.awt.geom.AffineTransform", new SandboxClass(java.awt.geom.AffineTransform.class, true, true, false, false)); + put("java.lang.Enum", new SandboxClass(java.lang.Enum.class, true, true, false, false)); + put("java.util.WeakHashMap", new SandboxClass(java.util.WeakHashMap.class, true, true, false, false)); + put("java.awt.geom.Dimension2D", new SandboxClass(java.awt.geom.Dimension2D.class, true, true, false, false)); + put("java.util.concurrent.atomic.AtomicBoolean", new SandboxClass(java.util.concurrent.atomic.AtomicBoolean.class, true, true, false, false)); + put("java.lang.NoSuchMethodException", new SandboxClass(java.lang.NoSuchMethodException.class, true, true, false, false)); + put("java.awt.geom.Point2D", new SandboxClass(java.awt.geom.Point2D.class, true, true, false, false)); + put("java.lang.UnsupportedOperationException", new SandboxClass(java.lang.UnsupportedOperationException.class, true, true, false, false)); + put("java.awt.geom.Rectangle2D", new SandboxClass(java.awt.geom.Rectangle2D.class, true, true, false, false)); + put("java.awt.geom.RectangularShape", new SandboxClass(java.awt.geom.RectangularShape.class, true, true, false, false)); + put("java.lang.SecurityException", new SandboxClass(java.lang.SecurityException.class, true, true, false, false)); + put("java.util.IllegalStateException", new SandboxClass(java.lang.IllegalStateException.class, true, true, false, false)); + put("java.awt.geom.Path2D", new SandboxClass(java.awt.geom.Path2D.class, true, true, false, false)); + put("java.awt.geom.GeneralPath", new SandboxClass(java.awt.geom.GeneralPath.class, true, true, false, false)); + put("java.util.MissingResourceException", new SandboxClass(java.util.MissingResourceException.class, true, true, false, false)); + put("java.util.LinkedList", new SandboxClass(java.util.LinkedList.class, true, true, false, false)); + put("java.util.Deque", new SandboxClass(java.util.Deque.class, true, true, false, false)); + put("java.util.Queue", new SandboxClass(java.util.Queue.class, true, true, false, false)); + put("java.util.AbstractSequentialList", new SandboxClass(java.util.AbstractSequentialList.class, true, true, false, false)); + put("java.util.EmptyStackException", new SandboxClass(java.util.EmptyStackException.class, true, true, false, false)); + put("java.util.TreeSet", new SandboxClass(java.util.TreeSet.class, true, true, false, false)); + put("java.util.NavigableMap", new SandboxClass(java.util.NavigableMap.class, true, true, false, false)); + put("java.util.SortedMap", new SandboxClass(java.util.SortedMap.class, true, true, false, false)); + put("java.util.ListIterator", new SandboxClass(java.util.ListIterator.class, true, true, false, false)); + put("java.lang.IllegalAccessException", new SandboxClass(java.lang.IllegalAccessException.class, true, true, false, false)); + put("java.util.regex.Pattern", new SandboxClass(java.util.regex.Pattern.class, true, true, false, false)); + put("java.lang.StrictMath", new SandboxClass(java.lang.StrictMath.class, true, false, false, false)); + put("java.lang.NumberFormatException", new SandboxClass(java.lang.NumberFormatException.class, true, true, false, false)); + put("java.lang.IllegalArgumentException", new SandboxClass(java.lang.IllegalArgumentException.class, true, true, false, false)); + put("java.util.Date", new SandboxClass(java.util.Date.class, true, true, false, false)); + put("java.util.TimeZone", new SandboxClass(java.util.TimeZone.class, true, true, false, false)); + put("java.util.regex.Matcher", new SandboxClass(java.util.regex.Matcher.class, true, true, false, false)); + put("java.util.regex.MathResult", new SandboxClass(java.util.regex.MatchResult.class, true, true, false, false)); + put("java.util.Random", new SandboxClass(java.util.Random.class, true, true, false, false)); + put("java.util.concurrent.atomic.AtomicLong", new SandboxClass(java.util.concurrent.atomic.AtomicLong.class, true, true, false, false)); + put("java.lang.InternalError", new SandboxClass(java.lang.InternalError.class, true, true, false, false)); + put("java.lang.NoSuchFieldException", new SandboxClass(java.lang.NoSuchFieldException.class, true, true, false, false)); + put("java.lang.InstantiationException", new SandboxClass(java.lang.InstantiationException.class, true, true, false, false)); + put("java.lang.ArrayIndexOutOfBoundsException", new SandboxClass(java.lang.ArrayIndexOutOfBoundsException.class, true, true, false, false)); + put("java.lang.IllegalAccessError", new SandboxClass(java.lang.IllegalAccessError.class, true, true, false, false)); + put("java.lang.CloneNotSupportedException", new SandboxClass(java.lang.CloneNotSupportedException.class, true, true, false, false)); + put("java.lang.UnsatisfiedLinkError", new SandboxClass(java.lang.UnsatisfiedLinkError.class, true, true, false, false)); + put("java.util.Calendar", new SandboxClass(java.util.Calendar.class, true, true, false, false)); + put("java.util.GregorianCalendar", new SandboxClass(java.util.GregorianCalendar.class, true, true, false, false)); + put("java.util.Currency", new SandboxClass(java.util.Currency.class, true, true, false, false)); + put("java.math.RoundingMode", new SandboxClass(java.math.RoundingMode.class, true, true, false, false)); + put("java.lang.StringIndexOutOfBoundsException", new SandboxClass(java.lang.StringIndexOutOfBoundsException.class, true, true, false, false)); + put("java.math.BigInteger", new SandboxClass(java.math.BigInteger.class, true, true, false, false)); + put("java.util.EnumMap", new SandboxClass(java.util.EnumMap.class, true, true, false, false)); + }}; + + public static Object getInstance(String clazz, Object... constructorParams) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + SandboxClass sc=qualifiedClasses.get(clazz); + return sc.getInstance(constructorParams); + } + + public static Object invokeStatic(String clazz, String method, + Object... parameters) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + SandboxClass sc=qualifiedClasses.get(clazz); + return sc.invokeStatic(method, parameters); + } +} diff --git a/src/net/mosstest/scripting/LiquidFlowingNodeParams.java b/src/net/mosstest/scripting/LiquidFlowingNodeParams.java index 93e0f98..51dc74b 100644 --- a/src/net/mosstest/scripting/LiquidFlowingNodeParams.java +++ b/src/net/mosstest/scripting/LiquidFlowingNodeParams.java @@ -1,68 +1,68 @@ -package net.mosstest.scripting; - - -public class LiquidFlowingNodeParams extends DefaultNodeParams implements - LiquidNodeParams { - - @Override - public double calcFlowRate(NodePosition pos) { - return 1; - } - - @Override - public void onLiquidFlow(NodePosition pos) { - // pass - } - - @Override - public double calcDrainRate(NodePosition pos) { - return 1; - } - - @Override - public boolean shouldFill(int contacting, int flowing) { - // TODO Auto-generated method stub - return (contacting>=2); - } - - @Override - public double jumpOffHeight(Player player) { - return 1.125; - } - - @Override - public double calcWalkSpeed(Player player) { - return 0.6; - } - - @Override - public double calcSprintSpeed(Player player) { - return 0.8; - } - - @Override - public double calcSinkIn(Player player, double fallheight) { - return 0.4; - } - - @Override - public double calcSinkEscape(Player player, double fallheight) { - return 1; - } - - @Override - public double calcBounceHeight(Player player, double fallheight) { - return 0; - } - - @Override - public double calcFallDamage(Player player, double height) { - return 0; - } - - @Override - public boolean shouldContinueFall(Player player, double height) { - return false; - } - -} +package net.mosstest.scripting; + + +public class LiquidFlowingNodeParams extends DefaultNodeParams implements + LiquidNodeParams { + + @Override + public double calcFlowRate(NodePosition pos) { + return 1; + } + + @Override + public void onLiquidFlow(NodePosition pos) { + // pass + } + + @Override + public double calcDrainRate(NodePosition pos) { + return 1; + } + + @Override + public boolean shouldFill(int contacting, int flowing) { + // TODO Auto-generated method stub + return (contacting>=2); + } + + @Override + public double jumpOffHeight(Player player) { + return 1.125; + } + + @Override + public double calcWalkSpeed(Player player) { + return 0.6; + } + + @Override + public double calcSprintSpeed(Player player) { + return 0.8; + } + + @Override + public double calcSinkIn(Player player, double fallheight) { + return 0.4; + } + + @Override + public double calcSinkEscape(Player player, double fallheight) { + return 1; + } + + @Override + public double calcBounceHeight(Player player, double fallheight) { + return 0; + } + + @Override + public double calcFallDamage(Player player, double height) { + return 0; + } + + @Override + public boolean shouldContinueFall(Player player, double height) { + return false; + } + +} diff --git a/src/net/mosstest/scripting/LiquidNode.java b/src/net/mosstest/scripting/LiquidNode.java index a7d5c47..657f43c 100644 --- a/src/net/mosstest/scripting/LiquidNode.java +++ b/src/net/mosstest/scripting/LiquidNode.java @@ -1,15 +1,15 @@ -package net.mosstest.scripting; - - -public class LiquidNode extends MapNode { - public final LiquidNodeParams nodeParams; - public LiquidNode[] liquidLevels = new LiquidNode[8]; - public int level; - public LiquidNode(LiquidNodeParams nodeparams, String texture, - String nodeName, String userFacingName, int lightEmission) { - super(nodeparams, texture, nodeName, userFacingName, lightEmission); - this.nodeParams = nodeparams; - - } - -} +package net.mosstest.scripting; + + +public class LiquidNode extends MapNode { + public final LiquidNodeParams nodeParams; + public LiquidNode[] liquidLevels = new LiquidNode[8]; + public int level; + public LiquidNode(LiquidNodeParams nodeparams, String texture, + String nodeName, String userFacingName, int lightEmission) { + super(nodeparams, texture, nodeName, userFacingName, lightEmission); + this.nodeParams = nodeparams; + + } + +} diff --git a/src/net/mosstest/scripting/LiquidNodeParams.java b/src/net/mosstest/scripting/LiquidNodeParams.java index 55b5569..f635705 100644 --- a/src/net/mosstest/scripting/LiquidNodeParams.java +++ b/src/net/mosstest/scripting/LiquidNodeParams.java @@ -1,40 +1,40 @@ -package net.mosstest.scripting; - - -public interface LiquidNodeParams extends INodeParams { - - /** - * Calculates the liquid output from this liquid - * - * @param pos - * The NodePosition of the liquid's location. - * @return A double representing the flow rate, in a fully filled node in 1 - * second for 1.0 - */ - public double calcFlowRate(NodePosition pos); - - /** - * Calculate how quickly this liquid should disappear. For - * flowRate=drainRate the liquid will be effectively finite. - * - * @param pos - * @return - */ - public double calcDrainRate(NodePosition pos); - - /** - * Callback for liquid flow. - * - * @param pos - * Position. - */ - public void onLiquidFlow(NodePosition pos); - - /** - * Tell if a liquid area should fill with source(level 0) - * @param contacting Number of sources contacting. - * @return Boolean, true if it should. - */ - public boolean shouldFill(int contactingSources, int contactingFlowings); - -} +package net.mosstest.scripting; + + +public interface LiquidNodeParams extends INodeParams { + + /** + * Calculates the liquid output from this liquid + * + * @param pos + * The NodePosition of the liquid's location. + * @return A double representing the flow rate, in a fully filled node in 1 + * second for 1.0 + */ + public double calcFlowRate(NodePosition pos); + + /** + * Calculate how quickly this liquid should disappear. For + * flowRate=drainRate the liquid will be effectively finite. + * + * @param pos + * @return + */ + public double calcDrainRate(NodePosition pos); + + /** + * Callback for liquid flow. + * + * @param pos + * Position. + */ + public void onLiquidFlow(NodePosition pos); + + /** + * Tell if a liquid area should fill with source(level 0) + * @param contacting Number of sources contacting. + * @return Boolean, true if it should. + */ + public boolean shouldFill(int contactingSources, int contactingFlowings); + +} diff --git a/src/net/mosstest/scripting/LiquidSourceNodeParams.java b/src/net/mosstest/scripting/LiquidSourceNodeParams.java index e0fb80d..353619c 100644 --- a/src/net/mosstest/scripting/LiquidSourceNodeParams.java +++ b/src/net/mosstest/scripting/LiquidSourceNodeParams.java @@ -1,68 +1,68 @@ -package net.mosstest.scripting; - - -public class LiquidSourceNodeParams extends DefaultNodeParams implements - LiquidNodeParams { - - @Override - public double calcFlowRate(NodePosition pos) { - return 1; - } - - @Override - public void onLiquidFlow(NodePosition pos) { - // pass - } - - @Override - public double calcDrainRate(NodePosition pos) { - return 0; - } - - @Override - public boolean shouldFill(int contacting, int flowing) { - // TODO Auto-generated method stub - return false; - } - - @Override - public double jumpOffHeight(Player player) { - return 1.125; - } - - @Override - public double calcWalkSpeed(Player player) { - return 0.6; - } - - @Override - public double calcSprintSpeed(Player player) { - return 0.8; - } - - @Override - public double calcSinkIn(Player player, double fallheight) { - return 0.4; - } - - @Override - public double calcSinkEscape(Player player, double fallheight) { - return 1; - } - - @Override - public double calcBounceHeight(Player player, double fallheight) { - return 0; - } - - @Override - public double calcFallDamage(Player player, double height) { - return 0; - } - - @Override - public boolean shouldContinueFall(Player player, double height) { - return false; - } - -} +package net.mosstest.scripting; + + +public class LiquidSourceNodeParams extends DefaultNodeParams implements + LiquidNodeParams { + + @Override + public double calcFlowRate(NodePosition pos) { + return 1; + } + + @Override + public void onLiquidFlow(NodePosition pos) { + // pass + } + + @Override + public double calcDrainRate(NodePosition pos) { + return 0; + } + + @Override + public boolean shouldFill(int contacting, int flowing) { + // TODO Auto-generated method stub + return false; + } + + @Override + public double jumpOffHeight(Player player) { + return 1.125; + } + + @Override + public double calcWalkSpeed(Player player) { + return 0.6; + } + + @Override + public double calcSprintSpeed(Player player) { + return 0.8; + } + + @Override + public double calcSinkIn(Player player, double fallheight) { + return 0.4; + } + + @Override + public double calcSinkEscape(Player player, double fallheight) { + return 1; + } + + @Override + public double calcBounceHeight(Player player, double fallheight) { + return 0; + } + + @Override + public double calcFallDamage(Player player, double height) { + return 0; + } + + @Override + public boolean shouldContinueFall(Player player, double height) { + return false; + } + +} diff --git a/src/net/mosstest/scripting/MapNode.java b/src/net/mosstest/scripting/MapNode.java index a9e515b..7757af2 100644 --- a/src/net/mosstest/scripting/MapNode.java +++ b/src/net/mosstest/scripting/MapNode.java @@ -1,132 +1,132 @@ -package net.mosstest.scripting; - -import net.mosstest.servercore.ItemManager; - -public class MapNode { - private short nodeId = 0; - public final transient INodeParams nodeparams; - public final transient String texture; - public String nodeName; - public String userFacingName; - public int lightEmission; - public MossItem dropItem; - public boolean isBuildableTo = true; - public DrawType drawType = DrawType.DRAW_BLOCK; - public float boxOriginX = 0, boxOriginY = 0, boxOriginZ = 0; - /** - * Each of these is 0.5 for the unit box, since each vertex is +/-0.5 from - * the origin in each dimension. - */ - public float lengthX = 0.5f, lengthY = 0.5f, lengthZ = 0.5f; - - public MapNode(INodeParams nodeparams, String texture, String nodeName, - String userFacingName, int lightEmission) { - this.nodeparams = nodeparams; - this.texture = texture; - this.nodeName = nodeName; - - this.userFacingName = userFacingName; - this.lightEmission = lightEmission; - this.dropItem = ItemManager.getForNode(this); - - } - - public void setByBounds(float x1, float x2, float y1, float y2, float z1, - float z2) { - this.boxOriginX = (x1 + x2) / 2; - this.boxOriginY = (y1 + y2) / 2; - this.boxOriginZ = (z1 + z2) / 2; - this.lengthX = Math.abs(x2 - x1); - this.lengthY = Math.abs(y2 - y1); - this.lengthZ = Math.abs(z2 - z1); - } - - public void setBySize(float originX, float originY, float originZ, - float lengthX, float lengthY, float lengthZ) { - this.boxOriginX = originX; - this.boxOriginY = originY; - this.boxOriginZ = originZ; - this.lengthX = lengthX; - this.lengthY = lengthY; - this.lengthZ = lengthZ; - } - - public MapNode(String textures, String nodeName, String userFacingName, - int lightEmission) { - this.nodeparams = new DefaultNodeParams(); - this.texture = textures; - - this.nodeName = nodeName; - this.userFacingName = userFacingName; - this.lightEmission = lightEmission; - this.dropItem = ItemManager.getForNode(this); - } - - public short getNodeId() { - return this.nodeId; - } - - /** - * Sets node ID. Scripts should not call this except under special - * circumstances. - * - * @param nodeId - */ - public void setNodeId(short nodeId) { - this.nodeId = nodeId; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + this.nodeId; - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (!(obj instanceof MapNode)) { - return false; - } - MapNode other = (MapNode) obj; - if (this.nodeId != other.nodeId) { - return false; - } - return true; - } - - protected MapNode() { - this.texture = null; - this.nodeparams = null; - } - - public enum DrawType { - /** - * Standard appearance for blocks - */ - DRAW_BLOCK, - /** - * Drawtype for liquids - */ - DRAW_LIQUID, - /** - * Drawtype for plantlike materials. In this draw, two planes with the - * item texture(which should be symmetrical for this) are drawn - * intersecting in an X-pattern. - */ - DRAW_PLANTLIKE, - - /** - * Do not draw the node at all. - */ - DRAW_NONE - } - -} +package net.mosstest.scripting; + +import net.mosstest.servercore.ItemManager; + +public class MapNode { + private short nodeId = 0; + public final transient INodeParams nodeparams; + public final transient String texture; + public String nodeName; + public String userFacingName; + public int lightEmission; + public MossItem dropItem; + public boolean isBuildableTo = true; + public DrawType drawType = DrawType.DRAW_BLOCK; + public float boxOriginX = 0, boxOriginY = 0, boxOriginZ = 0; + /** + * Each of these is 0.5 for the unit box, since each vertex is +/-0.5 from + * the origin in each dimension. + */ + public float lengthX = 0.5f, lengthY = 0.5f, lengthZ = 0.5f; + + public MapNode(INodeParams nodeparams, String texture, String nodeName, + String userFacingName, int lightEmission) { + this.nodeparams = nodeparams; + this.texture = texture; + this.nodeName = nodeName; + + this.userFacingName = userFacingName; + this.lightEmission = lightEmission; + this.dropItem = ItemManager.getForNode(this); + + } + + public void setByBounds(float x1, float x2, float y1, float y2, float z1, + float z2) { + this.boxOriginX = (x1 + x2) / 2; + this.boxOriginY = (y1 + y2) / 2; + this.boxOriginZ = (z1 + z2) / 2; + this.lengthX = Math.abs(x2 - x1); + this.lengthY = Math.abs(y2 - y1); + this.lengthZ = Math.abs(z2 - z1); + } + + public void setBySize(float originX, float originY, float originZ, + float lengthX, float lengthY, float lengthZ) { + this.boxOriginX = originX; + this.boxOriginY = originY; + this.boxOriginZ = originZ; + this.lengthX = lengthX; + this.lengthY = lengthY; + this.lengthZ = lengthZ; + } + + public MapNode(String textures, String nodeName, String userFacingName, + int lightEmission) { + this.nodeparams = new DefaultNodeParams(); + this.texture = textures; + + this.nodeName = nodeName; + this.userFacingName = userFacingName; + this.lightEmission = lightEmission; + this.dropItem = ItemManager.getForNode(this); + } + + public short getNodeId() { + return this.nodeId; + } + + /** + * Sets node ID. Scripts should not call this except under special + * circumstances. + * + * @param nodeId + */ + public void setNodeId(short nodeId) { + this.nodeId = nodeId; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + this.nodeId; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof MapNode)) { + return false; + } + MapNode other = (MapNode) obj; + if (this.nodeId != other.nodeId) { + return false; + } + return true; + } + + protected MapNode() { + this.texture = null; + this.nodeparams = null; + } + + public enum DrawType { + /** + * Standard appearance for blocks + */ + DRAW_BLOCK, + /** + * Drawtype for liquids + */ + DRAW_LIQUID, + /** + * Drawtype for plantlike materials. In this draw, two planes with the + * item texture(which should be symmetrical for this) are drawn + * intersecting in an X-pattern. + */ + DRAW_PLANTLIKE, + + /** + * Do not draw the node at all. + */ + DRAW_NONE + } + +} diff --git a/src/net/mosstest/scripting/MossEvent.java b/src/net/mosstest/scripting/MossEvent.java index cd0feb6..e1759e5 100644 --- a/src/net/mosstest/scripting/MossEvent.java +++ b/src/net/mosstest/scripting/MossEvent.java @@ -1,37 +1,37 @@ -package net.mosstest.scripting; - -import net.mosstest.servercore.ScriptSandboxBorderToken; - -public class MossEvent { - public MossEvent(EvtType type, Player actor, NodePosition pos, MapNode nodeBefore, MapNode nodeAfter, - Entity recvEntity, MossFormspec fspec, MossInventoryAction action, double damage, - String initiatingMessage, ScriptSandboxBorderToken tok) { - if (!(tok instanceof ScriptSandboxBorderToken) || tok == null) - throw new SecurityException("Attempt to access controlled resources in the script DMZ."); - this.type = type; - this.actor = actor; - this.pos=pos; - this.nodeBefore = nodeBefore; - this.nodeAfter = nodeAfter; - this.recvEntity = recvEntity; - this.fspec = fspec; - this.damage=damage; - this.action = action; - this.initiatingMessage = initiatingMessage; - } - - public enum EvtType { - EVT_DIEPLAYER, EVT_DIGNODE, EVT_GENERATE, EVT_JOINPLAYER, EVT_QUITPLAYER, EVT_NEWPLAYER, EVT_PLACENODE, EVT_FSPEC_OPEN, EVT_FSPEC_SUBMIT, EVT_FSPEC_INVACTION, EVT_THREADSTOP, EVT_ENTITY_PUNCH, EVT_ENTITY_DEATH, EVT_CHATMESSAGE, EVT_SHUTDOWN, EVT_CHATCOMMAND, EVT_NODEMOVE, EVT_PLAYERDAMAGE - } - - public final MossEvent.EvtType type; - public final Player actor; // Player no longer extends entity - public final NodePosition pos; - public final MapNode nodeBefore; - public final MapNode nodeAfter; - public final Entity recvEntity; - public final double damage; - public final MossFormspec fspec; - public final MossInventoryAction action; - public final String initiatingMessage; -} +package net.mosstest.scripting; + +import net.mosstest.servercore.ScriptSandboxBorderToken; + +public class MossEvent { + public MossEvent(EvtType type, Player actor, NodePosition pos, MapNode nodeBefore, MapNode nodeAfter, + Entity recvEntity, MossFormspec fspec, MossInventoryAction action, double damage, + String initiatingMessage, ScriptSandboxBorderToken tok) { + if (!(tok instanceof ScriptSandboxBorderToken) || tok == null) + throw new SecurityException("Attempt to access controlled resources in the script DMZ."); + this.type = type; + this.actor = actor; + this.pos=pos; + this.nodeBefore = nodeBefore; + this.nodeAfter = nodeAfter; + this.recvEntity = recvEntity; + this.fspec = fspec; + this.damage=damage; + this.action = action; + this.initiatingMessage = initiatingMessage; + } + + public enum EvtType { + EVT_DIEPLAYER, EVT_DIGNODE, EVT_GENERATE, EVT_JOINPLAYER, EVT_QUITPLAYER, EVT_NEWPLAYER, EVT_PLACENODE, EVT_FSPEC_OPEN, EVT_FSPEC_SUBMIT, EVT_FSPEC_INVACTION, EVT_THREADSTOP, EVT_ENTITY_PUNCH, EVT_ENTITY_DEATH, EVT_CHATMESSAGE, EVT_SHUTDOWN, EVT_CHATCOMMAND, EVT_NODEMOVE, EVT_PLAYERDAMAGE + } + + public final MossEvent.EvtType type; + public final Player actor; // Player no longer extends entity + public final NodePosition pos; + public final MapNode nodeBefore; + public final MapNode nodeAfter; + public final Entity recvEntity; + public final double damage; + public final MossFormspec fspec; + public final MossInventoryAction action; + public final String initiatingMessage; +} diff --git a/src/net/mosstest/scripting/MossEventHandler.java b/src/net/mosstest/scripting/MossEventHandler.java index 94936a1..832c578 100644 --- a/src/net/mosstest/scripting/MossEventHandler.java +++ b/src/net/mosstest/scripting/MossEventHandler.java @@ -1,14 +1,14 @@ -package net.mosstest.scripting; - -public interface MossEventHandler { - /** - * Process an event - * - * @param myEvent - * The event - * @return `true` to skip all future handlers for this event, false to run - * the next handler. - * @throws MossScriptException - */ - boolean processEvent(MossEvent myEvent) throws MossScriptException; +package net.mosstest.scripting; + +public interface MossEventHandler { + /** + * Process an event + * + * @param myEvent + * The event + * @return `true` to skip all future handlers for this event, false to run + * the next handler. + * @throws MossScriptException + */ + boolean processEvent(MossEvent myEvent) throws MossScriptException; } \ No newline at end of file diff --git a/src/net/mosstest/scripting/MossFormspec.java b/src/net/mosstest/scripting/MossFormspec.java index b3b545e..254a403 100644 --- a/src/net/mosstest/scripting/MossFormspec.java +++ b/src/net/mosstest/scripting/MossFormspec.java @@ -1,9 +1,9 @@ -/** - * TODO - */ -package net.mosstest.scripting; - - -public class MossFormspec { - -} +/** + * TODO + */ +package net.mosstest.scripting; + + +public class MossFormspec { + +} diff --git a/src/net/mosstest/scripting/MossInventory.java b/src/net/mosstest/scripting/MossInventory.java index 1d28e91..0433e76 100644 --- a/src/net/mosstest/scripting/MossInventory.java +++ b/src/net/mosstest/scripting/MossInventory.java @@ -1,36 +1,36 @@ -package net.mosstest.scripting; - -public class MossInventory { - final int maxStackSize; - final MossItem.Stack[][] stacks; - - public MossInventory(int maxStackSize, int rows, int cols) { - this.maxStackSize = maxStackSize; - stacks = new MossItem.Stack[rows][cols]; - } - - public synchronized double addItem(MossItem.Stack stack) { - double added = 0; - double maxAddable = stack.item.mayStack ? maxStackSize : 1; - for (int row = 0; row < stacks.length; row++) { - for (int col = 0; col < stacks[row].length; col++) { - if (stacks[row][col] == null) { - double addedThisRound = Math.min(stack.amount, maxAddable); - added += addedThisRound; - stacks[row][col] = new MossItem.Stack(stack.item, addedThisRound); - } - else if (stacks[row][col].item.equals(stack.item)){ - double addedThisRound = Math.min(stack.amount, maxAddable-stacks[row][col].amount); - added += addedThisRound; - stacks[row][col].amount += addedThisRound; - } - if(added>=stack.amount) return added; - } - } - return added; - - } - - //TODO remove item - -} +package net.mosstest.scripting; + +public class MossInventory { + final int maxStackSize; + final MossItem.Stack[][] stacks; + + public MossInventory(int maxStackSize, int rows, int cols) { + this.maxStackSize = maxStackSize; + stacks = new MossItem.Stack[rows][cols]; + } + + public synchronized double addItem(MossItem.Stack stack) { + double added = 0; + double maxAddable = stack.item.mayStack ? maxStackSize : 1; + for (int row = 0; row < stacks.length; row++) { + for (int col = 0; col < stacks[row].length; col++) { + if (stacks[row][col] == null) { + double addedThisRound = Math.min(stack.amount, maxAddable); + added += addedThisRound; + stacks[row][col] = new MossItem.Stack(stack.item, addedThisRound); + } + else if (stacks[row][col].item.equals(stack.item)){ + double addedThisRound = Math.min(stack.amount, maxAddable-stacks[row][col].amount); + added += addedThisRound; + stacks[row][col].amount += addedThisRound; + } + if(added>=stack.amount) return added; + } + } + return added; + + } + + //TODO remove item + +} diff --git a/src/net/mosstest/scripting/MossInventoryAction.java b/src/net/mosstest/scripting/MossInventoryAction.java index b1b89ab..1e166fe 100644 --- a/src/net/mosstest/scripting/MossInventoryAction.java +++ b/src/net/mosstest/scripting/MossInventoryAction.java @@ -1,12 +1,12 @@ -package net.mosstest.scripting; - - -public class MossInventoryAction { - MossInventory from; - MossInventory to; - MossItem.Stack moved; - public void acceptAsStated() { - // TODO Auto-generated method stub - - } -} +package net.mosstest.scripting; + + +public class MossInventoryAction { + MossInventory from; + MossInventory to; + MossItem.Stack moved; + public void acceptAsStated() { + // TODO Auto-generated method stub + + } +} diff --git a/src/net/mosstest/scripting/MossItem.java b/src/net/mosstest/scripting/MossItem.java index 59ddf52..eca19da 100644 --- a/src/net/mosstest/scripting/MossItem.java +++ b/src/net/mosstest/scripting/MossItem.java @@ -1,62 +1,62 @@ -package net.mosstest.scripting; - -import net.mosstest.servercore.MossFile; - -public class MossItem { - public MossItem(MossFile invTex, MossFile wieldTex, double invWeight, - boolean mayStack, String displayName, String technicalName) { - this.invTex = invTex; - this.wieldTex = wieldTex; - this.invWeight = invWeight; - this.mayStack = mayStack; - this.displayName = displayName; - this.technicalName = technicalName; - } - - final MossFile invTex; - final MossFile wieldTex; - final double invWeight; - boolean mayStack; - final String displayName; - final String technicalName; - - public static class Stack { - public Stack(MossItem item, double amount) { - this.item = item; - this.amount = amount; - } - final MossItem item; - /** - * If amount is not an integer then it is a stack with wear. Once zero - * it is no longer a stack. - */ - double amount; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result - + ((technicalName == null) ? 0 : technicalName.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - MossItem other = (MossItem) obj; - if (technicalName == null) { - if (other.technicalName != null) - return false; - } else if (!technicalName.equals(other.technicalName)) - return false; - return true; - } - -} +package net.mosstest.scripting; + +import net.mosstest.servercore.MossFile; + +public class MossItem { + public MossItem(MossFile invTex, MossFile wieldTex, double invWeight, + boolean mayStack, String displayName, String technicalName) { + this.invTex = invTex; + this.wieldTex = wieldTex; + this.invWeight = invWeight; + this.mayStack = mayStack; + this.displayName = displayName; + this.technicalName = technicalName; + } + + final MossFile invTex; + final MossFile wieldTex; + final double invWeight; + boolean mayStack; + final String displayName; + final String technicalName; + + public static class Stack { + public Stack(MossItem item, double amount) { + this.item = item; + this.amount = amount; + } + final MossItem item; + /** + * If amount is not an integer then it is a stack with wear. Once zero + * it is no longer a stack. + */ + double amount; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + + ((technicalName == null) ? 0 : technicalName.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + MossItem other = (MossItem) obj; + if (technicalName == null) { + if (other.technicalName != null) + return false; + } else if (!technicalName.equals(other.technicalName)) + return false; + return true; + } + +} diff --git a/src/net/mosstest/scripting/MossScriptEnv.java b/src/net/mosstest/scripting/MossScriptEnv.java index 95c6d09..8a9c97b 100644 --- a/src/net/mosstest/scripting/MossScriptEnv.java +++ b/src/net/mosstest/scripting/MossScriptEnv.java @@ -1,629 +1,629 @@ -package net.mosstest.scripting; - -import java.util.ArrayList; -import java.util.EnumMap; - -import org.iq80.leveldb.DB; - -import net.mosstest.scripting.MossItem.Stack; -import net.mosstest.servercore.FuturesProcessor; -import net.mosstest.servercore.MapGeneratorException; -import net.mosstest.servercore.MossWorldLoadException; -import net.mosstest.servercore.NodeCache; -import net.mosstest.servercore.NodeManager; -import net.mosstest.servercore.ScriptSandboxBorderToken; - -/** - * - * This class is used by scripts and script-facing portions of Mosstest. Methods - * restricted to be called from trusted Java-side shall pass a - * {@link ScriptSandboxBorderToken}. Each event fired will run in the thread - * pool. All requests via this API need not concern themselves with threading as - * everything is handled by Mosstest itself. - * - * The event handlers called are the ones defined via this class's registerOnFoo - * methods, followed by any handlers defined in an instance of NodeParams via an - * anonymous inner class, and finally with the default handler. - * - * The order in which handlers registered here are called is undefined due to - * the undefined order of scripts being loaded. Generally, this is planned to - * occur in an order based on the SHA512 hash of the script. Comments with dummy - * information may be used by the script author to attempt to set the position - * of a script in the execution order via manipulating the hash. Handlers of the - * same types within the same script are guaranteed to be called in order. - * - * An event handler may interrupt handling of the event so that no further event - * handlers nor the default are ever called, by throwing an instance of - * {@link EventProcessingCompletedSignal}. - * - * @author rarkenin - * @since 0.0 - * @version 0.0 - */ -public class MossScriptEnv { - - /* - * IMPORTANT, IMPORTANT, IMPORTANT. VERY IMPORTANT. THIS CLASS IS THE ONLY - * CLASS THAT SCRIPTS CAN ACCESS. MAKE ALL FIELDS AND METHODS PRIVATE UNLESS - * IT IS INTENDED TO FACE UNTRUSTED SCRIPTS. - */ - private EnumMap> registeredScriptEvents = new EnumMap<>( - MossEvent.EvtType.class); - private ScriptableDatabase db; - private NodeCache nc; - private FuturesProcessor fp; - private NodeManager nm; - - /** - * Registers an event hander to fire on a player death. This will be run in - * the event processor thread pool. The default handler shall respawn the - * player at the spawnpoint and set health to default. - * - * @param r - * The event handler to register. - */ - void registerOnDieplayer(MossEventHandler r) { - this.registeredScriptEvents.get(MossEvent.EvtType.EVT_DIEPLAYER).add(r); - } - - /** - * Registers an event hander to fire on a node being dug. This will be run - * in the event processor thread pool. The default handler will remove the - * node and add its drop to the inventory of the digger if possible. - * - * @param r - * The event handler to register. - */ - void registerOnDignode(MossEventHandler r) { - this.registeredScriptEvents.get(MossEvent.EvtType.EVT_DIGNODE).add(r); - } - - /** - * Registers an event hander to fire on map generation. This will be run in - * the event processor thread pool before the default map generator. The - * default map generator shall create the chunk to be a recreation of a - * landscape. - * - * @param r - * The event handler to register. - */ - void registerOnGenerate(MossEventHandler r) { - this.registeredScriptEvents.get(MossEvent.EvtType.EVT_GENERATE).add(r); - } - - /** - * Registers an event hander to fire on a player joining. This will be run - * in the event processor thread pool. The default handler will be called - * before any script-specified handlers. - * {@link EventProcessingCompletedSignal} will still bypass future handlers - * but not default ones. The default handler initializes player data in - * memory from the database. - * - * @param r - * The event handler to register. - */ - void registerOnJoinplayer(MossEventHandler r) { - this.registeredScriptEvents.get(MossEvent.EvtType.EVT_JOINPLAYER) - .add(r); - } - - /** - * Registers an event hander to fire on a player quitting. This will be run - * in the event processor thread pool. - * {@link EventProcessingCompletedSignal} will bypass future handlers but - * the default handler will be run even if the signal is thrown. The default - * handler will clean up the player in memory. - * - * @param r - * The event handler to register. - */ - void registerOnQuitplayer(MossEventHandler r) { - this.registeredScriptEvents.get(MossEvent.EvtType.EVT_QUITPLAYER) - .add(r); - } - - /** - * Registers an event hander to fire on a new player registering and - * entering. This will be run in the event processor thread pool. The - * default handler will be called before any script-specified handlers. - * {@link EventProcessingCompletedSignal} will still bypass future handlers - * but not default ones. The default handler initializes player data in - * memory and the database. No items are given by default. - * - * @param r - * The event handler to register. - */ - void registerOnNewplayer(MossEventHandler r) { - this.registeredScriptEvents.get(MossEvent.EvtType.EVT_NEWPLAYER).add(r); - } - - /** - * Registers an event hander to fire on a node being placed. This will be - * run in the event processor thread pool. The default handler removes the - * item from the placer's inventory and puts down a node or entity. - * - * @param r - * The event handler to register. - */ - void registerOnPlacenode(MossEventHandler r) { - this.registeredScriptEvents.get(MossEvent.EvtType.EVT_PLACENODE).add(r); - } - - /** - * Registers an event hander to fire on a formspec being opened. This will - * be run in the event processor thread pool. A formspec is an XML-based 2D - * script-specified UI. The default handler is defined in the formspec. This - * is a way of catch-all for formspecs and shouldn't be used for - * implementing one formspec. - * - * @param r - * The event handler to register. - */ - void registerOnFspecOpen(MossEventHandler r) { - this.registeredScriptEvents.get(MossEvent.EvtType.EVT_FSPEC_OPEN) - .add(r); - } - - /** - * Registers an event hander to fire on a formspec being submitted. This - * will be run in the event processor thread pool. This is a catch-all - * method and the default handler created in the formspec should be used for - * implementing behavior. - * - * @param r - * The event handler to register. - */ - void registerOnFspecSubmit(MossEventHandler r) { - this.registeredScriptEvents.get(MossEvent.EvtType.EVT_FSPEC_SUBMIT) - .add(r); - } - - /** - * Registers an event hander to fire on an inventory action. This will be - * run in the event processor thread pool. The default handler performs the - * action as-is. - * - * @param r - * The event handler to register. - */ - void registerOnInvAction(MossEventHandler r) { - this.registeredScriptEvents.get(MossEvent.EvtType.EVT_FSPEC_INVACTION) - .add(r); - } - - /** - * Registers an event hander to fire on an entity punch. This will be run in - * the event processor thread pool. The default handler performs no action. - * - * @param r - * The event handler to register. - */ - void registerOnEntityPunch(MossEventHandler r) { - this.registeredScriptEvents.get(MossEvent.EvtType.EVT_ENTITY_PUNCH) - .add(r); - } - - /** - * Registers an event hander to fire on a player taking damage. This will be - * run in the event processor thread pool. The default handler causes the - * player to take the damage. - * - * @param r - * The event handler to register. - */ - void registerOnPlayerDamage(MossEventHandler r) { - this.registeredScriptEvents.get(MossEvent.EvtType.EVT_PLAYERDAMAGE) - .add(r); - } - - /** - * Registers an event hander to fire on entity death. This will be run in - * the event processor thread pool. The default handler performs no action - * aside from the removal of said entity. - * - * @param r - * The event handler to register. - */ - void registerOnEntityDeath(MossEventHandler r) { - this.registeredScriptEvents.get(MossEvent.EvtType.EVT_ENTITY_DEATH) - .add(r); - } - - /** - * Registers an event hander to fire on a chat message from a client. This - * will be run in the event processor thread pool. The default handler sends - * the message to all players. - * - * @param r - * The event handler to register. - */ - void registerOnChatMessage(MossEventHandler r) { - this.registeredScriptEvents.get(MossEvent.EvtType.EVT_CHATMESSAGE).add( - r); - } - - /** - * Registers an event hander to fire on server shutdown. This will be run in - * the event processor thread pool. The default handler calls internal - * shutdown functions and cannot be bypassed. - * - * Note that in the case of an error causing shutdown of the server the - * script API may be unavailable or in an inconsistent state so shutdown - * actions cannot be guaranteed to run. They will always be run on a clean - * shutdown. - * - * @param r - * The event handler to register. - */ - void registerOnShutdown(MossEventHandler r) { - this.registeredScriptEvents.get(MossEvent.EvtType.EVT_SHUTDOWN).add(r); - } - - /** - * Registers an event hander to fire on a chat command. This will be run in - * the event processor thread pool. The default handler will display an - * invalid command message. Handlers should always override the - * default except in special circumstances. - * - * @param r - * The event handler to register. - */ - void registerOnChatCommand(MossEventHandler r) { - this.registeredScriptEvents.get(MossEvent.EvtType.EVT_CHATCOMMAND).add( - r); - } - - /** - * Registers an event hander to fire on a node move. This will be run in the - * event processor thread pool. The default handler moves the node. - * - * @param r - * The event handler to register. - */ - void registerOnNodeMove(MossEventHandler r) { - this.registeredScriptEvents.get(MossEvent.EvtType.EVT_NODEMOVE).add(r); - } - - /** - * Gets handlers for an event type in the form of an {@link ArrayList} for - * Mosstest internal use. At this time due to limited identification of each - * event there is no support for scripts accessing this directly. - * - * @param type - * A {@link MossEvent.EvtType} enumerable value specifying the - * event type to retrieve. - * @param tok - * A {@link ScriptSandboxBorderToken} to be used for ensuring - * that scripts cannot call this method. - * @return An {@link ArrayList} of {@link MossEventHandler} objects. - * @throws SecurityException - */ - public ArrayList getHandlers(MossEvent.EvtType type, - ScriptSandboxBorderToken tok) throws SecurityException { - if (!(tok instanceof ScriptSandboxBorderToken) || tok == null) - throw new SecurityException( - "Attempt to access controlled resources in the script DMZ."); //$NON-NLS-1$ - return this.registeredScriptEvents.get(type); - } - - /** - * Sends a chat message to a player. - * - * @param recipient - * A {@link Player} object representing the recipient. A Player - * object may be constructed with - * {@link MossScriptEnv#getPlayerByName(String)}. - * @param from - * A player object representing the sender. A Player object may - * be constructed with - * {@link MossScriptEnv#getPlayerByName(String)}. If null a - * message is sent showing to users as having been sent by the - * server with the prefix [*] Server: - * @param message - * A string representing the message that shall be sent to the - * specified recipient. - */ - public void sendChatMessage(Player recipient, Player from, String message) { - // TODO - } - - /** - * Sends a chat message to all players. - * - * @param from - * A player object representing the sender. A Player object may - * be constructed with - * {@link MossScriptEnv#getPlayerByName(String)}. If null a - * message is sent showing to users as having been sent by the - * server with the prefix [*] Server: - * @param message - * A string representing the message that shall be sent to the - * specified recipient. - */ - public void sendChatAll(Player from, String message) { - // TODO - } - - /** - * Sets the health on an entity or player. - * - * @param ent - * The entity to set health on. - * @param health - * An integer representing the amount of health to set, from 0 to - * {@link Entity#maxHealth()}. - */ - public void setHp(Player p, int health) { - // TODO Once we have players doing stuff - } - - /** - * Damages the tool of a player corresponding to a dig. The player's - * currently selected tool is damaged. - * - * @param actor - * The player that is digging a node. - * @param nd - * The node dug. - * @throws MossScriptException - * Thrown if the current tool cannot be used to dig the node. - */ - public void damageTool(Player actor, MapNode nd) throws MossScriptException { - // TODO Auto-generated method stub - - } - - /** - * Gives a player an item. The item stack will be added to the player's - * default inventory, adding to the first available partial stack. If no - * partial stacks are available the item is added to the first open slot in - * the inventory. - * - * @param player - * @param item - * @return True if the item could be added, false if the item could not be - * added due to insufficient space. - */ - public boolean givePlayer(Player player, MossItem.Stack item) { - return false; - } - - /** - * Sets a node of the world to a given type. This cannot be called on a - * NodePosition with an existing solid node; use - * {@link #removeNode(NodePosition)} first. - * - * @param pos - * The position at which to set a node. - * @param node - * The node to place at that position. - * @throws MapGeneratorException - */ - public void setNode(NodePosition pos, MapNode node) { - MapChunk chk = this.nc.getChunkNoGenerate(pos.chunk); - if (chk == null) - return; - chk.setNode(pos.xl, pos.yl, pos.zl, node.getNodeId()); - } - - /** - * Removes a node, setting it to air. This may be called on a NodePosition - * with an existing solid node. - * - * @param pos - * The NodePosition at which to remove the node. - * @throws MapGeneratorException - */ - public void removeNode(NodePosition pos) { - MapChunk chk = this.nc.getChunkNoGenerate(pos.chunk); - if (chk == null) - return; - chk.setNode(pos.xl, pos.yl, pos.zl, this.nm.getNode("mg:air") - .getNodeId()); - this.nc.setChunk(pos.chunk, chk); - } - - /** - * Get the MapNode at a certain location - * - * @param pos - * The location at which to get the node - * @return - * @throws MapGeneratorException - */ - public MapNode getNode(NodePosition pos) throws MapGeneratorException { - return this.nm.getNode((short) this.nc.getChunk(pos.chunk).getNodeId( - pos.xl, pos.yl, pos.zl)); - - } - - /** - * Register a new MapNode in the node manager. - * - * @param sysname - * The name such as default:dirt to set. The prefix mg: is used - * for mapgen-specific nodes, and should be done by creating a - * node with a different prefix and aliasing mg:foo to it. - * @param userFacingName - * The name to display in the UI, such as Dirt or Iron Ore - * @param params - * An implementation of the {@link LiquidNodeParams} interface - * detailing the action of the node. - * {@link DefaultLiquidNodeParams} is a default that is - * applicable to most liquids with near-water viscosity. - * @param textures - * A string stating the filename of the textures image. - * @param light - * The amount of light from 0 to 255 to be emitted. - * @return The MapNode object that has been created and added to the - * manager. - * @throws MossWorldLoadException - * If an exception occurs during the execution of the - * registering. - */ - public MapNode registerNode(String sysname, String userFacingName, - INodeParams params, String textures, boolean isLiquid, int light) - throws MossWorldLoadException { - MapNode nd = new MapNode(params, textures, sysname, userFacingName, - light); - this.nm.putNode(nd); - return nd; - } - - /** - * Register a new MapNode in the node manager. - * - * @param sysname - * The name such as default:lava to set. The prefix mg: is used - * for mapgen-specific nodes, and should be done by creating a - * node with a different prefix and aliasing mg:foo to it. - * @param userFacingName - * The name to display in the UI, such as Lava or Iron Ore - * @param params - * An implementation of the {@link INodeParams} interface - * detailing the action of the node. {@link AirNodeParams} and - * {@link DefaultNodeParams} are valid for air-like(display only) - * and standard solid blocks, respectively. - * @param textures - * A string stating the filename of the textures image. - * @param light - * The amount of light from 0 to 255 to be emitted. - * @return The MapNode object that has been created and added to the - * manager. - * @throws MossWorldLoadException - * If an exception occurs during the execution of the - * registering. - */ - public LiquidNode registerLiquid(String sysname, String userFacingName, - LiquidNodeParams params, LiquidNodeParams sourceParams, String textures, int light) - throws MossWorldLoadException { - LiquidNode nd = new LiquidNode(sourceParams, textures, sysname, userFacingName, - light); - this.nm.putNode(nd); - nd.level=0; - for (int i = 1; i < 8; i++) { - LiquidNode innerNd=new LiquidNode(params, textures, sysname+"$LEVEL$"+i, userFacingName, light); - innerNd.setByBounds(-.5f, .5f, -.5f, .5f, -.5f, (i/8f)-0.5f); - nd.liquidLevels[i]=innerNd; - innerNd.liquidLevels=nd.liquidLevels; - innerNd.level=i; - this.nm.putNode(innerNd); - } - nd.liquidLevels[0]=nd; - return nd; - } - - /** - * Registers a node alias. Since the map generator and scripts work via - * string names, registering an alias of mg:dirt to myscript:specialdirt - * will cause a mapgen that recognizes mg:dirt as a generated element to use - * specialdirt for that. - * - * @param alias - * The alias to create, i.e. mg:dirt - * @param dst - * The existing node to set as the alias target, i.e - * myscript:specialdirt. This element must already exist. - */ - public void registerNodeAlias(String alias, String dst) { - this.nm.putNodeAlias(alias, dst); - } - - /** - * Register a new MapNode in the node manager. - * - * @param sysname - * The name such as default:dirt to set. The prefix mg: is used - * for mapgen-specific nodes, and should be done by creating a - * node with a different prefix and aliasing mg:foo to it. - * @param userFacingName - * The name to display in the UI, such as Dirt or Iron Ore - * @param textures - * A string stating the filename of the textures image. - * @param light - * The amount of light from 0 to 255 to be emitted. - * @return The MapNode object that has been created and added to the - * manager. - * @throws MossWorldLoadException - * If an exception occurs during node registration. - */ - public MapNode registerNodeDefParams(String sysname, String userFacingName, - String textures, int light) throws MossWorldLoadException { - MapNode nd = new MapNode(new DefaultNodeParams(), textures, sysname, - userFacingName, light); - this.nm.putNode(nd); - return nd; - } - - /** - * Register a new liquid in the node manager. - * - * @param sysname - * The name such as default:lava to set. The prefix mg: is used - * for mapgen-specific nodes, and should be done by creating a - * node with a different prefix and aliasing mg:foo to it. - * @param userFacingName - * The name to display in the UI, such as Dirt or Iron Ore - * @param textures - * A string stating the filename of the textures image. - * @param light - * The amount of light from 0 to 255 to be emitted. - * @return The LiquidNode object that has been created and added to the - * manager. - * @throws MossWorldLoadException - * If an exception occurs during node registration. - */ - public LiquidNode registerLiquidDefParams(String sysname, - String userFacingName, String textures, int light) - throws MossWorldLoadException { - LiquidNode nd = new LiquidNode(new LiquidSourceNodeParams(), textures, sysname, userFacingName, - light); - this.nm.putNode(nd); - nd.level=0; - for (int i = 1; i < 8; i++) { - LiquidNode innerNd=new LiquidNode(new LiquidFlowingNodeParams(), textures, sysname+"$LEVEL$"+i, userFacingName, light); - innerNd.setByBounds(-.5f, .5f, -.5f, .5f, -.5f, (i/8f)-0.5f); - nd.liquidLevels[i]=innerNd; - innerNd.liquidLevels=nd.liquidLevels; - innerNd.level=i; - this.nm.putNode(innerNd); - } - nd.liquidLevels[0]=nd; - return nd; - } - - - - public MossInventory getInvByName(Player player, String name) { - return null; - } - - public MossInventory createInvByName(Player p, String name) { - return null; - } - - public Player getPlayerByName(String name) { - return null; - } - - public MapNode getNodeByName(String name) { - return null; - } - - public ScriptableDatabase getDb() { - return this.db; - } - - public MossScriptEnv(ScriptableDatabase db, NodeCache nc, - FuturesProcessor fp, NodeManager nm) { - this.db = db; - this.nc = nc; - this.fp = fp; - this.nm = nm; - } - - public FuturesProcessor getFuturesProcessor() { - return this.fp; - } - -} +package net.mosstest.scripting; + +import java.util.ArrayList; +import java.util.EnumMap; + +import org.iq80.leveldb.DB; + +import net.mosstest.scripting.MossItem.Stack; +import net.mosstest.servercore.FuturesProcessor; +import net.mosstest.servercore.MapGeneratorException; +import net.mosstest.servercore.MossWorldLoadException; +import net.mosstest.servercore.NodeCache; +import net.mosstest.servercore.NodeManager; +import net.mosstest.servercore.ScriptSandboxBorderToken; + +/** + * + * This class is used by scripts and script-facing portions of Mosstest. Methods + * restricted to be called from trusted Java-side shall pass a + * {@link ScriptSandboxBorderToken}. Each event fired will run in the thread + * pool. All requests via this API need not concern themselves with threading as + * everything is handled by Mosstest itself. + * + * The event handlers called are the ones defined via this class's registerOnFoo + * methods, followed by any handlers defined in an instance of NodeParams via an + * anonymous inner class, and finally with the default handler. + * + * The order in which handlers registered here are called is undefined due to + * the undefined order of scripts being loaded. Generally, this is planned to + * occur in an order based on the SHA512 hash of the script. Comments with dummy + * information may be used by the script author to attempt to set the position + * of a script in the execution order via manipulating the hash. Handlers of the + * same types within the same script are guaranteed to be called in order. + * + * An event handler may interrupt handling of the event so that no further event + * handlers nor the default are ever called, by throwing an instance of + * {@link EventProcessingCompletedSignal}. + * + * @author rarkenin + * @since 0.0 + * @version 0.0 + */ +public class MossScriptEnv { + + /* + * IMPORTANT, IMPORTANT, IMPORTANT. VERY IMPORTANT. THIS CLASS IS THE ONLY + * CLASS THAT SCRIPTS CAN ACCESS. MAKE ALL FIELDS AND METHODS PRIVATE UNLESS + * IT IS INTENDED TO FACE UNTRUSTED SCRIPTS. + */ + private EnumMap> registeredScriptEvents = new EnumMap<>( + MossEvent.EvtType.class); + private ScriptableDatabase db; + private NodeCache nc; + private FuturesProcessor fp; + private NodeManager nm; + + /** + * Registers an event hander to fire on a player death. This will be run in + * the event processor thread pool. The default handler shall respawn the + * player at the spawnpoint and set health to default. + * + * @param r + * The event handler to register. + */ + void registerOnDieplayer(MossEventHandler r) { + this.registeredScriptEvents.get(MossEvent.EvtType.EVT_DIEPLAYER).add(r); + } + + /** + * Registers an event hander to fire on a node being dug. This will be run + * in the event processor thread pool. The default handler will remove the + * node and add its drop to the inventory of the digger if possible. + * + * @param r + * The event handler to register. + */ + void registerOnDignode(MossEventHandler r) { + this.registeredScriptEvents.get(MossEvent.EvtType.EVT_DIGNODE).add(r); + } + + /** + * Registers an event hander to fire on map generation. This will be run in + * the event processor thread pool before the default map generator. The + * default map generator shall create the chunk to be a recreation of a + * landscape. + * + * @param r + * The event handler to register. + */ + void registerOnGenerate(MossEventHandler r) { + this.registeredScriptEvents.get(MossEvent.EvtType.EVT_GENERATE).add(r); + } + + /** + * Registers an event hander to fire on a player joining. This will be run + * in the event processor thread pool. The default handler will be called + * before any script-specified handlers. + * {@link EventProcessingCompletedSignal} will still bypass future handlers + * but not default ones. The default handler initializes player data in + * memory from the database. + * + * @param r + * The event handler to register. + */ + void registerOnJoinplayer(MossEventHandler r) { + this.registeredScriptEvents.get(MossEvent.EvtType.EVT_JOINPLAYER) + .add(r); + } + + /** + * Registers an event hander to fire on a player quitting. This will be run + * in the event processor thread pool. + * {@link EventProcessingCompletedSignal} will bypass future handlers but + * the default handler will be run even if the signal is thrown. The default + * handler will clean up the player in memory. + * + * @param r + * The event handler to register. + */ + void registerOnQuitplayer(MossEventHandler r) { + this.registeredScriptEvents.get(MossEvent.EvtType.EVT_QUITPLAYER) + .add(r); + } + + /** + * Registers an event hander to fire on a new player registering and + * entering. This will be run in the event processor thread pool. The + * default handler will be called before any script-specified handlers. + * {@link EventProcessingCompletedSignal} will still bypass future handlers + * but not default ones. The default handler initializes player data in + * memory and the database. No items are given by default. + * + * @param r + * The event handler to register. + */ + void registerOnNewplayer(MossEventHandler r) { + this.registeredScriptEvents.get(MossEvent.EvtType.EVT_NEWPLAYER).add(r); + } + + /** + * Registers an event hander to fire on a node being placed. This will be + * run in the event processor thread pool. The default handler removes the + * item from the placer's inventory and puts down a node or entity. + * + * @param r + * The event handler to register. + */ + void registerOnPlacenode(MossEventHandler r) { + this.registeredScriptEvents.get(MossEvent.EvtType.EVT_PLACENODE).add(r); + } + + /** + * Registers an event hander to fire on a formspec being opened. This will + * be run in the event processor thread pool. A formspec is an XML-based 2D + * script-specified UI. The default handler is defined in the formspec. This + * is a way of catch-all for formspecs and shouldn't be used for + * implementing one formspec. + * + * @param r + * The event handler to register. + */ + void registerOnFspecOpen(MossEventHandler r) { + this.registeredScriptEvents.get(MossEvent.EvtType.EVT_FSPEC_OPEN) + .add(r); + } + + /** + * Registers an event hander to fire on a formspec being submitted. This + * will be run in the event processor thread pool. This is a catch-all + * method and the default handler created in the formspec should be used for + * implementing behavior. + * + * @param r + * The event handler to register. + */ + void registerOnFspecSubmit(MossEventHandler r) { + this.registeredScriptEvents.get(MossEvent.EvtType.EVT_FSPEC_SUBMIT) + .add(r); + } + + /** + * Registers an event hander to fire on an inventory action. This will be + * run in the event processor thread pool. The default handler performs the + * action as-is. + * + * @param r + * The event handler to register. + */ + void registerOnInvAction(MossEventHandler r) { + this.registeredScriptEvents.get(MossEvent.EvtType.EVT_FSPEC_INVACTION) + .add(r); + } + + /** + * Registers an event hander to fire on an entity punch. This will be run in + * the event processor thread pool. The default handler performs no action. + * + * @param r + * The event handler to register. + */ + void registerOnEntityPunch(MossEventHandler r) { + this.registeredScriptEvents.get(MossEvent.EvtType.EVT_ENTITY_PUNCH) + .add(r); + } + + /** + * Registers an event hander to fire on a player taking damage. This will be + * run in the event processor thread pool. The default handler causes the + * player to take the damage. + * + * @param r + * The event handler to register. + */ + void registerOnPlayerDamage(MossEventHandler r) { + this.registeredScriptEvents.get(MossEvent.EvtType.EVT_PLAYERDAMAGE) + .add(r); + } + + /** + * Registers an event hander to fire on entity death. This will be run in + * the event processor thread pool. The default handler performs no action + * aside from the removal of said entity. + * + * @param r + * The event handler to register. + */ + void registerOnEntityDeath(MossEventHandler r) { + this.registeredScriptEvents.get(MossEvent.EvtType.EVT_ENTITY_DEATH) + .add(r); + } + + /** + * Registers an event hander to fire on a chat message from a client. This + * will be run in the event processor thread pool. The default handler sends + * the message to all players. + * + * @param r + * The event handler to register. + */ + void registerOnChatMessage(MossEventHandler r) { + this.registeredScriptEvents.get(MossEvent.EvtType.EVT_CHATMESSAGE).add( + r); + } + + /** + * Registers an event hander to fire on server shutdown. This will be run in + * the event processor thread pool. The default handler calls internal + * shutdown functions and cannot be bypassed. + * + * Note that in the case of an error causing shutdown of the server the + * script API may be unavailable or in an inconsistent state so shutdown + * actions cannot be guaranteed to run. They will always be run on a clean + * shutdown. + * + * @param r + * The event handler to register. + */ + void registerOnShutdown(MossEventHandler r) { + this.registeredScriptEvents.get(MossEvent.EvtType.EVT_SHUTDOWN).add(r); + } + + /** + * Registers an event hander to fire on a chat command. This will be run in + * the event processor thread pool. The default handler will display an + * invalid command message. Handlers should always override the + * default except in special circumstances. + * + * @param r + * The event handler to register. + */ + void registerOnChatCommand(MossEventHandler r) { + this.registeredScriptEvents.get(MossEvent.EvtType.EVT_CHATCOMMAND).add( + r); + } + + /** + * Registers an event hander to fire on a node move. This will be run in the + * event processor thread pool. The default handler moves the node. + * + * @param r + * The event handler to register. + */ + void registerOnNodeMove(MossEventHandler r) { + this.registeredScriptEvents.get(MossEvent.EvtType.EVT_NODEMOVE).add(r); + } + + /** + * Gets handlers for an event type in the form of an {@link ArrayList} for + * Mosstest internal use. At this time due to limited identification of each + * event there is no support for scripts accessing this directly. + * + * @param type + * A {@link MossEvent.EvtType} enumerable value specifying the + * event type to retrieve. + * @param tok + * A {@link ScriptSandboxBorderToken} to be used for ensuring + * that scripts cannot call this method. + * @return An {@link ArrayList} of {@link MossEventHandler} objects. + * @throws SecurityException + */ + public ArrayList getHandlers(MossEvent.EvtType type, + ScriptSandboxBorderToken tok) throws SecurityException { + if (!(tok instanceof ScriptSandboxBorderToken) || tok == null) + throw new SecurityException( + "Attempt to access controlled resources in the script DMZ."); //$NON-NLS-1$ + return this.registeredScriptEvents.get(type); + } + + /** + * Sends a chat message to a player. + * + * @param recipient + * A {@link Player} object representing the recipient. A Player + * object may be constructed with + * {@link MossScriptEnv#getPlayerByName(String)}. + * @param from + * A player object representing the sender. A Player object may + * be constructed with + * {@link MossScriptEnv#getPlayerByName(String)}. If null a + * message is sent showing to users as having been sent by the + * server with the prefix [*] Server: + * @param message + * A string representing the message that shall be sent to the + * specified recipient. + */ + public void sendChatMessage(Player recipient, Player from, String message) { + // TODO + } + + /** + * Sends a chat message to all players. + * + * @param from + * A player object representing the sender. A Player object may + * be constructed with + * {@link MossScriptEnv#getPlayerByName(String)}. If null a + * message is sent showing to users as having been sent by the + * server with the prefix [*] Server: + * @param message + * A string representing the message that shall be sent to the + * specified recipient. + */ + public void sendChatAll(Player from, String message) { + // TODO + } + + /** + * Sets the health on an entity or player. + * + * @param ent + * The entity to set health on. + * @param health + * An integer representing the amount of health to set, from 0 to + * {@link Entity#maxHealth()}. + */ + public void setHp(Player p, int health) { + // TODO Once we have players doing stuff + } + + /** + * Damages the tool of a player corresponding to a dig. The player's + * currently selected tool is damaged. + * + * @param actor + * The player that is digging a node. + * @param nd + * The node dug. + * @throws MossScriptException + * Thrown if the current tool cannot be used to dig the node. + */ + public void damageTool(Player actor, MapNode nd) throws MossScriptException { + // TODO Auto-generated method stub + + } + + /** + * Gives a player an item. The item stack will be added to the player's + * default inventory, adding to the first available partial stack. If no + * partial stacks are available the item is added to the first open slot in + * the inventory. + * + * @param player + * @param item + * @return True if the item could be added, false if the item could not be + * added due to insufficient space. + */ + public boolean givePlayer(Player player, MossItem.Stack item) { + return false; + } + + /** + * Sets a node of the world to a given type. This cannot be called on a + * NodePosition with an existing solid node; use + * {@link #removeNode(NodePosition)} first. + * + * @param pos + * The position at which to set a node. + * @param node + * The node to place at that position. + * @throws MapGeneratorException + */ + public void setNode(NodePosition pos, MapNode node) { + MapChunk chk = this.nc.getChunkNoGenerate(pos.chunk); + if (chk == null) + return; + chk.setNode(pos.xl, pos.yl, pos.zl, node.getNodeId()); + } + + /** + * Removes a node, setting it to air. This may be called on a NodePosition + * with an existing solid node. + * + * @param pos + * The NodePosition at which to remove the node. + * @throws MapGeneratorException + */ + public void removeNode(NodePosition pos) { + MapChunk chk = this.nc.getChunkNoGenerate(pos.chunk); + if (chk == null) + return; + chk.setNode(pos.xl, pos.yl, pos.zl, this.nm.getNode("mg:air") + .getNodeId()); + this.nc.setChunk(pos.chunk, chk); + } + + /** + * Get the MapNode at a certain location + * + * @param pos + * The location at which to get the node + * @return + * @throws MapGeneratorException + */ + public MapNode getNode(NodePosition pos) throws MapGeneratorException { + return this.nm.getNode((short) this.nc.getChunk(pos.chunk).getNodeId( + pos.xl, pos.yl, pos.zl)); + + } + + /** + * Register a new MapNode in the node manager. + * + * @param sysname + * The name such as default:dirt to set. The prefix mg: is used + * for mapgen-specific nodes, and should be done by creating a + * node with a different prefix and aliasing mg:foo to it. + * @param userFacingName + * The name to display in the UI, such as Dirt or Iron Ore + * @param params + * An implementation of the {@link LiquidNodeParams} interface + * detailing the action of the node. + * {@link DefaultLiquidNodeParams} is a default that is + * applicable to most liquids with near-water viscosity. + * @param textures + * A string stating the filename of the textures image. + * @param light + * The amount of light from 0 to 255 to be emitted. + * @return The MapNode object that has been created and added to the + * manager. + * @throws MossWorldLoadException + * If an exception occurs during the execution of the + * registering. + */ + public MapNode registerNode(String sysname, String userFacingName, + INodeParams params, String textures, boolean isLiquid, int light) + throws MossWorldLoadException { + MapNode nd = new MapNode(params, textures, sysname, userFacingName, + light); + this.nm.putNode(nd); + return nd; + } + + /** + * Register a new MapNode in the node manager. + * + * @param sysname + * The name such as default:lava to set. The prefix mg: is used + * for mapgen-specific nodes, and should be done by creating a + * node with a different prefix and aliasing mg:foo to it. + * @param userFacingName + * The name to display in the UI, such as Lava or Iron Ore + * @param params + * An implementation of the {@link INodeParams} interface + * detailing the action of the node. {@link AirNodeParams} and + * {@link DefaultNodeParams} are valid for air-like(display only) + * and standard solid blocks, respectively. + * @param textures + * A string stating the filename of the textures image. + * @param light + * The amount of light from 0 to 255 to be emitted. + * @return The MapNode object that has been created and added to the + * manager. + * @throws MossWorldLoadException + * If an exception occurs during the execution of the + * registering. + */ + public LiquidNode registerLiquid(String sysname, String userFacingName, + LiquidNodeParams params, LiquidNodeParams sourceParams, String textures, int light) + throws MossWorldLoadException { + LiquidNode nd = new LiquidNode(sourceParams, textures, sysname, userFacingName, + light); + this.nm.putNode(nd); + nd.level=0; + for (int i = 1; i < 8; i++) { + LiquidNode innerNd=new LiquidNode(params, textures, sysname+"$LEVEL$"+i, userFacingName, light); + innerNd.setByBounds(-.5f, .5f, -.5f, .5f, -.5f, (i/8f)-0.5f); + nd.liquidLevels[i]=innerNd; + innerNd.liquidLevels=nd.liquidLevels; + innerNd.level=i; + this.nm.putNode(innerNd); + } + nd.liquidLevels[0]=nd; + return nd; + } + + /** + * Registers a node alias. Since the map generator and scripts work via + * string names, registering an alias of mg:dirt to myscript:specialdirt + * will cause a mapgen that recognizes mg:dirt as a generated element to use + * specialdirt for that. + * + * @param alias + * The alias to create, i.e. mg:dirt + * @param dst + * The existing node to set as the alias target, i.e + * myscript:specialdirt. This element must already exist. + */ + public void registerNodeAlias(String alias, String dst) { + this.nm.putNodeAlias(alias, dst); + } + + /** + * Register a new MapNode in the node manager. + * + * @param sysname + * The name such as default:dirt to set. The prefix mg: is used + * for mapgen-specific nodes, and should be done by creating a + * node with a different prefix and aliasing mg:foo to it. + * @param userFacingName + * The name to display in the UI, such as Dirt or Iron Ore + * @param textures + * A string stating the filename of the textures image. + * @param light + * The amount of light from 0 to 255 to be emitted. + * @return The MapNode object that has been created and added to the + * manager. + * @throws MossWorldLoadException + * If an exception occurs during node registration. + */ + public MapNode registerNodeDefParams(String sysname, String userFacingName, + String textures, int light) throws MossWorldLoadException { + MapNode nd = new MapNode(new DefaultNodeParams(), textures, sysname, + userFacingName, light); + this.nm.putNode(nd); + return nd; + } + + /** + * Register a new liquid in the node manager. + * + * @param sysname + * The name such as default:lava to set. The prefix mg: is used + * for mapgen-specific nodes, and should be done by creating a + * node with a different prefix and aliasing mg:foo to it. + * @param userFacingName + * The name to display in the UI, such as Dirt or Iron Ore + * @param textures + * A string stating the filename of the textures image. + * @param light + * The amount of light from 0 to 255 to be emitted. + * @return The LiquidNode object that has been created and added to the + * manager. + * @throws MossWorldLoadException + * If an exception occurs during node registration. + */ + public LiquidNode registerLiquidDefParams(String sysname, + String userFacingName, String textures, int light) + throws MossWorldLoadException { + LiquidNode nd = new LiquidNode(new LiquidSourceNodeParams(), textures, sysname, userFacingName, + light); + this.nm.putNode(nd); + nd.level=0; + for (int i = 1; i < 8; i++) { + LiquidNode innerNd=new LiquidNode(new LiquidFlowingNodeParams(), textures, sysname+"$LEVEL$"+i, userFacingName, light); + innerNd.setByBounds(-.5f, .5f, -.5f, .5f, -.5f, (i/8f)-0.5f); + nd.liquidLevels[i]=innerNd; + innerNd.liquidLevels=nd.liquidLevels; + innerNd.level=i; + this.nm.putNode(innerNd); + } + nd.liquidLevels[0]=nd; + return nd; + } + + + + public MossInventory getInvByName(Player player, String name) { + return null; + } + + public MossInventory createInvByName(Player p, String name) { + return null; + } + + public Player getPlayerByName(String name) { + return null; + } + + public MapNode getNodeByName(String name) { + return null; + } + + public ScriptableDatabase getDb() { + return this.db; + } + + public MossScriptEnv(ScriptableDatabase db, NodeCache nc, + FuturesProcessor fp, NodeManager nm) { + this.db = db; + this.nc = nc; + this.fp = fp; + this.nm = nm; + } + + public FuturesProcessor getFuturesProcessor() { + return this.fp; + } + +} diff --git a/src/net/mosstest/scripting/MossScriptException.java b/src/net/mosstest/scripting/MossScriptException.java index e9c47ed..42dba85 100644 --- a/src/net/mosstest/scripting/MossScriptException.java +++ b/src/net/mosstest/scripting/MossScriptException.java @@ -1,5 +1,5 @@ -package net.mosstest.scripting; - -public class MossScriptException extends Exception { - -} +package net.mosstest.scripting; + +public class MossScriptException extends Exception { + +} diff --git a/src/net/mosstest/scripting/NodePosition.java b/src/net/mosstest/scripting/NodePosition.java index 790e00b..9c348b3 100644 --- a/src/net/mosstest/scripting/NodePosition.java +++ b/src/net/mosstest/scripting/NodePosition.java @@ -1,95 +1,95 @@ -package net.mosstest.scripting; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; - -public class NodePosition { - public final byte xl, yl, zl; - public final Position chunk; - - public NodePosition(int x, int y, int z, int realm, byte xl, byte yl, - byte zl) { - chunk = new Position(x, y, z, realm); - this.xl = xl; - this.yl = yl; - this.zl = zl; - } - - public NodePosition(byte[] bytes) throws IOException { - super(); - ByteArrayInputStream bis = new ByteArrayInputStream(bytes); - DataInputStream dis = new DataInputStream(bis); - this.chunk = new Position(dis.readInt(), dis.readInt(), dis.readInt(), - dis.readInt()); - this.xl = dis.readByte(); - this.yl = dis.readByte(); - this.zl = dis.readByte(); - // this.isValid = true; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((chunk == null) ? 0 : chunk.hashCode()); - result = prime * result + xl; - result = prime * result + yl; - result = prime * result + zl; - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (!(obj instanceof NodePosition)) { - return false; - } - NodePosition other = (NodePosition) obj; - if (chunk == null) { - if (other.chunk != null) { - return false; - } - } else if (!chunk.equals(other.chunk)) { - return false; - } - if (xl != other.xl) { - return false; - } - if (yl != other.yl) { - return false; - } - if (zl != other.zl) { - return false; - } - return true; - } - - - - public byte[] toBytes() { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - DataOutputStream dos = new DataOutputStream(bos); - try { - bos.write(chunk.toBytes()); - dos.writeByte(this.xl); - dos.writeByte(this.yl); - dos.writeByte(this.zl); - dos.flush(); - bos.flush(); - return bos.toByteArray(); - } catch (IOException e) { - // Auto-generated catch block - - } - return new byte[] {}; - } - -} +package net.mosstest.scripting; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +public class NodePosition { + public final byte xl, yl, zl; + public final Position chunk; + + public NodePosition(int x, int y, int z, int realm, byte xl, byte yl, + byte zl) { + chunk = new Position(x, y, z, realm); + this.xl = xl; + this.yl = yl; + this.zl = zl; + } + + public NodePosition(byte[] bytes) throws IOException { + super(); + ByteArrayInputStream bis = new ByteArrayInputStream(bytes); + DataInputStream dis = new DataInputStream(bis); + this.chunk = new Position(dis.readInt(), dis.readInt(), dis.readInt(), + dis.readInt()); + this.xl = dis.readByte(); + this.yl = dis.readByte(); + this.zl = dis.readByte(); + // this.isValid = true; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((chunk == null) ? 0 : chunk.hashCode()); + result = prime * result + xl; + result = prime * result + yl; + result = prime * result + zl; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof NodePosition)) { + return false; + } + NodePosition other = (NodePosition) obj; + if (chunk == null) { + if (other.chunk != null) { + return false; + } + } else if (!chunk.equals(other.chunk)) { + return false; + } + if (xl != other.xl) { + return false; + } + if (yl != other.yl) { + return false; + } + if (zl != other.zl) { + return false; + } + return true; + } + + + + public byte[] toBytes() { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(bos); + try { + bos.write(chunk.toBytes()); + dos.writeByte(this.xl); + dos.writeByte(this.yl); + dos.writeByte(this.zl); + dos.flush(); + bos.flush(); + return bos.toByteArray(); + } catch (IOException e) { + // Auto-generated catch block + + } + return new byte[] {}; + } + +} diff --git a/src/net/mosstest/scripting/Player.java b/src/net/mosstest/scripting/Player.java index 7ae23da..d4bc5d2 100644 --- a/src/net/mosstest/scripting/Player.java +++ b/src/net/mosstest/scripting/Player.java @@ -1,36 +1,36 @@ -package net.mosstest.scripting; - -import java.util.HashMap; - -public class Player { - private HashMap inventories=new HashMap<>(); - public final String name; - public volatile double xpos; - public volatile double ypos; - public volatile double zpos; - public volatile double oldx; - public volatile double oldy; - public volatile double oldz; - - public volatile long lastAnticheatMillis; - - /** - * Object to be synchronized on for - */ - public final Object antiCheatDataLock= new Object(); - - private Player(String name, int maxHealth) { - this.name=name; - this.inventories.put("default", new MossInventory(96, 8, 6)); - } - public MossInventory createInventory(String name, int rows, int cols, int maxStack) { - MossInventory inv=new MossInventory(maxStack, rows, cols); - this.inventories.put(name,inv); - return inv; - } - public void respawn() { - // TODO Auto-generated method stub - - } - -} +package net.mosstest.scripting; + +import java.util.HashMap; + +public class Player { + private HashMap inventories=new HashMap<>(); + public final String name; + public volatile double xpos; + public volatile double ypos; + public volatile double zpos; + public volatile double oldx; + public volatile double oldy; + public volatile double oldz; + + public volatile long lastAnticheatMillis; + + /** + * Object to be synchronized on for + */ + public final Object antiCheatDataLock= new Object(); + + private Player(String name, int maxHealth) { + this.name=name; + this.inventories.put("default", new MossInventory(96, 8, 6)); + } + public MossInventory createInventory(String name, int rows, int cols, int maxStack) { + MossInventory inv=new MossInventory(maxStack, rows, cols); + this.inventories.put(name,inv); + return inv; + } + public void respawn() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/net/mosstest/scripting/Position.java b/src/net/mosstest/scripting/Position.java index cd833c3..7c2c418 100644 --- a/src/net/mosstest/scripting/Position.java +++ b/src/net/mosstest/scripting/Position.java @@ -1,111 +1,111 @@ -package net.mosstest.scripting; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; - -public class Position { - - public int x; - public int y; - public int z; - public int realm; - transient boolean isValid = true; - - public Position(int x, int y, int z, int realm) { - this.x = x; - this.y = y; - this.z = z; - this.realm = realm; - this.isValid = true; - } - - public Position(byte[] bytes) throws IOException { - ByteArrayInputStream bis = new ByteArrayInputStream(bytes); - DataInputStream dis = new DataInputStream(bis); - this.x = dis.readInt(); - this.y = dis.readInt(); - this.z = dis.readInt(); - this.realm = dis.readInt(); - this.isValid = true; - } - - public Position() { - this.isValid = false; - } - - static final long serialVersionUID = 1128980133700001337L; - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (!(obj instanceof Position)) { - return false; - } - Position other = (Position) obj; - if (this.realm != other.realm) { - return false; - } - if (this.x != other.x) { - return false; - } - if (this.y != other.y) { - return false; - } - if (this.z != other.z) { - return false; - } - return true; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + this.realm; - result = prime * result + this.x; - result = prime * result + this.y; - result = prime * result + this.z; - return result; - } - - public byte[] toBytes() { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - DataOutputStream dos = new DataOutputStream(bos); - try { - dos.writeInt(this.x); - dos.writeInt(this.y); - dos.writeInt(this.z); - dos.writeInt(this.realm); - dos.flush(); - bos.flush(); - return bos.toByteArray(); - } catch (IOException e) { - // TODO Auto-generated catch block - this.isValid = false; - } - return new byte[] {}; - } - - public int getX() { - return this.x; - } - - public int getY() { - return this.y; - } - - - public int getZ() { - return this.z; - } - - -} +package net.mosstest.scripting; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +public class Position { + + public int x; + public int y; + public int z; + public int realm; + transient boolean isValid = true; + + public Position(int x, int y, int z, int realm) { + this.x = x; + this.y = y; + this.z = z; + this.realm = realm; + this.isValid = true; + } + + public Position(byte[] bytes) throws IOException { + ByteArrayInputStream bis = new ByteArrayInputStream(bytes); + DataInputStream dis = new DataInputStream(bis); + this.x = dis.readInt(); + this.y = dis.readInt(); + this.z = dis.readInt(); + this.realm = dis.readInt(); + this.isValid = true; + } + + public Position() { + this.isValid = false; + } + + static final long serialVersionUID = 1128980133700001337L; + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof Position)) { + return false; + } + Position other = (Position) obj; + if (this.realm != other.realm) { + return false; + } + if (this.x != other.x) { + return false; + } + if (this.y != other.y) { + return false; + } + if (this.z != other.z) { + return false; + } + return true; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + this.realm; + result = prime * result + this.x; + result = prime * result + this.y; + result = prime * result + this.z; + return result; + } + + public byte[] toBytes() { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(bos); + try { + dos.writeInt(this.x); + dos.writeInt(this.y); + dos.writeInt(this.z); + dos.writeInt(this.realm); + dos.flush(); + bos.flush(); + return bos.toByteArray(); + } catch (IOException e) { + // TODO Auto-generated catch block + this.isValid = false; + } + return new byte[] {}; + } + + public int getX() { + return this.x; + } + + public int getY() { + return this.y; + } + + + public int getZ() { + return this.z; + } + + +} diff --git a/src/net/mosstest/scripting/ScriptRunnable.java b/src/net/mosstest/scripting/ScriptRunnable.java index f9d5581..f98ba73 100644 --- a/src/net/mosstest/scripting/ScriptRunnable.java +++ b/src/net/mosstest/scripting/ScriptRunnable.java @@ -1,5 +1,5 @@ -package net.mosstest.scripting; - -public interface ScriptRunnable { - public void run(); -} +package net.mosstest.scripting; + +public interface ScriptRunnable { + public void run(); +} diff --git a/src/net/mosstest/scripting/ScriptableDatabase.java b/src/net/mosstest/scripting/ScriptableDatabase.java index c0e7e59..5de3d68 100644 --- a/src/net/mosstest/scripting/ScriptableDatabase.java +++ b/src/net/mosstest/scripting/ScriptableDatabase.java @@ -1,152 +1,152 @@ -package net.mosstest.scripting; - -import static org.fusesource.leveldbjni.JniDBFactory.asString; -import static org.fusesource.leveldbjni.JniDBFactory.bytes; -import static org.fusesource.leveldbjni.JniDBFactory.factory; - -import java.io.File; -import java.io.IOException; - -import org.apache.commons.lang.ArrayUtils; -import org.iq80.leveldb.DB; -import org.iq80.leveldb.Options; - -public class ScriptableDatabase { - - File baseDir; - public ScriptableDatabase(File baseDir) { - this.baseDir = baseDir; - - } - - public DBase getDb(String name) throws IOException { - if (!name.matches("[a-zA-Z]{1,32}")) { //$NON-NLS-1$ - throw new IllegalArgumentException("Invalid database name."); - } - Options options = new Options(); - options.createIfMissing(true); - return new DBase(factory.open(new File(this.baseDir, "sc_" + name - + ".db"), options), name); - - } - - public class DBase { - // this class will contain a database that scripts may access. - private final DB innerDb; - - DBase(DB innerDb, String name) { - this.innerDb = innerDb; - } - - /** - * Get a piece of string data with a string key, or null if - * the datum cannot be found. String keys are exclusive from all other - * key types. - * - * @param key - * @return A string representing the stored data. - */ - public String getDatum(String key) { - byte[] keyBytes = bytes("string::" + key); //$NON-NLS-1$ - byte[] dataBytes = this.innerDb.get(keyBytes); - return (dataBytes == null) ? null : asString(dataBytes); - } - - /** - * Put a datum with a generic string key, overwriting as necessary. - * - * @param key - * The string key. - * @param data - * The data to put. - */ - public void putDatum(String key, String data) { - this.innerDb.put(bytes("string::" + key), bytes(data)); //$NON-NLS-1$ - } - - /** - * Get a piece of string data with a position and string key, or - * null if the datum cannot be found. Position keys are - * exclusive from all other key types. - * - * @param key - * @return The found data. - */ - public String getPositionDatum(NodePosition pos, String key) { - byte[] keyBytes = ArrayUtils.addAll(bytes("npos::"), //$NON-NLS-1$ - ArrayUtils.addAll(pos.toBytes(), bytes("str::" + key))); //$NON-NLS-1$ - byte[] dataBytes = this.innerDb.get(keyBytes); - return (dataBytes == null) ? null : asString(dataBytes); - } - - /** - * Put a datum with a position and string key, overwriting as necessary. - * - * @param pos - * The position portion of the key. - * @param key - * The string key. - * @param data - * The data to put. - */ - public void putPositionDatum(NodePosition pos, String key, String data) { - byte[] keyBytes = ArrayUtils.addAll(bytes("npos::"), //$NON-NLS-1$ - ArrayUtils.addAll(pos.toBytes(), bytes("str::" + key))); //$NON-NLS-1$ - byte[] dataBytes = bytes(data); - this.innerDb.put(keyBytes, dataBytes); - } - - /** - * Gets a string of data associated with a chunk and string key, or - * null if not found. - * - * @param pos The chunk position. - * @param key The string key. - * @return The found data. - */ - public String getChunkDatum(Position pos, String key) { - byte[] keyBytes = ArrayUtils.addAll(bytes("cpos::"), //$NON-NLS-1$ - ArrayUtils.addAll(pos.toBytes(), bytes("str::" + key))); //$NON-NLS-1$ - byte[] dataBytes = this.innerDb.get(keyBytes); - return (dataBytes == null) ? null : asString(dataBytes); - } - - /** - * Puts a string of data keyed with a string and chunk. - * @param pos The chunk position. - * @param key The string key. - * @param data The data to put. - */ - public void putChunkDatum(Position pos, String key, String data) { - byte[] keyBytes = ArrayUtils.addAll(bytes("cpos::"), //$NON-NLS-1$ - ArrayUtils.addAll(pos.toBytes(), bytes("str::" + key))); //$NON-NLS-1$ - byte[] dataBytes = bytes(data); - this.innerDb.put(keyBytes, dataBytes); - } - /** - * Gets a string of data associated with a player and string key, or - * null if not found. - * - * @param p The player. - * @param key The string key. - * @return The found data. - */ - public String getPlayerDatum(Player p, String key) { - byte[] keyBytes = bytes("plr::" + p.name + "str::" + key); //$NON-NLS-1$ //$NON-NLS-2$ - byte[] dataBytes = this.innerDb.get(keyBytes); - return (dataBytes == null) ? null : asString(dataBytes); - } - /** - * Puts a string of data keyed with a string and player. - * @param p The player. - * @param key The string key. - * @param data The data to put. - */ - public void putPlayerDatum(Player p, String key, String data) { - byte[] keyBytes = bytes("plr::" + p.name + "str::" + key); //$NON-NLS-1$ //$NON-NLS-2$ - byte[] dataBytes = bytes(data); - this.innerDb.put(keyBytes, dataBytes); - } - - } -} +package net.mosstest.scripting; + +import static org.fusesource.leveldbjni.JniDBFactory.asString; +import static org.fusesource.leveldbjni.JniDBFactory.bytes; +import static org.fusesource.leveldbjni.JniDBFactory.factory; + +import java.io.File; +import java.io.IOException; + +import org.apache.commons.lang.ArrayUtils; +import org.iq80.leveldb.DB; +import org.iq80.leveldb.Options; + +public class ScriptableDatabase { + + File baseDir; + public ScriptableDatabase(File baseDir) { + this.baseDir = baseDir; + + } + + public DBase getDb(String name) throws IOException { + if (!name.matches("[a-zA-Z]{1,32}")) { //$NON-NLS-1$ + throw new IllegalArgumentException("Invalid database name."); + } + Options options = new Options(); + options.createIfMissing(true); + return new DBase(factory.open(new File(this.baseDir, "sc_" + name + + ".db"), options), name); + + } + + public class DBase { + // this class will contain a database that scripts may access. + private final DB innerDb; + + DBase(DB innerDb, String name) { + this.innerDb = innerDb; + } + + /** + * Get a piece of string data with a string key, or null if + * the datum cannot be found. String keys are exclusive from all other + * key types. + * + * @param key + * @return A string representing the stored data. + */ + public String getDatum(String key) { + byte[] keyBytes = bytes("string::" + key); //$NON-NLS-1$ + byte[] dataBytes = this.innerDb.get(keyBytes); + return (dataBytes == null) ? null : asString(dataBytes); + } + + /** + * Put a datum with a generic string key, overwriting as necessary. + * + * @param key + * The string key. + * @param data + * The data to put. + */ + public void putDatum(String key, String data) { + this.innerDb.put(bytes("string::" + key), bytes(data)); //$NON-NLS-1$ + } + + /** + * Get a piece of string data with a position and string key, or + * null if the datum cannot be found. Position keys are + * exclusive from all other key types. + * + * @param key + * @return The found data. + */ + public String getPositionDatum(NodePosition pos, String key) { + byte[] keyBytes = ArrayUtils.addAll(bytes("npos::"), //$NON-NLS-1$ + ArrayUtils.addAll(pos.toBytes(), bytes("str::" + key))); //$NON-NLS-1$ + byte[] dataBytes = this.innerDb.get(keyBytes); + return (dataBytes == null) ? null : asString(dataBytes); + } + + /** + * Put a datum with a position and string key, overwriting as necessary. + * + * @param pos + * The position portion of the key. + * @param key + * The string key. + * @param data + * The data to put. + */ + public void putPositionDatum(NodePosition pos, String key, String data) { + byte[] keyBytes = ArrayUtils.addAll(bytes("npos::"), //$NON-NLS-1$ + ArrayUtils.addAll(pos.toBytes(), bytes("str::" + key))); //$NON-NLS-1$ + byte[] dataBytes = bytes(data); + this.innerDb.put(keyBytes, dataBytes); + } + + /** + * Gets a string of data associated with a chunk and string key, or + * null if not found. + * + * @param pos The chunk position. + * @param key The string key. + * @return The found data. + */ + public String getChunkDatum(Position pos, String key) { + byte[] keyBytes = ArrayUtils.addAll(bytes("cpos::"), //$NON-NLS-1$ + ArrayUtils.addAll(pos.toBytes(), bytes("str::" + key))); //$NON-NLS-1$ + byte[] dataBytes = this.innerDb.get(keyBytes); + return (dataBytes == null) ? null : asString(dataBytes); + } + + /** + * Puts a string of data keyed with a string and chunk. + * @param pos The chunk position. + * @param key The string key. + * @param data The data to put. + */ + public void putChunkDatum(Position pos, String key, String data) { + byte[] keyBytes = ArrayUtils.addAll(bytes("cpos::"), //$NON-NLS-1$ + ArrayUtils.addAll(pos.toBytes(), bytes("str::" + key))); //$NON-NLS-1$ + byte[] dataBytes = bytes(data); + this.innerDb.put(keyBytes, dataBytes); + } + /** + * Gets a string of data associated with a player and string key, or + * null if not found. + * + * @param p The player. + * @param key The string key. + * @return The found data. + */ + public String getPlayerDatum(Player p, String key) { + byte[] keyBytes = bytes("plr::" + p.name + "str::" + key); //$NON-NLS-1$ //$NON-NLS-2$ + byte[] dataBytes = this.innerDb.get(keyBytes); + return (dataBytes == null) ? null : asString(dataBytes); + } + /** + * Puts a string of data keyed with a string and player. + * @param p The player. + * @param key The string key. + * @param data The data to put. + */ + public void putPlayerDatum(Player p, String key, String data) { + byte[] keyBytes = bytes("plr::" + p.name + "str::" + key); //$NON-NLS-1$ //$NON-NLS-2$ + byte[] dataBytes = bytes(data); + this.innerDb.put(keyBytes, dataBytes); + } + + } +} diff --git a/src/net/mosstest/scripting/UtilityClassSandbox.java b/src/net/mosstest/scripting/UtilityClassSandbox.java index cfbd578..e46a0fb 100644 --- a/src/net/mosstest/scripting/UtilityClassSandbox.java +++ b/src/net/mosstest/scripting/UtilityClassSandbox.java @@ -1,5 +1,5 @@ -package net.mosstest.scripting; - -public class UtilityClassSandbox { - -} +package net.mosstest.scripting; + +public class UtilityClassSandbox { + +} diff --git a/src/net/mosstest/servercore/AntiCheatException.java b/src/net/mosstest/servercore/AntiCheatException.java index 192c50a..625bbeb 100644 --- a/src/net/mosstest/servercore/AntiCheatException.java +++ b/src/net/mosstest/servercore/AntiCheatException.java @@ -1,5 +1,5 @@ -package net.mosstest.servercore; - -public class AntiCheatException extends PlayerSecurityException { - -} +package net.mosstest.servercore; + +public class AntiCheatException extends PlayerSecurityException { + +} diff --git a/src/net/mosstest/servercore/ApplicationLevelNetworkingManager.java b/src/net/mosstest/servercore/ApplicationLevelNetworkingManager.java index 5343594..cbf5633 100644 --- a/src/net/mosstest/servercore/ApplicationLevelNetworkingManager.java +++ b/src/net/mosstest/servercore/ApplicationLevelNetworkingManager.java @@ -1,22 +1,22 @@ -package net.mosstest.servercore; - -import net.mosstest.scripting.Position; - -public class ApplicationLevelNetworkingManager { - ClientNetworkingManager net; - static final int PROTOCOL_VERSION_MAJOR = 1; - static final int PROTOCOL_VERSION_MINOR = 1; // change for - // backward-compatible - // changes such as changes - // in timing that do not - // break older versions - - public ApplicationLevelNetworkingManager(ClientNetworkingManager net) { - this.net = net; - } - - public void sendChunkRequest(Position pos) { - // TODO create generated code - - } -} +package net.mosstest.servercore; + +import net.mosstest.scripting.Position; + +public class ApplicationLevelNetworkingManager { + ClientNetworkingManager net; + static final int PROTOCOL_VERSION_MAJOR = 1; + static final int PROTOCOL_VERSION_MINOR = 1; // change for + // backward-compatible + // changes such as changes + // in timing that do not + // break older versions + + public ApplicationLevelNetworkingManager(ClientNetworkingManager net) { + this.net = net; + } + + public void sendChunkRequest(Position pos) { + // TODO create generated code + + } +} diff --git a/src/net/mosstest/servercore/Biome.java b/src/net/mosstest/servercore/Biome.java index ef4e735..1947ef1 100644 --- a/src/net/mosstest/servercore/Biome.java +++ b/src/net/mosstest/servercore/Biome.java @@ -1,8 +1,8 @@ -package net.mosstest.servercore; - -public enum Biome { - MG_LAKE, MG_ICE, MG_OCEAN, MG_SWAMP, MG_FOREST, MG_PLAIN, MG_DELTA, MG_DESERT, MG_RAINFOREST, MG_JUNGLE, MG_VOLCANIC, MG_DEFAULT; - public Biome select(double humidity, double elevation, double geo_age, double temperature){ - return MG_DEFAULT; - } -} +package net.mosstest.servercore; + +public enum Biome { + MG_LAKE, MG_ICE, MG_OCEAN, MG_SWAMP, MG_FOREST, MG_PLAIN, MG_DELTA, MG_DESERT, MG_RAINFOREST, MG_JUNGLE, MG_VOLCANIC, MG_DEFAULT; + public Biome select(double humidity, double elevation, double geo_age, double temperature){ + return MG_DEFAULT; + } +} diff --git a/src/net/mosstest/servercore/ChunkNotFoundException.java b/src/net/mosstest/servercore/ChunkNotFoundException.java index 290827f..4a8cd98 100644 --- a/src/net/mosstest/servercore/ChunkNotFoundException.java +++ b/src/net/mosstest/servercore/ChunkNotFoundException.java @@ -1,18 +1,18 @@ -package net.mosstest.servercore; - -import net.mosstest.scripting.Position; - -public class ChunkNotFoundException extends Exception { -long x, y, z; - -public ChunkNotFoundException(long x, long y, long z) { - this.x = x; - this.y = y; - this.z = z; -} - -public ChunkNotFoundException(Position pos) { - // TODO Auto-generated constructor stub -} - -} +package net.mosstest.servercore; + +import net.mosstest.scripting.Position; + +public class ChunkNotFoundException extends Exception { +long x, y, z; + +public ChunkNotFoundException(long x, long y, long z) { + this.x = x; + this.y = y; + this.z = z; +} + +public ChunkNotFoundException(Position pos) { + // TODO Auto-generated constructor stub +} + +} diff --git a/src/net/mosstest/servercore/ClientMain.java b/src/net/mosstest/servercore/ClientMain.java index 676177b..4b6c4b3 100644 --- a/src/net/mosstest/servercore/ClientMain.java +++ b/src/net/mosstest/servercore/ClientMain.java @@ -1,10 +1,10 @@ -package net.mosstest.servercore; - -public class ClientMain { - - public static void main(String[] args) { - // TODO Initialize the client here. - - } - -} +package net.mosstest.servercore; + +public class ClientMain { + + public static void main(String[] args) { + // TODO Initialize the client here. + + } + +} diff --git a/src/net/mosstest/servercore/ClientManager.java b/src/net/mosstest/servercore/ClientManager.java index a6434bf..fe7d7ab 100644 --- a/src/net/mosstest/servercore/ClientManager.java +++ b/src/net/mosstest/servercore/ClientManager.java @@ -1,40 +1,40 @@ -package net.mosstest.servercore; - -import java.io.IOException; - - -public class ClientManager { - volatile static int state=0; - static final int STATE_DISCONNECTED=0; - static final int STATE_FETCHING_SCRIPTS=1; - static final int STATE_FETCHING_TEXTURES=2; - static final int STATE_FETCHING_MESHES=3; - static final int STATE_PLAYABLE=4; - static final int STATE_INVALID=-1; - static ClientNetworkingManager net; - static void init(String host, int port, String username, char[] password) throws IOException{ - net=new ClientNetworkingManager(host, port, EngineSettings.getBool("client_udp", true)); - net.beginConnectHandshake(); - - } - - public static ClientNetworkingManager getNetworkingManager() { - return net; - } - - public static ApplicationLevelNetworkingManager getApplicationLevelNetworkingManager() { - // TODO Auto-generated method stub - return null; - } - - /** - * Show an error screen on the client - * @param title The title to show - * @param msg The message to show - * @param disconnect Whether to disconnect from the current server, if any. - */ - public static void showErrorScreen(String title, String msg, boolean disconnect) { - // TODO Auto-generated method stub - - } -} +package net.mosstest.servercore; + +import java.io.IOException; + + +public class ClientManager { + volatile static int state=0; + static final int STATE_DISCONNECTED=0; + static final int STATE_FETCHING_SCRIPTS=1; + static final int STATE_FETCHING_TEXTURES=2; + static final int STATE_FETCHING_MESHES=3; + static final int STATE_PLAYABLE=4; + static final int STATE_INVALID=-1; + static ClientNetworkingManager net; + static void init(String host, int port, String username, char[] password) throws IOException{ + net=new ClientNetworkingManager(host, port, EngineSettings.getBool("client_udp", true)); + net.beginConnectHandshake(); + + } + + public static ClientNetworkingManager getNetworkingManager() { + return net; + } + + public static ApplicationLevelNetworkingManager getApplicationLevelNetworkingManager() { + // TODO Auto-generated method stub + return null; + } + + /** + * Show an error screen on the client + * @param title The title to show + * @param msg The message to show + * @param disconnect Whether to disconnect from the current server, if any. + */ + public static void showErrorScreen(String title, String msg, boolean disconnect) { + // TODO Auto-generated method stub + + } +} diff --git a/src/net/mosstest/servercore/ClientNetworkingManager.java b/src/net/mosstest/servercore/ClientNetworkingManager.java index 15ed1e0..6f5c514 100644 --- a/src/net/mosstest/servercore/ClientNetworkingManager.java +++ b/src/net/mosstest/servercore/ClientNetworkingManager.java @@ -1,462 +1,462 @@ -package net.mosstest.servercore; - -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.DatagramPacket; -import java.net.DatagramSocket; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.net.SocketException; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicLong; - -public class ClientNetworkingManager { - // There's a potential DoS attack here but it can only be mounted by the - // server, so you might as well just not use that server. No security - // threat except small client hang, won't fix. - protected AtomicBoolean runThreads = new AtomicBoolean(true); - protected Socket bulkDataSocket = new Socket(); - protected Socket lowLatencyStreamSocket = new Socket(); - protected DatagramSocket udpSocket; - protected DataOutputStream bulkDataOut; - protected DataOutputStream lowlatencyDataOut; - protected DataInputStream bulkDataIn; - protected DataInputStream lowlatencyDataIn; - protected boolean udpOn = false; - protected AtomicBoolean fastLinkAckd = new AtomicBoolean(false); - protected final InetAddress endpoint; - protected int port; - protected AtomicLong lastBulkOut = new AtomicLong(); - protected AtomicLong lastBulkIn = new AtomicLong(); - protected AtomicLong lastFastOut = new AtomicLong(); - protected AtomicLong lastFastIn = new AtomicLong(); - protected AtomicLong lastUdpOut = new AtomicLong(); - protected AtomicLong lastUdpIn = new AtomicLong(); - /* - * Should be no need for another lowlatency queue unless we find poor - * performance - */ - public ArrayBlockingQueue packets = new ArrayBlockingQueue<>( - 1024); - protected Thread bulkReadHandler = new Thread(new Runnable() { - - @Override - public void run() { - - try { - recvLoop: while (ClientNetworkingManager.this.runThreads.get()) { - - if (ClientNetworkingManager.this.bulkDataIn.readInt() != CommonNetworking.magic) { - // Handle reconnect - } - - int length = ClientNetworkingManager.this.bulkDataIn - .readShort(); - byte[] buf = new byte[length]; - - int commandId = ClientNetworkingManager.this.bulkDataIn - .readUnsignedByte(); - if (commandId == 255) { - ClientNetworkingManager.this.partyQuenched.set(true); - continue recvLoop; - } - - ClientNetworkingManager.this.bulkStreamIn.read(buf); - if (commandId == 254) { - ClientNetworkingManager.this.fastLinkAckd.set(true); - sendPacketLowLatency(254, buf); - sendPacketUdp(254, buf, true); - continue recvLoop; - } - ClientNetworkingManager.this.packets.add(new MossNetPacket( - commandId, buf)); - ClientNetworkingManager.this.lastBulkIn.set(System - .currentTimeMillis()); - if (ClientNetworkingManager.this.packets - .remainingCapacity() < 32) - sendQuench(); - } - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } - }, "ClientBulkRecv"); //$NON-NLS-1$ - protected Thread fastReadHandler = new Thread(new Runnable() { - // TODO - @Override - public void run() { - - try { - recvLoop: while (ClientNetworkingManager.this.runThreads.get()) { - - if (ClientNetworkingManager.this.lowlatencyDataIn.readInt() != CommonNetworking.magic) { - // Handle reconnect - } - int length = ClientNetworkingManager.this.lowlatencyDataIn - .readShort(); - byte[] buf = new byte[length]; - - int commandId = ClientNetworkingManager.this.lowlatencyDataIn - .readUnsignedByte(); - if (commandId == 255) { - ClientNetworkingManager.this.partyQuenched.set(true); - continue recvLoop; - } - ClientNetworkingManager.this.fastStreamIn.read(buf); - ClientNetworkingManager.this.packets.add(new MossNetPacket( - commandId, buf)); - ClientNetworkingManager.this.lastFastIn.set(System - .currentTimeMillis()); - ClientNetworkingManager.this.packets.add(new MossNetPacket( - commandId, buf)); - if (ClientNetworkingManager.this.packets - .remainingCapacity() < 32) - sendQuench(); - } - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } - }, "ClientBulkRecv"); //$NON-NLS-1$ - protected AtomicBoolean partyQuenched = new AtomicBoolean(false); - AtomicLong quenchedSince = new AtomicLong(0); - protected Thread dgramReadHandler = new Thread(new Runnable() { - // TODO--spanish for "all" - @Override - public void run() { - - recvLoop: while (ClientNetworkingManager.this.runThreads.get()) { - byte[] buf = new byte[270]; - DatagramPacket pckt = new DatagramPacket(buf, 270); - try { - ClientNetworkingManager.this.udpSocket.receive(pckt); - ByteArrayInputStream bufStr = new ByteArrayInputStream( - pckt.getData()); - if (!pckt.getAddress().equals( - ClientNetworkingManager.this.endpoint)) { - System.out.println("received mismatched packet source"); //$NON-NLS-1$ - continue recvLoop; - } - DataInputStream dos = new DataInputStream(bufStr); - int magic = dos.readInt(); - - if (magic == CommonNetworking.magic) - sendAck(dos.readUnsignedShort()); - if (!(magic == CommonNetworking.magic || magic == CommonNetworking.magicNoAck)) { - System.out.println("bad magic"); //$NON-NLS-1$ - continue recvLoop; - } - int length = dos.readUnsignedByte(); - int commandId = dos.readUnsignedByte(); - if (commandId == 255) { - ClientNetworkingManager.this.partyQuenched.set(true); - continue recvLoop; - } - byte[] pBuf = new byte[length]; - bufStr.read(pBuf); - ClientNetworkingManager.this.lastUdpIn.set(System - .currentTimeMillis()); - ClientNetworkingManager.this.packets.add(new MossNetPacket( - commandId, pBuf)); - - } catch (IOException e) { - ClientNetworkingManager.this.udpOn = false; - } - } - - } - }, "ClientDgramRecv"); //$NON-NLS-1$ - - protected InputStream bulkStreamIn; - protected OutputStream bulkStreamOut; - protected InputStream fastStreamIn; - protected OutputStream fastStreamOut; - - public ClientNetworkingManager(String endpoint, int port, boolean useUdp) - throws IOException { - this.endpoint = InetAddress.getByName(endpoint); - this.lowLatencyStreamSocket.setPerformancePreferences(0, 1, 0); - this.lowLatencyStreamSocket.setTrafficClass(0x10); - this.lowLatencyStreamSocket.setTcpNoDelay(true); - this.bulkDataSocket.connect(new InetSocketAddress(endpoint, 16511), - 16511); - this.bulkStreamIn = this.bulkDataSocket.getInputStream(); - this.bulkStreamOut = this.bulkDataSocket.getOutputStream(); - this.bulkDataOut = new DataOutputStream(this.bulkStreamOut); - this.bulkDataIn = new DataInputStream(this.bulkStreamIn); - this.lowLatencyStreamSocket.connect(new InetSocketAddress(endpoint, - 16511), 16511); - this.fastStreamIn = this.lowLatencyStreamSocket.getInputStream(); - this.fastStreamOut = this.lowLatencyStreamSocket.getOutputStream(); - this.lowlatencyDataOut = new DataOutputStream(this.fastStreamOut); - this.lowlatencyDataIn = new DataInputStream(this.fastStreamIn); - this.udpOn = false; - if (useUdp) { - try { - this.udpSocket = new DatagramSocket(port, - InetAddress.getByName(endpoint)); - this.udpSocket.setSoTimeout(0); - sendTosUdpConn(); - } catch (SocketException e) { - this.udpOn = false; - } - } - this.lastBulkIn.set(System.currentTimeMillis()); - this.lastBulkOut.set(System.currentTimeMillis()); - this.lastFastIn.set(System.currentTimeMillis()); - this.lastFastOut.set(System.currentTimeMillis()); - this.lastUdpIn.set(System.currentTimeMillis()); - this.lastUdpOut.set(System.currentTimeMillis()); - this.bulkReadHandler.start(); - this.fastReadHandler.start(); - this.dgramReadHandler.start(); - this.sendQueueThread.start(); - this.netTimeoutThread.start(); - } - - protected void sendAck(int seqnum) { - // TODO Auto-generated method stub - - } - - protected void sendTosUdpConn() { - // TODO Auto-generated method stub - - } - - protected void sendQuench() { - // TODO Sends a request for the server to back off with data and skip - // non-essential data. - - } - - /** - * Send a packet, dispatching to the correct socket. - * - * @param commandId - * Byte representing command ID. - * @param payload - * The data to send. - * @param latencyPrio - * @throws IOException - */ - protected void sendPacket(MossNetPacket p) throws IOException { - if(this.partyQuenched.get()&&!p.isImportant) return; - - if (p.needsFast) { - if ((p.payload.length < 250) && this.udpOn) - sendPacketUdp(p.commandId, p.payload, p.needsAck); - else { - sendPacketLowLatency(p.commandId, p.payload); - } - } else - sendPacketDefault(p.commandId, p.payload); - - } - - protected void sendPacketDefault(int commandId, byte[] payload) - throws IOException { - this.lastBulkOut.set(System.currentTimeMillis()); - synchronized (this.bulkDataOut) { - try { - this.bulkDataOut.writeInt(CommonNetworking.magic); - this.bulkDataOut.writeShort(payload.length); - this.bulkDataOut.write(commandId); - this.bulkDataOut.write(payload); - this.bulkDataOut.flush(); - } catch (IOException e) { - defaultReinit(); - this.bulkDataOut.writeInt(CommonNetworking.magic); - this.bulkDataOut.writeShort(payload.length); - this.bulkDataOut.write(commandId); - this.bulkDataOut.write(payload); - this.bulkDataOut.flush(); - } - } - } - - protected void defaultReinit() throws IOException { - this.bulkDataIn.close(); - this.bulkDataOut.close(); - this.bulkDataSocket.close(); - this.bulkDataSocket = new Socket(); - this.bulkDataSocket.connect(new InetSocketAddress(this.endpoint, - this.port), 10000); - - this.bulkDataOut = new DataOutputStream( - this.bulkDataSocket.getOutputStream()); - this.bulkDataIn = new DataInputStream( - this.bulkDataSocket.getInputStream()); - performBulkReconnect(); - this.lastBulkIn.set(System.currentTimeMillis()); - this.lastBulkOut.set(System.currentTimeMillis()); - - } - - protected void performBulkReconnect() { - synchronized (this.bulkDataOut) { - // PERFORM RECONNECTION - } - - } - - protected void sendPacketLowLatency(int commandId, byte[] payload) - throws IOException { - if (!this.fastLinkAckd.get()) { - sendPacketDefault(commandId, payload); - } else { - this.lastFastOut.set(System.currentTimeMillis()); - try { - this.lowlatencyDataOut.writeInt(CommonNetworking.magic); - this.lowlatencyDataOut.writeShort(payload.length); - this.lowlatencyDataOut.write(commandId); - this.lowlatencyDataOut.flush(); - this.fastStreamOut.write(payload); - this.fastStreamOut.flush(); - - } catch (IOException e) { - defaultReinit(); - this.lowlatencyDataOut.writeInt(CommonNetworking.magic); - this.lowlatencyDataOut.writeShort(payload.length); - this.lowlatencyDataOut.write(commandId); - this.lowlatencyDataOut.flush(); - this.fastStreamOut.write(payload); - this.fastStreamOut.flush(); - } - } - } - - protected void sendPacketUdp(int commandId, byte[] payload, boolean needsAck) - throws IOException { - this.lastUdpOut.set(System.currentTimeMillis()); - DatagramPacket toSend = new DatagramPacket(payload, payload.length); - toSend.setSocketAddress(new InetSocketAddress(this.endpoint, this.port)); - synchronized (this.udpSocket) { - this.udpSocket.send(toSend); - } - - } - - public void enqueuePacket(MossNetPacket p) throws InterruptedException { - this.sendQueue.put(p); - } - - protected class StateMachine { - static final int DISCONNECTED = 0; - static final int LINK = 1; - static final int AUTH = 2; - static final int RESOURCE_XFER = 3; - static final int ESTABLISHED = 4; - static final int DENIED = 5; - static final int TIMEDOUT = 6; - int curStatus = 0; - } - - public void beginConnectHandshake() { - // TODO Auto-generated method stub - - } - - final ArrayBlockingQueue sendQueue = new ArrayBlockingQueue<>( - 1024); - - private Thread sendQueueThread = new Thread(new Runnable() { - - @Override - public void run() { - while (ClientNetworkingManager.this.runThreads.get()) { - try { - MossNetPacket p = ClientNetworkingManager.this.sendQueue.take(); - ClientNetworkingManager.this.sendPacket(p); - } catch (InterruptedException | IOException e) { - // superfluous exception - } - } - } - }, "netClientSendQueue"); - - private Thread netTimeoutThread = new Thread(new Runnable() { - - @Override - public void run() { - while (ClientNetworkingManager.this.runThreads.get()) { - long cTime = System.currentTimeMillis(); - if (cTime - ClientNetworkingManager.this.lastBulkIn.get() > 10000 - || cTime - - ClientNetworkingManager.this.lastFastIn.get() > 10000 - || cTime - ClientNetworkingManager.this.lastUdpIn.get() > 10000) { - ClientManager - .showErrorScreen( - "Network Timeout", - "The connection to the server has been lost or has become too slow to continue. \r\nThis is likely caused by an unstable connection, poor WiFi, loose cables, or a firewall issue.", - true); - - } - try { - if (cTime - ClientNetworkingManager.this.lastBulkOut.get() > 4000) - sendPacketDefault(00, new byte[] {}); - } catch (IOException e) { - // pass - } - try { - if (cTime - ClientNetworkingManager.this.lastFastOut.get() > 4000) - sendPacketLowLatency(00, new byte[] {}); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - try { - if (cTime - ClientNetworkingManager.this.lastUdpOut.get() > 4000) - sendPacketUdp(00, new byte[] {}, false); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - if (cTime - ClientNetworkingManager.this.quenchedSince.get() > 4000) - ClientNetworkingManager.this.partyQuenched.set(false); - - try { - // oh, joy - Thread.sleep(4000 - - cTime - + Math.min( - ClientNetworkingManager.this.lastBulkIn - .get(), - Math.min( - ClientNetworkingManager.this.lastBulkOut - .get(), - Math.min( - ClientNetworkingManager.this.lastFastIn - .get(), - Math.min( - ClientNetworkingManager.this.lastFastOut - .get(), - Math.min( - ClientNetworkingManager.this.lastUdpIn - .get(), - Math.min( - ClientNetworkingManager.this.lastUdpOut - .get(), - ClientNetworkingManager.this.quenchedSince - .get()))))))); - } catch (InterruptedException e) { - // pass - } - - } - - } - }, "netTimeout"); - -} +package net.mosstest.servercore; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.SocketException; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicLong; + +public class ClientNetworkingManager { + // There's a potential DoS attack here but it can only be mounted by the + // server, so you might as well just not use that server. No security + // threat except small client hang, won't fix. + protected AtomicBoolean runThreads = new AtomicBoolean(true); + protected Socket bulkDataSocket = new Socket(); + protected Socket lowLatencyStreamSocket = new Socket(); + protected DatagramSocket udpSocket; + protected DataOutputStream bulkDataOut; + protected DataOutputStream lowlatencyDataOut; + protected DataInputStream bulkDataIn; + protected DataInputStream lowlatencyDataIn; + protected boolean udpOn = false; + protected AtomicBoolean fastLinkAckd = new AtomicBoolean(false); + protected final InetAddress endpoint; + protected int port; + protected AtomicLong lastBulkOut = new AtomicLong(); + protected AtomicLong lastBulkIn = new AtomicLong(); + protected AtomicLong lastFastOut = new AtomicLong(); + protected AtomicLong lastFastIn = new AtomicLong(); + protected AtomicLong lastUdpOut = new AtomicLong(); + protected AtomicLong lastUdpIn = new AtomicLong(); + /* + * Should be no need for another lowlatency queue unless we find poor + * performance + */ + public ArrayBlockingQueue packets = new ArrayBlockingQueue<>( + 1024); + protected Thread bulkReadHandler = new Thread(new Runnable() { + + @Override + public void run() { + + try { + recvLoop: while (ClientNetworkingManager.this.runThreads.get()) { + + if (ClientNetworkingManager.this.bulkDataIn.readInt() != CommonNetworking.magic) { + // Handle reconnect + } + + int length = ClientNetworkingManager.this.bulkDataIn + .readShort(); + byte[] buf = new byte[length]; + + int commandId = ClientNetworkingManager.this.bulkDataIn + .readUnsignedByte(); + if (commandId == 255) { + ClientNetworkingManager.this.partyQuenched.set(true); + continue recvLoop; + } + + ClientNetworkingManager.this.bulkStreamIn.read(buf); + if (commandId == 254) { + ClientNetworkingManager.this.fastLinkAckd.set(true); + sendPacketLowLatency(254, buf); + sendPacketUdp(254, buf, true); + continue recvLoop; + } + ClientNetworkingManager.this.packets.add(new MossNetPacket( + commandId, buf)); + ClientNetworkingManager.this.lastBulkIn.set(System + .currentTimeMillis()); + if (ClientNetworkingManager.this.packets + .remainingCapacity() < 32) + sendQuench(); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + }, "ClientBulkRecv"); //$NON-NLS-1$ + protected Thread fastReadHandler = new Thread(new Runnable() { + // TODO + @Override + public void run() { + + try { + recvLoop: while (ClientNetworkingManager.this.runThreads.get()) { + + if (ClientNetworkingManager.this.lowlatencyDataIn.readInt() != CommonNetworking.magic) { + // Handle reconnect + } + int length = ClientNetworkingManager.this.lowlatencyDataIn + .readShort(); + byte[] buf = new byte[length]; + + int commandId = ClientNetworkingManager.this.lowlatencyDataIn + .readUnsignedByte(); + if (commandId == 255) { + ClientNetworkingManager.this.partyQuenched.set(true); + continue recvLoop; + } + ClientNetworkingManager.this.fastStreamIn.read(buf); + ClientNetworkingManager.this.packets.add(new MossNetPacket( + commandId, buf)); + ClientNetworkingManager.this.lastFastIn.set(System + .currentTimeMillis()); + ClientNetworkingManager.this.packets.add(new MossNetPacket( + commandId, buf)); + if (ClientNetworkingManager.this.packets + .remainingCapacity() < 32) + sendQuench(); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + }, "ClientBulkRecv"); //$NON-NLS-1$ + protected AtomicBoolean partyQuenched = new AtomicBoolean(false); + AtomicLong quenchedSince = new AtomicLong(0); + protected Thread dgramReadHandler = new Thread(new Runnable() { + // TODO--spanish for "all" + @Override + public void run() { + + recvLoop: while (ClientNetworkingManager.this.runThreads.get()) { + byte[] buf = new byte[270]; + DatagramPacket pckt = new DatagramPacket(buf, 270); + try { + ClientNetworkingManager.this.udpSocket.receive(pckt); + ByteArrayInputStream bufStr = new ByteArrayInputStream( + pckt.getData()); + if (!pckt.getAddress().equals( + ClientNetworkingManager.this.endpoint)) { + System.out.println("received mismatched packet source"); //$NON-NLS-1$ + continue recvLoop; + } + DataInputStream dos = new DataInputStream(bufStr); + int magic = dos.readInt(); + + if (magic == CommonNetworking.magic) + sendAck(dos.readUnsignedShort()); + if (!(magic == CommonNetworking.magic || magic == CommonNetworking.magicNoAck)) { + System.out.println("bad magic"); //$NON-NLS-1$ + continue recvLoop; + } + int length = dos.readUnsignedByte(); + int commandId = dos.readUnsignedByte(); + if (commandId == 255) { + ClientNetworkingManager.this.partyQuenched.set(true); + continue recvLoop; + } + byte[] pBuf = new byte[length]; + bufStr.read(pBuf); + ClientNetworkingManager.this.lastUdpIn.set(System + .currentTimeMillis()); + ClientNetworkingManager.this.packets.add(new MossNetPacket( + commandId, pBuf)); + + } catch (IOException e) { + ClientNetworkingManager.this.udpOn = false; + } + } + + } + }, "ClientDgramRecv"); //$NON-NLS-1$ + + protected InputStream bulkStreamIn; + protected OutputStream bulkStreamOut; + protected InputStream fastStreamIn; + protected OutputStream fastStreamOut; + + public ClientNetworkingManager(String endpoint, int port, boolean useUdp) + throws IOException { + this.endpoint = InetAddress.getByName(endpoint); + this.lowLatencyStreamSocket.setPerformancePreferences(0, 1, 0); + this.lowLatencyStreamSocket.setTrafficClass(0x10); + this.lowLatencyStreamSocket.setTcpNoDelay(true); + this.bulkDataSocket.connect(new InetSocketAddress(endpoint, 16511), + 16511); + this.bulkStreamIn = this.bulkDataSocket.getInputStream(); + this.bulkStreamOut = this.bulkDataSocket.getOutputStream(); + this.bulkDataOut = new DataOutputStream(this.bulkStreamOut); + this.bulkDataIn = new DataInputStream(this.bulkStreamIn); + this.lowLatencyStreamSocket.connect(new InetSocketAddress(endpoint, + 16511), 16511); + this.fastStreamIn = this.lowLatencyStreamSocket.getInputStream(); + this.fastStreamOut = this.lowLatencyStreamSocket.getOutputStream(); + this.lowlatencyDataOut = new DataOutputStream(this.fastStreamOut); + this.lowlatencyDataIn = new DataInputStream(this.fastStreamIn); + this.udpOn = false; + if (useUdp) { + try { + this.udpSocket = new DatagramSocket(port, + InetAddress.getByName(endpoint)); + this.udpSocket.setSoTimeout(0); + sendTosUdpConn(); + } catch (SocketException e) { + this.udpOn = false; + } + } + this.lastBulkIn.set(System.currentTimeMillis()); + this.lastBulkOut.set(System.currentTimeMillis()); + this.lastFastIn.set(System.currentTimeMillis()); + this.lastFastOut.set(System.currentTimeMillis()); + this.lastUdpIn.set(System.currentTimeMillis()); + this.lastUdpOut.set(System.currentTimeMillis()); + this.bulkReadHandler.start(); + this.fastReadHandler.start(); + this.dgramReadHandler.start(); + this.sendQueueThread.start(); + this.netTimeoutThread.start(); + } + + protected void sendAck(int seqnum) { + // TODO Auto-generated method stub + + } + + protected void sendTosUdpConn() { + // TODO Auto-generated method stub + + } + + protected void sendQuench() { + // TODO Sends a request for the server to back off with data and skip + // non-essential data. + + } + + /** + * Send a packet, dispatching to the correct socket. + * + * @param commandId + * Byte representing command ID. + * @param payload + * The data to send. + * @param latencyPrio + * @throws IOException + */ + protected void sendPacket(MossNetPacket p) throws IOException { + if(this.partyQuenched.get()&&!p.isImportant) return; + + if (p.needsFast) { + if ((p.payload.length < 250) && this.udpOn) + sendPacketUdp(p.commandId, p.payload, p.needsAck); + else { + sendPacketLowLatency(p.commandId, p.payload); + } + } else + sendPacketDefault(p.commandId, p.payload); + + } + + protected void sendPacketDefault(int commandId, byte[] payload) + throws IOException { + this.lastBulkOut.set(System.currentTimeMillis()); + synchronized (this.bulkDataOut) { + try { + this.bulkDataOut.writeInt(CommonNetworking.magic); + this.bulkDataOut.writeShort(payload.length); + this.bulkDataOut.write(commandId); + this.bulkDataOut.write(payload); + this.bulkDataOut.flush(); + } catch (IOException e) { + defaultReinit(); + this.bulkDataOut.writeInt(CommonNetworking.magic); + this.bulkDataOut.writeShort(payload.length); + this.bulkDataOut.write(commandId); + this.bulkDataOut.write(payload); + this.bulkDataOut.flush(); + } + } + } + + protected void defaultReinit() throws IOException { + this.bulkDataIn.close(); + this.bulkDataOut.close(); + this.bulkDataSocket.close(); + this.bulkDataSocket = new Socket(); + this.bulkDataSocket.connect(new InetSocketAddress(this.endpoint, + this.port), 10000); + + this.bulkDataOut = new DataOutputStream( + this.bulkDataSocket.getOutputStream()); + this.bulkDataIn = new DataInputStream( + this.bulkDataSocket.getInputStream()); + performBulkReconnect(); + this.lastBulkIn.set(System.currentTimeMillis()); + this.lastBulkOut.set(System.currentTimeMillis()); + + } + + protected void performBulkReconnect() { + synchronized (this.bulkDataOut) { + // PERFORM RECONNECTION + } + + } + + protected void sendPacketLowLatency(int commandId, byte[] payload) + throws IOException { + if (!this.fastLinkAckd.get()) { + sendPacketDefault(commandId, payload); + } else { + this.lastFastOut.set(System.currentTimeMillis()); + try { + this.lowlatencyDataOut.writeInt(CommonNetworking.magic); + this.lowlatencyDataOut.writeShort(payload.length); + this.lowlatencyDataOut.write(commandId); + this.lowlatencyDataOut.flush(); + this.fastStreamOut.write(payload); + this.fastStreamOut.flush(); + + } catch (IOException e) { + defaultReinit(); + this.lowlatencyDataOut.writeInt(CommonNetworking.magic); + this.lowlatencyDataOut.writeShort(payload.length); + this.lowlatencyDataOut.write(commandId); + this.lowlatencyDataOut.flush(); + this.fastStreamOut.write(payload); + this.fastStreamOut.flush(); + } + } + } + + protected void sendPacketUdp(int commandId, byte[] payload, boolean needsAck) + throws IOException { + this.lastUdpOut.set(System.currentTimeMillis()); + DatagramPacket toSend = new DatagramPacket(payload, payload.length); + toSend.setSocketAddress(new InetSocketAddress(this.endpoint, this.port)); + synchronized (this.udpSocket) { + this.udpSocket.send(toSend); + } + + } + + public void enqueuePacket(MossNetPacket p) throws InterruptedException { + this.sendQueue.put(p); + } + + protected class StateMachine { + static final int DISCONNECTED = 0; + static final int LINK = 1; + static final int AUTH = 2; + static final int RESOURCE_XFER = 3; + static final int ESTABLISHED = 4; + static final int DENIED = 5; + static final int TIMEDOUT = 6; + int curStatus = 0; + } + + public void beginConnectHandshake() { + // TODO Auto-generated method stub + + } + + final ArrayBlockingQueue sendQueue = new ArrayBlockingQueue<>( + 1024); + + private Thread sendQueueThread = new Thread(new Runnable() { + + @Override + public void run() { + while (ClientNetworkingManager.this.runThreads.get()) { + try { + MossNetPacket p = ClientNetworkingManager.this.sendQueue.take(); + ClientNetworkingManager.this.sendPacket(p); + } catch (InterruptedException | IOException e) { + // superfluous exception + } + } + } + }, "netClientSendQueue"); + + private Thread netTimeoutThread = new Thread(new Runnable() { + + @Override + public void run() { + while (ClientNetworkingManager.this.runThreads.get()) { + long cTime = System.currentTimeMillis(); + if (cTime - ClientNetworkingManager.this.lastBulkIn.get() > 10000 + || cTime + - ClientNetworkingManager.this.lastFastIn.get() > 10000 + || cTime - ClientNetworkingManager.this.lastUdpIn.get() > 10000) { + ClientManager + .showErrorScreen( + "Network Timeout", + "The connection to the server has been lost or has become too slow to continue. \r\nThis is likely caused by an unstable connection, poor WiFi, loose cables, or a firewall issue.", + true); + + } + try { + if (cTime - ClientNetworkingManager.this.lastBulkOut.get() > 4000) + sendPacketDefault(00, new byte[] {}); + } catch (IOException e) { + // pass + } + try { + if (cTime - ClientNetworkingManager.this.lastFastOut.get() > 4000) + sendPacketLowLatency(00, new byte[] {}); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + try { + if (cTime - ClientNetworkingManager.this.lastUdpOut.get() > 4000) + sendPacketUdp(00, new byte[] {}, false); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + if (cTime - ClientNetworkingManager.this.quenchedSince.get() > 4000) + ClientNetworkingManager.this.partyQuenched.set(false); + + try { + // oh, joy + Thread.sleep(4000 + - cTime + + Math.min( + ClientNetworkingManager.this.lastBulkIn + .get(), + Math.min( + ClientNetworkingManager.this.lastBulkOut + .get(), + Math.min( + ClientNetworkingManager.this.lastFastIn + .get(), + Math.min( + ClientNetworkingManager.this.lastFastOut + .get(), + Math.min( + ClientNetworkingManager.this.lastUdpIn + .get(), + Math.min( + ClientNetworkingManager.this.lastUdpOut + .get(), + ClientNetworkingManager.this.quenchedSince + .get()))))))); + } catch (InterruptedException e) { + // pass + } + + } + + } + }, "netTimeout"); + +} diff --git a/src/net/mosstest/servercore/CommonNetworking.java b/src/net/mosstest/servercore/CommonNetworking.java index 17047de..c02153c 100644 --- a/src/net/mosstest/servercore/CommonNetworking.java +++ b/src/net/mosstest/servercore/CommonNetworking.java @@ -1,7 +1,7 @@ -package net.mosstest.servercore; - -public class CommonNetworking { - static final int magic=0xfa7d2e4a; - static final int magicNoAck=0xfa7d2e4f; - static final int magicAck=0xfa7d2740; -} +package net.mosstest.servercore; + +public class CommonNetworking { + static final int magic=0xfa7d2e4a; + static final int magicNoAck=0xfa7d2e4f; + static final int magicAck=0xfa7d2740; +} diff --git a/src/net/mosstest/servercore/DatabaseWriteEvent.java b/src/net/mosstest/servercore/DatabaseWriteEvent.java index 6612847..9e36048 100644 --- a/src/net/mosstest/servercore/DatabaseWriteEvent.java +++ b/src/net/mosstest/servercore/DatabaseWriteEvent.java @@ -1,5 +1,5 @@ -package net.mosstest.servercore; - -public class DatabaseWriteEvent { - -} +package net.mosstest.servercore; + +public class DatabaseWriteEvent { + +} diff --git a/src/net/mosstest/servercore/DefaultEventHandlers.java b/src/net/mosstest/servercore/DefaultEventHandlers.java index dd4ca3e..3e9054c 100644 --- a/src/net/mosstest/servercore/DefaultEventHandlers.java +++ b/src/net/mosstest/servercore/DefaultEventHandlers.java @@ -1,82 +1,82 @@ -package net.mosstest.servercore; - -import net.mosstest.scripting.MossEvent; -import net.mosstest.scripting.MossItem; -import net.mosstest.scripting.MossScriptEnv; -import net.mosstest.scripting.MossScriptException; -import net.mosstest.scripting.Player; - -public class DefaultEventHandlers { - -public static void processEvent(final MossEvent evt, MossScriptEnv env) throws MossScriptException { - switch (evt.type) { - case EVT_CHATCOMMAND: - env.sendChatMessage((Player) evt.actor, null, - "No such chat command"); - break; - case EVT_CHATMESSAGE: - env.sendChatAll((Player) evt.actor, - evt.initiatingMessage); - break; - case EVT_DIEPLAYER: - env.setHp(evt.actor, 64); // Max HP=64 - evt.actor.respawn(); - // FIXME rarkenin env.moveEntity(myEvent.actor, - // Mapgen.getSpawnPoint); - break; - case EVT_DIGNODE: - try { - env.damageTool(evt.actor, - evt.nodeBefore); - env.givePlayer(evt.actor, - new MossItem.Stack(evt.nodeBefore.dropItem, 1)); - env.removeNode(evt.pos); - } catch (MossScriptException e) { - //FIXME MossSecurityManager.log(e); - } - break; - case EVT_ENTITY_DEATH: - env.getFuturesProcessor().runOnce(8000, new Runnable() { - - @Override - public void run() { - evt.actor.respawn(); - - } - }); - break; - case EVT_ENTITY_PUNCH: - //No default action - break; - case EVT_FSPEC_INVACTION: - evt.action.acceptAsStated(); - break; - case EVT_FSPEC_OPEN: - break; - case EVT_FSPEC_SUBMIT: - break; - case EVT_GENERATE: - break; - case EVT_JOINPLAYER: - break; - case EVT_NEWPLAYER: - break; - case EVT_NODEMOVE: - break; - case EVT_PLACENODE: - env.setNode(evt.pos, evt.nodeAfter); - break; - case EVT_QUITPLAYER: - break; - case EVT_SHUTDOWN: - break; - case EVT_THREADSTOP: - break; - default: - break; - - } - - } - -} +package net.mosstest.servercore; + +import net.mosstest.scripting.MossEvent; +import net.mosstest.scripting.MossItem; +import net.mosstest.scripting.MossScriptEnv; +import net.mosstest.scripting.MossScriptException; +import net.mosstest.scripting.Player; + +public class DefaultEventHandlers { + +public static void processEvent(final MossEvent evt, MossScriptEnv env) throws MossScriptException { + switch (evt.type) { + case EVT_CHATCOMMAND: + env.sendChatMessage((Player) evt.actor, null, + "No such chat command"); + break; + case EVT_CHATMESSAGE: + env.sendChatAll((Player) evt.actor, + evt.initiatingMessage); + break; + case EVT_DIEPLAYER: + env.setHp(evt.actor, 64); // Max HP=64 + evt.actor.respawn(); + // FIXME rarkenin env.moveEntity(myEvent.actor, + // Mapgen.getSpawnPoint); + break; + case EVT_DIGNODE: + try { + env.damageTool(evt.actor, + evt.nodeBefore); + env.givePlayer(evt.actor, + new MossItem.Stack(evt.nodeBefore.dropItem, 1)); + env.removeNode(evt.pos); + } catch (MossScriptException e) { + //FIXME MossSecurityManager.log(e); + } + break; + case EVT_ENTITY_DEATH: + env.getFuturesProcessor().runOnce(8000, new Runnable() { + + @Override + public void run() { + evt.actor.respawn(); + + } + }); + break; + case EVT_ENTITY_PUNCH: + //No default action + break; + case EVT_FSPEC_INVACTION: + evt.action.acceptAsStated(); + break; + case EVT_FSPEC_OPEN: + break; + case EVT_FSPEC_SUBMIT: + break; + case EVT_GENERATE: + break; + case EVT_JOINPLAYER: + break; + case EVT_NEWPLAYER: + break; + case EVT_NODEMOVE: + break; + case EVT_PLACENODE: + env.setNode(evt.pos, evt.nodeAfter); + break; + case EVT_QUITPLAYER: + break; + case EVT_SHUTDOWN: + break; + case EVT_THREADSTOP: + break; + default: + break; + + } + + } + +} diff --git a/src/net/mosstest/servercore/Drawable2D.java b/src/net/mosstest/servercore/Drawable2D.java index a1cf20a..4853bca 100644 --- a/src/net/mosstest/servercore/Drawable2D.java +++ b/src/net/mosstest/servercore/Drawable2D.java @@ -1,5 +1,5 @@ -package net.mosstest.servercore; - -public interface Drawable2D { - public void Draw(DrawableHudset screen); -} +package net.mosstest.servercore; + +public interface Drawable2D { + public void Draw(DrawableHudset screen); +} diff --git a/src/net/mosstest/servercore/Drawable3D.java b/src/net/mosstest/servercore/Drawable3D.java index 7ed89ad..ea3ab68 100644 --- a/src/net/mosstest/servercore/Drawable3D.java +++ b/src/net/mosstest/servercore/Drawable3D.java @@ -1,5 +1,5 @@ -package net.mosstest.servercore; - -public interface Drawable3D { - public void draw(DrawableWorld world); -} +package net.mosstest.servercore; + +public interface Drawable3D { + public void draw(DrawableWorld world); +} diff --git a/src/net/mosstest/servercore/DrawableHudset.java b/src/net/mosstest/servercore/DrawableHudset.java index 8a7c07a..2df7e65 100644 --- a/src/net/mosstest/servercore/DrawableHudset.java +++ b/src/net/mosstest/servercore/DrawableHudset.java @@ -1,5 +1,5 @@ -package net.mosstest.servercore; - -public class DrawableHudset { - -} +package net.mosstest.servercore; + +public class DrawableHudset { + +} diff --git a/src/net/mosstest/servercore/DrawableWorld.java b/src/net/mosstest/servercore/DrawableWorld.java index dee2122..26d7a0e 100644 --- a/src/net/mosstest/servercore/DrawableWorld.java +++ b/src/net/mosstest/servercore/DrawableWorld.java @@ -1,14 +1,14 @@ -package net.mosstest.servercore; - -import net.mosstest.scripting.MapNode; -import net.mosstest.scripting.Position; - - -public class DrawableWorld { - - public void addBlockMesh(MapNode mapNode, Position pos) { - // TODO Auto-generated method stub - - } - -} +package net.mosstest.servercore; + +import net.mosstest.scripting.MapNode; +import net.mosstest.scripting.Position; + + +public class DrawableWorld { + + public void addBlockMesh(MapNode mapNode, Position pos) { + // TODO Auto-generated method stub + + } + +} diff --git a/src/net/mosstest/servercore/DuplicateNodedefException.java b/src/net/mosstest/servercore/DuplicateNodedefException.java index 9a29dd9..a333c2f 100644 --- a/src/net/mosstest/servercore/DuplicateNodedefException.java +++ b/src/net/mosstest/servercore/DuplicateNodedefException.java @@ -1,5 +1,5 @@ -package net.mosstest.servercore; - -public class DuplicateNodedefException extends Exception { - -} +package net.mosstest.servercore; + +public class DuplicateNodedefException extends Exception { + +} diff --git a/src/net/mosstest/servercore/EngineSettings.java b/src/net/mosstest/servercore/EngineSettings.java index 895dadd..9ad94b6 100644 --- a/src/net/mosstest/servercore/EngineSettings.java +++ b/src/net/mosstest/servercore/EngineSettings.java @@ -1,17 +1,17 @@ -package net.mosstest.servercore; - -public class EngineSettings { - static int getInt(String name, int def){ - if("forced".equals("false")){ - return 0; //TODO this case - } - return def; - } - - public static boolean getBool(String string, boolean def) { - if("forced".equals("false")){ - return false; //TODO this case - } - return def; - } -} +package net.mosstest.servercore; + +public class EngineSettings { + static int getInt(String name, int def){ + if("forced".equals("false")){ + return 0; //TODO this case + } + return def; + } + + public static boolean getBool(String string, boolean def) { + if("forced".equals("false")){ + return false; //TODO this case + } + return def; + } +} diff --git a/src/net/mosstest/servercore/EventProcessor.java b/src/net/mosstest/servercore/EventProcessor.java index e9ac6ab..4200f55 100644 --- a/src/net/mosstest/servercore/EventProcessor.java +++ b/src/net/mosstest/servercore/EventProcessor.java @@ -1,180 +1,180 @@ -package net.mosstest.servercore; - -import java.util.ArrayList; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; - -import net.mosstest.scripting.EventProcessingCompletedSignal; -import net.mosstest.scripting.MossEvent; -import net.mosstest.scripting.MossEventHandler; -import net.mosstest.scripting.MossScriptEnv; -import net.mosstest.scripting.MossScriptException; -import net.mosstest.scripting.MossEvent.EvtType; - -/** - * - * @author rarkenin, hexafraction - * - * Blargh. - * - * This is a nasty thread pool. If you don't understand threading or - * Java well, you may want to stick to only accessing the queue as - * otherwise asphyxiation, drowning, or chlorine poisoning may occur. - * USE ACCESS METHODS OTHER THAN THE QUEUE AT YOUR OWN RISK. - * - */ -public class EventProcessor { - ArrayBlockingQueue eventQueue = new ArrayBlockingQueue<>( - EngineSettings.getInt("eventQueueCapacity", 40), false); //$NON-NLS-1$ - protected final int maxEventThreads = EngineSettings.getInt( - "maxEventThreads", 8); //$NON-NLS-1$ - protected final int initialEventThreads = EngineSettings.getInt( - "initialEventThreads", 8); //$NON-NLS-1$ - ThreadGroup eventProcessorGroup = new ThreadGroup("EventProcessor"); //$NON-NLS-1$ - protected AtomicBoolean runManager = new AtomicBoolean(true); - protected final int sampleInterval = EngineSettings.getInt( - "eventQueueTuneSampleInterval", 100); //$NON-NLS-1$ - protected final int upshift = EngineSettings.getInt( - "eventQueueTuneUpshift", 90); //$NON-NLS-1$ - protected final int downshift = EngineSettings.getInt( - "eventQueueTuneDownshift", 10); //$NON-NLS-1$ - protected final int samples = EngineSettings.getInt( - "eventQueueTuneSamples", 100); //$NON-NLS-1$ - protected final AtomicInteger currentThreads = new AtomicInteger(0); - private Thread manager = new Thread(this.eventProcessorGroup, - new Runnable() { - /** - * - * The manager. Controls the thread number. - */ - @SuppressWarnings("nls") - @Override - public void run() { - - System.out.println("manager thread started"); //$NON-NLS-1$ - int ticks = 0; - int ticksBusy = 0; - int lSampleInterval = EventProcessor.this.sampleInterval; - int lUpshift = EventProcessor.this.upshift; - int lDownshift = EventProcessor.this.downshift; - int lSamples = EventProcessor.this.samples; - Thread[] threads = new Thread[EventProcessor.this.maxEventThreads]; - - for (int i = 0; i < EventProcessor.this.initialEventThreads; i++) { - System.out.println("foo"); //$NON-NLS-1$ - int c = EventProcessor.this.currentThreads.get(); - threads[c] = new Thread( - EventProcessor.this.eventProcessorGroup, - new Runnable() { - - @Override - public void run() { - System.out - .println("Worker thread starteds"); //$NON-NLS-1$ - processEvents(); - } - - }); - threads[c].start(); - - System.out.println("PostRun"); //$NON-NLS-1$ - EventProcessor.this.currentThreads.incrementAndGet(); - - } - while (EventProcessor.this.runManager.get()) { - ticks++; - if (!EventProcessor.this.eventQueue.isEmpty()) { - ticksBusy++; - } - if (ticks >= lSamples) { - if ((EventProcessor.this.currentThreads.get() < EventProcessor.this.maxEventThreads) - && (((float) ticksBusy / (float) ticks) > ((float) lUpshift / (float) lSamples))) { - new Thread( - EventProcessor.this.eventProcessorGroup, - new Runnable() { - - @Override - public void run() { - System.out - .println("Dynamically added thread"); //$NON-NLS-1$ - processEvents(); - } - - }).run(); - EventProcessor.this.currentThreads - .incrementAndGet(); - - } - if (((float) ticksBusy / (float) ticks) < ((float) lDownshift / (float) lSamples)) { - System.out.println(("Stopping one thread")); - EventProcessor.this.eventQueue - .add(new MossEvent( - MossEvent.EvtType.EVT_THREADSTOP, - null, null, null, null, null, - null, null, 0, null, - new ScriptSandboxBorderToken( - 84, - EventProcessor.class))); - - } - ticks = 0; - ticksBusy = 0; - } - try { - Thread.sleep(lSampleInterval); - } catch (InterruptedException e) { - // manager awoke, no problem - } - } - } - }, "EventProcessorManager"); //$NON-NLS-1$ - private MossScriptEnv ev; - - void processEvents() { - System.out.println("Worker thread entered"); //$NON-NLS-1$ - boolean run = true; // Not synchronized as only used locally - queueLoop: while (run) { - try { - MossEvent myEvent = this.eventQueue.take(); - {// Section for actually handling the events - if (myEvent.type == EvtType.EVT_THREADSTOP) { - this.currentThreads.decrementAndGet(); - return; - } - ArrayList evtHandlerList = this.ev - .getHandlers(myEvent.type, - new ScriptSandboxBorderToken(84, - EventProcessor.class)); - try { - for (MossEventHandler ourHandler : evtHandlerList) { - if (ourHandler.processEvent(myEvent)) - continue queueLoop; - } - DefaultEventHandlers.processEvent(myEvent, this.ev); - } catch (MossScriptException e) { - // Event processing complete, pass - } - } - - } catch (InterruptedException e) { - // thread struck, shut down the operation. - } - System.out.println("Reached end of thread code"); //$NON-NLS-1$ - this.currentThreads.decrementAndGet(); - } - - } - - /** - * Constructs a new event processor. - * - * @param ev - * A script environment populated with event handlers. - */ - public EventProcessor(MossScriptEnv ev) { - this.ev = ev; - this.manager.start(); - } - -} +package net.mosstest.servercore; + +import java.util.ArrayList; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +import net.mosstest.scripting.EventProcessingCompletedSignal; +import net.mosstest.scripting.MossEvent; +import net.mosstest.scripting.MossEventHandler; +import net.mosstest.scripting.MossScriptEnv; +import net.mosstest.scripting.MossScriptException; +import net.mosstest.scripting.MossEvent.EvtType; + +/** + * + * @author rarkenin, hexafraction + * + * Blargh. + * + * This is a nasty thread pool. If you don't understand threading or + * Java well, you may want to stick to only accessing the queue as + * otherwise asphyxiation, drowning, or chlorine poisoning may occur. + * USE ACCESS METHODS OTHER THAN THE QUEUE AT YOUR OWN RISK. + * + */ +public class EventProcessor { + ArrayBlockingQueue eventQueue = new ArrayBlockingQueue<>( + EngineSettings.getInt("eventQueueCapacity", 40), false); //$NON-NLS-1$ + protected final int maxEventThreads = EngineSettings.getInt( + "maxEventThreads", 8); //$NON-NLS-1$ + protected final int initialEventThreads = EngineSettings.getInt( + "initialEventThreads", 8); //$NON-NLS-1$ + ThreadGroup eventProcessorGroup = new ThreadGroup("EventProcessor"); //$NON-NLS-1$ + protected AtomicBoolean runManager = new AtomicBoolean(true); + protected final int sampleInterval = EngineSettings.getInt( + "eventQueueTuneSampleInterval", 100); //$NON-NLS-1$ + protected final int upshift = EngineSettings.getInt( + "eventQueueTuneUpshift", 90); //$NON-NLS-1$ + protected final int downshift = EngineSettings.getInt( + "eventQueueTuneDownshift", 10); //$NON-NLS-1$ + protected final int samples = EngineSettings.getInt( + "eventQueueTuneSamples", 100); //$NON-NLS-1$ + protected final AtomicInteger currentThreads = new AtomicInteger(0); + private Thread manager = new Thread(this.eventProcessorGroup, + new Runnable() { + /** + * + * The manager. Controls the thread number. + */ + @SuppressWarnings("nls") + @Override + public void run() { + + System.out.println("manager thread started"); //$NON-NLS-1$ + int ticks = 0; + int ticksBusy = 0; + int lSampleInterval = EventProcessor.this.sampleInterval; + int lUpshift = EventProcessor.this.upshift; + int lDownshift = EventProcessor.this.downshift; + int lSamples = EventProcessor.this.samples; + Thread[] threads = new Thread[EventProcessor.this.maxEventThreads]; + + for (int i = 0; i < EventProcessor.this.initialEventThreads; i++) { + System.out.println("foo"); //$NON-NLS-1$ + int c = EventProcessor.this.currentThreads.get(); + threads[c] = new Thread( + EventProcessor.this.eventProcessorGroup, + new Runnable() { + + @Override + public void run() { + System.out + .println("Worker thread starteds"); //$NON-NLS-1$ + processEvents(); + } + + }); + threads[c].start(); + + System.out.println("PostRun"); //$NON-NLS-1$ + EventProcessor.this.currentThreads.incrementAndGet(); + + } + while (EventProcessor.this.runManager.get()) { + ticks++; + if (!EventProcessor.this.eventQueue.isEmpty()) { + ticksBusy++; + } + if (ticks >= lSamples) { + if ((EventProcessor.this.currentThreads.get() < EventProcessor.this.maxEventThreads) + && (((float) ticksBusy / (float) ticks) > ((float) lUpshift / (float) lSamples))) { + new Thread( + EventProcessor.this.eventProcessorGroup, + new Runnable() { + + @Override + public void run() { + System.out + .println("Dynamically added thread"); //$NON-NLS-1$ + processEvents(); + } + + }).run(); + EventProcessor.this.currentThreads + .incrementAndGet(); + + } + if (((float) ticksBusy / (float) ticks) < ((float) lDownshift / (float) lSamples)) { + System.out.println(("Stopping one thread")); + EventProcessor.this.eventQueue + .add(new MossEvent( + MossEvent.EvtType.EVT_THREADSTOP, + null, null, null, null, null, + null, null, 0, null, + new ScriptSandboxBorderToken( + 84, + EventProcessor.class))); + + } + ticks = 0; + ticksBusy = 0; + } + try { + Thread.sleep(lSampleInterval); + } catch (InterruptedException e) { + // manager awoke, no problem + } + } + } + }, "EventProcessorManager"); //$NON-NLS-1$ + private MossScriptEnv ev; + + void processEvents() { + System.out.println("Worker thread entered"); //$NON-NLS-1$ + boolean run = true; // Not synchronized as only used locally + queueLoop: while (run) { + try { + MossEvent myEvent = this.eventQueue.take(); + {// Section for actually handling the events + if (myEvent.type == EvtType.EVT_THREADSTOP) { + this.currentThreads.decrementAndGet(); + return; + } + ArrayList evtHandlerList = this.ev + .getHandlers(myEvent.type, + new ScriptSandboxBorderToken(84, + EventProcessor.class)); + try { + for (MossEventHandler ourHandler : evtHandlerList) { + if (ourHandler.processEvent(myEvent)) + continue queueLoop; + } + DefaultEventHandlers.processEvent(myEvent, this.ev); + } catch (MossScriptException e) { + // Event processing complete, pass + } + } + + } catch (InterruptedException e) { + // thread struck, shut down the operation. + } + System.out.println("Reached end of thread code"); //$NON-NLS-1$ + this.currentThreads.decrementAndGet(); + } + + } + + /** + * Constructs a new event processor. + * + * @param ev + * A script environment populated with event handlers. + */ + public EventProcessor(MossScriptEnv ev) { + this.ev = ev; + this.manager.start(); + } + +} diff --git a/src/net/mosstest/servercore/ExceptionHandler.java b/src/net/mosstest/servercore/ExceptionHandler.java index 3c3c594..c4fef8a 100644 --- a/src/net/mosstest/servercore/ExceptionHandler.java +++ b/src/net/mosstest/servercore/ExceptionHandler.java @@ -1,7 +1,7 @@ -package net.mosstest.servercore; - -public class ExceptionHandler { -public static void registerException(Exception e){ - //pass -} -} +package net.mosstest.servercore; + +public class ExceptionHandler { +public static void registerException(Exception e){ + //pass +} +} diff --git a/src/net/mosstest/servercore/FuturesProcessor.java b/src/net/mosstest/servercore/FuturesProcessor.java index 02eaefb..bf7709f 100644 --- a/src/net/mosstest/servercore/FuturesProcessor.java +++ b/src/net/mosstest/servercore/FuturesProcessor.java @@ -1,118 +1,118 @@ -package net.mosstest.servercore; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Random; -import java.util.TreeMap; - -public class FuturesProcessor { - Random r = new Random(); - TreeMap jobs = new TreeMap<>(); - volatile long nextWakeup = System.currentTimeMillis(); - - public Thread futuresThread = new Thread(new FuturesRunnable(), "futures"); - - public synchronized void runOnce(long delayMillis, Runnable runnable) { - Job tJob = new Job(System.currentTimeMillis() + delayMillis, 0, 0, 1.0, - false, runnable); - this.nextWakeup = (long) Math.min(this.nextWakeup, - System.currentTimeMillis() + delayMillis); - this.jobs.put(System.currentTimeMillis() + delayMillis, tJob); - this.futuresThread.interrupt(); - } - - public synchronized void registerAbm(long delayMillis, - long delayJitterMillis, double probability, Runnable runnable) { - Job tJob = new Job(System.currentTimeMillis(), delayMillis, - delayJitterMillis, probability, true, runnable); - this.nextWakeup = (long) Math.min(this.nextWakeup, - System.currentTimeMillis() + delayMillis + Math.random() - * delayJitterMillis); - this.jobs.put(System.currentTimeMillis(), tJob); - this.futuresThread.interrupt(); // interrupt, and step back to release - // the lock - } - - public void start() { - this.futuresThread.start(); - } - - private volatile boolean run = true; - - public class FuturesRunnable implements Runnable { - - @Override - public void run() { - while (FuturesProcessor.this.run) { - try { - Thread.sleep(FuturesProcessor.this.nextWakeup - - System.currentTimeMillis()); - } catch (InterruptedException | IllegalArgumentException e) { - // pass, got a new job. - } - - synchronized (FuturesProcessor.this) { - ArrayList requeues = new ArrayList<>(); - iterLoop: for (Iterator> iterator = FuturesProcessor.this.jobs - .entrySet().iterator(); iterator.hasNext();) { - Map.Entry e = iterator - .next(); - - // ascending key order - if (e.getKey() <= System.currentTimeMillis()) { - e.getValue().r.run(); - if (e.getValue().renew) { - requeues.add(e.getValue()); - } - iterator.remove(); - - } else - break iterLoop; - } - - for (Job job : requeues) { - job.nextInvocation = System.currentTimeMillis() - + job.delay + (long) Math.random() - * job.delayJitter; - FuturesProcessor.this.jobs.put(job.nextInvocation, job); - } - } - } - - } - - } - - public class Job { - long firstInvocation; - long delay; - long delayJitter; - double probability; - boolean renew; - Runnable r; - volatile long nextInvocation; - - /** - * @param firstInvocation - * @param delay - * @param delayJitter - * @param probability - * @param renew - * @param r - */ - public Job(long firstInvocation, long delay, long delayJitter, - double probability, boolean renew, Runnable r) { - this.firstInvocation = firstInvocation; - this.delay = delay; - this.delayJitter = delayJitter; - this.probability = probability; - this.renew = renew; - this.r = r; - this.nextInvocation = firstInvocation + delay - + (long) Math.random() * delayJitter; - } - - } -} +package net.mosstest.servercore; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Random; +import java.util.TreeMap; + +public class FuturesProcessor { + Random r = new Random(); + TreeMap jobs = new TreeMap<>(); + volatile long nextWakeup = System.currentTimeMillis(); + + public Thread futuresThread = new Thread(new FuturesRunnable(), "futures"); + + public synchronized void runOnce(long delayMillis, Runnable runnable) { + Job tJob = new Job(System.currentTimeMillis() + delayMillis, 0, 0, 1.0, + false, runnable); + this.nextWakeup = (long) Math.min(this.nextWakeup, + System.currentTimeMillis() + delayMillis); + this.jobs.put(System.currentTimeMillis() + delayMillis, tJob); + this.futuresThread.interrupt(); + } + + public synchronized void registerAbm(long delayMillis, + long delayJitterMillis, double probability, Runnable runnable) { + Job tJob = new Job(System.currentTimeMillis(), delayMillis, + delayJitterMillis, probability, true, runnable); + this.nextWakeup = (long) Math.min(this.nextWakeup, + System.currentTimeMillis() + delayMillis + Math.random() + * delayJitterMillis); + this.jobs.put(System.currentTimeMillis(), tJob); + this.futuresThread.interrupt(); // interrupt, and step back to release + // the lock + } + + public void start() { + this.futuresThread.start(); + } + + private volatile boolean run = true; + + public class FuturesRunnable implements Runnable { + + @Override + public void run() { + while (FuturesProcessor.this.run) { + try { + Thread.sleep(FuturesProcessor.this.nextWakeup + - System.currentTimeMillis()); + } catch (InterruptedException | IllegalArgumentException e) { + // pass, got a new job. + } + + synchronized (FuturesProcessor.this) { + ArrayList requeues = new ArrayList<>(); + iterLoop: for (Iterator> iterator = FuturesProcessor.this.jobs + .entrySet().iterator(); iterator.hasNext();) { + Map.Entry e = iterator + .next(); + + // ascending key order + if (e.getKey() <= System.currentTimeMillis()) { + e.getValue().r.run(); + if (e.getValue().renew) { + requeues.add(e.getValue()); + } + iterator.remove(); + + } else + break iterLoop; + } + + for (Job job : requeues) { + job.nextInvocation = System.currentTimeMillis() + + job.delay + (long) Math.random() + * job.delayJitter; + FuturesProcessor.this.jobs.put(job.nextInvocation, job); + } + } + } + + } + + } + + public class Job { + long firstInvocation; + long delay; + long delayJitter; + double probability; + boolean renew; + Runnable r; + volatile long nextInvocation; + + /** + * @param firstInvocation + * @param delay + * @param delayJitter + * @param probability + * @param renew + * @param r + */ + public Job(long firstInvocation, long delay, long delayJitter, + double probability, boolean renew, Runnable r) { + this.firstInvocation = firstInvocation; + this.delay = delay; + this.delayJitter = delayJitter; + this.probability = probability; + this.renew = renew; + this.r = r; + this.nextInvocation = firstInvocation + delay + + (long) Math.random() * delayJitter; + } + + } +} diff --git a/src/net/mosstest/servercore/GameMesh.java b/src/net/mosstest/servercore/GameMesh.java index b77ed37..aa0a03a 100644 --- a/src/net/mosstest/servercore/GameMesh.java +++ b/src/net/mosstest/servercore/GameMesh.java @@ -1,5 +1,5 @@ -package net.mosstest.servercore; - -public class GameMesh { - -} +package net.mosstest.servercore; + +public class GameMesh { + +} diff --git a/src/net/mosstest/servercore/GenericTexture.java b/src/net/mosstest/servercore/GenericTexture.java index 9a75b53..7b4a58e 100644 --- a/src/net/mosstest/servercore/GenericTexture.java +++ b/src/net/mosstest/servercore/GenericTexture.java @@ -1,6 +1,6 @@ -package net.mosstest.servercore; - -public abstract class GenericTexture { -static long lastAllocatedTexId; - -} +package net.mosstest.servercore; + +public abstract class GenericTexture { +static long lastAllocatedTexId; + +} diff --git a/src/net/mosstest/servercore/IRenderPreparator.java b/src/net/mosstest/servercore/IRenderPreparator.java index 05d78e4..ceaff05 100644 --- a/src/net/mosstest/servercore/IRenderPreparator.java +++ b/src/net/mosstest/servercore/IRenderPreparator.java @@ -1,14 +1,18 @@ -package net.mosstest.servercore; - -import net.mosstest.scripting.MapChunk; -import net.mosstest.scripting.Position; - -public interface IRenderPreparator { - - public abstract MapChunk requestChunk(Position pos) - throws MapGeneratorException, InterruptedException; - - public abstract void recvOutstandingChunk(Position pos, MapChunk chk); - - public abstract void shutdown(); +package net.mosstest.servercore; + +import net.mosstest.scripting.MapChunk; +import net.mosstest.scripting.Position; + +public interface IRenderPreparator { + + public void setRenderProcessor(RenderProcessor rend); + + public abstract MapChunk requestChunk(Position pos) + throws MapGeneratorException, InterruptedException; + + public abstract void recvOutstandingChunk(Position pos, MapChunk chk); + + public abstract void shutdown(); + + public abstract void start(); } \ No newline at end of file diff --git a/src/net/mosstest/servercore/ItemManager.java b/src/net/mosstest/servercore/ItemManager.java index 3020eb4..c97ad73 100644 --- a/src/net/mosstest/servercore/ItemManager.java +++ b/src/net/mosstest/servercore/ItemManager.java @@ -1,29 +1,29 @@ -package net.mosstest.servercore; - -import java.util.HashMap; - -import net.mosstest.scripting.MapNode; -import net.mosstest.scripting.MossItem; - -public class ItemManager { - - private static HashMap itemsForNode = new HashMap<>(); - - public static MossItem getForNode(MapNode mapNode) { - MossItem item = itemsForNode.get(mapNode); - if (item == null) { - //item = createForNode(mapNode); //FIXME - itemsForNode.put(mapNode, item); - return item; - } else - return item; - } - - /*private static MossItem createForNode(MapNode mapNode) { - MossItem mi=new MossItem(mapNode.texture, mapNode, 1, true, mapNode.userFacingName, mapNode.nodeName) - return mi; - //TODO todo - } -*/ - //FIXME above -} +package net.mosstest.servercore; + +import java.util.HashMap; + +import net.mosstest.scripting.MapNode; +import net.mosstest.scripting.MossItem; + +public class ItemManager { + + private static HashMap itemsForNode = new HashMap<>(); + + public static MossItem getForNode(MapNode mapNode) { + MossItem item = itemsForNode.get(mapNode); + if (item == null) { + //item = createForNode(mapNode); //FIXME + itemsForNode.put(mapNode, item); + return item; + } else + return item; + } + + /*private static MossItem createForNode(MapNode mapNode) { + MossItem mi=new MossItem(mapNode.texture, mapNode, 1, true, mapNode.userFacingName, mapNode.nodeName) + return mi; + //TODO todo + } +*/ + //FIXME above +} diff --git a/src/net/mosstest/servercore/Launcher.java b/src/net/mosstest/servercore/Launcher.java index 68d6411..130e27d 100644 --- a/src/net/mosstest/servercore/Launcher.java +++ b/src/net/mosstest/servercore/Launcher.java @@ -1,9 +1,9 @@ -package net.mosstest.servercore; - -public class Launcher { - public static void main(String[] args){ - //real todo - } - - -} +package net.mosstest.servercore; + +public class Launcher { + public static void main(String[] args){ + //real todo + } + + +} diff --git a/src/net/mosstest/servercore/LocalRenderPreparator.java b/src/net/mosstest/servercore/LocalRenderPreparator.java index 1e49326..1e63fa9 100644 --- a/src/net/mosstest/servercore/LocalRenderPreparator.java +++ b/src/net/mosstest/servercore/LocalRenderPreparator.java @@ -1,81 +1,91 @@ -package net.mosstest.servercore; - -import java.util.concurrent.ArrayBlockingQueue; - -import net.mosstest.scripting.MapChunk; -import net.mosstest.scripting.Position; - -public class LocalRenderPreparator implements IRenderPreparator { - public class ChunkLookupRunnable implements Runnable { - - @Override - public void run() { - while (LocalRenderPreparator.this.run) { - try { - Position requested = LocalRenderPreparator.this.chunkRequests - .take(); - System.out.println("REQUESTED " + requested.x + "," - + requested.y + "," + requested.z); - MapChunk chk = LocalRenderPreparator.this.nc - .getChunk(requested); - chk.pos = requested; - LocalRenderPreparator.this.rp.renderEventQueue - .put(new MossRenderChunkEvent(chk)); - } catch (InterruptedException e) { - // pass - } catch (MapGeneratorException e) { - System.out - .print("The map generator has thrown an exception."); - } - } - } - - } - - private RenderProcessor rp; - private NodeCache nc; - private volatile boolean run = true; - public ArrayBlockingQueue chunkRequests = new ArrayBlockingQueue<>( - 1024); - // private HashMap outstandingChunks = new HashMap<>(); - - private Thread lookupThread = new Thread(new ChunkLookupRunnable()); - - @Override - public MapChunk requestChunk(Position pos) throws MapGeneratorException, - InterruptedException { - try { - MapChunk chk = this.nc.getChunkFailFast(pos); - System.out.println(chk == null ? "null chunk failfast" : chk - .toString()); - if (chk == null) { - this.chunkRequests.put(pos); - } - return chk; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - public LocalRenderPreparator(RenderProcessor rp, NodeCache nc) { - this.rp = rp; - this.nc = nc; - this.lookupThread.start(); - } - - @Override - public void shutdown() { - this.run = false; - } - - @Override - public void recvOutstandingChunk(Position pos, MapChunk chk) { - // TODO Auto-generated method stub - - } - - // TODO: Handle player movement, other server->client events affecting - // rendering - -} +package net.mosstest.servercore; + +import java.util.concurrent.ArrayBlockingQueue; + +import net.mosstest.scripting.MapChunk; +import net.mosstest.scripting.Position; + +public class LocalRenderPreparator implements IRenderPreparator { + public class ChunkLookupRunnable implements Runnable { + + @Override + public void run() { + while (LocalRenderPreparator.this.run) { + try { + Position requested = LocalRenderPreparator.this.chunkRequests + .take(); + System.out.println("REQUESTED " + requested.x + "," + + requested.y + "," + requested.z); + MapChunk chk = LocalRenderPreparator.this.nc + .getChunk(requested); + chk.pos = requested; + LocalRenderPreparator.this.rend.renderEventQueue + .put(new MossRenderChunkEvent(chk)); + } catch (InterruptedException e) { + // pass + } catch (MapGeneratorException e) { + System.out + .print("The map generator has thrown an exception."); + } + } + } + + } + + private RenderProcessor rend; + private NodeCache nc; + private volatile boolean run = true; + public ArrayBlockingQueue chunkRequests = new ArrayBlockingQueue<>( + 1024); + // private HashMap outstandingChunks = new HashMap<>(); + + private Thread lookupThread = new Thread(new ChunkLookupRunnable()); + + @Override + public MapChunk requestChunk(Position pos) throws MapGeneratorException, + InterruptedException { + try { + MapChunk chk = this.nc.getChunkFailFast(pos); + System.out.println(chk == null ? "null chunk failfast" : chk + .toString()); + if (chk == null) { + this.chunkRequests.put(pos); + } + return chk; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public LocalRenderPreparator(RenderProcessor rp, NodeCache nc) { + this.rend = rp; + this.nc = nc; + } + + @Override + public void shutdown() { + this.run = false; + } + + @Override + public void recvOutstandingChunk(Position pos, MapChunk chk) { + // pass + } + + @Override + public void start() { + System.out.println("<<< START LOCAL RENDER PREPARATOR >>>"); + this.lookupThread.start(); + + } + + @Override + public void setRenderProcessor(RenderProcessor rend) { + this.rend = rend; + } + + // TODO: Handle player movement, other server->client events affecting + // rendering + +} diff --git a/src/net/mosstest/servercore/MapChangeEvent.java b/src/net/mosstest/servercore/MapChangeEvent.java index 889f087..20faff9 100644 --- a/src/net/mosstest/servercore/MapChangeEvent.java +++ b/src/net/mosstest/servercore/MapChangeEvent.java @@ -1,5 +1,5 @@ -package net.mosstest.servercore; - -public class MapChangeEvent { - -} +package net.mosstest.servercore; + +public class MapChangeEvent { + +} diff --git a/src/net/mosstest/servercore/MapDatabaseException.java b/src/net/mosstest/servercore/MapDatabaseException.java index f7806bc..8d2589d 100644 --- a/src/net/mosstest/servercore/MapDatabaseException.java +++ b/src/net/mosstest/servercore/MapDatabaseException.java @@ -1,18 +1,18 @@ -package net.mosstest.servercore; - -public class MapDatabaseException extends Exception{ - private static final long serialVersionUID = -1261363696203853384L; - public static final int SEVERITY_CORRUPT = 0; - public static final int SEVERITY_CORRUPT_REPARABLE = 1; - public static final int SEVERITY_FATAL_TRANSIENT = 2; - public static final int SEVERITY_WARNING = 4; - public static final int SEVERITY_NOTFOUND = 8; - public static final int SEVERITY_UNKNOWN = 16; - public String desc; - public int severity; - public MapDatabaseException(int severity, String desc) { - super(); - this.desc = desc; - this.severity = severity; - } -} +package net.mosstest.servercore; + +public class MapDatabaseException extends Exception{ + private static final long serialVersionUID = -1261363696203853384L; + public static final int SEVERITY_CORRUPT = 0; + public static final int SEVERITY_CORRUPT_REPARABLE = 1; + public static final int SEVERITY_FATAL_TRANSIENT = 2; + public static final int SEVERITY_WARNING = 4; + public static final int SEVERITY_NOTFOUND = 8; + public static final int SEVERITY_UNKNOWN = 16; + public String desc; + public int severity; + public MapDatabaseException(int severity, String desc) { + super(); + this.desc = desc; + this.severity = severity; + } +} diff --git a/src/net/mosstest/servercore/MapGeneratorException.java b/src/net/mosstest/servercore/MapGeneratorException.java index cd710f0..ac5fe5e 100644 --- a/src/net/mosstest/servercore/MapGeneratorException.java +++ b/src/net/mosstest/servercore/MapGeneratorException.java @@ -1,8 +1,8 @@ -package net.mosstest.servercore; - -public class MapGeneratorException extends Exception { - - - private static final long serialVersionUID = -8402982836293707854L; - //marker type -} +package net.mosstest.servercore; + +public class MapGeneratorException extends Exception { + + + private static final long serialVersionUID = -8402982836293707854L; + //marker type +} diff --git a/src/net/mosstest/servercore/Messages.java b/src/net/mosstest/servercore/Messages.java index b7f4452..4a0ecdb 100644 --- a/src/net/mosstest/servercore/Messages.java +++ b/src/net/mosstest/servercore/Messages.java @@ -1,22 +1,22 @@ -package net.mosstest.servercore; - -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -public class Messages { - private static final String BUNDLE_NAME = "net.mosstest.servercore.messages"; //$NON-NLS-1$ - - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle - .getBundle(BUNDLE_NAME); - - private Messages() { - } - - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } -} +package net.mosstest.servercore; + +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + private static final String BUNDLE_NAME = "net.mosstest.servercore.messages"; //$NON-NLS-1$ + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle + .getBundle(BUNDLE_NAME); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} diff --git a/src/net/mosstest/servercore/MossChunkDrawEvent.java b/src/net/mosstest/servercore/MossChunkDrawEvent.java index 39ccd3d..26aa52d 100644 --- a/src/net/mosstest/servercore/MossChunkDrawEvent.java +++ b/src/net/mosstest/servercore/MossChunkDrawEvent.java @@ -1,5 +1,5 @@ -package net.mosstest.servercore; - -public class MossChunkDrawEvent extends MossRenderEvent { - -} +package net.mosstest.servercore; + +public class MossChunkDrawEvent extends MossRenderEvent { + +} diff --git a/src/net/mosstest/servercore/MossFile.java b/src/net/mosstest/servercore/MossFile.java index eceb222..3f485ee 100644 --- a/src/net/mosstest/servercore/MossFile.java +++ b/src/net/mosstest/servercore/MossFile.java @@ -1,46 +1,46 @@ -package net.mosstest.servercore; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.RandomAccessFile; - -public abstract class MossFile { - /** - * Get a local copy of the file. This may be either a direct local file or a - * cached file. - * - * @return A valid RandomAccessFile. - * @throws FileNotFoundException - */ - public abstract RandomAccessFile getRandAccessCopy() throws FileNotFoundException; - - - /** - * String denoting the containing directory for the pathname. - */ - public final String dirName; - - public abstract byte[] readChunk(int chk) throws IOException; - - /** - * String denoting name of resource. - */ - public final String resourceName; - - - public abstract long getSize(); - - /** - * @param author - * @param plugin - * @param resourceName - */ - public MossFile(String dirName, String resourceName) { - this.dirName=dirName; - this.resourceName = resourceName; - } - - public abstract File getFile() throws IOException; - -} +package net.mosstest.servercore; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; + +public abstract class MossFile { + /** + * Get a local copy of the file. This may be either a direct local file or a + * cached file. + * + * @return A valid RandomAccessFile. + * @throws FileNotFoundException + */ + public abstract RandomAccessFile getRandAccessCopy() throws FileNotFoundException; + + + /** + * String denoting the containing directory for the pathname. + */ + public final String dirName; + + public abstract byte[] readChunk(int chk) throws IOException; + + /** + * String denoting name of resource. + */ + public final String resourceName; + + + public abstract long getSize(); + + /** + * @param author + * @param plugin + * @param resourceName + */ + public MossFile(String dirName, String resourceName) { + this.dirName=dirName; + this.resourceName = resourceName; + } + + public abstract File getFile() throws IOException; + +} diff --git a/src/net/mosstest/servercore/MossGame.java b/src/net/mosstest/servercore/MossGame.java index 2b501a3..b6c1473 100644 --- a/src/net/mosstest/servercore/MossGame.java +++ b/src/net/mosstest/servercore/MossGame.java @@ -1,45 +1,45 @@ -package net.mosstest.servercore; - -import java.io.File; -import java.io.FileNotFoundException; -import java.util.ArrayList; - -import org.apache.commons.configuration.ConfigurationException; -import org.apache.commons.configuration.XMLConfiguration; - -public class MossGame { - @SuppressWarnings("nls") - public MossGame(String name) throws MossWorldLoadException { - this.baseDir = new File("data/games/" + name); //$NON-NLS-1$ - this.cfgFile = new File(this.baseDir, "game.xml"); - if (!(this.baseDir.isDirectory() && this.cfgFile.isFile())) { - throw new MossWorldLoadException( - "Game directory or configuration file not found."); - } - try { - this.gameCfg = new XMLConfiguration(this.cfgFile); - } catch (ConfigurationException e) { - throw new MossWorldLoadException( - "Error in loading the configuration file."); - } - this.scripts = new ArrayList<>(); - String[] scNames = this.gameCfg.getStringArray("plugin"); - for (String scName : scNames) { - try { - this.scripts.add(new MossScript(new MossLocalFile(new File("data/scripts/"), - scName, "init.js"))); - } catch (FileNotFoundException e) { - throw new MossWorldLoadException("file not found: " + scName); - } // TODO directory structure and proper iteration - } - } - - private File baseDir; - private XMLConfiguration gameCfg; - private File cfgFile; - private ArrayList scripts; - - public ArrayList getScripts() { - return this.scripts; - } -} +package net.mosstest.servercore; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.ArrayList; + +import org.apache.commons.configuration.ConfigurationException; +import org.apache.commons.configuration.XMLConfiguration; + +public class MossGame { + @SuppressWarnings("nls") + public MossGame(String name) throws MossWorldLoadException { + this.baseDir = new File("data/games/" + name); //$NON-NLS-1$ + this.cfgFile = new File(this.baseDir, "game.xml"); + if (!(this.baseDir.isDirectory() && this.cfgFile.isFile())) { + throw new MossWorldLoadException( + "Game directory or configuration file not found."); + } + try { + this.gameCfg = new XMLConfiguration(this.cfgFile); + } catch (ConfigurationException e) { + throw new MossWorldLoadException( + "Error in loading the configuration file."); + } + this.scripts = new ArrayList<>(); + String[] scNames = this.gameCfg.getStringArray("plugin"); + for (String scName : scNames) { + try { + this.scripts.add(new MossScript(new MossLocalFile(new File("data/scripts/"), + scName, "init.js"))); + } catch (FileNotFoundException e) { + throw new MossWorldLoadException("file not found: " + scName); + } // TODO directory structure and proper iteration + } + } + + private File baseDir; + private XMLConfiguration gameCfg; + private File cfgFile; + private ArrayList scripts; + + public ArrayList getScripts() { + return this.scripts; + } +} diff --git a/src/net/mosstest/servercore/MossGenericEvent.java b/src/net/mosstest/servercore/MossGenericEvent.java index d28a390..1e5c9d2 100644 --- a/src/net/mosstest/servercore/MossGenericEvent.java +++ b/src/net/mosstest/servercore/MossGenericEvent.java @@ -1,5 +1,5 @@ -package net.mosstest.servercore; - -public class MossGenericEvent { - -} +package net.mosstest.servercore; + +public class MossGenericEvent { + +} diff --git a/src/net/mosstest/servercore/MossLocalFile.java b/src/net/mosstest/servercore/MossLocalFile.java index 9a32005..5608052 100644 --- a/src/net/mosstest/servercore/MossLocalFile.java +++ b/src/net/mosstest/servercore/MossLocalFile.java @@ -1,50 +1,50 @@ -package net.mosstest.servercore; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.RandomAccessFile; - -public class MossLocalFile extends MossFile { - public static final int CHUNK_LENGTH = 65536; - - public MossLocalFile(File baseDir, String dirName, String resourceName) throws FileNotFoundException { - // super call to establish fields. - super(dirName, resourceName); - //ensure filename is valid. - if(!(dirName.matches("[a-zA-Z0-9.]*")&&resourceName.matches("[a-zA-Z0-9.]*"))) throw new FileNotFoundException(); - this.file = new File(baseDir, dirName); - this.file = new File(this.file, resourceName); - } - - private File file; - - @Override - public RandomAccessFile getRandAccessCopy() throws FileNotFoundException { - return new RandomAccessFile(this.file, "r"); - } - - public byte[] readChunk(int chk) throws IOException { - if ((chk < 0) || (chk > 65535)) - throw new IllegalArgumentException( - "attempted to access a chunk with an invalid length"); //$NON-NLS-1$ - byte[] buf = new byte[CHUNK_LENGTH]; - RandomAccessFile rf = new RandomAccessFile(this.file, this.dirName); - rf.seek(CHUNK_LENGTH * chk); - rf.readFully(buf); - rf.close(); - return buf; - } - - @Override - public long getSize() { - - return this.file.length(); - - } - - public File getFile() { - return this.file; - } - -} +package net.mosstest.servercore; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; + +public class MossLocalFile extends MossFile { + public static final int CHUNK_LENGTH = 65536; + + public MossLocalFile(File baseDir, String dirName, String resourceName) throws FileNotFoundException { + // super call to establish fields. + super(dirName, resourceName); + //ensure filename is valid. + if(!(dirName.matches("[a-zA-Z0-9.]*")&&resourceName.matches("[a-zA-Z0-9.]*"))) throw new FileNotFoundException(); + this.file = new File(baseDir, dirName); + this.file = new File(this.file, resourceName); + } + + private File file; + + @Override + public RandomAccessFile getRandAccessCopy() throws FileNotFoundException { + return new RandomAccessFile(this.file, "r"); + } + + public byte[] readChunk(int chk) throws IOException { + if ((chk < 0) || (chk > 65535)) + throw new IllegalArgumentException( + "attempted to access a chunk with an invalid length"); //$NON-NLS-1$ + byte[] buf = new byte[CHUNK_LENGTH]; + RandomAccessFile rf = new RandomAccessFile(this.file, this.dirName); + rf.seek(CHUNK_LENGTH * chk); + rf.readFully(buf); + rf.close(); + return buf; + } + + @Override + public long getSize() { + + return this.file.length(); + + } + + public File getFile() { + return this.file; + } + +} diff --git a/src/net/mosstest/servercore/MossNetPacket.java b/src/net/mosstest/servercore/MossNetPacket.java index faac825..b6659c2 100644 --- a/src/net/mosstest/servercore/MossNetPacket.java +++ b/src/net/mosstest/servercore/MossNetPacket.java @@ -1,31 +1,31 @@ -package net.mosstest.servercore; - -public class MossNetPacket { - int commandId; - byte[] payload; - boolean needsFast; - boolean needsAck; - boolean isImportant; - ServerSession sess; - /** - * Constructs a packet, for either sending or from receiving. - * @param commandId The command ID - * @param payload The payload, as a byte array. - */ - public MossNetPacket(int commandId, byte[] payload) { - this.commandId = commandId; - this.payload = payload; - this.needsAck = true; - this.needsFast = false; - this.isImportant = true; - } - public MossNetPacket(int commandId, byte[] payload, boolean needsFast, - boolean needsAck, boolean isImportant) { - this.commandId = commandId; - this.payload = payload; - this.needsFast = needsFast; - this.needsAck = needsAck; - this.isImportant = true; - } - -} +package net.mosstest.servercore; + +public class MossNetPacket { + int commandId; + byte[] payload; + boolean needsFast; + boolean needsAck; + boolean isImportant; + ServerSession sess; + /** + * Constructs a packet, for either sending or from receiving. + * @param commandId The command ID + * @param payload The payload, as a byte array. + */ + public MossNetPacket(int commandId, byte[] payload) { + this.commandId = commandId; + this.payload = payload; + this.needsAck = true; + this.needsFast = false; + this.isImportant = true; + } + public MossNetPacket(int commandId, byte[] payload, boolean needsFast, + boolean needsAck, boolean isImportant) { + this.commandId = commandId; + this.payload = payload; + this.needsFast = needsFast; + this.needsAck = needsAck; + this.isImportant = true; + } + +} diff --git a/src/net/mosstest/servercore/MossNodeAddEvent.java b/src/net/mosstest/servercore/MossNodeAddEvent.java index 2d5388e..539d6e1 100644 --- a/src/net/mosstest/servercore/MossNodeAddEvent.java +++ b/src/net/mosstest/servercore/MossNodeAddEvent.java @@ -1,31 +1,31 @@ -package net.mosstest.servercore; - -import net.mosstest.scripting.Position; - -public class MossNodeAddEvent extends MossRenderEvent { - private int x, y, z; //position in chunk - private short definition; - private Position parentChunkPosition; - public MossNodeAddEvent (int x, int y, int z, Position parentChunkPosition, short definition) { - this.x = x; - this.y = y; - this.z = z; - this.definition = definition; - this.parentChunkPosition = parentChunkPosition; - } - public int getX() { - return x; - } - public int getY() { - return y; - } - public int getZ() { - return z; - } - public short getDef() { - return definition; - } - public Position getPosition () { - return parentChunkPosition; - } -} +package net.mosstest.servercore; + +import net.mosstest.scripting.Position; + +public class MossNodeAddEvent extends MossRenderEvent { + private int x, y, z; //position in chunk + private short definition; + private Position parentChunkPosition; + public MossNodeAddEvent (int x, int y, int z, Position parentChunkPosition, short definition) { + this.x = x; + this.y = y; + this.z = z; + this.definition = definition; + this.parentChunkPosition = parentChunkPosition; + } + public int getX() { + return x; + } + public int getY() { + return y; + } + public int getZ() { + return z; + } + public short getDef() { + return definition; + } + public Position getPosition () { + return parentChunkPosition; + } +} diff --git a/src/net/mosstest/servercore/MossNodeMoveEvent.java b/src/net/mosstest/servercore/MossNodeMoveEvent.java index 8246446..70b2375 100644 --- a/src/net/mosstest/servercore/MossNodeMoveEvent.java +++ b/src/net/mosstest/servercore/MossNodeMoveEvent.java @@ -1,5 +1,5 @@ -package net.mosstest.servercore; - -public class MossNodeMoveEvent { - -} +package net.mosstest.servercore; + +public class MossNodeMoveEvent { + +} diff --git a/src/net/mosstest/servercore/MossNodeRemoveEvent.java b/src/net/mosstest/servercore/MossNodeRemoveEvent.java index 4ea58a1..f9af3d2 100644 --- a/src/net/mosstest/servercore/MossNodeRemoveEvent.java +++ b/src/net/mosstest/servercore/MossNodeRemoveEvent.java @@ -1,5 +1,5 @@ -package net.mosstest.servercore; - -public class MossNodeRemoveEvent { - -} +package net.mosstest.servercore; + +public class MossNodeRemoveEvent { + +} diff --git a/src/net/mosstest/servercore/MossRemoteFile.java b/src/net/mosstest/servercore/MossRemoteFile.java index b13b0a3..c99916f 100644 --- a/src/net/mosstest/servercore/MossRemoteFile.java +++ b/src/net/mosstest/servercore/MossRemoteFile.java @@ -1,84 +1,84 @@ -package net.mosstest.servercore; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.util.BitSet; - -public class MossRemoteFile extends MossFile { - public class IncompleteFileException extends IOException { - - - private static final long serialVersionUID = -4932174729349395760L; - - } - - public static final int CHUNK_LENGTH = 65536; - - public final int numChunks; - public final int length; - private BitSet chunksDone; - - public MossRemoteFile(File cacheDir, String dirName, String resourceName, - int length) throws FileNotFoundException { - // super call to establish fields. - super(dirName, resourceName); - //ensure filename is valid. - if(!(dirName.matches("[a-zA-Z0-9]*")&&resourceName.matches("[a-zA-Z0-9]*"))) throw new FileNotFoundException(); - this.file = new File(cacheDir, dirName); - this.file = new File(this.file, resourceName); - this.length = length; - this.numChunks = (length / 65536) + 1; - this.chunksDone = new BitSet(this.numChunks); - } - - private File file; - - @Override - public RandomAccessFile getRandAccessCopy() throws FileNotFoundException { - return new RandomAccessFile(this.file, "rwd"); //$NON-NLS-1$ - } - - public byte[] readChunk(int chk) throws IOException { - if ((chk < 0) || (chk > 65535)) - throw new IllegalArgumentException( - "attempted to access a chunk with an invalid length"); //$NON-NLS-1$ - byte[] buf = new byte[CHUNK_LENGTH]; - RandomAccessFile rf = new RandomAccessFile(this.file, "r"); - rf.seek(CHUNK_LENGTH * chk); - rf.readFully(buf); - rf.close(); - return buf; - } - - public void writeChunk(int chk, byte[] data) throws IOException { - // this will check if the chunk is the last one. If it is then it will - // use only the correct number of bytes. Otherwise it will use - // CHUNK_LENGTH. - if (data.length != ((chk == this.numChunks - 1) ? this.length - % CHUNK_LENGTH : CHUNK_LENGTH)) - throw new ArrayIndexOutOfBoundsException("Array is not 65536 bytes"); //$NON-NLS-1$ - RandomAccessFile rf = new RandomAccessFile(this.file, "rwd"); - rf.seek(chk*CHUNK_LENGTH); - rf.write(data); - this.chunksDone.set(chk, true); - rf.close(); - } - - @Override - public long getSize() { - - return this.file.length(); - - } - - public File getFile() throws IncompleteFileException { - if(!this.isReady()) throw new IncompleteFileException(); - return this.file; - } - - public boolean isReady() { - return (this.chunksDone.cardinality()==this.numChunks); - } -} +package net.mosstest.servercore; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.BitSet; + +public class MossRemoteFile extends MossFile { + public class IncompleteFileException extends IOException { + + + private static final long serialVersionUID = -4932174729349395760L; + + } + + public static final int CHUNK_LENGTH = 65536; + + public final int numChunks; + public final int length; + private BitSet chunksDone; + + public MossRemoteFile(File cacheDir, String dirName, String resourceName, + int length) throws FileNotFoundException { + // super call to establish fields. + super(dirName, resourceName); + //ensure filename is valid. + if(!(dirName.matches("[a-zA-Z0-9]*")&&resourceName.matches("[a-zA-Z0-9]*"))) throw new FileNotFoundException(); + this.file = new File(cacheDir, dirName); + this.file = new File(this.file, resourceName); + this.length = length; + this.numChunks = (length / 65536) + 1; + this.chunksDone = new BitSet(this.numChunks); + } + + private File file; + + @Override + public RandomAccessFile getRandAccessCopy() throws FileNotFoundException { + return new RandomAccessFile(this.file, "rwd"); //$NON-NLS-1$ + } + + public byte[] readChunk(int chk) throws IOException { + if ((chk < 0) || (chk > 65535)) + throw new IllegalArgumentException( + "attempted to access a chunk with an invalid length"); //$NON-NLS-1$ + byte[] buf = new byte[CHUNK_LENGTH]; + RandomAccessFile rf = new RandomAccessFile(this.file, "r"); + rf.seek(CHUNK_LENGTH * chk); + rf.readFully(buf); + rf.close(); + return buf; + } + + public void writeChunk(int chk, byte[] data) throws IOException { + // this will check if the chunk is the last one. If it is then it will + // use only the correct number of bytes. Otherwise it will use + // CHUNK_LENGTH. + if (data.length != ((chk == this.numChunks - 1) ? this.length + % CHUNK_LENGTH : CHUNK_LENGTH)) + throw new ArrayIndexOutOfBoundsException("Array is not 65536 bytes"); //$NON-NLS-1$ + RandomAccessFile rf = new RandomAccessFile(this.file, "rwd"); + rf.seek(chk*CHUNK_LENGTH); + rf.write(data); + this.chunksDone.set(chk, true); + rf.close(); + } + + @Override + public long getSize() { + + return this.file.length(); + + } + + public File getFile() throws IncompleteFileException { + if(!this.isReady()) throw new IncompleteFileException(); + return this.file; + } + + public boolean isReady() { + return (this.chunksDone.cardinality()==this.numChunks); + } +} diff --git a/src/net/mosstest/servercore/MossRenderAddAssetPath.java b/src/net/mosstest/servercore/MossRenderAddAssetPath.java index 559756c..72224a1 100644 --- a/src/net/mosstest/servercore/MossRenderAddAssetPath.java +++ b/src/net/mosstest/servercore/MossRenderAddAssetPath.java @@ -1,11 +1,11 @@ -package net.mosstest.servercore; - -public class MossRenderAddAssetPath extends MossRenderEvent { - String path; - public MossRenderAddAssetPath (String newpath) { - path = newpath; - } - public String getPath () { - return path; - } -} +package net.mosstest.servercore; + +public class MossRenderAddAssetPath extends MossRenderEvent { + String path; + public MossRenderAddAssetPath (String newpath) { + path = newpath; + } + public String getPath () { + return path; + } +} diff --git a/src/net/mosstest/servercore/MossRenderEvent.java b/src/net/mosstest/servercore/MossRenderEvent.java index 596dffd..213ab42 100644 --- a/src/net/mosstest/servercore/MossRenderEvent.java +++ b/src/net/mosstest/servercore/MossRenderEvent.java @@ -1,7 +1,7 @@ -package net.mosstest.servercore; - -public class MossRenderEvent extends MossGenericEvent { - public MossRenderEvent () { - //Blank Constructor - } -} +package net.mosstest.servercore; + +public class MossRenderEvent extends MossGenericEvent { + public MossRenderEvent () { + //Blank Constructor + } +} diff --git a/src/net/mosstest/servercore/MossRenderStopEvent.java b/src/net/mosstest/servercore/MossRenderStopEvent.java index 8ee551a..7ff9c6a 100644 --- a/src/net/mosstest/servercore/MossRenderStopEvent.java +++ b/src/net/mosstest/servercore/MossRenderStopEvent.java @@ -1,5 +1,5 @@ -package net.mosstest.servercore; - -public class MossRenderStopEvent extends MossRenderEvent{ - -} +package net.mosstest.servercore; + +public class MossRenderStopEvent extends MossRenderEvent{ + +} diff --git a/src/net/mosstest/servercore/MossScript.java b/src/net/mosstest/servercore/MossScript.java index 556c440..b0cd141 100644 --- a/src/net/mosstest/servercore/MossScript.java +++ b/src/net/mosstest/servercore/MossScript.java @@ -1,32 +1,32 @@ -package net.mosstest.servercore; - -import java.io.FileReader; -import java.io.IOException; -import java.io.Reader; - -public class MossScript { - MossFile file; - - public MossScript(MossFile file) throws MossWorldLoadException { - this.file = file; - try { - if (!this.file.getFile().isFile()) - throw new MossWorldLoadException("Script named " + file.dirName - + "/" + file.resourceName + " not found!"); - } catch (IOException e) { - throw new MossWorldLoadException("IOException with script named " - + file.dirName + "/" + file.resourceName); - } - } - - Reader getReader() throws MossWorldLoadException { - try { - return new FileReader(this.file.getFile()); - } catch (IOException e) { - // whoa there, something REALLY bad happened - throw new MossWorldLoadException( - "Extremely unexpected situation on our hands"); - - } - } -} +package net.mosstest.servercore; + +import java.io.FileReader; +import java.io.IOException; +import java.io.Reader; + +public class MossScript { + MossFile file; + + public MossScript(MossFile file) throws MossWorldLoadException { + this.file = file; + try { + if (!this.file.getFile().isFile()) + throw new MossWorldLoadException("Script named " + file.dirName + + "/" + file.resourceName + " not found!"); + } catch (IOException e) { + throw new MossWorldLoadException("IOException with script named " + + file.dirName + "/" + file.resourceName); + } + } + + Reader getReader() throws MossWorldLoadException { + try { + return new FileReader(this.file.getFile()); + } catch (IOException e) { + // whoa there, something REALLY bad happened + throw new MossWorldLoadException( + "Extremely unexpected situation on our hands"); + + } + } +} diff --git a/src/net/mosstest/servercore/MossSecurityManager.java b/src/net/mosstest/servercore/MossSecurityManager.java index 08bae71..13e1520 100644 --- a/src/net/mosstest/servercore/MossSecurityManager.java +++ b/src/net/mosstest/servercore/MossSecurityManager.java @@ -1,5 +1,5 @@ -package net.mosstest.servercore; - -public class MossSecurityManager { -//Static crap only, shall use DB4O. -} +package net.mosstest.servercore; + +public class MossSecurityManager { +//Static crap only, shall use DB4O. +} diff --git a/src/net/mosstest/servercore/MossTest.java b/src/net/mosstest/servercore/MossTest.java index 4c27a2e..09cef82 100644 --- a/src/net/mosstest/servercore/MossTest.java +++ b/src/net/mosstest/servercore/MossTest.java @@ -1,23 +1,23 @@ -package net.mosstest.servercore; -import org.apache.commons.cli.Options; - - -public class MossTest { - - public MossTest() { - // TODO Auto-generated constructor stub - } - - /** - * @param args - */ - public static void main(String[] args) { - Options options=new Options(); - options.addOption("server", false, "Run as standalone server"); - options.addOption("port", true, "Port number to use"); - - - - } - -} +package net.mosstest.servercore; +import org.apache.commons.cli.Options; + + +public class MossTest { + + public MossTest() { + // TODO Auto-generated constructor stub + } + + /** + * @param args + */ + public static void main(String[] args) { + Options options=new Options(); + options.addOption("server", false, "Run as standalone server"); + options.addOption("port", true, "Port number to use"); + + + + } + +} diff --git a/src/net/mosstest/servercore/MossWorldLoadException.java b/src/net/mosstest/servercore/MossWorldLoadException.java index b7b23d2..d78ddc0 100644 --- a/src/net/mosstest/servercore/MossWorldLoadException.java +++ b/src/net/mosstest/servercore/MossWorldLoadException.java @@ -1,10 +1,10 @@ -package net.mosstest.servercore; - -public class MossWorldLoadException extends Exception { - String reason; - - public MossWorldLoadException(String string) { - reason = string; - } - -} +package net.mosstest.servercore; + +public class MossWorldLoadException extends Exception { + String reason; + + public MossWorldLoadException(String string) { + reason = string; + } + +} diff --git a/src/net/mosstest/servercore/NodeInstance.java b/src/net/mosstest/servercore/NodeInstance.java index c929480..4e32fbe 100644 --- a/src/net/mosstest/servercore/NodeInstance.java +++ b/src/net/mosstest/servercore/NodeInstance.java @@ -1,11 +1,11 @@ -package net.mosstest.servercore; - -import net.mosstest.scripting.MapNode; - -public class NodeInstance { - MapNode nodeType; - int xpos; - int ypos; - int zpos; - NodeInstanceHeavy heavyData; -} +package net.mosstest.servercore; + +import net.mosstest.scripting.MapNode; + +public class NodeInstance { + MapNode nodeType; + int xpos; + int ypos; + int zpos; + NodeInstanceHeavy heavyData; +} diff --git a/src/net/mosstest/servercore/NodeInstanceHeavy.java b/src/net/mosstest/servercore/NodeInstanceHeavy.java index 9fbe4fa..93bd281 100644 --- a/src/net/mosstest/servercore/NodeInstanceHeavy.java +++ b/src/net/mosstest/servercore/NodeInstanceHeavy.java @@ -1,5 +1,5 @@ -package net.mosstest.servercore; - -public class NodeInstanceHeavy { - -} +package net.mosstest.servercore; + +public class NodeInstanceHeavy { + +} diff --git a/src/net/mosstest/servercore/NodeManager.java b/src/net/mosstest/servercore/NodeManager.java index 46cad87..e08a901 100644 --- a/src/net/mosstest/servercore/NodeManager.java +++ b/src/net/mosstest/servercore/NodeManager.java @@ -1,80 +1,83 @@ -package net.mosstest.servercore; - -import java.util.ArrayList; - -import static org.fusesource.leveldbjni.JniDBFactory.asString; -import static org.fusesource.leveldbjni.JniDBFactory.bytes; - -import java.util.HashMap; -import java.util.Map.Entry; - -import net.mosstest.scripting.MapNode; - -import org.iq80.leveldb.DB; - -import com.google.common.collect.HashBiMap; - -public class NodeManager { - private ArrayList definedNodes = new ArrayList<>(); - private HashMap defNodeByName = new HashMap<>(); - private HashBiMap pending = HashBiMap.create(); - private DB nodeDb; - - private final MapNode unknownFallbackNode = new MapNode("unknown.png", - "sys:unknown", "An unknown piece of the world", 1); - { - this.unknownFallbackNode.setNodeId((short) -1); - } - - public MapNode getNode(short nodeId) { - return this.definedNodes.get(nodeId); - } - - public short putNode(MapNode node) throws MossWorldLoadException { - if (this.pending.containsValue(node.nodeName)) { - node.setNodeId(this.pending.inverse().get(node.nodeName)); - this.definedNodes.set(this.pending.inverse().get(node.nodeName), - node); - } else { - if (this.definedNodes.size() > 16384) - throw new MossWorldLoadException("Too many nodedefs"); //$NON-NLS-1$ - - node.setNodeId((short) this.definedNodes.size()); - - this.definedNodes.add(node); - this.nodeDb.put(new byte[] { (byte) (node.getNodeId() >>> 8), - (byte) (node.getNodeId() & 0xFF) }, bytes(node.nodeName)); - } - this.defNodeByName.put(node.nodeName, node); - - return node.getNodeId(); - } - - public void putNodeAlias(String alias, String dst) { - MapNode dstNode = this.defNodeByName.get(dst); - this.defNodeByName.put(alias, dstNode); - } - - public MapNode getNode(String string, boolean isModified) { - MapNode r = this.defNodeByName.get(string); - return r==null?this.unknownFallbackNode:r; - } - - public MapNode getNode(String string) { - - MapNode r = this.defNodeByName.get(string); - return r==null?this.unknownFallbackNode:r; - } - - /** - * - */ - public NodeManager(DB nodedb) { - this.nodeDb = nodedb; - for (Entry entry : nodedb) { - short parsedId = (short) (entry.getKey()[0] * 256 + entry.getKey()[1]); - String parsedString = asString(entry.getValue()); - this.pending.put(parsedId, parsedString); - } - } -} +package net.mosstest.servercore; + +import java.util.ArrayList; + +import static org.fusesource.leveldbjni.JniDBFactory.asString; +import static org.fusesource.leveldbjni.JniDBFactory.bytes; + +import java.util.HashMap; +import java.util.Map.Entry; + +import net.mosstest.scripting.MapNode; + +import org.iq80.leveldb.DB; + +import com.google.common.collect.HashBiMap; + +public class NodeManager { + private ArrayList definedNodes = new ArrayList<>(); + private HashMap defNodeByName = new HashMap<>(); + private HashBiMap pending = HashBiMap.create(); + private DB nodeDb; + + private final MapNode unknownFallbackNode = new MapNode("unknown.png", + "sys:unknown", "An unknown piece of the world", 1); + { + this.unknownFallbackNode.setNodeId((short) -1); + definedNodes.add(this.unknownFallbackNode); + } + + public MapNode getNode(short nodeId) { + return this.definedNodes.get(nodeId); + } + + public short putNode(MapNode node) throws MossWorldLoadException { + if (this.pending.containsValue(node.nodeName)) { + node.setNodeId(this.pending.inverse().get(node.nodeName)); + this.definedNodes.set(this.pending.inverse().get(node.nodeName), + node); + this.defNodeByName.put(node.nodeName, node); + } else { + if (this.definedNodes.size() > 16384) + throw new MossWorldLoadException("Too many nodedefs"); //$NON-NLS-1$ + + node.setNodeId((short) this.definedNodes.size()); + + this.definedNodes.add(node); + this.defNodeByName.put(node.nodeName, node); + this.nodeDb.put(new byte[] { (byte) (node.getNodeId() >>> 8), + (byte) (node.getNodeId() & 0xFF) }, bytes(node.nodeName)); + } + + + return node.getNodeId(); + } + + public void putNodeAlias(String alias, String dst) { + MapNode dstNode = this.defNodeByName.get(dst); + this.defNodeByName.put(alias, dstNode); + } + + public MapNode getNode(String string, boolean isModified) { + MapNode r = this.defNodeByName.get(string); + return r==null?this.unknownFallbackNode:r; + } + + public MapNode getNode(String string) { + + MapNode r = this.defNodeByName.get(string); + return r==null?this.unknownFallbackNode:r; + } + + /** + * + */ + public NodeManager(DB nodedb) { + this.nodeDb = nodedb; + for (Entry entry : nodedb) { + short parsedId = (short) (entry.getKey()[0] * 256 + entry.getKey()[1]); + String parsedString = asString(entry.getValue()); + this.pending.put(parsedId, parsedString); + } + } +} diff --git a/src/net/mosstest/servercore/PendingMapNode.java b/src/net/mosstest/servercore/PendingMapNode.java index ebf8b19..728c4a1 100644 --- a/src/net/mosstest/servercore/PendingMapNode.java +++ b/src/net/mosstest/servercore/PendingMapNode.java @@ -1,14 +1,14 @@ -package net.mosstest.servercore; - -import net.mosstest.scripting.MapNode; -import net.mosstest.scripting.INodeParams; - -public class PendingMapNode extends MapNode { - - public PendingMapNode(String nodeName) { - this.nodeName=nodeName; - } - - - -} +package net.mosstest.servercore; + +import net.mosstest.scripting.MapNode; +import net.mosstest.scripting.INodeParams; + +public class PendingMapNode extends MapNode { + + public PendingMapNode(String nodeName) { + this.nodeName=nodeName; + } + + + +} diff --git a/src/net/mosstest/servercore/PlayerSecurityException.java b/src/net/mosstest/servercore/PlayerSecurityException.java index 81eb4f6..6ca4557 100644 --- a/src/net/mosstest/servercore/PlayerSecurityException.java +++ b/src/net/mosstest/servercore/PlayerSecurityException.java @@ -1,5 +1,5 @@ -package net.mosstest.servercore; - -public class PlayerSecurityException extends Exception{ - -} +package net.mosstest.servercore; + +public class PlayerSecurityException extends Exception{ + +} diff --git a/src/net/mosstest/servercore/RenderProcessor.java b/src/net/mosstest/servercore/RenderProcessor.java index 1850a41..3a613d5 100644 --- a/src/net/mosstest/servercore/RenderProcessor.java +++ b/src/net/mosstest/servercore/RenderProcessor.java @@ -1,3 +1,4 @@ + package net.mosstest.servercore; import java.util.HashMap; @@ -389,4 +390,4 @@ public class RenderProcessor extends SimpleApplication { } }; -} +} diff --git a/src/net/mosstest/servercore/ScriptEnv.java b/src/net/mosstest/servercore/ScriptEnv.java index 744125d..c6726b1 100644 --- a/src/net/mosstest/servercore/ScriptEnv.java +++ b/src/net/mosstest/servercore/ScriptEnv.java @@ -1,126 +1,126 @@ -package net.mosstest.servercore; - -import java.io.IOException; - -import net.mosstest.scripting.MossScriptEnv; - -import org.mozilla.javascript.ClassShutter; -import org.mozilla.javascript.Context; -import org.mozilla.javascript.ContextFactory; -import org.mozilla.javascript.NativeJavaObject; -import org.mozilla.javascript.RhinoException; -import org.mozilla.javascript.Scriptable; -import org.mozilla.javascript.ScriptableObject; -import org.mozilla.javascript.WrapFactory; - -/** - * Static environment for executing scripts. Call {@link ScriptEnv.runScript()} - * to call a script. - * - * This class is made possible by the guidance given by blogger Jani Hartikainen - * in - * Sandboxing Rhino in Java. - * - * @author rarkenin - */ -public class ScriptEnv { - ScriptableObject globalScope; - - private static class ScriptClassShutter implements ClassShutter { - public ScriptClassShutter() { - - } - - public boolean visibleToScripts(String className) { - if (className.startsWith("adapter") //$NON-NLS-1$ - || className.startsWith("net.mosstest.scripting")) //$NON-NLS-1$ - return true; - else - return false; - } - } - - public enum ScriptResult { - RESULT_EXECUTED, RESULT_EXECUTNG_BACKGROUND, RESULT_ERROR, RESULT_SECURITY_EXCEPTION, RESULT_SECURITY_ELEVATABLE - } - - /** - * Executes a script with default permissions. This will allow sandboxed - * access to the database, and gameplay data, without access to - * authentication data. These scripts have access to - * Hashmap<String, Object>-style maps used for extended - * custom attributes, and may access various API classes via - * {@link net.mosstest.scripting.JavaApi JavaApi}(which internally uses - * reflection to obtain classes). Via an ACL, certain classes may be blocked - * or replaced with limited versions thereof. At the time of writing, this - * feature is incomplete and will not allow any access to the Java(tm) SE - * API. - * - * @param script - * A string representing the script to run - * @return A {@link ScriptEnv.ScriptResult} constant representing the - * result. - */ - public ScriptResult runScript(MossScript script) - throws MossWorldLoadException { - try { - this.cx.evaluateReader(this.globalScope, script.getReader(), - script.file.toString(), 0, null); - } catch (IOException e) { - return ScriptResult.RESULT_ERROR; - } catch (RhinoException e) { - System.out.println(e.getMessage()); - throw new MossWorldLoadException( - "Script error has occured. Wrapped exception: \r\n" + e.getMessage() + "\r\n" + e.getScriptStackTrace()); //$NON-NLS-1$ - } - return ScriptResult.RESULT_EXECUTED; - } - - protected static class SandboxWrapFactory extends WrapFactory { - @Override - public Scriptable wrapAsJavaObject(Context cx, Scriptable scope, - Object javaObject, Class staticType) { - return new SandboxNativeJavaObject(scope, javaObject, staticType); - } - } - - protected static class SandboxContextFactory extends ContextFactory { - - @Override - protected Context makeContext() { - Context cx = super.makeContext(); - cx.setClassShutter(new ScriptClassShutter()); - cx.setWrapFactory(new SandboxWrapFactory()); - return cx; - } - } - - private Context cx; - - public ScriptEnv(MossScriptEnv ev) { - ContextFactory.initGlobal(new SandboxContextFactory()); - this.cx = ContextFactory.getGlobal().enterContext(); - this.globalScope = this.cx.initStandardObjects(); - this.globalScope.put("moss", this.globalScope, ev); - } - - public static class SandboxNativeJavaObject extends NativeJavaObject { - - private static final long serialVersionUID = 4829780635666396547L; - - public SandboxNativeJavaObject(Scriptable scope, Object javaObject, - Class staticType) { - super(scope, javaObject, staticType); - } - - @Override - public Object get(String name, Scriptable start) { - if (name.equals("getClass")) { //$NON-NLS-1$ - return NOT_FOUND; - } - - return super.get(name, start); - } - } - -} +package net.mosstest.servercore; + +import java.io.IOException; + +import net.mosstest.scripting.MossScriptEnv; + +import org.mozilla.javascript.ClassShutter; +import org.mozilla.javascript.Context; +import org.mozilla.javascript.ContextFactory; +import org.mozilla.javascript.NativeJavaObject; +import org.mozilla.javascript.RhinoException; +import org.mozilla.javascript.Scriptable; +import org.mozilla.javascript.ScriptableObject; +import org.mozilla.javascript.WrapFactory; + +/** + * Static environment for executing scripts. Call {@link ScriptEnv.runScript()} + * to call a script. + * + * This class is made possible by the guidance given by blogger Jani Hartikainen + * in + * Sandboxing Rhino in Java. + * + * @author rarkenin + */ +public class ScriptEnv { + ScriptableObject globalScope; + + private static class ScriptClassShutter implements ClassShutter { + public ScriptClassShutter() { + + } + + public boolean visibleToScripts(String className) { + if (className.startsWith("adapter") //$NON-NLS-1$ + || className.startsWith("net.mosstest.scripting")) //$NON-NLS-1$ + return true; + else + return false; + } + } + + public enum ScriptResult { + RESULT_EXECUTED, RESULT_EXECUTNG_BACKGROUND, RESULT_ERROR, RESULT_SECURITY_EXCEPTION, RESULT_SECURITY_ELEVATABLE + } + + /** + * Executes a script with default permissions. This will allow sandboxed + * access to the database, and gameplay data, without access to + * authentication data. These scripts have access to + * Hashmap<String, Object>-style maps used for extended + * custom attributes, and may access various API classes via + * {@link net.mosstest.scripting.JavaApi JavaApi}(which internally uses + * reflection to obtain classes). Via an ACL, certain classes may be blocked + * or replaced with limited versions thereof. At the time of writing, this + * feature is incomplete and will not allow any access to the Java(tm) SE + * API. + * + * @param script + * A string representing the script to run + * @return A {@link ScriptEnv.ScriptResult} constant representing the + * result. + */ + public ScriptResult runScript(MossScript script) + throws MossWorldLoadException { + try { + this.cx.evaluateReader(this.globalScope, script.getReader(), + script.file.toString(), 0, null); + } catch (IOException e) { + return ScriptResult.RESULT_ERROR; + } catch (RhinoException e) { + System.out.println(e.getMessage()); + throw new MossWorldLoadException( + "Script error has occured. Wrapped exception: \r\n" + e.getMessage() + "\r\n" + e.getScriptStackTrace()); //$NON-NLS-1$ + } + return ScriptResult.RESULT_EXECUTED; + } + + protected static class SandboxWrapFactory extends WrapFactory { + @Override + public Scriptable wrapAsJavaObject(Context cx, Scriptable scope, + Object javaObject, Class staticType) { + return new SandboxNativeJavaObject(scope, javaObject, staticType); + } + } + + protected static class SandboxContextFactory extends ContextFactory { + + @Override + protected Context makeContext() { + Context cx = super.makeContext(); + cx.setClassShutter(new ScriptClassShutter()); + cx.setWrapFactory(new SandboxWrapFactory()); + return cx; + } + } + + private Context cx; + + public ScriptEnv(MossScriptEnv ev) { + ContextFactory.initGlobal(new SandboxContextFactory()); + this.cx = ContextFactory.getGlobal().enterContext(); + this.globalScope = this.cx.initStandardObjects(); + this.globalScope.put("moss", this.globalScope, ev); + } + + public static class SandboxNativeJavaObject extends NativeJavaObject { + + private static final long serialVersionUID = 4829780635666396547L; + + public SandboxNativeJavaObject(Scriptable scope, Object javaObject, + Class staticType) { + super(scope, javaObject, staticType); + } + + @Override + public Object get(String name, Scriptable start) { + if (name.equals("getClass")) { //$NON-NLS-1$ + return NOT_FOUND; + } + + return super.get(name, start); + } + } + +} diff --git a/src/net/mosstest/servercore/ScriptSandboxBorderToken.java b/src/net/mosstest/servercore/ScriptSandboxBorderToken.java index 382bcc1..f38ab01 100644 --- a/src/net/mosstest/servercore/ScriptSandboxBorderToken.java +++ b/src/net/mosstest/servercore/ScriptSandboxBorderToken.java @@ -1,10 +1,10 @@ -package net.mosstest.servercore; - -public class ScriptSandboxBorderToken { - int id; - Class clazz; - public ScriptSandboxBorderToken(int id, Class clazz) { - this.id = id; - this.clazz=clazz; - } -} +package net.mosstest.servercore; + +public class ScriptSandboxBorderToken { + int id; + Class clazz; + public ScriptSandboxBorderToken(int id, Class clazz) { + this.id = id; + this.clazz=clazz; + } +} diff --git a/src/net/mosstest/servercore/ServerMain.java b/src/net/mosstest/servercore/ServerMain.java index 1273660..6a5d28b 100644 --- a/src/net/mosstest/servercore/ServerMain.java +++ b/src/net/mosstest/servercore/ServerMain.java @@ -1,7 +1,7 @@ -package net.mosstest.servercore; - -public class ServerMain { - public static void main(String[] args) { - // TODO handle server main - } -} +package net.mosstest.servercore; + +public class ServerMain { + public static void main(String[] args) { + // TODO handle server main + } +} diff --git a/src/net/mosstest/servercore/ServerNetworkingManager.java b/src/net/mosstest/servercore/ServerNetworkingManager.java index c53dfe1..ec8fbcb 100644 --- a/src/net/mosstest/servercore/ServerNetworkingManager.java +++ b/src/net/mosstest/servercore/ServerNetworkingManager.java @@ -1,240 +1,240 @@ -package net.mosstest.servercore; - -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.DatagramPacket; -import java.net.ServerSocket; -import java.net.Socket; -import java.util.HashMap; -import java.util.Random; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * Server networking manager. Now uses standard IO. This is a nasty thread pool. - * Misuse may result in chlorine poisoning, asphyxiation, drowning, death, or - * injury. The proximity of large and fast streams and datagram ice floes is - * also a danger. - * - * @author rarkenin - * - */ -public class ServerNetworkingManager { - public class AcceptRunnable implements Runnable { - @Override - public void run() { - acLoop: while (ServerNetworkingManager.this.runConnections.get()) { - try { - @SuppressWarnings("resource") - // To be closed from other side or explcitly. We don't want - // to implicitly close on clients. - Socket sock = ServerNetworkingManager.this.sSock.accept(); - if (ServerNetworkingManager.this.currentConnections.get() >= ServerNetworkingManager.this.maxConnections) { - writeTcpPacket(sock.getOutputStream(), 0x03, - new byte[] { 0x03 }); - sock.close(); - continue acLoop; - } - ServerNetworkingManager.this.currentConnections - .incrementAndGet(); - ServerNetworkingManager.this.connectionQueue.put(sock); - if (ServerNetworkingManager.this.currentConnections.get() > ServerNetworkingManager.this.currentServicingThreads - .get()) { - new Thread(ServerNetworkingManager.this.svrNetGroup, - new SocketRecvRunnable(), "connection thread" - + Math.random()).start(); - } - - } catch (IOException | InterruptedException e) { - // pass - } - } - } - - } - - public ServerNetworkingManager(int port, MossWorld world) - throws IOException { - this.bindingIdentifiers = new HashMap<>(); - this.acceptThread.start(); - this.maxConnections = EngineSettings.getInt("net.maxConnections", 255) * 2 + 1; - this.runConnections = new AtomicBoolean(true); - this.currentConnections = new AtomicInteger(0); - this.currentServicingThreads = new AtomicInteger(0); - this.sSock = new ServerSocket(port); - this.connectionQueue = new ArrayBlockingQueue<>(4); - this.acceptThread = new Thread(new AcceptRunnable(), "svrNetAccept"); - this.acceptThread.start(); - } - - private HashMap bindingIdentifiers; - private final int maxConnections; - private ThreadGroup svrNetGroup = new ThreadGroup("SvrNetGroup"); - protected AtomicBoolean runConnections; - protected AtomicInteger currentConnections; - protected AtomicInteger currentServicingThreads; - protected ServerSocket sSock; - protected ArrayBlockingQueue connectionQueue; - protected ArrayBlockingQueue sendThreadFormQueue; - private Thread acceptThread; - - protected static void writeTcpPacket(OutputStream os, int commandId, - byte[] payload) throws IOException { - - } - - protected class SocketSendRunnable implements Runnable { - ServerSession sess; - - @Override - public void run() { - this.sess = ServerNetworkingManager.this.sendThreadFormQueue.poll(); - if (this.sess == null) { - return; - } - pLoop: while (this.sess.isValid.get()) { - try { - MossNetPacket p = this.sess.packets.take(); - if (this.sess.quenchedSince < System.currentTimeMillis() - 4000 - && !p.isImportant) - continue pLoop; - - if (p.needsFast) { - if ((p.payload.length < 250) - && this.sess.dgramSocket != null) - sendPacketUdp(p.commandId, p.payload, p.needsAck); - else { - sendPacketLowLatency(p.commandId, p.payload); - } - } else - sendPacketDefault(p.commandId, p.payload); - - } catch (InterruptedException | IOException e) { - // PASS - } - - } - - } - - private void sendPacketDefault(int commandId, byte[] payload) - throws IOException { - sendImpl(commandId, payload, this.sess.bulkSocket); - - } - - @SuppressWarnings("resource") - private void sendPacketLowLatency(int commandId, byte[] payload) - throws IOException { - Socket targetSocket = (this.sess.fastSocket == null) ? this.sess.bulkSocket - : this.sess.fastSocket; - sendImpl(commandId, payload, targetSocket); - } - - private void sendImpl(int commandId, byte[] payload, Socket targetSocket) - throws IOException { - - OutputStream os = targetSocket.getOutputStream(); - DataOutputStream dos = new DataOutputStream(os); - dos.writeInt(CommonNetworking.magic); - dos.writeInt(payload.length); - dos.writeByte(commandId); - dos.write(payload); - dos.flush(); - os.flush(); - dos.close(); - os.close(); - - } - - private void sendPacketUdp(int commandId, byte[] payload, - boolean needsAck) throws IOException { - if (this.sess.dgramSocket == null) - throw new NullPointerException("Null datagram socket!"); //$NON-NLS-1$ - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - DataOutputStream dos = new DataOutputStream(bos); - dos.writeInt(CommonNetworking.magicNoAck); - dos.writeByte(commandId); - dos.writeByte(payload.length); - dos.flush(); - bos.write(payload); - DatagramPacket pc = new DatagramPacket(bos.toByteArray(), - bos.toByteArray().length); - this.sess.dgramSocket.send(pc); - - } - - } - - private class SocketRecvRunnable implements Runnable { - - @SuppressWarnings("resource") - @Override - public void run() { - ServerNetworkingManager.this.currentServicingThreads - .incrementAndGet(); - try { - while (ServerNetworkingManager.this.runConnections.get()) { - try { - Socket sock = ServerNetworkingManager.this.connectionQueue - .take(); - InputStream in = sock.getInputStream(); - DataInputStream dataIn = new DataInputStream(in); - long bindId = new Random().nextLong(); - ServerSession sess = new ServerSession(); - ServerNetworkingManager.this.sendThreadFormQueue - .put(sess); - sess.bulkSocket = sock; - ByteArrayOutputStream ba = new ByteArrayOutputStream(); - DataOutputStream dos = new DataOutputStream(ba); - dos.writeLong(bindId); - dos.flush(); - ba.flush(); - sess.packets.put(new MossNetPacket(0xFE, ba - .toByteArray(), false, true, true)); - SocketSendRunnable ssr = new SocketSendRunnable(); - Thread sendThread = new Thread(ssr); - sendThread.start(); - while (ServerNetworkingManager.this.runConnections - .get() && !sock.isClosed()) { - if (dataIn.readInt() != CommonNetworking.magic) { - // Handle reconnect - } - int length = dataIn.readShort(); - byte[] buf = new byte[length]; - int commandId = dataIn.readUnsignedByte(); - if (commandId == 255) { - sess.quenchedSince = System.currentTimeMillis(); - } - if (commandId == 254) { - // FIXME 0.1 - sess.isValid.set(false); - sess = ServerNetworkingManager.this.bindingIdentifiers.get(Long - .valueOf(dataIn.readLong())); - sess.fastSocket = sock; - sock.setTcpNoDelay(true); - - } - - } - - } catch (InterruptedException e) { - // pass - } - - } - } catch (Exception e) {// pass - } finally { - ServerNetworkingManager.this.currentServicingThreads - .decrementAndGet(); - - } - } - } - -} +package net.mosstest.servercore; + +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.DatagramPacket; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.HashMap; +import java.util.Random; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Server networking manager. Now uses standard IO. This is a nasty thread pool. + * Misuse may result in chlorine poisoning, asphyxiation, drowning, death, or + * injury. The proximity of large and fast streams and datagram ice floes is + * also a danger. + * + * @author rarkenin + * + */ +public class ServerNetworkingManager { + public class AcceptRunnable implements Runnable { + @Override + public void run() { + acLoop: while (ServerNetworkingManager.this.runConnections.get()) { + try { + @SuppressWarnings("resource") + // To be closed from other side or explcitly. We don't want + // to implicitly close on clients. + Socket sock = ServerNetworkingManager.this.sSock.accept(); + if (ServerNetworkingManager.this.currentConnections.get() >= ServerNetworkingManager.this.maxConnections) { + writeTcpPacket(sock.getOutputStream(), 0x03, + new byte[] { 0x03 }); + sock.close(); + continue acLoop; + } + ServerNetworkingManager.this.currentConnections + .incrementAndGet(); + ServerNetworkingManager.this.connectionQueue.put(sock); + if (ServerNetworkingManager.this.currentConnections.get() > ServerNetworkingManager.this.currentServicingThreads + .get()) { + new Thread(ServerNetworkingManager.this.svrNetGroup, + new SocketRecvRunnable(), "connection thread" + + Math.random()).start(); + } + + } catch (IOException | InterruptedException e) { + // pass + } + } + } + + } + + public ServerNetworkingManager(int port, MossWorld world) + throws IOException { + this.bindingIdentifiers = new HashMap<>(); + this.acceptThread.start(); + this.maxConnections = EngineSettings.getInt("net.maxConnections", 255) * 2 + 1; + this.runConnections = new AtomicBoolean(true); + this.currentConnections = new AtomicInteger(0); + this.currentServicingThreads = new AtomicInteger(0); + this.sSock = new ServerSocket(port); + this.connectionQueue = new ArrayBlockingQueue<>(4); + this.acceptThread = new Thread(new AcceptRunnable(), "svrNetAccept"); + this.acceptThread.start(); + } + + private HashMap bindingIdentifiers; + private final int maxConnections; + private ThreadGroup svrNetGroup = new ThreadGroup("SvrNetGroup"); + protected AtomicBoolean runConnections; + protected AtomicInteger currentConnections; + protected AtomicInteger currentServicingThreads; + protected ServerSocket sSock; + protected ArrayBlockingQueue connectionQueue; + protected ArrayBlockingQueue sendThreadFormQueue; + private Thread acceptThread; + + protected static void writeTcpPacket(OutputStream os, int commandId, + byte[] payload) throws IOException { + + } + + protected class SocketSendRunnable implements Runnable { + ServerSession sess; + + @Override + public void run() { + this.sess = ServerNetworkingManager.this.sendThreadFormQueue.poll(); + if (this.sess == null) { + return; + } + pLoop: while (this.sess.isValid.get()) { + try { + MossNetPacket p = this.sess.packets.take(); + if (this.sess.quenchedSince < System.currentTimeMillis() - 4000 + && !p.isImportant) + continue pLoop; + + if (p.needsFast) { + if ((p.payload.length < 250) + && this.sess.dgramSocket != null) + sendPacketUdp(p.commandId, p.payload, p.needsAck); + else { + sendPacketLowLatency(p.commandId, p.payload); + } + } else + sendPacketDefault(p.commandId, p.payload); + + } catch (InterruptedException | IOException e) { + // PASS + } + + } + + } + + private void sendPacketDefault(int commandId, byte[] payload) + throws IOException { + sendImpl(commandId, payload, this.sess.bulkSocket); + + } + + @SuppressWarnings("resource") + private void sendPacketLowLatency(int commandId, byte[] payload) + throws IOException { + Socket targetSocket = (this.sess.fastSocket == null) ? this.sess.bulkSocket + : this.sess.fastSocket; + sendImpl(commandId, payload, targetSocket); + } + + private void sendImpl(int commandId, byte[] payload, Socket targetSocket) + throws IOException { + + OutputStream os = targetSocket.getOutputStream(); + DataOutputStream dos = new DataOutputStream(os); + dos.writeInt(CommonNetworking.magic); + dos.writeInt(payload.length); + dos.writeByte(commandId); + dos.write(payload); + dos.flush(); + os.flush(); + dos.close(); + os.close(); + + } + + private void sendPacketUdp(int commandId, byte[] payload, + boolean needsAck) throws IOException { + if (this.sess.dgramSocket == null) + throw new NullPointerException("Null datagram socket!"); //$NON-NLS-1$ + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(bos); + dos.writeInt(CommonNetworking.magicNoAck); + dos.writeByte(commandId); + dos.writeByte(payload.length); + dos.flush(); + bos.write(payload); + DatagramPacket pc = new DatagramPacket(bos.toByteArray(), + bos.toByteArray().length); + this.sess.dgramSocket.send(pc); + + } + + } + + private class SocketRecvRunnable implements Runnable { + + @SuppressWarnings("resource") + @Override + public void run() { + ServerNetworkingManager.this.currentServicingThreads + .incrementAndGet(); + try { + while (ServerNetworkingManager.this.runConnections.get()) { + try { + Socket sock = ServerNetworkingManager.this.connectionQueue + .take(); + InputStream in = sock.getInputStream(); + DataInputStream dataIn = new DataInputStream(in); + long bindId = new Random().nextLong(); + ServerSession sess = new ServerSession(); + ServerNetworkingManager.this.sendThreadFormQueue + .put(sess); + sess.bulkSocket = sock; + ByteArrayOutputStream ba = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(ba); + dos.writeLong(bindId); + dos.flush(); + ba.flush(); + sess.packets.put(new MossNetPacket(0xFE, ba + .toByteArray(), false, true, true)); + SocketSendRunnable ssr = new SocketSendRunnable(); + Thread sendThread = new Thread(ssr); + sendThread.start(); + while (ServerNetworkingManager.this.runConnections + .get() && !sock.isClosed()) { + if (dataIn.readInt() != CommonNetworking.magic) { + // Handle reconnect + } + int length = dataIn.readShort(); + byte[] buf = new byte[length]; + int commandId = dataIn.readUnsignedByte(); + if (commandId == 255) { + sess.quenchedSince = System.currentTimeMillis(); + } + if (commandId == 254) { + // FIXME 0.1 + sess.isValid.set(false); + sess = ServerNetworkingManager.this.bindingIdentifiers.get(Long + .valueOf(dataIn.readLong())); + sess.fastSocket = sock; + sock.setTcpNoDelay(true); + + } + + } + + } catch (InterruptedException e) { + // pass + } + + } + } catch (Exception e) {// pass + } finally { + ServerNetworkingManager.this.currentServicingThreads + .decrementAndGet(); + + } + } + } + +} diff --git a/src/net/mosstest/servercore/ServerSession.java b/src/net/mosstest/servercore/ServerSession.java index ebab962..e7eacd5 100644 --- a/src/net/mosstest/servercore/ServerSession.java +++ b/src/net/mosstest/servercore/ServerSession.java @@ -1,30 +1,30 @@ -package net.mosstest.servercore; - -import java.net.DatagramSocket; -import java.net.Socket; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.atomic.AtomicBoolean; - -import net.mosstest.scripting.Player; - -/** - * The ServerSession class unifies a session on a server. Each incoming connection has a different session. - * When a connection is determined to be associated with an existing session, - * - * @author rarkenin - * - */ -public class ServerSession { - public Player player; - public String authChallenge; - public ArrayBlockingQueue packets; - public volatile Socket bulkSocket; - public volatile Socket fastSocket; - public volatile DatagramSocket dgramSocket; - public AtomicBoolean isValid=new AtomicBoolean(true); - public ServerSession.State state; - public volatile long quenchedSince=0; - public static enum State{ - CONN_NEW, CONN_AUTH_SENT, CONN_AUTH_RECV, CONN_GAME_HANDSHAKE, CONN_PLAYING, CONN_BOT, CONN_TIMEOUT; - } -} +package net.mosstest.servercore; + +import java.net.DatagramSocket; +import java.net.Socket; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.atomic.AtomicBoolean; + +import net.mosstest.scripting.Player; + +/** + * The ServerSession class unifies a session on a server. Each incoming connection has a different session. + * When a connection is determined to be associated with an existing session, + * + * @author rarkenin + * + */ +public class ServerSession { + public Player player; + public String authChallenge; + public ArrayBlockingQueue packets; + public volatile Socket bulkSocket; + public volatile Socket fastSocket; + public volatile DatagramSocket dgramSocket; + public AtomicBoolean isValid=new AtomicBoolean(true); + public ServerSession.State state; + public volatile long quenchedSince=0; + public static enum State{ + CONN_NEW, CONN_AUTH_SENT, CONN_AUTH_RECV, CONN_GAME_HANDSHAKE, CONN_PLAYING, CONN_BOT, CONN_TIMEOUT; + } +} diff --git a/src/net/mosstest/servercore/SessionManager.java b/src/net/mosstest/servercore/SessionManager.java index ac5b390..ac67d0a 100644 --- a/src/net/mosstest/servercore/SessionManager.java +++ b/src/net/mosstest/servercore/SessionManager.java @@ -1,11 +1,11 @@ -package net.mosstest.servercore; - -import java.util.HashMap; - -import net.mosstest.scripting.Player; - -public class SessionManager { - - public HashMap playerSessions=new HashMap<>(); - volatile long gameTicks; -} +package net.mosstest.servercore; + +import java.util.HashMap; + +import net.mosstest.scripting.Player; + +public class SessionManager { + + public HashMap playerSessions=new HashMap<>(); + volatile long gameTicks; +} diff --git a/src/net/mosstest/servercore/ToClientNetCommand.java b/src/net/mosstest/servercore/ToClientNetCommand.java index 7d60357..b17d3a7 100644 --- a/src/net/mosstest/servercore/ToClientNetCommand.java +++ b/src/net/mosstest/servercore/ToClientNetCommand.java @@ -1,39 +1,39 @@ -package net.mosstest.servercore; - -import java.util.ArrayList; - -public enum ToClientNetCommand { - TOCLIENT_NOP(0x00), - TOCLIENT_AUTH_REQUESTED, - TOCLIENT_AUTH_ACCEPTED, - TOCLIENT_AUTH_DENIED, - TOCLIENT_BULK_TRANFER, - TOCLIENT_MAPBLOCK, - TOCLIENT_INV, - TOCLIENT_BULK_TRANFER_PARAMS, - TOCLIENT_PLAYER_MAPPING, - TOCLIENT_ENTITY, - TOCLIENT_TELEPORT_ENTITY, - TOCLIENT_MOVE_ENTITY_DELTA, - TOCLIENT_ANIMATE_MESH, - TOCLIENT_NODE_DEF, - TOCLIENT_PLACE_NODE, - TOCLIENT_REMOVE_NODE, - TOCLIENT_SLIDE_NODE, - TOCLIENT_FORMSPEC, - TOCLIENT_FORMSPEC_INSTANCE, - TOCLIENT_PlAYER_EVENT, - TOCLIENT_ENTITY_FOLLOW_NODEPATH; - int command; - static ArrayList commands=new ArrayList<>(); - ToClientNetCommand(int cmd){ - this.command=cmd; - add(this); - } - ToClientNetCommand(){ - this.command=0xFF; - } - private static void add(ToClientNetCommand tcnc){ - ToClientNetCommand.commands.add(tcnc.command, tcnc); - } -} +package net.mosstest.servercore; + +import java.util.ArrayList; + +public enum ToClientNetCommand { + TOCLIENT_NOP(0x00), + TOCLIENT_AUTH_REQUESTED, + TOCLIENT_AUTH_ACCEPTED, + TOCLIENT_AUTH_DENIED, + TOCLIENT_BULK_TRANFER, + TOCLIENT_MAPBLOCK, + TOCLIENT_INV, + TOCLIENT_BULK_TRANFER_PARAMS, + TOCLIENT_PLAYER_MAPPING, + TOCLIENT_ENTITY, + TOCLIENT_TELEPORT_ENTITY, + TOCLIENT_MOVE_ENTITY_DELTA, + TOCLIENT_ANIMATE_MESH, + TOCLIENT_NODE_DEF, + TOCLIENT_PLACE_NODE, + TOCLIENT_REMOVE_NODE, + TOCLIENT_SLIDE_NODE, + TOCLIENT_FORMSPEC, + TOCLIENT_FORMSPEC_INSTANCE, + TOCLIENT_PlAYER_EVENT, + TOCLIENT_ENTITY_FOLLOW_NODEPATH; + int command; + static ArrayList commands=new ArrayList<>(); + ToClientNetCommand(int cmd){ + this.command=cmd; + add(this); + } + ToClientNetCommand(){ + this.command=0xFF; + } + private static void add(ToClientNetCommand tcnc){ + ToClientNetCommand.commands.add(tcnc.command, tcnc); + } +} diff --git a/src/net/mosstest/servercore/World.java b/src/net/mosstest/servercore/World.java index d2e0619..f47130c 100644 --- a/src/net/mosstest/servercore/World.java +++ b/src/net/mosstest/servercore/World.java @@ -1,5 +1,5 @@ -package net.mosstest.servercore; - -public class World { - -} +package net.mosstest.servercore; + +public class World { + +} diff --git a/src/net/mosstest/servercore/messages.properties b/src/net/mosstest/servercore/messages.properties index 0ea8715..e8894b8 100644 --- a/src/net/mosstest/servercore/messages.properties +++ b/src/net/mosstest/servercore/messages.properties @@ -1 +1 @@ -MapChunk.BAD_SER_VER=Incorrect serialization version +MapChunk.BAD_SER_VER=Incorrect serialization version diff --git a/src/net/mosstest/servercore/netcommand/MalformedPacketException.java b/src/net/mosstest/servercore/netcommand/MalformedPacketException.java index 7fc9fe6..a9887d9 100644 --- a/src/net/mosstest/servercore/netcommand/MalformedPacketException.java +++ b/src/net/mosstest/servercore/netcommand/MalformedPacketException.java @@ -1,5 +1,5 @@ -package net.mosstest.servercore.netcommand; - -public class MalformedPacketException extends Exception { - -} +package net.mosstest.servercore.netcommand; + +public class MalformedPacketException extends Exception { + +} diff --git a/src/net/mosstest/servercore/netcommand/ToClientAuthRequested.java b/src/net/mosstest/servercore/netcommand/ToClientAuthRequested.java index f85de9f..7dfc3ee 100644 --- a/src/net/mosstest/servercore/netcommand/ToClientAuthRequested.java +++ b/src/net/mosstest/servercore/netcommand/ToClientAuthRequested.java @@ -1,97 +1,97 @@ -//just keep the same package and import lines -package net.mosstest.servercore.netcommand; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; - -//make sure this name matches the filename -public class ToClientAuthRequested extends ToClientCommand { - // From the fields of the packet - AuthType authType; - byte[] authParam; - - // create thingies like this for choices - enum AuthType { - AUTH_NIL, AUTH_PLAIN, AUTH_HASH_SHA512, AUTH_CHALLENGE_RESPONSE - } - - // Change the name of the below method to match the file name - public ToClientAuthRequested(byte[] buf) throws IOException, - MalformedPacketException { - - // constructor from byte[] is parsing - // Keep lines below for all of these tasks - ByteArrayInputStream bs = new ByteArrayInputStream(buf); - DataInputStream ds = new DataInputStream(bs); - - // Now start changing around below: - // AuthType is an enum so we need a switch statement - // AuthType is marked as [1] so we will have to read an "unsigned byte" - int aType = ds.readUnsignedByte(); - - // for those with multiple bullet choices. Match aType with previous line - switch (aType) { - case 0x00: - authType = AuthType.AUTH_NIL; // get names from line 9, and line - // 14... - break; // don't forget the break - case 0x01: - authType = AuthType.AUTH_PLAIN; // same here - break; // don't forget the break - case 0x02: - authType = AuthType.AUTH_HASH_SHA512; - break; - case 0x03: - authType = AuthType.AUTH_CHALLENGE_RESPONSE; - break; - - // keep the default thingy the same - default: - throw new MalformedPacketException(); - } - - // now let's do a variable thing. - // For a thing marked [VARIABLE] just do the following: - bs.read(authParam); //where authParam is the target - } - - //And now the second thingy we need to add: - public ToClientAuthRequested(AuthType authType, byte[] authParam) { - this.authType=authType; - this.authParam=authParam; - } - - //and the last thing. This is simply a reverse of the first thingy with parentheses we added. - public byte[] toByteArray() throws IOException{ - //prepare by using this line always - ByteArrayOutputStream bos=new ByteArrayOutputStream(); - DataOutputStream dos=new DataOutputStream(bos); - - //now let's start sticking things in into the correct order - //Our multi-bullet field means a switch thingy - //order doesn;t matter as long as the numerical codes match up with the worded codes - switch(this.authType){ - case AUTH_CHALLENGE_RESPONSE: - dos.writeByte(0x03); - break; - case AUTH_HASH_SHA512: - dos.writeByte(0x02); - break; - case AUTH_NIL: - dos.writeByte(0x01); - break; - case AUTH_PLAIN: - dos.writeByte(0x00); - break; - } - - //let's write the [variable] part now: - bos.write(this.authParam); - - //Use this line at the end to finish up - return bos.toByteArray(); - } -} +//just keep the same package and import lines +package net.mosstest.servercore.netcommand; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +//make sure this name matches the filename +public class ToClientAuthRequested extends ToClientCommand { + // From the fields of the packet + AuthType authType; + byte[] authParam; + + // create thingies like this for choices + enum AuthType { + AUTH_NIL, AUTH_PLAIN, AUTH_HASH_SHA512, AUTH_CHALLENGE_RESPONSE + } + + // Change the name of the below method to match the file name + public ToClientAuthRequested(byte[] buf) throws IOException, + MalformedPacketException { + + // constructor from byte[] is parsing + // Keep lines below for all of these tasks + ByteArrayInputStream bs = new ByteArrayInputStream(buf); + DataInputStream ds = new DataInputStream(bs); + + // Now start changing around below: + // AuthType is an enum so we need a switch statement + // AuthType is marked as [1] so we will have to read an "unsigned byte" + int aType = ds.readUnsignedByte(); + + // for those with multiple bullet choices. Match aType with previous line + switch (aType) { + case 0x00: + authType = AuthType.AUTH_NIL; // get names from line 9, and line + // 14... + break; // don't forget the break + case 0x01: + authType = AuthType.AUTH_PLAIN; // same here + break; // don't forget the break + case 0x02: + authType = AuthType.AUTH_HASH_SHA512; + break; + case 0x03: + authType = AuthType.AUTH_CHALLENGE_RESPONSE; + break; + + // keep the default thingy the same + default: + throw new MalformedPacketException(); + } + + // now let's do a variable thing. + // For a thing marked [VARIABLE] just do the following: + bs.read(authParam); //where authParam is the target + } + + //And now the second thingy we need to add: + public ToClientAuthRequested(AuthType authType, byte[] authParam) { + this.authType=authType; + this.authParam=authParam; + } + + //and the last thing. This is simply a reverse of the first thingy with parentheses we added. + public byte[] toByteArray() throws IOException{ + //prepare by using this line always + ByteArrayOutputStream bos=new ByteArrayOutputStream(); + DataOutputStream dos=new DataOutputStream(bos); + + //now let's start sticking things in into the correct order + //Our multi-bullet field means a switch thingy + //order doesn;t matter as long as the numerical codes match up with the worded codes + switch(this.authType){ + case AUTH_CHALLENGE_RESPONSE: + dos.writeByte(0x03); + break; + case AUTH_HASH_SHA512: + dos.writeByte(0x02); + break; + case AUTH_NIL: + dos.writeByte(0x01); + break; + case AUTH_PLAIN: + dos.writeByte(0x00); + break; + } + + //let's write the [variable] part now: + bos.write(this.authParam); + + //Use this line at the end to finish up + return bos.toByteArray(); + } +} diff --git a/src/net/mosstest/servercore/netcommand/ToClientCommand.java b/src/net/mosstest/servercore/netcommand/ToClientCommand.java index ae2e8e7..da460c3 100644 --- a/src/net/mosstest/servercore/netcommand/ToClientCommand.java +++ b/src/net/mosstest/servercore/netcommand/ToClientCommand.java @@ -1,7 +1,7 @@ -package net.mosstest.servercore.netcommand; - -public abstract class ToClientCommand { - - //ignore - -} +package net.mosstest.servercore.netcommand; + +public abstract class ToClientCommand { + + //ignore + +} diff --git a/src/toxi/math/noise/SimplexNoise.java b/src/toxi/math/noise/SimplexNoise.java index 25b2beb..2721b16 100644 --- a/src/toxi/math/noise/SimplexNoise.java +++ b/src/toxi/math/noise/SimplexNoise.java @@ -1,542 +1,542 @@ -/* - * __ .__ .__ ._____. - * _/ |_ _______ __|__| ____ | | |__\_ |__ ______ - * \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/ - * | | ( <_> > <| \ \___| |_| || \_\ \\___ \ - * |__| \____/__/\_ \__|\___ >____/__||___ /____ > - * \/ \/ \/ \/ - * - * Copyright (c) 2006-2011 Karsten Schmidt - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * http://creativecommons.org/licenses/LGPL/2.1/ - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -package toxi.math.noise; - -/** - * Simplex Noise in 2D, 3D and 4D. Based on the example code of this paper: - * http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf - * - * @author Stefan Gustavson, Linkping University, Sweden (stegu at itn dot liu - * dot se) - * @author Karsten Schmidt (slight optimizations & restructuring) - */ -public class SimplexNoise { - - private static final double SQRT3 = Math.sqrt(3.0); - private static final double SQRT5 = Math.sqrt(5.0); - - /** - * Skewing and unskewing factors for 2D, 3D and 4D, some of them - * pre-multiplied. - */ - private static final double F2 = 0.5 * (SQRT3 - 1.0); - private static final double G2 = (3.0 - SQRT3) / 6.0; - private static final double G22 = G2 * 2.0 - 1; - - private static final double F3 = 1.0 / 3.0; - private static final double G3 = 1.0 / 6.0; - - private static final double F4 = (SQRT5 - 1.0) / 4.0; - private static final double G4 = (5.0 - SQRT5) / 20.0; - private static final double G42 = G4 * 2.0; - private static final double G43 = G4 * 3.0; - private static final double G44 = G4 * 4.0 - 1.0; - - /** - * Gradient vectors for 3D (pointing to mid points of all edges of a unit - * cube) - */ - private static final int[][] grad3 = { { 1, 1, 0 }, { -1, 1, 0 }, - { 1, -1, 0 }, { -1, -1, 0 }, { 1, 0, 1 }, { -1, 0, 1 }, - { 1, 0, -1 }, { -1, 0, -1 }, { 0, 1, 1 }, { 0, -1, 1 }, - { 0, 1, -1 }, { 0, -1, -1 } }; - - /** - * Gradient vectors for 4D (pointing to mid points of all edges of a unit 4D - * hypercube) - */ - private static final int[][] grad4 = { { 0, 1, 1, 1 }, { 0, 1, 1, -1 }, - { 0, 1, -1, 1 }, { 0, 1, -1, -1 }, { 0, -1, 1, 1 }, - { 0, -1, 1, -1 }, { 0, -1, -1, 1 }, { 0, -1, -1, -1 }, - { 1, 0, 1, 1 }, { 1, 0, 1, -1 }, { 1, 0, -1, 1 }, { 1, 0, -1, -1 }, - { -1, 0, 1, 1 }, { -1, 0, 1, -1 }, { -1, 0, -1, 1 }, - { -1, 0, -1, -1 }, { 1, 1, 0, 1 }, { 1, 1, 0, -1 }, - { 1, -1, 0, 1 }, { 1, -1, 0, -1 }, { -1, 1, 0, 1 }, - { -1, 1, 0, -1 }, { -1, -1, 0, 1 }, { -1, -1, 0, -1 }, - { 1, 1, 1, 0 }, { 1, 1, -1, 0 }, { 1, -1, 1, 0 }, { 1, -1, -1, 0 }, - { -1, 1, 1, 0 }, { -1, 1, -1, 0 }, { -1, -1, 1, 0 }, - { -1, -1, -1, 0 } }; - - /** - * Permutation table - */ - private static final int[] p = { 151, 160, 137, 91, 90, 15, 131, 13, 201, - 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, - 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, - 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, - 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, - 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, - 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, - 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, - 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, - 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, - 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, - 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, - 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, - 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, - 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, - 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, - 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, 222, - 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 }; - - /** - * To remove the need for index wrapping, double the permutation table - * length - */ - private static int[] perm = new int[0x200]; - /** - * A lookup table to traverse the simplex around a given point in 4D. - * Details can be found where this table is used, in the 4D noise method. - */ - private static final int[][] simplex = { { 0, 1, 2, 3 }, { 0, 1, 3, 2 }, - { 0, 0, 0, 0 }, { 0, 2, 3, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, - { 0, 0, 0, 0 }, { 1, 2, 3, 0 }, { 0, 2, 1, 3 }, { 0, 0, 0, 0 }, - { 0, 3, 1, 2 }, { 0, 3, 2, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, - { 0, 0, 0, 0 }, { 1, 3, 2, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, - { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, - { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 2, 0, 3 }, { 0, 0, 0, 0 }, - { 1, 3, 0, 2 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, - { 2, 3, 0, 1 }, { 2, 3, 1, 0 }, { 1, 0, 2, 3 }, { 1, 0, 3, 2 }, - { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 2, 0, 3, 1 }, - { 0, 0, 0, 0 }, { 2, 1, 3, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, - { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, - { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 2, 0, 1, 3 }, { 0, 0, 0, 0 }, - { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 3, 0, 1, 2 }, { 3, 0, 2, 1 }, - { 0, 0, 0, 0 }, { 3, 1, 2, 0 }, { 2, 1, 0, 3 }, { 0, 0, 0, 0 }, - { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 3, 1, 0, 2 }, { 0, 0, 0, 0 }, - { 3, 2, 0, 1 }, { 3, 2, 1, 0 } }; - - static { - for (int i = 0; i < 0x200; i++) { - perm[i] = p[i & 0xff]; - } - } - - /** - * Computes dot product in 2D. - * - * @param g - * 2-vector (grid offset) - * @param x - * @param y - * @return dot product - */ - private static double dot(int g[], double x, double y) { - return g[0] * x + g[1] * y; - } - - /** - * Computes dot product in 3D. - * - * @param g - * 3-vector (grid offset) - * @param x - * @param y - * @param z - * @return dot product - */ - private static double dot(int g[], double x, double y, double z) { - return g[0] * x + g[1] * y + g[2] * z; - } - - /** - * Computes dot product in 4D. - * - * @param g - * 4-vector (grid offset) - * @param x - * @param y - * @param z - * @param w - * @return dot product - */ - private static double dot(int g[], double x, double y, double z, double w) { - return g[0] * x + g[1] * y + g[2] * z + g[3] * w; - } - - /** - * This method is a *lot* faster than using (int)Math.floor(x). - * - * @param x - * value to be floored - * @return - */ - private static final int fastfloor(double x) { - return x >= 0 ? (int) x : (int) x - 1; - } - - /** - * Computes 2D Simplex Noise. - * - * @param x - * coordinate - * @param y - * coordinate - * @return noise value in range -1 ... +1. - */ - public static double noise(double x, double y) { - double n0 = 0, n1 = 0, n2 = 0; // Noise contributions from the three - // corners - // Skew the input space to determine which simplex cell we're in - double s = (x + y) * F2; // Hairy factor for 2D - int i = fastfloor(x + s); - int j = fastfloor(y + s); - double t = (i + j) * G2; - double x0 = x - (i - t); // The x,y distances from the cell origin - double y0 = y - (j - t); - // For the 2D case, the simplex shape is an equilateral triangle. - // Determine which simplex we are in. - int i1, j1; // Offsets for second (middle) corner of simplex in (i,j) - if (x0 > y0) { - i1 = 1; - j1 = 0; - } // lower triangle, XY order: (0,0)->(1,0)->(1,1) - else { - i1 = 0; - j1 = 1; - } // upper triangle, YX order: (0,0)->(0,1)->(1,1) - // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and - // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where - // c = (3-sqrt(3))/6 - double x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed - double y1 = y0 - j1 + G2; - double x2 = x0 + G22; // Offsets for last corner in (x,y) unskewed - double y2 = y0 + G22; - // Work out the hashed gradient indices of the three simplex corners - int ii = i & 0xff; - int jj = j & 0xff; - // Calculate the contribution from the three corners - double t0 = 0.5 - x0 * x0 - y0 * y0; - if (t0 > 0) { - t0 *= t0; - int gi0 = perm[ii + perm[jj]] % 12; - n0 = t0 * t0 * dot(grad3[gi0], x0, y0); // (x,y) of grad3 used for - // 2D gradient - } - double t1 = 0.5 - x1 * x1 - y1 * y1; - if (t1 > 0) { - t1 *= t1; - int gi1 = perm[ii + i1 + perm[jj + j1]] % 12; - n1 = t1 * t1 * dot(grad3[gi1], x1, y1); - } - double t2 = 0.5 - x2 * x2 - y2 * y2; - if (t2 > 0) { - t2 *= t2; - int gi2 = perm[ii + 1 + perm[jj + 1]] % 12; - n2 = t2 * t2 * dot(grad3[gi2], x2, y2); - } - // Add contributions from each corner to get the final noise value. - // The result is scaled to return values in the interval [-1,1]. - return 70.0 * (n0 + n1 + n2); - } - - /** - * Computes 3D Simplex Noise. - * - * @param x - * coordinate - * @param y - * coordinate - * @param z - * coordinate - * @return noise value in range -1 ... +1 - */ - public static double noise(double x, double y, double z) { - double n0 = 0, n1 = 0, n2 = 0, n3 = 0; - // Noise contributions from the - // four corners - // Skew the input space to determine which simplex cell we're in - // final double F3 = 1.0 / 3.0; - double s = (x + y + z) * F3; // Very nice and simple skew factor - // for 3D - int i = fastfloor(x + s); - int j = fastfloor(y + s); - int k = fastfloor(z + s); - // final double G3 = 1.0 / 6.0; // Very nice and simple unskew factor, - // too - double t = (i + j + k) * G3; - double x0 = x - (i - t); // The x,y,z distances from the cell origin - double y0 = y - (j - t); - double z0 = z - (k - t); - // For the 3D case, the simplex shape is a slightly irregular - // tetrahedron. - // Determine which simplex we are in. - int i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) - // coords - int i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords - if (x0 >= y0) { - if (y0 >= z0) { - i1 = 1; - j1 = 0; - k1 = 0; - i2 = 1; - j2 = 1; - k2 = 0; - } // X Y Z order - else if (x0 >= z0) { - i1 = 1; - j1 = 0; - k1 = 0; - i2 = 1; - j2 = 0; - k2 = 1; - } // X Z Y order - else { - i1 = 0; - j1 = 0; - k1 = 1; - i2 = 1; - j2 = 0; - k2 = 1; - } // Z X Y order - } else { // x0 0) { - t0 *= t0; - int gi0 = perm[ii + perm[jj + perm[kk]]] % 12; - n0 = t0 * t0 * dot(grad3[gi0], x0, y0, z0); - } - double t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1; - if (t1 > 0) { - t1 *= t1; - int gi1 = perm[ii + i1 + perm[jj + j1 + perm[kk + k1]]] % 12; - n1 = t1 * t1 * dot(grad3[gi1], x1, y1, z1); - } - double t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2; - if (t2 > 0) { - t2 *= t2; - int gi2 = perm[ii + i2 + perm[jj + j2 + perm[kk + k2]]] % 12; - n2 = t2 * t2 * dot(grad3[gi2], x2, y2, z2); - } - double t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3; - if (t3 > 0) { - t3 *= t3; - int gi3 = perm[ii + 1 + perm[jj + 1 + perm[kk + 1]]] % 12; - n3 = t3 * t3 * dot(grad3[gi3], x3, y3, z3); - } - // Add contributions from each corner to get the final noise value. - // The result is scaled to stay just inside [-1,1] - return 32.0 * (n0 + n1 + n2 + n3); - } - - /** - * Computes 4D Simplex Noise. - * - * @param x - * coordinate - * @param y - * coordinate - * @param z - * coordinate - * @param w - * coordinate - * @return noise value in range -1 ... +1 - */ - public static double noise(double x, double y, double z, double w) { - // The skewing and unskewing factors are hairy again for the 4D case - double n0 = 0, n1 = 0, n2 = 0, n3 = 0, n4 = 0; // Noise contributions - // from the five corners - // Skew the (x,y,z,w) space to determine which cell of 24 simplices - double s = (x + y + z + w) * F4; // Factor for 4D skewing - int i = fastfloor(x + s); - int j = fastfloor(y + s); - int k = fastfloor(z + s); - int l = fastfloor(w + s); - double t = (i + j + k + l) * G4; // Factor for 4D unskewing - double x0 = x - (i - t); // The x,y,z,w distances from the cell origin - double y0 = y - (j - t); - double z0 = z - (k - t); - double w0 = w - (l - t); - // For the 4D case, the simplex is a 4D shape I won't even try to - // describe. - // To find out which of the 24 possible simplices we're in, we need to - // determine the magnitude ordering of x0, y0, z0 and w0. - // The method below is a good way of finding the ordering of x,y,z,w and - // then find the correct traversal order for the simplex were in. - // First, six pair-wise comparisons are performed between each possible - // pair of the four coordinates, and the results are used to add up - // binary bits for an integer index. - int c = 0; - if (x0 > y0) { - c = 0x20; - } - if (x0 > z0) { - c |= 0x10; - } - if (y0 > z0) { - c |= 0x08; - } - if (x0 > w0) { - c |= 0x04; - } - if (y0 > w0) { - c |= 0x02; - } - if (z0 > w0) { - c |= 0x01; - } - int i1, j1, k1, l1; // The integer offsets for the second simplex corner - int i2, j2, k2, l2; // The integer offsets for the third simplex corner - int i3, j3, k3, l3; // The integer offsets for the fourth simplex corner - // simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some - // order. Many values of c will never occur, since e.g. x>y>z>w makes - // x= 3 ? 1 : 0; - j1 = sc[1] >= 3 ? 1 : 0; - k1 = sc[2] >= 3 ? 1 : 0; - l1 = sc[3] >= 3 ? 1 : 0; - // The number 2 in the "simplex" array is at the second largest - // coordinate. - i2 = sc[0] >= 2 ? 1 : 0; - j2 = sc[1] >= 2 ? 1 : 0; - k2 = sc[2] >= 2 ? 1 : 0; - l2 = sc[3] >= 2 ? 1 : 0; - // The number 1 in the "simplex" array is at the second smallest - // coordinate. - i3 = sc[0] >= 1 ? 1 : 0; - j3 = sc[1] >= 1 ? 1 : 0; - k3 = sc[2] >= 1 ? 1 : 0; - l3 = sc[3] >= 1 ? 1 : 0; - // The fifth corner has all coordinate offsets = 1, so no need to look - // that up. - double x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) - double y1 = y0 - j1 + G4; - double z1 = z0 - k1 + G4; - double w1 = w0 - l1 + G4; - - double x2 = x0 - i2 + G42; // Offsets for third corner in (x,y,z,w) - double y2 = y0 - j2 + G42; - double z2 = z0 - k2 + G42; - double w2 = w0 - l2 + G42; - - double x3 = x0 - i3 + G43; // Offsets for fourth corner in (x,y,z,w) - double y3 = y0 - j3 + G43; - double z3 = z0 - k3 + G43; - double w3 = w0 - l3 + G43; - - double x4 = x0 + G44; // Offsets for last corner in (x,y,z,w) - double y4 = y0 + G44; - double z4 = z0 + G44; - double w4 = w0 + G44; - - // Work out the hashed gradient indices of the five simplex corners - int ii = i & 0xff; - int jj = j & 0xff; - int kk = k & 0xff; - int ll = l & 0xff; - - // Calculate the contribution from the five corners - double t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0; - if (t0 > 0) { - t0 *= t0; - int gi0 = perm[ii + perm[jj + perm[kk + perm[ll]]]] % 32; - n0 = t0 * t0 * dot(grad4[gi0], x0, y0, z0, w0); - } - double t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1; - if (t1 > 0) { - t1 *= t1; - int gi1 = perm[ii + i1 - + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]] % 32; - n1 = t1 * t1 * dot(grad4[gi1], x1, y1, z1, w1); - } - double t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2; - if (t2 > 0) { - t2 *= t2; - int gi2 = perm[ii + i2 - + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]] % 32; - n2 = t2 * t2 * dot(grad4[gi2], x2, y2, z2, w2); - } - double t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3; - if (t3 > 0) { - t3 *= t3; - int gi3 = perm[ii + i3 - + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]] % 32; - n3 = t3 * t3 * dot(grad4[gi3], x3, y3, z3, w3); - } - double t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4; - if (t4 > 0) { - t4 *= t4; - int gi4 = perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] % 32; - n4 = t4 * t4 * dot(grad4[gi4], x4, y4, z4, w4); - } - // Sum up and scale the result to cover the range [-1,1] - return 27.0 * (n0 + n1 + n2 + n3 + n4); - } +/* + * __ .__ .__ ._____. + * _/ |_ _______ __|__| ____ | | |__\_ |__ ______ + * \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/ + * | | ( <_> > <| \ \___| |_| || \_\ \\___ \ + * |__| \____/__/\_ \__|\___ >____/__||___ /____ > + * \/ \/ \/ \/ + * + * Copyright (c) 2006-2011 Karsten Schmidt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * http://creativecommons.org/licenses/LGPL/2.1/ + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +package toxi.math.noise; + +/** + * Simplex Noise in 2D, 3D and 4D. Based on the example code of this paper: + * http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf + * + * @author Stefan Gustavson, Linkping University, Sweden (stegu at itn dot liu + * dot se) + * @author Karsten Schmidt (slight optimizations & restructuring) + */ +public class SimplexNoise { + + private static final double SQRT3 = Math.sqrt(3.0); + private static final double SQRT5 = Math.sqrt(5.0); + + /** + * Skewing and unskewing factors for 2D, 3D and 4D, some of them + * pre-multiplied. + */ + private static final double F2 = 0.5 * (SQRT3 - 1.0); + private static final double G2 = (3.0 - SQRT3) / 6.0; + private static final double G22 = G2 * 2.0 - 1; + + private static final double F3 = 1.0 / 3.0; + private static final double G3 = 1.0 / 6.0; + + private static final double F4 = (SQRT5 - 1.0) / 4.0; + private static final double G4 = (5.0 - SQRT5) / 20.0; + private static final double G42 = G4 * 2.0; + private static final double G43 = G4 * 3.0; + private static final double G44 = G4 * 4.0 - 1.0; + + /** + * Gradient vectors for 3D (pointing to mid points of all edges of a unit + * cube) + */ + private static final int[][] grad3 = { { 1, 1, 0 }, { -1, 1, 0 }, + { 1, -1, 0 }, { -1, -1, 0 }, { 1, 0, 1 }, { -1, 0, 1 }, + { 1, 0, -1 }, { -1, 0, -1 }, { 0, 1, 1 }, { 0, -1, 1 }, + { 0, 1, -1 }, { 0, -1, -1 } }; + + /** + * Gradient vectors for 4D (pointing to mid points of all edges of a unit 4D + * hypercube) + */ + private static final int[][] grad4 = { { 0, 1, 1, 1 }, { 0, 1, 1, -1 }, + { 0, 1, -1, 1 }, { 0, 1, -1, -1 }, { 0, -1, 1, 1 }, + { 0, -1, 1, -1 }, { 0, -1, -1, 1 }, { 0, -1, -1, -1 }, + { 1, 0, 1, 1 }, { 1, 0, 1, -1 }, { 1, 0, -1, 1 }, { 1, 0, -1, -1 }, + { -1, 0, 1, 1 }, { -1, 0, 1, -1 }, { -1, 0, -1, 1 }, + { -1, 0, -1, -1 }, { 1, 1, 0, 1 }, { 1, 1, 0, -1 }, + { 1, -1, 0, 1 }, { 1, -1, 0, -1 }, { -1, 1, 0, 1 }, + { -1, 1, 0, -1 }, { -1, -1, 0, 1 }, { -1, -1, 0, -1 }, + { 1, 1, 1, 0 }, { 1, 1, -1, 0 }, { 1, -1, 1, 0 }, { 1, -1, -1, 0 }, + { -1, 1, 1, 0 }, { -1, 1, -1, 0 }, { -1, -1, 1, 0 }, + { -1, -1, -1, 0 } }; + + /** + * Permutation table + */ + private static final int[] p = { 151, 160, 137, 91, 90, 15, 131, 13, 201, + 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, + 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, + 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, + 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, + 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, + 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, + 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, + 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, + 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, + 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, + 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, + 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, + 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, + 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, + 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, + 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, 222, + 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 }; + + /** + * To remove the need for index wrapping, double the permutation table + * length + */ + private static int[] perm = new int[0x200]; + /** + * A lookup table to traverse the simplex around a given point in 4D. + * Details can be found where this table is used, in the 4D noise method. + */ + private static final int[][] simplex = { { 0, 1, 2, 3 }, { 0, 1, 3, 2 }, + { 0, 0, 0, 0 }, { 0, 2, 3, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, { 1, 2, 3, 0 }, { 0, 2, 1, 3 }, { 0, 0, 0, 0 }, + { 0, 3, 1, 2 }, { 0, 3, 2, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, { 1, 3, 2, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 2, 0, 3 }, { 0, 0, 0, 0 }, + { 1, 3, 0, 2 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, + { 2, 3, 0, 1 }, { 2, 3, 1, 0 }, { 1, 0, 2, 3 }, { 1, 0, 3, 2 }, + { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 2, 0, 3, 1 }, + { 0, 0, 0, 0 }, { 2, 1, 3, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 2, 0, 1, 3 }, { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 3, 0, 1, 2 }, { 3, 0, 2, 1 }, + { 0, 0, 0, 0 }, { 3, 1, 2, 0 }, { 2, 1, 0, 3 }, { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 3, 1, 0, 2 }, { 0, 0, 0, 0 }, + { 3, 2, 0, 1 }, { 3, 2, 1, 0 } }; + + static { + for (int i = 0; i < 0x200; i++) { + perm[i] = p[i & 0xff]; + } + } + + /** + * Computes dot product in 2D. + * + * @param g + * 2-vector (grid offset) + * @param x + * @param y + * @return dot product + */ + private static double dot(int g[], double x, double y) { + return g[0] * x + g[1] * y; + } + + /** + * Computes dot product in 3D. + * + * @param g + * 3-vector (grid offset) + * @param x + * @param y + * @param z + * @return dot product + */ + private static double dot(int g[], double x, double y, double z) { + return g[0] * x + g[1] * y + g[2] * z; + } + + /** + * Computes dot product in 4D. + * + * @param g + * 4-vector (grid offset) + * @param x + * @param y + * @param z + * @param w + * @return dot product + */ + private static double dot(int g[], double x, double y, double z, double w) { + return g[0] * x + g[1] * y + g[2] * z + g[3] * w; + } + + /** + * This method is a *lot* faster than using (int)Math.floor(x). + * + * @param x + * value to be floored + * @return + */ + private static final int fastfloor(double x) { + return x >= 0 ? (int) x : (int) x - 1; + } + + /** + * Computes 2D Simplex Noise. + * + * @param x + * coordinate + * @param y + * coordinate + * @return noise value in range -1 ... +1. + */ + public static double noise(double x, double y) { + double n0 = 0, n1 = 0, n2 = 0; // Noise contributions from the three + // corners + // Skew the input space to determine which simplex cell we're in + double s = (x + y) * F2; // Hairy factor for 2D + int i = fastfloor(x + s); + int j = fastfloor(y + s); + double t = (i + j) * G2; + double x0 = x - (i - t); // The x,y distances from the cell origin + double y0 = y - (j - t); + // For the 2D case, the simplex shape is an equilateral triangle. + // Determine which simplex we are in. + int i1, j1; // Offsets for second (middle) corner of simplex in (i,j) + if (x0 > y0) { + i1 = 1; + j1 = 0; + } // lower triangle, XY order: (0,0)->(1,0)->(1,1) + else { + i1 = 0; + j1 = 1; + } // upper triangle, YX order: (0,0)->(0,1)->(1,1) + // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and + // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where + // c = (3-sqrt(3))/6 + double x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed + double y1 = y0 - j1 + G2; + double x2 = x0 + G22; // Offsets for last corner in (x,y) unskewed + double y2 = y0 + G22; + // Work out the hashed gradient indices of the three simplex corners + int ii = i & 0xff; + int jj = j & 0xff; + // Calculate the contribution from the three corners + double t0 = 0.5 - x0 * x0 - y0 * y0; + if (t0 > 0) { + t0 *= t0; + int gi0 = perm[ii + perm[jj]] % 12; + n0 = t0 * t0 * dot(grad3[gi0], x0, y0); // (x,y) of grad3 used for + // 2D gradient + } + double t1 = 0.5 - x1 * x1 - y1 * y1; + if (t1 > 0) { + t1 *= t1; + int gi1 = perm[ii + i1 + perm[jj + j1]] % 12; + n1 = t1 * t1 * dot(grad3[gi1], x1, y1); + } + double t2 = 0.5 - x2 * x2 - y2 * y2; + if (t2 > 0) { + t2 *= t2; + int gi2 = perm[ii + 1 + perm[jj + 1]] % 12; + n2 = t2 * t2 * dot(grad3[gi2], x2, y2); + } + // Add contributions from each corner to get the final noise value. + // The result is scaled to return values in the interval [-1,1]. + return 70.0 * (n0 + n1 + n2); + } + + /** + * Computes 3D Simplex Noise. + * + * @param x + * coordinate + * @param y + * coordinate + * @param z + * coordinate + * @return noise value in range -1 ... +1 + */ + public static double noise(double x, double y, double z) { + double n0 = 0, n1 = 0, n2 = 0, n3 = 0; + // Noise contributions from the + // four corners + // Skew the input space to determine which simplex cell we're in + // final double F3 = 1.0 / 3.0; + double s = (x + y + z) * F3; // Very nice and simple skew factor + // for 3D + int i = fastfloor(x + s); + int j = fastfloor(y + s); + int k = fastfloor(z + s); + // final double G3 = 1.0 / 6.0; // Very nice and simple unskew factor, + // too + double t = (i + j + k) * G3; + double x0 = x - (i - t); // The x,y,z distances from the cell origin + double y0 = y - (j - t); + double z0 = z - (k - t); + // For the 3D case, the simplex shape is a slightly irregular + // tetrahedron. + // Determine which simplex we are in. + int i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) + // coords + int i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords + if (x0 >= y0) { + if (y0 >= z0) { + i1 = 1; + j1 = 0; + k1 = 0; + i2 = 1; + j2 = 1; + k2 = 0; + } // X Y Z order + else if (x0 >= z0) { + i1 = 1; + j1 = 0; + k1 = 0; + i2 = 1; + j2 = 0; + k2 = 1; + } // X Z Y order + else { + i1 = 0; + j1 = 0; + k1 = 1; + i2 = 1; + j2 = 0; + k2 = 1; + } // Z X Y order + } else { // x0 0) { + t0 *= t0; + int gi0 = perm[ii + perm[jj + perm[kk]]] % 12; + n0 = t0 * t0 * dot(grad3[gi0], x0, y0, z0); + } + double t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1; + if (t1 > 0) { + t1 *= t1; + int gi1 = perm[ii + i1 + perm[jj + j1 + perm[kk + k1]]] % 12; + n1 = t1 * t1 * dot(grad3[gi1], x1, y1, z1); + } + double t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2; + if (t2 > 0) { + t2 *= t2; + int gi2 = perm[ii + i2 + perm[jj + j2 + perm[kk + k2]]] % 12; + n2 = t2 * t2 * dot(grad3[gi2], x2, y2, z2); + } + double t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3; + if (t3 > 0) { + t3 *= t3; + int gi3 = perm[ii + 1 + perm[jj + 1 + perm[kk + 1]]] % 12; + n3 = t3 * t3 * dot(grad3[gi3], x3, y3, z3); + } + // Add contributions from each corner to get the final noise value. + // The result is scaled to stay just inside [-1,1] + return 32.0 * (n0 + n1 + n2 + n3); + } + + /** + * Computes 4D Simplex Noise. + * + * @param x + * coordinate + * @param y + * coordinate + * @param z + * coordinate + * @param w + * coordinate + * @return noise value in range -1 ... +1 + */ + public static double noise(double x, double y, double z, double w) { + // The skewing and unskewing factors are hairy again for the 4D case + double n0 = 0, n1 = 0, n2 = 0, n3 = 0, n4 = 0; // Noise contributions + // from the five corners + // Skew the (x,y,z,w) space to determine which cell of 24 simplices + double s = (x + y + z + w) * F4; // Factor for 4D skewing + int i = fastfloor(x + s); + int j = fastfloor(y + s); + int k = fastfloor(z + s); + int l = fastfloor(w + s); + double t = (i + j + k + l) * G4; // Factor for 4D unskewing + double x0 = x - (i - t); // The x,y,z,w distances from the cell origin + double y0 = y - (j - t); + double z0 = z - (k - t); + double w0 = w - (l - t); + // For the 4D case, the simplex is a 4D shape I won't even try to + // describe. + // To find out which of the 24 possible simplices we're in, we need to + // determine the magnitude ordering of x0, y0, z0 and w0. + // The method below is a good way of finding the ordering of x,y,z,w and + // then find the correct traversal order for the simplex were in. + // First, six pair-wise comparisons are performed between each possible + // pair of the four coordinates, and the results are used to add up + // binary bits for an integer index. + int c = 0; + if (x0 > y0) { + c = 0x20; + } + if (x0 > z0) { + c |= 0x10; + } + if (y0 > z0) { + c |= 0x08; + } + if (x0 > w0) { + c |= 0x04; + } + if (y0 > w0) { + c |= 0x02; + } + if (z0 > w0) { + c |= 0x01; + } + int i1, j1, k1, l1; // The integer offsets for the second simplex corner + int i2, j2, k2, l2; // The integer offsets for the third simplex corner + int i3, j3, k3, l3; // The integer offsets for the fourth simplex corner + // simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some + // order. Many values of c will never occur, since e.g. x>y>z>w makes + // x= 3 ? 1 : 0; + j1 = sc[1] >= 3 ? 1 : 0; + k1 = sc[2] >= 3 ? 1 : 0; + l1 = sc[3] >= 3 ? 1 : 0; + // The number 2 in the "simplex" array is at the second largest + // coordinate. + i2 = sc[0] >= 2 ? 1 : 0; + j2 = sc[1] >= 2 ? 1 : 0; + k2 = sc[2] >= 2 ? 1 : 0; + l2 = sc[3] >= 2 ? 1 : 0; + // The number 1 in the "simplex" array is at the second smallest + // coordinate. + i3 = sc[0] >= 1 ? 1 : 0; + j3 = sc[1] >= 1 ? 1 : 0; + k3 = sc[2] >= 1 ? 1 : 0; + l3 = sc[3] >= 1 ? 1 : 0; + // The fifth corner has all coordinate offsets = 1, so no need to look + // that up. + double x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) + double y1 = y0 - j1 + G4; + double z1 = z0 - k1 + G4; + double w1 = w0 - l1 + G4; + + double x2 = x0 - i2 + G42; // Offsets for third corner in (x,y,z,w) + double y2 = y0 - j2 + G42; + double z2 = z0 - k2 + G42; + double w2 = w0 - l2 + G42; + + double x3 = x0 - i3 + G43; // Offsets for fourth corner in (x,y,z,w) + double y3 = y0 - j3 + G43; + double z3 = z0 - k3 + G43; + double w3 = w0 - l3 + G43; + + double x4 = x0 + G44; // Offsets for last corner in (x,y,z,w) + double y4 = y0 + G44; + double z4 = z0 + G44; + double w4 = w0 + G44; + + // Work out the hashed gradient indices of the five simplex corners + int ii = i & 0xff; + int jj = j & 0xff; + int kk = k & 0xff; + int ll = l & 0xff; + + // Calculate the contribution from the five corners + double t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0; + if (t0 > 0) { + t0 *= t0; + int gi0 = perm[ii + perm[jj + perm[kk + perm[ll]]]] % 32; + n0 = t0 * t0 * dot(grad4[gi0], x0, y0, z0, w0); + } + double t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1; + if (t1 > 0) { + t1 *= t1; + int gi1 = perm[ii + i1 + + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]] % 32; + n1 = t1 * t1 * dot(grad4[gi1], x1, y1, z1, w1); + } + double t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2; + if (t2 > 0) { + t2 *= t2; + int gi2 = perm[ii + i2 + + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]] % 32; + n2 = t2 * t2 * dot(grad4[gi2], x2, y2, z2, w2); + } + double t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3; + if (t3 > 0) { + t3 *= t3; + int gi3 = perm[ii + i3 + + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]] % 32; + n3 = t3 * t3 * dot(grad4[gi3], x3, y3, z3, w3); + } + double t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4; + if (t4 > 0) { + t4 *= t4; + int gi4 = perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] % 32; + n4 = t4 * t4 * dot(grad4[gi4], x4, y4, z4, w4); + } + // Sum up and scale the result to cover the range [-1,1] + return 27.0 * (n0 + n1 + n2 + n3 + n4); + } } \ No newline at end of file