-
Notifications
You must be signed in to change notification settings - Fork 3
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
14 changed files
with
259 additions
and
20 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
<?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.visualcrafting</groupId> | ||
<artifactId>parent</artifactId> | ||
<version>1.0.8</version> | ||
</parent> | ||
|
||
<artifactId>bukkit-19R3</artifactId> | ||
|
||
<properties> | ||
<maven.compiler.source>17</maven.compiler.source> | ||
<maven.compiler.target>17</maven.compiler.target> | ||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||
</properties> | ||
|
||
<dependencies> | ||
<dependency> | ||
<groupId>dev.cerus.visualcrafting</groupId> | ||
<artifactId>api</artifactId> | ||
<version>${project.parent.version}</version> | ||
<scope>provided</scope> | ||
</dependency> | ||
|
||
<dependency> | ||
<groupId>org.bukkit</groupId> | ||
<artifactId>craftbukkit</artifactId> | ||
<version>1.19.4-R0.1-SNAPSHOT</version> | ||
<scope>provided</scope> | ||
</dependency> | ||
</dependencies> | ||
|
||
</project> |
186 changes: 186 additions & 0 deletions
186
bukkit-19R3/src/main/java/dev/cerus/visualcrafting/v19r3/VersionAdapter19R3.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,186 @@ | ||
package dev.cerus.visualcrafting.v19r3; | ||
|
||
import dev.cerus.visualcrafting.api.config.Config; | ||
import dev.cerus.visualcrafting.api.version.FakeMap; | ||
import dev.cerus.visualcrafting.api.version.VersionAdapter; | ||
import io.netty.channel.ChannelDuplexHandler; | ||
import io.netty.channel.ChannelHandlerContext; | ||
import java.lang.reflect.Field; | ||
import java.util.Arrays; | ||
import java.util.Collections; | ||
import java.util.UUID; | ||
import java.util.function.BiConsumer; | ||
import net.minecraft.network.NetworkManager; | ||
import net.minecraft.network.protocol.Packet; | ||
import net.minecraft.network.protocol.game.PacketPlayInUseEntity; | ||
import net.minecraft.network.protocol.game.PacketPlayOutEntityDestroy; | ||
import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata; | ||
import net.minecraft.network.protocol.game.PacketPlayOutMap; | ||
import net.minecraft.network.protocol.game.PacketPlayOutSpawnEntity; | ||
import net.minecraft.network.syncher.DataWatcher; | ||
import net.minecraft.network.syncher.DataWatcherRegistry; | ||
import net.minecraft.server.network.PlayerConnection; | ||
import net.minecraft.world.entity.EntityTypes; | ||
import net.minecraft.world.level.saveddata.maps.WorldMap; | ||
import net.minecraft.world.phys.Vec3D; | ||
import org.bukkit.Bukkit; | ||
import org.bukkit.Location; | ||
import org.bukkit.Rotation; | ||
import org.bukkit.block.BlockFace; | ||
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer; | ||
import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack; | ||
import org.bukkit.entity.Player; | ||
import org.bukkit.inventory.ItemStack; | ||
|
||
public class VersionAdapter19R3 extends VersionAdapter { | ||
|
||
private Config config; | ||
private BiConsumer<Player, Integer> entityClickCallback; | ||
private int nextEntityId; | ||
private int nextMapId; | ||
private Field netManField; | ||
|
||
private NetworkManager getNetworkManager(final PlayerConnection b) { | ||
try { | ||
if (this.netManField == null) { | ||
this.netManField = PlayerConnection.class.getDeclaredField("h"); | ||
this.netManField.setAccessible(true); | ||
} | ||
return (NetworkManager) this.netManField.get(b); | ||
} catch (final NoSuchFieldException | IllegalAccessException e) { | ||
throw new RuntimeException(e); | ||
} | ||
} | ||
|
||
@Override | ||
public void init(final Config config, final BiConsumer<Player, Integer> entityClickCallback) { | ||
this.config = config; | ||
this.entityClickCallback = entityClickCallback; | ||
this.nextEntityId = config.entityIdRangeMin(); | ||
this.nextMapId = config.mapIdRangeMin(); | ||
} | ||
|
||
@Override | ||
public void inject(final Player player) { | ||
if (this.config.enablePacketListening()) { | ||
final NetworkManager netMan = this.getNetworkManager(((CraftPlayer) player).getHandle().b); | ||
netMan.m.pipeline() | ||
.addBefore("packet_handler", "visual_crafting", new ChannelDuplexHandler() { | ||
@Override | ||
public void channelRead(final ChannelHandlerContext ctx, final Object msg) throws Exception { | ||
if (msg instanceof PacketPlayInUseEntity useEntity) { | ||
VersionAdapter19R3.this.handlePacketIn(player, useEntity); | ||
} | ||
super.channelRead(ctx, msg); | ||
} | ||
}); | ||
} | ||
} | ||
|
||
private void handlePacketIn(final Player player, final PacketPlayInUseEntity packet) { | ||
try { | ||
final Field a = packet.getClass().getDeclaredField("a"); | ||
a.setAccessible(true); | ||
this.entityClickCallback.accept(player, (Integer) a.get(packet)); | ||
} catch (final NoSuchFieldException | IllegalAccessException e) { | ||
e.printStackTrace(); | ||
} | ||
} | ||
|
||
@Override | ||
public int spawnItemFrame(final Location location, final BlockFace direction) { | ||
final int eid = this.getNewEntityId(); | ||
final PacketPlayOutSpawnEntity packet = new PacketPlayOutSpawnEntity( | ||
eid, | ||
UUID.randomUUID(), | ||
location.getBlockX(), | ||
location.getBlockY(), | ||
location.getBlockZ(), | ||
direction == BlockFace.DOWN ? 90 : direction == BlockFace.UP ? -90 : 0, | ||
switch (direction) { | ||
case NORTH -> -180; | ||
case EAST -> -90; | ||
case WEST -> 90; | ||
default -> 0; | ||
}, | ||
EntityTypes.af, | ||
switch (direction) { | ||
case UP -> 1; | ||
case NORTH -> 2; | ||
case SOUTH -> 3; | ||
case WEST -> 4; | ||
case EAST -> 5; | ||
default -> 0; | ||
}, | ||
new Vec3D(0, 0, 0), | ||
switch (direction) { | ||
case NORTH -> -180; | ||
case EAST -> -90; | ||
case WEST -> 90; | ||
default -> 0; | ||
} | ||
); | ||
Bukkit.getOnlinePlayers().forEach(player -> this.sendPacket(player, packet)); | ||
return eid; | ||
} | ||
|
||
@Override | ||
public void updateItemFrame(final int frameId, final ItemStack itemStack, final Rotation rotation, final boolean invisible) { | ||
final PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(frameId, Arrays.asList( | ||
new DataWatcher.b<>(8, DataWatcherRegistry.h, CraftItemStack.asNMSCopy(itemStack)), | ||
new DataWatcher.b<>(9, DataWatcherRegistry.b, rotation.ordinal()), | ||
new DataWatcher.b<>(0, DataWatcherRegistry.a, (byte) (invisible ? 0x20 : 0)) | ||
)); | ||
Bukkit.getOnlinePlayers().forEach(player -> this.sendPacket(player, packet)); | ||
} | ||
|
||
@Override | ||
public void destroyEntity(final int entityId) { | ||
final PacketPlayOutEntityDestroy packet = new PacketPlayOutEntityDestroy(entityId); | ||
Bukkit.getOnlinePlayers().forEach(player -> this.sendPacket(player, packet)); | ||
} | ||
|
||
@Override | ||
public FakeMap createMap() { | ||
return this.createMap(this.getNewMapId()); | ||
} | ||
|
||
@Override | ||
public void sendMap(final FakeMap map) { | ||
final PacketPlayOutMap packet = new PacketPlayOutMap( | ||
map.getId(), | ||
(byte) 0, | ||
true, | ||
Collections.emptyList(), | ||
new WorldMap.b(0, | ||
0, | ||
128, | ||
128, | ||
this.getMapData(map)) | ||
); | ||
Bukkit.getOnlinePlayers().forEach(player -> this.sendPacket(player, packet)); | ||
} | ||
|
||
private void sendPacket(final Player player, final Packet<?> packet) { | ||
((CraftPlayer) player).getHandle().b.a(packet); | ||
} | ||
|
||
private int getNewEntityId() { | ||
if (this.nextEntityId >= this.config.entityIdRangeMax()) { | ||
this.nextEntityId = this.config.entityIdRangeMin(); | ||
return this.nextEntityId; | ||
} else { | ||
return this.nextEntityId++; | ||
} | ||
} | ||
|
||
private int getNewMapId() { | ||
if (this.nextMapId >= this.config.mapIdRangeMax()) { | ||
this.nextMapId = this.config.mapIdRangeMin(); | ||
return this.nextMapId; | ||
} else { | ||
return this.nextMapId++; | ||
} | ||
} | ||
|
||
} |
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
Oops, something went wrong.