Skip to content
Open
Show file tree
Hide file tree
Changes from 49 commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
5f9fbe3
Start on 26.1, fix hitboxes, update blocks, items and tags
Novampr Mar 25, 2026
58c6603
Start on 26.1, fix various hitbox sizes, adjust various java packet a…
Novampr Mar 25, 2026
4d09ef6
Update mappings
Novampr Mar 25, 2026
09c7cdd
Update mappings for block shapes
Novampr Mar 25, 2026
95a2a7b
Update block properties, fix loading block registry
onebeastchris Mar 28, 2026
effb253
Merge remote-tracking branch 'upstream/master' into feat/26.1
onebeastchris Mar 29, 2026
fe1a9f9
Add fallback mapping for golden_dandelion item on 1.21.130 / 26.0
onebeastchris Mar 29, 2026
5dfd49d
Update Java version in README (#6270)
hasankayra04 Mar 29, 2026
3a72865
Initial work for Geyser-Fabric and Geyser-NeoForge on Java 26.1 (#6265)
SleepyPopp Mar 29, 2026
ee5f111
Bump to Java 21 project-wide
onebeastchris Mar 29, 2026
3b0c9c7
Revert fabric.mod.json change
onebeastchris Mar 29, 2026
6706c63
Bump cloud
onebeastchris Mar 29, 2026
f6716f8
Some hasher fixes
eclipseisoffline Mar 29, 2026
7d5d912
Add translation for low disk space warning
onebeastchris Mar 29, 2026
dbc4142
Revert "revert fabric.mod.json change"
onebeastchris Mar 29, 2026
1f5329e
Parse dye data component in ItemStackParser
eclipseisoffline Mar 29, 2026
7ae010d
Bump MCPL, resolves dye color reading
onebeastchris Mar 29, 2026
e46f28c
Merge branch 'master' into feat/26.1
onebeastchris Mar 29, 2026
082ba3a
Bump annotation processors' supported source version too
onebeastchris Mar 30, 2026
df97c0d
Initial work on resolving fabric/neoforge build script issues
onebeastchris Mar 31, 2026
f5c539c
Update Shadow Gradle Plugin and MCProtocolLib (#6284)
SleepyPopp Apr 4, 2026
9ef0cb8
Fix: ageable and some entity metadata.
oryxel1 Apr 5, 2026
722abe6
Update dependencies for Java 26.1.1 (#6286)
SleepyPopp Apr 5, 2026
436a9b8
Small updates to modernize codebase; remove RECIPES registry for hard…
onebeastchris Apr 5, 2026
1d96860
Further java modernization updates
onebeastchris Apr 5, 2026
3e41ca6
Merge remote-tracking branch 'upstream/master' into feat/26.1
onebeastchris Apr 5, 2026
398401f
Remove unused import
onebeastchris Apr 5, 2026
65fe71c
Java time fixes
eclipseisoffline Apr 6, 2026
42488f1
Preparations for using gametest framework
onebeastchris Oct 22, 2025
ccafa76
Initial work on using Minecraft gametests to test component hashing
eclipseisoffline May 2, 2025
248b60f
Set up proper gametest sourceset within Fabric module
eclipseisoffline Aug 30, 2025
61fce61
Implement JavaRegistry(Provider) for game tests, get basic test for c…
eclipseisoffline Oct 24, 2025
ff522d0
Rebase remains
eclipseisoffline Apr 8, 2026
4c163b8
Minecraft 26.1 gametest fixes
eclipseisoffline Apr 8, 2026
0b12ed2
Some codec shenanigans to allow multiple components in a single hash …
eclipseisoffline Apr 8, 2026
b41177d
Custom name component hashing gametests
eclipseisoffline Apr 8, 2026
1827f52
Damage type, enchantments, item model, lore, minimum attack charge, r…
eclipseisoffline Apr 8, 2026
cc7ffe9
Some game test improvements, attribute modifiers, can place/can break…
eclipseisoffline Apr 8, 2026
c8091af
Added gametests for attack range, consumable, damage resistant, death…
eclipseisoffline Apr 8, 2026
8455403
Allow gametests to be optional, turn failing tests optional for now
eclipseisoffline Apr 8, 2026
80eb8bd
Component hashing fixes (see below)
eclipseisoffline Apr 8, 2026
dfb4838
Add hashing gametests for the remaining components (see details)
eclipseisoffline Apr 9, 2026
cb97672
More component hashing fixes (see details)
eclipseisoffline Apr 9, 2026
2385729
Add gametest for testing all hashable components can be hashed in Gey…
eclipseisoffline Apr 9, 2026
07a5757
Some clean ups
eclipseisoffline Apr 9, 2026
b7847c5
DataComponentHashers cleanup
eclipseisoffline Apr 15, 2026
0a22e8e
Adventure 5.0.0
eclipseisoffline Apr 5, 2026
7f8dff2
Properly hash NBT source in NBT text components, refactor hashing of …
eclipseisoffline Apr 6, 2026
5e3089c
Fix EnumMapDispatchHasher instanceof check, ConsumeEffectType hasher,…
eclipseisoffline Apr 15, 2026
f4021dc
Javadoc fixes
eclipseisoffline Apr 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,7 @@ max_line_length = off
ij_java_class_count_to_use_import_on_demand = 9999
ij_java_doc_align_exception_comments = false
ij_java_doc_align_param_comments = false

[*.json]
indent_size = 2
tab_width = 2
4 changes: 2 additions & 2 deletions .github/workflows/build-remote.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:
with:
checkout_repository: ${{ inputs.repository }}
checkout_ref: ${{ inputs.ref }}
setup-java_java-version: 21
setup-java_java-version: 25
setup-gradle_cache-read-only: true
Comment thread
onebeastchris marked this conversation as resolved.
Comment thread
onebeastchris marked this conversation as resolved.

- name: Build Geyser
Expand All @@ -44,4 +44,4 @@ jobs:
bootstrap/spigot/build/libs/Geyser-Spigot.jar
bootstrap/bungeecord/build/libs/Geyser-BungeeCord.jar
bootstrap/velocity/build/libs/Geyser-Velocity.jar
bootstrap/viaproxy/build/libs/Geyser-ViaProxy.jar
bootstrap/viaproxy/build/libs/Geyser-ViaProxy.jar
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ jobs:
- name: Setup Gradle
uses: GeyserMC/actions/setup-gradle-composite@master
with:
setup-java_java-version: 21
setup-java_java-version: 25

Comment thread
onebeastchris marked this conversation as resolved.
Comment thread
onebeastchris marked this conversation as resolved.
- name: Build Geyser
run: ./gradlew build
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ Special thanks to the DragonProxy project for being a trailblazer in protocol tr
| Edition | Supported Versions |
|---------|------------------------------------------------------------------------------------------------------|
| Bedrock | 1.21.130 - 1.21.132, 26.0, 26.1, 26.2, 26.3, 26.10 |
| Java | 1.21.11 (For older versions, [see this guide](https://geysermc.org/wiki/geyser/supported-versions/)) |
| Java | 26.1 (For older versions, [see this guide](https://geysermc.org/wiki/geyser/supported-versions/)) |
Comment thread
onebeastchris marked this conversation as resolved.

## 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 @@ -30,7 +30,7 @@
import javax.lang.model.SourceVersion;

@SupportedAnnotationTypes("*")
@SupportedSourceVersion(SourceVersion.RELEASE_17)
@SupportedSourceVersion(SourceVersion.RELEASE_21)
public class BlockEntityProcessor extends ClassProcessor {
public BlockEntityProcessor() {
super("org.geysermc.geyser.translator.level.block.entity.BlockEntity");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
import javax.lang.model.SourceVersion;

@SupportedAnnotationTypes("*")
@SupportedSourceVersion(SourceVersion.RELEASE_17)
@SupportedSourceVersion(SourceVersion.RELEASE_21)
public class CollisionRemapperProcessor extends ClassProcessor {
public CollisionRemapperProcessor() {
super("org.geysermc.geyser.translator.collision.CollisionRemapper");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
import javax.lang.model.SourceVersion;

@SupportedAnnotationTypes("*")
@SupportedSourceVersion(SourceVersion.RELEASE_17)
@SupportedSourceVersion(SourceVersion.RELEASE_21)
public class PacketTranslatorProcessor extends ClassProcessor {
public PacketTranslatorProcessor() {
super("org.geysermc.geyser.translator.protocol.Translator");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
import javax.lang.model.SourceVersion;

@SupportedAnnotationTypes("*")
@SupportedSourceVersion(SourceVersion.RELEASE_17)
@SupportedSourceVersion(SourceVersion.RELEASE_21)
public class SoundHandlerProcessor extends ClassProcessor {
public SoundHandlerProcessor() {
super("org.geysermc.geyser.translator.sound.SoundTranslator");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,8 @@ private static ListenerInfo getDefaultListener() {
private ServerPing getPingInfo() {
return new ServerPing(
new ServerPing.Protocol(
proxyServer.getName() + " " + ProtocolConstants.SUPPORTED_VERSIONS.get(0) + "-" + ProtocolConstants.SUPPORTED_VERSIONS.get(ProtocolConstants.SUPPORTED_VERSIONS.size() - 1),
ProtocolConstants.SUPPORTED_VERSION_IDS.get(ProtocolConstants.SUPPORTED_VERSION_IDS.size() - 1)),
proxyServer.getName() + " " + ProtocolConstants.SUPPORTED_VERSIONS.getFirst() + "-" + ProtocolConstants.SUPPORTED_VERSIONS.getLast(),
ProtocolConstants.SUPPORTED_VERSION_IDS.getLast()),
new ServerPing.Players(getDefaultListener().getMaxPlayers(), proxyServer.getOnlineCount(), null),
TextComponent.fromLegacyText(getDefaultListener().getMotd())[0],
proxyServer.getConfig().getFaviconObject()
Expand All @@ -115,7 +115,7 @@ public String getName() {

@Override
public int getVersion() {
return ProtocolConstants.SUPPORTED_VERSION_IDS.get(ProtocolConstants.SUPPORTED_VERSION_IDS.size() - 1);
return ProtocolConstants.SUPPORTED_VERSION_IDS.getLast();
}

@Override
Expand Down
6 changes: 1 addition & 5 deletions bootstrap/mod/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,9 @@ architectury {
common("neoforge", "fabric")
}

loom {
mixin.defaultRefmapName.set("geyser-refmap.json")
}

afterEvaluate {
// We don't need these
tasks.named("remapModrinthJar").configure {
tasks.named("mergeShadowAndJarJar").configure {
enabled = false
}
}
Expand Down
49 changes: 37 additions & 12 deletions bootstrap/mod/fabric/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ loom {
}

dependencies {
modImplementation(libs.fabric.loader)
modApi(libs.fabric.api)
implementation(libs.fabric.loader)
api(libs.fabric.api)

api(project(":mod", configuration = "namedElements"))
api(project(":mod"))
shadowBundle(project(path = ":mod", configuration = "transformProductionFabric"))
shadowBundle(projects.core)
includeTransitive(projects.core)
Expand All @@ -47,7 +47,7 @@ dependencies {
shadowBundle(projects.api)
shadowBundle(projects.common)

modImplementation(libs.cloud.fabric)
implementation(libs.cloud.fabric)
include(libs.cloud.fabric)
include(libs.fabric.permissions.api)
}
Expand All @@ -60,23 +60,48 @@ relocate("org.cloudburstmc.netty")
relocate("org.cloudburstmc.protocol")
relocate("org.spongepowered.configurate")

tasks {
remapJar {
archiveBaseName.set("Geyser-Fabric")
fabricApi {
configureTests {
createSourceSet = true
modId = "geyser-gametest"
enableClientGameTests = false
eula = true
}
}

remapModrinthJar {
archiveBaseName.set("geyser-fabric")
tasks {
named<Jar>("mergeShadowAndJarJar") {
from (
zipTree( shadowJar.map { it.outputs.files.singleFile } ).matching {
exclude("fabric.mod.json")
exclude("LICENSE")
},
zipTree( jar.map { it.outputs.files.singleFile } ).matching {
include("META-INF/jars/**")
include("fabric.mod.json")
include("LICENSE")
}
)
archiveBaseName.set("Geyser-Fabric")
}

shadowJar {
mergeServiceFiles()
getByName("processGametestResources", ProcessResources::class) {
filesMatching("fabric.mod.json") {
expand(
"id" to "geyser",
"name" to "Geyser",
"version" to project.version,
"description" to project.description!!,
"url" to "https://geysermc.org",
"author" to "GeyserMC"
)
}
}
}

modrinth {
loaders.add("fabric")
uploadFile.set(tasks.getByPath("remapModrinthJar"))
uploadFile.set(tasks.getByName("renameModrinthJar"))
Copy link

Copilot AI Apr 5, 2026

Choose a reason for hiding this comment

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

uploadFile is being set to a Copy task (renameModrinthJar). The Minotaur plugin typically expects an archive task or a concrete file; a Copy task’s outputs are usually a directory, which can lead to upload failures or uploading the wrong artifact. Prefer pointing uploadFile at the producing Jar task (mergeShadowAndJarJar) and configure that task’s archiveFileName/versioning instead of renaming via Copy.

Suggested change
uploadFile.set(tasks.getByName("renameModrinthJar"))
uploadFile.set(tasks.named<Jar>("mergeShadowAndJarJar"))

Copilot uses AI. Check for mistakes.
dependencies {
required.project("fabric-api")
}
Expand Down
2 changes: 1 addition & 1 deletion bootstrap/mod/fabric/gradle.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
loom.platform=fabric
loom.platform=fabric
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
* 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
*/

package org.geysermc.geyser.gametest;

import com.mojang.serialization.DataResult;
import com.mojang.serialization.DynamicOps;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.MapLike;
import com.mojang.serialization.RecordBuilder;
import net.minecraft.core.Holder;
import net.minecraft.core.registries.Registries;
import net.minecraft.gametest.framework.GameTestEnvironments;
import net.minecraft.gametest.framework.TestData;
import net.minecraft.gametest.framework.TestEnvironmentDefinition;
import net.minecraft.resources.Identifier;
import net.minecraft.resources.RegistryOps;

import java.util.stream.Stream;

public class GameTestUtil {
// Cursed codec to extract a RegistryOps
public static final MapCodec<RegistryOps<?>> REGISTRY_OPS_MAP_CODEC = new MapCodec<>() {
@Override
public <T> Stream<T> keys(DynamicOps<T> ops) {
return Stream.empty();
}

@Override
public <T> DataResult<RegistryOps<?>> decode(DynamicOps<T> ops, MapLike<T> input) {
if (ops instanceof RegistryOps<T> registryOps) {
return DataResult.success(registryOps);
}
return DataResult.error(() -> "Registry ops required for parsing");
}

@Override
public <T> RecordBuilder<T> encode(RegistryOps<?> input, DynamicOps<T> ops, RecordBuilder<T> prefix) {
// noop
return prefix;
}
};

public static TestData<Holder<TestEnvironmentDefinition<?>>> createEmptyTestData(RegistryOps<?> ops, boolean required) {
return new TestData<>(ops.getter(Registries.TEST_ENVIRONMENT)
.flatMap(getter -> getter.get(GameTestEnvironments.DEFAULT_KEY)).orElseThrow(),
Identifier.withDefaultNamespace("empty"), 1, 1, required);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
* 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.gametest;

import net.fabricmc.api.ModInitializer;

public class GeyserGameTestBootstrap implements ModInitializer {

@Override
public void onInitialize() {
GeyserGameTests.bootstrap();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/*
* 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.gametest;

import com.mojang.serialization.MapCodec;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.gametest.framework.GameTestInstance;
import net.minecraft.resources.Identifier;
import org.geysermc.geyser.gametest.tests.ComponentHashTestInstance;
import org.geysermc.geyser.gametest.tests.RequiredComponentsForHashingTestInstance;

public class GeyserGameTests {

private static Identifier createKey(String name) {
return Identifier.fromNamespaceAndPath("geyser", name);
}

private static void register(String name, MapCodec<? extends GameTestInstance> codec) {
Registry.register(BuiltInRegistries.TEST_INSTANCE_TYPE, createKey(name), codec);
}

public static void bootstrap() {
register("component_hash", ComponentHashTestInstance.MAP_CODEC);
register("required_components_for_hashing", RequiredComponentsForHashingTestInstance.MAP_CODEC);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
* 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.gametest;

import org.jspecify.annotations.NullMarked;
Loading
Loading