Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
136 commits
Select commit Hold shift + click to select a range
a302dfe
Small tweaks and changes, remove NeoForge, rework the entire protocol
Aeltumn Aug 12, 2025
f363aa5
Start on registry system
Aeltumn Aug 12, 2025
ff08d7a
Concept for server-side viaversion rewriting of item stack
Aeltumn Aug 12, 2025
9fc4e3e
Enable encoder cache for component types
Aeltumn Aug 12, 2025
4606a3b
Move all old rules to new components
Aeltumn Aug 13, 2025
dcbe612
Update component usage
Aeltumn Aug 13, 2025
2347a2a
Ngl codecs are not that bad I was afraid of what I did not understand
Aeltumn Aug 13, 2025
6f9d347
Finish game and entity components
Aeltumn Aug 13, 2025
0c07fba
Fixing up things
Aeltumn Aug 13, 2025
36c10f7
Remove all redirect usages to fix #142 and more
Aeltumn Aug 13, 2025
3f2d889
Possibly hide errors from #143
Aeltumn Aug 13, 2025
10f9ab2
Set up a proper example
Aeltumn Aug 13, 2025
7a5b91f
Clean imports and prevent mouse click packet spam
Aeltumn Aug 13, 2025
70cde55
Implement highlightable component
Aeltumn Aug 13, 2025
7b9ad19
Not enough refactoring yet
Aeltumn Aug 13, 2025
fafaf53
Bring component definitions into API
Aeltumn Aug 14, 2025
9b9b3fa
Move it all to multiplatform
Aeltumn Aug 14, 2025
af35c57
Split paper API into legacy and modern
Aeltumn Aug 14, 2025
71f4024
Set up run-paper properly
Aeltumn Aug 14, 2025
ad962dc
Fix compiling of legacy paper impl
Aeltumn Aug 14, 2025
2e131cb
Fix compile and runtime errors
Aeltumn Aug 15, 2025
5ba52d7
Spotless and add entity hitbox color override
Aeltumn Aug 15, 2025
3af58f9
Fix GitHub pipeline
Aeltumn Aug 15, 2025
4484c61
Temp enable publishing snapshots on this branch
Aeltumn Aug 15, 2025
bd90f33
Switch to neoform for nms sources
Aeltumn Aug 15, 2025
841ff22
Fix runtime compilation of nms project
Aeltumn Aug 15, 2025
c7a39fc
Implement item and block item component holding
Aeltumn Aug 15, 2025
05883c8
Implement ViaVersion codec wrappers in paper impl
Aeltumn Aug 15, 2025
b80f67d
Implement networking on Paper side
Aeltumn Aug 15, 2025
04929a0
Implement first half of handshake protocol
Aeltumn Aug 16, 2025
e2c5a07
Working on handshake protocol
Aeltumn Aug 17, 2025
2307ed1
Improve list command to show other entrypoints
Aeltumn Aug 17, 2025
aa2b524
Finish initial version of handshaking protocol
Aeltumn Aug 17, 2025
66cac0a
Spotless
Aeltumn Aug 17, 2025
8299486
Polish and clean-up to handshake
Aeltumn Aug 17, 2025
67cdcb1
Lethal levels of cooking
Aeltumn Aug 17, 2025
22df0dd
Rewrite patches into plugin form
Aeltumn Aug 17, 2025
5bfe30e
Implementing proper API for playing Noxesium sounds
Aeltumn Aug 18, 2025
bcbca57
Finish commands for playing sounds and opening links
Aeltumn Aug 19, 2025
2f185f4
Finish smooth trident implementation
Aeltumn Aug 23, 2025
5c35b19
Add commands for setting components on anything
Aeltumn Aug 24, 2025
e186b3d
Add syncing of game & entity components, allow disabling hide UI debu…
Aeltumn Aug 24, 2025
bcde4b7
Fix a few bugs with entity components + Spotless
Aeltumn Aug 25, 2025
dc36ec1
Add loading qibs from config files
Aeltumn Aug 25, 2025
77e01ea
Fix entity component syncing
Aeltumn Aug 25, 2025
674a595
Start on folder syncing feature
Aeltumn Aug 25, 2025
13561f9
Split out folder syncing, new MCC packets
Aeltumn Sep 6, 2025
3c261ba
Fix up compile errors
Aeltumn Sep 6, 2025
37bf0d0
Add folder selection screen with browse dialog
Aeltumn Sep 6, 2025
c38e7ad
Move synced folders to separate config
Aeltumn Sep 7, 2025
d6c7364
Serialized registry synchronization
Aeltumn Sep 9, 2025
8973b48
Add block entity data packets
Aeltumn Sep 9, 2025
fee3eeb
Add explicitly registry dependent packets
Aeltumn Sep 9, 2025
a114d49
Spotless
Aeltumn Sep 9, 2025
33cc890
Support for transfering within proxy networks
Aeltumn Sep 9, 2025
3e3290f
Set the protocol to alpha to make it protocol incompatible with a fut…
Aeltumn Sep 9, 2025
4623e85
Fix sync start-up error at runtime
Aeltumn Sep 9, 2025
7a01044
Re-add missing method
Aeltumn Sep 9, 2025
652a5b1
Edit server-side methods
Aeltumn Sep 9, 2025
72523d4
Move the entire legacy module into its own package
Aeltumn Sep 9, 2025
38b39bb
Add proper reset method for components
Aeltumn Sep 9, 2025
1903116
Fix packages
Aeltumn Sep 9, 2025
f1d5f9f
Enable smooth trident
Aeltumn Sep 9, 2025
d001f8b
Fix encryption having kotlin dependency and safety check
Aeltumn Sep 9, 2025
3f441d4
Testing helps find bugs
Aeltumn Sep 9, 2025
7ae25bb
Spotless
Aeltumn Sep 9, 2025
1ecf600
Set version to alpha 1
Aeltumn Sep 10, 2025
c944eba
Write alpha 1 differently
Aeltumn Sep 10, 2025
865886b
Add entrypoint names to auth message
Aeltumn Sep 10, 2025
16e7e76
fix: Filter out components not in a client's registry in data sent to…
Aeltumn Sep 10, 2025
5c2dbdf
Resynchronize registries on server transfer properly
Aeltumn Sep 10, 2025
472fe77
Finish the folder edit screen
Aeltumn Sep 10, 2025
fe376ef
Working on the sync protocol
Aeltumn Sep 10, 2025
3e6a4f2
Finish basic file transmission protocol
Aeltumn Sep 10, 2025
94fc75a
fix: Fix renames/deletions not being synced properly
Aeltumn Sep 10, 2025
ed21776
feature: Add auto crlf to sync
Aeltumn Sep 11, 2025
62db9a2
Set version to alpha 2
Aeltumn Sep 11, 2025
f1bdf92
feature: Better transferring protocol
Aeltumn Sep 12, 2025
8defa2e
Debugging protocol
Aeltumn Sep 12, 2025
7038506
More debugging
Aeltumn Sep 12, 2025
8bbbf9f
Make transfer step back to awaiting registries
Aeltumn Sep 12, 2025
84fd0a2
Properly inform server of sudden handshake failures
Aeltumn Sep 12, 2025
9906af0
Set version to alpha 3
Aeltumn Sep 12, 2025
c460019
Slight tweak
Aeltumn Sep 12, 2025
6b174a2
Fix errors from duplicate feature registrations
Aeltumn Sep 17, 2025
c7d3769
Back to reading block entity components from NBT
Aeltumn Sep 17, 2025
4b134f0
Publicize Noxcrew's packet API
Aeltumn Sep 17, 2025
a27a35b
Skip expensive processing for types with no registered handlers
Aeltumn Sep 17, 2025
9fda8aa
Finish block entity components
Aeltumn Sep 17, 2025
b2ac3e4
Back to snapshot
Aeltumn Sep 17, 2025
32b053a
Rework paper networking to keep plugin channels secret
Aeltumn Sep 17, 2025
96e05a9
Support JSON serialization for packets
Aeltumn Sep 17, 2025
a39aa55
Clean up things
Aeltumn Sep 17, 2025
63dd7b4
Add new capabilities system to entrypoints
Aeltumn Sep 17, 2025
941532a
Keep pack download toast on-screen always
Aeltumn Sep 17, 2025
fb98219
Send installed mods to the server
Aeltumn Sep 17, 2025
f6ca7a6
Create an external paper API that is available for other mods
Aeltumn Sep 17, 2025
d5a1fcc
Make the external API set up itself
Aeltumn Sep 17, 2025
bbc1d4e
Support config phase in packet API
Aeltumn Sep 17, 2025
764e6c1
Add lazy packets
Aeltumn Sep 17, 2025
b7b2cb6
Tweaks for MCC impl
Aeltumn Sep 17, 2025
b163278
Fix compile issue
Aeltumn Sep 17, 2025
a5007c2
Fix bug with qib collision detection after teleports
Aeltumn Sep 17, 2025
e3f02ab
Implement qibs on Noxesium's server API
Aeltumn Sep 17, 2025
3a0855a
Add new settings and components for UI scaling
Aeltumn Sep 17, 2025
a57828f
Trying to make GUI scaling work
Aeltumn Sep 17, 2025
f5b7503
Disable scaling test for now
Aeltumn Sep 18, 2025
b96b479
Allow player to be null
Aeltumn Sep 18, 2025
0a7abff
Fixing other crashes
Aeltumn Sep 18, 2025
f1dc478
Avoid NPE
Aeltumn Sep 18, 2025
34c4281
Ensure packet processor occurs in order if bundles are involved
Aeltumn Sep 18, 2025
eec6cbe
Enable gradle cache on non-main branches
Aeltumn Sep 18, 2025
e964902
Disable pipeline for PRs
Aeltumn Sep 18, 2025
eb5aa54
Disable publishing for modules that don't need it
Aeltumn Sep 18, 2025
f039368
Publish only sources and no javadoc
Aeltumn Sep 18, 2025
db62a29
Finish GUI rescaling
Aeltumn Sep 20, 2025
ecfe14a
Finish UI scaling update
Aeltumn Sep 21, 2025
55a8915
Early config phase support
Aeltumn Sep 21, 2025
dd62aa5
Nearly finishing up config phase support
Aeltumn Sep 21, 2025
3f1a412
Make handshake less likely to explode
Aeltumn Sep 21, 2025
26f5d76
Fix issue with loading configs if scales isn't initialised
Aeltumn Sep 21, 2025
bb12cbe
Don't error for sending packets outside of registration time
Aeltumn Sep 23, 2025
46cc00b
Move ensureMain
Aeltumn Sep 23, 2025
74a474d
Trying whatever to make the config phase work
Aeltumn Sep 23, 2025
1b22bf7
Get rid of the config phase
Aeltumn Sep 23, 2025
f8262bc
Handshake protocol improvements and don't sync unchanged registries o…
Aeltumn Sep 24, 2025
57ce543
Packet versioning!
Aeltumn Sep 24, 2025
a189390
Put things back together again
Aeltumn Sep 24, 2025
d8771b8
Spotless
Aeltumn Sep 24, 2025
7c6d2ed
Finish packet converting
Aeltumn Sep 26, 2025
0951c40
Rewrite packet handler again to always preserve order
Aeltumn Sep 26, 2025
74a50e0
List as a beta snapshot
Aeltumn Sep 26, 2025
0af26cc
Switch a line around
Aeltumn Sep 26, 2025
a72c7b7
Spotless
Aeltumn Sep 26, 2025
1c1a7a5
Properly end loop
Aeltumn Sep 26, 2025
1921c78
Remove test packet
Aeltumn Sep 26, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
11 changes: 3 additions & 8 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ on:
push:
branches: ["**"]
tags-ignore: ["**"]
pull_request:
release:
types: [published]
workflow_dispatch:
Expand All @@ -27,16 +26,12 @@ jobs:

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
with:
cache-read-only: false

