diff --git a/.gitignore b/.gitignore index 015b84e4..3ad22aee 100644 --- a/.gitignore +++ b/.gitignore @@ -46,4 +46,10 @@ gradle-app.setting .gradletasknamecache run/ /test-server/.bstats -.idea/ \ No newline at end of file +.idea/ +# Local agent/tooling artefacts +.claude/ +.serena/ + +# LuckPerms runtime directory created next to the process +data/ diff --git a/LICENSE b/LICENSE index f49a4e16..8410c200 100644 --- a/LICENSE +++ b/LICENSE @@ -1,201 +1,661 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file +GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. \ No newline at end of file diff --git a/README.md b/README.md index 00f299c4..895956e9 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,14 @@ Code coverage reports are generated using JaCoCo and can be found in `build/repo ## License -This project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE) file for details. +This project is licensed under the **GNU Affero General Public License v3.0** — +see the [LICENSE](LICENSE) file for details. + +Titan builds on [Falco](https://github.com/OneLiteFeatherNET/Falco), OneLiteFeather's +Anvil chunk loader and light engine, which is itself AGPL-3.0. Because a Minecraft +server is a network service, AGPL section 13 applies: anyone who runs a modified +version of Titan and lets others connect to it must offer those users the +corresponding source code. ## Credits diff --git a/api/src/main/java/net/onelitefeather/deliver/DeliverComponent.java b/api/src/main/java/net/onelitefeather/deliver/DeliverComponent.java index fbc37496..0ec9fdd1 100644 --- a/api/src/main/java/net/onelitefeather/deliver/DeliverComponent.java +++ b/api/src/main/java/net/onelitefeather/deliver/DeliverComponent.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.deliver; diff --git a/api/src/main/java/net/onelitefeather/deliver/DeliverType.java b/api/src/main/java/net/onelitefeather/deliver/DeliverType.java index a0218ea4..77724e56 100644 --- a/api/src/main/java/net/onelitefeather/deliver/DeliverType.java +++ b/api/src/main/java/net/onelitefeather/deliver/DeliverType.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.deliver; diff --git a/api/src/main/java/net/onelitefeather/deliver/ServerBuilderImpl.java b/api/src/main/java/net/onelitefeather/deliver/ServerBuilderImpl.java index 829ed0e8..1bdf1f9d 100644 --- a/api/src/main/java/net/onelitefeather/deliver/ServerBuilderImpl.java +++ b/api/src/main/java/net/onelitefeather/deliver/ServerBuilderImpl.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.deliver; diff --git a/api/src/main/java/net/onelitefeather/deliver/ServerDeliverComponentImpl.java b/api/src/main/java/net/onelitefeather/deliver/ServerDeliverComponentImpl.java index 4cf2ee08..aa81266d 100644 --- a/api/src/main/java/net/onelitefeather/deliver/ServerDeliverComponentImpl.java +++ b/api/src/main/java/net/onelitefeather/deliver/ServerDeliverComponentImpl.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.deliver; diff --git a/api/src/main/java/net/onelitefeather/deliver/TaskBuilderImpl.java b/api/src/main/java/net/onelitefeather/deliver/TaskBuilderImpl.java index ffc8cb9a..161e5908 100644 --- a/api/src/main/java/net/onelitefeather/deliver/TaskBuilderImpl.java +++ b/api/src/main/java/net/onelitefeather/deliver/TaskBuilderImpl.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.deliver; diff --git a/api/src/main/java/net/onelitefeather/deliver/TaskComponentImpl.java b/api/src/main/java/net/onelitefeather/deliver/TaskComponentImpl.java index 7df03353..f74e9b3d 100644 --- a/api/src/main/java/net/onelitefeather/deliver/TaskComponentImpl.java +++ b/api/src/main/java/net/onelitefeather/deliver/TaskComponentImpl.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.deliver; diff --git a/api/src/main/java/net/onelitefeather/titan/api/deliver/Deliver.java b/api/src/main/java/net/onelitefeather/titan/api/deliver/Deliver.java index b09173aa..c6c79dad 100644 --- a/api/src/main/java/net/onelitefeather/titan/api/deliver/Deliver.java +++ b/api/src/main/java/net/onelitefeather/titan/api/deliver/Deliver.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.api.deliver; diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 55a31b14..a70ae7a7 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -157,8 +157,8 @@ publishing { url = "https://github.com/OneLiteFeatherNET/titan" licenses { license { - name = "The Apache License, Version 2.0" - url = "http://www.apache.org/licenses/LICENSE-2.0.txt" + name = "GNU Affero General Public License v3.0" + url = "https://www.gnu.org/licenses/agpl-3.0.txt" } } developers { diff --git a/app/src/main/java/net/onelitefeather/titan/app/Titan.java b/app/src/main/java/net/onelitefeather/titan/app/Titan.java index 7504a14f..42a23911 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/Titan.java +++ b/app/src/main/java/net/onelitefeather/titan/app/Titan.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app; diff --git a/app/src/main/java/net/onelitefeather/titan/app/TitanApplication.java b/app/src/main/java/net/onelitefeather/titan/app/TitanApplication.java index fdf50c07..f965014c 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/TitanApplication.java +++ b/app/src/main/java/net/onelitefeather/titan/app/TitanApplication.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app; diff --git a/app/src/main/java/net/onelitefeather/titan/app/commands/EndCommand.java b/app/src/main/java/net/onelitefeather/titan/app/commands/EndCommand.java index a3c8bad6..69e2fe30 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/commands/EndCommand.java +++ b/app/src/main/java/net/onelitefeather/titan/app/commands/EndCommand.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.commands; diff --git a/app/src/main/java/net/onelitefeather/titan/app/commands/StopCommand.java b/app/src/main/java/net/onelitefeather/titan/app/commands/StopCommand.java index bfe6b942..596b0691 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/commands/StopCommand.java +++ b/app/src/main/java/net/onelitefeather/titan/app/commands/StopCommand.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.commands; diff --git a/app/src/main/java/net/onelitefeather/titan/app/helper/NavigationHelper.java b/app/src/main/java/net/onelitefeather/titan/app/helper/NavigationHelper.java index 1924319f..15f6388c 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/helper/NavigationHelper.java +++ b/app/src/main/java/net/onelitefeather/titan/app/helper/NavigationHelper.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.helper; diff --git a/app/src/main/java/net/onelitefeather/titan/app/listener/DeathListener.java b/app/src/main/java/net/onelitefeather/titan/app/listener/DeathListener.java index 5136aa4e..6c9cc439 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/listener/DeathListener.java +++ b/app/src/main/java/net/onelitefeather/titan/app/listener/DeathListener.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/main/java/net/onelitefeather/titan/app/listener/ElytraBoostListener.java b/app/src/main/java/net/onelitefeather/titan/app/listener/ElytraBoostListener.java index 5909ec0d..daab03ef 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/listener/ElytraBoostListener.java +++ b/app/src/main/java/net/onelitefeather/titan/app/listener/ElytraBoostListener.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/main/java/net/onelitefeather/titan/app/listener/ElytraStartFlyingListener.java b/app/src/main/java/net/onelitefeather/titan/app/listener/ElytraStartFlyingListener.java index e7a31923..7dcdd883 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/listener/ElytraStartFlyingListener.java +++ b/app/src/main/java/net/onelitefeather/titan/app/listener/ElytraStartFlyingListener.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/main/java/net/onelitefeather/titan/app/listener/ElytraStopFlyingListener.java b/app/src/main/java/net/onelitefeather/titan/app/listener/ElytraStopFlyingListener.java index 8e101884..e834de15 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/listener/ElytraStopFlyingListener.java +++ b/app/src/main/java/net/onelitefeather/titan/app/listener/ElytraStopFlyingListener.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/main/java/net/onelitefeather/titan/app/listener/NavigationListener.java b/app/src/main/java/net/onelitefeather/titan/app/listener/NavigationListener.java index 3a2c0bcc..442bd740 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/listener/NavigationListener.java +++ b/app/src/main/java/net/onelitefeather/titan/app/listener/NavigationListener.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/main/java/net/onelitefeather/titan/app/listener/PlayerConfigurationListener.java b/app/src/main/java/net/onelitefeather/titan/app/listener/PlayerConfigurationListener.java index 7b26ff51..e245ef83 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/listener/PlayerConfigurationListener.java +++ b/app/src/main/java/net/onelitefeather/titan/app/listener/PlayerConfigurationListener.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/main/java/net/onelitefeather/titan/app/listener/PlayerMoveListener.java b/app/src/main/java/net/onelitefeather/titan/app/listener/PlayerMoveListener.java index 74dbc594..8be239e1 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/listener/PlayerMoveListener.java +++ b/app/src/main/java/net/onelitefeather/titan/app/listener/PlayerMoveListener.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/main/java/net/onelitefeather/titan/app/listener/PlayerSpawnListener.java b/app/src/main/java/net/onelitefeather/titan/app/listener/PlayerSpawnListener.java index c6b18434..70773c05 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/listener/PlayerSpawnListener.java +++ b/app/src/main/java/net/onelitefeather/titan/app/listener/PlayerSpawnListener.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/main/java/net/onelitefeather/titan/app/listener/RespawnListener.java b/app/src/main/java/net/onelitefeather/titan/app/listener/RespawnListener.java index bdf0e610..df80d837 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/listener/RespawnListener.java +++ b/app/src/main/java/net/onelitefeather/titan/app/listener/RespawnListener.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/main/java/net/onelitefeather/titan/app/listener/SitDisconnectListener.java b/app/src/main/java/net/onelitefeather/titan/app/listener/SitDisconnectListener.java index 0b4b4787..35e00937 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/listener/SitDisconnectListener.java +++ b/app/src/main/java/net/onelitefeather/titan/app/listener/SitDisconnectListener.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/main/java/net/onelitefeather/titan/app/listener/SitDismountListener.java b/app/src/main/java/net/onelitefeather/titan/app/listener/SitDismountListener.java index c765de6d..4f3372c6 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/listener/SitDismountListener.java +++ b/app/src/main/java/net/onelitefeather/titan/app/listener/SitDismountListener.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/main/java/net/onelitefeather/titan/app/listener/SitLeavePacketListener.java b/app/src/main/java/net/onelitefeather/titan/app/listener/SitLeavePacketListener.java index 1e20f985..0e57ec27 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/listener/SitLeavePacketListener.java +++ b/app/src/main/java/net/onelitefeather/titan/app/listener/SitLeavePacketListener.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/main/java/net/onelitefeather/titan/app/listener/SitListener.java b/app/src/main/java/net/onelitefeather/titan/app/listener/SitListener.java index 420080b2..7787aa56 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/listener/SitListener.java +++ b/app/src/main/java/net/onelitefeather/titan/app/listener/SitListener.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/main/java/net/onelitefeather/titan/app/listener/TickleListener.java b/app/src/main/java/net/onelitefeather/titan/app/listener/TickleListener.java index 76fb16db..63cf577c 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/listener/TickleListener.java +++ b/app/src/main/java/net/onelitefeather/titan/app/listener/TickleListener.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/main/java/net/onelitefeather/titan/app/player/CompatibilityUtil.java b/app/src/main/java/net/onelitefeather/titan/app/player/CompatibilityUtil.java index e3c68cbc..85f6c1cf 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/player/CompatibilityUtil.java +++ b/app/src/main/java/net/onelitefeather/titan/app/player/CompatibilityUtil.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.player; diff --git a/app/src/main/java/net/onelitefeather/titan/app/player/TitanPlayer.java b/app/src/main/java/net/onelitefeather/titan/app/player/TitanPlayer.java index 11c0f880..ad2519b7 100644 --- a/app/src/main/java/net/onelitefeather/titan/app/player/TitanPlayer.java +++ b/app/src/main/java/net/onelitefeather/titan/app/player/TitanPlayer.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.player; diff --git a/app/src/test/java/net/onelitefeather/titan/app/helper/NavigationHelperTest.java b/app/src/test/java/net/onelitefeather/titan/app/helper/NavigationHelperTest.java index c7f03b6a..e579ba42 100644 --- a/app/src/test/java/net/onelitefeather/titan/app/helper/NavigationHelperTest.java +++ b/app/src/test/java/net/onelitefeather/titan/app/helper/NavigationHelperTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.helper; diff --git a/app/src/test/java/net/onelitefeather/titan/app/listener/DeathListenerTest.java b/app/src/test/java/net/onelitefeather/titan/app/listener/DeathListenerTest.java index 6dfc6652..bb91c5f0 100644 --- a/app/src/test/java/net/onelitefeather/titan/app/listener/DeathListenerTest.java +++ b/app/src/test/java/net/onelitefeather/titan/app/listener/DeathListenerTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/test/java/net/onelitefeather/titan/app/listener/ElytraBoostListenerTest.java b/app/src/test/java/net/onelitefeather/titan/app/listener/ElytraBoostListenerTest.java index 57ba6936..32688002 100644 --- a/app/src/test/java/net/onelitefeather/titan/app/listener/ElytraBoostListenerTest.java +++ b/app/src/test/java/net/onelitefeather/titan/app/listener/ElytraBoostListenerTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/test/java/net/onelitefeather/titan/app/listener/ElytraStartFlyingListenerTest.java b/app/src/test/java/net/onelitefeather/titan/app/listener/ElytraStartFlyingListenerTest.java index d99f1583..57a487cc 100644 --- a/app/src/test/java/net/onelitefeather/titan/app/listener/ElytraStartFlyingListenerTest.java +++ b/app/src/test/java/net/onelitefeather/titan/app/listener/ElytraStartFlyingListenerTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/test/java/net/onelitefeather/titan/app/listener/ElytraStopFlyingListenerTest.java b/app/src/test/java/net/onelitefeather/titan/app/listener/ElytraStopFlyingListenerTest.java index 13889fbc..a05143d8 100644 --- a/app/src/test/java/net/onelitefeather/titan/app/listener/ElytraStopFlyingListenerTest.java +++ b/app/src/test/java/net/onelitefeather/titan/app/listener/ElytraStopFlyingListenerTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/test/java/net/onelitefeather/titan/app/listener/NavigationListenerTest.java b/app/src/test/java/net/onelitefeather/titan/app/listener/NavigationListenerTest.java index 9945f350..7d09e244 100644 --- a/app/src/test/java/net/onelitefeather/titan/app/listener/NavigationListenerTest.java +++ b/app/src/test/java/net/onelitefeather/titan/app/listener/NavigationListenerTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/test/java/net/onelitefeather/titan/app/listener/PlayerConfigurationListenerTest.java b/app/src/test/java/net/onelitefeather/titan/app/listener/PlayerConfigurationListenerTest.java index 9891147d..20e1c2e4 100644 --- a/app/src/test/java/net/onelitefeather/titan/app/listener/PlayerConfigurationListenerTest.java +++ b/app/src/test/java/net/onelitefeather/titan/app/listener/PlayerConfigurationListenerTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/test/java/net/onelitefeather/titan/app/listener/PlayerMoveListenerTest.java b/app/src/test/java/net/onelitefeather/titan/app/listener/PlayerMoveListenerTest.java index 902f7ad5..6008b009 100644 --- a/app/src/test/java/net/onelitefeather/titan/app/listener/PlayerMoveListenerTest.java +++ b/app/src/test/java/net/onelitefeather/titan/app/listener/PlayerMoveListenerTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/test/java/net/onelitefeather/titan/app/listener/PlayerSpawnListenerTest.java b/app/src/test/java/net/onelitefeather/titan/app/listener/PlayerSpawnListenerTest.java index 509974cf..61960df7 100644 --- a/app/src/test/java/net/onelitefeather/titan/app/listener/PlayerSpawnListenerTest.java +++ b/app/src/test/java/net/onelitefeather/titan/app/listener/PlayerSpawnListenerTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/test/java/net/onelitefeather/titan/app/listener/RespawnListenerTest.java b/app/src/test/java/net/onelitefeather/titan/app/listener/RespawnListenerTest.java index d03407c6..d26f5a0a 100644 --- a/app/src/test/java/net/onelitefeather/titan/app/listener/RespawnListenerTest.java +++ b/app/src/test/java/net/onelitefeather/titan/app/listener/RespawnListenerTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/test/java/net/onelitefeather/titan/app/listener/SitDisconnectListenerTest.java b/app/src/test/java/net/onelitefeather/titan/app/listener/SitDisconnectListenerTest.java index e86d49df..18bc422f 100644 --- a/app/src/test/java/net/onelitefeather/titan/app/listener/SitDisconnectListenerTest.java +++ b/app/src/test/java/net/onelitefeather/titan/app/listener/SitDisconnectListenerTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/test/java/net/onelitefeather/titan/app/listener/SitDismountListenerTest.java b/app/src/test/java/net/onelitefeather/titan/app/listener/SitDismountListenerTest.java index d2831b2e..6c53a46c 100644 --- a/app/src/test/java/net/onelitefeather/titan/app/listener/SitDismountListenerTest.java +++ b/app/src/test/java/net/onelitefeather/titan/app/listener/SitDismountListenerTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/test/java/net/onelitefeather/titan/app/listener/SitLeavePacketListenerTest.java b/app/src/test/java/net/onelitefeather/titan/app/listener/SitLeavePacketListenerTest.java index ed41ff9d..0fc6a689 100644 --- a/app/src/test/java/net/onelitefeather/titan/app/listener/SitLeavePacketListenerTest.java +++ b/app/src/test/java/net/onelitefeather/titan/app/listener/SitLeavePacketListenerTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/test/java/net/onelitefeather/titan/app/listener/SitListenerTest.java b/app/src/test/java/net/onelitefeather/titan/app/listener/SitListenerTest.java index 5ba1edf9..145b653e 100644 --- a/app/src/test/java/net/onelitefeather/titan/app/listener/SitListenerTest.java +++ b/app/src/test/java/net/onelitefeather/titan/app/listener/SitListenerTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/test/java/net/onelitefeather/titan/app/listener/TickleListenerTest.java b/app/src/test/java/net/onelitefeather/titan/app/listener/TickleListenerTest.java index bd28ab12..e665cd35 100644 --- a/app/src/test/java/net/onelitefeather/titan/app/listener/TickleListenerTest.java +++ b/app/src/test/java/net/onelitefeather/titan/app/listener/TickleListenerTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.listener; diff --git a/app/src/test/java/net/onelitefeather/titan/app/testutils/DummyDeliver.java b/app/src/test/java/net/onelitefeather/titan/app/testutils/DummyDeliver.java index eac07ed3..7f98959c 100644 --- a/app/src/test/java/net/onelitefeather/titan/app/testutils/DummyDeliver.java +++ b/app/src/test/java/net/onelitefeather/titan/app/testutils/DummyDeliver.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.app.testutils; diff --git a/bridge/build.gradle.kts b/bridge/build.gradle.kts index 527210c6..1457079d 100644 --- a/bridge/build.gradle.kts +++ b/bridge/build.gradle.kts @@ -50,8 +50,8 @@ publishing { url = "https://github.com/OneLiteFeatherNET/titan" licenses { license { - name = "The Apache License, Version 2.0" - url = "http://www.apache.org/licenses/LICENSE-2.0.txt" + name = "GNU Affero General Public License v3.0" + url = "https://www.gnu.org/licenses/agpl-3.0.txt" } } developers { diff --git a/bridge/src/main/java/net/onelitefeather/titan/bridge/TitanBridgePermissionExtension.java b/bridge/src/main/java/net/onelitefeather/titan/bridge/TitanBridgePermissionExtension.java index 0c48979f..1876b3c1 100644 --- a/bridge/src/main/java/net/onelitefeather/titan/bridge/TitanBridgePermissionExtension.java +++ b/bridge/src/main/java/net/onelitefeather/titan/bridge/TitanBridgePermissionExtension.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.bridge; diff --git a/common/src/main/java/net/onelitefeather/titan/common/argument/ArgumentMaterialType.java b/common/src/main/java/net/onelitefeather/titan/common/argument/ArgumentMaterialType.java index 9aa6011b..6c40aec8 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/argument/ArgumentMaterialType.java +++ b/common/src/main/java/net/onelitefeather/titan/common/argument/ArgumentMaterialType.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.argument; diff --git a/common/src/main/java/net/onelitefeather/titan/common/blockhandler/BannerHandler.java b/common/src/main/java/net/onelitefeather/titan/common/blockhandler/BannerHandler.java index 4bbb3979..3e5df1da 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/blockhandler/BannerHandler.java +++ b/common/src/main/java/net/onelitefeather/titan/common/blockhandler/BannerHandler.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.blockhandler; diff --git a/common/src/main/java/net/onelitefeather/titan/common/blockhandler/BeaconHandler.java b/common/src/main/java/net/onelitefeather/titan/common/blockhandler/BeaconHandler.java index 06ab154f..dadd5d22 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/blockhandler/BeaconHandler.java +++ b/common/src/main/java/net/onelitefeather/titan/common/blockhandler/BeaconHandler.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.blockhandler; diff --git a/common/src/main/java/net/onelitefeather/titan/common/blockhandler/BedHandler.java b/common/src/main/java/net/onelitefeather/titan/common/blockhandler/BedHandler.java index 4625a712..5af15bb1 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/blockhandler/BedHandler.java +++ b/common/src/main/java/net/onelitefeather/titan/common/blockhandler/BedHandler.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.blockhandler; diff --git a/common/src/main/java/net/onelitefeather/titan/common/blockhandler/CandleHandler.java b/common/src/main/java/net/onelitefeather/titan/common/blockhandler/CandleHandler.java index f935f01a..376ade40 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/blockhandler/CandleHandler.java +++ b/common/src/main/java/net/onelitefeather/titan/common/blockhandler/CandleHandler.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.blockhandler; diff --git a/common/src/main/java/net/onelitefeather/titan/common/blockhandler/JukeboxHandler.java b/common/src/main/java/net/onelitefeather/titan/common/blockhandler/JukeboxHandler.java index 3314ae88..dc6e11bd 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/blockhandler/JukeboxHandler.java +++ b/common/src/main/java/net/onelitefeather/titan/common/blockhandler/JukeboxHandler.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.blockhandler; diff --git a/common/src/main/java/net/onelitefeather/titan/common/blockhandler/SignHandler.java b/common/src/main/java/net/onelitefeather/titan/common/blockhandler/SignHandler.java index 23be5b05..9f186f3c 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/blockhandler/SignHandler.java +++ b/common/src/main/java/net/onelitefeather/titan/common/blockhandler/SignHandler.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.blockhandler; diff --git a/common/src/main/java/net/onelitefeather/titan/common/blockhandler/SkullHandler.java b/common/src/main/java/net/onelitefeather/titan/common/blockhandler/SkullHandler.java index 1664e7e4..a51b66e0 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/blockhandler/SkullHandler.java +++ b/common/src/main/java/net/onelitefeather/titan/common/blockhandler/SkullHandler.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.blockhandler; diff --git a/common/src/main/java/net/onelitefeather/titan/common/blockhandler/objects/BannerPattern.java b/common/src/main/java/net/onelitefeather/titan/common/blockhandler/objects/BannerPattern.java index 8d2cb235..30b1e629 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/blockhandler/objects/BannerPattern.java +++ b/common/src/main/java/net/onelitefeather/titan/common/blockhandler/objects/BannerPattern.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.blockhandler.objects; diff --git a/common/src/main/java/net/onelitefeather/titan/common/blockhandler/objects/SignSide.java b/common/src/main/java/net/onelitefeather/titan/common/blockhandler/objects/SignSide.java index 90486012..9a0a11b0 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/blockhandler/objects/SignSide.java +++ b/common/src/main/java/net/onelitefeather/titan/common/blockhandler/objects/SignSide.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.blockhandler.objects; diff --git a/common/src/main/java/net/onelitefeather/titan/common/config/AppConfig.java b/common/src/main/java/net/onelitefeather/titan/common/config/AppConfig.java index b40c2093..2bf9e58a 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/config/AppConfig.java +++ b/common/src/main/java/net/onelitefeather/titan/common/config/AppConfig.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.config; diff --git a/common/src/main/java/net/onelitefeather/titan/common/config/AppConfigBuilder.java b/common/src/main/java/net/onelitefeather/titan/common/config/AppConfigBuilder.java index 878ef816..4caaed54 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/config/AppConfigBuilder.java +++ b/common/src/main/java/net/onelitefeather/titan/common/config/AppConfigBuilder.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.config; diff --git a/common/src/main/java/net/onelitefeather/titan/common/config/AppConfigImpl.java b/common/src/main/java/net/onelitefeather/titan/common/config/AppConfigImpl.java index b86f404d..de61c7b3 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/config/AppConfigImpl.java +++ b/common/src/main/java/net/onelitefeather/titan/common/config/AppConfigImpl.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.config; diff --git a/common/src/main/java/net/onelitefeather/titan/common/config/AppConfigProvider.java b/common/src/main/java/net/onelitefeather/titan/common/config/AppConfigProvider.java index 017b905c..1551b346 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/config/AppConfigProvider.java +++ b/common/src/main/java/net/onelitefeather/titan/common/config/AppConfigProvider.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.config; diff --git a/common/src/main/java/net/onelitefeather/titan/common/config/InternalAppConfig.java b/common/src/main/java/net/onelitefeather/titan/common/config/InternalAppConfig.java index 607824a0..d84dd766 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/config/InternalAppConfig.java +++ b/common/src/main/java/net/onelitefeather/titan/common/config/InternalAppConfig.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.config; diff --git a/common/src/main/java/net/onelitefeather/titan/common/deliver/DeliverProvider.java b/common/src/main/java/net/onelitefeather/titan/common/deliver/DeliverProvider.java index 6ed73baa..0b62e4a6 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/deliver/DeliverProvider.java +++ b/common/src/main/java/net/onelitefeather/titan/common/deliver/DeliverProvider.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.deliver; diff --git a/common/src/main/java/net/onelitefeather/titan/common/deliver/MessageChannelDeliver.java b/common/src/main/java/net/onelitefeather/titan/common/deliver/MessageChannelDeliver.java index 842b1c11..002d888d 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/deliver/MessageChannelDeliver.java +++ b/common/src/main/java/net/onelitefeather/titan/common/deliver/MessageChannelDeliver.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.deliver; diff --git a/common/src/main/java/net/onelitefeather/titan/common/deliver/NoopDeliver.java b/common/src/main/java/net/onelitefeather/titan/common/deliver/NoopDeliver.java index 5a9bc5bf..137b6772 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/deliver/NoopDeliver.java +++ b/common/src/main/java/net/onelitefeather/titan/common/deliver/NoopDeliver.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.deliver; diff --git a/common/src/main/java/net/onelitefeather/titan/common/deliver/ServerConnector.java b/common/src/main/java/net/onelitefeather/titan/common/deliver/ServerConnector.java index 80ec1111..438bd1f7 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/deliver/ServerConnector.java +++ b/common/src/main/java/net/onelitefeather/titan/common/deliver/ServerConnector.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.deliver; diff --git a/common/src/main/java/net/onelitefeather/titan/common/deliver/TitanServerConnector.java b/common/src/main/java/net/onelitefeather/titan/common/deliver/TitanServerConnector.java index 62a75c96..7b0bced9 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/deliver/TitanServerConnector.java +++ b/common/src/main/java/net/onelitefeather/titan/common/deliver/TitanServerConnector.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.deliver; diff --git a/common/src/main/java/net/onelitefeather/titan/common/event/EntityDismountEvent.java b/common/src/main/java/net/onelitefeather/titan/common/event/EntityDismountEvent.java index ca7dbbc3..5b0ca0e3 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/event/EntityDismountEvent.java +++ b/common/src/main/java/net/onelitefeather/titan/common/event/EntityDismountEvent.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.event; diff --git a/common/src/main/java/net/onelitefeather/titan/common/helper/BlockHandlerHelper.java b/common/src/main/java/net/onelitefeather/titan/common/helper/BlockHandlerHelper.java index e8905437..b5b71084 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/helper/BlockHandlerHelper.java +++ b/common/src/main/java/net/onelitefeather/titan/common/helper/BlockHandlerHelper.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.helper; diff --git a/common/src/main/java/net/onelitefeather/titan/common/helper/SitHelper.java b/common/src/main/java/net/onelitefeather/titan/common/helper/SitHelper.java index a1924c48..8f0986e1 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/helper/SitHelper.java +++ b/common/src/main/java/net/onelitefeather/titan/common/helper/SitHelper.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.helper; diff --git a/common/src/main/java/net/onelitefeather/titan/common/map/LobbyMap.java b/common/src/main/java/net/onelitefeather/titan/common/map/LobbyMap.java index 0d0b7707..cb62d2d7 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/map/LobbyMap.java +++ b/common/src/main/java/net/onelitefeather/titan/common/map/LobbyMap.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.map; diff --git a/common/src/main/java/net/onelitefeather/titan/common/map/LobbyMapBuilder.java b/common/src/main/java/net/onelitefeather/titan/common/map/LobbyMapBuilder.java index 1ac91fb0..3f312b00 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/map/LobbyMapBuilder.java +++ b/common/src/main/java/net/onelitefeather/titan/common/map/LobbyMapBuilder.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.map; diff --git a/common/src/main/java/net/onelitefeather/titan/common/map/MapEntry.java b/common/src/main/java/net/onelitefeather/titan/common/map/MapEntry.java index 90c6b1c8..e8d00907 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/map/MapEntry.java +++ b/common/src/main/java/net/onelitefeather/titan/common/map/MapEntry.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.map; diff --git a/common/src/main/java/net/onelitefeather/titan/common/map/MapPool.java b/common/src/main/java/net/onelitefeather/titan/common/map/MapPool.java index e03ff3d8..9f3f7668 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/map/MapPool.java +++ b/common/src/main/java/net/onelitefeather/titan/common/map/MapPool.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.map; diff --git a/common/src/main/java/net/onelitefeather/titan/common/map/MapProvider.java b/common/src/main/java/net/onelitefeather/titan/common/map/MapProvider.java index 6d8f8251..55eb6eca 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/map/MapProvider.java +++ b/common/src/main/java/net/onelitefeather/titan/common/map/MapProvider.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.map; diff --git a/common/src/main/java/net/onelitefeather/titan/common/permission/TitanPermissionBridge.java b/common/src/main/java/net/onelitefeather/titan/common/permission/TitanPermissionBridge.java index 5af7378a..fa013330 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/permission/TitanPermissionBridge.java +++ b/common/src/main/java/net/onelitefeather/titan/common/permission/TitanPermissionBridge.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.permission; diff --git a/common/src/main/java/net/onelitefeather/titan/common/utils/Cancelable.java b/common/src/main/java/net/onelitefeather/titan/common/utils/Cancelable.java index 9758fe57..9131b5d0 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/utils/Cancelable.java +++ b/common/src/main/java/net/onelitefeather/titan/common/utils/Cancelable.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.utils; diff --git a/common/src/main/java/net/onelitefeather/titan/common/utils/CloudNetEnvironment.java b/common/src/main/java/net/onelitefeather/titan/common/utils/CloudNetEnvironment.java index cfc4110f..9d904518 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/utils/CloudNetEnvironment.java +++ b/common/src/main/java/net/onelitefeather/titan/common/utils/CloudNetEnvironment.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.utils; diff --git a/common/src/main/java/net/onelitefeather/titan/common/utils/Items.java b/common/src/main/java/net/onelitefeather/titan/common/utils/Items.java index 155f0ea8..927977a3 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/utils/Items.java +++ b/common/src/main/java/net/onelitefeather/titan/common/utils/Items.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.utils; diff --git a/common/src/main/java/net/onelitefeather/titan/common/utils/SingletonFeatureManagerProvider.java b/common/src/main/java/net/onelitefeather/titan/common/utils/SingletonFeatureManagerProvider.java index 00eafdad..8f508175 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/utils/SingletonFeatureManagerProvider.java +++ b/common/src/main/java/net/onelitefeather/titan/common/utils/SingletonFeatureManagerProvider.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.utils; diff --git a/common/src/main/java/net/onelitefeather/titan/common/utils/Tags.java b/common/src/main/java/net/onelitefeather/titan/common/utils/Tags.java index 8beeb4f2..320c7fb6 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/utils/Tags.java +++ b/common/src/main/java/net/onelitefeather/titan/common/utils/Tags.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.utils; diff --git a/common/src/main/java/net/onelitefeather/titan/common/utils/ThreadHelper.java b/common/src/main/java/net/onelitefeather/titan/common/utils/ThreadHelper.java index 007cf9eb..a360ae37 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/utils/ThreadHelper.java +++ b/common/src/main/java/net/onelitefeather/titan/common/utils/ThreadHelper.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.utils; diff --git a/common/src/main/java/net/onelitefeather/titan/common/utils/TitanFeatures.java b/common/src/main/java/net/onelitefeather/titan/common/utils/TitanFeatures.java index 48febd21..eb0c3772 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/utils/TitanFeatures.java +++ b/common/src/main/java/net/onelitefeather/titan/common/utils/TitanFeatures.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.utils; diff --git a/common/src/main/java/net/onelitefeather/titan/common/utils/component/TitanMiniMessageImpl.java b/common/src/main/java/net/onelitefeather/titan/common/utils/component/TitanMiniMessageImpl.java index e959764e..2878e948 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/utils/component/TitanMiniMessageImpl.java +++ b/common/src/main/java/net/onelitefeather/titan/common/utils/component/TitanMiniMessageImpl.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.utils.component; diff --git a/common/src/main/java/net/onelitefeather/titan/common/utils/tags/PosTagSerializer.java b/common/src/main/java/net/onelitefeather/titan/common/utils/tags/PosTagSerializer.java index 195f5c70..c2868434 100644 --- a/common/src/main/java/net/onelitefeather/titan/common/utils/tags/PosTagSerializer.java +++ b/common/src/main/java/net/onelitefeather/titan/common/utils/tags/PosTagSerializer.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.utils.tags; diff --git a/common/src/test/java/net/onelitefeather/titan/common/argument/ArgumentMaterialTypeIntegrationTest.java b/common/src/test/java/net/onelitefeather/titan/common/argument/ArgumentMaterialTypeIntegrationTest.java index 8976d5bb..8af9d519 100644 --- a/common/src/test/java/net/onelitefeather/titan/common/argument/ArgumentMaterialTypeIntegrationTest.java +++ b/common/src/test/java/net/onelitefeather/titan/common/argument/ArgumentMaterialTypeIntegrationTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.argument; diff --git a/common/src/test/java/net/onelitefeather/titan/common/argument/ArgumentMaterialTypeTest.java b/common/src/test/java/net/onelitefeather/titan/common/argument/ArgumentMaterialTypeTest.java index df00b268..96efb91d 100644 --- a/common/src/test/java/net/onelitefeather/titan/common/argument/ArgumentMaterialTypeTest.java +++ b/common/src/test/java/net/onelitefeather/titan/common/argument/ArgumentMaterialTypeTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.argument; diff --git a/common/src/test/java/net/onelitefeather/titan/common/config/AppConfigBuilderTest.java b/common/src/test/java/net/onelitefeather/titan/common/config/AppConfigBuilderTest.java index cd49eaeb..3e872f4f 100644 --- a/common/src/test/java/net/onelitefeather/titan/common/config/AppConfigBuilderTest.java +++ b/common/src/test/java/net/onelitefeather/titan/common/config/AppConfigBuilderTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.config; diff --git a/common/src/test/java/net/onelitefeather/titan/common/config/AppConfigImplTest.java b/common/src/test/java/net/onelitefeather/titan/common/config/AppConfigImplTest.java index 99dda266..2f27ef7d 100644 --- a/common/src/test/java/net/onelitefeather/titan/common/config/AppConfigImplTest.java +++ b/common/src/test/java/net/onelitefeather/titan/common/config/AppConfigImplTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.config; diff --git a/common/src/test/java/net/onelitefeather/titan/common/config/AppConfigIntegrationTest.java b/common/src/test/java/net/onelitefeather/titan/common/config/AppConfigIntegrationTest.java index c2283b4a..a1329cb6 100644 --- a/common/src/test/java/net/onelitefeather/titan/common/config/AppConfigIntegrationTest.java +++ b/common/src/test/java/net/onelitefeather/titan/common/config/AppConfigIntegrationTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.config; diff --git a/common/src/test/java/net/onelitefeather/titan/common/helper/SitHelperTest.java b/common/src/test/java/net/onelitefeather/titan/common/helper/SitHelperTest.java index d1b22d09..d7cc6f0d 100644 --- a/common/src/test/java/net/onelitefeather/titan/common/helper/SitHelperTest.java +++ b/common/src/test/java/net/onelitefeather/titan/common/helper/SitHelperTest.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.common.helper; diff --git a/docs/event-modi-plan.md b/docs/event-modi-plan.md new file mode 100644 index 00000000..f4ec7bb7 --- /dev/null +++ b/docs/event-modi-plan.md @@ -0,0 +1,714 @@ +# Event-Modi für Titan — Recherche und Plan + +**Stand:** 2026-08-21 +**Betrifft:** Titan (Lobby), perspektivisch alle OLF-Minestom-Projekte +**Baut auf:** `docs/olf-minestom-project-standard.md` (Extension-Modell, Abschnitt 5) + +--- + +## 0. Der Befund, der alles andere steuert + +Bevor es um Architektur geht: **Eine umdekorierte Lobby bewegt keine Spielerzahlen.** + +Das ist keine Meinung. Deep Rock Galactic betreibt beides — kosmetische +Saison-Events *und* inhaltliche Seasons — im selben Spiel, mit derselben +Spielerschaft. Die Zahlen (SteamCharts, von mir stichprobenartig direkt am +Primärwert geprüft): + +| Deep Rock Galactic | Veränderung ggü. Vormonat | +|---|---| +| Oktober 2022 (kosmetisches Event) | **−0,37 %** | +| Oktober 2023 (kosmetisches Event) | **−12,16 %** | +| Oktober 2024 (kosmetisches Event) | **−4,92 %** | +| November 2022 (Season 03, Inhalt) | **+154,37 %** | +| März 2023 (Season 04, Inhalt) | **+58,79 %** | +| Juni 2024 (Season 05, Inhalt) | **+141,50 %** | + +Dead by Daylight liefert dasselbe Bild als zweites, unabhängiges +Within-Game-Experiment: Halloween-Oktober über zehn Jahre im Median **+1 bis ++3 %**; der Juni mit Jahrestag *und* neuem Kapitel dagegen sechsmal in Folge nie +unter **+20 %**, teils +53 %. Destiny 2 ist in fünf von sechs Oktobern sogar +**negativ** — die eine Ausnahme war der Monat, in dem bezahlter Inhalt erschien. + +**Zwei Zusatzbefunde, die genauso wichtig sind:** + +- **Nachhaltigkeit.** Vom Zugewinn eines Spitzenmonats sind nach einem Monat + 40–55 % weg, nach drei Monaten rund 80 %. Bei kosmetischen Events bleibt am + Ende ≈ 0 %, teils unterschreitet es die Ausgangslage (Destiny 2 lag im Dezember + 2024 17 % *unter* dem Wert vor dem Oktober-Event). Bei Inhalt bleibt ein Boden + von 20–35 % über der alten Baseline — sechs Monate und länger. +- **Kalender-Saisonalität ist genauso groß wie ein Deko-Event.** Der September + ist in fünf voneinander unabhängigen Spielen verlässlich der Jahrestiefpunkt + (−15 bis −20 %), Dezember/Januar der Hochpunkt. Ein Dezember-Effekt muss diese + Grundlinie erst schlagen, bevor man ihn dem Event gutschreibt. + +### Was daraus folgt — und was nicht + +**Nicht:** „Lasst die Winter-Lobby sein." Deko ist Markenpflege, und die hat +ihren eigenen Wert: ein Server, der sichtbar gepflegt wird, wirkt lebendig. + +**Sondern:** Der Aufwand für die Deko muss **klein und wiederholbar** sein. Jede +Personenstunde, die in ein einmaliges Winter-Setup fließt, fehlt beim Inhalt — +und nur Inhalt hebt den Boden. Der ganze folgende Plan ist darauf ausgelegt, die +Deko-Seite auf Stunden statt Wochen zu drücken und die frei werdende Zeit in +Spielbares zu lenken. + +> **Belegqualität.** Die Steam-Zahlen sind gemessene Telemetrie und für +> Within-Game-Vergleiche sauber. Für Minecraft-Server existieren **keine** +> vergleichbaren öffentlichen Daten — Hypixel-Zahlen kursieren nur als +> Community-Behauptungen ohne Primärquelle, und `minecraft-stats.com` ist eine +> kaputte Vorlagenseite, die unausgefüllte Platzhalter ausliefert. Ebenso gibt es +> **keine** peer-reviewte Literatur, die den Effekt saisonaler Events auf +> Spielerbindung misst. Die Übertragung auf Titan ist begründet, aber sie ist +> eine Übertragung. + +--- + +## 1. Ist-Zustand: Titan hat bereits ein Event-System + +Es ist nur weder benannt noch abgesichert. + +| Baustein | Zustand | +|---|---| +| Welt-Auswahl | `System.getProperty("TITAN_LOBBY_MAP", "world")` in `MapPool` | +| `halloween` | bereits verdrahtet — als Default im `setup`-Modul | +| Feature-Flags | Togglz, `TitanFeatures` mit 5 Navigator-Konstanten | +| Flag-Reload | funktioniert: `FileBasedStateRepository(File)` delegiert mit 1000 ms | +| Resource Packs | ungenutzt; Aves liefert `ResourcePackHandler` + `ResourcePackCondition` | +| Items | `Items`, statisch und hart verdrahtet | +| Navigator-Layout | im Code (`NavigationHelper`) | +| `app.json` | flach, ohne Saison-Bezug | + +Der heutige Mechanismus ist also: **eine Welt pro Saison, Auswahl beim Start per +JVM-Argument.** Kein Zeitplan, kein automatischer Wechsel, kein Fallback. + +### Das ist kein Provisorium — es ist der Branchenstandard + +Wichtig für die Planung: Der naheliegende Wunsch „eine Welt mit saisonalen +Overlays statt mehrerer Welten" ist technisch **nicht umsetzbar**, und zwar aus +zwei unabhängigen Gründen: + +- In Minestom teilen sich `SharedInstance`s die Chunks ihres Parent-Containers. + Zwei SharedInstances können **nicht** unterschiedliche Blöcke zeigen. +- Resource-Pack-`overlays` werden ausschließlich über das *Pack-Format des + Clients* ausgewählt. Es gibt kein Feld, kein Paket und keine Option, mit der + ein Server ein Overlay aktiviert. + +Entsprechend arbeiten alle nachprüfbaren Netzwerke mit getrennten Welten. +CubeCraft baut pro Saison einen neuen Hub und recycelt ihn über Jahre; Hypixel +reskinnt **sieben** Lobbys pro Event. Titans Ansatz ist damit richtig — er braucht +nur einen Zeitplan, einen Fallback und einen Rollout-Weg. + +### Der Fehler, der beim ersten echten Event zuschlägt + +```java +private void peekMap() { + Check.argCondition(this.referenceList.isEmpty(), "The map list is empty"); + if (this.referenceList.size() == 1) { + this.selectedMap = this.referenceList.getFirst(); // Property ignoriert + return; + } + this.selectedMap = ...filter(...).findFirst().orElseThrow(); // ohne Meldung +} +``` + +Zwei Verhaltensweisen, die zusammen eine Falle bilden: + +1. **Bei genau einer Welt wird die Property stillschweigend ignoriert.** Lokal + fällt ein Tippfehler in `TITAN_LOBBY_MAP` deshalb nie auf. +2. **Bei mehreren Welten wirft `orElseThrow()` ohne Meldung.** Der Server startet + nicht, und im Log steht eine `NoSuchElementException` ohne den Namen der + gesuchten Welt. + +Genau das Szenario „Winter-Welt nicht mitdeployt" endet damit in einem +Startabbruch, dessen Ursache man erst suchen muss. **Das ist Aufgabe 1 des +Plans**, unabhängig von allem anderen. + +--- + +## 2. Leitentscheidung der Architektur + +**Saisonaler Content ist bei euch ein Deployment-Problem, kein Feature-Flag-Problem.** + +Feature-Flags existieren, weil Deployment teuer ist. Bei euch ist es das nicht: +CloudNet-Services sind kurzlebig und neustartbar, und das Zielbild aus dem +OLF-Standard lädt Fachlogik ohnehin als Extension-Jars. Damit fällt die +Hauptbegründung für Flags als Content-Träger weg. + +Ein Halloween-Event ist außerdem nicht *ein* Feature, sondern zwölf: Deko, +Mob-Skins, Sounds, Scoreboard-Titel, Navigator-Icons, Drops. Wer das flaggt, hat +nach drei Jahren keine 15, sondern 150 Konstanten in `TitanFeatures` — und +N boolesche Flags ergeben 2^N Konfigurationen, von denen nie jemand mehr als drei +testet. + +### Die Aufteilung + +| Werkzeug | Wofür | Nicht wofür | +|---|---|---| +| **Season-Pack** (Extension-Jar) | alles Saisonale: Code, Listener, Deko-Logik | Werte, die sich pro Saison nur ändern | +| **Season-Daten** (JSON im Pack) | Zeitfenster, Items, Texte, Positionen, Loot | Kontrollfluss | +| **Togglz** | **ein** Flag pro Saison: Zeitfenster-Gate + Notausschalter | ein Flag pro Sub-Feature | + +**Die Grenze zwischen Daten und Code:** Braucht es einen neuen *Wert* oder ein +neues *Verb*? „Der Kürbis ist orange" ist ein Wert → JSON. „Kürbisse explodieren, +wenn jemand drübergeht" ist ein Verb → Code. + +Sobald das JSON `if`, `when` oder `onTick` bekommt, habt ihr eine schlechte +Programmiersprache gebaut — ohne Typprüfung, ohne Debugger, ohne Stacktrace. Das +gilt ausdrücklich auch für Togglz' `ScriptEngineActivationStrategy`: die Bedingung +wird unprüfbar, *und* Nashorn ist seit JDK 15 nicht mehr im JDK. + +**Der Java-25-Ausweg — Daten, aber typisiert:** + +```java +public sealed interface SeasonEffect + permits ReplaceItem, PrefixTitle, PlaceDecoration, AmbientSound { } + +public record ReplaceItem(NavigatorSlot slot, Material material, String nameKey) + implements SeasonEffect { } +``` + +Jackson deserialisiert polymorph, ein `switch` über die versiegelte Hierarchie ist +erschöpfend. Ein neuer Effekt-Typ, den niemand behandelt, bricht den **Compile**, +nicht die Produktion. + +### Zeitfenster: was Togglz nicht kann + +`ReleaseDateActivationStrategy` hat exakt zwei Parameter, `PARAM_DATE` und +`PARAM_TIME` — **kein Enddatum, keine Zeitzone** (im Jar per `javap` geprüft). +Für „16.10. bis 08.11." ist sie unbrauchbar. + +Der Ersatz ist klein: `ActivationStrategy` hat vier Methoden. Eine eigene +`SeasonWindowActivationStrategy` mit `from`, `to`, `zone`, registriert über +`META-INF/services`, ersetzt jedes handgeschriebene `if (LocalDate.now()...)` im +Projekt. Rund 60 Zeilen. + +**Zeitzone einmal festlegen:** `Europe/Berlin` ist die Redaktionszeitzone. +Fenster als `2026-10-16T00:00` + `zone`, beim Laden **einmal** zu `Instant` +auflösen, danach nur noch `Instant` vergleichen. Nie `LocalDateTime.now()`, nie +`ZoneOffset` speichern (`+02:00` ist im November falsch). + +**`Clock` injizieren** statt `Instant.now()` in der Fläche. Das erledigt drei +Dinge auf einmal: deterministische Tests ohne DST-Zufall, lokale Vorschau per +`-Dtitan.clock.offset=P45D`, und keine Tests, die im März grün und im November rot +sind. + +### Vorschau ohne Flag-Umlegen + +Das naheliegende „Flag kurz anschalten, gucken, ausschalten" ist für alle Spieler +sichtbar und hinterlässt Drift zwischen den Nodes. Stattdessen eine Preview-Ebene +im Gate, in dieser Reihenfolge: + +```java +boolean active(SeasonId id, Player p) { + if (killSwitch.isActive(id)) return false; // Ops, höchste Priorität + if (p.hasPermission("titan.season.preview")) return true; // Team sieht es vorab + return window(id).contains(clock.instant()); // Zeitfenster +} +``` + +Der Preview-Zweig läuft über LuckPerms, das ihr schon habt — kein zweites +Berechtigungssystem. + +--- + +## 3. Termine 2026 + +Aus ~25 Datenpunkten der Event-Historie von Dead by Daylight, Team Fortress 2, +Destiny 2 und Overwatch: + +- **Modalwert der Laufzeit: exakt 21 Tage.** Spanne 11–28, praktisch nichts über + vier Wochen. Der Trend geht zu kürzer. +- **Halloween beginnt 2–3 Wochen vor dem 31.10. und endet zwischen dem 1. und + 7. November. Kein einziges Event endet am 31.10.** Der Zahltag liegt mitten + drin, nie am Rand. +- **Winter beginnt 1–2,5 Wochen vor dem 25.12. und endet in der ersten + Januarwoche.** Alle überspannen Weihnachten *und* Neujahr. + +Dazu die deutschen Schulferien 2026 (KMK/schulferien.org) — für ein +deutschsprachiges Netzwerk der wichtigere Faktor: + +- **Herbstferien streuen über einen ganzen Monat: 05.10.–06.11.** Die maximale + Überlappung liegt bei **19.–24.10. mit 11 von 16 Ländern**. An Halloween selbst + sind nur noch etwa drei Länder frei, und **Bayern hat erst 02.–06.11. Ferien**. + Es gibt **keinen einzigen bundesweit gemeinsamen Herbstferientag.** +- **Weihnachten dagegen: 23.12.–01.01. sind alle 16 Länder gleichzeitig frei.** + +| | Halloween 2026 | Winter 2026/27 | +|---|---|---| +| **Live ab** | Freitag, **16.10.** | Dienstag, **01.12.** | +| **Ende** | Sonntag, **08.11.** | Mittwoch, **06.01.** | +| Laufzeit | ~3,5 Wochen | Deko 5 Wochen, Kernprogramm ~3 | +| Warum | trifft das 11-Länder-Fenster 19.–24.10., Ende nimmt Bayern mit | einziges bundesweites Fenster | + +**Wenn die Zeit nur für ein gutes Event reicht: Winter.** Es ist das einzige mit +einem bundesweiten Ferienfenster. + +--- + +## 3a. Die Terminfalle, die zwei Netzwerke zweimal getroffen hat + +**Plattform-Migrationen fressen Saison-Events.** CubeCraft hat das zweimal in +Folge öffentlich dokumentiert. Der Project Lead zu Halloween 2022: + +> „Because we're updating our networks to 1.19, all of our resources are focused +> on getting that out soon, so this Halloween event is a little simplified." + +Und im Frühjahr 2023 dasselbe noch einmal — das Event kam im Mai statt im März, +weil das Entwicklerteam vollständig in einer Bedrock-Migration steckte. Halloween +war dort die einzige Ausnahme von einem viermonatigen Netzwerk-Freeze. + +**Für Titan ist das unmittelbar relevant:** Der OLF-Standard sieht in Phase 4 und 5 +eine Bootstrap-Extraktion und die Umstellung auf Extension-Jars vor — inklusive +Wechsel des Extension-Frameworks. Fällt diese Umstellung in den Oktober oder +November, ist das Event entweder abgespeckt oder verschoben. + +**Konsequenz für die Reihenfolge:** Entweder die Extension-Migration ist **vor +Anfang Oktober** abgeschlossen, oder Schritt 3 dieses Plans (Season-Pack als +Extension) wird für 2026 **übersprungen** — dann gibt es die Winter-Lobby als +reinen Weltentausch über `TITAN_LOBBY_MAP`, so wie heute, und das Pack-Modell +kommt 2027. Beides ist vertretbar. Beides gleichzeitig im Oktober ist es nicht. + +--- + +## 4. Umsetzung in vier Schritten + +Jeder Schritt ist für sich nutzbar und einzeln mergebar. + +### Schritt 1 — Die Falle entschärfen (halber Tag) + +Vor allem anderen, weil es das Deployment jedes künftigen Events betrifft. + +- `MapPool.peekMap()`: bei fehlender Zielwelt eine Meldung werfen, die den + gesuchten Namen und die gefundenen Welten nennt. +- Den Sonderfall „genau eine Welt" abschaffen — die Property gilt immer, oder sie + gilt nie. Ein stiller Sonderfall, der lokal anders wirkt als in Produktion, ist + schlimmer als ein harter Fehler. +- **Fallback statt Absturz:** Ist die Event-Welt nicht da, mit `world` starten und + eine Warnung loggen. Ein Server, der ohne Deko läuft, ist besser als einer, der + nicht startet. + +**Fertig, wenn:** ein falsch gesetztes `TITAN_LOBBY_MAP` den Server startet, eine +verständliche Warnung schreibt und die Standardwelt lädt. + +### Schritt 2 — Zeitfenster und Gate (1–2 Tage) + +- `SeasonWindowActivationStrategy` (`from`, `to`, `zone`) schreiben und über + `META-INF/services` registrieren. +- `SeasonGate` als einzige Fassade vor Togglz, in der Reihenfolge + Kill-Switch → Preview-Permission → Zeitfenster. **Kein anderer Code ruft + `FeatureContext` direkt.** +- `Clock` in den Composition Root. +- Ein Command `/season` für Status und Notausschalter — die Togglz-Admin-Konsole + ist Servlet-basiert und im Minestom-Prozess nicht nutzbar. + +**Fertig, wenn:** ein Zeitfenster in der Konfiguration steht, das Team es per +Permission vorab sieht, und der Wechsel ohne Neustart passiert. + +### Schritt 3 — Erstes Season-Pack (Winter zuerst) + +Als eigenes Extension-Modul nach OLF-L5-01/L5-03: `extension.json` generiert, +alles vom Host Gelieferte `compileOnly`. + +- Contract `SeasonalContent` ins `:api`-Modul: `id()`, `window()`, `activate()`, + **`deactivate()`**. +- Registrierung über die `ServiceRegistry` des Extension-Frameworks, **nicht** über + `ServiceLoader` — der ist über Classloader-Grenzen fragil, genau das Problem, um + das die `ThreadHelper`-Krücke heute herumarbeitet. +- **`deactivate()` ist Pflicht, nicht optional.** Ohne symmetrisches Abräumen + bleiben Deko-Blöcke, Boss-Bars und Scheduler-Tasks nach Saisonende stehen, und + niemand findet die Ursache — das Pack ist ja „aus". +- Saisonale Optik als **Decorator** um bestehende Bausteine (`NavigationHelper` + bekommt andere Items und Namen), nicht als zweite Implementierung. Bei zwei + gleichzeitigen Packs entscheidet ein **Prioritätsfeld im Manifest**, nicht die + Ladereihenfolge. + +**Fertig, wenn:** der Host ohne Season-Pack sauber startet und das Pack sich durch +Löschen einer Zeile in `settings.gradle.kts` restlos entfernen lässt. Geht das +nicht, ist ein `if` in den Kern gewandert. + +### Schritt 3b — Rollout: CloudNet kann das schon + +Für den Saisonwechsel ist **kein eigener Code nötig**. CloudNet bringt alles mit: + +| Mechanismus | Wofür | +|---|---| +| Templates werden beim Service-Start kopiert | neues Template auf den Lobby-Task → jeder neu startende Service ist winterlich | +| Smart-Modul (`autoStopTimeByUnusedServiceInSeconds`, `minNonFullServices`) | alte Lobbys laufen leer und beenden sich → **Drain-Rollout statt Big Bang** | +| `templateInstaller: INSTALL_RANDOM_ONCE` | eingebaute Map-Rotation; funktioniert genauso für „30 % Wintervariante" | +| `includes` (Download beim Prepare) | Saisonwelt aus Object Storage ziehen statt ins Template committen | +| `maintenance: true` auf einem Canary-Task | Staged Rollout: erst Staff, dann alle | + +**Eine harte Grenze:** Das Deployment saisonaler Inhalte darf **niemals** einen +Neustart der Komponente erfordern, die Joins, Queueing oder Lobby-Transfers +abwickelt. Hypixels Dev-Blog beschreibt genau diesen Fehler: Ihr Monolith brauchte +60–80 Sekunden Boot, in denen niemand joinen, die Lobby wechseln oder Befehle +nutzen konnte — laut eigener Aussage *„the cause of nearly every network drop over +the past year"*. Saisonales gehört in einen Leaf-Service, nie in Node oder Bridge. + +**Und: keine Lockstep-Migration erzwingen.** Alte und neue Lobby-Version müssen +während des Rollouts koexistieren können. Hypixel musste 2017 sichtbar unfertige +Lobbys ausrollen, weil ihr Backend-Wechsel alle Lobbys gleichzeitig verlangte — +mit dem eingestandenen Ergebnis „some lesser quality lobbies". + +### Schritt 3c — Das Event-Ende ist der teuerste Moment + +Das am häufigsten unterschätzte Detail. Hypixels Events-Team über den +Spooky-Festival-Kollaps, öffentlich: + +> „It only ever breaks for a few minutes? I think that's to be expected for 10,000 +> players all warping to the hub." … „I don't know if there's any cheap solution +> to thousands of players all connecting to different servers." + +Ein Event, das für alle gleichzeitig endet, erzeugt einen synchronen +Massen-Transfer. **Sie haben das nie gelöst.** Bei eurer Größenordnung ist das +beherrschbar, aber nur wenn man es einplant: Ende staffeln, oder die Event-Lobby +nach Eventende weiterlaufen lassen und nur den Zustrom umlenken. + +**Ergänzend, das Belohnungs-Ende:** Nicht ausgegebene Event-Währung nach +Fristende **automatisch** in reguläre Währung umwandeln (Overwatch-2-Muster, +Abschnitt 6) — keine Abholfrist, keine Verfallsregel. MultiVersus gab nach +Eventende nur zwei Tage zum Einlösen bereits verdienter Belohnungen; das ist die +Sorte Detail, die Support-Tickets erzeugt. + +### Schritt 3d — Wenn ein Event wiederkommt: Smoketest + +Hypixel, Holidays 2025, aus dem Forum: + +> „It looks like a bug from last year is back, where Santa Says wins don't count +> towards your /myposition or the wins leaderboard." + +Kein Staff-Reply. **Code, der elf Monate dunkel liegt, wird von nichts getestet** — +er kompiliert, aber niemand führt ihn aus. Zum Reaktivieren einer Saison gehört +deshalb ein Durchlauf der Kernpfade, bevor das Event live geht. Das ist genau der +Grund für die `deactivate()`-Pflicht und den Time-Bomb-Test aus Abschnitt 5. + +### Schritt 4 — Messung (ein Nachmittag) + +Ohne das ist nach dem Event nichts aussagbar. + +**Wichtig vorweg:** *Plan (Player Analytics)* listet Minestom nicht und ist +unbrauchbar; *bStats* misst Plugin-Verbreitung für Autoren, nicht Serverbetrieb. +Beides scheidet aus. Ihr braucht ein eigenes Join-Log — und habt die +Einstiegspunkte mit `PlayerSpawnListener` und `PlayerConfigurationListener` +bereits. + +Eine Zeile `timestamp;uuid` pro Join. Daraus fallen mit `sort`/`uniq` heraus: + +| Kennzahl | Aussage | +|---|---| +| **Reaktivierte Spieler** — UUIDs im Event, die 30 Tage davor nicht da waren | der eigentliche Zweck eines Events | +| **Post-Event-Retention** — von den Neuzugängen nach 14 und 28 Tagen noch da | ob etwas hängen bleibt | +| Unique Spieler pro Tag | Grundlinie | +| Neue Spieler (erstmals gesehen) | Wachstum | + +Zwei Disziplinen, ohne die die Zahlen wertlos sind: + +- **Baseline 14 Tage vor dem Event erheben**, auf Wochentage ausgerichtet. +- **Personenstunden mitzählen.** „Hat sich gelohnt" ist ein Bruch; ohne Nenner + habt ihr nur den Zähler. + +**Falls Prometheus:** keine Pro-Spieler-Metriken — das erzeugt eine Zeitreihe je +gesehenem Spieler und ist eine Kardinalitätsbombe. Uniques gehören in eine +Tabelle. *(Der Grafana-MCP-Zugang dieser Session war defekt — `mcp-grafana` nicht +im PATH. Falls die Auswertung dort landen soll, muss das repariert werden.)* + +**Confounder, der ins Auswertungsdokument gehört:** Weil die Herbstferien 2026 +über den 05.10.–06.11. streuen und das Event mitten drin liegt, lässt sich der +Event-Effekt im ersten Jahr **nicht** vom Ferieneffekt trennen. Erst der +Jahresvergleich ab 2027 hilft. + +--- + +## 4a. Der eigentliche Engpass: der Weg vom Build in den Server + +Der Engpass ist erfahrungsgemäß **nicht das Bauen, sondern die Integration.** Der +einzige direkte Beleg dazu stammt von einem Hypixel-Builder: seine abgenommene Map +*„wasn't added to the game until I fully joined the build team months later"* — +Build fertig, Auslieferung wartete auf Entwicklerkapazität. Wynncraft nennt +Bewerbern drei Monate Review-Latenz. + +**Handoff-Format: Anvil-Weltordner, nicht Schematic.** Schematics verlieren zu +viel: `.schem` speichert kein Licht und keine Heightmaps, und **Entities sind auf +beiden Seiten opt-in** (`//copy -e` *und* `//paste -e`). Vergisst ein Builder das, +fehlen Item Frames, Paintings, Armor Stands und Display Entities vollständig. +`.litematic` ist client-only und wird serverseitig von nichts gelesen. + +**Metadaten neben die Welt.** Das einzige gut dokumentierte Schema kommt von +BlueDragonMC, einem quelloffenen Minestom-Netzwerk: eine `config.yml` **im +Weltordner neben `region/`**, alles unter `world:` genamespaced, mit `name`, +`description`, `author`, `spawnpoints`, `additionalLocations`. Direkt übernehmbar. +Für alles, was in situ gesetzt werden muss, ist euer Guira-Setup-Flow der richtige +Weg — er schreibt das JSON, statt dass jemand Koordinaten abtippt. + +**Entschieden: Falco statt Polar.** Eine frühere Fassung dieses Dokuments empfahl +einen Wechsel auf das Polar-Format. Diese Empfehlung ist **hinfällig** — Titan +setzt auf die eigene Engine **Falco** (`falco-anvil`, `falco-light`), die das +Anvil-Format behält. + +Das ist die bessere Entscheidung, und zwar aus einem Grund, der im +Polar-Vergleich untergegangen wäre: Polar speichert **keine Entities**, was NPCs, +Item Frames und Display Entities aus der Welt in Konfiguration verschoben hätte. +Falco liest weiter Anvil und braucht diesen Umbau nicht. Dazu kommt, dass ein +Lesefehler bei Falco eine Ausnahme wirft, statt den Chunk als „nicht vorhanden" +zu melden — bei einer gebauten Lobby ist genau das der Unterschied zwischen einem +Fehler und einem stillschweigend neu generierten, leeren Stück Welt. + +Anforderungen und Abnahmekriterien dazu stehen in +[`spec-lobby-saison-events.md`](spec-lobby-saison-events.md), Stufe 1. + +**Zu klären bleibt die Lizenzfrage:** Falco steht unter AGPL-3.0 ohne +Linking-Ausnahme, Titan veröffentlicht unter Apache-2.0. Siehe Spec, Abschnitt 7. + +## 4b. Resource Packs, falls saisonal gewünscht + +Aves liefert `ResourcePackHandler` und `ResourcePackCondition`, Titan nutzt beides +nicht. Falls saisonale Optik über Packs laufen soll, ist das Modell seit 1.20.3: +**großes Base-Pack mit stabiler UUID + kleines Season-Delta mit eigener UUID.** +`resource_pack_pop` entfernt gezielt eine UUID, ohne die anderen anzufassen — der +große Base-Pack bleibt im Client-Cache. + +Vier Fallen, alle im Minestom-Quelltext bzw. Protokoll belegt: + +1. **Nie `replace(true)`** für den Saisonwechsel. Minestom implementiert das als + Pop-all-plus-Push — nicht atomar, der Client lädt zweimal. +2. **`ConnectionManager.doConfiguration()` macht `packFuture.join()` ohne + Timeout.** Ein Client, der nie antwortet, parkt seinen Config-Thread unbegrenzt. + Eigenen Timeout einbauen. +3. **CustomModelData merged nicht.** Ein Season-Pack, das ein Item anfasst, das + das Base-Pack schon customized, ersetzt dessen Datei ganz — alle Basis-Varianten + verschwinden still. Item-IDs zwischen Base und Season **disjunkt** halten. + (Atlanten und Sprachdateien mergen dagegen problemlos.) +4. **Geyser lügt.** Bedrock-Spieler melden über Geyser `SUCCESSFULLY_LOADED`, ohne + je etwas erhalten zu haben. Am Pack-Status ist das nicht erkennbar — explizit + auf Bedrock prüfen. + +Der Client cached außerdem **nach URL, nicht nach Hash** — also +inhaltsadressierte Dateinamen (`pack-.zip`) verwenden und SHA-1 immer +mitsenden. + +## 5. Damit es im dritten Jahr nicht kippt + +Der eigentliche Vorteil von Packs gegenüber Flags: Aufräumen ist ein +`settings.gradle.kts`-Diff statt eines Refactorings. + +1. **Jahreszahl im Namen ist Pflicht** — `season-halloween-2026`, nie `halloween`. + Erzwingt die bewusste Entscheidung „wiederverwenden oder neu bauen?" statt + stillem Verhaltensdrift. +2. **`until` im Manifest ist Pflichtfeld.** Kein Pack ohne Enddatum. +3. **Time-Bomb-Test:** ein JUnit-Test, der fehlschlägt, wenn ein registriertes Pack + sein `until` + 12 Monate überschritten hat. Passt in dieselbe ArchUnit-Schicht, + die der OLF-Standard ohnehin vorsieht. +4. **Obergrenze auf `TitanFeatures`** — heute 5 Konstanten, Limit bei 12, CI bricht + darüber. Zwingt zu „welches alte Flag räume ich weg, damit ich das neue anlegen + darf". +5. **Archivieren statt löschen:** Pack nach `seasons/archive/` und aus + `settings.gradle.kts`. Nächstes Jahr wieder aufnehmbar, aber solange nicht + kompiliert, nicht getestet, nicht mitmigriert. Tragekosten null. + +--- + +## 6. Kommunikation + +**Discord ist Hub, nicht Reichweite.** Die JIM-Studie 2025 (n = 1.200, +repräsentativ, 12–19 Jahre) misst Discord bei **20 % regelmäßiger Nutzung** — +32 % der Jungen, aber nur **7 % der Mädchen**. Zum Vergleich: Snapchat 56 %, +TikTok 53 %, Twitch 11 %. + +Der ermutigende Teil derselben Studie: **Minecraft ist Lieblingsspiel Nr. 1**, mit +rund 25 % bei *offener* Frage ohne Antwortvorgaben — „in allen Befragungsgruppen +an erster Stelle", unabhängig von Alter, Geschlecht und Schulform. Die Zielgruppe +ist da; sie ist nur nicht auf Discord. + +Reichweite kommt aus **Serverlisten** (serverliste.net führt mit Abstand das +höchste Volumen) und aus kurzen Clips. **X/Twitter lohnt nicht** — 0,12 % +Engagement gegen 3,73 % bei TikTok. + +**Beteiligung realistisch ansetzen** (Nielsens 90-9-1): Ein Build-Contest liegt im +1-%-Tier — bei 200 Aktiven sind das 2–10 Einreichungen. Screenshot-Aktionen und +Abstimmungen liegen im 9-%-Tier, also 20–60. Wer mit 50 Build-Einreichungen +plant, plant falsch. + +### Zwei Fehlerbilder, die ihr umgehen könnt + +**Halo Infinite, „Winter Contingency" 2021:** zehn Belohnungsstufen, **eine pro +Tag**, über 14 Tage zwischen Weihnachten und Neujahr. Wer alles wollte, musste an +10 von 14 Feiertagen spielen. Schlimmer: Teilnahme brachte keine kleineren +Belohnungen, sondern **kaputte** — ein Schulterpolster ohne Gegenstück. + +Ein klassischer 24-Türchen-Adventskalender ist strukturell derselbe Mechanismus. +Drei Änderungen machen ihn sicher: + +1. **Kumulativ statt tagesgebunden** — 15 von 24 Tagen da gewesen = 15 Türchen, + nachholbar. +2. **Teilbelohnungen müssen für sich funktionieren.** +3. **Beim Start sagen, ob es das nächstes Jahr wieder gibt.** + +**Overwatch 2, Winter Wonderland 2023** — das Muster fürs Eventende, direkt +kopierbar: nicht ausgegebene Event-Währung wurde nach Fristende **automatisch in +reguläre Währung umgewandelt**, vorab im Ankündigungsposten angekündigt. Kein +Löschen, keine Verfallsfrist, keine Abholpflicht. + +--- + +## 7. Was ausdrücklich nicht getan werden sollte + +1. **Ein Flag pro saisonalem Sub-Feature.** Ein Flag pro *Saison*. Die Sub-Features + leben und sterben gemeinsam. +2. **`if (HALLOWEEN.isActive())` verstreut im Kerncode.** Die Entscheidung fällt + einmal im Composition Root; danach wird ein Objekt injiziert, kein Boolean + geprüft. +3. **Vererbung für Saison-Varianten** (`HalloweenLobby extends Lobby`). + Funktioniert für die erste Saison, kollabiert bei zwei gleichzeitigen. +4. **Ein fettes `Theme`-Interface** mit Farben, Items, Sounds, Mobs und Nachrichten. + Jedes neue Event zwingt alle alten Themes zu einer neuen Methode. Stattdessen + kleine, unabhängig registrierbare Beiträge. +5. **Content-Pack ohne `deactivate()`.** +6. **Pack, das ein anderes Pack direkt referenziert.** Verstößt gegen OLF-L2-01, + funktioniert im Test, bricht im Deployment. +7. **Pack bündelt, was der Host liefert** (Minestom, `:common`, Togglz-Core). + Zwei Kopien in zwei Classloadern → `NoSuchMethodError`, teuer zu finden. +8. **Wochenlanges Deko-Bauen.** Siehe Abschnitt 0 — der Hebel liegt beim Inhalt. +9. **Ein Einmal-Spektakel als erstes Event.** Höchste Kosten, kürzeste Wirkung — + die Kategorie, an der Epic das Format eingestellt hat (7b). +10. **Mit hoher Frequenz starten.** Sie lässt sich nicht mehr senken (7b). +11. **Weiter als drei Monate durchplanen.** Überlebt den Kontakt mit der Realität + nicht (7b). +12. **Am Vortag fertig werden.** Liveops gehört Wochen vorher fertig und durch + einen Test — Winter heißt Mitte November, nicht 30.11. + +--- + +## 7a. Ein Saison-Primitiv statt jährlich neuer Mechaniken + +**Das ist die Antwort auf „wie schiebe ich am schnellsten weitere Funktionen +nach".** Und sie ist ungewöhnlich gut belegt. + +Die schärfste Formulierung stammt von InnoGames über ihr Saison-Event „Forge of +Vulcan" in der sechsten Iteration: + +> „The team doesn't rebuild it every quarter… **The event currency and 21-day +> runtime have been constant throughout — the stability and habit players need, +> leaving everything else open to change.**" + +Und im selben Bericht: Vergleicht man die erste Fassung mit der heutigen, findet +man *„very few similarities between them"*. + +**Daraus die Architekturregel: Währung, Laufzeit und Kalenderslot sind das +Produkt. Alles andere ist die Saison.** Genau diese drei Dinge gehören in +stabilen Code; alles darüber gehört in die austauschbaren Saison-Daten. + +Drei unabhängige Bestätigungen: + +- **Fortnite Winterfest** ist bis in die Werbetexte hinein derselbe Event: die + Lodge als fester Ort, 14 Geschenke pro Tag unverändert von 2019 bis 2023, der + Kamin-Loop identisch — und 2019 und 2021 wörtlich dieselbe Werbezeile. Neue + Inhalte kommen per Unvaulting alter Items, nicht durch Neubau. +- **Genshin Impact** hat Wiederverwendung sogar kategorisiert: eine Wiki-Kategorie + „Recurring Events" mit rund 65 Einträgen. Ley Line Overflow lief **21×**, + Marvelous Merchandise 9×, Windtrace 5× — letzteres 2025 als „Snowtrace" + umgeskinnt. Das Template bleibt, das Balancing wird versioniert. +- **Belka Games** (Clockmaker, neun Jahre alt), unverblümt: *„Don't be shy about + simply reusing successful old events. In just 2–3 months, your player base will + refresh significantly."* + +**Die Grenze** — Javier Barnes (ehemals Socialpoint/Tilting Point): Templates sind +der Schlüssel zu planbarem Aufwand, aber *„a single kind shouldn't run too often +with the same exact experience and rewards."* Gleiche Mechanik ja, gleiche +Belohnungen nein. + +CubeCraft macht in der Minecraft-Welt exakt dasselbe: seit Jahren dieselbe +Hub-Suche, nur umgethemt — 20 Kürbisse, 30 Trick-or-Treats, 20 Blumen, +Strandbälle, 20 Schneemann-Teile. Eine Mechanik, fünf Saisons. + +## 7b. Wie viele Events pro Jahr — und die Falle dahinter + +**Empfehlung: zwei große plus zwei kleine im ersten Jahr.** Das ist jetzt belegt +statt geschätzt: + +- **InnoGames** hat die Kehrtwende dokumentiert: *„I used to firmly believe that + you needed an event every day, but… synergy and rhythm are more important than + sheer coverage."* Heutige Zielgröße für große Beats: **drei bis vier pro Jahr**, + je 4–8 Wochen — mit einem Vollzeitteam. +- **Fortnite** fährt seit neun Jahren exakt **zwei** unstrittige Jahresanker: + Fortnitemares und Winterfest, lückenlos 2017–2025. +- **Genshin** hält seit 2020 exakt 42 Tage pro Version mit einem Flagship-Event + pro Version. + +Die einzige harte Zahl zu Teamgröße kommt von der GDC 2017: Space Ape fuhr +*wöchentliche* Events mit einem Vierer-Team — allerdings mit fertiger +Live-Ops-Tooling-Infrastruktur in einem 100-Personen-Studio. **Vier Leute schaffen +wöchentliche Events erst, nachdem das Tooling steht.** Genau deshalb steht in +diesem Plan das Tooling (Schritte 1–3) vor der Frequenz. + +### Drei Fallstricke, die teuer sind + +**Kadenz ist ein Einwegversprechen.** Epic stellte Fortnite-Updates von +wöchentlich auf zweiwöchentlich um, um Crunch zu lindern — *„But the situation did +not improve."* Aus zwölf Interviews bei Polygon: *„Crunch never ends in a live +service game like that."* Frequenz lässt sich leicht erhöhen und praktisch nicht +mehr senken, ohne dass es als Rückschritt gelesen wird. **Fangt niedrig an.** + +**Das Einmal-Spektakel tötet das Format.** Donald Mustard zur Einstellung der +Fortnite-Live-Events, gefragt nach dem Grund: *„It was resources."* Und: *„the +event team was starting to be needed to work on other stuff."* Der Kontrast ist +messbar — Galactus war **zehn Minuten Inhalt** mit rund sechs Monaten Vorlauf, +gegen 2–4 Wochen Laufzeit bei jedem wiederkehrenden Feiertagsevent. Für ein Team +eurer Größe ist das Einmal-Spektakel die teuerste denkbare Kategorie. + +**Drei Monate Planungshorizont, nicht mehr.** Grant Shonkwiler, ehemals +Fortnite-Producer bei Epic: *„a feature level schedule for the next 3 months. Why +3 months? Because I have found anything more than that is a waste of time, it +won't survive contact with players OR devs."* Ergänzend Barnes: *„Liveops should +be finished weeks before they go live, and should go through QA. The cost of being +late on a liveops or having bugs is huge."* + +Auf eure Termine übersetzt: Winter geht am 01.12. live, ist also **Mitte November +fertig** — nicht am 30.11. + +## 8. Offene Punkte + +1. **Lizenzfrage Falco ↔ Titan.** Falco ist AGPL-3.0 ohne Linking-Ausnahme, + Titan veröffentlicht unter Apache-2.0. Ein Minecraft-Server ist ein + Netzwerkdienst — genau der AGPL-§13-Fall. Zu entscheiden, **bevor** der + Falco-Umstieg beginnt. Siehe Spec, Abschnitt 7. +2. **Saisonale Resource Packs — ja oder nein?** Aves bringt die Bausteine mit. + Die Entscheidung betrifft auch den Umgang mit Spielern ohne Pack und mit + Bedrock-Spielern (siehe 4b) und gehört vor Schritt 3 getroffen. +3. **Wird `titan-api` publiziert?** Der `SeasonalContent`-Contract gehört ins + `:api`-Modul. Das trägt derzeit kein `maven-publish` (siehe + `olf-minestom-project-standard.md`, offener Punkt 3). +4. **Wann läuft die Extension-Migration?** Siehe Abschnitt 3a — die Antwort + entscheidet, ob Schritt 3 dieses Plans für 2026 stattfindet oder auf 2027 + verschoben wird. + +### Wo die Recherche nichts hergab + +Ehrlichkeitshalber, damit niemand diese Fragen für beantwortet hält: Kein Netzwerk +hat je CDN-Wahl, Packgrößen, Downloadzeiten oder Spieler-Abbruchquoten +veröffentlicht. Zu Mineplex-Postmortems und zur Technik von Hive und GommeHD gibt +es nichts Verifizierbares — die entsprechenden Seiten blockieren automatisierte +Abrufe. Und es existiert **kein** öffentliches Datenbankschema eines großen +Netzwerks; die Cosmetics-Empfehlungen stammen aus quelloffenen Plugins und einem +Minestom-Backend, nicht von einem Netzwerk eurer Zielgröße. + +--- + +## Quellen + +**Gemessene Telemetrie** (Monatswerte durchschnittlicher gleichzeitiger Spieler): +[Deep Rock Galactic](https://steamcharts.com/app/548430) · [Dead by Daylight](https://steamcharts.com/app/381210) · [Destiny 2](https://steamcharts.com/app/1085660) · [Team Fortress 2](https://steamcharts.com/app/440) · [Warframe](https://steamcharts.com/app/230410) · [Sea of Thieves](https://steamcharts.com/app/1172620) · [Rust](https://steamcharts.com/app/252490) + +**Zielgruppe:** [JIM-Studie 2025, mpfs](https://mpfs.de/studie/jim-studie-2025/) ([PDF](https://mpfs.de/app/uploads/2025/11/JIM_2025_PDF_barrierearm.pdf)) + +**Ferien:** [schulferien.org 2026/27](https://www.schulferien.org/deutschland/ferien/2026-2027/) · [KMK](https://www.kmk.org/service/ferien.html) + +**Fehlerbilder:** [Kotaku zu Halo Winter Contingency](https://kotaku.com/halo-infinite-s-winter-event-unfortunately-demands-a-bi-1848254025) · [Blizzard zu Winter Wonderland 2023](https://overwatch.blizzard.com/en-us/news/24033785/a-flurry-of-fun-returns-to-overwatch-2-winter-wonderland-begins-december-19/) + +**Beteiligung:** [Nielsen, 90-9-1](https://www.nngroup.com/articles/participation-inequality/) + +**Architektur:** [Martin Fowler, Feature Toggles](https://martinfowler.com/articles/feature-toggles.html) · [Togglz Activation Strategies](https://www.togglz.org/documentation/activation-strategies) · [Togglz State Repositories](https://www.togglz.org/documentation/repositories) + +**Verknappung (Kaufabsicht, nicht Bindung):** [Scarcity tactics in marketing, J. Retailing 2022](https://doi.org/10.1016/j.jretai.2022.06.003) · [Meta-analysis on product scarcity, Psych. & Marketing 2023](https://doi.org/10.1002/mar.21816) — letztere findet, dass **rein zeitliche** Verknappung der *schwächste* Hebel ist; soziale Sichtbarkeit wirkt stärker. + +**Im Code verifiziert:** `MapPool.peekMap()`, `TitanFeatures`, `SingletonFeatureManagerProvider`, sowie `togglz-core-4.6.2.jar` per `javap` (`ReleaseDateActivationStrategy` ohne End-/Zeitzonenparameter; `FileBasedStateRepository(File)` delegiert mit 1000 ms — der Reload funktioniert bereits). diff --git a/docs/olf-minestom-project-standard.md b/docs/olf-minestom-project-standard.md new file mode 100644 index 00000000..fbc1ca20 --- /dev/null +++ b/docs/olf-minestom-project-standard.md @@ -0,0 +1,1018 @@ +# OLF Minestom Project Standard + +**Status:** Vorschlag zur Review +**Datum:** 2026-08-20 +**Geltungsbereich:** Alle OneLiteFeather-Minestom-Projekte (Server, Extensions, Libraries) +**Erster Anwender:** Titan (Migrationsplan in Anhang B) + +--- + +## 0. Warum es dieses Dokument gibt + +OneLiteFeather betreibt inzwischen vier vergleichbare Minestom-Server-Projekte — +ManisGame, Cygnus, Tamias und Titan — und eine Reihe von Libraries (Aves, Xerus, +Coris, Guira, pica, Cyano). Die Libraries folgen einer konsistenten, über Jahre +gewachsenen Handschrift. Die Server-Projekte tun das unterschiedlich stark. + +Der Unterschied ist messbar, nicht Geschmackssache: + +| Kennzahl (nur `src/main`) | Titan | ManisGame | Cygnus | Tamias | Aves | pica | Xerus | +|---|---:|---:|---:|---:|---:|---:|---:| +| Java-Dateien | 74 | 359 | 239 | 181 | 99 | 38 | 34 | +| davon mit `@author` | **2** | 152 | 121 | 89 | 78 | 18 | 33 | +| davon mit `@since` | **3** | 157 | 122 | 89 | 81 | 18 | 33 | +| `package-info.java` | **0** | 77 | 54 | 35 | 14 | 11 | 0 | +| `@ApiStatus`-Nutzung | **0** | 9 | 0 | 3 | 8 | 5 | 1 | +| `sealed`-Nutzung | 3 | 10 | 5 | 10 | 14 | 7 | 0 | +| öffentliche `*Impl` im API-Modul | 0 | 0 | — | — | — | — | — | +| Convention-Plugin (`buildSrc`) | **nein** | ja (3) | ja (1) | ja (1) | — | — | — | + +Titan ist damit nicht "schlechter geschrieben", sondern **ohne durchgesetzte +Konvention gewachsen**. Es ist das einzige der vier Server-Projekte ohne +`buildSrc`. + +**Eine Warnung zu dieser Tabelle.** Zahlen zeigen, wo man hinschauen soll — sie +ersetzen das Hinschauen nicht. Eine frühere Fassung dieses Dokuments las Titans +vier `*Impl`-Dateien im `:api`-Modul als Verstoß gegen die API/Impl-Trennung. Ein +Blick in den Code widerlegte das: alle vier sind package-private und hinter +Factory-Methoden verborgen — es ist eines der saubersten APIs im Bestand (siehe +OLF-L2-02). Wer diesen Standard anwendet, prüft jeden Zählwert am Code, bevor er +daraus eine Aufgabe ableitet. + +Dieses Dokument leitet die Konvention aus dem ab, was in den Referenzprojekten +nachweislich funktioniert, macht sie maschinell prüfbar und beschreibt, wie Titan +als erstes Projekt darauf migriert. + +**Die Referenzprojekte und wofür sie stehen:** + +| Projekt | Referenz für | +|---|---| +| **ManisGame** | Modultopologie (`shared:*` + Server-Varianten), Convention-Plugin-Hierarchie, API-Modul-Disziplin | +| **Cygnus** | Bootstrap-Extraktion, echte Minestom-Extension-Jars, `package-info`-Disziplin | +| **Tamias** | Schlanke Drei-Modul-Topologie (`common`/`game`/`setup`), feine Paketierung | +| **Aves / Xerus / pica / Coris** | Klassen-Patterns: Interface + Factory, Builder, `sealed`, Javadoc-Konvention | + +### Die drei Leitentscheidungen + +1. **Deployment:** Ein schlanker Host-Prozess lädt alle Fachlogik als Extensions. + Butterfly und die Lobby-Logik werden Extension-Jars, kein Fat-Jar-Inhalt. +2. **Reichweite:** Org-weiter Standard. Titan ist der erste Anwender, nicht der + einzige Adressat. +3. **Durchsetzung:** Was prüfbar ist, wird geprüft. Regeln landen als + `buildSrc`-Convention (Checkstyle, ArchUnit, Jacoco), nicht als Wunsch im Wiki. + +### Regel-IDs + +Jede Regel hat eine ID der Form `OLF-L-`. ArchUnit-Testmethoden +und Review-Kommentare referenzieren diese ID, damit eine Beanstandung immer auf +eine nachlesbare Begründung zeigt statt auf persönlichen Geschmack. + +--- + +## 1. Ebene L1 — Projekt + +### OLF-L1-01: `buildSrc` ist Pflicht, Build-Logik wird nicht kopiert + +**Regel.** Jedes Multi-Modul-Projekt hat ein `buildSrc` mit einer +Convention-Plugin-**Hierarchie**: ein Basis-Plugin mit Toolchain, Compiler-Flags +und Test-Konfiguration, darauf aufbauend je ein Plugin pro Modulrolle. Toolchain, +Test-Konfiguration, Qualitäts-Gates und der Publishing-Block stehen dort +**einmal**. Jedes Modul wendet genau ein Rollen-Plugin an. + +**Begründung.** Titan hat heute keinen `buildSrc`. Der `publishing { ... }`-Block +mit POM-Metadaten, Lizenz, Developer und SCM ist in `app`, `setup` und `bridge` +**dreimal wortgleich** kopiert, die Repository-Definition mit +Credential-Handling ebenso. Die Java-Toolchain 25 ist **fünfmal** dupliziert, die +Test-Konfiguration `useJUnitPlatform()` + `-Dminestom.inside-test=true` **viermal**. +Jede Änderung an einer dieser Stellen ist heute eine Änderung an vier bis fünf +Dateien — mit der üblichen Folge, dass eine vergessen wird. Cygnus zeigt die +Gegenprobe: `cygnus.java-conventions.gradle.kts`, ein einziger Ort. + +**Ziel-Layout.** ManisGame lebt die Hierarchie bereits vor und ist die Vorlage: + +``` +buildSrc/src/main/kotlin/ + titan.java-conventions.gradle.kts Basis: Toolchain, Compiler, Test, Jacoco + titan.library-conventions.gradle.kts ← java-conventions + `java-library` + titan.application-conventions.gradle.kts ← java-conventions + `application` + shadow + titan.extension-conventions.gradle.kts ← java-conventions + Processor, compileOnly + titan.quality-conventions.gradle.kts Checkstyle, ArchUnit, Nullability-Gate + titan.publish-conventions.gradle.kts POM, Lizenz, Developer, SCM, Repository +``` + +**Referenz** (ManisGame — Vererbung in Reinform, das Rollen-Plugin enthält nur +noch den Unterschied): + +```kotlin +// manis.library-conventions.gradle.kts +plugins { + id("manis.java-conventions") + `java-library` +} + +// manis.application-conventions.gradle.kts +plugins { + id("manis.java-conventions") + application +} +``` + +**Referenz** (Cygnus, gekürzt — die Basis, auf der `titan.java-conventions` aufsetzt): + +```kotlin +plugins { + java + jacoco +} + +java { + toolchain { languageVersion.set(JavaLanguageVersion.of(25)) } +} + +tasks.withType().configureEach { + options.release.set(25) + options.encoding = "UTF-8" + options.compilerArgs.addAll(listOf("-Xlint:deprecation", "-Xlint:unchecked")) +} + +tasks.withType().configureEach { + jvmArgs("-Dminestom.inside-test=true") + finalizedBy(tasks.matching { it.name == "jacocoTestReport" }) + useJUnitPlatform() + testLogging { events("passed", "skipped", "failed") } +} +``` + +**Durchsetzung.** Ein Modul-`build.gradle.kts`, das `java { toolchain { ... } }` +oder einen `publishing`-Block selbst deklariert, statt das Convention-Plugin +anzuwenden, wird im Review abgelehnt. Perspektivisch prüfbar über einen +`checkNoInlineToolchain`-Task, der die Buildfiles nach diesen Blöcken greppt. + +**Warnendes Beispiel.** Tamias hat ein `buildSrc` mit +`tamias.java-conventions.gradle.kts` — wendet es in `game/build.gradle.kts` aber +nicht an; dort stehen nur `alias(libs.plugins.shadow)` und `application`. Das +Convention-Plugin allein genügt also nicht: ohne Prüfung driften Module wieder +auseinander, und der `buildSrc` wird zur Dekoration. Genau deshalb steht in +diesem Standard bei jeder Regel eine Durchsetzungsangabe. + +--- + +### OLF-L1-02: Version-Catalog im `settings.gradle.kts`, Versionen über BOM + +**Regel.** Abhängigkeiten werden im Inline-Version-Catalog des +`settings.gradle.kts` deklariert (nicht in `libs.versions.toml` — das ist die +OLF-Abweichung vom Gradle-Default). Konkrete Versionen kommen wo immer möglich +aus einer BOM (`mycelium-bom` für Libraries, `aonyx-bom` für Minestom-Anwendungen, +`manis-bom` für Spiele) über `.withoutVersion()`. + +**Begründung.** `.withoutVersion()` bedeutet: die BOM entscheidet, ein +Renovate-Update an der BOM zieht das ganze Ökosystem nach. Eine hart notierte +Version im Catalog hebelt das aus und muss pro Projekt gepflegt werden. Titan hat +aktuell 12 harte Versionen im Catalog, von denen mindestens `guava` und +`kotlin-stdlib-jdk8` nur deshalb dort stehen, weil sie transitive Lücken stopfen. +Solche Einträge brauchen einen Kommentar, der die Lücke benennt — Titan macht das +bereits vorbildlich, das ist beizubehalten. + +**Regel im Detail.** Eine harte Version im Catalog ist zulässig, wenn: +1. die BOM sie nicht führt, **und** +2. ein Kommentar direkt darüber erklärt, warum sie nötig ist und wann sie + entfallen kann. + +--- + +### OLF-L1-03: Ein Modul, ein Zweck, ein Artefakt + +**Regel.** Jedes Gradle-Modul produziert genau ein Artefakt mit genau einer Rolle. +Die zulässigen Rollen sind: `bootstrap` (ausführbarer Host), `api` (Contracts), +`common` (geteilte Domäne), `extension` (Fachlogik als Extension-Jar). + +**Begründung.** Titans `:api`-Modul verletzt das doppelt: es enthält sowohl +Contracts (`Deliver`, `DeliverComponent`, `DeliverType`) als auch vier +Implementierungen (`ServerBuilderImpl`, `ServerDeliverComponentImpl`, +`TaskBuilderImpl`, `TaskComponentImpl`). Siehe OLF-L2-02. + +**Zwei erprobte Zuschnitte.** OLF hat bereits zwei funktionierende Topologien — +die Wahl richtet sich nach der Projektgröße, nicht nach Geschmack: + +*Tamias (schlank, 181 Dateien)* — drei Module, für Projekte mit einer Server-Rolle: + +``` +:common geteilte Domäne (area, config, event, explosion, map, ground, ...) +:game Spiel-Logik, application +:setup Setup-Modus, application +``` + +*ManisGame (ausgebaut, 359 Dateien)* — geteilte Basis fein geschnitten, darauf +mehrere Server-Varianten: + +``` +shared:api reine Contracts, 0 Impl, compileOnly(minestom) +shared:common geteilte Domäne +shared:database Persistenz +shared:queue Messaging +shared:cloud CloudNet-Anbindung +shared:scare, shared:day Fach-Features +extensions:lobby Server-Variante (application + mainClass) +extensions:game Server-Variante +extensions:setup Server-Variante +``` + +**Empfehlung für Titan.** Der Tamias-Zuschnitt plus ein `:api`-Modul und die +Extension-Aufteilung aus Abschnitt 5 — Titan hat mit 74 Dateien nicht die Größe, +die ManisGames Sieben-Wege-Split rechtfertigt. Wächst Titan, ist der Weg von +Tamias- zu ManisGame-Topologie additiv: `:common` wird aufgeteilt, die Rollen +bleiben. + +**Namenswarnung.** ManisGames Verzeichnis `extensions/` enthält **keine** +Minestom-Extensions — es sind eigenständige Server-Anwendungen mit `mainClass` +und `shadowJar`; im gesamten Repository existiert keine `extension.json`. Für +echte Minestom-Extension-Jars sind Cygnus' und Titans `:bridge`-Module die +Referenz (Abschnitt 5). Wer ManisGame als Vorlage nimmt, darf die beiden +Bedeutungen von "Extension" nicht vermischen. + +--- + +### OLF-L1-04: Release Please, Renovate-Preset, OLF-Workflows + +**Regel.** Jedes Repository nutzt Release Please für Versionierung und Changelog, +das zentrale OneLiteFeather-Renovate-Preset und die reusable Workflows aus +`OneLiteFeatherNET/workflows`. + +**Begründung.** Titan und Cygnus erfüllen das bereits. Butterfly nutzt noch +`.releaserc.json` (semantic-release) — das ist die einzige verbleibende Abweichung +im betrachteten Umfeld und im Zuge der Extension-Umstellung mitzuziehen. + +--- + +## 2. Ebene L2 — Modul + +### OLF-L2-01: Eine Abhängigkeitsrichtung, keine Zyklen + +**Regel.** Abhängigkeiten fließen ausschließlich in eine Richtung: + +``` +extension ──▶ common ──▶ api + │ ▲ + └─────────────────────┘ +bootstrap ──▶ api (nur Contracts, nie common, nie extension) +``` + +Verboten: `common → extension`, `api → common`, `extension → extension`, +`bootstrap → common`. + +**Begründung.** Extensions laufen in eigenen Classloadern. Eine Extension, die +eine andere direkt referenziert, funktioniert im Test und bricht im Deployment — +oder erzwingt eine Ladereihenfolge, die niemand dokumentiert hat. Kommunikation +zwischen Extensions läuft über Events oder die `ServiceRegistry`, nie über +direkte Typen. Titan macht das an der kritischsten Stelle bereits richtig: +`TitanPermissionBridge` reicht nur JDK-Typen über die Classloader-Grenze. + +**Durchsetzung.** ArchUnit in `olf.quality-conventions`: + +```java +@ArchTest +static final ArchRule modules_respect_dependency_direction = + layeredArchitecture().consideringOnlyDependenciesInLayers() + .layer("api").definedBy("..titan.api..") + .layer("common").definedBy("..titan.common..") + .layer("extension").definedBy("..titan.lobby..", "..titan.setup..", "..titan.bridge..") + .whereLayer("extension").mayNotBeAccessedByAnyLayer() + .whereLayer("common").mayOnlyBeAccessedByLayers("extension") + .as("OLF-L2-01"); +``` + +--- + +### OLF-L2-02: `:api` enthält Contracts, niemals Implementierungen + +**Regel.** Das öffentliche API besteht aus Interfaces, Records als reine +Wertträger, Enums und Konstanten. Implementierungen dürfen im selben Modul liegen, +müssen dann aber **package-private** sein und über Factory-Methoden am Interface +erreicht werden. Öffentliche `*Impl`-Typen sind verboten. + +**Positivbeispiel: Titans `Deliver`-API.** Entgegen dem, was die reine Dateizählung +nahelegt, ist dieses API bereits vorbildlich gebaut — es ist die interne Vorlage +für diese Regel: + +```java +public sealed interface DeliverComponent permits DeliverComponent.TaskComponent, + DeliverComponent.ServerDeliverComponent, TaskComponentImpl, ServerDeliverComponentImpl { + + DeliverType type(); + UUID playerId(); + + static TaskBuilder taskBuilder() { return new TaskBuilderImpl(); } + static ServerBuilder serverBuilder() { return new ServerBuilderImpl(); } + + sealed interface TaskComponent extends DeliverComponent permits TaskComponentImpl { + String taskName(); + } + + sealed interface Builder> { + T playerId(UUID playerId); + default T player(Player player) { return playerId(player.getUuid()); } + DeliverComponent build(); + } +} +``` + +Alle vier `*Impl` sind package-private (`final class TaskBuilderImpl`, +`record TaskComponentImpl`), der Contract wird ausschließlich über +Factory-Methoden betreten, und der Builder nutzt self-typed Generics. Ein +Konsument des Moduls sieht die Implementierungen nicht. + +**Warum `permits` die Impls nennen darf.** Die `permits`-Klausel eines `sealed` +Typs muss jeden direkten Subtyp benennen — das ist eine Sprachanforderung, kein +Leck. Sichtbarkeit entscheidet über die Kapselung, nicht die Erwähnung im +`permits`. Ein `permits`-Eintrag auf einen package-private Typ ist genau richtig. + +**Was hier trotzdem zu tun bleibt.** Die Einträge `TaskComponentImpl` und +`ServerDeliverComponentImpl` in der **Wurzel**-`permits`-Klausel sind redundant, +weil beide Typen bereits über `TaskComponent` bzw. `ServerDeliverComponent` +erreichbar sind. Aufräumen ist kosmetisch, kein Regelverstoß. + +Der reale Mangel liegt woanders: `:api` trägt kein `maven-publish`. Publiziert +werden nur `titan-app`, `titan-setup` und `titan-bridge`. Das erklärte Ziel — ein +Contract, den andere Projekte konsumieren — ist damit nicht erreichbar; wer ihn +will, müsste den Fat-Jar der Lobby ziehen. Siehe offener Punkt 3. + +**Die Gegenprobe.** ManisGames `shared:api` enthält bei 359 Projektdateien +**null** `*Impl`-Klassen und deklariert Minestom konsequent als `compileOnly` — +das API-Modul zieht also nicht einmal eine Laufzeitabhängigkeit auf den Server +nach: + +```kotlin +plugins { id("manis.library-conventions") } + +dependencies { + api(platform(libs.manis.bom)) + compileOnly(libs.minestom) // API beschreibt, sie führt nicht aus + implementation(libs.caffeine) +} +``` + +Dass das bei fast fünffacher Projektgröße durchgehalten wird, entkräftet das +übliche Gegenargument, saubere API-Grenzen seien nur bei kleinen Projekten +praktikabel. + +**Korrekte Form** — `sealed` erlaubt genau die Sub-Contracts, die Implementierung +liegt in `:common` und wird über eine Factory-Methode erreicht (Vorbild: Aves +`MapEntry`): + +```java +public sealed interface DeliverComponent + permits DeliverComponent.TaskComponent, DeliverComponent.ServerDeliverComponent { + + @Contract(pure = true, value = "_, _ -> new") + static ServerDeliverComponent server(String name, UUID id) { ... } + + DeliverType type(); +} +``` + +**Durchsetzung.** + +```java +@ArchTest +static final ArchRule api_has_no_implementations = + noClasses().that().resideInAPackage("..titan.api..") + .should().haveSimpleNameEndingWith("Impl") + .as("OLF-L2-02"); +``` + +--- + +### OLF-L2-03: Ein Paketwurzel-Präfix pro Projekt + +**Regel.** Alle Typen eines Projekts liegen unterhalb genau eines +Wurzelpakets: `net.onelitefeather.`. + +**Begründung.** Titans `:api`-Modul hat heute **zwei** Wurzeln: +`net.onelitefeather.deliver` (6 Klassen) und `net.onelitefeather.titan.api.deliver` +(1 Klasse) — wobei die eine Klasse aus der anderen Wurzel importiert. Das ist +nicht nur unordentlich, es macht auch jede paketbasierte Regel (ArchUnit, +Checkstyle, `@NotNullByDefault`) unzuverlässig, weil sie eine der beiden Wurzeln +übersieht. + +**Durchsetzung.** + +```java +@ArchTest +static final ArchRule single_root_package = + classes().should().resideInAPackage("net.onelitefeather.titan..") + .as("OLF-L2-03"); +``` + +--- + +### OLF-L2-04: Reuse vor Reimplementierung + +**Regel.** Bevor eine Abstraktion in `:common` neu entsteht, ist zu prüfen, ob +Aves, Xerus, Coris, Guira oder pica sie bereits liefert. Eine bewusste +Eigenimplementierung braucht einen Kommentar, der begründet, warum die +Library-Variante nicht passt. + +**Begründung.** Das ist der teuerste Verstoß in Titan. Titan importiert Aves +bereits (`net.theevilreaper.aves.map.BaseMap`, `GsonFileHandler`, +`PositionGsonAdapter`) — und baut die Kernabstraktion daneben trotzdem selbst: + +| Titan (Eigenbau) | Aves (vorhanden) | +|---|---| +| `final class MapProvider` | `interface MapProvider` + `abstract class AbstractMapProvider` | +| `record MapEntry(Path path)` | `sealed interface MapEntry permits BaseMapEntry` mit `of(...)`-Factories | +| `Function, List>` | `@FunctionalInterface PathFilter` | +| `MapPool`, `LobbyMap`, `LobbyMapBuilder` | `BaseMap`, `BaseMapBuilder`, `ChunkLoaderFactory` | + +Titans `MapProvider` ist eine `final class` ohne Interface — also weder +mockbar noch erweiterbar, obwohl Aves genau dafür `AbstractMapProvider` als +Erweiterungspunkt anbietet. Dass es anders geht, zeigt ManisGames +`SetupExtension`: es importiert `net.theevilreaper.aves.map.provider.MapProvider` +direkt und leitet für den Sonderfall `SetupMapProvider` ab, statt daneben etwas +Eigenes zu bauen. + +**Der org-weite Fall: `ThreadHelper`.** Diese Klasse existiert **viermal** im +OneLiteFeather-Bestand, drei Kopien davon byte-identisch: + +| Ort | Inhalt | +|---|---| +| `titan/common/utils/ThreadHelper.java` | identisch | +| `butterfly/minestom/feature/ThreadHelper.java` | identisch | +| `butterfly/bukkit/utils/ThreadHelper.java` | identisch | +| `manis/common/util/ThreadHelper.java` | leicht abweichende Variante | + +Alle vier lösen dasselbe Problem: den Context-Classloader für einen +`ServiceLoader`-Aufruf temporär umzubiegen. Das ist keine Titan-Nachlässigkeit, +sondern eine org-weite Lücke — es fehlt schlicht der Ort, an den solcher Code +gehört. Dieselbe Geschichte bei `SingletonFeatureManagerProvider` +(Titan + Butterfly). + +**Konsequenz für den Standard.** Querschnittscode dieser Art gehört in eine +Library (Aves für Allgemeines, Butterfly für LuckPerms-/Feature-Flag-Nahes), nicht +in das jeweilige `common` des Projekts. Die Regel lautet daher konkret: **Wird +eine Hilfsklasse in einem zweiten Projekt gebraucht, wird sie nicht kopiert, +sondern in die passende Library gehoben.** + +**Durchsetzung.** Nicht automatisierbar, aber im Review verbindlich: Eine neue +Klasse in `:common`, deren Name einem Aves-/Xerus-Typ entspricht +(`*Provider`, `*Entry`, `*Pool`, `*Builder`, `Kit*`, `Team*`, `Phase*`), erfordert +die explizite Begründung im Klassen-Javadoc. + +--- + +### OLF-L2-05: Kein statischer Zustand über Modulgrenzen + +**Regel.** Statische Felder mit veränderlichem Zustand sind auf Modulebene +verboten. Muss Zustand eine Classloader-Grenze queren, geschieht das über einen +Holder, der ausschließlich JDK-Typen in seiner Signatur führt. + +**Begründung.** Voraussetzung für das Extension-Modell (Abschnitt 4). Titan +erfüllt das an der schwierigsten Stelle bereits: `TitanPermissionBridge` reicht +`(UUID, String) -> boolean` über die Grenze zwischen Anwendungs- und +Extension-Classloader — kein LuckPerms-Typ, kein CloudNet-Typ. Diese Lösung ist +die Blaupause, nicht die Ausnahme. + +**Bekannte Abweichung.** `SingletonFeatureManagerProvider` hält ein statisches, +lazy initialisiertes `FeatureManager`-Feld. Das ist durch das Togglz-SPI +vorgegeben (`FeatureManagerProvider` wird per ServiceLoader instanziiert) und +bleibt zulässig — aber genau deshalb gehört die Klasse nach Butterfly und nicht +in beide Projekte kopiert. + +--- + +## 3. Ebene L3 — Paket + +### OLF-L3-01: `package-info.java` mit `@NotNullByDefault` in jedem Paket + +**Regel.** Jedes Paket mit mindestens einem öffentlichen Typ hat eine +`package-info.java`. Nullability wird dort einmal deklariert, nicht pro Parameter +verteilt. + +```java +@NotNullByDefault +package net.onelitefeather.titan.common.map; + +import org.jetbrains.annotations.NotNullByDefault; +``` + +Innerhalb eines so annotierten Pakets wird nur noch `@Nullable` gesetzt — als +bewusste Ausnahme. Ein `@NotNull` dort ist dann redundant und wird entfernt. + +**Begründung.** Das ist die durchgängigste Konvention der Referenzprojekte: +Cygnus 54 Pakete, Aves 14, pica 11, Coris 8, Guira 4. Titan hat **null** — und +stattdessen 24 Dateien mit handverteilten `@NotNull`. Handverteilte Annotationen +sind unvollständig per Konstruktion: sie stehen dort, wo jemand daran gedacht hat. +Die Paket-Variante kehrt den Default um, wodurch die Lücke sichtbar statt still +wird. + +**Durchsetzung.** Nicht selbst schreiben — Falcos +`PublicApiTest.everyPublishedPackageDeclaresNullness` übernehmen. Die Annotation +wird dort bewusst **als String** gematcht, damit die Regel nicht davon abhängt, +dass das Annotations-Artefakt zur Importzeit auflösbar ist; ein Paket ganz ohne +`package-info` fällt ebenfalls durch — der Fall, um den es eigentlich geht: + +```java +private static final ArchCondition IN_NOT_NULL_BY_DEFAULT_PACKAGE = + new ArchCondition<>("reside in a @NotNullByDefault package") { + @Override + public void check(JavaClass item, ConditionEvents events) { + Optional> info = item.getPackage().tryGetPackageInfo(); + boolean ok = info.isPresent() + && item.getPackage().isAnnotatedWith( + "org.jetbrains.annotations.NotNullByDefault"); + events.add(new SimpleConditionEvent(item, ok, + "package " + item.getPackageName() + " has no @NotNullByDefault package-info")); + } + }; + +@ArchTest +static final ArchRule everyPublishedPackageDeclaresNullness = classes() + .that().resideInAnyPackage(PUBLISHED) + .and(not(PACKAGE_INFO)) + .should(IN_NOT_NULL_BY_DEFAULT_PACKAGE) + .because("not one bare @NotNull exists in the three modules; the non-nullability of the " + + "whole API rests on the three package-info lines"); +``` + +--- + +### OLF-L3-02: Fachliche Paketnamen, kein `utils`/`helper`-Sammelbecken + +**Regel.** Pakete werden nach Fachlichkeit geschnitten, nicht nach technischer +Kategorie. `util` ist zulässig für echte, zustandslose Querschnittsfunktionen +(Aves hat `util/vector`, `util/collection`, `util/functional` — jeweils fachlich +scharf). Ein `utils`-Paket als Ablage für alles, was sonst nirgends passt, ist es +nicht. + +**Begründung.** Titans `common/utils` enthält heute sieben Typen ohne +gemeinsamen Nenner: + +| Klasse | gehört fachlich nach | +|---|---| +| `Cancelable` | `common/event` | +| `CloudNetEnvironment` | `common/bootstrap` | +| `Items` | `common/item` (oder ersetzbar durch Aves `item`) | +| `SingletonFeatureManagerProvider` | Butterfly (Duplikat, siehe OLF-L2-04) | +| `Tags` | `common/tag` (zusammen mit `tags/PosTagSerializer`) | +| `ThreadHelper` | Butterfly (Duplikat) | +| `TitanFeatures` | `common/feature` | + +Ein `utils`-Paket wächst monoton: es hat keine Definition, also kann nichts +hineinpassen und nichts wieder hinaus. Dasselbe gilt für `common/helper` +(`BlockHandlerHelper`, `SitHelper`) — siehe OLF-L4-04. + +**Durchsetzung.** + +```java +@ArchTest +static final ArchRule no_generic_util_package = + noClasses().should().resideInAnyPackage("..utils", "..helper", "..misc", "..common.impl") + .as("OLF-L3-02"); +``` + +--- + +### OLF-L3-03: Events liegen im `event`-Unterpaket ihres Fachpakets + +**Regel.** Ein Event gehört in das `event`-Unterpaket der Fachlichkeit, die es +auslöst — nicht in ein globales Event-Paket. + +**Begründung.** Das Muster ist in allen sechs geprüften Referenzprojekten +identisch: Coris `door/event`, `floor/event`; Xerus `kit/event`, `team/event`; +pica `dialog/event`; Cygnus `map/event`, `page/event`, `player/event`, `view/event`; +Tamias `common/map/event`, `game/round/event`; ManisGame `api/door/event`, +`lobby/event`, `setup/event/dialog`, `hud/event`. + +Der Vorteil ist Lokalität: wer das Feature liest, sieht seine Events, ohne ein +Sammelpaket zu durchsuchen. Tamias treibt es am weitesten und spiegelt die +Event-Struktur auch bei den Listenern (`game/listener/area`, `listener/round`, +`listener/team`) — bei 181 Dateien ist das der Unterschied zwischen Navigieren +und Suchen. + +Titan hat aktuell ein flaches `common/event` mit einer Klasse — bei der +derzeitigen Größe unkritisch, aber beim Ausbau die falsche Weiche. Titans +`app/listener` mit 14 Listenern in einem flachen Paket ist bereits jetzt der Fall, +in dem sich die Tamias-Untergliederung lohnen würde (`listener/sit`, +`listener/elytra`, `listener/player`). + +--- + +## 4. Ebene L4 — Klasse + +### OLF-L4-01: Javadoc-Header auf jedem öffentlichen Typ + +**Regel.** Jeder öffentliche Typ trägt einen Javadoc-Block mit Beschreibung und +den Tags `@author`, `@version`, `@since`. `@version` wird bei jeder +API-relevanten Änderung erhöht, `@since` nie. + +**Referenz** (Aves `MapProvider`): + +```java +/** + * The {@link MapProvider} interface is responsible for managing the available maps. + * It will load all maps data from the given path and store them. + * It would not load the map itself over a {@link AnvilLoader} instance. + * This behavior is handled by another class. + * + * @author theEvilReaper + * @version 1.1.0 + * @since 1.6.0 + */ +public interface MapProvider { +``` + +**Begründung.** `@since` ist der einzige Weg, ohne `git blame` zu erkennen, ob +ein Typ zum stabilen Kern gehört oder letzte Woche entstand — bei einer Library, +die andere Projekte konsumieren, ist das der Unterschied zwischen "kann ich mich +darauf verlassen" und "muss ich nachfragen". Zahlen siehe Abschnitt 0. + +**Durchsetzung.** Checkstyle `JavadocType` mit +`allowedAnnotations=""` und `authorFormat`/`versionFormat` gesetzt, plus +`MissingJavadocType` auf `scope=public`. + +--- + +### OLF-L4-02: Interface, dann `Abstract`/`Base`, dann Factory-Methode + +**Regel.** Ein Typ, den andere Module benutzen, wird als Interface eingeführt. +Wiederverwendbare Teilimplementierung heißt `Abstract*` oder `Base*`. Die +Instanziierung läuft über eine statische Factory-Methode auf dem Interface, nicht +über einen öffentlichen Konstruktor. + +**Referenz** (Aves `MapEntry` — Interface, `sealed`, Factory, `@Contract`): + +```java +public sealed interface MapEntry permits BaseMapEntry { + + String MAP_FILE = "map.json"; + + @Contract(pure = true, value = "_ -> new") + static MapEntry of(Path directoryRoot) { + return new BaseMapEntry(directoryRoot, MAP_FILE); + } + + @Contract(pure = true, value = "_, _ -> new") + static MapEntry of(Path directoryRoot, String mapFileNaming) { + return new BaseMapEntry(directoryRoot, mapFileNaming); + } +} +``` + +**Begründung.** Die Factory-Methode ist der Punkt, an dem die Implementierung +wechseln kann, ohne dass ein Aufrufer es merkt — der Kern des Dependency +Inversion Principle. `@Contract(pure = true, value = "_ -> new")` teilt der IDE +und statischen Analyse mit, dass der Aufruf nebenwirkungsfrei ist und ein neues +Objekt liefert. + +Titan hat dieses Muster bereits an mehreren Stellen (`MapProvider.create(...)`, +`AppConfigProvider.create(...)`, `DeliverProvider.create()`, `Titan.instance()`), +aber jeweils ohne Interface — die Factory liefert die konkrete `final class` +zurück. Damit fehlt genau die Austauschbarkeit, für die die Factory da ist, und +Tests müssen die echte Klasse konstruieren statt eine Test-Implementierung +einzusetzen. + +--- + +### OLF-L4-03: Builder für Objekte mit mehr als drei optionalen Feldern + +**Regel.** Konfigurationsobjekte mit mehr als drei optionalen Feldern bekommen +einen Builder. Der Builder ist eine eigene Klasse `*Builder` und wird über eine +Factory-Methode am Zieltyp erreicht. + +**Begründung.** Aves nutzt das durchgängig (8 Builder-Klassen: `InventoryBuilder`, +`PageableInventoryBuilder`, `BaseMapBuilder`, …), pica ebenso (7). Titan hat mit +`AppConfigBuilder` und `LobbyMapBuilder` bereits zwei — die Konvention ist also +schon da und muss nur festgeschrieben werden. `AppConfig` mit seinen elf +Zugriffsmethoden ist genau der Fall, für den die Regel existiert. + +--- + +### OLF-L4-04: Statische Helfer werden Services + +**Regel.** Eine Klasse mit ausschließlich statischen Methoden und mehr als +~50 Zeilen Fachlogik wird ein Service mit Interface und Instanz. Rein +funktionale, zustandslose Umrechnungen (Vektor-Mathematik, Farbkonvertierung) +dürfen statisch bleiben — dann aber als `final class` mit privatem Konstruktor. + +**Begründung.** `SitHelper` in Titan hat 102 Zeilen statische Sitz-Logik, gegen +die 378 Zeilen Testcode anschreiben — das schlechteste Test-zu-Code-Verhältnis im +Projekt, weil jeder Testfall den globalen Zustand selbst herstellen muss, statt +eine konfigurierte Instanz zu bekommen. Statische +Fachlogik lässt sich weder ersetzen noch in einem anderen Kontext anders +konfigurieren — sie ist der Gegenentwurf zu OLF-L4-02. `NavigationHelper` macht +es bereits besser (`NavigationHelper.instance(deliver)` mit injizierter +Abhängigkeit) und ist die Vorlage für `SitHelper`. + +`BlockHandlerHelper.registerAll()` ist der zulässige Gegenfall: eine einmalige +Registrierung ohne Zustand und ohne Variantenbedarf. + +--- + +### OLF-L4-05: `final class` + privater Konstruktor für echte Utilities + +**Regel.** Nicht instanziierbare Klassen sind `final` und haben einen privaten +Konstruktor ohne Rumpf. + +**Referenz** (Cygnus `ServiceBootstrap`): + +```java +public final class ServiceBootstrap { + private ServiceBootstrap() { + } +} +``` + +**Durchsetzung.** Checkstyle `HideUtilityClassConstructor` + `FinalClass`. + +--- + +### OLF-L4-06: `@ApiStatus` für nicht-stabile API + +**Regel.** Öffentliche Typen, die noch nicht stabil sind, tragen +`@ApiStatus.Experimental`. Typen, die technisch öffentlich sein müssen, aber +nicht zur API gehören, tragen `@ApiStatus.Internal`. + +**Begründung.** Aves nutzt das in 8, pica in 5 Dateien; Coris markiert seine +Kern-Interfaces bewusst als `@ApiStatus.Experimental`. Ohne diese Markierung ist +jede öffentliche Klasse implizit ein Versprechen. Titan nutzt `@ApiStatus` +bislang gar nicht — bei einem Modul namens `:api`, das publiziert wird, ist das +eine Lücke. + +--- + +### OLF-L4-07: Ein Test pro Fachklasse, Cyano für Minestom-Integration + +**Regel.** Jede Klasse mit Fachlogik hat eine Testklasse gleichen Namens mit +Suffix `Test` im spiegelbildlichen Paket. Tests, die einen laufenden +Minestom-Kontext brauchen (Player, Instance, Pakete), nutzen Cyano und heißen +`*IntegrationTest`. + +**Begründung.** Cygnus zeigt die Spiegelstruktur konsequent — zu +`common/page/PageFactory.java` gehört `common/page/PageFactoryTest.java`, zu +`player/PermissionAwarePlayer.java` gehört +`player/PermissionAwarePlayerIntegrationTest.java`. Titan folgt dem in `:common` +und `:app` bereits gut; die Lücke ist `:api` (7 Klassen, 0 Tests), `:setup` +(7 Klassen, 0 Tests) und `:bridge` (1 Klasse, 0 Tests). + +**Durchsetzung.** Jacoco-Coverage-Gate in `olf.java-conventions`, zunächst als +`violationRules` mit einer Schwelle, die den Ist-Stand nicht unterschreitet, und +dann schrittweise angehoben. Ein Gate, das sofort auf 80 % springt, wird +umgangen statt erfüllt. + +--- + +### OLF-L4-08: Ein Logger pro Klasse, keine `System.out` + +**Regel.** `private static final Logger LOGGER = LoggerFactory.getLogger(X.class);` +— SLF4J, keine Ausnahme. Jede Anwendung deklariert genau ein SLF4J-Binding als +`runtimeOnly`. + +**Begründung.** Cygnus dokumentiert die Falle im Buildfile: *"SLF4J needs a +binding at runtime; without one it falls back to NOP and the server logs nothing +at all."* — und deklariert entsprechend `libs.slf4j.api` als `implementation` und +`libs.slf4j.simple` als `runtimeOnly`. Titan deklariert **weder API noch Binding** +in irgendeinem Buildfile, nutzt `LoggerFactory` aber in `MapProvider` und +`MapPool`. Beides kommt derzeit transitiv über Minestom herein. Das funktioniert, +solange Minestom es mitbringt — und hört ohne Vorwarnung auf, wenn ein +Minestom-Update die Abhängigkeit umstellt. Der Ausfall ist dabei still: SLF4J +fällt auf NOP zurück und protokolliert einfach nichts mehr. + +--- + +## 5. Extension-Modell + +### 5.1 Zielbild + +Der Host-Prozess enthält keine Fachlogik. Er initialisiert Minestom, startet den +`ExtensionBootstrap` und übergibt. + +``` +app-titan.jar Host: main(), ServiceBootstrap, Minestom, Auth +└─ extensions/ + ├─ butterfly-minestom.jar Chat-Format, Prefix, LuckPerms-Anbindung + ├─ titan-lobby.jar Sit, Elytra, Tickle, Navigation, Commands + ├─ titan-setup.jar Map-Setup-Modus + ├─ titan-bridge.jar CloudNet -> LuckPerms + └─ luckperms.jar JarInJar-Loader +``` + +**Was das löst.** + +- Butterfly wird nicht mehr in den Fat-Jar geshadet. Die byte-identischen Kopien + `ThreadHelper` und `SingletonFeatureManagerProvider` in Titans `common/utils` + entfallen ersatzlos (OLF-L2-04). +- Lobby-Features werden einzeln deaktivierbar, ohne Rebuild des Hosts. +- Der Host wird testbar, weil er nichts Fachliches mehr tut. +- `:setup` und `:lobby` teilen denselben Host, statt zwei getrennte + `application`-Module mit je eigenem `Titan.java` zu sein. + +### 5.2 OLF-L5-01: `extension.json` wird generiert, nicht gepflegt + +**Regel.** Extension-Metadaten entstehen über den Annotation Processor +`minestom-extensions-processor`, nicht als handgepflegte Ressource. + +**Begründung.** Titan pflegt `bridge/src/main/resources/extension.json` von Hand +und stanzt die Version über `ReplaceTokens` und einen `@version@`-Platzhalter +ein — inklusive `inputs.properties`-Boilerplate im Buildfile. Cygnus lässt den +Processor die Datei erzeugen und übergibt nur die Version als Compiler-Argument: + +```kotlin +compileOnly(libs.minestom.extensions.processor) +annotationProcessor(libs.minestom.extensions.processor) +// ... +options.compilerArgs.add("-Aminestom.extension.version=${rootProject.version}") +``` + +Der Processor validiert dabei, dass der Entrypoint existiert und die richtige +Basisklasse erweitert — die handgepflegte Variante fällt erst zur Laufzeit auf. + +### 5.3 OLF-L5-02: OLF-Fork statt archiviertes Upstream + +**Regel.** Extension-fähige Projekte nutzen `net.onelitefeather:minestom-extensions` +(über `minestom-extensions-bom`). + +**Begründung.** Titan nutzt heute `dev.hollowcube:minestom-ce-extensions:1.2.0`. +Das Upstream-Repository `hollow-cube/minestom-ce-extensions` ist archiviert; der +OneLiteFeather-Fork (bei Cygnus in Version 2.1.1 im Einsatz) hat identische +Paketnamen, wird gepflegt und liefert zusätzlich den Annotation Processor aus +OLF-L5-01. Beim Wechsel entfällt außerdem die JitPack-Proxy-Repository-Definition, +die Titan nur wegen `DependencyGetter` braucht. + +### 5.4 OLF-L5-03: Alles, was der Host liefert, ist `compileOnly` + +**Regel.** Ein Extension-Modul deklariert Minestom, das Extension-Framework, +CloudNet und `:common` als `compileOnly`. Gebündelt wird nur, was ausschließlich +diese Extension braucht. + +**Begründung.** Titans `:bridge` macht das bereits vollständig richtig und ist +die Vorlage für die neuen Extension-Module. Wird eine vom Host gelieferte +Bibliothek mitgebündelt, existiert sie zur Laufzeit zweimal in zwei +Classloadern — die Fehlerbilder daraus (`NoSuchMethodError`, `ClassCastException` +zwischen identisch benannten Typen) sind teuer zu diagnostizieren. + +--- + +## 6. Anhang A — Checkstyle- und ArchUnit-Regelabbildung + +> **Die Durchsetzungsschicht existiert bei OLF bereits.** Falco hat ein eigenes, +> nie publiziertes Modul `falco-archunit` mit **41 ArchUnit-Regeln** in fünf +> Testklassen, die als normale JUnit-Tests laufen. Mehrere davon sind exakt die +> Regeln dieses Dokuments — `everyPublishedPackageDeclaresNullness` ist OLF-L3-01, +> `publishedModulesOnlyUseDeclaredDependencies` ist OLF-L2-01, +> `publicApiIsMarkedExperimental` ist OLF-L4-06, `publicClassesAreFinal` und +> `utilityClassesHideTheirConstructor` sind OLF-L4-05, `noMutableStaticFields` +> ist OLF-L2-05, `onlySlf` / `loggerFieldShape` / `noPrintStackTrace` sind +> OLF-L4-08. +> +> Die Tabelle unten ist damit **keine Konstruktionsanleitung mehr, sondern eine +> Abbildung auf vorhandenen Code.** Falcos Implementierung wird kopiert, nicht +> nachgebaut. Ihr Stil ist ebenfalls zu übernehmen: jede Regel endet auf +> `.because(...)` mit der echten Begründung, Ausnahmen (Records, Enums, +> Throwables, Minestom-Subklassen) stehen in der Regel statt in einer +> Unterdrückungsliste, und das Regel-Javadoc benennt die Grenze der Regel +> ausdrücklich — die Nullability-Regel etwa prüft, *dass* der Default deklariert +> ist, nicht dass eine Signatur ihn einhält. + +| Regel-ID | Werkzeug | Konkret | +|---|---|---| +| OLF-L1-01 | Review + Grep-Task | Kein `toolchain`/`publishing`-Block im Modul-Buildfile | +| OLF-L2-01 | ArchUnit | `layeredArchitecture()` | +| OLF-L2-02 | ArchUnit | `noClasses().that().arePublic().and().resideInAPackage("..api..").should().haveSimpleNameEndingWith("Impl")` — die Sichtbarkeit ist der Punkt, nicht der Name | +| OLF-L2-03 | ArchUnit | `classes().should().resideInAPackage("net.onelitefeather.titan..")` | +| OLF-L2-05 | ArchUnit | `fields().that().areStatic().and().arePublic().should().beFinal()`, plus Ausnahmeliste für SPI-Holder | +| OLF-L3-01 | ArchUnit | Paket-Annotation `@NotNullByDefault` vorhanden | +| OLF-L3-02 | ArchUnit | `noClasses().resideInAnyPackage("..utils", "..helper", "..misc")` | +| OLF-L4-01 | Checkstyle | `MissingJavadocType`, `JavadocType` mit `authorFormat` | +| OLF-L4-05 | Checkstyle | `HideUtilityClassConstructor`, `FinalClass` | +| OLF-L4-07 | Jacoco | `violationRules`, Schwelle schrittweise angehoben | +| OLF-L4-08 | Checkstyle | `RegexpSinglelineJava` auf `System\.(out\|err)` | + +**Bewusst nicht automatisiert.** OLF-L1-02 (BOM-Nutzung), OLF-L1-03 (Modulrolle), +OLF-L1-04 (Release-Tooling), OLF-L2-04 (Reuse vor Reimplementierung), +OLF-L3-03 (Event-Platzierung), OLF-L4-02 bis OLF-L4-04 (Pattern-Wahl), +OLF-L4-06 (`@ApiStatus`) und OLF-L5-01 bis OLF-L5-03 (Extension-Setup) sind +Entwurfsentscheidungen, die ein Werkzeug nicht beurteilen kann. Sie gelten im +Review — die Regel-ID im PR-Kommentar ersetzt die Diskussion über Geschmack. + +**Einführungsstrategie.** Alle Gates starten als Warnung mit einer Baseline, die +den Ist-Stand einschließt. Pro Migrationsphase (Anhang B) wird die Baseline für +den berührten Bereich entfernt und das Gate dort scharf geschaltet. Ein Gate, das +beim Einschalten 400 Verstöße meldet, wird abgeschaltet statt behoben. + +--- + +## 7. Anhang B — Migrationsplan Titan + +Fünf Phasen. Jede ist für sich lauffähig, testbar und mergebar; keine Phase +setzt voraus, dass eine spätere bereits begonnen wurde. + +### Phase 1 — `buildSrc` einführen (kein Produktionscode betroffen) + +- `buildSrc` mit `olf.java-conventions`, `olf.publish-conventions` anlegen +- Toolchain (5×), Test-Konfiguration (4×) und Publishing-Block (3×) dorthin + zusammenführen +- Checkstyle/ArchUnit als Warnung mit Voll-Baseline aktivieren +- `slf4j-api` als `implementation` und ein Binding als `runtimeOnly` explizit + deklarieren, statt sich auf Minestoms transitive Abhängigkeit zu verlassen + (OLF-L4-08) +- **Prüfbar:** `./gradlew build` liefert byte-gleiche Artefakte wie vorher + +### Phase 2 — Paket- und API-Hygiene + +- `net.onelitefeather.deliver` nach `net.onelitefeather.titan.api.deliver` + verschieben (OLF-L2-03) +- Redundante `permits`-Einträge (`TaskComponentImpl`, + `ServerDeliverComponentImpl`) aus der Wurzelklausel von `DeliverComponent` + entfernen — kosmetisch, kein Verstoß (OLF-L2-02). Die vier `*Impl` bleiben, wo + sie sind: package-private hinter Factory-Methoden ist das Zielbild. +- `package-info.java` mit `@NotNullByDefault` in allen Paketen anlegen, + redundante `@NotNull` entfernen (OLF-L3-01) +- Javadoc-Header auf öffentlichen Typen ergänzen (OLF-L4-01) +- **Prüfbar:** ArchUnit-Regeln L2-02, L2-03, L3-01 ohne Baseline grün + +### Phase 3 — Reuse statt Eigenbau + +- `common/utils` und `common/helper` fachlich auflösen (OLF-L3-02, Tabelle in + Abschnitt 3) +- `app/listener` nach Fachlichkeit untergliedern (OLF-L3-03) +- `ThreadHelper` und `SingletonFeatureManagerProvider` in Titan löschen und aus + Butterfly beziehen (OLF-L2-04). **Vorbedingung:** Butterfly muss sie als + konsumierbares Artefakt bereitstellen — heute liegen sie dort in + `minestom/feature` und `bukkit/utils` doppelt und gehören plattformneutral nach + `butterfly:api`. Diese Konsolidierung ist ein eigener Butterfly-PR und blockiert + die übrigen Punkte dieser Phase nicht. +- Titans `MapProvider`/`MapEntry`/`MapPool` auf Aves' `AbstractMapProvider`, + `MapEntry.of(...)` und `PathFilter` umstellen. (`LobbyMap` erbt bereits von + `BaseMap` und hat bereits `sealed interface Builder permits LobbyMapBuilder` + plus Factory — dort ist nichts zu tun.) +- `GsonFileHandler` → `ModernGsonFileHandler`: die von `MapProvider` genutzte + Variante ist in Aves `@Deprecated(since = "1.9.0", forRemoval = true)` +- `SitHelper` zum Service mit Interface machen, `NavigationHelper` als Vorlage + (OLF-L4-04) +- **Prüfbar:** Bestehende Tests grün, `common`-Klassenzahl sinkt + +### Phase 4 — Bootstrap extrahieren + +- `:bootstrap`-Modul anlegen; aus `TitanApplication.main()` werden + `ServiceBootstrap` (Bind-Host/Port, Working-Dir, Konsole), + `VelocityAuthResolver` und `LuckPermsBootstrap` +- Cygnus' `ServiceBootstrap` ist die Vorlage — inklusive Tests + (`ServiceBootstrapTest`, `StopCommandTest`) +- Der Reflection-Hack für `ExtensionBootstrap(MinecraftServer)` wird beim + Wechsel auf den OLF-Fork (OLF-L5-02) geprüft; bietet der Fork einen + öffentlichen Konstruktor, entfällt er ersatzlos +- `app/Titan.java` und `setup/Titan.java` teilen sich die extrahierte + Registrierungslogik +- **Prüfbar:** Bootstrap-Klassen haben Tests; `main()` unter 30 Zeilen + +### Phase 5 — Extension-Split + +- Wechsel auf `net.onelitefeather:minestom-extensions` (OLF-L5-02) +- `:app` wird zu `:lobby` als Extension-Modul, `:setup` ebenso; beide mit + `compileOnly` auf Host-Abhängigkeiten (OLF-L5-03) +- `extension.json` überall über Annotation Processor (OLF-L5-01) +- Butterfly als Extension deployen statt shaden; Butterfly-Repo auf Release + Please migrieren (OLF-L1-04) +- AOT-Cache-Training auf den Host-Jar plus Extensions anpassen +- **Prüfbar:** Host startet ohne Extensions; Lobby-Features erscheinen erst mit + `titan-lobby.jar` in `extensions/` + +### Was ausdrücklich nicht Teil des Plans ist + +- Kein Umschreiben funktionierender Fachlogik ohne Regelbezug. Sit-, Elytra- und + Tickle-Verhalten bleiben identisch; sie ziehen nur um. +- Kein Wechsel des Formatierungswerkzeugs. Titans Spotless-Setup mit + `header.java` und dem Eclipse-Profil bleibt; Checkstyle prüft Struktur, nicht + Formatierung. (`.editorconfig` aus Cygnus/Butterfly kann ergänzt werden, ist + aber keine Regel.) +- Keine Änderung am CloudNet-Deployment oder an der LuckPerms-Einbindung über + das hinaus, was Phase 4 und 5 ohnehin berühren. + +--- + +## 8. Offene Punkte + +1. **Reflection-Hack im Bootstrap.** Ob `ExtensionBootstrap` im OLF-Fork einen + öffentlichen Konstruktor mit `MinecraftServer` anbietet, ist noch zu prüfen. + Falls nicht, ist ein Upstream-PR gegen den Fork der saubere Weg — der Hack + bleibt sonst dauerhaft in Phase 4 stehen. +2. **Coverage-Schwelle.** Der Startwert für das Jacoco-Gate ist noch zu + bestimmen. Vorschlag: Ist-Stand pro Modul messen, minus 5 Prozentpunkte + Puffer, danach pro Phase anheben. +3. **`:api` als publiziertes Artefakt.** Titan publiziert derzeit `titan-app`, + `titan-setup` und `titan-bridge`, aber nicht `:api`. Wenn `:api` ein echter + Contract für andere Projekte werden soll, gehört es publiziert — und braucht + dann `@ApiStatus`-Disziplin (OLF-L4-06) und eine Kompatibilitätszusage. + ManisGame versioniert sein `shared:api` bewusst eigenständig + (`version = "0.5.0"` im Modul-Buildfile, unabhängig vom Root) — das ist die + Vorlage, falls Titans `:api` publiziert werden soll. +4. **`ThreadHelper` org-weit konsolidieren.** Vier Kopien in drei Projekten + (OLF-L2-04). Der Zielort ist zu entscheiden: `butterfly:api` (plattformneutral, + nah an den bestehenden Nutzern) oder Aves (allgemeiner, aber + theEvilReaper-Hoheit). Diese Entscheidung betrifft nicht nur Titan und sollte + vor Phase 3 fallen. +5. **Verbindlichkeit für Bestandsprojekte.** Dieses Dokument beschreibt einen + Standard, den derzeit kein Projekt vollständig erfüllt — Tamias wendet sein + eigenes Convention-Plugin nicht überall an, Cygnus nutzt kein `@ApiStatus`, + Xerus keine `package-info`. Zu klären ist, ob der Standard nur für neue + Projekte und berührten Code gilt (Empfehlung) oder ob Bestandsprojekte + nachziehen müssen. diff --git a/docs/rollout-log.md b/docs/rollout-log.md new file mode 100644 index 00000000..ee34c5d4 --- /dev/null +++ b/docs/rollout-log.md @@ -0,0 +1,43 @@ +# Rollout-Log + +Nachweis darüber, welches Feature wann auf welcher Freigabestufe stand. Erfüllt +NFR-011 aus [`spec-lobby-saison-events.md`](spec-lobby-saison-events.md). + +**Diese Datei wird bei jedem Stufenwechsel ergänzt, nicht überschrieben.** Alte +Zeilen bleiben stehen — der Verlauf ist der Zweck. + +## Die Stufen + +| Stufe | Wer sieht es | Berechtigung | +|---|---|---| +| `intern` | nur das Team | `titan.feature.internal` | +| `premium` | Team **und** Premium-Spieler | `titan.feature.premium` | +| `ga` | alle Spieler | — | +| `aus` | niemand (Notausschalter) | — | + +Der Notausschalter schlägt jede Stufe und jedes Zeitfenster. Die Prüfreihenfolge +ist in US-3.07 festgelegt: erst Notausschalter, dann Stufe, dann Zeitfenster. + +## Verlauf + +| Datum | Feature | von → nach | Grund | Verantwortlich | +|---|---|---|---|---| +| — | — | — | noch kein Eintrag | — | + +## Wie ein Eintrag entsteht + +Ein Stufenwechsel wird an zwei Stellen festgehalten, und beide sind Pflicht: + +1. **Hier**, als neue Zeile mit Datum, Feature, Übergang, Grund und + verantwortlicher Person. +2. **Im Log der Anwendung**, automatisch beim Wechsel (US-3.09). + +Der Grund ist das Feld, das später zählt. „Auf premium gehoben" ist keine +Begründung; „interne Prüfung ohne Befund über zwei Wochen" ist eine. + +## Rücknahmen + +Eine Rücknahme (etwa `ga` → `aus`) bekommt eine eigene Zeile mit dem Grund und, +sobald bekannt, einen Verweis auf die Ursache. Zeilen werden nicht gelöscht, +wenn ein Feature später erneut freigegeben wird — gerade der zweite Anlauf ist +die interessante Information. diff --git a/docs/spec-lobby-saison-events.md b/docs/spec-lobby-saison-events.md new file mode 100644 index 00000000..d9cee2af --- /dev/null +++ b/docs/spec-lobby-saison-events.md @@ -0,0 +1,378 @@ +# Anforderungen: Titan-Lobby — Saison, Zeit und gestufte Auslieferung + +**Verantwortlichkeiten:** Konzept: @TheMeinerLP · Anforderungen gepflegt von: @TheMeinerLP +**Stand:** 21.08.2026 +**Projekttyp:** Technisches Projekt (Rolle „Als Entwickler/Betreiber", ergänzt um Spielersicht wo das Verhalten sichtbar ist) +**Baut auf:** [`olf-minestom-project-standard.md`](olf-minestom-project-standard.md) · [`event-modi-plan.md`](event-modi-plan.md) + +--- + +## 1. Kontext & Ausgangslage + +Titan ist der Lobby-Server des OneLiteFeather-Netzwerks auf Minestom. Er lädt +Welten heute über Minestoms `AnvilLoader` und wählt die aktive Lobby-Welt über +die System-Property `TITAN_LOBBY_MAP`. Ein Wert `halloween` ist im `setup`-Modul +bereits als Default verdrahtet — der Mechanismus für saisonale Lobbys existiert +also im Ansatz, aber ohne Zeitplan, ohne Rückfallebene und ohne Möglichkeit, +etwas zuerst nur einem Teil der Spieler zu zeigen. + +Gleichzeitig ist mit **Falco** eine eigene Engine entstanden, die Minestoms +Chunk-Loader und Lichtsystem ersetzt und deren `falco-instance` einen eigenen +Entladepfad mitbringt. Titan soll darauf wechseln — sowohl weil die eigene Engine +gepflegt wird, als auch weil die Lichtsteuerung Voraussetzung für die geplante +Echtzeit-Tageszeit ist. + +Das Vorhaben bündelt sechs Anforderungen, die technisch dieselbe Grundlage +brauchen: + +1. Falco als Chunk-Loader und Lichtsystem statt Minestoms Standardimplementierung +2. Saisonale Lobbys für Halloween und Winter, vorbereitet für weitere Spielmodi +3. Jahreszeiten und eine an Berlin gekoppelte Echtzeit-Tageszeit +4. Gestufte Auslieferung: interne Tests → Lite-Spieler → allgemeine Freigabe +5. Anzeige der Build-Server für berechtigte Teammitglieder +6. Portale zum Serverwechsel (optional, spätere Stufe) + +Resource Packs sind ausdrücklich **später** vorgesehen und in dieser Fassung nur +als Ausbaustufe umrissen, nicht ausspezifiziert. + +### Was der Research dazu beigetragen hat + +Zwei Befunde aus [`event-modi-plan.md`](event-modi-plan.md) prägen diese +Anforderungen und sind der Grund für einige Zuschnitte, die sonst willkürlich +wirken würden: + +- **Deko allein bewegt keine Spielerzahlen** (Deep Rock Galactic: kosmetische + Oktober-Events −0,37 % / −12,16 % / −4,92 %; inhaltliche Seasons +154 % / + +59 % / +142 %). Deshalb ist der Aufwand für saisonale Optik in dieser Spec + strikt auf „Daten statt Code" gedeckelt. +- **Wiederverwendung ist die Architektur, nicht die Sparmaßnahme.** InnoGames zu + ihrem Saison-Event in der sechsten Iteration: Währung und Laufzeit blieben + konstant, „leaving everything else open to change". Übertragen: Zeitfenster, + Zielgruppen-Stufen und Welt-Auswahl sind stabiler Code; alles Saisonale sind + austauschbare Daten. + +--- + +## 2. Ziele & Nicht-Ziele + +**Ziele:** + +* Titan lädt Welten über Falco statt über Minestoms `AnvilLoader` und steuert + Licht über `falco-light`. +* Eine saisonale Lobby lässt sich ohne Codeänderung ausrollen — neue Welt, neue + Konfiguration, fertig. +* Die Lobby zeigt Jahreszeit und Tageszeit passend zu Berlin, ohne dass jemand + etwas von Hand umstellt. +* Jedes Feature kann zuerst intern, dann für Lite-Spieler, dann für alle + freigegeben werden — über **einen** Mechanismus, nicht drei. +* Berechtigte Teammitglieder sehen die Build-Server im Navigator; alle anderen + sehen sie nicht. +* Der jeweils erreichte Rollout-Stand ist dokumentiert und nachvollziehbar. + +**Nicht-Ziele:** + +* **Kein** Resource-Pack-System in dieser Stufe (Stufe 6 umreißt es, mehr nicht). +* **Kein** Cosmetics- oder Belohnungssystem. +* **Keine** neuen Minispiele — die Lobby wird darauf *vorbereitet*, sie bekommt + sie nicht. +* **Keine** eigene Wetter-Simulation. Jahreszeit steuert Optik und Daten, nicht + Niederschlagslogik. +* **Kein** A/B-Testing. Die Rollout-Stufen sind sequenziell, nicht parallel. + +--- + +## 3. Stakeholder & Rollen + +| Rolle | Person | Interesse | +|---|---|---| +| Maintainer Titan | @TheMeinerLP | Architektur, Reviews, Deployment | +| Maintainer Falco | @TheMeinerLP | API-Stabilität der Engine, AGPL-Frage | +| Buildteam | (offen) | Liefert Saison-Welten, braucht klaren Übergabeweg | +| Betreiber | @TheMeinerLP | CloudNet-Templates, Rollout, Notausschalter | +| Lite-Spieler | — | Frühzugang als Gegenleistung für den Rang | +| Spieler | — | Funktionierende Lobby, keine halben Features | + +--- + +## 4. Ausbaustufen-Übersicht + +| Stufe | Kurzbeschreibung | Priorität | +|---|---|---| +| **Stufe 1** | Fundament: Falco-Umstieg, Welt-Auswahl absichern | Must | +| **Stufe 2** | Zeit: Jahreszeiten + Echtzeit-Tageszeit Berlin | Must | +| **Stufe 3** | Freigabe-Stufen: intern → Lite → GA | Must | +| **Stufe 4** | Saison-Pakete: Halloween und Winter als Daten | Should | +| **Stufe 5** | Build-Server im Navigator | Should | +| **Stufe 6** | Resource Packs pro Saison | Could | +| **Stufe 7** | Portale zum Serverwechsel | Could | + +Die Reihenfolge ist keine Empfehlung, sondern eine Abhängigkeitskette: Stufe 3 +braucht Stufe 1 (Gate greift auf die Welt-Auswahl zu), Stufe 4 braucht Stufe 2 +und 3. + +--- + +## 5. Nicht-funktionale Anforderungen + +| ID | Kategorie | Anforderung (EARS) | Priorität | +|---|---|---|---| +| NFR-001 | Kompatibilität | The Lobby shall mit der Minestom-Version kompatibel bleiben, die der `aonyx-bom` vorgibt. | Must | +| NFR-002 | Betrieb | If eine konfigurierte Saison-Welt beim Start nicht vorhanden ist, then shall die Lobby mit der Standardwelt starten und eine Warnung mit dem gesuchten Weltnamen protokollieren. | Must | +| NFR-003 | Betrieb | The Lobby shall ohne installiertes Saison-Paket vollständig funktionsfähig starten. | Must | +| NFR-004 | Betrieb | The Ausrollen einer Saison shall keinen Neustart der CloudNet-Node oder der Bridge erfordern. | Must | +| NFR-005 | Sicherheit | If ein Spieler ohne die erforderliche Berechtigung ein Build-Server-Ziel anwählt, then shall die Lobby den Wechsel verweigern und das Ziel gar nicht erst anzeigen. | Must | +| NFR-006 | Korrektheit | The Zeitsteuerung shall Zeitzonen- und Sommerzeitwechsel für `Europe/Berlin` korrekt behandeln, ohne dass ein Neustart nötig wird. | Must | +| NFR-007 | Testbarkeit | The Zeitsteuerung shall über eine injizierte `Clock` testbar sein, sodass Tests kein Warten auf reale Zeit benötigen. | Must | +| NFR-008 | Performance | While die Lobby läuft, shall das Setzen der Tageszeit keine spürbare Tick-Verzögerung verursachen (Aktualisierung höchstens einmal pro Sekunde, nicht pro Tick). | Should | +| NFR-009 | Wartbarkeit | The Anzahl der Konstanten in `TitanFeatures` shall zwölf nicht überschreiten; der Build shall bei Überschreitung fehlschlagen. | Should | +| NFR-010 | Wartbarkeit | If ein Saison-Paket sein hinterlegtes Enddatum um mehr als zwölf Monate überschritten hat, then shall der Build fehlschlagen. | Should | +| NFR-011 | Dokumentation | The Rollout-Stand jedes Features shall in einem versionierten Dokument nachvollziehbar sein (Stufe, Datum, Verantwortlicher). | Must | +| NFR-012 | Lizenz | The Lobby shall keine Abhängigkeit einbinden, deren Lizenz mit der veröffentlichten Lizenz von Titan unvereinbar ist. | Must | +| NFR-013 | Betrieb | When ein Saison-Zeitfenster endet, shall der Übergang gestaffelt erfolgen, sodass nicht alle Spieler gleichzeitig transferiert werden. | Should | + +--- + +## 6. User Stories + +### Stufe 1 — Fundament + +| ID | Story | Akzeptanzkriterium (EARS) | Schnittstelle | Priorität | Status | +|---|---|---|---|---|---| +| US-1.01 | Als Betreiber möchte ich Welten über Falco laden, damit wir unsere eigene Engine nutzen und Ladefehler nicht als „Chunk fehlt" durchgehen. | When eine Instanz erzeugt wird, shall die Lobby einen `FalcoAnvilLoader` als `ChunkLoader` setzen statt Minestoms `AnvilLoader`. | `net.onelitefeather.falco.anvil.FalcoAnvilLoader(Path, Key)` | Must | offen | +| US-1.02 | Als Betreiber möchte ich, dass ein Lesefehler den Chunk nicht stillschweigend neu generiert, damit gebaute Welten nicht überschrieben werden. | If ein Chunk nicht gelesen werden kann, then shall der Ladevorgang eine Ausnahme werfen und der Chunk shall nicht neu generiert werden. | `AnvilFault`, `ChunkDataException` | Must | offen | +| US-1.03 | Als Betreiber möchte ich Licht über `falco-light` steuern, damit die Lobby vollständig ausgeleuchtet ist und die Tageszeit später korrekt wirkt. | When ein Chunk geladen wird, shall die Lobby dessen Licht über `ChunkLightService` berechnen. | `ChunkLightService`, `ChunkLightScheduler` | Must | offen | +| US-1.04 | Als Betreiber möchte ich bei falsch gesetzter Welt-Property eine verständliche Meldung, damit ein Tippfehler kein Rätsel ist. | If die über `TITAN_LOBBY_MAP` benannte Welt nicht existiert, then shall die Lobby den gesuchten Namen und die gefundenen Welten protokollieren und mit der Standardwelt starten. | `MapPool.peekMap()` | Must | offen | +| US-1.05 | Als Entwickler möchte ich, dass die Welt-Property immer gilt, damit sich lokal und in Produktion nichts unterschiedlich verhält. | The Welt-Auswahl shall die Property unabhängig von der Anzahl vorhandener Welten auswerten. | `MapPool.peekMap()` | Must | offen | +| US-1.06 | Als Betreiber möchte ich Welten pro Saison als eigenes Verzeichnis ablegen, damit der Wechsel ohne Codeänderung möglich ist. | The Lobby shall die aktive Welt aus einem Verzeichnis unter `worlds/` laden, dessen Name konfigurierbar ist. | `worlds//` | Must | offen | + +### Stufe 2 — Jahreszeiten und Echtzeit-Tageszeit + +**Entwurfsentscheidung: beide Abbildungen sind Strategien.** Sowohl die +Uhrzeit-Abbildung als auch die Jahreszeitgrenzen werden als +Strategy-Pattern gebaut. Das erlaubt, Variante A und B gegeneinander zu testen +und B später nachzuliefern, ohne den Aufrufcode anzufassen. Details in +Abschnitt 6a. + +| ID | Story | Akzeptanzkriterium (EARS) | Schnittstelle | Priorität | Status | +|---|---|---|---|---|---| +| US-2.01 | Als Spieler möchte ich, dass die Lobby-Tageszeit meiner echten Tageszeit entspricht, damit sich die Welt lebendig anfühlt. | While die Lobby läuft, shall die Tageszeit der Instanz der aktuellen Uhrzeit in `Europe/Berlin` entsprechen. | `Instance#setTime`, `setTimeRate(0)` | Must | offen | +| US-2.02 | Als Entwickler möchte ich, dass der eingebaute Tageszyklus abgeschaltet ist, damit unsere Zeitsteuerung nicht gegen Minestom arbeitet. | The Lobby shall die Zeitrate der Instanz auf 0 setzen und die Zeit ausschließlich selbst setzen. | `Instance#setTimeRate` | Must | offen | +| US-2.03 | Als Entwickler möchte ich die Zeitquelle austauschen können, damit Tests deterministisch sind. | The Zeitsteuerung shall ihre Zeit aus einer injizierten `java.time.Clock` beziehen und nicht aus `Instant.now()`. | `java.time.Clock` | Must | offen | +| US-2.04 | Als Betreiber möchte ich, dass Sommerzeit korrekt behandelt wird, damit im Oktober nichts um eine Stunde verrutscht. | When die Sommerzeitumstellung in `Europe/Berlin` stattfindet, shall die Lobby-Tageszeit ohne Neustart korrekt weiterlaufen. | `ZoneId.of("Europe/Berlin")` | Must | offen | +| US-2.05 | Als Entwickler möchte ich die Uhrzeit-Abbildung austauschen können, damit wir lineare und astronomische Variante vergleichen können, ohne den Aufrufcode zu ändern. | The Zeitsteuerung shall die Abbildung von Realzeit auf Spielzeit über eine austauschbare Strategie beziehen. | `DayTimeStrategy` | Must | offen | +| US-2.06 | Als Betreiber möchte ich die lineare Abbildung als Standard, damit die Stufe ohne astronomische Berechnung nutzbar ist. | The Lobby shall ohne abweichende Konfiguration die lineare Abbildung verwenden. | `LinearDayTimeStrategy` | Must | offen | +| US-2.07 | Als Betreiber möchte ich später auf die astronomische Abbildung wechseln können, damit im Dezember spät hell wird. | Where die astronomische Strategie konfiguriert ist, shall die Lobby Sonnenauf- und -untergang für Berlin auf die Spielzeit abbilden. | `SolarDayTimeStrategy` | Could | offen | +| US-2.08 | Als Entwickler möchte ich beide Abbildungen gegen dieselben Testfälle prüfen, damit der Vergleich belastbar ist. | The Testsuite shall beide Strategien gegen denselben Satz fester Zeitpunkte prüfen. | Testfall je Strategie | Should | offen | +| US-2.09 | Als Spieler möchte ich, dass die Lobby die aktuelle Jahreszeit widerspiegelt, damit sie sich über das Jahr verändert. | The Lobby shall die aktuelle Jahreszeit aus dem Datum in `Europe/Berlin` ableiten und als Zustand bereitstellen. | `Season`-Enum | Must | offen | +| US-2.10 | Als Entwickler möchte ich die Jahreszeitgrenzen austauschen können, damit wir meteorologische und astronomische Grenzen vergleichen können. | The Jahreszeit-Ermittlung shall über eine austauschbare Strategie erfolgen. | `SeasonBoundaryStrategy` | Must | offen | +| US-2.11 | Als Betreiber möchte ich meteorologische Grenzen als Standard, weil sie auf feste Monatsanfänge fallen und keine Berechnung brauchen. | The Lobby shall ohne abweichende Konfiguration meteorologische Jahreszeitgrenzen verwenden (1.3., 1.6., 1.9., 1.12.). | `MeteorologicalSeasonStrategy` | Must | offen | +| US-2.12 | Als Betreiber möchte ich auf astronomische Grenzen wechseln können, damit die Jahreszeit zu den Sonnenwenden passt. | Where die astronomische Strategie konfiguriert ist, shall die Lobby die Jahreszeit anhand von Tagundnachtgleichen und Sonnenwenden bestimmen. | `AstronomicalSeasonStrategy` | Could | offen | +| US-2.13 | Als Betreiber möchte ich eine Jahreszeit fest vorgeben können, damit ein Event unabhängig vom Kalender laufen kann. | Where eine Jahreszeit fest konfiguriert ist, shall die Lobby diese verwenden und keine Strategie befragen. | `FixedSeasonStrategy` | Should | offen | +| US-2.14 | Als Betreiber möchte ich, dass die Zeitaktualisierung günstig ist, damit sie den Tick nicht belastet. | The Zeitsteuerung shall die Tageszeit höchstens einmal pro Sekunde aktualisieren. | Scheduler | Should | offen | + +### Stufe 3 — Freigabe-Stufen + +| ID | Story | Akzeptanzkriterium (EARS) | Schnittstelle | Priorität | Status | +|---|---|---|---|---|---| +| US-3.01 | Als Entwickler möchte ich ein Feature zuerst nur intern sehen, damit wir es prüfen können, bevor es jemand anders sieht. | Where ein Feature auf Stufe „intern" steht, shall die Lobby es ausschließlich Spielern mit der Berechtigung `titan.feature.internal` zeigen. | `FeatureGate`, LuckPerms | Must | offen | +| US-3.02 | Als Betreiber möchte ich ein Feature auf Lite-Spieler ausweiten, damit wir es unter Last prüfen und Lite einen Vorteil hat. | Where ein Feature auf Stufe „lite" steht, shall die Lobby es Spielern der LuckPerms-Gruppe `lite` **und** Spielern mit `titan.feature.internal` zeigen. | `FeatureGate`, LuckPerms-Gruppe `lite` | Must | offen | +| US-3.03 | Als Betreiber möchte ich ein Feature allgemein freigeben, damit alle es sehen. | Where ein Feature auf Stufe „ga" steht, shall die Lobby es allen Spielern zeigen. | `FeatureGate` | Must | offen | +| US-3.04 | Als Betreiber möchte ich ein Feature sofort abschalten können, damit ein Fehler nicht bis zum nächsten Deployment sichtbar bleibt. | If der Notausschalter eines Features gesetzt ist, then shall die Lobby es unabhängig von Stufe und Zeitfenster niemandem zeigen. | Togglz-Flag | Must | offen | +| US-3.05 | Als Betreiber möchte ich, dass die Abschaltung ohne Neustart wirkt, damit die Reaktionszeit kurz ist. | When die Flag-Datei geändert wird, shall die Änderung innerhalb von zwei Sekunden wirksam sein. | `FileBasedStateRepository` | Must | offen | +| US-3.06 | Als Betreiber möchte ich Freigaben zeitlich planen, damit ein Event ohne Nachtschicht startet. | Where für ein Feature ein Zeitfenster konfiguriert ist, shall die Lobby es nur innerhalb dieses Fensters aktivieren. | eigene `ActivationStrategy` | Must | offen | +| US-3.07 | Als Entwickler möchte ich, dass die Prüfreihenfolge festgelegt ist, damit das Verhalten vorhersagbar bleibt. | The Freigabeprüfung shall in dieser Reihenfolge auswerten: Notausschalter, dann Berechtigungsstufe, dann Zeitfenster. | `FeatureGate` | Must | offen | +| US-3.08 | Als Betreiber möchte ich den aktuellen Stand im Spiel abfragen, damit ich nicht ins Log schauen muss. | When ein berechtigtes Teammitglied `/season status` ausführt, shall die Lobby je Feature Stufe, Zeitfenster und Notausschalter-Zustand ausgeben. | Command | Should | offen | +| US-3.09 | Als Betreiber möchte ich jeden Stufenwechsel dokumentiert haben, damit nachvollziehbar ist, wann was freigegeben wurde. | When ein Feature die Stufe wechselt, shall der Wechsel mit Zeitpunkt, alter und neuer Stufe protokolliert werden. | Log + `docs/rollout-log.md` | Must | offen | + +### Stufe 4 — Saison-Pakete + +| ID | Story | Akzeptanzkriterium (EARS) | Schnittstelle | Priorität | Status | +|---|---|---|---|---|---| +| US-4.01 | Als Betreiber möchte ich eine Saison als eigenes Paket ausliefern, damit sie ohne Kernänderung kommt und geht. | The Lobby shall Saison-Inhalte aus einem separat deploybaren Paket laden. | `SeasonalContent`-Contract | Should | offen | +| US-4.02 | Als Entwickler möchte ich, dass ein Paket sich vollständig zurückbaut, damit nach Saisonende keine Reste bleiben. | When ein Saison-Paket deaktiviert wird, shall es alle von ihm gesetzten Blöcke, Anzeigen und geplanten Aufgaben entfernen. | `SeasonalContent#deactivate` | Must | offen | +| US-4.03 | Als Betreiber möchte ich saisonale Werte ohne Neubau ändern, damit Textänderungen kein Deployment brauchen. | The Saison-Inhalte shall Materialien, Texte, Positionen und Zeitfenster aus einer Konfigurationsdatei beziehen. | JSON im Paket | Should | offen | +| US-4.04 | Als Entwickler möchte ich, dass ein unbekannter Effekt-Typ beim Übersetzen auffällt, nicht im Betrieb. | If eine Saison-Konfiguration einen unbekannten Effekt-Typ enthält, then shall das Laden mit einer benannten Fehlermeldung fehlschlagen. | `sealed interface SeasonEffect` | Should | offen | +| US-4.05 | Als Betreiber möchte ich bei zwei gleichzeitigen Paketen eine feste Reihenfolge, damit das Ergebnis nicht von der Ladereihenfolge abhängt. | Where mehrere Saison-Pakete gleichzeitig aktiv sind, shall die Lobby sie nach einem im Paket hinterlegten Prioritätswert anwenden. | Paket-Manifest | Should | offen | +| US-4.06 | Als Betreiber möchte ich, dass ein Paket nicht ein anderes voraussetzt, damit Deployment-Reihenfolgen egal sind. | The Saison-Pakete shall einander nicht direkt referenzieren. | ArchUnit-Regel | Must | offen | +| US-4.07 | Als Betreiber möchte ich vor dem Livegang sehen, wie es aussieht, ohne dass Spieler es sehen. | Where ein Spieler die Berechtigung `titan.season.preview` hat, shall die Lobby ihm Saison-Inhalte auch außerhalb des Zeitfensters zeigen. | `FeatureGate` | Should | offen | +| US-4.08 | Als Betreiber möchte ich beim Reaktivieren einer alten Saison Gewissheit, dass sie noch funktioniert. | Before eine Saison erneut aktiviert wird, shall ein Testlauf ihrer Kernpfade erfolgreich durchlaufen sein. | Testfall je Paket | Should | offen | + +### Stufe 5 — Build-Server im Navigator + +| ID | Story | Akzeptanzkriterium (EARS) | Schnittstelle | Priorität | Status | +|---|---|---|---|---|---| +| US-5.01 | Als Teammitglied möchte ich die Build-Server im Navigator sehen, damit ich ohne Befehl dorthin komme. | Where ein Spieler die Berechtigung `titan.navigator.buildserver` hat, shall der Navigator die verfügbaren Build-Server als Ziele anzeigen. | `NavigationHelper` | Should | offen | +| US-5.02 | Als Betreiber möchte ich, dass Spieler ohne Berechtigung diese Ziele gar nicht sehen, damit ihre Existenz nicht verrät, dass es sie gibt. | If ein Spieler die Berechtigung nicht hat, then shall der Navigator die Build-Server-Einträge weder anzeigen noch ihren Platz freihalten. | `NavigationHelper` | Must | offen | +| US-5.03 | Als Betreiber möchte ich, dass die Berechtigung auch beim Wechsel geprüft wird, damit ein manipulierter Klick nichts bewirkt. | When ein Wechsel zu einem Build-Server angefordert wird, shall die Lobby die Berechtigung erneut prüfen, bevor sie den Spieler weiterleitet. | `Deliver` | Must | offen | +| US-5.04 | Als Teammitglied möchte ich sehen, welche Build-Server gerade laufen, damit ich nicht auf einen gestoppten klicke. | The Navigator shall nur Build-Server anzeigen, die zum Zeitpunkt des Öffnens als erreichbar gemeldet sind. | CloudNet-Dienstliste | Should | offen | + +### Stufe 6 — Resource Packs (später) + +Bewusst grob gehalten. Ausspezifizierung erst, wenn Stufe 1–4 stehen. + +| ID | Story | Akzeptanzkriterium (EARS) | Schnittstelle | Priorität | Status | +|---|---|---|---|---|---| +| US-6.01 | Als Spieler möchte ich saisonale Texturen sehen, ohne bei jedem Serverwechsel neu zu laden. | The Lobby shall ein Basis-Paket und ein Saison-Paket mit getrennten Kennungen ausliefern. | `resource_pack_push` | Could | offen | +| US-6.02 | Als Betreiber möchte ich beim Saisonwechsel nur das Saison-Paket tauschen. | When die Saison wechselt, shall die Lobby ausschließlich das Saison-Paket entfernen und ersetzen, nicht alle Pakete. | `resource_pack_pop(uuid)` | Could | offen | +| US-6.03 | Als Betreiber möchte ich, dass ein hängender Client den Verbindungsaufbau nicht blockiert. | If ein Client nicht innerhalb einer konfigurierten Frist auf die Paketanfrage antwortet, then shall die Lobby fortfahren statt zu warten. | eigener Timeout | Could | offen | +| US-6.04 | Als Betreiber möchte ich Bedrock-Spieler korrekt behandeln, weil deren gemeldeter Status nicht zutrifft. | If ein Spieler über Geyser verbunden ist, then shall die Lobby ihn nicht anhand des gemeldeten Paketstatus bewerten. | Bedrock-Erkennung | Could | offen | + +### Stufe 7 — Portale (optional) + +| ID | Story | Akzeptanzkriterium (EARS) | Schnittstelle | Priorität | Status | +|---|---|---|---|---|---| +| US-7.01 | Als Spieler möchte ich durch ein Portal auf einen anderen Server wechseln, statt einen Navigator zu öffnen. | When ein Spieler einen als Portal definierten Bereich betritt, shall die Lobby ihn an den hinterlegten Zielserver weiterleiten. | `Deliver`, Bereichsprüfung | Could | offen | +| US-7.02 | Als Betreiber möchte ich Portale ohne Codeänderung definieren. | The Portale shall aus einer Konfigurationsdatei mit Bereich und Zielserver geladen werden. | JSON | Could | offen | +| US-7.03 | Als Betreiber möchte ich, dass ein Portal mit unerreichbarem Ziel den Spieler nicht ins Leere schickt. | If der Zielserver eines Portals nicht erreichbar ist, then shall die Lobby den Spieler an Ort und Stelle lassen und ihm eine Meldung anzeigen. | `Deliver` | Could | offen | +| US-7.04 | Als Betreiber möchte ich, dass Portale denselben Berechtigungsregeln folgen wie der Navigator. | Where ein Portal ein berechtigungspflichtiges Ziel hat, shall dieselbe Prüfung gelten wie für das entsprechende Navigator-Ziel. | `FeatureGate` | Could | offen | + +--- + +## 7. Offene Fragen / Risiken + +| Frage/Risiko | Auswirkung | Verantwortlich | Status | +|---|---|---|---| +| ~~Lizenzkonflikt Falco ↔ Titan~~ — **entschieden am 21.08.2026: Titan wechselt auf AGPL-3.0.** `LICENSE`, `header.java`, alle 97 getrackten Java-Header sowie die POM-Angaben in `app`, `setup` und `bridge` sind umgestellt. | Erledigt. Der Blocker für Stufe 1 ist damit weg. | @TheMeinerLP | **erledigt** | +| **Zustimmung der Mitautoren zum Lizenzwechsel.** Titan hat neben @TheMeinerLP weitere Urheber: theEvilReaper (~70 Commits), Joltras (~18), Yannick Lamprecht (2), dazu OLF-Organisationsaccounts. Ein Wechsel von Apache-2.0 auf AGPL-3.0 ändert die Bedingungen, unter denen deren Beiträge weitergegeben werden. | Ohne dokumentierte Zustimmung bleibt der Wechsel rechtlich angreifbar. Praktisch lösbar durch eine kurze schriftliche Bestätigung der Mitautoren, im Repository abgelegt. | @TheMeinerLP | **offen** | +| Falco ist als `@ApiStatus.Experimental` markiert; Signaturen können sich in einer Minor-Version ändern. | Umstellungsaufwand bei Falco-Updates | @TheMeinerLP | offen | +| `falco-instance` kann kein `SharedInstance` tragen. | Falls die Lobby mehrere Instanzen auf denselben Chunks braucht, entfällt dieses Modul (`falco-anvil` und `falco-light` sind davon nicht betroffen). | @TheMeinerLP | offen | +| Zeitpunkt der Extension-Umstellung aus dem OLF-Standard. | Fällt sie in Oktober/November, kollidiert sie mit dem Event — siehe `event-modi-plan.md`, Abschnitt 3a | @TheMeinerLP | offen | + +--- + +## 6a. Entwurf: zwei Strategien für Zeit und Jahreszeit + +**Entschieden:** Uhrzeit-Abbildung und Jahreszeitgrenzen werden beide als +Strategy-Pattern gebaut. Der Aufrufcode kennt nur die Schnittstelle; welche +Ausprägung läuft, entscheidet die Konfiguration. Damit lassen sich beide Varianten +gegeneinander testen, und die aufwendigere kommt später — ohne Umbau. + +### Tageszeit + +```java +/** + * Bildet einen Zeitpunkt der Realwelt auf die Tageszeit einer Minecraft-Welt ab. + * + * @author TheMeinerLP + * @version 1.0.0 + * @since 1.11.0 + */ +public interface DayTimeStrategy { + + /** Ein voller Minecraft-Tag in Ticks. */ + int TICKS_PER_DAY = 24_000; + + /** + * @param instant der Zeitpunkt, für den die Tageszeit gilt + * @param zone die Zeitzone, gegen die gerechnet wird + * @return die Tageszeit in Ticks, im Bereich [0, {@value #TICKS_PER_DAY}) + */ + @Contract(pure = true) + long ticksAt(Instant instant, ZoneId zone); +} +``` + +| Ausprägung | Verhalten | Stufe | +|---|---|---| +| `LinearDayTimeStrategy` | 24 reale Stunden gleichmäßig auf 24 000 Ticks; 12:00 Uhr ergibt Mittag | **Standard**, Stufe 2 | +| `SolarDayTimeStrategy` | Sonnenauf- und -untergang für Berlin auf die Spielzeit gelegt; im Dezember spät hell | Could, später | + +Die lineare Variante ist bewusst der Standard: Sie liefert den Nutzen fast +vollständig und hat keinen Berechnungsfehler, den man übersehen könnte. Die +astronomische ist die Verfeinerung — in Berlin schwankt der Sonnenaufgang +zwischen etwa 4:45 Uhr im Juni und 8:15 Uhr im Dezember, und genau das macht sie +sichtbar. + +**Was der Vergleich prüfen muss** (US-2.08): Beide Ausprägungen werden gegen +denselben Satz fester Zeitpunkte getestet — Sonnenwenden, Tagundnachtgleichen, +beide Sommerzeitumstellungen und ein gewöhnlicher Tag. Da die Zeitquelle eine +injizierte `Clock` ist, braucht kein Test reale Zeit. + +### Jahreszeit + +```java +/** + * Bestimmt, welche Jahreszeit an einem Datum gilt. + * + * @author TheMeinerLP + * @version 1.0.0 + * @since 1.11.0 + */ +public interface SeasonBoundaryStrategy { + + /** + * @param date das Datum in der Redaktionszeitzone + * @return die an diesem Tag geltende Jahreszeit + */ + @Contract(pure = true) + Season seasonAt(LocalDate date); +} +``` + +| Ausprägung | Grenzen | Stufe | +|---|---|---| +| `MeteorologicalSeasonStrategy` | feste Monatsanfänge: 1.3., 1.6., 1.9., 1.12. | **Standard**, Stufe 2 | +| `AstronomicalSeasonStrategy` | Tagundnachtgleichen und Sonnenwenden (um den 20./21.) | Could, später | +| `FixedSeasonStrategy` | gibt immer dieselbe Jahreszeit zurück | Should — Tests, Vorschau, Events außerhalb des Kalenders | + +Meteorologisch ist der Standard, weil die Grenzen auf feste Kalendertage fallen +und keine Berechnung brauchen. Der Unterschied zur astronomischen Variante +beträgt rund drei Wochen — spürbar, aber kein Grund, die Berechnung in Stufe 2 zu +ziehen. + +`FixedSeasonStrategy` ist nicht nur ein Testhilfsmittel: Sie ist der Weg, ein +Winter-Event im August vorzuführen, ohne an der Systemuhr zu drehen. + +### Warum Strategy und nicht Konfigurationsschalter + +Ein `if (astronomisch) … else …` an der Abbildungsstelle hätte denselben Effekt +und wäre kürzer. Drei Gründe sprechen dagegen: + +1. **Der Vergleich ist der Zweck.** Beide Varianten sollen gegeneinander getestet + werden. Als eigene Typen sind sie einzeln instanziierbar und einzeln testbar; + als Zweig einer Bedingung nicht. +2. **Die astronomische Variante bringt eigene Abhängigkeiten mit** (Sonnenstand, + geografische Position). Die gehören in ihre Klasse, nicht in den gemeinsamen + Pfad. +3. **`FixedSeasonStrategy` fällt gratis ab.** Bei einer Bedingung wäre die + Vorschaufunktion ein dritter Zweig; als Strategie ist sie eine zehnzeilige + Klasse. + +Beide Schnittstellen sind bewusst zustandslos und `@Contract(pure = true)` — sie +bekommen den Zeitpunkt übergeben, statt selbst auf die Uhr zu sehen. Die +`Clock` sitzt in der aufrufenden Zeitsteuerung (US-2.03), nicht in den Strategien. + +--- + +## 8. Abnahmekriterien + +- [x] Die Lizenzfrage Falco ↔ Titan ist entschieden: Titan steht unter AGPL-3.0 (21.08.2026). +- [ ] Die Zustimmung der Mitautoren zum Lizenzwechsel liegt schriftlich vor und ist im Repository abgelegt. +- [ ] Die Lobby lädt Welten über `FalcoAnvilLoader`; Minestoms `AnvilLoader` wird nicht mehr verwendet. +- [ ] Ein Lesefehler an einem Chunk führt zu einer Ausnahme, nicht zu einem neu generierten Chunk. +- [ ] Ein falsch gesetztes `TITAN_LOBBY_MAP` startet die Lobby mit der Standardwelt und protokolliert den gesuchten Namen. +- [ ] Die Tageszeit der Lobby entspricht der Uhrzeit in Berlin, auch über eine Sommerzeitumstellung hinweg. +- [ ] Die Zeitsteuerung ist mit einer festen `Clock` testbar; ein Test prüft Winter im Sommer. +- [ ] Ein Feature lässt sich nacheinander auf intern, lite und ga stellen, ohne dass Code geändert wird. +- [ ] Der Notausschalter wirkt innerhalb von zwei Sekunden und schlägt Stufe und Zeitfenster. +- [ ] Ein Spieler ohne `titan.navigator.buildserver` sieht die Build-Server nicht und kann sie auch durch einen manipulierten Klick nicht erreichen. +- [ ] Die Lobby startet ohne Saison-Paket vollständig funktionsfähig. +- [ ] Ein Saison-Paket lässt sich entfernen, ohne dass Reste in der Welt zurückbleiben. +- [ ] Der Rollout-Stand jedes Features ist in `docs/rollout-log.md` nachvollziehbar. + +--- + +## 9. Was diese Spec bewusst offen lässt + +Damit niemand diese Punkte für vergessen hält: + +- **Der Inhalt der Saisons.** Diese Spec beschreibt das Gerüst, nicht das + Halloween-Event selbst. Was Spieler tun können, ist ein eigenes Konzept — und + laut Research der Teil, der tatsächlich Wirkung hat. +- **Das Übergabeformat vom Buildteam.** Die Empfehlung aus dem Research (eine + `config.yml` im Weltordner, wie BlueDragonMC es macht) ist noch nicht als + Anforderung formuliert, weil das Buildteam dazu gehört werden sollte. +- **Cosmetics und Belohnungen.** Ausdrücklich Nicht-Ziel. +- **Die Frage, ob `titan-api` publiziert wird.** Betrifft den + `SeasonalContent`-Contract aus Stufe 4; siehe + [`olf-minestom-project-standard.md`](olf-minestom-project-standard.md). diff --git a/header.java b/header.java index 78de2d10..1b500fa4 100644 --- a/header.java +++ b/header.java @@ -1,15 +1,16 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ \ No newline at end of file + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ diff --git a/setup/build.gradle.kts b/setup/build.gradle.kts index ea3d336f..914f83b4 100644 --- a/setup/build.gradle.kts +++ b/setup/build.gradle.kts @@ -62,8 +62,8 @@ publishing { url = "https://github.com/OneLiteFeatherNET/titan" licenses { license { - name = "The Apache License, Version 2.0" - url = "http://www.apache.org/licenses/LICENSE-2.0.txt" + name = "GNU Affero General Public License v3.0" + url = "https://www.gnu.org/licenses/agpl-3.0.txt" } } developers { diff --git a/setup/src/main/java/net/onelitefeather/titan/setup/Titan.java b/setup/src/main/java/net/onelitefeather/titan/setup/Titan.java index 6518137e..5a08cb7d 100644 --- a/setup/src/main/java/net/onelitefeather/titan/setup/Titan.java +++ b/setup/src/main/java/net/onelitefeather/titan/setup/Titan.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.setup; diff --git a/setup/src/main/java/net/onelitefeather/titan/setup/TitanLauncher.java b/setup/src/main/java/net/onelitefeather/titan/setup/TitanLauncher.java index aefa2a25..07e11beb 100644 --- a/setup/src/main/java/net/onelitefeather/titan/setup/TitanLauncher.java +++ b/setup/src/main/java/net/onelitefeather/titan/setup/TitanLauncher.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.setup; diff --git a/setup/src/main/java/net/onelitefeather/titan/setup/commands/AppCommand.java b/setup/src/main/java/net/onelitefeather/titan/setup/commands/AppCommand.java index 8911ec40..cb609484 100644 --- a/setup/src/main/java/net/onelitefeather/titan/setup/commands/AppCommand.java +++ b/setup/src/main/java/net/onelitefeather/titan/setup/commands/AppCommand.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.setup.commands; diff --git a/setup/src/main/java/net/onelitefeather/titan/setup/commands/MapCommand.java b/setup/src/main/java/net/onelitefeather/titan/setup/commands/MapCommand.java index ff9c1a60..c7dc1581 100644 --- a/setup/src/main/java/net/onelitefeather/titan/setup/commands/MapCommand.java +++ b/setup/src/main/java/net/onelitefeather/titan/setup/commands/MapCommand.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.setup.commands; diff --git a/setup/src/main/java/net/onelitefeather/titan/setup/commands/SetupCommand.java b/setup/src/main/java/net/onelitefeather/titan/setup/commands/SetupCommand.java index d13eb744..c92974a6 100644 --- a/setup/src/main/java/net/onelitefeather/titan/setup/commands/SetupCommand.java +++ b/setup/src/main/java/net/onelitefeather/titan/setup/commands/SetupCommand.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.setup.commands; diff --git a/setup/src/main/java/net/onelitefeather/titan/setup/listener/PlayerConfigurationListener.java b/setup/src/main/java/net/onelitefeather/titan/setup/listener/PlayerConfigurationListener.java index 9a4e3c26..a245e517 100644 --- a/setup/src/main/java/net/onelitefeather/titan/setup/listener/PlayerConfigurationListener.java +++ b/setup/src/main/java/net/onelitefeather/titan/setup/listener/PlayerConfigurationListener.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.setup.listener; diff --git a/setup/src/main/java/net/onelitefeather/titan/setup/listener/PlayerSpawnListener.java b/setup/src/main/java/net/onelitefeather/titan/setup/listener/PlayerSpawnListener.java index 315741ab..51ac9f1d 100644 --- a/setup/src/main/java/net/onelitefeather/titan/setup/listener/PlayerSpawnListener.java +++ b/setup/src/main/java/net/onelitefeather/titan/setup/listener/PlayerSpawnListener.java @@ -1,17 +1,18 @@ /** - * Copyright 2025 OneLiteFeather Network + * Copyright (C) 2025 OneLiteFeather Network * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package net.onelitefeather.titan.setup.listener;