From 977a47d07b9179cf7ba980935c8b3c06fa10c471 Mon Sep 17 00:00:00 2001 From: TheMeinerLP Date: Fri, 28 Aug 2026 10:08:54 +0200 Subject: [PATCH 1/2] chore: relicense from Apache-2.0 to AGPL-3.0 Titan builds on Falco (falco-anvil, falco-light), OneLiteFeather's own Anvil chunk loader and light engine, which is AGPL-3.0 with no linking exception. A Minecraft server is a network service, so AGPL section 13 applies to anyone running a modified Titan. Replaces the licence text, the Spotless header template applied to all 97 tracked Java sources, and the POM licence blocks of the three published modules (app, setup, bridge). gradlew and gradlew.bat keep their own Apache header - that is Gradle's code, not ours. NOTE: Titan has contributors besides the maintainer (theEvilReaper, Joltras, Yannick Lamprecht, OLF org accounts). Relicensing changes the terms their contributions are distributed under, so their written consent should be recorded before this ships. --- .gitignore | 8 +- LICENSE | 862 ++++++++++++++---- README.md | 9 +- .../deliver/DeliverComponent.java | 21 +- .../onelitefeather/deliver/DeliverType.java | 21 +- .../deliver/ServerBuilderImpl.java | 21 +- .../deliver/ServerDeliverComponentImpl.java | 21 +- .../deliver/TaskBuilderImpl.java | 21 +- .../deliver/TaskComponentImpl.java | 21 +- .../titan/api/deliver/Deliver.java | 21 +- app/build.gradle.kts | 4 +- .../net/onelitefeather/titan/app/Titan.java | 21 +- .../titan/app/TitanApplication.java | 21 +- .../titan/app/commands/EndCommand.java | 21 +- .../titan/app/commands/StopCommand.java | 21 +- .../titan/app/helper/NavigationHelper.java | 21 +- .../titan/app/listener/DeathListener.java | 21 +- .../app/listener/ElytraBoostListener.java | 21 +- .../listener/ElytraStartFlyingListener.java | 21 +- .../listener/ElytraStopFlyingListener.java | 21 +- .../app/listener/NavigationListener.java | 21 +- .../listener/PlayerConfigurationListener.java | 21 +- .../app/listener/PlayerMoveListener.java | 21 +- .../app/listener/PlayerSpawnListener.java | 21 +- .../titan/app/listener/RespawnListener.java | 21 +- .../app/listener/SitDisconnectListener.java | 21 +- .../app/listener/SitDismountListener.java | 21 +- .../app/listener/SitLeavePacketListener.java | 21 +- .../titan/app/listener/SitListener.java | 21 +- .../titan/app/listener/TickleListener.java | 21 +- .../titan/app/player/CompatibilityUtil.java | 21 +- .../titan/app/player/TitanPlayer.java | 21 +- .../app/helper/NavigationHelperTest.java | 21 +- .../titan/app/listener/DeathListenerTest.java | 21 +- .../app/listener/ElytraBoostListenerTest.java | 21 +- .../ElytraStartFlyingListenerTest.java | 21 +- .../ElytraStopFlyingListenerTest.java | 21 +- .../app/listener/NavigationListenerTest.java | 21 +- .../PlayerConfigurationListenerTest.java | 21 +- .../app/listener/PlayerMoveListenerTest.java | 21 +- .../app/listener/PlayerSpawnListenerTest.java | 21 +- .../app/listener/RespawnListenerTest.java | 21 +- .../listener/SitDisconnectListenerTest.java | 21 +- .../app/listener/SitDismountListenerTest.java | 21 +- .../listener/SitLeavePacketListenerTest.java | 21 +- .../titan/app/listener/SitListenerTest.java | 21 +- .../app/listener/TickleListenerTest.java | 21 +- .../titan/app/testutils/DummyDeliver.java | 21 +- bridge/build.gradle.kts | 4 +- .../TitanBridgePermissionExtension.java | 21 +- .../common/argument/ArgumentMaterialType.java | 21 +- .../common/blockhandler/BannerHandler.java | 21 +- .../common/blockhandler/BeaconHandler.java | 21 +- .../titan/common/blockhandler/BedHandler.java | 21 +- .../common/blockhandler/CandleHandler.java | 21 +- .../common/blockhandler/JukeboxHandler.java | 21 +- .../common/blockhandler/SignHandler.java | 21 +- .../common/blockhandler/SkullHandler.java | 21 +- .../blockhandler/objects/BannerPattern.java | 21 +- .../common/blockhandler/objects/SignSide.java | 21 +- .../titan/common/config/AppConfig.java | 21 +- .../titan/common/config/AppConfigBuilder.java | 21 +- .../titan/common/config/AppConfigImpl.java | 21 +- .../common/config/AppConfigProvider.java | 21 +- .../common/config/InternalAppConfig.java | 21 +- .../titan/common/deliver/DeliverProvider.java | 21 +- .../common/deliver/MessageChannelDeliver.java | 21 +- .../titan/common/deliver/NoopDeliver.java | 21 +- .../titan/common/deliver/ServerConnector.java | 21 +- .../common/deliver/TitanServerConnector.java | 21 +- .../common/event/EntityDismountEvent.java | 21 +- .../common/helper/BlockHandlerHelper.java | 21 +- .../titan/common/helper/SitHelper.java | 21 +- .../titan/common/map/LobbyMap.java | 21 +- .../titan/common/map/LobbyMapBuilder.java | 21 +- .../titan/common/map/MapEntry.java | 21 +- .../titan/common/map/MapPool.java | 21 +- .../titan/common/map/MapProvider.java | 21 +- .../permission/TitanPermissionBridge.java | 21 +- .../titan/common/utils/Cancelable.java | 21 +- .../common/utils/CloudNetEnvironment.java | 21 +- .../titan/common/utils/Items.java | 21 +- .../SingletonFeatureManagerProvider.java | 21 +- .../titan/common/utils/Tags.java | 21 +- .../titan/common/utils/ThreadHelper.java | 21 +- .../titan/common/utils/TitanFeatures.java | 21 +- .../utils/component/TitanMiniMessageImpl.java | 21 +- .../common/utils/tags/PosTagSerializer.java | 21 +- .../ArgumentMaterialTypeIntegrationTest.java | 21 +- .../argument/ArgumentMaterialTypeTest.java | 21 +- .../common/config/AppConfigBuilderTest.java | 21 +- .../common/config/AppConfigImplTest.java | 21 +- .../config/AppConfigIntegrationTest.java | 21 +- .../titan/common/helper/SitHelperTest.java | 21 +- header.java | 23 +- setup/build.gradle.kts | 4 +- .../net/onelitefeather/titan/setup/Titan.java | 21 +- .../titan/setup/TitanLauncher.java | 21 +- .../titan/setup/commands/AppCommand.java | 21 +- .../titan/setup/commands/MapCommand.java | 21 +- .../titan/setup/commands/SetupCommand.java | 21 +- .../listener/PlayerConfigurationListener.java | 21 +- .../setup/listener/PlayerSpawnListener.java | 21 +- 103 files changed, 1750 insertions(+), 1180 deletions(-) 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/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; From de4c566d8faf1ec55c07602cac033669bc67e24d Mon Sep 17 00:00:00 2001 From: Phillipp Glanz <6745190+TheMeinerLP@users.noreply.github.com> Date: Fri, 28 Aug 2026 13:07:56 +0200 Subject: [PATCH 2/2] docs: project standard, event research and lobby season spec (#214) docs: add project standard, event research and lobby season spec Three documents that the upcoming lobby work builds on: - olf-minestom-project-standard.md: 23 architecture rules derived from ManisGame, Cygnus, Tamias and the theEvilReaper libraries, each with a rationale and an enforcement mechanism. Falco's falco-archunit module already enforces six of them and is the reference implementation. - event-modi-plan.md: research on seasonal events. Key finding, measured from Steam telemetry: cosmetic seasonal events move concurrent players by roughly zero (Deep Rock Galactic October: -0.37%, -12.16%, -4.92%) while content releases move them 20-150% and lift the floor for months. Decoration is brand upkeep, not a growth lever - so its cost must stay small. - spec-lobby-saison-events.md: the requirements themselves. 49 user stories across 7 stages, 13 non-functional requirements, EARS acceptance criteria and MoSCoW priorities, following the OLF requirement-engineering standard. - rollout-log.md: the record NFR-011 asks for, tracking which feature sat at which release stage. --- docs/event-modi-plan.md | 714 +++++++++++++++++ docs/olf-minestom-project-standard.md | 1018 +++++++++++++++++++++++++ docs/rollout-log.md | 43 ++ docs/spec-lobby-saison-events.md | 378 +++++++++ 4 files changed, 2153 insertions(+) create mode 100644 docs/event-modi-plan.md create mode 100644 docs/olf-minestom-project-standard.md create mode 100644 docs/rollout-log.md create mode 100644 docs/spec-lobby-saison-events.md 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).