- name: Gradle Build
run: ./gradlew build

- name: Clean Up NeoForge Artifacts
run: rm neoforge/build/libs/*-sources.jar

- name: Clean Up Fabric Artifacts
run: rm fabric/build/libs/*-sources.jar

- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
Expand All @@ -52,7 +47,7 @@ jobs:
fi

- name: Publish Snapshot
if: "${{ env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main' }}"
if: "${{ env.STATUS != 'release' && github.event_name == 'push' }}"
run: ./gradlew publish
env:
NOXCREW_MAVEN_PUBLIC_USERNAME: ${{ secrets.NOXCREW_MAVEN_PUBLIC_USERNAME }}
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Noxesium is directly developed by [Noxcrew](https://noxcrew.com/), creators of M
Noxesium is also automatically included on some versions of [Lunar Client](https://www.lunarclient.com/).

# Usage
Public builds of Noxesium are available on [Modrinth](https://modrinth.com/mod/noxesium) and [CurseForge](https://www.curseforge.com/minecraft/mc-mods/noxesium). Upcoming releases can be found on the [Releases](https://github.com/Noxcrew/noxesium/releases) page here on GitHub. Developers interested in using Noxesium as an API can find more information on the [Wiki page](https://github.com/Noxcrew/noxesium/wiki).
Public builds of Noxesium are available on [Modrinth](https://modrinth.com/mod/noxesium) and [CurseForge](https://www.curseforge.com/minecraft/mc-mods/noxesium). Upcoming releases can be found on the [Releases](https://github.com/Noxcrew/noxesium/releases) page here on GitHub. Developers interested in using Noxesium as an API can find more information on the [Wiki page](https://github.com/Noxcrew/noxesium/wiki).

# Features

Expand Down
4 changes: 4 additions & 0 deletions api/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# API Module

This module contains all code that does not depend on any of Minecraft's code. It contains both the api package with the API itself as well
as a core package with base Noxesium features.
13 changes: 11 additions & 2 deletions api/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
plugins {
id("noxesium.publishing")
}

dependencies {
implementation(libs.annotations)
implementation(libs.gson)
api(libs.annotations)
api(libs.gson)
api(libs.adventure.api)
api(libs.slf4j)
api(libs.guava)
api(libs.apache.commons)
api(libs.joml)
}
37 changes: 37 additions & 0 deletions api/src/main/java/com/noxcrew/noxesium/NoxesiumCapabilities.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.noxcrew.noxesium;

import com.noxcrew.noxesium.api.NoxesiumReferences;
import java.util.Collection;
import java.util.HashSet;
import net.kyori.adventure.key.Key;

/**
* Holds capabilities provided by the common Noxesium Fabric mod.
* These can be referenced by servers to detect which major Noxesium systems
* and features are available for usage.
*/
public class NoxesiumCapabilities {
/**
* The namespace used for common Noxesium capabilities.
*/
private static final String NAMESPACE = NoxesiumReferences.COMMON_ENTRYPOINT;

/**
* All capabilities of the common entrypoint.
*/
public static final Collection<Key> ALL_CAPABILITIES = new HashSet<>();

// There are no capabilities yet because the API is brand new... But here's some examples!
public static final Key V3_API_SUPPORT = register("v3_api_support");
public static final Key ANONYMOUS_PLAYER_HEADS = register("anonymous_player_heads");
public static final Key FUNCTIONAL_QIB_SYSTEM = register("functional_qib_system");

/**
* Registers a new capability.
*/
private static Key register(String id) {
var key = Key.key(NAMESPACE, id);
ALL_CAPABILITIES.add(key);
return key;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.noxcrew.noxesium.api;

import java.util.Collection;
import java.util.Collections;
import net.kyori.adventure.key.Key;

/**
* Extends the {@link NoxesiumEntrypoint} with client-sided methods.
* Can be defined in `fabric.mod.json` under `noxesium`.
*/
public interface ClientNoxesiumEntrypoint extends NoxesiumEntrypoint {
/**
* Returns the capabilities of this entrypoint. This should be a
* list of unique keys that the server can check against to determine
* if the client is capable of providing a certain feature.
* <p>
* Individual packets and registry entries are automatically synced, but
* this can be used for more generic concepts.
*/
default Collection<Key> getCapabilities() {
return Collections.emptySet();
}

/**
* Returns the version of this entrypoint.
*/
String getVersion();

/**
* Allows implementations to run pre-initialization steps such as registering
* serializers. This is guaranteed to run on all entrypoints before any are initialized.
*/
default void preInitialize() {}

/**
* Allows implementations to run initialization steps like constructing feature classes.
* This is guaranteed to run on all entrypoints before any are registered.
*/
default void initialize() {}
}
168 changes: 168 additions & 0 deletions api/src/main/java/com/noxcrew/noxesium/api/NoxesiumApi.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
package com.noxcrew.noxesium.api;

import com.noxcrew.noxesium.api.feature.NoxesiumFeature;
import com.noxcrew.noxesium.api.network.EntrypointProtocol;
import com.noxcrew.noxesium.api.network.PacketCollection;
import com.noxcrew.noxesium.api.registry.NoxesiumRegistries;
import com.noxcrew.noxesium.api.registry.NoxesiumRegistry;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Provides shared API for Noxesium's various available APIs.
*/
public class NoxesiumApi {
private static final NoxesiumApi INSTANCE = new NoxesiumApi();
private static final Logger logger = LoggerFactory.getLogger("Noxesium");

private final Map<Class<? extends NoxesiumFeature>, NoxesiumFeature> features = new HashMap<>();
private final Map<String, NoxesiumEntrypoint> entrypoints = new HashMap<>();
private final Set<PacketCollection> packets = new HashSet<>();
private final List<NoxesiumEntrypoint> activeEntrypoints = new ArrayList<>();
private NoxesiumSide side = NoxesiumSide.SERVER;

/**
* Returns the singleton instance of the Noxesium API.
*/
public static NoxesiumApi getInstance() {
return INSTANCE;
}

/**
* Returns the logger instance to use.
*/
public static Logger getLogger() {
return logger;
}

/**
* Returns which side Noxesium is running on.
*/
public NoxesiumSide getSide() {
return side;
}

/**
* Sets which side Noxesium is running on.
*/
public void setSide(NoxesiumSide side) {
this.side = side;
}

/**
* Activates the entrypoint with the given protocol.
*/
public void activateEntrypoint(EntrypointProtocol protocol) {
var entrypoint = entrypoints.get(protocol.id());
if (entrypoint == null) return;
entrypoint.getRegistryCollections().forEach(it -> it.register(entrypoint));
entrypoint.getPacketCollections().forEach(it -> registerPackets(entrypoint, it));
activeEntrypoints.add(entrypoint);
}

/**
* Registers a new entrypoint.
*/
public void registerEntrypoint(NoxesiumEntrypoint entrypoint) {
entrypoints.put(entrypoint.getId(), entrypoint);
}

/**
* Registers a new entrypoint and instantly activates it. Meant for the server-side
* where entrypoints are immediately active.
*/
public void registerAndActivateEntrypoint(NoxesiumEntrypoint entrypoint) {
registerEntrypoint(entrypoint);
entrypoint.getRegistryCollections().forEach(it -> it.register(entrypoint));
entrypoint.getPacketCollections().forEach(it -> registerPackets(entrypoint, it));
entrypoint.getAllFeatures().forEach(this::registerFeature);
activeEntrypoints.add(entrypoint);
}

/**
* Adds a new feature to the list of features that should
* be registered. Usually called by the initializer.
*/
public void registerFeature(NoxesiumFeature feature) {
if (!features.containsKey(feature.getClass())) {
features.put(feature.getClass(), feature);
feature.register();
}
}

/**
* Registers a new collection of packets.
* Usually called by the initializer.
*/
public void registerPackets(NoxesiumEntrypoint entrypoint, PacketCollection collection) {
packets.add(collection);
collection.register(entrypoint);
}

/**
* Unregisters all features collections.
*/
public void unregisterAll() {
activeEntrypoints.clear();
features.values().forEach(NoxesiumFeature::unregister);
features.clear();
packets.forEach(PacketCollection::unregister);
packets.clear();
NoxesiumRegistries.REGISTRIES.forEach(NoxesiumRegistry::reset);
}

/**
* Returns the feature of type [T] if one is registered, or `null` otherwise.
*/
@Nullable
public <T extends NoxesiumFeature> T getFeatureOrNull(Class<T> clazz) {
return (T) features.get(clazz);
}

/**
* Returns the feature of type [T], wrapped in an optional.
*/
@NotNull
public <T extends NoxesiumFeature> Optional<T> getFeatureOptional(Class<T> clazz) {
return Optional.ofNullable(getFeatureOrNull(clazz));
}

/**
* Returns all registered features.
*/
public Collection<NoxesiumFeature> getAllFeatures() {
return features.values();
}

/**
* Returns the entrypoint with the given id.
*/
@Nullable
public NoxesiumEntrypoint getEntrypoint(String id) {
return entrypoints.get(id);
}

/**
* Returns all active entrypoints.
*/
public Collection<NoxesiumEntrypoint> getActiveEntrypoints() {
return activeEntrypoints;
}

/**
* Returns all registered entry points.
*/
public Collection<NoxesiumEntrypoint> getAllEntrypoints() {
return entrypoints.values();
}
}
82 changes: 82 additions & 0 deletions api/src/main/java/com/noxcrew/noxesium/api/NoxesiumEntrypoint.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package com.noxcrew.noxesium.api;

import com.noxcrew.noxesium.api.feature.NoxesiumFeature;
import com.noxcrew.noxesium.api.network.PacketCollection;
import com.noxcrew.noxesium.api.registry.RegistryCollection;
import java.net.URL;
import java.util.Collection;
import java.util.List;
import org.jetbrains.annotations.Nullable;

/**
* An entrypoint for Noxesium which allows a mod or plugin to take control and register its features,
* registry contents, packets, and more. Each set of features implemented against Noxesium's APIs
* must be defined in an entrypoint.
* <p>
* All Noxesium entrypoints may provide both a private and public key. This system is used
* by the common module to serve as an implementation example. Of course this means that the
* common module's keys are all public in this repository which is intentional as it is only
* meant to be an example. If you make your own private implementation you should of course
* keep these files private and only ship the public server key with your client mod.
* <p>
* The system allows implementations to be shielded from unauthorized clients that do not have the
* correct private key expected by the other side of the implementation. This prevents the client from
* leaking any registries unless the server can correctly authenticate itself.
* <p>
* The handshake process for Noxesium runs for all entrypoints simultaneously, but includes
* the following steps before it can be completed:
* 1) The server-side implementation shares with the client that it can receive handshake packets.
* 2) The client-side implementation sends a handshake initiation with a series of entrypoint ids
* encrypted using a shared encryption key of each entrypoint when joining a server or entering the
* configuration phase.
* 3) The server-side implementation responds with an acknowledgement containing a list of entry
* point ids it could decrypt in plain text.
* 4) The client-side implementation responds with an acknowledgement containing a list of the
* validated entrypoints and their protocol details. It registers all packet handlers for this entrypoint.
* 5) The server-side implementation receives the answer, registers all plugin channels defined and
* performs relevant initialization steps.
* 6) The server-side sends all registry contents to the client. Receiving back an acknowledgement of
* the registry entries which existed on the client and which ones did not.
* 7) The server-side sends a handshake completion packet when it is fully done.
*/
public interface NoxesiumEntrypoint {
/**
* Returns the identifier of this entrypoint. This must be globally unique from
* all other installed entrypoints.
*/
String getId();

/**
* Returns instances for all features of this entrypoint. These can be re-created on
* every initialization or re-used between re-initializations.
*/
default Collection<NoxesiumFeature> getAllFeatures() {
return List.of();
}

/**
* Returns all registry collections included in this entrypoint.
*/
default Collection<RegistryCollection<?>> getRegistryCollections() {
return List.of();
}

/**
* Returns all packet collections included in this entrypoint.
*/
default Collection<PacketCollection> getPacketCollections() {
return List.of();
}

/**
* Returns an optional location of this entrypoint's base64 encoded AES-256 key resource to use for
* securely authenticating that a valid client and server implementation of the same entrypoint are present.
* <p>
* An AES key is used as it is expected that anyone in possession of either sources is allowed to communicate
* with the other side.
*/
@Nullable
default URL getEncryptionKey() {
return null;
}
}
Loading