Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement Event Management System and Native Geyser Extension System #742

Closed
wants to merge 129 commits into from

Conversation

bundabrg
Copy link
Collaborator

@bundabrg bundabrg commented Jun 6, 2020

Overview

This provides a Thread-safe Event Management System for Geyser. A native plugin system is also provided that can utilize the Event system through the use of 3rd party plugin jars.

Event System

Please refer to the live documentation for up to date information on how the system has been designed. This section is now outdated

An event extends GeyserEvent or GeyserCancellableEvent and can be triggered using the EventManager container on the Connector instance.

All event handlers will be run in order of priority and handlers can choose to not get cancelled events.

A handler can be defined using a lambda along with the expected event class.

Example 1:

// Load all this data into memory
myHugeData = readAllTheData();

// We want to save it all when Geyser Shuts down
eventManager.on(DisableEvent.class, (handler, event) -> {
    writeAllTheData(myHugeData);
}).build();

Example 2:

// We need to send this second packet only when we get a ResponsePacket
session.sendUpstreamPacket(somePacket);
eventManager.on(BedrockPacketReceiveEvent.class, (handler, event) -> {
    session.sendUpstreamPacket(otherPacket);
    handler.unregister(); // Unregister ourself
  
})
    .filter(ResponsePacket.class)
    .build();

Data for an event can be passed in the event object.

Events are triggered by creating a new object that inherits from GeyserEvent and calling the trigger method on the Event Manager.

Plugin System

Please refer to the live documentation for up to date information on how the system has been designed. This section is now outdated

A plugin system is also implemented to allow native Geyser Plugins to be written. This will reduce the amount of code that does not belong in the mainline by pulling it out into plugins that can optionally be used. It will also attract a community of developers who may not be interested in dealing with the low level aspects of Geyser but are happy to create useful optional features.

The plugin jar files are placed inside a plugins folder relative to the dataFolder of the appropriate bootstrap. This means relative to the jar for standalone and relative to its datafile folder for the other bootstraps. Each plugin can create its own datafolder under there as well.

We make use of a custom classloader that allows a plugin to also specify if it wishes to be part of the global namespace or not (default true). If it is global then other plugins may use its libraries and vice-versa, otherwise it is entirely independent and will not collide with other plugins.

An example plugin which runs on Geyser, Spigot and Bungeecord can be found here

Presently a class annotated with @Plugin and extending GeyserPlugin is looked for in the jar and is instantiated, becoming the plugin entrypoint. This annotation also defines all details about the plugin.

All event handlers are annotated by @Event and reflection is used to determine which event is hooked. Classes that event handers belong to must be registered with the plugin manager unless it is the main plugin class which is automatically registered.

Documentation

Online Documentation

Plugins

Please refer to Awesome Geyser Resources for a list of known plugins so far.

