Merge remote-tracking branch 'origin/feature/viaproxy-platform' into feature/viaproxy-platform

This commit is contained in:
RaphiMC 2023-12-08 11:00:10 +01:00
commit 6c8434b352
No known key found for this signature in database
GPG key ID: 0F6BB0657A03AC94
282 changed files with 1142 additions and 1030 deletions

View file

@ -19,32 +19,28 @@ public class LongClassName {
public int nameWithMultipleWords = 0; public int nameWithMultipleWords = 0;
/** /**
* Javadoc comment to explain what a function does. * Javadoc comment to explain what a function does.
*/ */
@RandomAnnotation(stuff = true, moreStuff = "might exist") @RandomAnnotation(stuff = true, moreStuff = "might exist")
public void applyStuff() { public void applyStuff() {
Variable variable = new Variable(); Variable variable = new Variable();
Variable otherVariable = new Variable(); Variable otherVariable = new Variable();
if (condition) { if (condition) {
// Do stuff. // Do stuff.
} else if (anotherCondition) { } else if (anotherCondition) {
// Do something else. // Do something else.
} }
switch (value) { switch (value) {
case 0: case 0 -> stuff();
stuff(); case 1 -> differentStuff();
break;
case 1:
differentStuff();
break;
} }
} }
} }
``` ```
Make sure to comment your code where possible. Make sure to comment your code where possible. To mark nullable methods, use `@Nullable` (and subsequently, `@NonNull`) from the `org.checkerframework.checker.nullness.qual` package.
The nature of our software requires a lot of arrays and maps to be stored - where possible, use Fastutil's specialized maps. For example, if you're storing block state translations, use an `Int2IntMap`. The nature of our software requires a lot of arrays and maps to be stored - where possible, use Fastutil's specialized maps. For example, if you're storing block state translations, use an `Int2IntMap`.

View file

