mirror of
				https://github.com/GeyserMC/Geyser.git
				synced 2024-08-14 23:57:35 +00:00 
			
		
		
		
	Project wide syntax/annotation cleanup (#4238)
Co-authored-by: Konicai <71294714+Konicai@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									998caee156
								
							
						
					
					
						commit
						95d65350e4
					
				
					 270 changed files with 891 additions and 977 deletions
				
			
		| 
						 | 
				
			
			@ -19,32 +19,28 @@ public class LongClassName {
 | 
			
		|||
    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")
 | 
			
		||||
    public void applyStuff() {
 | 
			
		||||
        Variable variable = new Variable();
 | 
			
		||||
        Variable otherVariable = new Variable();
 | 
			
		||||
 | 
			
		||||
        if (condition) {
 | 
			
		||||
	        // Do stuff.
 | 
			
		||||
            // Do stuff.
 | 
			
		||||
        } else if (anotherCondition) {
 | 
			
		||||
	    	// Do something else.
 | 
			
		||||
            // Do something else.
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        switch (value) {
 | 
			
		||||
            case 0:
 | 
			
		||||
                stuff();
 | 
			
		||||
                break;
 | 
			
		||||
            case 1:
 | 
			
		||||
                differentStuff();
 | 
			
		||||
                break;
 | 
			
		||||
            case 0 -> stuff();
 | 
			
		||||
            case 1 -> differentStuff();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
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`.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,6 +25,8 @@
 | 
			
		|||
 | 
			
		||||
package org.geysermc.geyser.processor;
 | 
			
		||||
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.processing.AbstractProcessor;
 | 
			
		||||
import javax.annotation.processing.ProcessingEnvironment;
 | 
			
		||||
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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private BufferedReader createReader() throws IOException {
 | 
			
		||||
    private @Nullable BufferedReader createReader() throws IOException {
 | 
			
		||||
        if (this.outputPath != null) {
 | 
			
		||||
            this.processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Reading existing " + this.annotationClassName + " list from " + this.outputPath);
 | 
			
		||||
            return Files.newBufferedReader(this.outputPath);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -77,6 +77,7 @@ public interface GeyserApi extends GeyserApiBase {
 | 
			
		|||
     * @param apiClass the builder class
 | 
			
		||||
     * @param <R> the implementation type
 | 
			
		||||
     * @param <T> the API type
 | 
			
		||||
     * @throws IllegalArgumentException if there is no provider for the specified API class
 | 
			
		||||
     * @return the builder instance
 | 
			
		||||
     */
 | 
			
		||||
    @NonNull
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,5 +27,5 @@ package org.geysermc.geyser.api.bedrock.camera;
 | 
			
		|||
 | 
			
		||||
public enum CameraShake {
 | 
			
		||||
    POSITIONAL,
 | 
			
		||||
    ROTATIONAL;
 | 
			
		||||
    ROTATIONAL
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,11 +25,11 @@
 | 
			
		|||
 | 
			
		||||
package org.geysermc.geyser.api.block.custom.component;
 | 
			
		||||
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
 | 
			
		||||
import java.util.LinkedHashMap;
 | 
			
		||||
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.
 | 
			
		||||
 * 
 | 
			
		||||
| 
						 | 
				
			
			@ -43,7 +43,7 @@ public record PlacementConditions(@NonNull Set<Face> allowedFaces, @NonNull Link
 | 
			
		|||
        NORTH,
 | 
			
		||||
        SOUTH,
 | 
			
		||||
        WEST,
 | 
			
		||||
        EAST;
 | 
			
		||||
        EAST
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public enum BlockFilterType {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,7 +39,7 @@ public interface JavaBlockState {
 | 
			
		|||
     * 
 | 
			
		||||
     * @return whether the block state is waterlogged
 | 
			
		||||
     */
 | 
			
		||||
    @NonNull boolean waterlogged();
 | 
			
		||||
    boolean waterlogged();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the collision of the block state
 | 
			
		||||
| 
						 | 
				
			
			@ -53,7 +53,7 @@ public interface JavaBlockState {
 | 
			
		|||
     * 
 | 
			
		||||
     * @return whether the block state can be broken with hand
 | 
			
		||||
     */
 | 
			
		||||
    @NonNull boolean canBreakWithHand();
 | 
			
		||||
    boolean canBreakWithHand();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the pick item of the block state
 | 
			
		||||
| 
						 | 
				
			
			@ -74,7 +74,7 @@ public interface JavaBlockState {
 | 
			
		|||
     * 
 | 
			
		||||
     * @return whether the block state has block entity
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable boolean hasBlockEntity();
 | 
			
		||||
    boolean hasBlockEntity();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a new {@link JavaBlockState.Builder} instance
 | 
			
		||||
| 
						 | 
				
			
			@ -94,17 +94,17 @@ public interface JavaBlockState {
 | 
			
		|||
 | 
			
		||||
        Builder blockHardness(@NonNegative float blockHardness);
 | 
			
		||||
 | 
			
		||||
        Builder waterlogged(@NonNull boolean waterlogged);
 | 
			
		||||
        Builder waterlogged(boolean waterlogged);
 | 
			
		||||
 | 
			
		||||
        Builder collision(@NonNull JavaBoundingBox[] collision);
 | 
			
		||||
 | 
			
		||||
        Builder canBreakWithHand(@NonNull boolean canBreakWithHand);
 | 
			
		||||
        Builder canBreakWithHand(boolean canBreakWithHand);
 | 
			
		||||
 | 
			
		||||
        Builder pickItem(@Nullable String pickItem);
 | 
			
		||||
 | 
			
		||||
        Builder pistonBehavior(@Nullable String pistonBehavior);
 | 
			
		||||
 | 
			
		||||
        Builder hasBlockEntity(@Nullable boolean hasBlockEntity);
 | 
			
		||||
        Builder hasBlockEntity(boolean hasBlockEntity);
 | 
			
		||||
 | 
			
		||||
        JavaBlockState build();
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,4 @@
 | 
			
		|||
package org.geysermc.geyser.api.block.custom.nonvanilla;
 | 
			
		||||
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
 | 
			
		||||
public record JavaBoundingBox(@NonNull double middleX, @NonNull double middleY, @NonNull double middleZ, @NonNull double sizeX, @NonNull double sizeY, @NonNull double sizeZ) {
 | 
			
		||||
public record JavaBoundingBox(double middleX, double middleY, double middleZ, double sizeX, double sizeY, double sizeZ) {
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,7 +28,6 @@ package org.geysermc.geyser.api.event;
 | 
			
		|||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
import org.geysermc.event.Event;
 | 
			
		||||
import org.geysermc.event.bus.OwnedEventBus;
 | 
			
		||||
import org.geysermc.geyser.api.extension.Extension;
 | 
			
		||||
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,6 @@ package org.geysermc.geyser.api.event;
 | 
			
		|||
 | 
			
		||||
import org.geysermc.event.Event;
 | 
			
		||||
import org.geysermc.event.subscribe.OwnedSubscriber;
 | 
			
		||||
import org.geysermc.geyser.api.extension.Extension;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Represents a subscribed listener to a {@link Event}. Wraps around
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,7 +34,7 @@ import java.net.InetSocketAddress;
 | 
			
		|||
 | 
			
		||||
/**
 | 
			
		||||
 * Called whenever Geyser gets pinged
 | 
			
		||||
 *
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,7 +33,7 @@ import java.util.Map;
 | 
			
		|||
 | 
			
		||||
/**
 | 
			
		||||
 * Called when commands are defined within Geyser.
 | 
			
		||||
 *
 | 
			
		||||
 * <p>
 | 
			
		||||
 * This event allows you to register new commands using the {@link #register(Command)}
 | 
			
		||||
 * method and retrieve the default commands defined.
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,13 +28,12 @@ package org.geysermc.geyser.api.event.lifecycle;
 | 
			
		|||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
import org.geysermc.geyser.api.block.custom.CustomBlockData;
 | 
			
		||||
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.event.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.
 | 
			
		||||
 */
 | 
			
		||||
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
 | 
			
		||||
     * given java state identifier
 | 
			
		||||
     * Java state identifiers are listed in
 | 
			
		||||
     * https://raw.githubusercontent.com/GeyserMC/mappings/master/blocks.json
 | 
			
		||||
     * Java state identifiers are listed
 | 
			
		||||
     * <a href="https://raw.githubusercontent.com/GeyserMC/mappings/master/blocks.json">here</a>
 | 
			
		||||
     *
 | 
			
		||||
     * @param javaIdentifier the java state identifier to override
 | 
			
		||||
     * @param customBlockState the custom block state with which to override java state identifier
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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.
 | 
			
		||||
 *
 | 
			
		||||
 * <p>
 | 
			
		||||
 * This event will not be called if the "add non-Bedrock items" setting is disabled in the Geyser config.
 | 
			
		||||
 */
 | 
			
		||||
public interface GeyserDefineCustomItemsEvent extends Event {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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.
 | 
			
		||||
 *
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,10 +25,16 @@
 | 
			
		|||
 | 
			
		||||
package org.geysermc.geyser.api.extension.exception;
 | 
			
		||||
 | 
			
		||||
import java.io.Serial;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Thrown when an extension's description is invalid.
 | 
			
		||||
 */
 | 
			
		||||
public class InvalidDescriptionException extends Exception {
 | 
			
		||||
 | 
			
		||||
    @Serial
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    public InvalidDescriptionException(Throwable cause) {
 | 
			
		||||
        super(cause);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,10 +25,16 @@
 | 
			
		|||
 | 
			
		||||
package org.geysermc.geyser.api.extension.exception;
 | 
			
		||||
 | 
			
		||||
import java.io.Serial;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Thrown when an extension is invalid.
 | 
			
		||||
 */
 | 
			
		||||
public class InvalidExtensionException extends Exception {
 | 
			
		||||
 | 
			
		||||
    @Serial
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    public InvalidExtensionException(Throwable cause) {
 | 
			
		||||
        super(cause);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -51,7 +51,7 @@ public enum CreativeCategory {
 | 
			
		|||
     * 
 | 
			
		||||
     * @return the name of the category
 | 
			
		||||
     */
 | 
			
		||||
    @NonNull public String internalName() {
 | 
			
		||||
    public @NonNull String internalName() {
 | 
			
		||||
        return internalName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 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 {
 | 
			
		||||
    /**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,6 +30,7 @@ import net.md_5.bungee.api.ProxyServer;
 | 
			
		|||
import net.md_5.bungee.api.plugin.Plugin;
 | 
			
		||||
import org.geysermc.geyser.dump.BootstrapDumpInfo;
 | 
			
		||||
 | 
			
		||||
import java.net.InetSocketAddress;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
| 
						 | 
				
			
			@ -51,7 +52,8 @@ public class GeyserBungeeDumpInfo extends BootstrapDumpInfo {
 | 
			
		|||
        this.plugins = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
        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()) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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.event.EventHandler;
 | 
			
		||||
import net.md_5.bungee.netty.PipelineUtils;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
import org.geysermc.geyser.GeyserBootstrap;
 | 
			
		||||
import org.geysermc.geyser.GeyserImpl;
 | 
			
		||||
import org.geysermc.geyser.network.netty.GeyserInjector;
 | 
			
		||||
| 
						 | 
				
			
			@ -125,7 +126,7 @@ public class GeyserBungeeInjector extends GeyserInjector implements Listener {
 | 
			
		|||
                .channel(LocalServerChannelWrapper.class)
 | 
			
		||||
                .childHandler(new ChannelInitializer<>() {
 | 
			
		||||
                    @Override
 | 
			
		||||
                    protected void initChannel(Channel ch) throws Exception {
 | 
			
		||||
                    protected void initChannel(@NonNull Channel ch) throws Exception {
 | 
			
		||||
                        if (proxy.getConfig().getServers() == null) {
 | 
			
		||||
                            // Proxy hasn't finished loading all plugins - it loads the config after all plugins
 | 
			
		||||
                            // Probably doesn't need to be translatable?
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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.plugin.Listener;
 | 
			
		||||
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.IGeyserPingPassthrough;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -104,7 +105,7 @@ public class GeyserBungeePingPassthrough implements IGeyserPingPassthrough, List
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public InetSocketAddress getVirtualHost() {
 | 
			
		||||
        public @Nullable InetSocketAddress getVirtualHost() {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,6 +30,7 @@ import net.md_5.bungee.BungeeCord;
 | 
			
		|||
import net.md_5.bungee.api.config.ListenerInfo;
 | 
			
		||||
import net.md_5.bungee.api.plugin.Plugin;
 | 
			
		||||
import net.md_5.bungee.protocol.ProtocolConstants;
 | 
			
		||||
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.GeyserBootstrap;
 | 
			
		||||
| 
						 | 
				
			
			@ -44,7 +45,6 @@ import org.geysermc.geyser.ping.IGeyserPingPassthrough;
 | 
			
		|||
import org.geysermc.geyser.platform.bungeecord.command.GeyserBungeeCommandExecutor;
 | 
			
		||||
import org.geysermc.geyser.text.GeyserLocale;
 | 
			
		||||
import org.geysermc.geyser.util.FileUtils;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
| 
						 | 
				
			
			@ -72,6 +72,7 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap {
 | 
			
		|||
 | 
			
		||||
    private static boolean INITIALIZED = false;
 | 
			
		||||
 | 
			
		||||
    @SuppressWarnings({"JavaReflectionMemberAccess", "ResultOfMethodCallIgnored"})
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onLoad() {
 | 
			
		||||
        GeyserLocale.init(this);
 | 
			
		||||
| 
						 | 
				
			
			@ -251,7 +252,7 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap {
 | 
			
		|||
        return this.geyserInjector.getServerSocketAddress();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @NotNull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getServerBindAddress() {
 | 
			
		||||
        return findCompatibleListener().map(InetSocketAddress::getHostString).orElse("");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,6 +29,7 @@ import net.kyori.adventure.text.Component;
 | 
			
		|||
import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer;
 | 
			
		||||
import net.md_5.bungee.api.chat.TextComponent;
 | 
			
		||||
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.text.GeyserLocale;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -50,7 +51,7 @@ public class BungeeCommandSource implements GeyserCommandSource {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void sendMessage(String message) {
 | 
			
		||||
    public void sendMessage(@NonNull String message) {
 | 
			
		||||
        handle.sendMessage(TextComponent.fromLegacyText(message));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,6 +37,8 @@ import net.minecraft.commands.CommandSourceStack;
 | 
			
		|||
import net.minecraft.commands.Commands;
 | 
			
		||||
import net.minecraft.server.MinecraftServer;
 | 
			
		||||
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.GeyserImpl;
 | 
			
		||||
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.text.GeyserLocale;
 | 
			
		||||
import org.geysermc.geyser.util.FileUtils;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
import org.jetbrains.annotations.Nullable;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
| 
						 | 
				
			
			@ -251,7 +251,7 @@ public class GeyserFabricMod implements ModInitializer, GeyserBootstrap {
 | 
			
		|||
        return this.server.getServerVersion();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @NotNull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getServerBindAddress() {
 | 
			
		||||
        String ip = this.server.getLocalIp();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,11 +30,12 @@ import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
 | 
			
		|||
import net.minecraft.commands.CommandSourceStack;
 | 
			
		||||
import net.minecraft.network.chat.Component;
 | 
			
		||||
import net.minecraft.server.level.ServerPlayer;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
import org.geysermc.geyser.GeyserImpl;
 | 
			
		||||
import org.geysermc.geyser.command.GeyserCommandSource;
 | 
			
		||||
import org.geysermc.geyser.text.ChatColor;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
public class FabricCommandSender implements GeyserCommandSource {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -50,7 +51,7 @@ public class FabricCommandSender implements GeyserCommandSource {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void sendMessage(@Nonnull String message) {
 | 
			
		||||
    public void sendMessage(@NonNull String message) {
 | 
			
		||||
        if (source.getEntity() instanceof ServerPlayer) {
 | 
			
		||||
            ((ServerPlayer) source.getEntity()).displayClientMessage(Component.literal(message), false);
 | 
			
		||||
        } else {
 | 
			
		||||
| 
						 | 
				
			
			@ -62,7 +63,7 @@ public class FabricCommandSender implements GeyserCommandSource {
 | 
			
		|||
    public void sendMessage(net.kyori.adventure.text.Component message) {
 | 
			
		||||
        if (source.getEntity() instanceof ServerPlayer player) {
 | 
			
		||||
            String decoded = GsonComponentSerializer.gson().serialize(message);
 | 
			
		||||
            player.displayClientMessage(Component.Serializer.fromJson(decoded), false);
 | 
			
		||||
            player.displayClientMessage(Objects.requireNonNull(Component.Serializer.fromJson(decoded)), false);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        GeyserCommandSource.super.sendMessage(message);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,12 +52,12 @@ public class GeyserFabricCommandExecutor extends GeyserCommandExecutor implement
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int run(CommandContext context) {
 | 
			
		||||
    public int run(CommandContext<CommandSourceStack> context) {
 | 
			
		||||
        return runWithArgs(context, "");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int runWithArgs(CommandContext context, String args) {
 | 
			
		||||
        CommandSourceStack source = (CommandSourceStack) context.getSource();
 | 
			
		||||
    public int runWithArgs(CommandContext<CommandSourceStack> context, String args) {
 | 
			
		||||
        CommandSourceStack source = context.getSource();
 | 
			
		||||
        FabricCommandSender sender = new FabricCommandSender(source);
 | 
			
		||||
        GeyserSession session = getGeyserSession(sender);
 | 
			
		||||
        if (!testPermission(source)) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,6 +42,8 @@ import org.spongepowered.asm.mixin.injection.At;
 | 
			
		|||
import org.spongepowered.asm.mixin.injection.Inject;
 | 
			
		||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
 | 
			
		||||
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
@Environment(EnvType.CLIENT)
 | 
			
		||||
@Mixin(IntegratedServer.class)
 | 
			
		||||
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
 | 
			
		||||
            GeyserLocale.loadGeyserLocale(this.minecraft.options.languageCode);
 | 
			
		||||
            // Give indication that Geyser is loaded
 | 
			
		||||
            Objects.requireNonNull(this.minecraft.player);
 | 
			
		||||
            this.minecraft.player.displayClientMessage(Component.literal(GeyserLocale.getPlayerLocaleString("geyser.core.start",
 | 
			
		||||
                    this.minecraft.options.languageCode, "localhost", String.valueOf(this.publishedPort))), false);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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.LecternBlockEntity;
 | 
			
		||||
import net.minecraft.world.level.chunk.LevelChunk;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
import org.cloudburstmc.math.vector.Vector3i;
 | 
			
		||||
import org.cloudburstmc.nbt.NbtMap;
 | 
			
		||||
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.util.BlockEntityUtils;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
import java.util.concurrent.CompletableFuture;
 | 
			
		||||
 | 
			
		||||
public class GeyserFabricWorldManager extends GeyserWorldManager {
 | 
			
		||||
| 
						 | 
				
			
			@ -73,9 +74,11 @@ public class GeyserFabricWorldManager extends GeyserWorldManager {
 | 
			
		|||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            //noinspection resource - level() is just a getter
 | 
			
		||||
            LevelChunk chunk = player.level().getChunk(x, z);
 | 
			
		||||
            final int chunkBlockX = x << 4;
 | 
			
		||||
            final int chunkBlockZ = z << 4;
 | 
			
		||||
            //noinspection ForLoopReplaceableByForEach - avoid constructing iterator
 | 
			
		||||
            for (int i = 0; i < blockEntityInfos.size(); i++) {
 | 
			
		||||
                BlockEntityInfo blockEntityInfo = blockEntityInfos.get(i);
 | 
			
		||||
                BlockEntity blockEntity = chunk.getBlockEntity(new BlockPos(chunkBlockX + blockEntityInfo.getX(),
 | 
			
		||||
| 
						 | 
				
			
			@ -92,7 +95,7 @@ public class GeyserFabricWorldManager extends GeyserWorldManager {
 | 
			
		|||
            if (player == null) {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            //noinspection resource - level() is just a getter
 | 
			
		||||
            BlockEntity blockEntity = player.level().getBlockEntity(new BlockPos(x, y, z));
 | 
			
		||||
            sendLecternData(session, blockEntity, false);
 | 
			
		||||
        });
 | 
			
		||||
| 
						 | 
				
			
			@ -159,7 +162,7 @@ public class GeyserFabricWorldManager extends GeyserWorldManager {
 | 
			
		|||
        return GameMode.byId(server.getDefaultGameType().getId());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    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<>();
 | 
			
		||||
| 
						 | 
				
			
			@ -172,6 +175,7 @@ public class GeyserFabricWorldManager extends GeyserWorldManager {
 | 
			
		|||
 | 
			
		||||
            BlockPos pos = new BlockPos(x, y, z);
 | 
			
		||||
            // Don't create a new block entity if invalid
 | 
			
		||||
            //noinspection resource - level() is just a getter
 | 
			
		||||
            BlockEntity blockEntity = player.level().getChunkAt(pos).getBlockEntity(pos);
 | 
			
		||||
            if (blockEntity instanceof BannerBlockEntity banner) {
 | 
			
		||||
                // 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
 | 
			
		||||
        public void visitCompound(CompoundTag compoundTag) {
 | 
			
		||||
        public void visitCompound(@NonNull CompoundTag compoundTag) {
 | 
			
		||||
            currentTag = convert(currentKey, compoundTag);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -271,7 +275,7 @@ public class GeyserFabricWorldManager extends GeyserWorldManager {
 | 
			
		|||
            OpenNbtTagVisitor visitor = new OpenNbtTagVisitor(name);
 | 
			
		||||
            for (String key : compoundTag.getAllKeys()) {
 | 
			
		||||
                visitor.currentKey = key;
 | 
			
		||||
                Tag tag = compoundTag.get(key);
 | 
			
		||||
                Tag tag = Objects.requireNonNull(compoundTag.get(key));
 | 
			
		||||
                tag.accept(visitor);
 | 
			
		||||
                visitor.root.put(visitor.currentTag);
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -279,7 +283,7 @@ public class GeyserFabricWorldManager extends GeyserWorldManager {
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void visitEnd(EndTag endTag) {
 | 
			
		||||
        public void visitEnd(@NonNull EndTag endTag) {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,11 +28,11 @@ package org.geysermc.geyser.platform.spigot;
 | 
			
		|||
import com.destroystokyo.paper.event.server.PaperServerListPingEvent;
 | 
			
		||||
import com.destroystokyo.paper.network.StatusClient;
 | 
			
		||||
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.ping.GeyserPingInfo;
 | 
			
		||||
import org.geysermc.geyser.ping.IGeyserPingPassthrough;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
import org.jetbrains.annotations.Nullable;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.Constructor;
 | 
			
		||||
import java.net.InetSocketAddress;
 | 
			
		||||
| 
						 | 
				
			
			@ -50,6 +50,7 @@ public final class GeyserPaperPingPassthrough implements IGeyserPingPassthrough
 | 
			
		|||
        this.logger = logger;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SuppressWarnings("deprecation")
 | 
			
		||||
    @Nullable
 | 
			
		||||
    @Override
 | 
			
		||||
    public GeyserPingInfo getPingInformation(InetSocketAddress inetSocketAddress) {
 | 
			
		||||
| 
						 | 
				
			
			@ -89,7 +90,7 @@ public final class GeyserPaperPingPassthrough implements IGeyserPingPassthrough
 | 
			
		|||
 | 
			
		||||
    private record GeyserStatusClient(InetSocketAddress address) implements StatusClient {
 | 
			
		||||
        @Override
 | 
			
		||||
        public @NotNull InetSocketAddress getAddress() {
 | 
			
		||||
        public @NonNull InetSocketAddress getAddress() {
 | 
			
		||||
            return address;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 * 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.
 | 
			
		||||
 * If we simply "cancel" or don't forward the packet, then the listener is never called.
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,6 +47,7 @@ public class GeyserSpigotDumpInfo extends BootstrapDumpInfo {
 | 
			
		|||
    private final int serverPort;
 | 
			
		||||
    private final List<PluginInfo> plugins;
 | 
			
		||||
 | 
			
		||||
    @SuppressWarnings("deprecation")
 | 
			
		||||
    GeyserSpigotDumpInfo() {
 | 
			
		||||
        super();
 | 
			
		||||
        this.platformName = Bukkit.getName();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,6 +32,7 @@ import io.netty.channel.*;
 | 
			
		|||
import io.netty.channel.local.LocalAddress;
 | 
			
		||||
import io.netty.util.concurrent.DefaultThreadFactory;
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
import org.geysermc.geyser.GeyserBootstrap;
 | 
			
		||||
import org.geysermc.geyser.network.netty.GeyserInjector;
 | 
			
		||||
import org.geysermc.geyser.network.netty.LocalServerChannelWrapper;
 | 
			
		||||
| 
						 | 
				
			
			@ -74,12 +75,10 @@ public class GeyserSpigotInjector extends GeyserInjector {
 | 
			
		|||
        Object connection = null;
 | 
			
		||||
        // Find the class that manages network IO
 | 
			
		||||
        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
 | 
			
		||||
                if (m.getReturnType().getSimpleName().equals("ServerConnection") || m.getReturnType().getSimpleName().equals("ServerConnectionListener")) {
 | 
			
		||||
                    if (m.getParameterTypes().length == 0) {
 | 
			
		||||
                        connection = m.invoke(server);
 | 
			
		||||
                    }
 | 
			
		||||
            // 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.getParameterTypes().length == 0) {
 | 
			
		||||
                    connection = m.invoke(server);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -117,7 +116,7 @@ public class GeyserSpigotInjector extends GeyserInjector {
 | 
			
		|||
                .channel(LocalServerChannelWrapper.class)
 | 
			
		||||
                .childHandler(new ChannelInitializer<>() {
 | 
			
		||||
                    @Override
 | 
			
		||||
                    protected void initChannel(Channel ch) throws Exception {
 | 
			
		||||
                    protected void initChannel(@NonNull Channel ch) throws Exception {
 | 
			
		||||
                        initChannel.invoke(childHandler, ch);
 | 
			
		||||
 | 
			
		||||
                        if (bootstrap.getGeyserConfig().isDisableCompression() && GeyserSpigotCompressionDisabler.ENABLED) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,10 +30,12 @@ import org.bukkit.Bukkit;
 | 
			
		|||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.event.server.ServerListPingEvent;
 | 
			
		||||
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.IGeyserPingPassthrough;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.net.InetAddress;
 | 
			
		||||
import java.net.InetSocketAddress;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
| 
						 | 
				
			
			@ -44,8 +46,9 @@ public class GeyserSpigotPingPassthrough implements IGeyserPingPassthrough {
 | 
			
		|||
 | 
			
		||||
    private final GeyserSpigotLogger logger;
 | 
			
		||||
 | 
			
		||||
    @SuppressWarnings("deprecation")
 | 
			
		||||
    @Override
 | 
			
		||||
    public GeyserPingInfo getPingInformation(InetSocketAddress inetSocketAddress) {
 | 
			
		||||
    public @Nullable GeyserPingInfo getPingInformation(InetSocketAddress inetSocketAddress) {
 | 
			
		||||
        try {
 | 
			
		||||
            ServerListPingEvent event = new GeyserPingEvent(inetSocketAddress.getAddress(), Bukkit.getMotd(), Bukkit.getOnlinePlayers().size(), Bukkit.getMaxPlayers());
 | 
			
		||||
            Bukkit.getPluginManager().callEvent(event);
 | 
			
		||||
| 
						 | 
				
			
			@ -67,7 +70,7 @@ public class GeyserSpigotPingPassthrough implements IGeyserPingPassthrough {
 | 
			
		|||
        public void setServerIcon(CachedServerIcon icon) throws IllegalArgumentException, UnsupportedOperationException {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        @NonNull
 | 
			
		||||
        @Override
 | 
			
		||||
        public Iterator<Player> iterator() throws UnsupportedOperationException {
 | 
			
		||||
            return Collections.emptyIterator();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,13 +42,14 @@ import org.bukkit.permissions.Permission;
 | 
			
		|||
import org.bukkit.permissions.PermissionDefault;
 | 
			
		||||
import org.bukkit.plugin.Plugin;
 | 
			
		||||
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.GeyserBootstrap;
 | 
			
		||||
import org.geysermc.geyser.GeyserImpl;
 | 
			
		||||
import org.geysermc.geyser.adapters.spigot.SpigotAdapters;
 | 
			
		||||
import org.geysermc.geyser.api.command.Command;
 | 
			
		||||
import org.geysermc.geyser.api.extension.Extension;
 | 
			
		||||
import org.geysermc.geyser.api.util.PlatformType;
 | 
			
		||||
import org.geysermc.geyser.command.GeyserCommandManager;
 | 
			
		||||
import org.geysermc.geyser.configuration.GeyserConfiguration;
 | 
			
		||||
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.text.GeyserLocale;
 | 
			
		||||
import org.geysermc.geyser.util.FileUtils;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
| 
						 | 
				
			
			@ -76,6 +76,7 @@ import java.net.SocketAddress;
 | 
			
		|||
import java.nio.file.Path;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
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
 | 
			
		||||
        try {
 | 
			
		||||
            if (!getDataFolder().exists()) {
 | 
			
		||||
                //noinspection ResultOfMethodCallIgnored
 | 
			
		||||
                getDataFolder().mkdir();
 | 
			
		||||
            }
 | 
			
		||||
            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");
 | 
			
		||||
        Objects.requireNonNull(geyserCommand, "base command cannot be null");
 | 
			
		||||
        geyserCommand.setExecutor(new GeyserSpigotCommandExecutor(geyser, geyserCommandManager.getCommands()));
 | 
			
		||||
 | 
			
		||||
        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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @NotNull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getServerBindAddress() {
 | 
			
		||||
        return Bukkit.getIp();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,6 +39,7 @@ import java.lang.reflect.Modifier;
 | 
			
		|||
public final class GeyserSpigotVersionChecker {
 | 
			
		||||
    private static final String VIAVERSION_DOWNLOAD_URL = "https://ci.viaversion.com/job/ViaVersion/";
 | 
			
		||||
 | 
			
		||||
    @SuppressWarnings("deprecation")
 | 
			
		||||
    public static void checkForSupportedProtocol(GeyserLogger logger, boolean viaversion) {
 | 
			
		||||
        if (viaversion) {
 | 
			
		||||
            checkViaVersionSupportedVersions(logger);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,8 +28,8 @@ package org.geysermc.geyser.platform.spigot;
 | 
			
		|||
import com.github.steveice10.mc.protocol.data.DefaultComponentSerializer;
 | 
			
		||||
import net.kyori.adventure.text.Component;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
			
		||||
import org.geysermc.geyser.GeyserImpl;
 | 
			
		||||
import org.jetbrains.annotations.Nullable;
 | 
			
		||||
 | 
			
		||||
import java.lang.invoke.MethodHandle;
 | 
			
		||||
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.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
public final class PaperAdventure {
 | 
			
		||||
| 
						 | 
				
			
			@ -102,7 +102,7 @@ public final class PaperAdventure {
 | 
			
		|||
        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) {
 | 
			
		||||
            GeyserImpl.getInstance().getLogger().error("Illegal state where Component serialization was called when it wasn't available!");
 | 
			
		||||
            return null;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,8 +29,8 @@ import com.destroystokyo.paper.event.server.PaperServerListPingEvent;
 | 
			
		|||
import com.destroystokyo.paper.network.StatusClient;
 | 
			
		||||
import org.bukkit.event.server.ServerListPingEvent;
 | 
			
		||||
import org.bukkit.util.CachedServerIcon;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import java.lang.reflect.Constructor;
 | 
			
		||||
import java.net.InetAddress;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -40,15 +40,8 @@ import java.net.InetAddress;
 | 
			
		|||
public final class ReflectedNames {
 | 
			
		||||
 | 
			
		||||
    static boolean checkPaperPingEvent() {
 | 
			
		||||
        return classExists("com.destroystokyo.paper.event.server.PaperServerListPingEvent");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return if this class name exists
 | 
			
		||||
     */
 | 
			
		||||
    private static boolean classExists(String clazz) {
 | 
			
		||||
        try {
 | 
			
		||||
            Class.forName(clazz);
 | 
			
		||||
            Class.forName("com.destroystokyo.paper.event.server.PaperServerListPingEvent");
 | 
			
		||||
            return true;
 | 
			
		||||
        } catch (ClassNotFoundException e) {
 | 
			
		||||
            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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static Constructor<PaperServerListPingEvent> getOldPaperPingConstructor() {
 | 
			
		||||
    static @Nullable Constructor<PaperServerListPingEvent> getOldPaperPingConstructor() {
 | 
			
		||||
        if (getConstructor(PaperServerListPingEvent.class, StatusClient.class, String.class, int.class,
 | 
			
		||||
                int.class, String.class, int.class, CachedServerIcon.class) != null) {
 | 
			
		||||
            // @NotNull StatusClient client, @NotNull String motd, int numPlayers, int maxPlayers,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,8 +39,8 @@ import java.util.Map;
 | 
			
		|||
 | 
			
		||||
public final class GeyserPaperCommandListener implements Listener {
 | 
			
		||||
 | 
			
		||||
    @SuppressWarnings("UnstableApiUsage")
 | 
			
		||||
    @EventHandler
 | 
			
		||||
    @SuppressWarnings("deprecation") // Used to indicate an unstable event
 | 
			
		||||
    public void onCommandSend(AsyncPlayerSendCommandsEvent<?> event) {
 | 
			
		||||
        // Documentation says to check (event.isAsynchronous() || !event.hasFiredAsync()), but as of Paper 1.18.2
 | 
			
		||||
        // event.hasFiredAsync is never true
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,6 +29,7 @@ import org.bukkit.ChatColor;
 | 
			
		|||
import org.bukkit.command.Command;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
import org.bukkit.command.TabExecutor;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
import org.geysermc.geyser.GeyserImpl;
 | 
			
		||||
import org.geysermc.geyser.command.GeyserCommand;
 | 
			
		||||
import org.geysermc.geyser.command.GeyserCommandExecutor;
 | 
			
		||||
| 
						 | 
				
			
			@ -47,7 +48,7 @@ public class GeyserSpigotCommandExecutor extends GeyserCommandExecutor implement
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    @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);
 | 
			
		||||
        GeyserSession session = getGeyserSession(commandSender);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -78,7 +79,7 @@ public class GeyserSpigotCommandExecutor extends GeyserCommandExecutor implement
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    @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) {
 | 
			
		||||
            return tabComplete(new SpigotCommandSource(sender));
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,6 +29,7 @@ import net.kyori.adventure.text.Component;
 | 
			
		|||
import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer;
 | 
			
		||||
import org.bukkit.command.ConsoleCommandSender;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
import org.geysermc.geyser.command.GeyserCommandSource;
 | 
			
		||||
import org.geysermc.geyser.platform.spigot.PaperAdventure;
 | 
			
		||||
import org.geysermc.geyser.text.GeyserLocale;
 | 
			
		||||
| 
						 | 
				
			
			@ -48,10 +49,11 @@ public class SpigotCommandSource implements GeyserCommandSource {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void sendMessage(String message) {
 | 
			
		||||
    public void sendMessage(@NonNull String message) {
 | 
			
		||||
        handle.sendMessage(message);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SuppressWarnings("deprecation")
 | 
			
		||||
    @Override
 | 
			
		||||
    public void sendMessage(Component message) {
 | 
			
		||||
        if (PaperAdventure.canSendMessageUsingComponent()) {
 | 
			
		||||
| 
						 | 
				
			
			@ -68,9 +70,11 @@ public class SpigotCommandSource implements GeyserCommandSource {
 | 
			
		|||
        return handle instanceof ConsoleCommandSender;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SuppressWarnings("deprecation")
 | 
			
		||||
    @Override
 | 
			
		||||
    public String locale() {
 | 
			
		||||
        if (this.handle instanceof Player player) {
 | 
			
		||||
            // getLocale() is deprecated on Paper, but not on Spigot
 | 
			
		||||
            return player.getLocale();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,6 +37,7 @@ import org.geysermc.geyser.platform.spigot.GeyserSpigotPlugin;
 | 
			
		|||
import org.geysermc.geyser.session.GeyserSession;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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();
 | 
			
		||||
        List<ProtocolPathEntry> protocolList = Via.getManager().getProtocolManager().getProtocolPath(GameProtocol.getJavaProtocolVersion(),
 | 
			
		||||
                serverVersion.getVersion());
 | 
			
		||||
        Objects.requireNonNull(protocolList, "protocolList cannot be null");
 | 
			
		||||
        for (int oldBlockId : allBlockStates) {
 | 
			
		||||
            int newBlockId = oldBlockId;
 | 
			
		||||
            // protocolList should *not* be null; we checked for that before initializing this class
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,11 +28,11 @@ package org.geysermc.geyser.platform.spigot.world.manager;
 | 
			
		|||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
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.SpigotWorldAdapter;
 | 
			
		||||
import org.geysermc.geyser.level.block.BlockStateValues;
 | 
			
		||||
import org.geysermc.geyser.session.GeyserSession;
 | 
			
		||||
import org.jetbrains.annotations.Nullable;
 | 
			
		||||
 | 
			
		||||
public class GeyserSpigotNativeWorldManager extends GeyserSpigotWorldManager {
 | 
			
		||||
    protected final SpigotWorldAdapter adapter;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,21 +34,23 @@ import org.bukkit.World;
 | 
			
		|||
import org.bukkit.block.Block;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
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.geysermc.erosion.bukkit.BukkitLecterns;
 | 
			
		||||
import org.geysermc.erosion.bukkit.BukkitUtils;
 | 
			
		||||
import org.geysermc.erosion.bukkit.PickBlockUtils;
 | 
			
		||||
import org.geysermc.erosion.bukkit.SchedulerUtils;
 | 
			
		||||
import org.geysermc.geyser.GeyserImpl;
 | 
			
		||||
import org.geysermc.geyser.level.GameRule;
 | 
			
		||||
import org.geysermc.geyser.level.WorldManager;
 | 
			
		||||
import org.geysermc.geyser.level.block.BlockStateValues;
 | 
			
		||||
import org.geysermc.geyser.registry.BlockRegistries;
 | 
			
		||||
import org.geysermc.geyser.session.GeyserSession;
 | 
			
		||||
import org.geysermc.geyser.util.BlockEntityUtils;
 | 
			
		||||
import org.jetbrains.annotations.Nullable;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
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)) {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -136,6 +138,7 @@ public class GeyserSpigotWorldManager extends WorldManager {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    private void sendLecternData(GeyserSession session, Chunk chunk, List<BlockEntityInfo> blockEntityInfos) {
 | 
			
		||||
        //noinspection ForLoopReplaceableByForEach - avoid constructing Iterator
 | 
			
		||||
        for (int i = 0; i < blockEntityInfos.size(); i++) {
 | 
			
		||||
            BlockEntityInfo info = blockEntityInfos.get(i);
 | 
			
		||||
            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) {
 | 
			
		||||
        String value = Bukkit.getPlayer(session.getPlayerEntity().getUsername()).getWorld().getGameRuleValue(gameRule.getJavaID());
 | 
			
		||||
        if (!value.isEmpty()) {
 | 
			
		||||
            return Boolean.parseBoolean(value);
 | 
			
		||||
        org.bukkit.GameRule<?> bukkitGameRule = org.bukkit.GameRule.getByName(gameRule.getJavaID());
 | 
			
		||||
        if (bukkitGameRule == null) {
 | 
			
		||||
            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();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getGameRuleInt(GeyserSession session, GameRule gameRule) {
 | 
			
		||||
        String value = Bukkit.getPlayer(session.getPlayerEntity().getUsername()).getWorld().getGameRuleValue(gameRule.getJavaID());
 | 
			
		||||
        if (!value.isEmpty()) {
 | 
			
		||||
            return Integer.parseInt(value);
 | 
			
		||||
        org.bukkit.GameRule<?> bukkitGameRule = org.bukkit.GameRule.getByName(gameRule.getJavaID());
 | 
			
		||||
        if (bukkitGameRule == null) {
 | 
			
		||||
            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();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -179,12 +197,11 @@ public class GeyserSpigotWorldManager extends WorldManager {
 | 
			
		|||
 | 
			
		||||
    @Override
 | 
			
		||||
    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
 | 
			
		||||
    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<>();
 | 
			
		||||
        Player bukkitPlayer;
 | 
			
		||||
        if ((bukkitPlayer = Bukkit.getPlayer(session.getPlayerEntity().getUuid())) == null) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,6 +38,7 @@ import org.apache.logging.log4j.LogManager;
 | 
			
		|||
import org.apache.logging.log4j.core.Appender;
 | 
			
		||||
import org.apache.logging.log4j.core.Logger;
 | 
			
		||||
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.GeyserBootstrap;
 | 
			
		||||
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.util.FileUtils;
 | 
			
		||||
import org.geysermc.geyser.util.LoopbackUtil;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
| 
						 | 
				
			
			@ -292,7 +292,7 @@ public class GeyserStandaloneBootstrap implements GeyserBootstrap {
 | 
			
		|||
        return new GeyserStandaloneDumpInfo(this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @NotNull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getServerBindAddress() {
 | 
			
		||||
        throw new IllegalStateException();
 | 
			
		||||
| 
						 | 
				
			
			@ -325,7 +325,7 @@ public class GeyserStandaloneBootstrap implements GeyserBootstrap {
 | 
			
		|||
 | 
			
		||||
        // Get the ignored properties
 | 
			
		||||
        Set<String> ignoredProperties = OBJECT_MAPPER.getSerializationConfig().getAnnotationIntrospector()
 | 
			
		||||
                .findPropertyIgnorals(beanDescription.getClassInfo()).getIgnored();
 | 
			
		||||
                .findPropertyIgnoralByName(OBJECT_MAPPER.getSerializationConfig() ,beanDescription.getClassInfo()).getIgnored();
 | 
			
		||||
 | 
			
		||||
        // Filter properties removing the ignored ones
 | 
			
		||||
        return properties.stream()
 | 
			
		||||
| 
						 | 
				
			
			@ -340,7 +340,7 @@ public class GeyserStandaloneBootstrap implements GeyserBootstrap {
 | 
			
		|||
     * @param parentObject The object to alter
 | 
			
		||||
     * @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) {
 | 
			
		||||
        Object parsedValue = value;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,11 +28,16 @@ package org.geysermc.geyser.platform.standalone.gui;
 | 
			
		|||
import javax.swing.*;
 | 
			
		||||
import javax.swing.text.*;
 | 
			
		||||
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 {
 | 
			
		||||
 | 
			
		||||
    @Serial
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    private static Color colorCurrent = ANSIColor.RESET.getColor();
 | 
			
		||||
    private String remaining = "";
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -62,7 +67,7 @@ public class ColorPane extends JTextPane {
 | 
			
		|||
        int aPos = 0;   // current char position in addString
 | 
			
		||||
        int aIndex; // index of next Escape sequence
 | 
			
		||||
        int mIndex; // index of "m" terminating Escape sequence
 | 
			
		||||
        String tmpString = "";
 | 
			
		||||
        String tmpString;
 | 
			
		||||
        boolean stillSearching = true; // true until no more Escape sequences
 | 
			
		||||
        String addString = remaining + s;
 | 
			
		||||
        remaining = "";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,6 +25,7 @@
 | 
			
		|||
 | 
			
		||||
package org.geysermc.geyser.platform.standalone.gui;
 | 
			
		||||
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
import org.geysermc.geyser.GeyserImpl;
 | 
			
		||||
import org.geysermc.geyser.GeyserLogger;
 | 
			
		||||
import org.geysermc.geyser.command.GeyserCommandManager;
 | 
			
		||||
| 
						 | 
				
			
			@ -64,7 +65,6 @@ public class GeyserStandaloneGUI {
 | 
			
		|||
    private final List<Integer> ramValues = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    private final DefaultTableModel playerTableModel = new DefaultTableModel();
 | 
			
		||||
    private final JTable playerTable = new JTable(playerTableModel);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 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.username"));
 | 
			
		||||
 | 
			
		||||
        JTable playerTable = new JTable(playerTableModel);
 | 
			
		||||
        JScrollPane playerScrollPane = new JScrollPane(playerTable);
 | 
			
		||||
        rightContentPane.add(playerScrollPane);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -253,12 +254,12 @@ public class GeyserStandaloneGUI {
 | 
			
		|||
            }
 | 
			
		||||
 | 
			
		||||
            @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));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public void write(byte[] b) {
 | 
			
		||||
            public void write(byte @NonNull[] b) {
 | 
			
		||||
                write(b, 0, b.length);
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,15 +29,20 @@ import lombok.Setter;
 | 
			
		|||
 | 
			
		||||
import javax.swing.*;
 | 
			
		||||
import java.awt.*;
 | 
			
		||||
import java.io.Serial;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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 {
 | 
			
		||||
 | 
			
		||||
    @Serial
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    private final static int padding = 10;
 | 
			
		||||
    private final static int labelPadding = 25;
 | 
			
		||||
    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.setColor(Color.BLACK);
 | 
			
		||||
                final int tickValue = (int) (minScore + ((scoreRange * i) / numberYDivisions));
 | 
			
		||||
                final int tickValue = minScore + ((scoreRange * i) / numberYDivisions);
 | 
			
		||||
                final String yLabel = tickValue + "";
 | 
			
		||||
                final int labelWidth = fontMetrics.stringWidth(yLabel);
 | 
			
		||||
                g.drawString(yLabel, x1 - labelWidth - 5, y + (fontHeight / 2) - 3);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,6 +29,7 @@ import com.velocitypowered.api.proxy.ProxyServer;
 | 
			
		|||
import io.netty.bootstrap.ServerBootstrap;
 | 
			
		||||
import io.netty.channel.*;
 | 
			
		||||
import io.netty.channel.local.LocalAddress;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
import org.geysermc.geyser.GeyserBootstrap;
 | 
			
		||||
import org.geysermc.geyser.network.netty.GeyserInjector;
 | 
			
		||||
import org.geysermc.geyser.network.netty.LocalServerChannelWrapper;
 | 
			
		||||
| 
						 | 
				
			
			@ -76,7 +77,7 @@ public class GeyserVelocityInjector extends GeyserInjector {
 | 
			
		|||
                .channel(LocalServerChannelWrapper.class)
 | 
			
		||||
                .childHandler(new ChannelInitializer<>() {
 | 
			
		||||
                    @Override
 | 
			
		||||
                    protected void initChannel(Channel ch) throws Exception {
 | 
			
		||||
                    protected void initChannel(@NonNull Channel ch) throws Exception {
 | 
			
		||||
                        initChannel.invoke(channelInitializer, ch);
 | 
			
		||||
 | 
			
		||||
                        if (bootstrap.getGeyserConfig().isDisableCompression() && GeyserVelocityCompressionDisabler.ENABLED) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,11 +36,13 @@ import com.velocitypowered.api.plugin.Plugin;
 | 
			
		|||
import com.velocitypowered.api.proxy.ProxyServer;
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
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.GeyserImpl;
 | 
			
		||||
import org.geysermc.geyser.api.command.Command;
 | 
			
		||||
import org.geysermc.geyser.api.extension.Extension;
 | 
			
		||||
import org.geysermc.geyser.api.util.PlatformType;
 | 
			
		||||
import org.geysermc.geyser.command.GeyserCommandManager;
 | 
			
		||||
import org.geysermc.geyser.configuration.GeyserConfiguration;
 | 
			
		||||
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.text.GeyserLocale;
 | 
			
		||||
import org.geysermc.geyser.util.FileUtils;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
import org.jetbrains.annotations.Nullable;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
| 
						 | 
				
			
			@ -222,7 +222,7 @@ public class GeyserVelocityPlugin implements GeyserBootstrap {
 | 
			
		|||
        return this.geyserInjector.getServerSocketAddress();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @NotNull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getServerBindAddress() {
 | 
			
		||||
        return proxyServer.getBoundAddress().getHostString();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,6 +30,7 @@ import com.velocitypowered.api.proxy.ConsoleCommandSource;
 | 
			
		|||
import com.velocitypowered.api.proxy.Player;
 | 
			
		||||
import net.kyori.adventure.text.Component;
 | 
			
		||||
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.text.GeyserLocale;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -56,7 +57,7 @@ public class VelocityCommandSource implements GeyserCommandSource {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void sendMessage(String message) {
 | 
			
		||||
    public void sendMessage(@NonNull String message) {
 | 
			
		||||
        handle.sendMessage(LegacyComponentSerializer.legacy('§').deserialize(message));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,7 +32,7 @@ import java.security.NoSuchAlgorithmException;
 | 
			
		|||
import java.security.SecureRandom;
 | 
			
		||||
 | 
			
		||||
public final class AesKeyProducer implements KeyProducer {
 | 
			
		||||
    public static int KEY_SIZE = 128;
 | 
			
		||||
    public static final int KEY_SIZE = 128;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public SecretKey produce() {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,6 +25,7 @@
 | 
			
		|||
 | 
			
		||||
package org.geysermc.floodgate.crypto;
 | 
			
		||||
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
			
		||||
import org.geysermc.floodgate.util.InvalidFormatException;
 | 
			
		||||
 | 
			
		||||
import java.security.Key;
 | 
			
		||||
| 
						 | 
				
			
			@ -97,7 +98,8 @@ public interface FloodgateCipher {
 | 
			
		|||
     * @return the decrypted data in a UTF-8 String
 | 
			
		||||
     * @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);
 | 
			
		||||
        if (decrypted == null) {
 | 
			
		||||
            return null;
 | 
			
		||||
| 
						 | 
				
			
			@ -113,6 +115,7 @@ public interface FloodgateCipher {
 | 
			
		|||
     * @return the decrypted data in a byte[]
 | 
			
		||||
     * @throws Exception when the decrypting failed
 | 
			
		||||
     */
 | 
			
		||||
    @SuppressWarnings("unused")
 | 
			
		||||
    default byte[] decryptFromString(String data) throws Exception {
 | 
			
		||||
        return decrypt(data.getBytes(UTF_8));
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,7 +31,7 @@ import java.nio.file.Path;
 | 
			
		|||
import java.security.Key;
 | 
			
		||||
 | 
			
		||||
public interface KeyProducer {
 | 
			
		||||
    Key produce();
 | 
			
		||||
    @SuppressWarnings("unused") Key produce();
 | 
			
		||||
    Key produceFrom(byte[] keyFileData);
 | 
			
		||||
 | 
			
		||||
    default Key produceFrom(Path keyFileLocation) throws IOException {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -109,6 +109,7 @@ public final class NewsItem {
 | 
			
		|||
        return (T) data;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SuppressWarnings("unused")
 | 
			
		||||
    public String getRawMessage() {
 | 
			
		||||
        return message;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,6 +25,8 @@
 | 
			
		|||
 | 
			
		||||
package org.geysermc.floodgate.news;
 | 
			
		||||
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
			
		||||
 | 
			
		||||
public enum NewsItemAction {
 | 
			
		||||
    ON_SERVER_STARTED,
 | 
			
		||||
    ON_OPERATOR_JOIN,
 | 
			
		||||
| 
						 | 
				
			
			@ -33,7 +35,7 @@ public enum NewsItemAction {
 | 
			
		|||
 | 
			
		||||
    private static final NewsItemAction[] VALUES = values();
 | 
			
		||||
 | 
			
		||||
    public static NewsItemAction getByName(String actionName) {
 | 
			
		||||
    public static @Nullable NewsItemAction getByName(String actionName) {
 | 
			
		||||
        for (NewsItemAction type : VALUES) {
 | 
			
		||||
            if (type.name().equalsIgnoreCase(actionName)) {
 | 
			
		||||
                return type;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@
 | 
			
		|||
package org.geysermc.floodgate.news;
 | 
			
		||||
 | 
			
		||||
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 for things that have to be filled in by us
 | 
			
		||||
| 
						 | 
				
			
			@ -49,7 +50,7 @@ public enum NewsItemMessage {
 | 
			
		|||
        this.messageSplitted = messageFormat.split(" ");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static NewsItemMessage getById(int id) {
 | 
			
		||||
    public static @Nullable NewsItemMessage getById(int id) {
 | 
			
		||||
        return VALUES.length > id ? VALUES[id] : null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@
 | 
			
		|||
package org.geysermc.floodgate.news;
 | 
			
		||||
 | 
			
		||||
import com.google.gson.JsonObject;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
			
		||||
import org.geysermc.floodgate.news.data.*;
 | 
			
		||||
 | 
			
		||||
import java.util.function.Function;
 | 
			
		||||
| 
						 | 
				
			
			@ -44,7 +45,7 @@ public enum NewsType {
 | 
			
		|||
        this.readFunction = readFunction;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static NewsType getByName(String newsType) {
 | 
			
		||||
    public static @Nullable NewsType getByName(String newsType) {
 | 
			
		||||
        for (NewsType type : VALUES) {
 | 
			
		||||
            if (type.name().equalsIgnoreCase(newsType)) {
 | 
			
		||||
                return type;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -56,6 +56,7 @@ public final class BuildSpecificData implements ItemData {
 | 
			
		|||
                (allAffected || buildId > affectedGreaterThan && buildId < affectedLessThan);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SuppressWarnings("unused")
 | 
			
		||||
    public String getBranch() {
 | 
			
		||||
        return branch;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -51,6 +51,7 @@ public final class ConfigSpecificData implements ItemData {
 | 
			
		|||
        return configSpecificData;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SuppressWarnings("unused")
 | 
			
		||||
    public boolean isAffected(Map<String, String> config) {
 | 
			
		||||
        for (Map.Entry<String, Pattern> entry : affectedKeys.entrySet()) {
 | 
			
		||||
            if (config.containsKey(entry.getKey())) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -72,6 +72,7 @@ public final class BedrockData implements Cloneable {
 | 
			
		|||
                false, subscribeId, verifyCode);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SuppressWarnings("unused")
 | 
			
		||||
    public static BedrockData fromString(String data) {
 | 
			
		||||
        String[] split = data.split("\0");
 | 
			
		||||
        if (split.length != EXPECTED_LENGTH) {
 | 
			
		||||
| 
						 | 
				
			
			@ -92,6 +93,7 @@ public final class BedrockData implements Cloneable {
 | 
			
		|||
                dataLength);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SuppressWarnings("unused")
 | 
			
		||||
    public boolean hasPlayerLink() {
 | 
			
		||||
        return linkedPlayer != null;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,9 @@
 | 
			
		|||
package org.geysermc.floodgate.util;
 | 
			
		||||
 | 
			
		||||
public class InvalidFormatException extends Exception {
 | 
			
		||||
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    public InvalidFormatException(String message) {
 | 
			
		||||
        super(message);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,6 +28,7 @@ package org.geysermc.floodgate.util;
 | 
			
		|||
import lombok.AccessLevel;
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
			
		||||
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -56,7 +57,7 @@ public final class LinkedPlayer implements Cloneable {
 | 
			
		|||
        return new LinkedPlayer(javaUsername, javaUniqueId, bedrockId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static LinkedPlayer fromString(String data) {
 | 
			
		||||
    public static @Nullable LinkedPlayer fromString(String data) {
 | 
			
		||||
        String[] split = data.split(";");
 | 
			
		||||
        if (split.length != 3) {
 | 
			
		||||
            return null;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,6 +25,8 @@
 | 
			
		|||
 | 
			
		||||
package org.geysermc.floodgate.util;
 | 
			
		||||
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
 | 
			
		||||
public enum UiProfile {
 | 
			
		||||
    CLASSIC,
 | 
			
		||||
    POCKET;
 | 
			
		||||
| 
						 | 
				
			
			@ -37,7 +39,7 @@ public enum UiProfile {
 | 
			
		|||
     * @param id the UiProfile identifier
 | 
			
		||||
     * @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];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,6 +25,8 @@
 | 
			
		|||
 | 
			
		||||
package org.geysermc.floodgate.util;
 | 
			
		||||
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
			
		||||
 | 
			
		||||
public enum WebsocketEventType {
 | 
			
		||||
    /**
 | 
			
		||||
     * Sent once we successfully connected to the server
 | 
			
		||||
| 
						 | 
				
			
			@ -81,7 +83,7 @@ public enum WebsocketEventType {
 | 
			
		|||
        this.id = id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static WebsocketEventType fromId(int id) {
 | 
			
		||||
    public static @Nullable WebsocketEventType fromId(int id) {
 | 
			
		||||
        return VALUES.length > id ? VALUES[id] : null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -152,7 +152,7 @@ public interface GeyserBootstrap {
 | 
			
		|||
     * @param resource Resource to get
 | 
			
		||||
     * @return InputStream of the given resource
 | 
			
		||||
     */
 | 
			
		||||
    default @NonNull InputStream getResource(String resource) {
 | 
			
		||||
    default @NonNull InputStream getResourceOrThrow(@NonNull String resource) {
 | 
			
		||||
        InputStream stream = getResourceOrNull(resource);
 | 
			
		||||
        if (stream == null) {
 | 
			
		||||
            throw new AssertionError("Unable to find resource: " + resource);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -71,6 +71,7 @@ import org.geysermc.geyser.level.WorldManager;
 | 
			
		|||
import org.geysermc.geyser.network.netty.GeyserServer;
 | 
			
		||||
import org.geysermc.geyser.registry.BlockRegistries;
 | 
			
		||||
import org.geysermc.geyser.registry.Registries;
 | 
			
		||||
import org.geysermc.geyser.registry.provider.ProviderSupplier;
 | 
			
		||||
import org.geysermc.geyser.scoreboard.ScoreboardUpdater;
 | 
			
		||||
import org.geysermc.geyser.session.GeyserSession;
 | 
			
		||||
import org.geysermc.geyser.session.PendingMicrosoftAuthentication;
 | 
			
		||||
| 
						 | 
				
			
			@ -622,7 +623,7 @@ public class GeyserImpl implements GeyserApi {
 | 
			
		|||
     */
 | 
			
		||||
    public boolean isProductionEnvironment() {
 | 
			
		||||
        // 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));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -638,8 +639,13 @@ public class GeyserImpl implements GeyserApi {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,9 +26,10 @@
 | 
			
		|||
package org.geysermc.geyser;
 | 
			
		||||
 | 
			
		||||
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 javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
public interface GeyserLogger extends GeyserCommandSource {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -119,7 +120,7 @@ public interface GeyserLogger extends GeyserCommandSource {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    default void sendMessage(String message) {
 | 
			
		||||
    default void sendMessage(@NonNull String message) {
 | 
			
		||||
        info(message);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,6 +30,7 @@ import java.io.InputStream;
 | 
			
		|||
import java.lang.reflect.Method;
 | 
			
		||||
import java.nio.charset.StandardCharsets;
 | 
			
		||||
import java.util.Locale;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
import java.util.Scanner;
 | 
			
		||||
 | 
			
		||||
public class GeyserMain {
 | 
			
		||||
| 
						 | 
				
			
			@ -61,8 +62,8 @@ public class GeyserMain {
 | 
			
		|||
            helpStream = GeyserMain.class.getClassLoader().getResourceAsStream("languages/run-help/en_US.txt");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Scanner help = new Scanner(helpStream, StandardCharsets.UTF_8).useDelimiter("\\Z");
 | 
			
		||||
        String line = "";
 | 
			
		||||
        Scanner help = new Scanner(Objects.requireNonNull(helpStream), StandardCharsets.UTF_8).useDelimiter("\\Z");
 | 
			
		||||
        String line;
 | 
			
		||||
        while (help.hasNext()) {
 | 
			
		||||
            line = help.next();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,10 +29,10 @@ import lombok.Getter;
 | 
			
		|||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
import lombok.experimental.Accessors;
 | 
			
		||||
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.session.GeyserSession;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -73,15 +73,6 @@ public abstract class GeyserCommand implements Command {
 | 
			
		|||
        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) {
 | 
			
		||||
        this.aliases = aliases;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,11 +26,11 @@
 | 
			
		|||
package org.geysermc.geyser.command;
 | 
			
		||||
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
			
		||||
import org.geysermc.geyser.GeyserImpl;
 | 
			
		||||
import org.geysermc.geyser.api.command.Command;
 | 
			
		||||
import org.geysermc.geyser.session.GeyserSession;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,6 +29,7 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 | 
			
		|||
import lombok.Getter;
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
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.GeyserImpl;
 | 
			
		||||
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.session.GeyserSession;
 | 
			
		||||
import org.geysermc.geyser.text.GeyserLocale;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
import org.jetbrains.annotations.Nullable;
 | 
			
		||||
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
| 
						 | 
				
			
			@ -136,12 +135,12 @@ public class GeyserCommandManager {
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @NotNull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    public Map<String, Command> commands() {
 | 
			
		||||
        return Collections.unmodifiableMap(this.commands);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @NotNull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    public Map<Extension, Map<String, Command>> extensionCommands() {
 | 
			
		||||
        return Collections.unmodifiableMap(this.extensionCommands);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@
 | 
			
		|||
package org.geysermc.geyser.command.defaults;
 | 
			
		||||
 | 
			
		||||
import com.fasterxml.jackson.databind.JsonNode;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
			
		||||
import org.geysermc.geyser.GeyserImpl;
 | 
			
		||||
import org.geysermc.geyser.api.util.PlatformType;
 | 
			
		||||
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.util.LoopbackUtil;
 | 
			
		||||
import org.geysermc.geyser.util.WebUtils;
 | 
			
		||||
import org.jetbrains.annotations.Nullable;
 | 
			
		||||
 | 
			
		||||
import java.util.Random;
 | 
			
		||||
import java.util.concurrent.CompletableFuture;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -98,7 +98,7 @@ public class DumpCommand extends GeyserCommand {
 | 
			
		|||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        String uploadedDumpUrl = "";
 | 
			
		||||
        String uploadedDumpUrl;
 | 
			
		||||
 | 
			
		||||
        if (offlineDump) {
 | 
			
		||||
            sender.sendMessage(GeyserLocale.getPlayerLocaleString("geyser.commands.dump.writing", sender.locale()));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,6 +25,7 @@
 | 
			
		|||
 | 
			
		||||
package org.geysermc.geyser.command.defaults;
 | 
			
		||||
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
			
		||||
import org.geysermc.geyser.GeyserImpl;
 | 
			
		||||
import org.geysermc.geyser.api.extension.Extension;
 | 
			
		||||
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.text.ChatColor;
 | 
			
		||||
import org.geysermc.geyser.text.GeyserLocale;
 | 
			
		||||
import org.jetbrains.annotations.Nullable;
 | 
			
		||||
 | 
			
		||||
import java.util.Comparator;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,8 +27,8 @@ package org.geysermc.geyser.command.defaults;
 | 
			
		|||
 | 
			
		||||
import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec;
 | 
			
		||||
import org.geysermc.geyser.Constants;
 | 
			
		||||
import org.geysermc.geyser.api.util.PlatformType;
 | 
			
		||||
import org.geysermc.geyser.GeyserImpl;
 | 
			
		||||
import org.geysermc.geyser.api.util.PlatformType;
 | 
			
		||||
import org.geysermc.geyser.command.GeyserCommand;
 | 
			
		||||
import org.geysermc.geyser.command.GeyserCommandSource;
 | 
			
		||||
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.util.WebUtils;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.net.URLEncoder;
 | 
			
		||||
import java.nio.charset.StandardCharsets;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
| 
						 | 
				
			
			@ -77,7 +76,7 @@ public class VersionCommand extends GeyserCommand {
 | 
			
		|||
            sender.sendMessage(GeyserLocale.getPlayerLocaleString("geyser.commands.version.checking", sender.locale()));
 | 
			
		||||
            try {
 | 
			
		||||
                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>")) {
 | 
			
		||||
                    int latestBuildNum = Integer.parseInt(buildXML.replaceAll("<(\\\\)?(/)?buildNumber>", "").trim());
 | 
			
		||||
                    int buildNum = this.geyser.buildNumber();
 | 
			
		||||
| 
						 | 
				
			
			@ -90,7 +89,7 @@ public class VersionCommand extends GeyserCommand {
 | 
			
		|||
                } else {
 | 
			
		||||
                    throw new AssertionError("buildNumber missing");
 | 
			
		||||
                }
 | 
			
		||||
            } catch (IOException e) {
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                GeyserImpl.getInstance().getLogger().error(GeyserLocale.getLocaleStringLog("geyser.commands.version.failed"), e);
 | 
			
		||||
                sender.sendMessage(ChatColor.RED + GeyserLocale.getPlayerLocaleString("geyser.commands.version.failed", sender.locale()));
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,6 +52,7 @@ public interface GeyserConfiguration {
 | 
			
		|||
 | 
			
		||||
    List<String> getSavedUserLogins();
 | 
			
		||||
 | 
			
		||||
    @SuppressWarnings("BooleanMethodIsAlwaysInverted")
 | 
			
		||||
    boolean isCommandSuggestions();
 | 
			
		||||
 | 
			
		||||
    @JsonIgnore
 | 
			
		||||
| 
						 | 
				
			
			@ -93,6 +94,7 @@ public interface GeyserConfiguration {
 | 
			
		|||
 | 
			
		||||
    boolean isForceResourcePacks();
 | 
			
		||||
 | 
			
		||||
    @SuppressWarnings("BooleanMethodIsAlwaysInverted")
 | 
			
		||||
    boolean isXboxAchievementsEnabled();
 | 
			
		||||
 | 
			
		||||
    int getCacheImages();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,6 +34,7 @@ import com.fasterxml.jackson.databind.JsonDeserializer;
 | 
			
		|||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
import lombok.Setter;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
import org.geysermc.geyser.GeyserImpl;
 | 
			
		||||
import org.geysermc.geyser.api.network.AuthType;
 | 
			
		||||
import org.geysermc.geyser.network.CIDRMatcher;
 | 
			
		||||
| 
						 | 
				
			
			@ -158,7 +159,7 @@ public abstract class GeyserJacksonConfiguration implements GeyserConfiguration
 | 
			
		|||
        private String address = "0.0.0.0";
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public String address() {
 | 
			
		||||
        public @NonNull String address() {
 | 
			
		||||
            return address;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -260,7 +261,7 @@ public abstract class GeyserJacksonConfiguration implements GeyserConfiguration
 | 
			
		|||
        private AuthType authType = AuthType.ONLINE;
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public AuthType authType() {
 | 
			
		||||
        public @NonNull AuthType authType() {
 | 
			
		||||
            return authType;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,7 +33,6 @@ import com.google.common.io.ByteSource;
 | 
			
		|||
import com.google.common.io.Files;
 | 
			
		||||
import it.unimi.dsi.fastutil.objects.Object2IntMap;
 | 
			
		||||
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec;
 | 
			
		||||
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
 | 
			
		||||
            File file = new File(DumpInfo.class.getProtectionDomain().getCodeSource().getLocation().toURI());
 | 
			
		||||
            ByteSource byteSource = Files.asByteSource(file);
 | 
			
		||||
            // Jenkins uses MD5 for its hash
 | 
			
		||||
            //noinspection UnstableApiUsage
 | 
			
		||||
            // Jenkins uses MD5 for its hash - TODO remove
 | 
			
		||||
            //noinspection UnstableApiUsage,deprecation
 | 
			
		||||
            md5Hash = byteSource.hash(Hashing.md5()).toString();
 | 
			
		||||
            //noinspection UnstableApiUsage
 | 
			
		||||
            sha256Hash = byteSource.hash(Hashing.sha256()).toString();
 | 
			
		||||
| 
						 | 
				
			
			@ -118,7 +117,7 @@ public class DumpInfo {
 | 
			
		|||
        }
 | 
			
		||||
        this.hashInfo = new HashInfo(md5Hash, sha256Hash);
 | 
			
		||||
 | 
			
		||||
        this.ramInfo = new DumpInfo.RamInfo();
 | 
			
		||||
        this.ramInfo = new RamInfo();
 | 
			
		||||
 | 
			
		||||
        if (addLog) {
 | 
			
		||||
            this.logsInfo = new LogsInfo();
 | 
			
		||||
| 
						 | 
				
			
			@ -202,7 +201,7 @@ public class DumpInfo {
 | 
			
		|||
        private boolean checkDockerBasic() {
 | 
			
		||||
            try {
 | 
			
		||||
                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")));
 | 
			
		||||
 | 
			
		||||
                    if (output.contains("docker")) {
 | 
			
		||||
| 
						 | 
				
			
			@ -259,60 +258,30 @@ public class DumpInfo {
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @AllArgsConstructor
 | 
			
		||||
    @Getter
 | 
			
		||||
    public static class HashInfo {
 | 
			
		||||
        private final String md5Hash;
 | 
			
		||||
        private final String sha256Hash;
 | 
			
		||||
    public record HashInfo(String md5Hash, String sha256Hash) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Getter
 | 
			
		||||
    public static class RamInfo {
 | 
			
		||||
        private final long free;
 | 
			
		||||
        private final long total;
 | 
			
		||||
        private final long max;
 | 
			
		||||
 | 
			
		||||
        RamInfo() {
 | 
			
		||||
            this.free = Runtime.getRuntime().freeMemory() / MEGABYTE;
 | 
			
		||||
            this.total = Runtime.getRuntime().totalMemory() / MEGABYTE;
 | 
			
		||||
            this.max = Runtime.getRuntime().maxMemory() / MEGABYTE;
 | 
			
		||||
    public record RamInfo(long free, long total, long max) {
 | 
			
		||||
        public RamInfo() {
 | 
			
		||||
            this(Runtime.getRuntime().freeMemory() / MEGABYTE,
 | 
			
		||||
                    Runtime.getRuntime().totalMemory() / MEGABYTE,
 | 
			
		||||
                    Runtime.getRuntime().maxMemory() / MEGABYTE);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * E.G. `-Xmx1024M` - all runtime JVM flags on this machine
 | 
			
		||||
     */
 | 
			
		||||
    @Getter
 | 
			
		||||
    public static class FlagsInfo {
 | 
			
		||||
        private final List<String> flags;
 | 
			
		||||
 | 
			
		||||
        FlagsInfo() {
 | 
			
		||||
            this.flags = ManagementFactory.getRuntimeMXBean().getInputArguments();
 | 
			
		||||
    public record FlagsInfo(List<String> flags) {
 | 
			
		||||
        public FlagsInfo() {
 | 
			
		||||
            this(ManagementFactory.getRuntimeMXBean().getInputArguments());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Getter
 | 
			
		||||
    @AllArgsConstructor
 | 
			
		||||
    public static class ExtensionInfo {
 | 
			
		||||
        public boolean enabled;
 | 
			
		||||
        public String name;
 | 
			
		||||
        public String version;
 | 
			
		||||
        public String apiVersion;
 | 
			
		||||
        public String main;
 | 
			
		||||
        public List<String> authors;
 | 
			
		||||
    public record ExtensionInfo(boolean enabled, String name, String version, String apiVersion, String main, List<String> authors) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Getter
 | 
			
		||||
    @AllArgsConstructor
 | 
			
		||||
    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;
 | 
			
		||||
    public record GitInfo(String buildNumber, @JsonProperty("git.commit.id.abbrev") String commitHashAbbrev, @JsonProperty("git.commit.id") String commitHash,
 | 
			
		||||
                              @JsonProperty("git.branch") String branchName, @JsonProperty("git.remote.origin.url") String originUrl) {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,6 +59,7 @@ public record EntityDefinition<T extends Entity>(EntityFactory<T> factory, Entit
 | 
			
		|||
        return new Builder<>(factory);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    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());
 | 
			
		||||
        if (translator == null) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,6 +25,7 @@
 | 
			
		|||
 | 
			
		||||
package org.geysermc.geyser.entity.attribute;
 | 
			
		||||
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
			
		||||
import org.cloudburstmc.protocol.bedrock.data.AttributeData;
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
| 
						 | 
				
			
			@ -69,7 +70,7 @@ public enum GeyserAttributeType {
 | 
			
		|||
        return getAttribute(value, maximum);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public AttributeData getAttribute(float value, float maximum) {
 | 
			
		||||
    public @Nullable AttributeData getAttribute(float value, float maximum) {
 | 
			
		||||
        if (bedrockIdentifier == null) {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,7 +34,6 @@ import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes;
 | 
			
		|||
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
 | 
			
		||||
import org.geysermc.geyser.entity.EntityDefinition;
 | 
			
		||||
import org.geysermc.geyser.registry.Registries;
 | 
			
		||||
import org.geysermc.geyser.registry.type.ParticleMapping;
 | 
			
		||||
import org.geysermc.geyser.session.GeyserSession;
 | 
			
		||||
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,6 +36,7 @@ import lombok.AccessLevel;
 | 
			
		|||
import lombok.Getter;
 | 
			
		||||
import lombok.Setter;
 | 
			
		||||
import net.kyori.adventure.text.Component;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
			
		||||
import org.cloudburstmc.math.vector.Vector2f;
 | 
			
		||||
import org.cloudburstmc.math.vector.Vector3f;
 | 
			
		||||
import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes;
 | 
			
		||||
| 
						 | 
				
			
			@ -580,7 +581,7 @@ public class Entity implements GeyserEntity {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    @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;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,6 +38,7 @@ import com.github.steveice10.opennbt.tag.builtin.StringTag;
 | 
			
		|||
import lombok.AccessLevel;
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
import lombok.Setter;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
			
		||||
import org.cloudburstmc.math.vector.Vector3f;
 | 
			
		||||
import org.cloudburstmc.math.vector.Vector3i;
 | 
			
		||||
import org.cloudburstmc.protocol.bedrock.data.AttributeData;
 | 
			
		||||
| 
						 | 
				
			
			@ -120,7 +121,7 @@ public class LivingEntity extends Entity {
 | 
			
		|||
        session.sendUpstreamPacket(attributesPacket);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Vector3i setBedPosition(EntityMetadata<Optional<Vector3i>, ?> entityMetadata) {
 | 
			
		||||
    public @Nullable Vector3i setBedPosition(EntityMetadata<Optional<Vector3i>, ?> entityMetadata) {
 | 
			
		||||
        Optional<Vector3i> optionalPos = entityMetadata.getValue();
 | 
			
		||||
        if (optionalPos.isPresent()) {
 | 
			
		||||
            Vector3i bedPosition = optionalPos.get();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -51,7 +51,6 @@ public class ThrowableEntity extends Entity implements Tickable {
 | 
			
		|||
 | 
			
		||||
    /**
 | 
			
		||||
     * Updates the position for the Bedrock client.
 | 
			
		||||
     *
 | 
			
		||||
     * Java clients assume the next positions of moving items. Bedrock needs to be explicitly told positions
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@
 | 
			
		|||
package org.geysermc.geyser.entity.type.living;
 | 
			
		||||
 | 
			
		||||
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.protocol.bedrock.data.entity.EntityFlag;
 | 
			
		||||
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.InteractionResult;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
public class AbstractFishEntity extends WaterEntity {
 | 
			
		||||
| 
						 | 
				
			
			@ -48,9 +48,9 @@ public class AbstractFishEntity extends WaterEntity {
 | 
			
		|||
        setFlag(EntityFlag.HAS_GRAVITY, false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
 | 
			
		||||
    protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
 | 
			
		||||
        if (EntityUtils.attemptToBucket(itemInHand)) {
 | 
			
		||||
            return InteractionResult.SUCCESS;
 | 
			
		||||
        } else {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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.player.Hand;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
import org.cloudburstmc.math.vector.Vector3f;
 | 
			
		||||
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
 | 
			
		||||
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.InteractiveTag;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
public class AllayEntity extends MobEntity {
 | 
			
		||||
| 
						 | 
				
			
			@ -54,9 +54,9 @@ public class AllayEntity extends MobEntity {
 | 
			
		|||
        this.canDuplicate = entityMetadata.getPrimitiveValue();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @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)) {
 | 
			
		||||
            // Maybe better as another tag?
 | 
			
		||||
            return InteractiveTag.GIVE_ITEM_TO_ALLAY;
 | 
			
		||||
| 
						 | 
				
			
			@ -70,9 +70,9 @@ public class AllayEntity extends MobEntity {
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @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)) {
 | 
			
		||||
            //TOCHECK sound
 | 
			
		||||
            return InteractionResult.SUCCESS;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -70,7 +70,7 @@ public class ArmorStandEntity extends LivingEntity {
 | 
			
		|||
    private boolean primaryEntity = true;
 | 
			
		||||
    /**
 | 
			
		||||
     * 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
 | 
			
		||||
     * to allow the nametag to appear. Basically:
 | 
			
		||||
     * - 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 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
 | 
			
		||||
        setFlag(EntityFlag.BRIBED, true);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@
 | 
			
		|||
package org.geysermc.geyser.entity.type.living;
 | 
			
		||||
 | 
			
		||||
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.geysermc.geyser.entity.EntityDefinition;
 | 
			
		||||
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.InteractiveTag;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
public class DolphinEntity extends WaterEntity {
 | 
			
		||||
| 
						 | 
				
			
			@ -46,18 +46,18 @@ public class DolphinEntity extends WaterEntity {
 | 
			
		|||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @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)) {
 | 
			
		||||
            return InteractiveTag.FEED;
 | 
			
		||||
        }
 | 
			
		||||
        return super.testMobInteraction(hand, itemInHand);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @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)) {
 | 
			
		||||
            // Feed
 | 
			
		||||
            return InteractionResult.SUCCESS;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@
 | 
			
		|||
package org.geysermc.geyser.entity.type.living;
 | 
			
		||||
 | 
			
		||||
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.protocol.bedrock.data.entity.EntityDataTypes;
 | 
			
		||||
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.util.InteractionResult;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
public class IronGolemEntity extends GolemEntity {
 | 
			
		||||
| 
						 | 
				
			
			@ -51,9 +51,9 @@ public class IronGolemEntity extends GolemEntity {
 | 
			
		|||
        maxHealth = 100f;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @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 (health < maxHealth) {
 | 
			
		||||
                // Healing the iron golem
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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.player.Hand;
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
import org.cloudburstmc.math.vector.Vector3f;
 | 
			
		||||
import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes;
 | 
			
		||||
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.InteractiveTag;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
public class MobEntity extends LivingEntity {
 | 
			
		||||
| 
						 | 
				
			
			@ -133,13 +133,13 @@ public class MobEntity extends LivingEntity {
 | 
			
		|||
        return InteractionResult.PASS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
 | 
			
		||||
    @NonNull
 | 
			
		||||
    protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
 | 
			
		||||
        return InteractiveTag.NONE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
 | 
			
		||||
    @NonNull
 | 
			
		||||
    protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
 | 
			
		||||
        return InteractionResult.PASS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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.player.Hand;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
import org.cloudburstmc.math.vector.Vector3f;
 | 
			
		||||
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
 | 
			
		||||
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.InteractiveTag;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
public class SnowGolemEntity extends GolemEntity {
 | 
			
		||||
| 
						 | 
				
			
			@ -51,9 +51,9 @@ public class SnowGolemEntity extends GolemEntity {
 | 
			
		|||
        setFlag(EntityFlag.SHEARED, (xd & 0x10) != 0x10);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @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)) {
 | 
			
		||||
            // Shearing the snow golem
 | 
			
		||||
            return InteractiveTag.SHEAR;
 | 
			
		||||
| 
						 | 
				
			
			@ -61,9 +61,9 @@ public class SnowGolemEntity extends GolemEntity {
 | 
			
		|||
        return InteractiveTag.NONE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @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)) {
 | 
			
		||||
            // Shearing the snow golem
 | 
			
		||||
            return InteractionResult.SUCCESS;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@
 | 
			
		|||
package org.geysermc.geyser.entity.type.living;
 | 
			
		||||
 | 
			
		||||
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.geysermc.geyser.entity.EntityDefinition;
 | 
			
		||||
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.InteractiveTag;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
 | 
			
		||||
    protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
 | 
			
		||||
        if (isFood(itemInHand)) {
 | 
			
		||||
            return InteractiveTag.FEED;
 | 
			
		||||
        }
 | 
			
		||||
        return super.testMobInteraction(hand, itemInHand);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
 | 
			
		||||
    protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
 | 
			
		||||
        if (isFood(itemInHand)) {
 | 
			
		||||
            //TODO particles
 | 
			
		||||
            return InteractionResult.SUCCESS;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@
 | 
			
		|||
package org.geysermc.geyser.entity.type.living.animal;
 | 
			
		||||
 | 
			
		||||
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.protocol.bedrock.data.entity.EntityEventType;
 | 
			
		||||
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.InteractiveTag;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
public class AnimalEntity extends AgeableEntity {
 | 
			
		||||
| 
						 | 
				
			
			@ -59,18 +59,18 @@ public class AnimalEntity extends AgeableEntity {
 | 
			
		|||
        return item == Items.WHEAT;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
 | 
			
		||||
    protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
 | 
			
		||||
        if (canEat(itemInHand)) {
 | 
			
		||||
            return InteractiveTag.FEED;
 | 
			
		||||
        }
 | 
			
		||||
        return super.testMobInteraction(hand, itemInHand);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
 | 
			
		||||
    protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
 | 
			
		||||
        if (canEat(itemInHand)) {
 | 
			
		||||
            // FEED
 | 
			
		||||
            if (getFlag(EntityFlag.BABY)) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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.IntEntityMetadata;
 | 
			
		||||
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.protocol.bedrock.data.entity.EntityDataTypes;
 | 
			
		||||
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.InteractionResult;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
public class AxolotlEntity extends AnimalEntity {
 | 
			
		||||
| 
						 | 
				
			
			@ -74,9 +74,9 @@ public class AxolotlEntity extends AnimalEntity {
 | 
			
		|||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
 | 
			
		||||
    protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
 | 
			
		||||
        if (EntityUtils.attemptToBucket(itemInHand)) {
 | 
			
		||||
            return InteractionResult.SUCCESS;
 | 
			
		||||
        } else {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@
 | 
			
		|||
package org.geysermc.geyser.entity.type.living.animal;
 | 
			
		||||
 | 
			
		||||
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.protocol.bedrock.data.SoundEvent;
 | 
			
		||||
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.InteractiveTag;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @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) {
 | 
			
		||||
            return super.testMobInteraction(hand, itemInHand);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -54,9 +54,9 @@ public class CowEntity extends AnimalEntity {
 | 
			
		|||
        return InteractiveTag.MILK;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @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) {
 | 
			
		||||
            return super.mobInteract(hand, itemInHand);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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.type.BooleanEntityMetadata;
 | 
			
		||||
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.protocol.bedrock.data.SoundEvent;
 | 
			
		||||
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.util.InteractionResult;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
public class GoatEntity extends AnimalEntity {
 | 
			
		||||
| 
						 | 
				
			
			@ -70,9 +70,9 @@ public class GoatEntity extends AnimalEntity {
 | 
			
		|||
 | 
			
		||||
    // TODO testMobInteraction?
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @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) {
 | 
			
		||||
            session.playSoundEvent(isScreamer ? SoundEvent.MILK_SCREAMER : SoundEvent.MILK, position);
 | 
			
		||||
            return InteractionResult.SUCCESS;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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.player.Hand;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
import org.cloudburstmc.math.vector.Vector3f;
 | 
			
		||||
import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes;
 | 
			
		||||
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.InteractiveTag;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
public class MooshroomEntity extends AnimalEntity {
 | 
			
		||||
| 
						 | 
				
			
			@ -52,9 +52,9 @@ public class MooshroomEntity extends AnimalEntity {
 | 
			
		|||
        dirtyMetadata.put(EntityDataTypes.VARIANT, isBrown ? 1 : 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
 | 
			
		||||
    protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
 | 
			
		||||
        if (!isBaby()) {
 | 
			
		||||
            if (itemInHand.asItem() == Items.BOWL) {
 | 
			
		||||
                // Stew
 | 
			
		||||
| 
						 | 
				
			
			@ -67,9 +67,9 @@ public class MooshroomEntity extends AnimalEntity {
 | 
			
		|||
        return super.testMobInteraction(hand, itemInHand);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
 | 
			
		||||
    protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
 | 
			
		||||
        boolean isBaby = isBaby();
 | 
			
		||||
        if (!isBaby && itemInHand.asItem() == Items.BOWL) {
 | 
			
		||||
            // Stew
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@
 | 
			
		|||
package org.geysermc.geyser.entity.type.living.animal;
 | 
			
		||||
 | 
			
		||||
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.protocol.bedrock.data.entity.EntityFlag;
 | 
			
		||||
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.InteractiveTag;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
public class OcelotEntity extends AnimalEntity {
 | 
			
		||||
| 
						 | 
				
			
			@ -50,9 +50,9 @@ public class OcelotEntity extends AnimalEntity {
 | 
			
		|||
        return item == Items.COD || item == Items.SALMON;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @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) {
 | 
			
		||||
            // Attempt to feed
 | 
			
		||||
            return InteractiveTag.FEED;
 | 
			
		||||
| 
						 | 
				
			
			@ -61,9 +61,9 @@ public class OcelotEntity extends AnimalEntity {
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @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) {
 | 
			
		||||
            // Attempt to feed
 | 
			
		||||
            return InteractionResult.SUCCESS;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,6 +28,8 @@ package org.geysermc.geyser.entity.type.living.animal;
 | 
			
		|||
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata;
 | 
			
		||||
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata;
 | 
			
		||||
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.NonNull;
 | 
			
		||||
import org.checkerframework.checker.nullness.qual.Nullable;
 | 
			
		||||
import org.cloudburstmc.math.vector.Vector3f;
 | 
			
		||||
import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes;
 | 
			
		||||
import org.cloudburstmc.protocol.bedrock.data.entity.EntityEventType;
 | 
			
		||||
| 
						 | 
				
			
			@ -41,8 +43,6 @@ import org.geysermc.geyser.session.GeyserSession;
 | 
			
		|||
import org.geysermc.geyser.util.InteractionResult;
 | 
			
		||||
import org.geysermc.geyser.util.InteractiveTag;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
public class PandaEntity extends AnimalEntity {
 | 
			
		||||
| 
						 | 
				
			
			@ -93,18 +93,18 @@ public class PandaEntity extends AnimalEntity {
 | 
			
		|||
        return item == Items.BAMBOO;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
 | 
			
		||||
    protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
 | 
			
		||||
        if (mainGene == Gene.WORRIED && session.isThunder()) {
 | 
			
		||||
            return InteractiveTag.NONE;
 | 
			
		||||
        }
 | 
			
		||||
        return super.testMobInteraction(hand, itemInHand);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
 | 
			
		||||
    protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
 | 
			
		||||
        if (mainGene == Gene.WORRIED && session.isThunder()) {
 | 
			
		||||
            // Huh!
 | 
			
		||||
            return InteractionResult.PASS;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@
 | 
			
		|||
package org.geysermc.geyser.entity.type.living.animal;
 | 
			
		||||
 | 
			
		||||
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.protocol.bedrock.data.entity.EntityFlag;
 | 
			
		||||
import org.geysermc.geyser.entity.EntityDefinition;
 | 
			
		||||
| 
						 | 
				
			
			@ -37,7 +38,6 @@ import org.geysermc.geyser.util.EntityUtils;
 | 
			
		|||
import org.geysermc.geyser.util.InteractionResult;
 | 
			
		||||
import org.geysermc.geyser.util.InteractiveTag;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
public class PigEntity extends AnimalEntity {
 | 
			
		||||
| 
						 | 
				
			
			@ -51,9 +51,9 @@ public class PigEntity extends AnimalEntity {
 | 
			
		|||
        return item == Items.CARROT || item == Items.POTATO || item == Items.BEETROOT;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
 | 
			
		||||
    protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
 | 
			
		||||
        if (!canEat(itemInHand) && getFlag(EntityFlag.SADDLED) && passengers.isEmpty() && !session.isSneaking()) {
 | 
			
		||||
            // Mount
 | 
			
		||||
            return InteractiveTag.MOUNT;
 | 
			
		||||
| 
						 | 
				
			
			@ -68,9 +68,9 @@ public class PigEntity extends AnimalEntity {
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
 | 
			
		||||
    protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) {
 | 
			
		||||
        if (!canEat(itemInHand) && getFlag(EntityFlag.SADDLED) && passengers.isEmpty() && !session.isSneaking()) {
 | 
			
		||||
            // Mount
 | 
			
		||||
            return InteractionResult.SUCCESS;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue