Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
b8655a9
Initial changes
onebeastchris Jun 14, 2026
7df58cd
Exclude NeoForge temporarily
onebeastchris Jun 14, 2026
79be26f
closer to compile??
onebeastchris Jun 14, 2026
06d25a8
Start updating gametests, update mappings
onebeastchris Jun 14, 2026
38fe246
Temporarily disable < 26.30, slimes are now ageable
onebeastchris Jun 14, 2026
1f1c9ee
Mention re-running datagen as a tip on how to fix the minecraft versi…
onebeastchris Jun 14, 2026
4153e8b
Re-run datagen
onebeastchris Jun 15, 2026
58a021d
Implement sulfur cube, fix team color check, add new attributes, enab…
Novampr Jun 16, 2026
2f8d271
mention that mcpl could be outdated in gametests
onebeastchris Jun 16, 2026
556710b
Include neoforge again
onebeastchris Jun 16, 2026
3ffca1b
Fix: move BedBlockEntityTranslator code into BedBlock
eclipseisoffline Jun 16, 2026
57c7479
Fix: sulfur cube metadata translator order, re-run gametest datagen
eclipseisoffline Jun 16, 2026
05f1807
Add component hasher and gametest for sulfur_cube_content component
eclipseisoffline Jun 16, 2026
762942d
Fix backport mappings for blocks
Novampr Jun 16, 2026
99ffcb8
Fix backport mappings for blocks, again
Novampr Jun 16, 2026
9c4263b
Fix: load default data components before block mappings
eclipseisoffline Jun 16, 2026
5605810
Fix tests, bump MCPL
eclipseisoffline Jun 16, 2026
24ecf4f
Correctly send sulfur cube contents, fix sulfur cube size
Novampr Jun 16, 2026
f24a967
Merge remote-tracking branch 'upstream/master' into feature/26.2
eclipseisoffline Jun 17, 2026
c4826ff
Cloud back to SNAPSHOT
eclipseisoffline Jun 17, 2026
1a0b208
Apply resolvable default item components to every Item (#6375)
eclipseisoffline Jun 17, 2026
1821ed7
Update fabric.mod.json and neoforge.mods.toml files
eclipseisoffline Jun 17, 2026
569a6ac
Fix sulfur cubes sizes and display
Novampr Jun 17, 2026
fb1e214
Revert mappings
Novampr Jun 17, 2026
a195b19
Key the bedrock archetypes
Novampr Jun 17, 2026
2c2b135
Fix: always clone baseComponents in Item#gatherComponents
eclipseisoffline Jun 17, 2026
849ee09
Remove temporary fix in gametest
onebeastchris Jun 17, 2026
54224a6
Fix unit tests, use timestamped cloud version
onebeastchris Jun 18, 2026
731dec2
Actually target the right cloud timestamped builds
onebeastchris Jun 18, 2026
0343e0b
Fix: Team colors suggestions
onebeastchris Jun 18, 2026
b6a2b93
Merge branch 'master' into feature/26.2
oryxel1 Jun 19, 2026
391dfbb
Don't send swing packets to the server while in spectator mode (#6461)
darkcupid412 Jun 19, 2026
d459d75
Automate the Minecraft version in the Fabric and NeoForge mod metadat…
darkcupid412 Jun 19, 2026
51d7199
Guard new attributes behind version checks
onebeastchris Jun 19, 2026
8252cd8
Fix: properly load resolvable holder components that are stored as In…
eclipseisoffline Jun 20, 2026
99c6b56
Fix: this time with the new generated gametests!
eclipseisoffline Jun 20, 2026
b340de3
Fix integrated server mixin
Novampr Jun 23, 2026
15559c6
Add support for spectating entities on Bedrock (#6470)
darkcupid412 Jun 25, 2026
f3185b5
Custom waypoint style API (and mappings) (#6406)
eclipseisoffline Jun 25, 2026
8b182aa
Properly handle suspicious effect holders in MooshroomEntity#mobInteract
eclipseisoffline Jun 26, 2026
b84ab9c
Proper world border collision and minor visual fixes. (#6385)
oryxel1 Jun 30, 2026
8f6a9d2
Feature: Custom Entity API (#6010)
onebeastchris Jul 5, 2026
6436404
Merge remote-tracking branch 'upstream/master' into feature/26.2
onebeastchris Jul 5, 2026
48f9dfa
Fix baby sulfur cube sizes
Novampr Jul 7, 2026
2b2df74
Fix mapping sub-module
Novampr Jul 7, 2026
ede0c97
Fix invisible beds and centralize Bedrock-only block entity tag updat…
darkcupid412 Jul 8, 2026
6e8e961
Fix potent sulfur block entity id (#6516)
darkcupid412 Jul 8, 2026
15a27c5
Bump mappings
Novampr Jul 8, 2026
8fbe115
getEntities -> getEntitiesUnsafe to indicate direct access
onebeastchris Jul 9, 2026
34bae2a
Merge remote-tracking branch 'upstream/master' into feature/26.2
onebeastchris Jul 9, 2026
2bb192d
Reapply "Adventure 5.0.0"
eclipseisoffline May 5, 2026
cde4b32
Initial changes: drop adventure-platform-bungee, update to 5.2.0
onebeastchris Jul 9, 2026
90d9020
Target cloud-beta 17
onebeastchris Jul 9, 2026
ed84cae
temporary hack around velocity not being updated to 5.x adventure
onebeastchris Jul 9, 2026
93b447b
Remove BungeeCord ping passthrough debug
onebeastchris Jul 9, 2026
54b5c7a
Update to Adventure 5.2.0 / cloud-minecraft-beta 17
onebeastchris Jul 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ Special thanks to the DragonProxy project for being a trailblazer in protocol tr

## Supported Versions

| Edition | Supported Versions |
|---------|------------------------------------------------------------------------------------------------------------|
| Bedrock | 26.0, 26.1, 26.2, 26.3, 26.10, 26.20, 26.21, 26.22, 26.23, 26.30, 26.31, 26.32 |
| Java | 26.1 - 26.1.2 (For older versions, [see this guide](https://geysermc.org/wiki/geyser/supported-versions/)) |
| Edition | Supported Versions |
|---------|---------------------------------------------------------------------------------------------------|
| Bedrock | 26.0, 26.1, 26.2, 26.3, 26.10, 26.20, 26.21, 26.22, 26.23, 26.30, 26.31, 26.32 |
| Java | 26.2 (For older versions, [see this guide](https://geysermc.org/wiki/geyser/supported-versions/)) |

## Setting Up
Take a look [here](https://geysermc.org/wiki/geyser/setup/) for how to set up Geyser.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,22 +25,19 @@

package org.geysermc.geyser.api.connection;

import org.checkerframework.checker.index.qual.NonNegative;
import org.checkerframework.checker.index.qual.Positive;
import org.geysermc.api.connection.Connection;
import org.geysermc.geyser.api.bedrock.camera.CameraData;
import org.geysermc.geyser.api.bedrock.camera.CameraShake;
import org.geysermc.geyser.api.command.CommandSource;
import org.geysermc.geyser.api.entity.EntityData;
import org.geysermc.geyser.api.entity.type.GeyserEntity;
import org.geysermc.geyser.api.entity.type.player.GeyserPlayerEntity;
import org.geysermc.geyser.api.skin.SkinData;
import org.jspecify.annotations.Nullable;

import java.util.NoSuchElementException;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;

/**
* Represents a player connection used in Geyser.
Expand All @@ -57,7 +54,7 @@ public interface GeyserConnection extends Connection, CommandSource {

/**
* Exposes the {@link EntityData} for this connection.
* It allows you to get entities by their Java entity ID, show emotes, and get the player entity.
* It allows you to look up other entities through various methods.
*
* @return the EntityData for this connection.
*/
Expand Down Expand Up @@ -164,14 +161,6 @@ public interface GeyserConnection extends Connection, CommandSource {
*/
void sendSkin(UUID player, SkinData skinData);

/**
* @param javaId the Java entity ID to look up.
* @return a {@link GeyserEntity} if present in this connection's entity tracker.
* @deprecated Use {@link EntityData#entityByJavaId(int)} instead
*/
@Deprecated
CompletableFuture<@Nullable GeyserEntity> entityByJavaId(@NonNegative int javaId);

/**
* Displays a player entity as emoting to this client.
*
Expand Down
45 changes: 39 additions & 6 deletions api/src/main/java/org/geysermc/geyser/api/entity/EntityData.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,24 +29,57 @@
import org.geysermc.geyser.api.connection.GeyserConnection;
import org.geysermc.geyser.api.entity.type.GeyserEntity;
import org.geysermc.geyser.api.entity.type.player.GeyserPlayerEntity;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.Nullable;

import java.util.UUID;
import java.util.concurrent.CompletableFuture;

/**
* This class holds all the methods that relate to entities.
* Can be accessed through {@link GeyserConnection#entities()}.
* Provides entity lookup and input-lock utilities for a specific connection.
* Accessed via {@link GeyserConnection#entities()}.
*/
public interface EntityData {

/**
* Returns a {@link GeyserEntity} to e.g. make them play an emote.
* @deprecated use {@link #byJavaId(int)}
* @since 2.3.0
*/
@Deprecated(since = "2.11.0")
CompletableFuture<@Nullable GeyserEntity> entityByJavaId(@NonNegative int javaId);

/**
* Returns the {@link GeyserEntity} for the given Java entity ID if it is tracked
* in this connection's entity cache, or {@code null} if not found.
*
* @param javaId the Java entity ID to look up
* @return a {@link GeyserEntity} if present in this connection's entity tracker
* @return the entity, or {@code null} if not found
* @since 2.11.0
*/
CompletableFuture<@Nullable GeyserEntity> entityByJavaId(@NonNegative int javaId);
@ApiStatus.Experimental
@Nullable GeyserEntity byJavaId(@NonNegative int javaId);

/**
* Returns the {@link GeyserEntity} for the given Java entity UUID if it is tracked
* in this connection's entity cache, or {@code null} if not found.
*
* @param javaUuid the Java entity UUID to look up
* @return the entity, or {@code null} if not found
* @since 2.11.0
*/
@ApiStatus.Experimental
@Nullable GeyserEntity byUuid(UUID javaUuid);

/**
* Returns the {@link GeyserEntity} for the given Geyser runtime entity ID if it is tracked
* in this connection's entity cache, or {@code null} if not found.
*
* @param geyserId the Geyser entity ID (as returned by {@link GeyserEntity#geyserId()})
* @return the entity, or {@code null} if not found
* @since 2.11.0
*/
@ApiStatus.Experimental
@Nullable GeyserEntity byGeyserId(@NonNegative long geyserId);

/**
* (Un)locks the client's movement inputs, so that they cannot move.
Expand Down Expand Up @@ -79,7 +112,7 @@ public interface EntityData {
void showEmote(GeyserPlayerEntity emoter, String emoteId);

/**
* @deprecated Use {@link GeyserConnection#playerEntity} instead.
* @deprecated Use {@link GeyserConnection#playerEntity()} instead.
*/
@Deprecated(since = "2.9.3")
GeyserPlayerEntity playerEntity();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/*
* Copyright (c) 2025 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @author GeyserMC
* @link https://github.com/GeyserMC/Geyser
*/

package org.geysermc.geyser.api.entity.custom;

import org.geysermc.geyser.api.GeyserApi;
import org.geysermc.geyser.api.entity.definition.GeyserEntityDefinition;
import org.geysermc.geyser.api.event.java.ServerAttachParrotsEvent;
import org.geysermc.geyser.api.event.java.ServerSpawnEntityEvent;
import org.geysermc.geyser.api.util.Identifier;
import org.jetbrains.annotations.ApiStatus;

/**
* Represents a Bedrock entity definition for a custom entity.
* These cannot be in the {@code minecraft} namespace, and have to be manually
* spawned using either the {@link ServerSpawnEntityEvent} or {@link ServerAttachParrotsEvent}.
*
* @since 2.11.0
*/
@ApiStatus.Experimental
public interface CustomEntityDefinition extends GeyserEntityDefinition {

/**
* {@inheritDoc}
*/
@Override
@ApiStatus.Experimental
default boolean vanilla() {
return false;
}

/**
* Creates or retrieves a custom entity definition by the Bedrock entity type identifier.
*
* @param identifier the Bedrock entity identifier
* @return customEntityDefinition
* @since 2.11.0
*/
@ApiStatus.Experimental
static CustomEntityDefinition of(Identifier identifier) {
if (identifier.vanilla()) {
throw new IllegalArgumentException(
"Custom entity identifiers cannot use the 'minecraft' namespace. "
+ "Use a non-vanilla namespace, e.g. 'mymod:my_entity'.");
}
return GeyserApi.api().provider(CustomEntityDefinition.class, identifier);
}

/**
* Creates or retrieves a {@link CustomEntityDefinition} by the Bedrock entity type identifier.
* The identifier must not use the {@code minecraft} namespace.
*
* @param identifier the Bedrock entity identifier, in {@code namespace:path} format
* @return the custom entity definition
* @since 2.11.0
*/
@ApiStatus.Experimental
static CustomEntityDefinition of(String identifier) {
return of(Identifier.of(identifier));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
* Copyright (c) 2026 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @author GeyserMC
* @link https://github.com/GeyserMC/Geyser
*/

@NullMarked
package org.geysermc.geyser.api.entity.custom;

import org.jspecify.annotations.NullMarked;
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
/*
* Copyright (c) 2025 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @author GeyserMC
* @link https://github.com/GeyserMC/Geyser
*/

package org.geysermc.geyser.api.entity.data;

import org.geysermc.geyser.api.entity.type.GeyserEntity;
import org.geysermc.geyser.api.util.Identifier;
import org.jetbrains.annotations.ApiStatus;

import java.util.Objects;

/**
* Represents a type of entity data that can be sent for an entity.
* <p>
* Entity data types define the values stored for a particular piece of metadata,
* such as a {@code Byte}, {@code Integer}, {@code Float}; and the identifier associated with the types.
* <p>
* Unlike properties of custom items or blocks, it is possible to update entity metadata at runtime,
* which can be done using {@link GeyserEntity#override(GeyserEntityDataType, Object)}.
* <p>
* Only the built-in types in {@link GeyserEntityDataTypes} are supported. Attempting to use a type
* not provided by Geyser will throw an {@link IllegalArgumentException} at runtime.
*
* @param <T> the value type associated with this entity data type
* @since 2.11.0
*/
@ApiStatus.Experimental
public abstract sealed class GeyserEntityDataType<T> permits GeyserEntityDataType.SimpleType, GeyserListEntityDataType {

private final Identifier identifier;
private final Class<T> typeClass;

@ApiStatus.Internal
GeyserEntityDataType(Identifier identifier, Class<T> typeClass) {
this.identifier = Objects.requireNonNull(identifier);
this.typeClass = Objects.requireNonNull(typeClass);
}

/**
* Gets the identifier associated with this entity data type.
*
* @return the identifier for this type
* @since 2.11.0
*/
@ApiStatus.Experimental
public final Identifier identifier() {
return identifier;
}

/**
* Gets the Java class representing the value type associated with this data type.
*
* @return the class of the value used by this entity data type
* @since 2.11.0
*/
@ApiStatus.Experimental
public final Class<T> typeClass() {
return typeClass;
}

@Override
@ApiStatus.Experimental
public final boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof GeyserEntityDataType<?> that)) return false;
return identifier.equals(that.identifier);
}

@Override
@ApiStatus.Experimental
public final int hashCode() {
return identifier.hashCode();
}

@Override
@ApiStatus.Experimental
public String toString() {
return "GeyserEntityDataType{" + identifier + ", " + typeClass.getSimpleName() + "}";
}

@ApiStatus.Internal
static <T> GeyserEntityDataType<T> create(Identifier identifier, Class<T> typeClass) {
return new SimpleType<>(identifier, typeClass);
}

@ApiStatus.Internal
static final class SimpleType<T> extends GeyserEntityDataType<T> {
@ApiStatus.Internal
SimpleType(Identifier identifier, Class<T> typeClass) {
super(identifier, typeClass);
}
}
}
Loading
Loading