@ -25,6 +25,8 @@
package org.geysermc.geyser.processor; package org.geysermc.geyser.processor;
import org.checkerframework.checker.nullness.qual.Nullable;
import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.RoundEnvironment;
@ -159,7 +161,7 @@ public class ClassProcessor extends AbstractProcessor {
this.processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Completed processing for " + this.annotationClassName); this.processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Completed processing for " + this.annotationClassName);
} }
private BufferedReader createReader() throws IOException { private @Nullable BufferedReader createReader() throws IOException {
if (this.outputPath != null) { if (this.outputPath != null) {
this.processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Reading existing " + this.annotationClassName + " list from " + this.outputPath); this.processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Reading existing " + this.annotationClassName + " list from " + this.outputPath);
return Files.newBufferedReader(this.outputPath); return Files.newBufferedReader(this.outputPath);

View file

@ -77,6 +77,7 @@ public interface GeyserApi extends GeyserApiBase {
* @param apiClass the builder class * @param apiClass the builder class
* @param <R> the implementation type * @param <R> the implementation type
* @param <T> the API type * @param <T> the API type
* @throws IllegalArgumentException if there is no provider for the specified API class
* @return the builder instance * @return the builder instance
*/ */
@NonNull @NonNull

View file

@ -27,5 +27,5 @@ package org.geysermc.geyser.api.bedrock.camera;
public enum CameraShake { public enum CameraShake {
POSITIONAL, POSITIONAL,
ROTATIONAL; ROTATIONAL
} }

View file

@ -25,11 +25,11 @@
package org.geysermc.geyser.api.block.custom.component; package org.geysermc.geyser.api.block.custom.component;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Set; import java.util.Set;
import org.checkerframework.checker.nullness.qual.NonNull;
/** /**
* This class is used to store conditions for a placement filter for a custom block. * This class is used to store conditions for a placement filter for a custom block.
* *
@ -43,7 +43,7 @@ public record PlacementConditions(@NonNull Set<Face> allowedFaces, @NonNull Link
NORTH, NORTH,
SOUTH, SOUTH,
WEST, WEST,
EAST; EAST
} }
public enum BlockFilterType { public enum BlockFilterType {

View file

@ -39,7 +39,7 @@ public interface JavaBlockState {
* *
* @return whether the block state is waterlogged * @return whether the block state is waterlogged
*/ */
@NonNull boolean waterlogged(); boolean waterlogged();
/** /**
* Gets the collision of the block state * Gets the collision of the block state
@ -53,7 +53,7 @@ public interface JavaBlockState {
* *
* @return whether the block state can be broken with hand * @return whether the block state can be broken with hand
*/ */
@NonNull boolean canBreakWithHand(); boolean canBreakWithHand();
/** /**
* Gets the pick item of the block state * Gets the pick item of the block state
@ -74,7 +74,7 @@ public interface JavaBlockState {
* *
* @return whether the block state has block entity * @return whether the block state has block entity
*/ */
@Nullable boolean hasBlockEntity(); boolean hasBlockEntity();
/** /**
* Creates a new {@link JavaBlockState.Builder} instance * Creates a new {@link JavaBlockState.Builder} instance
@ -94,17 +94,17 @@ public interface JavaBlockState {
Builder blockHardness(@NonNegative float blockHardness); Builder blockHardness(@NonNegative float blockHardness);
Builder waterlogged(@NonNull boolean waterlogged); Builder waterlogged(boolean waterlogged);
Builder collision(@NonNull JavaBoundingBox[] collision); Builder collision(@NonNull JavaBoundingBox[] collision);
Builder canBreakWithHand(@NonNull boolean canBreakWithHand); Builder canBreakWithHand(boolean canBreakWithHand);
Builder pickItem(@Nullable String pickItem); Builder pickItem(@Nullable String pickItem);
Builder pistonBehavior(@Nullable String pistonBehavior); Builder pistonBehavior(@Nullable String pistonBehavior);
Builder hasBlockEntity(@Nullable boolean hasBlockEntity); Builder hasBlockEntity(boolean hasBlockEntity);
JavaBlockState build(); JavaBlockState build();
} }

View file

@ -1,6 +1,4 @@
package org.geysermc.geyser.api.block.custom.nonvanilla; package org.geysermc.geyser.api.block.custom.nonvanilla;
import org.checkerframework.checker.nullness.qual.NonNull; public record JavaBoundingBox(double middleX, double middleY, double middleZ, double sizeX, double sizeY, double sizeZ) {
public record JavaBoundingBox(@NonNull double middleX, @NonNull double middleY, @NonNull double middleZ, @NonNull double sizeX, @NonNull double sizeY, @NonNull double sizeZ) {
} }

View file

@ -28,7 +28,6 @@ package org.geysermc.geyser.api.event;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.event.Event; import org.geysermc.event.Event;
import org.geysermc.event.bus.OwnedEventBus; import org.geysermc.event.bus.OwnedEventBus;
import org.geysermc.geyser.api.extension.Extension;
import java.util.Set; import java.util.Set;

View file

@ -27,7 +27,6 @@ package org.geysermc.geyser.api.event;
import org.geysermc.event.Event; import org.geysermc.event.Event;
import org.geysermc.event.subscribe.OwnedSubscriber; import org.geysermc.event.subscribe.OwnedSubscriber;
import org.geysermc.geyser.api.extension.Extension;
/** /**
* Represents a subscribed listener to a {@link Event}. Wraps around * Represents a subscribed listener to a {@link Event}. Wraps around

View file

@ -34,7 +34,7 @@ import java.net.InetSocketAddress;
/** /**
* Called whenever Geyser gets pinged * Called whenever Geyser gets pinged
* * <p>
* This event allows you to modify/obtain the MOTD, maximum player count, and current number of players online, * This event allows you to modify/obtain the MOTD, maximum player count, and current number of players online,
* Geyser will reply to the client with what was given. * Geyser will reply to the client with what was given.
*/ */

View file

@ -33,7 +33,7 @@ import java.util.Map;
/** /**
* Called when commands are defined within Geyser. * Called when commands are defined within Geyser.
* * <p>
* This event allows you to register new commands using the {@link #register(Command)} * This event allows you to register new commands using the {@link #register(Command)}
* method and retrieve the default commands defined. * method and retrieve the default commands defined.
*/ */

View file

@ -28,13 +28,12 @@ package org.geysermc.geyser.api.event.lifecycle;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.geyser.api.block.custom.CustomBlockData; import org.geysermc.geyser.api.block.custom.CustomBlockData;
import org.geysermc.geyser.api.block.custom.CustomBlockState; import org.geysermc.geyser.api.block.custom.CustomBlockState;
import org.geysermc.geyser.api.block.custom.nonvanilla.JavaBlockItem;
import org.geysermc.geyser.api.block.custom.nonvanilla.JavaBlockState; import org.geysermc.geyser.api.block.custom.nonvanilla.JavaBlockState;
import org.geysermc.event.Event; import org.geysermc.event.Event;
/** /**
* Called on Geyser's startup when looking for custom blocks. Custom blocks must be registered through this event. * Called on Geyser's startup when looking for custom blocks. Custom blocks must be registered through this event.
* * <p>
* This event will not be called if the "add-non-bedrock-items" setting is disabled in the Geyser config. * This event will not be called if the "add-non-bedrock-items" setting is disabled in the Geyser config.
*/ */
public abstract class GeyserDefineCustomBlocksEvent implements Event { public abstract class GeyserDefineCustomBlocksEvent implements Event {
@ -48,8 +47,8 @@ public abstract class GeyserDefineCustomBlocksEvent implements Event {
/** /**
* Registers the given {@link CustomBlockState} as an override for the * Registers the given {@link CustomBlockState} as an override for the
* given java state identifier * given java state identifier
* Java state identifiers are listed in * Java state identifiers are listed
* https://raw.githubusercontent.com/GeyserMC/mappings/master/blocks.json * <a href="https://raw.githubusercontent.com/GeyserMC/mappings/master/blocks.json">here</a>
* *
* @param javaIdentifier the java state identifier to override * @param javaIdentifier the java state identifier to override
* @param customBlockState the custom block state with which to override java state identifier * @param customBlockState the custom block state with which to override java state identifier

View file

@ -36,7 +36,7 @@ import java.util.Map;
/** /**
* Called on Geyser's startup when looking for custom items. Custom items must be registered through this event. * Called on Geyser's startup when looking for custom items. Custom items must be registered through this event.
* * <p>
* This event will not be called if the "add non-Bedrock items" setting is disabled in the Geyser config. * This event will not be called if the "add non-Bedrock items" setting is disabled in the Geyser config.
*/ */
public interface GeyserDefineCustomItemsEvent extends Event { public interface GeyserDefineCustomItemsEvent extends Event {

View file

@ -5,7 +5,7 @@ import org.geysermc.event.Event;
/** /**
* Called on Geyser's startup when looking for custom skulls. Custom skulls must be registered through this event. * Called on Geyser's startup when looking for custom skulls. Custom skulls must be registered through this event.
* * <p>
* This event will not be called if the "add-non-bedrock-items" setting is disabled in the Geyser config. * This event will not be called if the "add-non-bedrock-items" setting is disabled in the Geyser config.
*/ */
public abstract class GeyserDefineCustomSkullsEvent implements Event { public abstract class GeyserDefineCustomSkullsEvent implements Event {

View file

@ -25,10 +25,16 @@
package org.geysermc.geyser.api.extension.exception; package org.geysermc.geyser.api.extension.exception;
import java.io.Serial;
/** /**
* Thrown when an extension's description is invalid. * Thrown when an extension's description is invalid.
*/ */
public class InvalidDescriptionException extends Exception { public class InvalidDescriptionException extends Exception {
@Serial
private static final long serialVersionUID = 1L;
public InvalidDescriptionException(Throwable cause) { public InvalidDescriptionException(Throwable cause) {
super(cause); super(cause);
} }

View file

@ -25,10 +25,16 @@
package org.geysermc.geyser.api.extension.exception; package org.geysermc.geyser.api.extension.exception;
import java.io.Serial;
/** /**
* Thrown when an extension is invalid. * Thrown when an extension is invalid.
*/ */
public class InvalidExtensionException extends Exception { public class InvalidExtensionException extends Exception {
@Serial
private static final long serialVersionUID = 1L;
public InvalidExtensionException(Throwable cause) { public InvalidExtensionException(Throwable cause) {
super(cause); super(cause);
} }

View file

@ -51,7 +51,7 @@ public enum CreativeCategory {
* *
* @return the name of the category * @return the name of the category
*/ */
@NonNull public String internalName() { public @NonNull String internalName() {
return internalName; return internalName;
} }

View file

@ -30,7 +30,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
/** /**
* This is a way to represent a boolean, but with a non set value added. * This is a way to represent a boolean, but with a non set value added.
* This class was inspired by adventure's version https://github.com/KyoriPowered/adventure/blob/main/4/api/src/main/java/net/kyori/adventure/util/TriState.java * This class was inspired by adventure's <a href="https://github.com/KyoriPowered/adventure/blob/main/4/api/src/main/java/net/kyori/adventure/util/TriState.java">TriState</a>
*/ */
public enum TriState { public enum TriState {
/** /**

View file

@ -30,6 +30,7 @@ import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.api.plugin.Plugin;
import org.geysermc.geyser.dump.BootstrapDumpInfo; import org.geysermc.geyser.dump.BootstrapDumpInfo;
import java.net.InetSocketAddress;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -51,7 +52,8 @@ public class GeyserBungeeDumpInfo extends BootstrapDumpInfo {
this.plugins = new ArrayList<>(); this.plugins = new ArrayList<>();
for (net.md_5.bungee.api.config.ListenerInfo listener : proxy.getConfig().getListeners()) { for (net.md_5.bungee.api.config.ListenerInfo listener : proxy.getConfig().getListeners()) {
this.listeners.add(new ListenerInfo(listener.getHost().getHostString(), listener.getHost().getPort())); InetSocketAddress address = (InetSocketAddress) listener.getSocketAddress();
this.listeners.add(new ListenerInfo(address.getHostString(), address.getPort()));
} }
for (Plugin plugin : proxy.getPluginManager().getPlugins()) { for (Plugin plugin : proxy.getPluginManager().getPlugins()) {

View file

@ -39,6 +39,7 @@ import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.event.EventHandler; import net.md_5.bungee.event.EventHandler;
import net.md_5.bungee.netty.PipelineUtils; import net.md_5.bungee.netty.PipelineUtils;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserBootstrap;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.network.netty.GeyserInjector; import org.geysermc.geyser.network.netty.GeyserInjector;
@ -125,7 +126,7 @@ public class GeyserBungeeInjector extends GeyserInjector implements Listener {
.channel(LocalServerChannelWrapper.class) .channel(LocalServerChannelWrapper.class)
.childHandler(new ChannelInitializer<>() { .childHandler(new ChannelInitializer<>() {
@Override @Override
protected void initChannel(Channel ch) throws Exception { protected void initChannel(@NonNull Channel ch) throws Exception {
if (proxy.getConfig().getServers() == null) { if (proxy.getConfig().getServers() == null) {
// Proxy hasn't finished loading all plugins - it loads the config after all plugins // Proxy hasn't finished loading all plugins - it loads the config after all plugins
// Probably doesn't need to be translatable? // Probably doesn't need to be translatable?

View file

@ -35,6 +35,7 @@ import net.md_5.bungee.api.connection.PendingConnection;
import net.md_5.bungee.api.event.ProxyPingEvent; import net.md_5.bungee.api.event.ProxyPingEvent;
import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.protocol.ProtocolConstants; import net.md_5.bungee.protocol.ProtocolConstants;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.ping.GeyserPingInfo; import org.geysermc.geyser.ping.GeyserPingInfo;
import org.geysermc.geyser.ping.IGeyserPingPassthrough; import org.geysermc.geyser.ping.IGeyserPingPassthrough;
@ -104,7 +105,7 @@ public class GeyserBungeePingPassthrough implements IGeyserPingPassthrough, List
} }
@Override @Override
public InetSocketAddress getVirtualHost() { public @Nullable InetSocketAddress getVirtualHost() {
return null; return null;
} }

View file

@ -30,6 +30,7 @@ import net.md_5.bungee.BungeeCord;
import net.md_5.bungee.api.config.ListenerInfo; import net.md_5.bungee.api.config.ListenerInfo;
import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.protocol.ProtocolConstants; import net.md_5.bungee.protocol.ProtocolConstants;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.api.util.PlatformType;
import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserBootstrap;
@ -44,7 +45,6 @@ import org.geysermc.geyser.ping.IGeyserPingPassthrough;
import org.geysermc.geyser.platform.bungeecord.command.GeyserBungeeCommandExecutor; import org.geysermc.geyser.platform.bungeecord.command.GeyserBungeeCommandExecutor;
import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.GeyserLocale;
import org.geysermc.geyser.util.FileUtils; import org.geysermc.geyser.util.FileUtils;
import org.jetbrains.annotations.NotNull;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -72,6 +72,7 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap {
private static boolean INITIALIZED = false; private static boolean INITIALIZED = false;
@SuppressWarnings({"JavaReflectionMemberAccess", "ResultOfMethodCallIgnored"})
@Override @Override
public void onLoad() { public void onLoad() {
GeyserLocale.init(this); GeyserLocale.init(this);
@ -251,7 +252,7 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap {
return this.geyserInjector.getServerSocketAddress(); return this.geyserInjector.getServerSocketAddress();
} }
@NotNull @NonNull
@Override @Override
public String getServerBindAddress() { public String getServerBindAddress() {
return findCompatibleListener().map(InetSocketAddress::getHostString).orElse(""); return findCompatibleListener().map(InetSocketAddress::getHostString).orElse("");

View file

@ -29,6 +29,7 @@ import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer;
import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.ProxiedPlayer;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.command.GeyserCommandSource;
import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.GeyserLocale;
@ -50,7 +51,7 @@ public class BungeeCommandSource implements GeyserCommandSource {
} }
@Override @Override
public void sendMessage(String message) { public void sendMessage(@NonNull String message) {
handle.sendMessage(TextComponent.fromLegacyText(message)); handle.sendMessage(TextComponent.fromLegacyText(message));
} }

View file

@ -43,21 +43,27 @@ import java.util.stream.Collectors;
@Getter @Getter
public class GeyserFabricDumpInfo extends BootstrapDumpInfo { public class GeyserFabricDumpInfo extends BootstrapDumpInfo {
private String platformVersion = null; private final String platformName;
private String platformVersion;
private final String minecraftVersion;
private final EnvType environmentType; private final EnvType environmentType;
@AsteriskSerializer.Asterisk(isIp = true) @AsteriskSerializer.Asterisk(isIp = true)
private final String serverIP; private final String serverIP;
private final int serverPort; private final int serverPort;
private final boolean onlineMode;
private final List<ModInfo> mods; private final List<ModInfo> mods;
public GeyserFabricDumpInfo(MinecraftServer server) { public GeyserFabricDumpInfo(MinecraftServer server) {
this.platformName = server.getServerModName();
FabricLoader.getInstance().getModContainer("fabricloader").ifPresent(mod -> FabricLoader.getInstance().getModContainer("fabricloader").ifPresent(mod ->
this.platformVersion = mod.getMetadata().getVersion().getFriendlyString()); this.platformVersion = mod.getMetadata().getVersion().getFriendlyString());
this.minecraftVersion = server.getServerVersion();
this.environmentType = FabricLoader.getInstance().getEnvironmentType(); this.environmentType = FabricLoader.getInstance().getEnvironmentType();
this.serverIP = server.getLocalIp() == null ? "unknown" : server.getLocalIp(); this.serverIP = server.getLocalIp() == null ? "unknown" : server.getLocalIp();
this.serverPort = server.getPort(); this.serverPort = server.getPort();
this.onlineMode = server.usesAuthentication();
this.mods = new ArrayList<>(); this.mods = new ArrayList<>();
for (ModContainer mod : FabricLoader.getInstance().getAllMods()) { for (ModContainer mod : FabricLoader.getInstance().getAllMods()) {

View file

@ -37,6 +37,8 @@ import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands; import net.minecraft.commands.Commands;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserBootstrap;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.GeyserLogger; import org.geysermc.geyser.GeyserLogger;
@ -54,8 +56,6 @@ import org.geysermc.geyser.platform.fabric.command.GeyserFabricCommandExecutor;
import org.geysermc.geyser.platform.fabric.world.GeyserFabricWorldManager; import org.geysermc.geyser.platform.fabric.world.GeyserFabricWorldManager;
import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.GeyserLocale;
import org.geysermc.geyser.util.FileUtils; import org.geysermc.geyser.util.FileUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -251,7 +251,7 @@ public class GeyserFabricMod implements ModInitializer, GeyserBootstrap {
return this.server.getServerVersion(); return this.server.getServerVersion();
} }
@NotNull @NonNull
@Override @Override
public String getServerBindAddress() { public String getServerBindAddress() {
String ip = this.server.getLocalIp(); String ip = this.server.getLocalIp();

View file

@ -30,11 +30,12 @@ import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.CommandSourceStack;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.command.GeyserCommandSource;
import org.geysermc.geyser.text.ChatColor; import org.geysermc.geyser.text.ChatColor;
import javax.annotation.Nonnull; import java.util.Objects;
public class FabricCommandSender implements GeyserCommandSource { public class FabricCommandSender implements GeyserCommandSource {
@ -50,7 +51,7 @@ public class FabricCommandSender implements GeyserCommandSource {
} }
@Override @Override
public void sendMessage(@Nonnull String message) { public void sendMessage(@NonNull String message) {
if (source.getEntity() instanceof ServerPlayer) { if (source.getEntity() instanceof ServerPlayer) {
((ServerPlayer) source.getEntity()).displayClientMessage(Component.literal(message), false); ((ServerPlayer) source.getEntity()).displayClientMessage(Component.literal(message), false);
} else { } else {
@ -62,7 +63,7 @@ public class FabricCommandSender implements GeyserCommandSource {
public void sendMessage(net.kyori.adventure.text.Component message) { public void sendMessage(net.kyori.adventure.text.Component message) {
if (source.getEntity() instanceof ServerPlayer player) { if (source.getEntity() instanceof ServerPlayer player) {
String decoded = GsonComponentSerializer.gson().serialize(message); String decoded = GsonComponentSerializer.gson().serialize(message);
player.displayClientMessage(Component.Serializer.fromJson(decoded), false); player.displayClientMessage(Objects.requireNonNull(Component.Serializer.fromJson(decoded)), false);
return; return;
} }
GeyserCommandSource.super.sendMessage(message); GeyserCommandSource.super.sendMessage(message);

View file

@ -52,12 +52,12 @@ public class GeyserFabricCommandExecutor extends GeyserCommandExecutor implement
} }
@Override @Override
public int run(CommandContext context) { public int run(CommandContext<CommandSourceStack> context) {
return runWithArgs(context, ""); return runWithArgs(context, "");
} }
public int runWithArgs(CommandContext context, String args) { public int runWithArgs(CommandContext<CommandSourceStack> context, String args) {
CommandSourceStack source = (CommandSourceStack) context.getSource(); CommandSourceStack source = context.getSource();
FabricCommandSender sender = new FabricCommandSender(source); FabricCommandSender sender = new FabricCommandSender(source);
GeyserSession session = getGeyserSession(sender); GeyserSession session = getGeyserSession(sender);
if (!testPermission(source)) { if (!testPermission(source)) {

View file

@ -42,6 +42,8 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.Objects;
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
@Mixin(IntegratedServer.class) @Mixin(IntegratedServer.class)
public class IntegratedServerMixin implements GeyserServerPortGetter { public class IntegratedServerMixin implements GeyserServerPortGetter {
@ -58,6 +60,7 @@ public class IntegratedServerMixin implements GeyserServerPortGetter {
// Ensure player locale has been loaded, in case it's different from Java system language // Ensure player locale has been loaded, in case it's different from Java system language
GeyserLocale.loadGeyserLocale(this.minecraft.options.languageCode); GeyserLocale.loadGeyserLocale(this.minecraft.options.languageCode);
// Give indication that Geyser is loaded // Give indication that Geyser is loaded
Objects.requireNonNull(this.minecraft.player);
this.minecraft.player.displayClientMessage(Component.literal(GeyserLocale.getPlayerLocaleString("geyser.core.start", this.minecraft.player.displayClientMessage(Component.literal(GeyserLocale.getPlayerLocaleString("geyser.core.start",
this.minecraft.options.languageCode, "localhost", String.valueOf(this.publishedPort))), false); this.minecraft.options.languageCode, "localhost", String.valueOf(this.publishedPort))), false);
} }

View file

@ -39,6 +39,7 @@ import net.minecraft.world.level.block.entity.BannerBlockEntity;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.LecternBlockEntity; import net.minecraft.world.level.block.entity.LecternBlockEntity;
import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.LevelChunk;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.cloudburstmc.math.vector.Vector3i; import org.cloudburstmc.math.vector.Vector3i;
import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtMap;
import org.cloudburstmc.nbt.NbtMapBuilder; import org.cloudburstmc.nbt.NbtMapBuilder;
@ -48,9 +49,9 @@ import org.geysermc.geyser.level.GeyserWorldManager;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.util.BlockEntityUtils; import org.geysermc.geyser.util.BlockEntityUtils;
import javax.annotation.Nonnull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
public class GeyserFabricWorldManager extends GeyserWorldManager { public class GeyserFabricWorldManager extends GeyserWorldManager {
@ -73,9 +74,11 @@ public class GeyserFabricWorldManager extends GeyserWorldManager {
return; return;
} }
//noinspection resource - level() is just a getter
LevelChunk chunk = player.level().getChunk(x, z); LevelChunk chunk = player.level().getChunk(x, z);
final int chunkBlockX = x << 4; final int chunkBlockX = x << 4;
final int chunkBlockZ = z << 4; final int chunkBlockZ = z << 4;
//noinspection ForLoopReplaceableByForEach - avoid constructing iterator
for (int i = 0; i < blockEntityInfos.size(); i++) { for (int i = 0; i < blockEntityInfos.size(); i++) {
BlockEntityInfo blockEntityInfo = blockEntityInfos.get(i); BlockEntityInfo blockEntityInfo = blockEntityInfos.get(i);
BlockEntity blockEntity = chunk.getBlockEntity(new BlockPos(chunkBlockX + blockEntityInfo.getX(), BlockEntity blockEntity = chunk.getBlockEntity(new BlockPos(chunkBlockX + blockEntityInfo.getX(),
@ -92,7 +95,7 @@ public class GeyserFabricWorldManager extends GeyserWorldManager {
if (player == null) { if (player == null) {
return; return;
} }
//noinspection resource - level() is just a getter
BlockEntity blockEntity = player.level().getBlockEntity(new BlockPos(x, y, z)); BlockEntity blockEntity = player.level().getBlockEntity(new BlockPos(x, y, z));
sendLecternData(session, blockEntity, false); sendLecternData(session, blockEntity, false);
}); });
@ -159,7 +162,7 @@ public class GeyserFabricWorldManager extends GeyserWorldManager {
return GameMode.byId(server.getDefaultGameType().getId()); return GameMode.byId(server.getDefaultGameType().getId());
} }
@Nonnull @NonNull
@Override @Override
public CompletableFuture<com.github.steveice10.opennbt.tag.builtin.CompoundTag> getPickItemNbt(GeyserSession session, int x, int y, int z, boolean addNbtData) { public CompletableFuture<com.github.steveice10.opennbt.tag.builtin.CompoundTag> getPickItemNbt(GeyserSession session, int x, int y, int z, boolean addNbtData) {
CompletableFuture<com.github.steveice10.opennbt.tag.builtin.CompoundTag> future = new CompletableFuture<>(); CompletableFuture<com.github.steveice10.opennbt.tag.builtin.CompoundTag> future = new CompletableFuture<>();
@ -172,6 +175,7 @@ public class GeyserFabricWorldManager extends GeyserWorldManager {
BlockPos pos = new BlockPos(x, y, z); BlockPos pos = new BlockPos(x, y, z);
// Don't create a new block entity if invalid // Don't create a new block entity if invalid
//noinspection resource - level() is just a getter
BlockEntity blockEntity = player.level().getChunkAt(pos).getBlockEntity(pos); BlockEntity blockEntity = player.level().getChunkAt(pos).getBlockEntity(pos);
if (blockEntity instanceof BannerBlockEntity banner) { if (blockEntity instanceof BannerBlockEntity banner) {
// Potentially exposes other NBT data? But we need to get the NBT data for the banner patterns *and* // Potentially exposes other NBT data? But we need to get the NBT data for the banner patterns *and*
@ -263,7 +267,7 @@ public class GeyserFabricWorldManager extends GeyserWorldManager {
} }
@Override @Override
public void visitCompound(CompoundTag compoundTag) { public void visitCompound(@NonNull CompoundTag compoundTag) {
currentTag = convert(currentKey, compoundTag); currentTag = convert(currentKey, compoundTag);
} }
@ -271,7 +275,7 @@ public class GeyserFabricWorldManager extends GeyserWorldManager {
OpenNbtTagVisitor visitor = new OpenNbtTagVisitor(name); OpenNbtTagVisitor visitor = new OpenNbtTagVisitor(name);
for (String key : compoundTag.getAllKeys()) { for (String key : compoundTag.getAllKeys()) {
visitor.currentKey = key; visitor.currentKey = key;
Tag tag = compoundTag.get(key); Tag tag = Objects.requireNonNull(compoundTag.get(key));
tag.accept(visitor); tag.accept(visitor);
visitor.root.put(visitor.currentTag); visitor.root.put(visitor.currentTag);
} }
@ -279,7 +283,7 @@ public class GeyserFabricWorldManager extends GeyserWorldManager {
} }
@Override @Override
public void visitEnd(EndTag endTag) { public void visitEnd(@NonNull EndTag endTag) {
} }
} }
} }

View file

@ -28,11 +28,11 @@ package org.geysermc.geyser.platform.spigot;
import com.destroystokyo.paper.event.server.PaperServerListPingEvent; import com.destroystokyo.paper.event.server.PaperServerListPingEvent;
import com.destroystokyo.paper.network.StatusClient; import com.destroystokyo.paper.network.StatusClient;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.network.GameProtocol;
import org.geysermc.geyser.ping.GeyserPingInfo; import org.geysermc.geyser.ping.GeyserPingInfo;
import org.geysermc.geyser.ping.IGeyserPingPassthrough; import org.geysermc.geyser.ping.IGeyserPingPassthrough;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
@ -50,6 +50,7 @@ public final class GeyserPaperPingPassthrough implements IGeyserPingPassthrough
this.logger = logger; this.logger = logger;
} }
@SuppressWarnings("deprecation")
@Nullable @Nullable
@Override @Override
public GeyserPingInfo getPingInformation(InetSocketAddress inetSocketAddress) { public GeyserPingInfo getPingInformation(InetSocketAddress inetSocketAddress) {
@ -89,7 +90,7 @@ public final class GeyserPaperPingPassthrough implements IGeyserPingPassthrough
private record GeyserStatusClient(InetSocketAddress address) implements StatusClient { private record GeyserStatusClient(InetSocketAddress address) implements StatusClient {
@Override @Override
public @NotNull InetSocketAddress getAddress() { public @NonNull InetSocketAddress getAddress() {
return address; return address;
} }

View file

@ -34,7 +34,7 @@ import org.geysermc.geyser.GeyserImpl;
/** /**
* Disables the compression packet (and the compression handlers from being added to the pipeline) for Geyser clients * Disables the compression packet (and the compression handlers from being added to the pipeline) for Geyser clients
* that won't be receiving the data over the network. * that won't be receiving the data over the network.
* * <p>
* As of 1.8 - 1.17.1, compression is enabled in the Netty pipeline by adding a listener after a packet is written. * As of 1.8 - 1.17.1, compression is enabled in the Netty pipeline by adding a listener after a packet is written.
* If we simply "cancel" or don't forward the packet, then the listener is never called. * If we simply "cancel" or don't forward the packet, then the listener is never called.
*/ */

View file

@ -47,6 +47,7 @@ public class GeyserSpigotDumpInfo extends BootstrapDumpInfo {
private final int serverPort; private final int serverPort;
private final List<PluginInfo> plugins; private final List<PluginInfo> plugins;
@SuppressWarnings("deprecation")
GeyserSpigotDumpInfo() { GeyserSpigotDumpInfo() {
super(); super();
this.platformName = Bukkit.getName(); this.platformName = Bukkit.getName();

View file

@ -32,6 +32,7 @@ import io.netty.channel.*;
import io.netty.channel.local.LocalAddress; import io.netty.channel.local.LocalAddress;
import io.netty.util.concurrent.DefaultThreadFactory; import io.netty.util.concurrent.DefaultThreadFactory;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserBootstrap;
import org.geysermc.geyser.network.netty.GeyserInjector; import org.geysermc.geyser.network.netty.GeyserInjector;
import org.geysermc.geyser.network.netty.LocalServerChannelWrapper; import org.geysermc.geyser.network.netty.LocalServerChannelWrapper;
@ -74,12 +75,10 @@ public class GeyserSpigotInjector extends GeyserInjector {
Object connection = null; Object connection = null;
// Find the class that manages network IO // Find the class that manages network IO
for (Method m : serverClazz.getDeclaredMethods()) { for (Method m : serverClazz.getDeclaredMethods()) {
if (m.getReturnType() != null) { // First is Spigot-mapped name, second is Mojang-mapped name which is implemented as future-proofing
// First is Spigot-mapped name, second is Mojang-mapped name which is implemented as future-proofing if (m.getReturnType().getSimpleName().equals("ServerConnection") || m.getReturnType().getSimpleName().equals("ServerConnectionListener")) {
if (m.getReturnType().getSimpleName().equals("ServerConnection") || m.getReturnType().getSimpleName().equals("ServerConnectionListener")) { if (m.getParameterTypes().length == 0) {
if (m.getParameterTypes().length == 0) { connection = m.invoke(server);
connection = m.invoke(server);
}
} }
} }
} }
@ -117,7 +116,7 @@ public class GeyserSpigotInjector extends GeyserInjector {
.channel(LocalServerChannelWrapper.class) .channel(LocalServerChannelWrapper.class)
.childHandler(new ChannelInitializer<>() { .childHandler(new ChannelInitializer<>() {
@Override @Override
protected void initChannel(Channel ch) throws Exception { protected void initChannel(@NonNull Channel ch) throws Exception {
initChannel.invoke(childHandler, ch); initChannel.invoke(childHandler, ch);
if (bootstrap.getGeyserConfig().isDisableCompression() && GeyserSpigotCompressionDisabler.ENABLED) { if (bootstrap.getGeyserConfig().isDisableCompression() && GeyserSpigotCompressionDisabler.ENABLED) {

View file

@ -30,10 +30,12 @@ import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.server.ServerListPingEvent; import org.bukkit.event.server.ServerListPingEvent;
import org.bukkit.util.CachedServerIcon; import org.bukkit.util.CachedServerIcon;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.network.GameProtocol;
import org.geysermc.geyser.ping.GeyserPingInfo; import org.geysermc.geyser.ping.GeyserPingInfo;
import org.geysermc.geyser.ping.IGeyserPingPassthrough; import org.geysermc.geyser.ping.IGeyserPingPassthrough;
import javax.annotation.Nonnull;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.util.Collections; import java.util.Collections;
@ -44,8 +46,9 @@ public class GeyserSpigotPingPassthrough implements IGeyserPingPassthrough {
private final GeyserSpigotLogger logger; private final GeyserSpigotLogger logger;
@SuppressWarnings("deprecation")
@Override @Override
public GeyserPingInfo getPingInformation(InetSocketAddress inetSocketAddress) { public @Nullable GeyserPingInfo getPingInformation(InetSocketAddress inetSocketAddress) {
try { try {
ServerListPingEvent event = new GeyserPingEvent(inetSocketAddress.getAddress(), Bukkit.getMotd(), Bukkit.getOnlinePlayers().size(), Bukkit.getMaxPlayers()); ServerListPingEvent event = new GeyserPingEvent(inetSocketAddress.getAddress(), Bukkit.getMotd(), Bukkit.getOnlinePlayers().size(), Bukkit.getMaxPlayers());
Bukkit.getPluginManager().callEvent(event); Bukkit.getPluginManager().callEvent(event);
@ -67,7 +70,7 @@ public class GeyserSpigotPingPassthrough implements IGeyserPingPassthrough {
public void setServerIcon(CachedServerIcon icon) throws IllegalArgumentException, UnsupportedOperationException { public void setServerIcon(CachedServerIcon icon) throws IllegalArgumentException, UnsupportedOperationException {
} }
@Nonnull @NonNull
@Override @Override
public Iterator<Player> iterator() throws UnsupportedOperationException { public Iterator<Player> iterator() throws UnsupportedOperationException {
return Collections.emptyIterator(); return Collections.emptyIterator();

View file

@ -42,13 +42,14 @@ import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionDefault; import org.bukkit.permissions.PermissionDefault;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.geysermc.geyser.api.util.PlatformType; import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.geyser.Constants; import org.geysermc.geyser.Constants;
import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserBootstrap;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.adapters.spigot.SpigotAdapters; import org.geysermc.geyser.adapters.spigot.SpigotAdapters;
import org.geysermc.geyser.api.command.Command; import org.geysermc.geyser.api.command.Command;
import org.geysermc.geyser.api.extension.Extension; import org.geysermc.geyser.api.extension.Extension;
import org.geysermc.geyser.api.util.PlatformType;
import org.geysermc.geyser.command.GeyserCommandManager; import org.geysermc.geyser.command.GeyserCommandManager;
import org.geysermc.geyser.configuration.GeyserConfiguration; import org.geysermc.geyser.configuration.GeyserConfiguration;
import org.geysermc.geyser.dump.BootstrapDumpInfo; import org.geysermc.geyser.dump.BootstrapDumpInfo;
@ -66,7 +67,6 @@ import org.geysermc.geyser.platform.spigot.world.manager.GeyserSpigotNativeWorld
import org.geysermc.geyser.platform.spigot.world.manager.GeyserSpigotWorldManager; import org.geysermc.geyser.platform.spigot.world.manager.GeyserSpigotWorldManager;
import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.GeyserLocale;
import org.geysermc.geyser.util.FileUtils; import org.geysermc.geyser.util.FileUtils;
import org.jetbrains.annotations.NotNull;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -76,6 +76,7 @@ import java.net.SocketAddress;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.UUID; import java.util.UUID;
import java.util.logging.Level; import java.util.logging.Level;
@ -137,6 +138,7 @@ public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap {
// This is manually done instead of using Bukkit methods to save the config because otherwise comments get removed // This is manually done instead of using Bukkit methods to save the config because otherwise comments get removed
try { try {
if (!getDataFolder().exists()) { if (!getDataFolder().exists()) {
//noinspection ResultOfMethodCallIgnored
getDataFolder().mkdir(); getDataFolder().mkdir();
} }
File configFile = FileUtils.fileOrCopiedFromResource(new File(getDataFolder(), "config.yml"), "config.yml", File configFile = FileUtils.fileOrCopiedFromResource(new File(getDataFolder(), "config.yml"), "config.yml",
@ -272,6 +274,7 @@ public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap {
} }
PluginCommand geyserCommand = this.getCommand("geyser"); PluginCommand geyserCommand = this.getCommand("geyser");
Objects.requireNonNull(geyserCommand, "base command cannot be null");
geyserCommand.setExecutor(new GeyserSpigotCommandExecutor(geyser, geyserCommandManager.getCommands())); geyserCommand.setExecutor(new GeyserSpigotCommandExecutor(geyser, geyserCommandManager.getCommands()));
for (Map.Entry<Extension, Map<String, Command>> entry : this.geyserCommandManager.extensionCommands().entrySet()) { for (Map.Entry<Extension, Map<String, Command>> entry : this.geyserCommandManager.extensionCommands().entrySet()) {
@ -437,7 +440,7 @@ public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap {
return false; return false;
} }
@NotNull @NonNull
@Override @Override
public String getServerBindAddress() { public String getServerBindAddress() {
return Bukkit.getIp(); return Bukkit.getIp();

View file

@ -39,6 +39,7 @@ import java.lang.reflect.Modifier;
public final class GeyserSpigotVersionChecker { public final class GeyserSpigotVersionChecker {
private static final String VIAVERSION_DOWNLOAD_URL = "https://ci.viaversion.com/job/ViaVersion/"; private static final String VIAVERSION_DOWNLOAD_URL = "https://ci.viaversion.com/job/ViaVersion/";
@SuppressWarnings("deprecation")
public static void checkForSupportedProtocol(GeyserLogger logger, boolean viaversion) { public static void checkForSupportedProtocol(GeyserLogger logger, boolean viaversion) {
if (viaversion) { if (viaversion) {
checkViaVersionSupportedVersions(logger); checkViaVersionSupportedVersions(logger);

View file

@ -28,8 +28,8 @@ package org.geysermc.geyser.platform.spigot;
import com.github.steveice10.mc.protocol.data.DefaultComponentSerializer; import com.github.steveice10.mc.protocol.data.DefaultComponentSerializer;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.jetbrains.annotations.Nullable;
import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles;
@ -39,8 +39,8 @@ import java.lang.reflect.Method;
/** /**
* Utility class for converting our shaded Adventure into the Adventure bundled in Paper. * Utility class for converting our shaded Adventure into the Adventure bundled in Paper.
* * <p>
* Code mostly taken from https://github.com/KyoriPowered/adventure-platform/blob/94d5821f2e755170f42bd8a5fe1d5bf6f66d04ad/platform-bukkit/src/main/java/net/kyori/adventure/platform/bukkit/PaperFacet.java#L46 * Code mostly taken from <a href="https://github.com/KyoriPowered/adventure-platform/blob/94d5821f2e755170f42bd8a5fe1d5bf6f66d04ad/platform-bukkit/src/main/java/net/kyori/adventure/platform/bukkit/PaperFacet.java#L46">here</a>
* and the MinecraftReflection class. * and the MinecraftReflection class.
*/ */
public final class PaperAdventure { public final class PaperAdventure {
@ -102,7 +102,7 @@ public final class PaperAdventure {
SEND_MESSAGE_COMPONENT = playerComponentSendMessage; SEND_MESSAGE_COMPONENT = playerComponentSendMessage;
} }
public static Object toNativeComponent(final Component component) { public static @Nullable Object toNativeComponent(final Component component) {
if (NATIVE_GSON_COMPONENT_SERIALIZER_DESERIALIZE_METHOD_BOUND == null) { if (NATIVE_GSON_COMPONENT_SERIALIZER_DESERIALIZE_METHOD_BOUND == null) {
GeyserImpl.getInstance().getLogger().error("Illegal state where Component serialization was called when it wasn't available!"); GeyserImpl.getInstance().getLogger().error("Illegal state where Component serialization was called when it wasn't available!");
return null; return null;

View file

@ -29,8 +29,8 @@ import com.destroystokyo.paper.event.server.PaperServerListPingEvent;
import com.destroystokyo.paper.network.StatusClient; import com.destroystokyo.paper.network.StatusClient;
import org.bukkit.event.server.ServerListPingEvent; import org.bukkit.event.server.ServerListPingEvent;
import org.bukkit.util.CachedServerIcon; import org.bukkit.util.CachedServerIcon;
import org.checkerframework.checker.nullness.qual.Nullable;
import javax.annotation.Nullable;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.net.InetAddress; import java.net.InetAddress;
@ -40,15 +40,8 @@ import java.net.InetAddress;
public final class ReflectedNames { public final class ReflectedNames {
static boolean checkPaperPingEvent() { static boolean checkPaperPingEvent() {
return classExists("com.destroystokyo.paper.event.server.PaperServerListPingEvent");
}
/**
* @return if this class name exists
*/
private static boolean classExists(String clazz) {
try { try {
Class.forName(clazz); Class.forName("com.destroystokyo.paper.event.server.PaperServerListPingEvent");
return true; return true;
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
return false; return false;
@ -59,7 +52,7 @@ public final class ReflectedNames {
return getConstructor(ServerListPingEvent.class, InetAddress.class, String.class, boolean.class, int.class, int.class) != null; return getConstructor(ServerListPingEvent.class, InetAddress.class, String.class, boolean.class, int.class, int.class) != null;
} }
static Constructor<PaperServerListPingEvent> getOldPaperPingConstructor() { static @Nullable Constructor<PaperServerListPingEvent> getOldPaperPingConstructor() {
if (getConstructor(PaperServerListPingEvent.class, StatusClient.class, String.class, int.class, if (getConstructor(PaperServerListPingEvent.class, StatusClient.class, String.class, int.class,
int.class, String.class, int.class, CachedServerIcon.class) != null) { int.class, String.class, int.class, CachedServerIcon.class) != null) {
// @NotNull StatusClient client, @NotNull String motd, int numPlayers, int maxPlayers, // @NotNull StatusClient client, @NotNull String motd, int numPlayers, int maxPlayers,

View file

@ -39,8 +39,8 @@ import java.util.Map;
public final class GeyserPaperCommandListener implements Listener { public final class GeyserPaperCommandListener implements Listener {
@SuppressWarnings("UnstableApiUsage")
@EventHandler @EventHandler
@SuppressWarnings("deprecation") // Used to indicate an unstable event
public void onCommandSend(AsyncPlayerSendCommandsEvent<?> event) { public void onCommandSend(AsyncPlayerSendCommandsEvent<?> event) {
// Documentation says to check (event.isAsynchronous() || !event.hasFiredAsync()), but as of Paper 1.18.2 // Documentation says to check (event.isAsynchronous() || !event.hasFiredAsync()), but as of Paper 1.18.2
// event.hasFiredAsync is never true // event.hasFiredAsync is never true

View file

@ -29,6 +29,7 @@ import org.bukkit.ChatColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor; import org.bukkit.command.TabExecutor;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.command.GeyserCommand; import org.geysermc.geyser.command.GeyserCommand;
import org.geysermc.geyser.command.GeyserCommandExecutor; import org.geysermc.geyser.command.GeyserCommandExecutor;
@ -47,7 +48,7 @@ public class GeyserSpigotCommandExecutor extends GeyserCommandExecutor implement
} }
@Override @Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { public boolean onCommand(@NonNull CommandSender sender, @NonNull Command command, @NonNull String label, String[] args) {
SpigotCommandSource commandSender = new SpigotCommandSource(sender); SpigotCommandSource commandSender = new SpigotCommandSource(sender);
GeyserSession session = getGeyserSession(commandSender); GeyserSession session = getGeyserSession(commandSender);
@ -78,7 +79,7 @@ public class GeyserSpigotCommandExecutor extends GeyserCommandExecutor implement
} }
@Override @Override
public List<String> onTabComplete(CommandSender sender, Command command, String label, String[] args) { public List<String> onTabComplete(@NonNull CommandSender sender, @NonNull Command command, @NonNull String label, String[] args) {
if (args.length == 1) { if (args.length == 1) {
return tabComplete(new SpigotCommandSource(sender)); return tabComplete(new SpigotCommandSource(sender));
} }

View file

@ -29,6 +29,7 @@ import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer;
import org.bukkit.command.ConsoleCommandSender; import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.command.GeyserCommandSource;
import org.geysermc.geyser.platform.spigot.PaperAdventure; import org.geysermc.geyser.platform.spigot.PaperAdventure;
import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.GeyserLocale;
@ -48,10 +49,11 @@ public class SpigotCommandSource implements GeyserCommandSource {
} }
@Override @Override
public void sendMessage(String message) { public void sendMessage(@NonNull String message) {
handle.sendMessage(message); handle.sendMessage(message);
} }
@SuppressWarnings("deprecation")
@Override @Override
public void sendMessage(Component message) { public void sendMessage(Component message) {
if (PaperAdventure.canSendMessageUsingComponent()) { if (PaperAdventure.canSendMessageUsingComponent()) {
@ -68,9 +70,11 @@ public class SpigotCommandSource implements GeyserCommandSource {
return handle instanceof ConsoleCommandSender; return handle instanceof ConsoleCommandSender;
} }
@SuppressWarnings("deprecation")
@Override @Override
public String locale() { public String locale() {
if (this.handle instanceof Player player) { if (this.handle instanceof Player player) {
// getLocale() is deprecated on Paper, but not on Spigot
return player.getLocale(); return player.getLocale();
} }

View file

@ -37,6 +37,7 @@ import org.geysermc.geyser.platform.spigot.GeyserSpigotPlugin;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import java.util.List; import java.util.List;
import java.util.Objects;
/** /**
* Used when block IDs need to be translated to the latest version * Used when block IDs need to be translated to the latest version
@ -52,6 +53,7 @@ public class GeyserSpigotLegacyNativeWorldManager extends GeyserSpigotNativeWorl
ProtocolVersion serverVersion = plugin.getServerProtocolVersion(); ProtocolVersion serverVersion = plugin.getServerProtocolVersion();
List<ProtocolPathEntry> protocolList = Via.getManager().getProtocolManager().getProtocolPath(GameProtocol.getJavaProtocolVersion(), List<ProtocolPathEntry> protocolList = Via.getManager().getProtocolManager().getProtocolPath(GameProtocol.getJavaProtocolVersion(),
serverVersion.getVersion()); serverVersion.getVersion());
Objects.requireNonNull(protocolList, "protocolList cannot be null");
for (int oldBlockId : allBlockStates) { for (int oldBlockId : allBlockStates) {
int newBlockId = oldBlockId; int newBlockId = oldBlockId;
// protocolList should *not* be null; we checked for that before initializing this class // protocolList should *not* be null; we checked for that before initializing this class

View file

@ -28,11 +28,11 @@ package org.geysermc.geyser.platform.spigot.world.manager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.adapters.spigot.SpigotAdapters; import org.geysermc.geyser.adapters.spigot.SpigotAdapters;
import org.geysermc.geyser.adapters.spigot.SpigotWorldAdapter; import org.geysermc.geyser.adapters.spigot.SpigotWorldAdapter;
import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.level.block.BlockStateValues;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import org.jetbrains.annotations.Nullable;
public class GeyserSpigotNativeWorldManager extends GeyserSpigotWorldManager { public class GeyserSpigotNativeWorldManager extends GeyserSpigotWorldManager {
protected final SpigotWorldAdapter adapter; protected final SpigotWorldAdapter adapter;

View file

@ -34,21 +34,23 @@ import org.bukkit.World;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtMap;
import org.geysermc.erosion.bukkit.BukkitLecterns; import org.geysermc.erosion.bukkit.BukkitLecterns;
import org.geysermc.erosion.bukkit.BukkitUtils; import org.geysermc.erosion.bukkit.BukkitUtils;
import org.geysermc.erosion.bukkit.PickBlockUtils; import org.geysermc.erosion.bukkit.PickBlockUtils;
import org.geysermc.erosion.bukkit.SchedulerUtils; import org.geysermc.erosion.bukkit.SchedulerUtils;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.level.GameRule; import org.geysermc.geyser.level.GameRule;
import org.geysermc.geyser.level.WorldManager; import org.geysermc.geyser.level.WorldManager;
import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.level.block.BlockStateValues;
import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.registry.BlockRegistries;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.util.BlockEntityUtils; import org.geysermc.geyser.util.BlockEntityUtils;
import org.jetbrains.annotations.Nullable;
import javax.annotation.Nonnull;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
/** /**
@ -128,7 +130,7 @@ public class GeyserSpigotWorldManager extends WorldManager {
} }
} }
private Chunk getChunk(World world, int x, int z) { private @Nullable Chunk getChunk(World world, int x, int z) {
if (!world.isChunkLoaded(x, z)) { if (!world.isChunkLoaded(x, z)) {
return null; return null;
} }
@ -136,6 +138,7 @@ public class GeyserSpigotWorldManager extends WorldManager {
} }
private void sendLecternData(GeyserSession session, Chunk chunk, List<BlockEntityInfo> blockEntityInfos) { private void sendLecternData(GeyserSession session, Chunk chunk, List<BlockEntityInfo> blockEntityInfos) {
//noinspection ForLoopReplaceableByForEach - avoid constructing Iterator
for (int i = 0; i < blockEntityInfos.size(); i++) { for (int i = 0; i < blockEntityInfos.size(); i++) {
BlockEntityInfo info = blockEntityInfos.get(i); BlockEntityInfo info = blockEntityInfos.get(i);
Block block = chunk.getBlock(info.getX(), info.getY(), info.getZ()); Block block = chunk.getBlock(info.getX(), info.getY(), info.getZ());
@ -156,19 +159,34 @@ public class GeyserSpigotWorldManager extends WorldManager {
} }
public boolean getGameRuleBool(GeyserSession session, GameRule gameRule) { public boolean getGameRuleBool(GeyserSession session, GameRule gameRule) {
String value = Bukkit.getPlayer(session.getPlayerEntity().getUsername()).getWorld().getGameRuleValue(gameRule.getJavaID()); org.bukkit.GameRule<?> bukkitGameRule = org.bukkit.GameRule.getByName(gameRule.getJavaID());
if (!value.isEmpty()) { if (bukkitGameRule == null) {
return Boolean.parseBoolean(value); GeyserImpl.getInstance().getLogger().debug("Unknown game rule " + gameRule.getJavaID());
return gameRule.getDefaultBooleanValue();
} }
Player bukkitPlayer = Objects.requireNonNull(Bukkit.getPlayer(session.getPlayerEntity().getUuid()));
Object value = bukkitPlayer.getWorld().getGameRuleValue(bukkitGameRule);
if (value instanceof Boolean booleanValue) {
return booleanValue;
}
GeyserImpl.getInstance().getLogger().debug("Expected a bool for " + gameRule + " but got " + value);
return gameRule.getDefaultBooleanValue(); return gameRule.getDefaultBooleanValue();
} }
@Override @Override
public int getGameRuleInt(GeyserSession session, GameRule gameRule) { public int getGameRuleInt(GeyserSession session, GameRule gameRule) {
String value = Bukkit.getPlayer(session.getPlayerEntity().getUsername()).getWorld().getGameRuleValue(gameRule.getJavaID()); org.bukkit.GameRule<?> bukkitGameRule = org.bukkit.GameRule.getByName(gameRule.getJavaID());
if (!value.isEmpty()) { if (bukkitGameRule == null) {
return Integer.parseInt(value); GeyserImpl.getInstance().getLogger().debug("Unknown game rule " + gameRule.getJavaID());
return gameRule.getDefaultIntValue();
} }
Player bukkitPlayer = Objects.requireNonNull(Bukkit.getPlayer(session.getPlayerEntity().getUuid()));
Object value = bukkitPlayer.getWorld().getGameRuleValue(bukkitGameRule);
if (value instanceof Integer intValue) {
return intValue;
}
GeyserImpl.getInstance().getLogger().debug("Expected an int for " + gameRule + " but got " + value);
return gameRule.getDefaultIntValue(); return gameRule.getDefaultIntValue();
} }
@ -179,12 +197,11 @@ public class GeyserSpigotWorldManager extends WorldManager {
@Override @Override
public boolean hasPermission(GeyserSession session, String permission) { public boolean hasPermission(GeyserSession session, String permission) {
return Bukkit.getPlayer(session.getPlayerEntity().getUsername()).hasPermission(permission); return Objects.requireNonNull(Bukkit.getPlayer(session.getPlayerEntity().getUsername())).hasPermission(permission);
} }
@Nonnull
@Override @Override
public CompletableFuture<@Nullable CompoundTag> getPickItemNbt(GeyserSession session, int x, int y, int z, boolean addNbtData) { public @NonNull CompletableFuture<@Nullable CompoundTag> getPickItemNbt(GeyserSession session, int x, int y, int z, boolean addNbtData) {
CompletableFuture<@Nullable CompoundTag> future = new CompletableFuture<>(); CompletableFuture<@Nullable CompoundTag> future = new CompletableFuture<>();
Player bukkitPlayer; Player bukkitPlayer;
if ((bukkitPlayer = Bukkit.getPlayer(session.getPlayerEntity().getUuid())) == null) { if ((bukkitPlayer = Bukkit.getPlayer(session.getPlayerEntity().getUuid())) == null) {

View file

@ -38,6 +38,7 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Logger; import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.appender.ConsoleAppender; import org.apache.logging.log4j.core.appender.ConsoleAppender;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.api.util.PlatformType;
import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserBootstrap;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
@ -51,7 +52,6 @@ import org.geysermc.geyser.platform.standalone.gui.GeyserStandaloneGUI;
import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.GeyserLocale;
import org.geysermc.geyser.util.FileUtils; import org.geysermc.geyser.util.FileUtils;
import org.geysermc.geyser.util.LoopbackUtil; import org.geysermc.geyser.util.LoopbackUtil;
import org.jetbrains.annotations.NotNull;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -292,7 +292,7 @@ public class GeyserStandaloneBootstrap implements GeyserBootstrap {
return new GeyserStandaloneDumpInfo(this); return new GeyserStandaloneDumpInfo(this);
} }
@NotNull @NonNull
@Override @Override
public String getServerBindAddress() { public String getServerBindAddress() {
throw new IllegalStateException(); throw new IllegalStateException();
@ -325,7 +325,7 @@ public class GeyserStandaloneBootstrap implements GeyserBootstrap {
// Get the ignored properties // Get the ignored properties
Set<String> ignoredProperties = OBJECT_MAPPER.getSerializationConfig().getAnnotationIntrospector() Set<String> ignoredProperties = OBJECT_MAPPER.getSerializationConfig().getAnnotationIntrospector()
.findPropertyIgnorals(beanDescription.getClassInfo()).getIgnored(); .findPropertyIgnoralByName(OBJECT_MAPPER.getSerializationConfig() ,beanDescription.getClassInfo()).getIgnored();
// Filter properties removing the ignored ones // Filter properties removing the ignored ones
return properties.stream() return properties.stream()
@ -340,7 +340,7 @@ public class GeyserStandaloneBootstrap implements GeyserBootstrap {
* @param parentObject The object to alter * @param parentObject The object to alter
* @param value The new value of the property * @param value The new value of the property
*/ */
@SuppressWarnings("unchecked") // Required for enum usage @SuppressWarnings({"unchecked", "rawtypes"}) // Required for enum usage
private static void setConfigOption(BeanPropertyDefinition property, Object parentObject, Object value) { private static void setConfigOption(BeanPropertyDefinition property, Object parentObject, Object value) {
Object parsedValue = value; Object parsedValue = value;

View file

@ -28,11 +28,16 @@ package org.geysermc.geyser.platform.standalone.gui;
import javax.swing.*; import javax.swing.*;
import javax.swing.text.*; import javax.swing.text.*;
import java.awt.*; import java.awt.*;
import java.io.Serial;
/** /**
* This class was based on this code: https://stackoverflow.com/a/6899478/5299903 * This class was based on this <a href="https://stackoverflow.com/a/6899478/5299903">code</a>
*/ */
public class ColorPane extends JTextPane { public class ColorPane extends JTextPane {
@Serial
private static final long serialVersionUID = 1L;
private static Color colorCurrent = ANSIColor.RESET.getColor(); private static Color colorCurrent = ANSIColor.RESET.getColor();
private String remaining = ""; private String remaining = "";
@ -62,7 +67,7 @@ public class ColorPane extends JTextPane {
int aPos = 0; // current char position in addString int aPos = 0; // current char position in addString
int aIndex; // index of next Escape sequence int aIndex; // index of next Escape sequence
int mIndex; // index of "m" terminating Escape sequence int mIndex; // index of "m" terminating Escape sequence
String tmpString = ""; String tmpString;
boolean stillSearching = true; // true until no more Escape sequences boolean stillSearching = true; // true until no more Escape sequences
String addString = remaining + s; String addString = remaining + s;
remaining = ""; remaining = "";

View file

@ -25,6 +25,7 @@
package org.geysermc.geyser.platform.standalone.gui; package org.geysermc.geyser.platform.standalone.gui;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.GeyserLogger; import org.geysermc.geyser.GeyserLogger;
import org.geysermc.geyser.command.GeyserCommandManager; import org.geysermc.geyser.command.GeyserCommandManager;
@ -64,7 +65,6 @@ public class GeyserStandaloneGUI {
private final List<Integer> ramValues = new ArrayList<>(); private final List<Integer> ramValues = new ArrayList<>();
private final DefaultTableModel playerTableModel = new DefaultTableModel(); private final DefaultTableModel playerTableModel = new DefaultTableModel();
private final JTable playerTable = new JTable(playerTableModel);
/** /**
* Create and show the Geyser-Standalone GUI * Create and show the Geyser-Standalone GUI
@ -158,6 +158,7 @@ public class GeyserStandaloneGUI {
playerTableModel.addColumn(GeyserLocale.getLocaleStringLog("geyser.gui.table.ip")); playerTableModel.addColumn(GeyserLocale.getLocaleStringLog("geyser.gui.table.ip"));
playerTableModel.addColumn(GeyserLocale.getLocaleStringLog("geyser.gui.table.username")); playerTableModel.addColumn(GeyserLocale.getLocaleStringLog("geyser.gui.table.username"));
JTable playerTable = new JTable(playerTableModel);
JScrollPane playerScrollPane = new JScrollPane(playerTable); JScrollPane playerScrollPane = new JScrollPane(playerTable);
rightContentPane.add(playerScrollPane); rightContentPane.add(playerScrollPane);
@ -253,12 +254,12 @@ public class GeyserStandaloneGUI {
} }
@Override @Override
public void write(byte[] b, int off, int len) { public void write(byte @NonNull [] b, int off, int len) {
appendConsole(new String(b, off, len)); appendConsole(new String(b, off, len));
} }
@Override @Override
public void write(byte[] b) { public void write(byte @NonNull[] b) {
write(b, 0, b.length); write(b, 0, b.length);
} }
}; };

View file

@ -29,15 +29,20 @@ import lombok.Setter;
import javax.swing.*; import javax.swing.*;
import java.awt.*; import java.awt.*;
import java.io.Serial;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
/** /**
* This has been modified to fit Geyser more but is based on * This has been modified to fit Geyser more but is based on
* https://gist.github.com/roooodcastro/6325153#gistcomment-3107524 * <a href="https://gist.github.com/roooodcastro/6325153#gistcomment-3107524">this Github gist</a>
*/ */
public final class GraphPanel extends JPanel { public final class GraphPanel extends JPanel {
@Serial
private static final long serialVersionUID = 1L;
private final static int padding = 10; private final static int padding = 10;
private final static int labelPadding = 25; private final static int labelPadding = 25;
private final static int pointWidth = 4; private final static int pointWidth = 4;
@ -103,7 +108,7 @@ public final class GraphPanel extends JPanel {
g.drawLine(padding + labelPadding + 1 + pointWidth, y, width - padding, y); g.drawLine(padding + labelPadding + 1 + pointWidth, y, width - padding, y);
g.setColor(Color.BLACK); g.setColor(Color.BLACK);
final int tickValue = (int) (minScore + ((scoreRange * i) / numberYDivisions)); final int tickValue = minScore + ((scoreRange * i) / numberYDivisions);
final String yLabel = tickValue + ""; final String yLabel = tickValue + "";
final int labelWidth = fontMetrics.stringWidth(yLabel); final int labelWidth = fontMetrics.stringWidth(yLabel);
g.drawString(yLabel, x1 - labelWidth - 5, y + (fontHeight / 2) - 3); g.drawString(yLabel, x1 - labelWidth - 5, y + (fontHeight / 2) - 3);

View file

@ -29,6 +29,7 @@ import com.velocitypowered.api.proxy.ProxyServer;
import io.netty.bootstrap.ServerBootstrap; import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*; import io.netty.channel.*;
import io.netty.channel.local.LocalAddress; import io.netty.channel.local.LocalAddress;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserBootstrap;
import org.geysermc.geyser.network.netty.GeyserInjector; import org.geysermc.geyser.network.netty.GeyserInjector;
import org.geysermc.geyser.network.netty.LocalServerChannelWrapper; import org.geysermc.geyser.network.netty.LocalServerChannelWrapper;
@ -76,7 +77,7 @@ public class GeyserVelocityInjector extends GeyserInjector {
.channel(LocalServerChannelWrapper.class) .channel(LocalServerChannelWrapper.class)
.childHandler(new ChannelInitializer<>() { .childHandler(new ChannelInitializer<>() {
@Override @Override
protected void initChannel(Channel ch) throws Exception { protected void initChannel(@NonNull Channel ch) throws Exception {
initChannel.invoke(channelInitializer, ch); initChannel.invoke(channelInitializer, ch);
if (bootstrap.getGeyserConfig().isDisableCompression() && GeyserVelocityCompressionDisabler.ENABLED) { if (bootstrap.getGeyserConfig().isDisableCompression() && GeyserVelocityCompressionDisabler.ENABLED) {

View file

@ -36,11 +36,13 @@ import com.velocitypowered.api.plugin.Plugin;
import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.ProxyServer;
import lombok.Getter; import lombok.Getter;
import net.kyori.adventure.util.Codec; import net.kyori.adventure.util.Codec;
import org.geysermc.geyser.api.util.PlatformType; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserBootstrap;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.api.command.Command; import org.geysermc.geyser.api.command.Command;
import org.geysermc.geyser.api.extension.Extension; import org.geysermc.geyser.api.extension.Extension;
import org.geysermc.geyser.api.util.PlatformType;
import org.geysermc.geyser.command.GeyserCommandManager; import org.geysermc.geyser.command.GeyserCommandManager;
import org.geysermc.geyser.configuration.GeyserConfiguration; import org.geysermc.geyser.configuration.GeyserConfiguration;
import org.geysermc.geyser.dump.BootstrapDumpInfo; import org.geysermc.geyser.dump.BootstrapDumpInfo;
@ -49,8 +51,6 @@ import org.geysermc.geyser.ping.IGeyserPingPassthrough;
import org.geysermc.geyser.platform.velocity.command.GeyserVelocityCommandExecutor; import org.geysermc.geyser.platform.velocity.command.GeyserVelocityCommandExecutor;
import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.GeyserLocale;
import org.geysermc.geyser.util.FileUtils; import org.geysermc.geyser.util.FileUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger; import org.slf4j.Logger;
import java.io.File; import java.io.File;
@ -222,7 +222,7 @@ public class GeyserVelocityPlugin implements GeyserBootstrap {
return this.geyserInjector.getServerSocketAddress(); return this.geyserInjector.getServerSocketAddress();
} }
@NotNull @NonNull
@Override @Override
public String getServerBindAddress() { public String getServerBindAddress() {
return proxyServer.getBoundAddress().getHostString(); return proxyServer.getBoundAddress().getHostString();

View file

@ -30,6 +30,7 @@ import com.velocitypowered.api.proxy.ConsoleCommandSource;
import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.Player;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.command.GeyserCommandSource;
import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.GeyserLocale;
@ -56,7 +57,7 @@ public class VelocityCommandSource implements GeyserCommandSource {
} }
@Override @Override
public void sendMessage(String message) { public void sendMessage(@NonNull String message) {
handle.sendMessage(LegacyComponentSerializer.legacy('§').deserialize(message)); handle.sendMessage(LegacyComponentSerializer.legacy('§').deserialize(message));
} }

View file

@ -1,5 +1,7 @@
plugins { plugins {
`java-library` `java-library`
// Ensure AP works in eclipse (no effect on other IDEs)
`eclipse`
id("geyser.build-logic") id("geyser.build-logic")
id("io.freefair.lombok") version "6.3.0" apply false id("io.freefair.lombok") version "6.3.0" apply false
} }

View file

@ -32,7 +32,7 @@ import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom; import java.security.SecureRandom;
public final class AesKeyProducer implements KeyProducer { public final class AesKeyProducer implements KeyProducer {
public static int KEY_SIZE = 128; public static final int KEY_SIZE = 128;
@Override @Override
public SecretKey produce() { public SecretKey produce() {

View file

@ -25,6 +25,7 @@
package org.geysermc.floodgate.crypto; package org.geysermc.floodgate.crypto;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.floodgate.util.InvalidFormatException; import org.geysermc.floodgate.util.InvalidFormatException;
import java.security.Key; import java.security.Key;
@ -97,7 +98,8 @@ public interface FloodgateCipher {
* @return the decrypted data in a UTF-8 String * @return the decrypted data in a UTF-8 String
* @throws Exception when the decrypting failed * @throws Exception when the decrypting failed
*/ */
default String decryptToString(byte[] data) throws Exception { @SuppressWarnings("unused")
default @Nullable String decryptToString(byte[] data) throws Exception {
byte[] decrypted = decrypt(data); byte[] decrypted = decrypt(data);
if (decrypted == null) { if (decrypted == null) {
return null; return null;
@ -113,6 +115,7 @@ public interface FloodgateCipher {
* @return the decrypted data in a byte[] * @return the decrypted data in a byte[]
* @throws Exception when the decrypting failed * @throws Exception when the decrypting failed
*/ */
@SuppressWarnings("unused")
default byte[] decryptFromString(String data) throws Exception { default byte[] decryptFromString(String data) throws Exception {
return decrypt(data.getBytes(UTF_8)); return decrypt(data.getBytes(UTF_8));
} }

View file

@ -31,7 +31,7 @@ import java.nio.file.Path;
import java.security.Key; import java.security.Key;
public interface KeyProducer { public interface KeyProducer {
Key produce(); @SuppressWarnings("unused") Key produce();
Key produceFrom(byte[] keyFileData); Key produceFrom(byte[] keyFileData);
default Key produceFrom(Path keyFileLocation) throws IOException { default Key produceFrom(Path keyFileLocation) throws IOException {

View file

@ -109,6 +109,7 @@ public final class NewsItem {
return (T) data; return (T) data;
} }
@SuppressWarnings("unused")
public String getRawMessage() { public String getRawMessage() {
return message; return message;
} }

View file

@ -25,6 +25,8 @@
package org.geysermc.floodgate.news; package org.geysermc.floodgate.news;
import org.checkerframework.checker.nullness.qual.Nullable;
public enum NewsItemAction { public enum NewsItemAction {
ON_SERVER_STARTED, ON_SERVER_STARTED,
ON_OPERATOR_JOIN, ON_OPERATOR_JOIN,
@ -33,7 +35,7 @@ public enum NewsItemAction {
private static final NewsItemAction[] VALUES = values(); private static final NewsItemAction[] VALUES = values();
public static NewsItemAction getByName(String actionName) { public static @Nullable NewsItemAction getByName(String actionName) {
for (NewsItemAction type : VALUES) { for (NewsItemAction type : VALUES) {
if (type.name().equalsIgnoreCase(actionName)) { if (type.name().equalsIgnoreCase(actionName)) {
return type; return type;

View file

@ -26,6 +26,7 @@
package org.geysermc.floodgate.news; package org.geysermc.floodgate.news;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import org.checkerframework.checker.nullness.qual.Nullable;
// {} is used for things that have to be filled in by the server, // {} is used for things that have to be filled in by the server,
// {@} is for things that have to be filled in by us // {@} is for things that have to be filled in by us
@ -49,7 +50,7 @@ public enum NewsItemMessage {
this.messageSplitted = messageFormat.split(" "); this.messageSplitted = messageFormat.split(" ");
} }
public static NewsItemMessage getById(int id) { public static @Nullable NewsItemMessage getById(int id) {
return VALUES.length > id ? VALUES[id] : null; return VALUES.length > id ? VALUES[id] : null;
} }

View file

@ -26,6 +26,7 @@
package org.geysermc.floodgate.news; package org.geysermc.floodgate.news;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.floodgate.news.data.*; import org.geysermc.floodgate.news.data.*;
import java.util.function.Function; import java.util.function.Function;
@ -44,7 +45,7 @@ public enum NewsType {
this.readFunction = readFunction; this.readFunction = readFunction;
} }
public static NewsType getByName(String newsType) { public static @Nullable NewsType getByName(String newsType) {
for (NewsType type : VALUES) { for (NewsType type : VALUES) {
if (type.name().equalsIgnoreCase(newsType)) { if (type.name().equalsIgnoreCase(newsType)) {
return type; return type;

View file

@ -56,6 +56,7 @@ public final class BuildSpecificData implements ItemData {
(allAffected || buildId > affectedGreaterThan && buildId < affectedLessThan); (allAffected || buildId > affectedGreaterThan && buildId < affectedLessThan);
} }
@SuppressWarnings("unused")
public String getBranch() { public String getBranch() {
return branch; return branch;
} }

View file

@ -51,6 +51,7 @@ public final class ConfigSpecificData implements ItemData {
return configSpecificData; return configSpecificData;
} }
@SuppressWarnings("unused")
public boolean isAffected(Map<String, String> config) { public boolean isAffected(Map<String, String> config) {
for (Map.Entry<String, Pattern> entry : affectedKeys.entrySet()) { for (Map.Entry<String, Pattern> entry : affectedKeys.entrySet()) {
if (config.containsKey(entry.getKey())) { if (config.containsKey(entry.getKey())) {

View file

@ -72,6 +72,7 @@ public final class BedrockData implements Cloneable {
false, subscribeId, verifyCode); false, subscribeId, verifyCode);
} }
@SuppressWarnings("unused")
public static BedrockData fromString(String data) { public static BedrockData fromString(String data) {
String[] split = data.split("\0"); String[] split = data.split("\0");
if (split.length != EXPECTED_LENGTH) { if (split.length != EXPECTED_LENGTH) {
@ -92,6 +93,7 @@ public final class BedrockData implements Cloneable {
dataLength); dataLength);
} }
@SuppressWarnings("unused")
public boolean hasPlayerLink() { public boolean hasPlayerLink() {
return linkedPlayer != null; return linkedPlayer != null;
} }

View file

@ -26,6 +26,9 @@
package org.geysermc.floodgate.util; package org.geysermc.floodgate.util;
public class InvalidFormatException extends Exception { public class InvalidFormatException extends Exception {
private static final long serialVersionUID = 1L;
public InvalidFormatException(String message) { public InvalidFormatException(String message) {
super(message); super(message);
} }

View file

@ -28,6 +28,7 @@ package org.geysermc.floodgate.util;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.UUID; import java.util.UUID;
@ -56,7 +57,7 @@ public final class LinkedPlayer implements Cloneable {
return new LinkedPlayer(javaUsername, javaUniqueId, bedrockId); return new LinkedPlayer(javaUsername, javaUniqueId, bedrockId);
} }
public static LinkedPlayer fromString(String data) { public static @Nullable LinkedPlayer fromString(String data) {
String[] split = data.split(";"); String[] split = data.split(";");
if (split.length != 3) { if (split.length != 3) {
return null; return null;

View file

@ -25,6 +25,8 @@
package org.geysermc.floodgate.util; package org.geysermc.floodgate.util;
import org.checkerframework.checker.nullness.qual.NonNull;
public enum UiProfile { public enum UiProfile {
CLASSIC, CLASSIC,
POCKET; POCKET;
@ -37,7 +39,7 @@ public enum UiProfile {
* @param id the UiProfile identifier * @param id the UiProfile identifier
* @return The UiProfile or {@link #CLASSIC} if the UiProfile wasn't found * @return The UiProfile or {@link #CLASSIC} if the UiProfile wasn't found
*/ */
public static UiProfile fromId(int id) { public static @NonNull UiProfile fromId(int id) {
return VALUES.length > id ? VALUES[id] : VALUES[0]; return VALUES.length > id ? VALUES[id] : VALUES[0];
} }
} }

View file

@ -25,6 +25,8 @@
package org.geysermc.floodgate.util; package org.geysermc.floodgate.util;
import org.checkerframework.checker.nullness.qual.Nullable;
public enum WebsocketEventType { public enum WebsocketEventType {
/** /**
* Sent once we successfully connected to the server * Sent once we successfully connected to the server
@ -81,7 +83,7 @@ public enum WebsocketEventType {
this.id = id; this.id = id;
} }
public static WebsocketEventType fromId(int id) { public static @Nullable WebsocketEventType fromId(int id) {
return VALUES.length > id ? VALUES[id] : null; return VALUES.length > id ? VALUES[id] : null;
} }

View file

@ -152,7 +152,7 @@ public interface GeyserBootstrap {
* @param resource Resource to get * @param resource Resource to get
* @return InputStream of the given resource * @return InputStream of the given resource
*/ */
default @NonNull InputStream getResource(String resource) { default @NonNull InputStream getResourceOrThrow(@NonNull String resource) {
InputStream stream = getResourceOrNull(resource); InputStream stream = getResourceOrNull(resource);
if (stream == null) { if (stream == null) {
throw new AssertionError("Unable to find resource: " + resource); throw new AssertionError("Unable to find resource: " + resource);

View file

@ -71,6 +71,7 @@ import org.geysermc.geyser.level.WorldManager;
import org.geysermc.geyser.network.netty.GeyserServer; import org.geysermc.geyser.network.netty.GeyserServer;
import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.registry.BlockRegistries;
import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.registry.Registries;
import org.geysermc.geyser.registry.provider.ProviderSupplier;
import org.geysermc.geyser.scoreboard.ScoreboardUpdater; import org.geysermc.geyser.scoreboard.ScoreboardUpdater;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.PendingMicrosoftAuthentication; import org.geysermc.geyser.session.PendingMicrosoftAuthentication;
@ -624,7 +625,7 @@ public class GeyserImpl implements GeyserApi {
*/ */
public boolean isProductionEnvironment() { public boolean isProductionEnvironment() {
// First is if Blossom runs, second is if Blossom doesn't run // First is if Blossom runs, second is if Blossom doesn't run
// noinspection ConstantConditions - changes in production //noinspection ConstantConditions,MismatchedStringCase - changes in production
return !("git-local/dev-0000000".equals(GeyserImpl.GIT_VERSION) || "${gitVersion}".equals(GeyserImpl.GIT_VERSION)); return !("git-local/dev-0000000".equals(GeyserImpl.GIT_VERSION) || "${gitVersion}".equals(GeyserImpl.GIT_VERSION));
} }
@ -640,8 +641,13 @@ public class GeyserImpl implements GeyserApi {
} }
@Override @Override
@SuppressWarnings("unchecked")
public <R extends T, T> @NonNull R provider(@NonNull Class<T> apiClass, @Nullable Object... args) { public <R extends T, T> @NonNull R provider(@NonNull Class<T> apiClass, @Nullable Object... args) {
return (R) Registries.PROVIDERS.get(apiClass).create(args); ProviderSupplier provider = Registries.PROVIDERS.get(apiClass);
if (provider == null) {
throw new IllegalArgumentException("No provider found for " + apiClass);
}
return (R) provider.create(args);
} }
@Override @Override

View file

@ -26,9 +26,10 @@
package org.geysermc.geyser; package org.geysermc.geyser;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.command.GeyserCommandSource;
import javax.annotation.Nullable;
public interface GeyserLogger extends GeyserCommandSource { public interface GeyserLogger extends GeyserCommandSource {
@ -119,7 +120,7 @@ public interface GeyserLogger extends GeyserCommandSource {
} }
@Override @Override
default void sendMessage(String message) { default void sendMessage(@NonNull String message) {
info(message); info(message);
} }

View file

@ -30,6 +30,7 @@ import java.io.InputStream;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.Locale; import java.util.Locale;
import java.util.Objects;
import java.util.Scanner; import java.util.Scanner;
public class GeyserMain { public class GeyserMain {
@ -61,8 +62,8 @@ public class GeyserMain {
helpStream = GeyserMain.class.getClassLoader().getResourceAsStream("languages/run-help/en_US.txt"); helpStream = GeyserMain.class.getClassLoader().getResourceAsStream("languages/run-help/en_US.txt");
} }
Scanner help = new Scanner(helpStream, StandardCharsets.UTF_8).useDelimiter("\\Z"); Scanner help = new Scanner(Objects.requireNonNull(helpStream), StandardCharsets.UTF_8).useDelimiter("\\Z");
String line = ""; String line;
while (help.hasNext()) { while (help.hasNext()) {
line = help.next(); line = help.next();

View file

@ -29,10 +29,10 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.api.command.Command; import org.geysermc.geyser.api.command.Command;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import javax.annotation.Nullable;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -73,15 +73,6 @@ public abstract class GeyserCommand implements Command {
return Collections.emptyList(); return Collections.emptyList();
} }
/**
* Shortcut to {@link #subCommands()} ()}{@code .isEmpty()}.
*
* @return true if there are subcommand present for this command.
*/
public boolean hasSubCommands() {
return !this.subCommands().isEmpty();
}
public void setAliases(List<String> aliases) { public void setAliases(List<String> aliases) {
this.aliases = aliases; this.aliases = aliases;
} }

View file

@ -26,11 +26,11 @@
package org.geysermc.geyser.command; package org.geysermc.geyser.command;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.api.command.Command; import org.geysermc.geyser.api.command.Command;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;

View file

@ -29,6 +29,7 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.api.util.PlatformType;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.api.command.Command; import org.geysermc.geyser.api.command.Command;
@ -53,8 +54,6 @@ import org.geysermc.geyser.event.type.GeyserDefineCommandsEventImpl;
import org.geysermc.geyser.extension.command.GeyserExtensionCommand; import org.geysermc.geyser.extension.command.GeyserExtensionCommand;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.GeyserLocale;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
@ -136,12 +135,12 @@ public class GeyserCommandManager {
} }
} }
@NotNull @NonNull
public Map<String, Command> commands() { public Map<String, Command> commands() {
return Collections.unmodifiableMap(this.commands); return Collections.unmodifiableMap(this.commands);
} }
@NotNull @NonNull
public Map<Extension, Map<String, Command>> extensionCommands() { public Map<Extension, Map<String, Command>> extensionCommands() {
return Collections.unmodifiableMap(this.extensionCommands); return Collections.unmodifiableMap(this.extensionCommands);
} }

View file

@ -26,6 +26,7 @@
package org.geysermc.geyser.command.defaults; package org.geysermc.geyser.command.defaults;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.api.util.PlatformType;
import org.geysermc.geyser.command.GeyserCommand; import org.geysermc.geyser.command.GeyserCommand;
@ -34,7 +35,6 @@ import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.GeyserLocale;
import org.geysermc.geyser.util.LoopbackUtil; import org.geysermc.geyser.util.LoopbackUtil;
import org.geysermc.geyser.util.WebUtils; import org.geysermc.geyser.util.WebUtils;
import org.jetbrains.annotations.Nullable;
import java.util.Random; import java.util.Random;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;

View file

@ -98,7 +98,7 @@ public class DumpCommand extends GeyserCommand {
return; return;
} }
String uploadedDumpUrl = ""; String uploadedDumpUrl;
if (offlineDump) { if (offlineDump) {
sender.sendMessage(GeyserLocale.getPlayerLocaleString("geyser.commands.dump.writing", sender.locale())); sender.sendMessage(GeyserLocale.getPlayerLocaleString("geyser.commands.dump.writing", sender.locale()));

View file

@ -25,6 +25,7 @@
package org.geysermc.geyser.command.defaults; package org.geysermc.geyser.command.defaults;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.api.extension.Extension; import org.geysermc.geyser.api.extension.Extension;
import org.geysermc.geyser.command.GeyserCommand; import org.geysermc.geyser.command.GeyserCommand;
@ -32,7 +33,6 @@ import org.geysermc.geyser.command.GeyserCommandSource;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.text.ChatColor; import org.geysermc.geyser.text.ChatColor;
import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.GeyserLocale;
import org.jetbrains.annotations.Nullable;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;

View file

@ -27,8 +27,8 @@ package org.geysermc.geyser.command.defaults;
import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec;
import org.geysermc.geyser.Constants; import org.geysermc.geyser.Constants;
import org.geysermc.geyser.api.util.PlatformType;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.api.util.PlatformType;
import org.geysermc.geyser.command.GeyserCommand; import org.geysermc.geyser.command.GeyserCommand;
import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.command.GeyserCommandSource;
import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.network.GameProtocol;
@ -37,7 +37,6 @@ import org.geysermc.geyser.text.ChatColor;
import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.GeyserLocale;
import org.geysermc.geyser.util.WebUtils; import org.geysermc.geyser.util.WebUtils;
import java.io.IOException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.List; import java.util.List;
@ -77,7 +76,7 @@ public class VersionCommand extends GeyserCommand {
sender.sendMessage(GeyserLocale.getPlayerLocaleString("geyser.commands.version.checking", sender.locale())); sender.sendMessage(GeyserLocale.getPlayerLocaleString("geyser.commands.version.checking", sender.locale()));
try { try {
String buildXML = WebUtils.getBody("https://ci.opencollab.dev/job/GeyserMC/job/Geyser/job/" + String buildXML = WebUtils.getBody("https://ci.opencollab.dev/job/GeyserMC/job/Geyser/job/" +
URLEncoder.encode(GeyserImpl.BRANCH, StandardCharsets.UTF_8.toString()) + "/lastSuccessfulBuild/api/xml?xpath=//buildNumber"); URLEncoder.encode(GeyserImpl.BRANCH, StandardCharsets.UTF_8) + "/lastSuccessfulBuild/api/xml?xpath=//buildNumber");
if (buildXML.startsWith("<buildNumber>")) { if (buildXML.startsWith("<buildNumber>")) {
int latestBuildNum = Integer.parseInt(buildXML.replaceAll("<(\\\\)?(/)?buildNumber>", "").trim()); int latestBuildNum = Integer.parseInt(buildXML.replaceAll("<(\\\\)?(/)?buildNumber>", "").trim());
int buildNum = this.geyser.buildNumber(); int buildNum = this.geyser.buildNumber();
@ -90,7 +89,7 @@ public class VersionCommand extends GeyserCommand {
} else { } else {
throw new AssertionError("buildNumber missing"); throw new AssertionError("buildNumber missing");
} }
} catch (IOException e) { } catch (Exception e) {
GeyserImpl.getInstance().getLogger().error(GeyserLocale.getLocaleStringLog("geyser.commands.version.failed"), e); GeyserImpl.getInstance().getLogger().error(GeyserLocale.getLocaleStringLog("geyser.commands.version.failed"), e);
sender.sendMessage(ChatColor.RED + GeyserLocale.getPlayerLocaleString("geyser.commands.version.failed", sender.locale())); sender.sendMessage(ChatColor.RED + GeyserLocale.getPlayerLocaleString("geyser.commands.version.failed", sender.locale()));
} }

View file

@ -52,6 +52,7 @@ public interface GeyserConfiguration {
List<String> getSavedUserLogins(); List<String> getSavedUserLogins();
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
boolean isCommandSuggestions(); boolean isCommandSuggestions();
@JsonIgnore @JsonIgnore
@ -93,6 +94,7 @@ public interface GeyserConfiguration {
boolean isForceResourcePacks(); boolean isForceResourcePacks();
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
boolean isXboxAchievementsEnabled(); boolean isXboxAchievementsEnabled();
int getCacheImages(); int getCacheImages();

View file

@ -34,6 +34,7 @@ import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.api.network.AuthType; import org.geysermc.geyser.api.network.AuthType;
import org.geysermc.geyser.network.CIDRMatcher; import org.geysermc.geyser.network.CIDRMatcher;
@ -158,7 +159,7 @@ public abstract class GeyserJacksonConfiguration implements GeyserConfiguration
private String address = "0.0.0.0"; private String address = "0.0.0.0";
@Override @Override
public String address() { public @NonNull String address() {
return address; return address;
} }
@ -260,7 +261,7 @@ public abstract class GeyserJacksonConfiguration implements GeyserConfiguration
private AuthType authType = AuthType.ONLINE; private AuthType authType = AuthType.ONLINE;
@Override @Override
public AuthType authType() { public @NonNull AuthType authType() {
return authType; return authType;
} }

View file

@ -33,7 +33,6 @@ import com.google.common.io.ByteSource;
import com.google.common.io.Files; import com.google.common.io.Files;
import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntMap;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec;
import org.geysermc.floodgate.util.DeviceOs; import org.geysermc.floodgate.util.DeviceOs;
@ -106,8 +105,8 @@ public class DumpInfo {
// https://stackoverflow.com/questions/304268/getting-a-files-md5-checksum-in-java // https://stackoverflow.com/questions/304268/getting-a-files-md5-checksum-in-java
File file = new File(DumpInfo.class.getProtectionDomain().getCodeSource().getLocation().toURI()); File file = new File(DumpInfo.class.getProtectionDomain().getCodeSource().getLocation().toURI());
ByteSource byteSource = Files.asByteSource(file); ByteSource byteSource = Files.asByteSource(file);
// Jenkins uses MD5 for its hash // Jenkins uses MD5 for its hash - TODO remove
//noinspection UnstableApiUsage //noinspection UnstableApiUsage,deprecation
md5Hash = byteSource.hash(Hashing.md5()).toString(); md5Hash = byteSource.hash(Hashing.md5()).toString();
//noinspection UnstableApiUsage //noinspection UnstableApiUsage
sha256Hash = byteSource.hash(Hashing.sha256()).toString(); sha256Hash = byteSource.hash(Hashing.sha256()).toString();
@ -118,7 +117,7 @@ public class DumpInfo {
} }
this.hashInfo = new HashInfo(md5Hash, sha256Hash); this.hashInfo = new HashInfo(md5Hash, sha256Hash);
this.ramInfo = new DumpInfo.RamInfo(); this.ramInfo = new RamInfo();
if (addLog) { if (addLog) {
this.logsInfo = new LogsInfo(); this.logsInfo = new LogsInfo();
@ -202,7 +201,7 @@ public class DumpInfo {
private boolean checkDockerBasic() { private boolean checkDockerBasic() {
try { try {
String OS = System.getProperty("os.name").toLowerCase(); String OS = System.getProperty("os.name").toLowerCase();
if (OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("aix") > 0) { if (OS.contains("nix") || OS.contains("nux") || OS.indexOf("aix") > 0) {
String output = new String(java.nio.file.Files.readAllBytes(Paths.get("/proc/1/cgroup"))); String output = new String(java.nio.file.Files.readAllBytes(Paths.get("/proc/1/cgroup")));
if (output.contains("docker")) { if (output.contains("docker")) {
@ -259,60 +258,30 @@ public class DumpInfo {
} }
} }
@AllArgsConstructor public record HashInfo(String md5Hash, String sha256Hash) {
@Getter
public static class HashInfo {
private final String md5Hash;
private final String sha256Hash;
} }
@Getter public record RamInfo(long free, long total, long max) {
public static class RamInfo { public RamInfo() {
private final long free; this(Runtime.getRuntime().freeMemory() / MEGABYTE,
private final long total; Runtime.getRuntime().totalMemory() / MEGABYTE,
private final long max; Runtime.getRuntime().maxMemory() / MEGABYTE);
RamInfo() {
this.free = Runtime.getRuntime().freeMemory() / MEGABYTE;
this.total = Runtime.getRuntime().totalMemory() / MEGABYTE;
this.max = Runtime.getRuntime().maxMemory() / MEGABYTE;
} }
} }
/** /**
* E.G. `-Xmx1024M` - all runtime JVM flags on this machine * E.G. `-Xmx1024M` - all runtime JVM flags on this machine
*/ */
@Getter public record FlagsInfo(List<String> flags) {
public static class FlagsInfo { public FlagsInfo() {
private final List<String> flags; this(ManagementFactory.getRuntimeMXBean().getInputArguments());
FlagsInfo() {
this.flags = ManagementFactory.getRuntimeMXBean().getInputArguments();
} }
} }
@Getter public record ExtensionInfo(boolean enabled, String name, String version, String apiVersion, String main, List<String> authors) {
@AllArgsConstructor
public static class ExtensionInfo {
public boolean enabled;
public String name;
public String version;
public String apiVersion;
public String main;
public List<String> authors;
} }
@Getter public record GitInfo(String buildNumber, @JsonProperty("git.commit.id.abbrev") String commitHashAbbrev, @JsonProperty("git.commit.id") String commitHash,
@AllArgsConstructor @JsonProperty("git.branch") String branchName, @JsonProperty("git.remote.origin.url") String originUrl) {
public static class GitInfo {
private final String buildNumber;
@JsonProperty("git.commit.id.abbrev")
private final String commitHashAbbrev;
@JsonProperty("git.commit.id")
private final String commitHash;
@JsonProperty("git.branch")
private final String branchName;
@JsonProperty("git.remote.origin.url")
private final String originUrl;
} }
} }

View file

@ -59,6 +59,7 @@ public record EntityDefinition<T extends Entity>(EntityFactory<T> factory, Entit
return new Builder<>(factory); return new Builder<>(factory);
} }
@SuppressWarnings("unchecked")
public <M> void translateMetadata(T entity, EntityMetadata<M, ? extends MetadataType<M>> metadata) { public <M> void translateMetadata(T entity, EntityMetadata<M, ? extends MetadataType<M>> metadata) {
EntityMetadataTranslator<? super T, M, EntityMetadata<M, ? extends MetadataType<M>>> translator = (EntityMetadataTranslator<? super T, M, EntityMetadata<M, ? extends MetadataType<M>>>) this.translators.get(metadata.getId()); EntityMetadataTranslator<? super T, M, EntityMetadata<M, ? extends MetadataType<M>>> translator = (EntityMetadataTranslator<? super T, M, EntityMetadata<M, ? extends MetadataType<M>>>) this.translators.get(metadata.getId());
if (translator == null) { if (translator == null) {

View file

@ -25,6 +25,7 @@
package org.geysermc.geyser.entity.attribute; package org.geysermc.geyser.entity.attribute;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.cloudburstmc.protocol.bedrock.data.AttributeData; import org.cloudburstmc.protocol.bedrock.data.AttributeData;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@ -69,7 +70,7 @@ public enum GeyserAttributeType {
return getAttribute(value, maximum); return getAttribute(value, maximum);
} }
public AttributeData getAttribute(float value, float maximum) { public @Nullable AttributeData getAttribute(float value, float maximum) {
if (bedrockIdentifier == null) { if (bedrockIdentifier == null) {
return null; return null;
} }

View file

@ -34,7 +34,6 @@ import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.registry.Registries;
import org.geysermc.geyser.registry.type.ParticleMapping;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import java.util.UUID; import java.util.UUID;

View file

@ -36,6 +36,7 @@ import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.cloudburstmc.math.vector.Vector2f; import org.cloudburstmc.math.vector.Vector2f;
import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes;
@ -580,7 +581,7 @@ public class Entity implements GeyserEntity {
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public <I extends Entity> I as(Class<I> entityClass) { public <I extends Entity> @Nullable I as(Class<I> entityClass) {
return entityClass.isInstance(this) ? (I) this : null; return entityClass.isInstance(this) ? (I) this : null;
} }
} }

View file

@ -38,6 +38,7 @@ import com.github.steveice10.opennbt.tag.builtin.StringTag;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.math.vector.Vector3i; import org.cloudburstmc.math.vector.Vector3i;
import org.cloudburstmc.protocol.bedrock.data.AttributeData; import org.cloudburstmc.protocol.bedrock.data.AttributeData;
@ -120,7 +121,7 @@ public class LivingEntity extends Entity {
session.sendUpstreamPacket(attributesPacket); session.sendUpstreamPacket(attributesPacket);
} }
public Vector3i setBedPosition(EntityMetadata<Optional<Vector3i>, ?> entityMetadata) { public @Nullable Vector3i setBedPosition(EntityMetadata<Optional<Vector3i>, ?> entityMetadata) {
Optional<Vector3i> optionalPos = entityMetadata.getValue(); Optional<Vector3i> optionalPos = entityMetadata.getValue();
if (optionalPos.isPresent()) { if (optionalPos.isPresent()) {
Vector3i bedPosition = optionalPos.get(); Vector3i bedPosition = optionalPos.get();

View file

@ -51,7 +51,6 @@ public class ThrowableEntity extends Entity implements Tickable {
/** /**
* Updates the position for the Bedrock client. * Updates the position for the Bedrock client.
*
* Java clients assume the next positions of moving items. Bedrock needs to be explicitly told positions * Java clients assume the next positions of moving items. Bedrock needs to be explicitly told positions
*/ */
@Override @Override

View file

@ -26,6 +26,7 @@
package org.geysermc.geyser.entity.type.living; package org.geysermc.geyser.entity.type.living;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinition;
@ -34,7 +35,6 @@ import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.util.EntityUtils; import org.geysermc.geyser.util.EntityUtils;
import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractionResult;
import javax.annotation.Nonnull;
import java.util.UUID; import java.util.UUID;
public class AbstractFishEntity extends WaterEntity { public class AbstractFishEntity extends WaterEntity {
@ -48,9 +48,9 @@ public class AbstractFishEntity extends WaterEntity {
setFlag(EntityFlag.HAS_GRAVITY, false); setFlag(EntityFlag.HAS_GRAVITY, false);
} }
@Nonnull @NonNull
@Override @Override
protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
if (EntityUtils.attemptToBucket(itemInHand)) { if (EntityUtils.attemptToBucket(itemInHand)) {
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} else { } else {

View file

@ -27,6 +27,7 @@ package org.geysermc.geyser.entity.type.living;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinition;
@ -36,7 +37,6 @@ import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag; import org.geysermc.geyser.util.InteractiveTag;
import javax.annotation.Nonnull;
import java.util.UUID; import java.util.UUID;
public class AllayEntity extends MobEntity { public class AllayEntity extends MobEntity {
@ -54,9 +54,9 @@ public class AllayEntity extends MobEntity {
this.canDuplicate = entityMetadata.getPrimitiveValue(); this.canDuplicate = entityMetadata.getPrimitiveValue();
} }
@Nonnull @NonNull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
if (this.canDuplicate && getFlag(EntityFlag.DANCING) && isDuplicationItem(itemInHand)) { if (this.canDuplicate && getFlag(EntityFlag.DANCING) && isDuplicationItem(itemInHand)) {
// Maybe better as another tag? // Maybe better as another tag?
return InteractiveTag.GIVE_ITEM_TO_ALLAY; return InteractiveTag.GIVE_ITEM_TO_ALLAY;
@ -70,9 +70,9 @@ public class AllayEntity extends MobEntity {
} }
} }
@Nonnull @NonNull
@Override @Override
protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
if (this.canDuplicate && getFlag(EntityFlag.DANCING) && isDuplicationItem(itemInHand)) { if (this.canDuplicate && getFlag(EntityFlag.DANCING) && isDuplicationItem(itemInHand)) {
//TOCHECK sound //TOCHECK sound
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;

View file

@ -70,7 +70,7 @@ public class ArmorStandEntity extends LivingEntity {
private boolean primaryEntity = true; private boolean primaryEntity = true;
/** /**
* Whether the entity's position must be updated to included the offset. * Whether the entity's position must be updated to included the offset.
* * <p>
* This should be true when the Java server marks the armor stand as invisible, but we shrink the entity * This should be true when the Java server marks the armor stand as invisible, but we shrink the entity
* to allow the nametag to appear. Basically: * to allow the nametag to appear. Basically:
* - Is visible: this is irrelevant (false) * - Is visible: this is irrelevant (false)
@ -207,7 +207,7 @@ public class ArmorStandEntity extends LivingEntity {
* @param negativeZToggle the flag to set true if the Z value of rotation is negative * @param negativeZToggle the flag to set true if the Z value of rotation is negative
* @param rotation the Java rotation value * @param rotation the Java rotation value
*/ */
private void onRotationUpdate(EntityDataType dataLeech, EntityFlag negativeXToggle, EntityFlag negativeYToggle, EntityFlag negativeZToggle, Vector3f rotation) { private void onRotationUpdate(EntityDataType<Integer> dataLeech, EntityFlag negativeXToggle, EntityFlag negativeYToggle, EntityFlag negativeZToggle, Vector3f rotation) {
// Indicate that rotation should be checked // Indicate that rotation should be checked
setFlag(EntityFlag.BRIBED, true); setFlag(EntityFlag.BRIBED, true);

View file

@ -26,6 +26,7 @@
package org.geysermc.geyser.entity.type.living; package org.geysermc.geyser.entity.type.living;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3f;
import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.inventory.GeyserItemStack; import org.geysermc.geyser.inventory.GeyserItemStack;
@ -33,7 +34,6 @@ import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag; import org.geysermc.geyser.util.InteractiveTag;
import javax.annotation.Nonnull;
import java.util.UUID; import java.util.UUID;
public class DolphinEntity extends WaterEntity { public class DolphinEntity extends WaterEntity {
@ -46,18 +46,18 @@ public class DolphinEntity extends WaterEntity {
return true; return true;
} }
@Nonnull @NonNull
@Override @Override
protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
if (!itemInHand.isEmpty() && session.getTagCache().isFish(itemInHand)) { if (!itemInHand.isEmpty() && session.getTagCache().isFish(itemInHand)) {
return InteractiveTag.FEED; return InteractiveTag.FEED;
} }
return super.testMobInteraction(hand, itemInHand); return super.testMobInteraction(hand, itemInHand);
} }
@Nonnull @NonNull
@Override @Override
protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
if (!itemInHand.isEmpty() && session.getTagCache().isFish(itemInHand)) { if (!itemInHand.isEmpty() && session.getTagCache().isFish(itemInHand)) {
// Feed // Feed
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;

View file

@ -26,6 +26,7 @@
package org.geysermc.geyser.entity.type.living; package org.geysermc.geyser.entity.type.living;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
@ -35,7 +36,6 @@ import org.geysermc.geyser.item.Items;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractionResult;
import javax.annotation.Nonnull;
import java.util.UUID; import java.util.UUID;
public class IronGolemEntity extends GolemEntity { public class IronGolemEntity extends GolemEntity {
@ -51,9 +51,9 @@ public class IronGolemEntity extends GolemEntity {
maxHealth = 100f; maxHealth = 100f;
} }
@Nonnull @NonNull
@Override @Override
protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
if (itemInHand.asItem() == Items.IRON_INGOT) { if (itemInHand.asItem() == Items.IRON_INGOT) {
if (health < maxHealth) { if (health < maxHealth) {
// Healing the iron golem // Healing the iron golem

View file

@ -28,6 +28,7 @@ package org.geysermc.geyser.entity.type.living;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import lombok.Getter; import lombok.Getter;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
@ -40,7 +41,6 @@ import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag; import org.geysermc.geyser.util.InteractiveTag;
import javax.annotation.Nonnull;
import java.util.UUID; import java.util.UUID;
public class MobEntity extends LivingEntity { public class MobEntity extends LivingEntity {
@ -133,13 +133,13 @@ public class MobEntity extends LivingEntity {
return InteractionResult.PASS; return InteractionResult.PASS;
} }
@Nonnull @NonNull
protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
return InteractiveTag.NONE; return InteractiveTag.NONE;
} }
@Nonnull @NonNull
protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
return InteractionResult.PASS; return InteractionResult.PASS;
} }

View file

@ -27,6 +27,7 @@ package org.geysermc.geyser.entity.type.living;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinition;
@ -36,7 +37,6 @@ import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag; import org.geysermc.geyser.util.InteractiveTag;
import javax.annotation.Nonnull;
import java.util.UUID; import java.util.UUID;
public class SnowGolemEntity extends GolemEntity { public class SnowGolemEntity extends GolemEntity {
@ -51,9 +51,9 @@ public class SnowGolemEntity extends GolemEntity {
setFlag(EntityFlag.SHEARED, (xd & 0x10) != 0x10); setFlag(EntityFlag.SHEARED, (xd & 0x10) != 0x10);
} }
@Nonnull @NonNull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
if (Items.SHEARS == itemInHand.asItem() && isAlive() && !getFlag(EntityFlag.SHEARED)) { if (Items.SHEARS == itemInHand.asItem() && isAlive() && !getFlag(EntityFlag.SHEARED)) {
// Shearing the snow golem // Shearing the snow golem
return InteractiveTag.SHEAR; return InteractiveTag.SHEAR;
@ -61,9 +61,9 @@ public class SnowGolemEntity extends GolemEntity {
return InteractiveTag.NONE; return InteractiveTag.NONE;
} }
@Nonnull @NonNull
@Override @Override
protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
if (Items.SHEARS == itemInHand.asItem() && isAlive() && !getFlag(EntityFlag.SHEARED)) { if (Items.SHEARS == itemInHand.asItem() && isAlive() && !getFlag(EntityFlag.SHEARED)) {
// Shearing the snow golem // Shearing the snow golem
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;

View file

@ -26,6 +26,7 @@
package org.geysermc.geyser.entity.type.living; package org.geysermc.geyser.entity.type.living;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3f;
import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.inventory.GeyserItemStack; import org.geysermc.geyser.inventory.GeyserItemStack;
@ -34,7 +35,6 @@ import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag; import org.geysermc.geyser.util.InteractiveTag;
import javax.annotation.Nonnull;
import java.util.UUID; import java.util.UUID;
public class TadpoleEntity extends AbstractFishEntity { public class TadpoleEntity extends AbstractFishEntity {
@ -42,18 +42,18 @@ public class TadpoleEntity extends AbstractFishEntity {
super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw);
} }
@Nonnull @NonNull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
if (isFood(itemInHand)) { if (isFood(itemInHand)) {
return InteractiveTag.FEED; return InteractiveTag.FEED;
} }
return super.testMobInteraction(hand, itemInHand); return super.testMobInteraction(hand, itemInHand);
} }
@Nonnull @NonNull
@Override @Override
protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
if (isFood(itemInHand)) { if (isFood(itemInHand)) {
//TODO particles //TODO particles
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;

View file

@ -26,6 +26,7 @@
package org.geysermc.geyser.entity.type.living.animal; package org.geysermc.geyser.entity.type.living.animal;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityEventType; import org.cloudburstmc.protocol.bedrock.data.entity.EntityEventType;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
@ -38,7 +39,6 @@ import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag; import org.geysermc.geyser.util.InteractiveTag;
import javax.annotation.Nonnull;
import java.util.UUID; import java.util.UUID;
public class AnimalEntity extends AgeableEntity { public class AnimalEntity extends AgeableEntity {
@ -59,18 +59,18 @@ public class AnimalEntity extends AgeableEntity {
return item == Items.WHEAT; return item == Items.WHEAT;
} }
@Nonnull @NonNull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
if (canEat(itemInHand)) { if (canEat(itemInHand)) {
return InteractiveTag.FEED; return InteractiveTag.FEED;
} }
return super.testMobInteraction(hand, itemInHand); return super.testMobInteraction(hand, itemInHand);
} }
@Nonnull @NonNull
@Override @Override
protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
if (canEat(itemInHand)) { if (canEat(itemInHand)) {
// FEED // FEED
if (getFlag(EntityFlag.BABY)) { if (getFlag(EntityFlag.BABY)) {

View file

@ -28,6 +28,7 @@ package org.geysermc.geyser.entity.type.living.animal;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
@ -38,7 +39,6 @@ import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.util.EntityUtils; import org.geysermc.geyser.util.EntityUtils;
import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractionResult;
import javax.annotation.Nonnull;
import java.util.UUID; import java.util.UUID;
public class AxolotlEntity extends AnimalEntity { public class AxolotlEntity extends AnimalEntity {
@ -74,9 +74,9 @@ public class AxolotlEntity extends AnimalEntity {
return true; return true;
} }
@Nonnull @NonNull
@Override @Override
protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
if (EntityUtils.attemptToBucket(itemInHand)) { if (EntityUtils.attemptToBucket(itemInHand)) {
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} else { } else {

View file

@ -26,6 +26,7 @@
package org.geysermc.geyser.entity.type.living.animal; package org.geysermc.geyser.entity.type.living.animal;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.data.SoundEvent; import org.cloudburstmc.protocol.bedrock.data.SoundEvent;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
@ -36,7 +37,6 @@ import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag; import org.geysermc.geyser.util.InteractiveTag;
import javax.annotation.Nonnull;
import java.util.UUID; import java.util.UUID;
public class CowEntity extends AnimalEntity { public class CowEntity extends AnimalEntity {
@ -44,9 +44,9 @@ public class CowEntity extends AnimalEntity {
super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw);
} }
@Nonnull @NonNull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
if (getFlag(EntityFlag.BABY) || itemInHand.asItem() != Items.BUCKET) { if (getFlag(EntityFlag.BABY) || itemInHand.asItem() != Items.BUCKET) {
return super.testMobInteraction(hand, itemInHand); return super.testMobInteraction(hand, itemInHand);
} }
@ -54,9 +54,9 @@ public class CowEntity extends AnimalEntity {
return InteractiveTag.MILK; return InteractiveTag.MILK;
} }
@Nonnull @NonNull
@Override @Override
protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
if (getFlag(EntityFlag.BABY) || itemInHand.asItem() != Items.BUCKET) { if (getFlag(EntityFlag.BABY) || itemInHand.asItem() != Items.BUCKET) {
return super.mobInteract(hand, itemInHand); return super.mobInteract(hand, itemInHand);
} }

View file

@ -28,6 +28,7 @@ package org.geysermc.geyser.entity.type.living.animal;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.Pose; import com.github.steveice10.mc.protocol.data.game.entity.metadata.Pose;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.data.SoundEvent; import org.cloudburstmc.protocol.bedrock.data.SoundEvent;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes;
@ -38,7 +39,6 @@ import org.geysermc.geyser.item.Items;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractionResult;
import javax.annotation.Nonnull;
import java.util.UUID; import java.util.UUID;
public class GoatEntity extends AnimalEntity { public class GoatEntity extends AnimalEntity {
@ -70,9 +70,9 @@ public class GoatEntity extends AnimalEntity {
// TODO testMobInteraction? // TODO testMobInteraction?
@Nonnull @NonNull
@Override @Override
protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
if (!getFlag(EntityFlag.BABY) && itemInHand.asItem() == Items.BUCKET) { if (!getFlag(EntityFlag.BABY) && itemInHand.asItem() == Items.BUCKET) {
session.playSoundEvent(isScreamer ? SoundEvent.MILK_SCREAMER : SoundEvent.MILK, position); session.playSoundEvent(isScreamer ? SoundEvent.MILK_SCREAMER : SoundEvent.MILK, position);
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;

View file

@ -27,6 +27,7 @@ package org.geysermc.geyser.entity.type.living.animal;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ObjectEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ObjectEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes;
import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinition;
@ -37,7 +38,6 @@ import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag; import org.geysermc.geyser.util.InteractiveTag;
import javax.annotation.Nonnull;
import java.util.UUID; import java.util.UUID;
public class MooshroomEntity extends AnimalEntity { public class MooshroomEntity extends AnimalEntity {
@ -52,9 +52,9 @@ public class MooshroomEntity extends AnimalEntity {
dirtyMetadata.put(EntityDataTypes.VARIANT, isBrown ? 1 : 0); dirtyMetadata.put(EntityDataTypes.VARIANT, isBrown ? 1 : 0);
} }
@Nonnull @NonNull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
if (!isBaby()) { if (!isBaby()) {
if (itemInHand.asItem() == Items.BOWL) { if (itemInHand.asItem() == Items.BOWL) {
// Stew // Stew
@ -67,9 +67,9 @@ public class MooshroomEntity extends AnimalEntity {
return super.testMobInteraction(hand, itemInHand); return super.testMobInteraction(hand, itemInHand);
} }
@Nonnull @NonNull
@Override @Override
protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
boolean isBaby = isBaby(); boolean isBaby = isBaby();
if (!isBaby && itemInHand.asItem() == Items.BOWL) { if (!isBaby && itemInHand.asItem() == Items.BOWL) {
// Stew // Stew

View file

@ -26,6 +26,7 @@
package org.geysermc.geyser.entity.type.living.animal; package org.geysermc.geyser.entity.type.living.animal;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinition;
@ -36,7 +37,6 @@ import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag; import org.geysermc.geyser.util.InteractiveTag;
import javax.annotation.Nonnull;
import java.util.UUID; import java.util.UUID;
public class OcelotEntity extends AnimalEntity { public class OcelotEntity extends AnimalEntity {
@ -50,9 +50,9 @@ public class OcelotEntity extends AnimalEntity {
return item == Items.COD || item == Items.SALMON; return item == Items.COD || item == Items.SALMON;
} }
@Nonnull @NonNull
@Override @Override
protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
if (!getFlag(EntityFlag.TRUSTING) && canEat(itemInHand) && session.getPlayerEntity().getPosition().distanceSquared(position) < 9f) { if (!getFlag(EntityFlag.TRUSTING) && canEat(itemInHand) && session.getPlayerEntity().getPosition().distanceSquared(position) < 9f) {
// Attempt to feed // Attempt to feed
return InteractiveTag.FEED; return InteractiveTag.FEED;
@ -61,9 +61,9 @@ public class OcelotEntity extends AnimalEntity {
} }
} }
@Nonnull @NonNull
@Override @Override
protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
if (!getFlag(EntityFlag.TRUSTING) && canEat(itemInHand) && session.getPlayerEntity().getPosition().distanceSquared(position) < 9f) { if (!getFlag(EntityFlag.TRUSTING) && canEat(itemInHand) && session.getPlayerEntity().getPosition().distanceSquared(position) < 9f) {
// Attempt to feed // Attempt to feed
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;

Some files were not shown because too many files have changed in this diff Show more