-
-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
18 changed files
with
361 additions
and
23 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
xmlns="http://maven.apache.org/POM/4.0.0" | ||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||
<modelVersion>4.0.0</modelVersion> | ||
<parent> | ||
<groupId>dev.cerus.maps</groupId> | ||
<artifactId>parent</artifactId> | ||
<version>3.8.4</version> | ||
</parent> | ||
|
||
<artifactId>bukkit-20_R4</artifactId> | ||
|
||
<properties> | ||
<maven.compiler.source>21</maven.compiler.source> | ||
<maven.compiler.target>21</maven.compiler.target> | ||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||
</properties> | ||
|
||
<dependencies> | ||
<dependency> | ||
<groupId>dev.cerus.maps</groupId> | ||
<artifactId>common</artifactId> | ||
<version>${parent.version}</version> | ||
<scope>provided</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.bukkit</groupId> | ||
<artifactId>craftbukkit</artifactId> | ||
<version>1.20.5-R0.1-SNAPSHOT</version> | ||
<scope>provided</scope> | ||
</dependency> | ||
</dependencies> | ||
|
||
</project> |
110 changes: 110 additions & 0 deletions
110
bukkit-20_R4/src/main/java/dev/cerus/maps/version/PacketHandler20R4.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,110 @@ | ||
package dev.cerus.maps.version; | ||
|
||
import dev.cerus.maps.api.version.PacketListener; | ||
import io.netty.channel.ChannelDuplexHandler; | ||
import io.netty.channel.ChannelHandlerContext; | ||
import java.lang.reflect.Field; | ||
import java.util.Arrays; | ||
import net.minecraft.network.protocol.game.ClientboundBlockChangedAckPacket; | ||
import net.minecraft.network.protocol.game.PacketPlayInBlockDig; | ||
import net.minecraft.network.protocol.game.PacketPlayInBlockPlace; | ||
import net.minecraft.network.protocol.game.PacketPlayInUseEntity; | ||
import net.minecraft.network.protocol.game.PacketPlayInUseItem; | ||
import net.minecraft.world.EnumHand; | ||
import net.minecraft.world.phys.MovingObjectPositionBlock; | ||
import org.bukkit.Bukkit; | ||
import org.bukkit.Location; | ||
import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlock; | ||
import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; | ||
import org.bukkit.entity.Player; | ||
import org.bukkit.plugin.java.JavaPlugin; | ||
|
||
public class PacketHandler20R4 extends ChannelDuplexHandler { | ||
|
||
private static final Field actionField; | ||
private static final Object attackAction; | ||
|
||
static { | ||
try { | ||
actionField = PacketPlayInUseEntity.class.getDeclaredField("c"); | ||
actionField.setAccessible(true); | ||
final Field attackActionField = PacketPlayInUseEntity.class.getDeclaredField("e"); | ||
attackActionField.setAccessible(true); | ||
attackAction = attackActionField.get(null); | ||
} catch (final NoSuchFieldException | IllegalAccessException e) { | ||
throw new RuntimeException(e); | ||
} | ||
} | ||
|
||
private final Player player; | ||
private final PacketListener listener; | ||
private final JavaPlugin plugin; | ||
|
||
public PacketHandler20R4(final Player player, final PacketListener listener, final JavaPlugin plugin) { | ||
this.player = player; | ||
this.listener = listener; | ||
this.plugin = plugin; | ||
} | ||
|
||
private static Object getAction(final PacketPlayInUseEntity packet) { | ||
try { | ||
return actionField.get(packet); | ||
} catch (final IllegalAccessException e) { | ||
throw new RuntimeException(e); | ||
} | ||
} | ||
|
||
private static EnumHand getHand(final PacketPlayInUseEntity packet) { | ||
try { | ||
final Object action = getAction(packet); | ||
final Field handField = Arrays.stream(action.getClass().getDeclaredFields()) | ||
.filter(field -> field.getType() == EnumHand.class) | ||
.findAny().orElse(null); | ||
if (handField == null) { | ||
return null; | ||
} | ||
handField.setAccessible(true); | ||
return (EnumHand) handField.get(action); | ||
} catch (final IllegalAccessException e) { | ||
throw new RuntimeException(e); | ||
} | ||
} | ||
|
||
@Override | ||
public void channelRead(final ChannelHandlerContext ctx, final Object msg) throws Exception { | ||
if ((((msg instanceof final PacketPlayInUseItem useItem && useItem.b() != EnumHand.b) || msg instanceof PacketPlayInBlockPlace) && this.listener.handlePlayerRightClick(this.player)) | ||
|| (msg instanceof final PacketPlayInUseEntity useEntity && getHand(useEntity) != EnumHand.b && (getAction(useEntity) == attackAction ? this.listener.handlePlayerLeftClick(this.player) : this.listener.handlePlayerRightClick(this.player))) | ||
|| (msg instanceof PacketPlayInBlockDig && this.listener.handlePlayerLeftClick(this.player))) { | ||
if (msg instanceof final PacketPlayInBlockDig dig) { | ||
// To prevent de-syncs we need to tell the client that the block has not changed | ||
final Location location = new Location( | ||
this.player.getWorld(), | ||
dig.b().u(), | ||
dig.b().v(), | ||
dig.b().w() | ||
); | ||
// If we don't acknowledge the client's block change it won't accept further block change packets | ||
((CraftPlayer) this.player).getHandle().c.a(new ClientboundBlockChangedAckPacket(dig.g())); | ||
Bukkit.getScheduler().runTask(this.plugin, () -> this.player.sendBlockChange(location, location.getBlock().getBlockData())); | ||
} | ||
if (msg instanceof final PacketPlayInUseItem useItem) { | ||
// To prevent de-syncs we need to tell the client that the block has not changed | ||
final MovingObjectPositionBlock pos = useItem.e(); | ||
if (pos != null && pos.a() != null) { | ||
final Location location = new Location( | ||
this.player.getWorld(), | ||
pos.a().u(), | ||
pos.a().v(), | ||
pos.a().w() | ||
).getBlock().getRelative(CraftBlock.notchToBlockFace(pos.b())).getLocation(); | ||
// If we don't acknowledge the client's block change it won't accept further block change packets | ||
((CraftPlayer) this.player).getHandle().c.a(new ClientboundBlockChangedAckPacket(useItem.f())); | ||
Bukkit.getScheduler().runTask(this.plugin, () -> this.player.sendBlockChange(location, location.getBlock().getBlockData())); | ||
} | ||
} | ||
return; | ||
} | ||
super.channelRead(ctx, msg); | ||
} | ||
|
||
} |
Oops, something went wrong.