ToDo

  • Proper Documentation
  • Plugins should extend from an abstract class to provide helper methods
  • Define a list of Events and where they can optimally be hooked into the code.
  • Write a better example plugin perhaps one that provides custom filtering on the playerlist as it is easy to understand and by writing it help to know which events are useful.
  • Will need Provide a platform independent method of retrieving the datafolder #769 merged but we implement the same functionality here anyway for the moment
  • Remove edit URL's from the PDF documentation generation
  • Remove need for Context in Method Event Handlers
  • Individual Packet Events
  • Command to show plugins loaded
  • Handle cases where plugins may need to be run on specific platforms (spigot, standalone) by specifying requirements in the plugin annotation. I'm now not so sure this is needed. A plugin writer should test for this using whatever method they wish.
  • Implement a delombok step so we can javadoc event fields
  • Provide easy method to inject packets to Geyser
  • Provide easy method to register commands not under the Geyser command (Ability to register new commands that are not under /geyser #1637)

Events Todo

  • PluginMessageEvent + sending messages
  • DownStreamPacketReceive
  • DownStreamPacketSend
  • UpstreamPacketReceive
  • UpstreamPacketSend
  • GeyserStartupEvent
  • GeyserShutdownEvent
  • PluginEnableEvent
  • PluginDisableEvent
  • Ping events

Optimization

  • If no event handlers then we might be able to short circuit some stuff. However as events may be useful to internal geyser code in the future this may quickly become a useless optimization

@Heath123
Copy link
Contributor

Heath123 commented Jun 6, 2020

Well if Bungeecord has plugins, then why shouldn't Geyser? I can think of a few uses for this, at least

@andrew121410
Copy link

This is good because I wanted to make a Chest GUI to Custom Form Window. So it’s easier for bedrock users to interact. So instead of opening the Chest GUI it just opens the custom form window.

@Heath123
Copy link
Contributor

Heath123 commented Jun 7, 2020

This should have access to packets and be able to modify them before they get sent

@bundabrg
Copy link
Collaborator Author

bundabrg commented Jun 7, 2020

I think it needs a pre and post event for both downstream and upstream. This way packets can be modified before and after geyser does it's thing.

@danielboos1
Copy link

So wait, with this am i able to run plugins for bedrock players only? Because that would be awesome

@bundabrg
Copy link
Collaborator Author

bundabrg commented Jun 8, 2020

Correct, but keep in mind these are geyser plugins and not spigot plugins. So they would deal with Geyser related stuff. For now that would be modifying packets before they are received by Geyser or after its done its thing, and injecting packets towards the java server or up to the geyser client (ie the comment about chest gui would block creating the chest gui and send upstream the window creation packets).

You could also potentially communicate with spigot plugins in the downstream server but that's not yet planned as we would need some way to send messages and may require a hop through something like floodgate as a message bridge unless there is some way to send messages using the java packets (perhaps specially encoded packets that do not cause an effect on the java server like chat messages that your java plugin then suppress and captures the data from).

@Heath123
Copy link
Contributor

Heath123 commented Jun 12, 2020

You could also potentially communicate with spigot plugins in the downstream server but that's not yet planned as we would need some way to send messages and may require a hop through something like floodgate as a message bridge unless there is some way to send messages using the java packets (perhaps specially encoded packets that do not cause an effect on the java server like chat messages that your java plugin then suppress and captures the data from).

https://dinnerbone.com/blog/2012/01/13/minecraft-plugin-channels-messaging/

@bundabrg
Copy link
Collaborator Author

I was not aware of that. This solves a whole bunch of things and props to Dinnerbone for implementing it.

As another suggested feature for this branch I'd like to propose single shot events with lambdas which would be super useful for co-ordinating stuff that needs to be done in an ordered fashion without needing the whole event method setup.

For example something like:

session.sendDownstream(something);
pluginManager.when(DownstreamPacketReceivedEvent.class, (event) -> {
  if (event.getPacket().getId() == -1 ) { do something and cancel event }
});

I've not thought much more about it than that but it would temporarily add it to the list of events being triggered and can self cancel itself out when its fulfilled. Allows putting the code closer to where its relevant in the code.

Instead of plugins being the focus Geyser instead implements an Event Management system that can be used internally. Plugins are then able to utilize this through the convenience of an external jar and registering annotated classes.
@bundabrg
Copy link
Collaborator Author

I've expanded that thought further by moving the event system into its own system which will be useful for within Geyser as well. The Event system now becomes useful for Geyser itself to utilize and can possibly clean up things by placing code closer to where it is useful.

The plugin system now just uses the EventSystem by allowing 3rd party jars to be dropped into the Geyser plugins folder and provides some convenience through the use of annotations. Plugins also now extend from GeyserPlugin as a requirement.

This means that as well as the plugin system described in this topic one can also perform event hooking through the use of lambdas and through the magic of Generic and TypeVariables the runnable will have the correct event type.

Example 1:

// Load all this data into memory
myHugeData = readAllTheData();

// We want to save it all when Geyser Shuts down
eventManager.on(DisableEvent.class, (ctx, event) -> {
    writeAllTheData(myHugeData);
});

Example 2:

// We need to send this second packet only when we get a respose 
session.sendUpstreamPacket(somePacket);
eventManager.on(BedrockPacketReceiveEvent.class, (ctx, event) -> {
    if (event.getPacket() instance of ResponsePacket) {
        session.sendUpstreamPacket(otherPacket);
        ctx.unregister(); // Unregister ourself
    }
});

@bundabrg bundabrg changed the title Implement Native Geyser Plugin System Implement Event Management Syste and Native Geyser Plugin System Jun 15, 2020
@bundabrg
Copy link
Collaborator Author

bundabrg commented Jun 15, 2020

With regard to the plugin message channels this will simply need a sendMessage method on the session likely and a PluginMessageReceive event for receiving messages. It should just "work" then with communicating with server side plugins.

The EventManager will now allow classes to be registered and all methods of the class annotated with @event will be added as event handlers.

PluginManager provides a proxy to some of the registration functions in EventManager to allow it to track EventHandlers that belong to a plugin.
@bundabrg
Copy link
Collaborator Author

The EventManager will now allow classes to be registered and all methods of the class annotated with @event will be added as event handlers making them first class citizens of EventManager.

PluginManager provides a proxy to some of the registration functions in EventManager directly in GeyserPlugin to allow it to track EventHandlers that belong to a plugin but otherwise is now only responsible for purely plugin related things.

@bundabrg
Copy link
Collaborator Author

As this would require good documentation I've added both some initial documentation as well as a github action to automatically build + deploy both an online and offline documentation. For now it triggers when pushed to this branch and deploys to my pages repo and the 'edit' button in the docs will not work as it assumes it's editing master. The idea is the dev who is responsible for adding an event (or other feature) will also add to the documentation for it and the branch is not merged till that happens.

Online Documentation: https://bundabrg.github.io/Geyser/
Offline Documentation: https://bundabrg.github.io/Geyser/pdf/documentation.pdf

Changes:
* Rename EnableEvent, DisableEvent to PluginEnableEvent and PluginDisableEvent. These are now triggered for all plugins when enabling/disabling.
* Added GeyserStartEvent, GeyserStopEvent, triggered after starting and before stopping Geyser
* Updated EventManager.trigger to return an EventResult which contains chainable methods with runnables
* Add UpstreamPacketSendEvent, UpstreamPacketReceiveEvent, DownstreamPacketSendEvent, DownstreamPacketReceiveEvent which trigger for the respective direction of packet flow and are cancellable.
* Update Documentation
Changes:
* New method on GeyserSession: sendPluginMessage(String channel, byte[] data) that will send a ClientPluginMessage packet to downstream
* New Event: PluginMessageEvent. Triggers when a PluginMessage is received.
* Update Documentation
@bundabrg bundabrg changed the title Implement Event Management Syste and Native Geyser Plugin System Implement Event Management System and Native Geyser Plugin System Jun 16, 2020
@bundabrg
Copy link
Collaborator Author

bundabrg commented Jun 16, 2020

The last commit added support for sending PluginMessages downstream as well as an event that triggers when receiving a channel message.

However its important to note here:

  • They are ClientPluginMessages. This is slightly different to ServerPluginMessages which are done from Bukkit servers for example to Bungeecord.
  • Plugin writers of Bukkit plugins CANNOT trust the plugin channel as this can be sent from a java client as well. It may be worth providing a trusted channel that signs the messages similar to how floodgate works.
  • In the same vein, accessing ServerPluginMessage channels from Geyser would need to bounce through a relay that takes trusted ClientPluginMessages, sends the appropriate ServerPluginMessage then responds back. This is all out of scope of this PR.

Note: If geyser is running as a bukkit plugin then it implicitly is able to send trusted messages. So perhaps a method on the bootstrap to send a trusted message, and those without the direct facility must then establish it through a relay plugin.

The relay plugin could also technically provide some missing things from non-bukkit Geyser instances. For example being able to query chunks etc, however I'd recommend that the relationship be optional and still work without else vanilla servers will not work.

Changes:
* You can now register/unregister for plugin channels using GeyserSession#registerPluginChannel, GeyserSession#unregisterPluginChannel.  Any new session will then automatically register these channels as well.

* Added documentation describing how Plugin Message Channels work
This allows chaining a delay to unregister a lambda event so that it can be cancelled should it not fire in a reasonable amount of time.
@Camotoy Camotoy linked an issue Jun 17, 2020 that may be closed by this pull request
We don't want to actually call defineClass when searching for the Plugin so we instead load and parse the annotation from the bytecode.
@bundabrg
Copy link
Collaborator Author

I have put together a plugin that is a Geyser plugin, Spigot plugin and Bungeecord plugin all rolled into one. When added to any of these services it will merely send ping messages to a plugin message channel and report any that it see's. If you were to put one in all 3 then you should see ping messages from the other two participating servers in your logs.

This provides a simple example of how to create a plugin supporting all 3 servers and demonstrates the plugin message channel in use.

Source: https://github.com/bundabrg/GeyserLink
Release: https://github.com/bundabrg/GeyserLink/releases

This provides a thin wrapper to the regular logger with the plugin name prefixed to the messages.
@ghost
Copy link

ghost commented Jun 17, 2020

Can you please implement plugins api as annotation processor like how velocity does? It's more easy for devs.

# Conflicts:
#	bootstrap/velocity/pom.xml
#	connector/pom.xml
#	connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java
#	connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java
#	connector/src/main/resources/languages
#	connector/src/main/resources/mappings
#	pom.xml
*/
public void registerPluginChannel(String channel) {
if (registeredPluginChannels.contains(channel)) {
return;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should throw an exception instead of silently returning.

@Camotoy Camotoy mentioned this pull request Jul 16, 2021
@funniray
Copy link

funniray commented Oct 9, 2021

Just wondering, is there any reason why this hasn't been merged yet? Being able to handle custom packets for bedrock specific features is very important for what I need to do.

@Hellohi3654
Copy link
Contributor

Just wondering, is there any reason why this hasn't been merged yet? Being able to handle custom packets for bedrock specific features is very important for what I need to do.

I doubt this will be merged anytime soon
One reason this hasn't been merged is because of all the conflicts since Bundabrg seems to have stopped merging the master branch into his plugins branch

Also this will need alot of fine tuning and testing before it's ready to be merged into master

Merge branch 'master' into feature/plugins

# Conflicts:
#	bootstrap/bungeecord/pom.xml
#	bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java
#	bootstrap/pom.xml
#	bootstrap/spigot/pom.xml
#	bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java
#	bootstrap/sponge/pom.xml
#	bootstrap/sponge/src/main/java/org/geysermc/geyser/platform/sponge/GeyserSpongePlugin.java
#	bootstrap/standalone/pom.xml
#	bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/GeyserStandaloneBootstrap.java
#	bootstrap/velocity/pom.xml
#	bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityPlugin.java
#	common/pom.xml
#	connector/src/main/java/org/geysermc/connector/network/translators/PacketTranslatorRegistry.java
#	connector/src/main/java/org/geysermc/connector/network/translators/sound/SoundHandlerRegistry.java
#	connector/src/main/java/org/geysermc/connector/skin/SkinManager.java
#	core/pom.xml
#	core/src/main/java/org/geysermc/geyser/GeyserImpl.java
#	core/src/main/java/org/geysermc/geyser/event/Cancellable.java
#	core/src/main/java/org/geysermc/geyser/event/EventManager.java
#	core/src/main/java/org/geysermc/geyser/event/EventResult.java
#	core/src/main/java/org/geysermc/geyser/event/EventSession.java
#	core/src/main/java/org/geysermc/geyser/event/GeyserEvent.java
#	core/src/main/java/org/geysermc/geyser/event/annotations/GeyserEventHandler.java
#	core/src/main/java/org/geysermc/geyser/event/events/extension/ExtensionDisableEvent.java
#	core/src/main/java/org/geysermc/geyser/event/events/extension/ExtensionEnableEvent.java
#	core/src/main/java/org/geysermc/geyser/event/events/geyser/GeyserLoginEvent.java
#	core/src/main/java/org/geysermc/geyser/event/events/geyser/GeyserStartEvent.java
#	core/src/main/java/org/geysermc/geyser/event/events/geyser/GeyserStopEvent.java
#	core/src/main/java/org/geysermc/geyser/event/events/geyser/LoadBedrockSkinEvent.java
#	core/src/main/java/org/geysermc/geyser/event/events/geyser/ResourceReadEvent.java
#	core/src/main/java/org/geysermc/geyser/event/events/network/BedrockPongEvent.java
#	core/src/main/java/org/geysermc/geyser/event/events/network/SessionConnectEvent.java
#	core/src/main/java/org/geysermc/geyser/event/events/network/SessionDisconnectEvent.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/DownstreamPacketReceiveEvent.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/DownstreamPacketSendEvent.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/UpstreamPacketReceiveEvent.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/UpstreamPacketSendEvent.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientAdvancementTabPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientBlockNBTRequestPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientChatPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientClickWindowButtonPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientCloseWindowPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientCreativeInventoryActionPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientEditBookPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientEntityNBTRequestPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientGenerateStructuresPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientKeepAlivePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientLockDifficultyPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientMoveItemToHotbarPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientPlayerAbilitiesPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientPlayerActionPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientPlayerChangeHeldItemPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientPlayerInteractEntityPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientPlayerMovementPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientPlayerPlaceBlockPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientPlayerPositionPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientPlayerPositionRotationPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientPlayerRotationPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientPlayerStatePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientPlayerSwingArmPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientPlayerUseItemPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientPluginMessagePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientPrepareCraftingGridPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientRenameItemPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientRequestPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientResourcePackStatusPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientSelectTradePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientSetBeaconEffectPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientSetDifficultyPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientSettingsPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientSpectatePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientSteerBoatPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientSteerVehiclePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientTabCompletePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientTeleportConfirmPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientUpdateCommandBlockMinecartPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientUpdateCommandBlockPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientUpdateJigsawBlockPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientUpdateSignPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientUpdateStructureBlockPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientVehicleMovePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ClientWindowActionPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/EncryptionRequestPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/EncryptionResponsePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/HandshakePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/LoginDisconnectPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/LoginPluginRequestPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/LoginPluginResponsePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/LoginSetCompressionPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/LoginStartPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/LoginSuccessPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerAdvancementTabPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerAdvancementsPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerBlockBreakAnimPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerBlockChangePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerBlockValuePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerBossBarPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerChatPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerChunkDataPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerCloseWindowPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerDeclareCommandsPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerDeclareRecipesPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerDeclareTagsPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerDifficultyPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerDisconnectPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerDisplayScoreboardPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerEntityAnimationPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerEntityAttachPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerEntityCollectItemPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerEntityEffectPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerEntityEquipmentPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerEntityHeadLookPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerEntityMetadataPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerEntityPositionPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerEntityPositionRotationPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerEntityPropertiesPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerEntityRemoveEffectPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerEntityRotationPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerEntitySetPassengersPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerEntitySoundEffectPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerEntityStatusPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerEntityTeleportPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerEntityVelocityPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerExplosionPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerJoinGamePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerKeepAlivePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerMapDataPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerMultiBlockChangePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerNBTResponsePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerNotifyClientPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerOpenBookPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerOpenHorseWindowPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerOpenTileEntityEditorPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerOpenWindowPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerPlayBuiltinSoundPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerPlayEffectPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerPlaySoundPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerPlayerAbilitiesPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerPlayerActionAckPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerPlayerChangeHeldItemPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerPlayerFacingPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerPlayerHealthPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerPlayerListDataPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerPlayerListEntryPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerPlayerPositionRotationPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerPlayerSetExperiencePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerPluginMessagePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerPreparedCraftingGridPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerResourcePackSendPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerRespawnPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerScoreboardObjectivePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerSetCompressionPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerSetCooldownPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerSetSlotPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerSpawnEntityPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerSpawnExpOrbPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerSpawnLivingEntityPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerSpawnPaintingPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerSpawnParticlePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerSpawnPlayerPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerSpawnPositionPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerStatisticsPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerStopSoundPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerSwitchCameraPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerTabCompletePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerTeamPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerTradeListPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerUnloadChunkPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerUnlockRecipesPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerUpdateLightPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerUpdateScorePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerUpdateTileEntityPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerUpdateTimePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerUpdateViewDistancePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerUpdateViewPositionPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerVehicleMovePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerWindowItemsPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/ServerWindowPropertyPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/StatusPingPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/StatusPongPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/StatusQueryPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/downstream/StatusResponsePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AddBehaviorTreePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AddBehaviorTreePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AddEntityPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AddEntityPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AddHangingEntityPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AddHangingEntityPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AddItemEntityPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AddItemEntityPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AddPaintingPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AddPaintingPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AddPlayerPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AddPlayerPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AdventureSettingsPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AdventureSettingsPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AnimatePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AnimatePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AnvilDamagePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AnvilDamagePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AutomationClientConnectPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AutomationClientConnectPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AvailableCommandsPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AvailableCommandsPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AvailableEntityIdentifiersPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/AvailableEntityIdentifiersPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/BiomeDefinitionListPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/BiomeDefinitionListPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/BlockEntityDataPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/BlockEntityDataPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/BlockEventPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/BlockEventPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/BlockPickRequestPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/BlockPickRequestPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/BookEditPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/BookEditPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/BossEventPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/BossEventPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/CameraPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/CameraPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ChangeDimensionPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ChangeDimensionPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ChunkRadiusUpdatedPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ChunkRadiusUpdatedPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ClientCacheBlobStatusPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ClientCacheBlobStatusPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ClientCacheMissResponsePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ClientCacheMissResponsePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ClientCacheStatusPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ClientCacheStatusPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ClientToServerHandshakePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ClientToServerHandshakePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ClientboundMapItemDataPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ClientboundMapItemDataPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/CodeBuilderPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/CodeBuilderPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/CommandBlockUpdatePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/CommandBlockUpdatePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/CommandOutputPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/CommandOutputPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/CommandRequestPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/CommandRequestPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/CompletedUsingItemPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/CompletedUsingItemPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ContainerClosePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ContainerClosePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ContainerOpenPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ContainerOpenPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ContainerSetDataPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ContainerSetDataPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/CraftingDataPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/CraftingDataPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/CraftingEventPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/CraftingEventPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/CreativeContentPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/CreativeContentPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/DebugInfoPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/DebugInfoPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/DisconnectPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/DisconnectPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/EducationSettingsPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/EducationSettingsPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/EmoteListPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/EmoteListPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/EmotePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/EmotePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/EntityEventPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/EntityEventPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/EntityFallPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/EntityFallPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/EntityPickRequestPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/EntityPickRequestPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/EventPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/EventPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ExplodePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ExplodePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/GameRulesChangedPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/GameRulesChangedPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/GuiDataPickItemPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/GuiDataPickItemPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/HurtArmorPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/HurtArmorPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/InteractPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/InteractPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/InventoryContentPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/InventoryContentPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/InventorySlotPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/InventorySlotPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/InventoryTransactionPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/InventoryTransactionPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ItemFrameDropItemPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ItemFrameDropItemPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ItemStackRequestPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ItemStackRequestPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ItemStackResponsePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ItemStackResponsePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/LabTablePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/LabTablePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/LecternUpdatePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/LecternUpdatePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/LevelChunkPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/LevelChunkPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/LevelEventGenericPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/LevelEventGenericPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/LevelEventPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/LevelEventPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/LevelSoundEvent1PacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/LevelSoundEvent1PacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/LevelSoundEvent2PacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/LevelSoundEvent2PacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/LevelSoundEventPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/LevelSoundEventPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/LoginPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/LoginPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/MapCreateLockedCopyPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/MapCreateLockedCopyPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/MapInfoRequestPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/MapInfoRequestPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/MobArmorEquipmentPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/MobArmorEquipmentPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/MobEffectPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/MobEffectPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/MobEquipmentPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/MobEquipmentPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ModalFormRequestPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ModalFormRequestPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ModalFormResponsePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ModalFormResponsePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/MoveEntityAbsolutePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/MoveEntityAbsolutePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/MoveEntityDeltaPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/MoveEntityDeltaPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/MovePlayerPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/MovePlayerPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/MultiplayerSettingsPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/MultiplayerSettingsPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/NetworkChunkPublisherUpdatePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/NetworkChunkPublisherUpdatePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/NetworkSettingsPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/NetworkSettingsPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/NetworkStackLatencyPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/NetworkStackLatencyPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/NpcRequestPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/NpcRequestPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/OnScreenTextureAnimationPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/OnScreenTextureAnimationPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PacketViolationWarningPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PacketViolationWarningPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PhotoTransferPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PhotoTransferPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PlaySoundPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PlaySoundPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PlayStatusPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PlayStatusPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PlayerActionPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PlayerActionPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PlayerArmorDamagePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PlayerArmorDamagePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PlayerAuthInputPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PlayerAuthInputPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PlayerEnchantOptionsPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PlayerEnchantOptionsPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PlayerHotbarPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PlayerHotbarPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PlayerInputPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PlayerInputPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PlayerListPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PlayerListPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PlayerSkinPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PlayerSkinPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PositionTrackingDBClientRequestPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PositionTrackingDBClientRequestPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PositionTrackingDBServerBroadcastPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PositionTrackingDBServerBroadcastPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PurchaseReceiptPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/PurchaseReceiptPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/RemoveEntityPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/RemoveEntityPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/RemoveObjectivePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/RemoveObjectivePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/RequestChunkRadiusPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/RequestChunkRadiusPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ResourcePackChunkDataPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ResourcePackChunkDataPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ResourcePackChunkRequestPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ResourcePackChunkRequestPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ResourcePackClientResponsePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ResourcePackClientResponsePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ResourcePackDataInfoPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ResourcePackDataInfoPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ResourcePackStackPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ResourcePackStackPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ResourcePacksInfoPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ResourcePacksInfoPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/RespawnPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/RespawnPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/RiderJumpPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/RiderJumpPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ScriptCustomEventPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ScriptCustomEventPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ServerSettingsRequestPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ServerSettingsRequestPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ServerSettingsResponsePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ServerSettingsResponsePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ServerToClientHandshakePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ServerToClientHandshakePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetCommandsEnabledPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetCommandsEnabledPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetDefaultGameTypePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetDefaultGameTypePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetDifficultyPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetDifficultyPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetDisplayObjectivePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetDisplayObjectivePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetEntityDataPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetEntityDataPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetEntityLinkPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetEntityLinkPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetEntityMotionPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetEntityMotionPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetHealthPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetHealthPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetLastHurtByPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetLastHurtByPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetLocalPlayerAsInitializedPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetLocalPlayerAsInitializedPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetPlayerGameTypePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetPlayerGameTypePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetScorePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetScorePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetScoreboardIdentityPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetScoreboardIdentityPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetSpawnPositionPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetSpawnPositionPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetTimePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetTimePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetTitlePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SetTitlePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SettingsCommandPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SettingsCommandPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ShowCreditsPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ShowCreditsPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ShowProfilePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ShowProfilePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ShowStoreOfferPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/ShowStoreOfferPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SimpleEventPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SimpleEventPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SpawnExperienceOrbPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SpawnExperienceOrbPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SpawnParticleEffectPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SpawnParticleEffectPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/StartGamePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/StartGamePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/StopSoundPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/StopSoundPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/StructureBlockUpdatePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/StructureBlockUpdatePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/StructureTemplateDataRequestPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/StructureTemplateDataRequestPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/StructureTemplateDataResponsePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/StructureTemplateDataResponsePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SubClientLoginPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/SubClientLoginPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/TakeItemEntityPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/TakeItemEntityPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/TextPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/TextPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/TickSyncPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/TickSyncPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/TransferPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/TransferPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/UnknownPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/UnknownPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/UpdateAttributesPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/UpdateAttributesPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/UpdateBlockPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/UpdateBlockPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/UpdateBlockPropertiesPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/UpdateBlockPropertiesPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/UpdateBlockSyncedPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/UpdateBlockSyncedPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/UpdateEquipPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/UpdateEquipPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/UpdatePlayerGameTypePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/UpdatePlayerGameTypePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/UpdateSoftEnumPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/UpdateSoftEnumPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/UpdateTradePacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/UpdateTradePacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/VideoStreamConnectPacketReceive.java
#	core/src/main/java/org/geysermc/geyser/event/events/packet/upstream/VideoStreamConnectPacketSend.java
#	core/src/main/java/org/geysermc/geyser/event/events/registry/BlockEntityRegistryEvent.java
#	core/src/main/java/org/geysermc/geyser/event/events/registry/InventoryTranslatorRegistryEvent.java
#	core/src/main/java/org/geysermc/geyser/event/events/registry/ItemRemapperRegistryEvent.java
#	core/src/main/java/org/geysermc/geyser/event/events/registry/PacketTranslatorRegistryEvent.java
#	core/src/main/java/org/geysermc/geyser/event/events/registry/SoundHandlerRegistryEvent.java
#	core/src/main/java/org/geysermc/geyser/event/handlers/EventHandler.java
#	core/src/main/java/org/geysermc/geyser/event/handlers/LambdaEventHandler.java
#	core/src/main/java/org/geysermc/geyser/event/handlers/MethodEventHandler.java
#	core/src/main/java/org/geysermc/geyser/extension/ExtensionClassLoader.java
#	core/src/main/java/org/geysermc/geyser/extension/ExtensionLogger.java
#	core/src/main/java/org/geysermc/geyser/extension/ExtensionManager.java
#	core/src/main/java/org/geysermc/geyser/extension/GeyserExtension.java
#	core/src/main/java/org/geysermc/geyser/extension/annotations/Extension.java
#	core/src/main/java/org/geysermc/geyser/extension/handlers/ExtensionLambdaEventHandler.java
#	core/src/main/java/org/geysermc/geyser/extension/handlers/ExtensionMethodEventHandler.java
#	core/src/main/java/org/geysermc/geyser/extension/relocator/JavaRelocator.java
#	core/src/main/java/org/geysermc/geyser/extension/relocator/RelocatingRemapper.java
#	core/src/main/java/org/geysermc/geyser/extension/relocator/Relocation.java
#	core/src/main/java/org/geysermc/geyser/extension/relocator/RelocatorClassVisitor.java
#	core/src/main/java/org/geysermc/geyser/extension/relocator/SelectorUtils.java
#	core/src/main/java/org/geysermc/geyser/network/ConnectorServerEventHandler.java
#	core/src/main/java/org/geysermc/geyser/network/LoggingPacketHandler.java
#	core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java
#	core/src/main/java/org/geysermc/geyser/session/GeyserSession.java
#	core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java
#	core/src/main/java/org/geysermc/geyser/translator/inventory/item/ItemTranslator.java
#	core/src/main/java/org/geysermc/geyser/util/FileUtils.java
#	pom.xml
@bundabrg
Copy link
Collaborator Author

bundabrg commented Dec 2, 2021

Just wondering, is there any reason why this hasn't been merged yet? Being able to handle custom packets for bedrock specific features is very important for what I need to do.

I've updated it but I suspect Geyser itself may move a different direction with the API development but I don't believe its anywhere near ready to handle the Education Translator extension so I'll keep trying to keep this updated whilst I maintain that extension.

Comment on lines +90 to +95
public static class Priority {
public final static int LOWEST = 10;
public final static int LOW = 4;
public final static int NORMAL = 50;
public final static int HIGH = 60;
public final static int HIGHEST = 90;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is LOW suppose to be 40?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes it is. Nice catch.

@Camotoy
Copy link
Member

Camotoy commented Mar 18, 2022

We're going to close this in favor of a new extension system actively in development. With that being said, we're incredibly grateful for the work that was done here; it was with the development here that the very idea of the extension name was created to differ from plugin systems of implementations. Thank you.

@Camotoy Camotoy closed this Mar 18, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

10 participants