Skip to content

Commit 92b5051

Browse files
authored
Merge branch 'master' into feature/viaproxy-platform
2 parents 0040b6a + 509e00c commit 92b5051

File tree

9 files changed

+69
-10
lines changed

9 files changed

+69
-10
lines changed

bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotInjector.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ private ChannelInitializer<Channel> getChildHandler(GeyserBootstrap bootstrap, C
150150
childHandler = (ChannelInitializer<Channel>) childHandlerField.get(handler);
151151
// ViaVersion non-Paper-injector workaround so we aren't double-injecting
152152
if (isViaVersion && childHandler instanceof BukkitChannelInitializer) {
153-
childHandler = ((BukkitChannelInitializer) childHandler).getOriginal();
153+
childHandler = ((BukkitChannelInitializer) childHandler).original();
154154
}
155155
break;
156156
} catch (Exception e) {

bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,17 @@ public void onLoad() {
135135
}
136136
}
137137

138+
try {
139+
Class.forName("io.netty.util.internal.ObjectPool$ObjectCreator");
140+
} catch (ClassNotFoundException e) {
141+
getLogger().severe("*********************************************");
142+
getLogger().severe("");
143+
getLogger().severe("This version of Spigot is using an outdated version of netty. Please use Paper instead!");
144+
getLogger().severe("");
145+
getLogger().severe("*********************************************");
146+
return;
147+
}
148+
138149
// This is manually done instead of using Bukkit methods to save the config because otherwise comments get removed
139150
try {
140151
if (!getDataFolder().exists()) {

bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotWorldManager.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,11 @@ public GameMode getDefaultGameMode(GeyserSession session) {
197197

198198
@Override
199199
public boolean hasPermission(GeyserSession session, String permission) {
200-
return Objects.requireNonNull(Bukkit.getPlayer(session.getPlayerEntity().getUsername())).hasPermission(permission);
200+
Player player = Bukkit.getPlayer(session.javaUuid());
201+
if (player != null) {
202+
return player.hasPermission(permission);
203+
}
204+
return false;
201205
}
202206

203207
@Override

bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityCompressionDisabler.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,14 @@ public class GeyserVelocityCompressionDisabler extends ChannelDuplexHandler {
4747
Method setCompressionMethod = null;
4848

4949
try {
50-
compressionPacketClass = Class.forName("com.velocitypowered.proxy.protocol.packet.SetCompression");
51-
loginSuccessPacketClass = Class.forName("com.velocitypowered.proxy.protocol.packet.ServerLoginSuccess");
50+
try {
51+
compressionPacketClass = Class.forName("com.velocitypowered.proxy.protocol.packet.SetCompressionPacket");
52+
loginSuccessPacketClass = Class.forName("com.velocitypowered.proxy.protocol.packet.ServerLoginSuccessPacket");
53+
} catch (Exception ignored) {
54+
// Velocity renamed packet classes in https://github.com/PaperMC/Velocity/commit/2ac8751337befd04f4663575f5d752c748384110
55+
compressionPacketClass = Class.forName("com.velocitypowered.proxy.protocol.packet.SetCompression");
56+
loginSuccessPacketClass = Class.forName("com.velocitypowered.proxy.protocol.packet.ServerLoginSuccess");
57+
}
5258
compressionEnabledEvent = Class.forName("com.velocitypowered.proxy.protocol.VelocityConnectionEvent")
5359
.getDeclaredField("COMPRESSION_ENABLED").get(null);
5460
setCompressionMethod = Class.forName("com.velocitypowered.proxy.connection.MinecraftConnection")

core/src/main/java/org/geysermc/geyser/level/block/BlockStateValues.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public final class BlockStateValues {
6767
private static final Int2IntMap SKULL_WALL_DIRECTIONS = new Int2IntOpenHashMap();
6868
private static final Int2ByteMap SHULKERBOX_DIRECTIONS = new FixedInt2ByteMap();
6969
private static final Int2IntMap WATER_LEVEL = new Int2IntOpenHashMap();
70+
private static final IntSet UPPER_DOORS = new IntOpenHashSet();
7071

7172
public static final int JAVA_AIR_ID = 0;
7273

@@ -219,6 +220,10 @@ public static void storeBlockStateValues(String javaId, int javaBlockState, Json
219220
if (javaId.contains("_cauldron") && !javaId.contains("water_")) {
220221
NON_WATER_CAULDRONS.add(javaBlockState);
221222
}
223+
224+
if (javaId.contains("_door[") && javaId.contains("half=upper")) {
225+
UPPER_DOORS.add(javaBlockState);
226+
}
222227
}
223228

224229
/**
@@ -498,6 +503,16 @@ public static int getWaterLevel(int state) {
498503
return WATER_LEVEL.getOrDefault(state, -1);
499504
}
500505

506+
/**
507+
* Check if a block is the upper half of a door.
508+
*
509+
* @param state BlockState of the block
510+
* @return True if the block is the upper half of a door
511+
*/
512+
public static boolean isUpperDoor(int state) {
513+
return UPPER_DOORS.contains(state);
514+
}
515+
501516
/**
502517
* Get the height of water from the block state
503518
* This is used in FishingHookEntity to create splash sounds when the hook hits the water. In addition,

core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import io.netty.buffer.Unpooled;
2929
import org.cloudburstmc.protocol.bedrock.BedrockDisconnectReasons;
3030
import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec;
31+
import org.cloudburstmc.protocol.bedrock.codec.compat.BedrockCompat;
32+
import org.cloudburstmc.protocol.bedrock.codec.v622.Bedrock_v622;
3133
import org.cloudburstmc.protocol.bedrock.data.ExperimentData;
3234
import org.cloudburstmc.protocol.bedrock.data.PacketCompressionAlgorithm;
3335
import org.cloudburstmc.protocol.bedrock.data.ResourcePackType;
@@ -108,6 +110,10 @@ private boolean setCorrectCodec(int protocolVersion) {
108110
session.disconnect(disconnectMessage);
109111
return false;
110112
} else if (protocolVersion < GameProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) {
113+
if (protocolVersion < Bedrock_v622.CODEC.getProtocolVersion()) {
114+
// https://github.com/GeyserMC/Geyser/issues/4378
115+
session.getUpstream().getSession().setCodec(BedrockCompat.CODEC_LEGACY);
116+
}
111117
session.disconnect(GeyserLocale.getLocaleStringLog("geyser.network.outdated.client", supportedVersions));
112118
return false;
113119
} else {

core/src/main/java/org/geysermc/geyser/session/GeyserSession.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1633,6 +1633,15 @@ public void sendDownstreamLoginPacket(Packet packet) {
16331633
* @param intendedState the state the client should be in
16341634
*/
16351635
public void sendDownstreamPacket(Packet packet, ProtocolState intendedState) {
1636+
// protocol can be null when we're not yet logged in (online auth)
1637+
if (protocol == null) {
1638+
if (geyser.getConfig().isDebugMode()) {
1639+
geyser.getLogger().debug("Tried to send downstream packet with no downstream session!");
1640+
Thread.dumpStack();
1641+
}
1642+
return;
1643+
}
1644+
16361645
if (protocol.getState() != intendedState) {
16371646
geyser.getLogger().debug("Tried to send " + packet.getClass().getSimpleName() + " packet while not in " + intendedState.name() + " state");
16381647
return;

core/src/main/java/org/geysermc/geyser/util/ChunkUtils.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,14 @@ public static void updateBlockClientSide(GeyserSession session, int blockState,
215215
break; //No block will be a part of two classes
216216
}
217217
}
218+
219+
if (BlockStateValues.isUpperDoor(blockState)) {
220+
// Update the lower door block as Bedrock client doesn't like door to be closed from the top
221+
// See https://github.com/GeyserMC/Geyser/issues/4358
222+
Vector3i belowDoorPosition = position.sub(0, 1, 0);
223+
int belowDoorBlockState = session.getGeyser().getWorldManager().getBlockAt(session, belowDoorPosition.getX(), belowDoorPosition.getY(), belowDoorPosition.getZ());
224+
updateBlock(session, belowDoorBlockState, belowDoorPosition);
225+
}
218226
}
219227

220228
public static void sendEmptyChunk(GeyserSession session, int chunkX, int chunkZ, boolean forceUpdate) {

gradle/libs.versions.toml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@ erosion = "1.0-20230406.174837-8"
55
events = "1.1-SNAPSHOT"
66
jackson = { strictly = "2.14.0" } # Don't let other dependencies override
77
fastutil = "8.5.2"
8-
netty = "4.1.80.Final"
8+
netty = "4.1.103.Final"
99
guava = "29.0-jre"
1010
gson = "2.3.1" # Provided by Spigot 1.8.8
1111
websocket = "1.5.1"
12-
protocol = "3.0.0.Beta1-20231107.190703-113"
13-
protocol-connection = "3.0.0.Beta1-20231107.190703-112"
14-
raknet = "1.0.0.CR1-20230703.195238-9"
12+
protocol = "3.0.0.Beta1-20231206.150507-114"
13+
protocol-connection = "3.0.0.Beta1-20231206.150507-113"
14+
raknet = "1.0.0.CR1-20231206.145325-12"
1515
blockstateupdater="1.20.50-20231106.161340-1"
1616
mcauthlib = "d9d773e"
17-
mcprotocollib = "1.20.4-1-20231214.212857-1"
17+
mcprotocollib = "1.20.4-2-20240116.220521-7"
1818
adventure = "4.14.0"
1919
adventure-platform = "4.3.0"
2020
junit = "5.9.2"
@@ -23,7 +23,7 @@ log4j = "2.20.0"
2323
jline = "3.21.0"
2424
terminalconsoleappender = "1.2.0"
2525
folia = "1.19.4-R0.1-SNAPSHOT"
26-
viaversion = "4.0.0"
26+
viaversion = "4.9.2"
2727
adapters = "1.11-SNAPSHOT"
2828
commodore = "2.2"
2929
bungeecord = "a7c6ede"

0 commit comments

Comments
 (0)