mirror of
https://github.com/ViaVersion/ViaRewind-Legacy-Support.git
synced 2024-09-30 04:18:04 +02:00
Fix / Compatibility for 1.17 + 1.17.1 (#29)
This commit is contained in:
parent
187e1cbd55
commit
ee7bb54894
2
pom.xml
2
pom.xml
@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>de.gerrygames</groupId>
|
||||
<artifactId>viarewind-legacy-support</artifactId>
|
||||
<version>1.4.0</version>
|
||||
<version>1.4.1</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<properties>
|
||||
|
@ -15,7 +15,7 @@ public class BoundingBoxFixer {
|
||||
|
||||
public static void fixLilyPad() {
|
||||
try {
|
||||
Class<?> blockWaterLilyClass = NMSReflection.getNMSClass("BlockWaterLily");
|
||||
Class<?> blockWaterLilyClass = NMSReflection.getNMSBlock("BlockWaterLily");
|
||||
Field boundingBoxField = ReflectionAPI.getFieldAccessible(blockWaterLilyClass, "a");
|
||||
Object boundingBox = boundingBoxField.get(null);
|
||||
|
||||
@ -27,7 +27,7 @@ public class BoundingBoxFixer {
|
||||
|
||||
public static void fixLadder() {
|
||||
try {
|
||||
Class<?> blockLadderClass = NMSReflection.getNMSClass("BlockLadder");
|
||||
Class<?> blockLadderClass = NMSReflection.getNMSBlock("BlockLadder");
|
||||
|
||||
Field boundingBoxNorthField, boundingBoxSouthField, boundingBoxWestField, boundingBoxEastField;
|
||||
|
||||
@ -42,11 +42,16 @@ public class BoundingBoxFixer {
|
||||
boundingBoxWestField = ReflectionAPI.getFieldAccessible(blockLadderClass, "o");
|
||||
boundingBoxSouthField = ReflectionAPI.getFieldAccessible(blockLadderClass, "p");
|
||||
boundingBoxNorthField = ReflectionAPI.getFieldAccessible(blockLadderClass, "q");
|
||||
} else {
|
||||
} else if (serverProtocol <= 754) {
|
||||
boundingBoxEastField = ReflectionAPI.getFieldAccessible(blockLadderClass, "c");
|
||||
boundingBoxWestField = ReflectionAPI.getFieldAccessible(blockLadderClass, "d");
|
||||
boundingBoxSouthField = ReflectionAPI.getFieldAccessible(blockLadderClass, "e");
|
||||
boundingBoxNorthField = ReflectionAPI.getFieldAccessible(blockLadderClass, "f");
|
||||
} else {
|
||||
boundingBoxEastField = ReflectionAPI.getFieldAccessible(blockLadderClass, "d");
|
||||
boundingBoxWestField = ReflectionAPI.getFieldAccessible(blockLadderClass, "e");
|
||||
boundingBoxSouthField = ReflectionAPI.getFieldAccessible(blockLadderClass, "f");
|
||||
boundingBoxNorthField = ReflectionAPI.getFieldAccessible(blockLadderClass, "g");
|
||||
}
|
||||
|
||||
setBoundingBox(boundingBoxEastField.get(null), 0.0D, 0.0D, 0.0D, 0.125D, 1.0D, 1.0D);
|
||||
|
@ -1,40 +1,128 @@
|
||||
package de.gerrygames.viarewind.legacysupport.injector;
|
||||
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class NMSReflection {
|
||||
private static String version;
|
||||
|
||||
public static String getVersion() {
|
||||
return version == null ? version = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3] : version;
|
||||
}
|
||||
private static int protocolVersion = -1;
|
||||
private static final int PROTOCOL_1_17 = 755;
|
||||
|
||||
public static Class getNMSClass(String name) {
|
||||
try {
|
||||
return Class.forName("net.minecraft.server." + getVersion() + "." + name);
|
||||
} catch (ClassNotFoundException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
private static String version;
|
||||
private static Field playerConnectionField;
|
||||
|
||||
public static Class getCraftBukkitClass(String name) {
|
||||
try {
|
||||
return Class.forName("org.bukkit.craftbukkit." + getVersion() + "." + name);
|
||||
} catch (ClassNotFoundException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public static String getVersion() {
|
||||
return version == null ? version = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3] : version;
|
||||
}
|
||||
|
||||
public static void sendPacket(Player player, Object packet) {
|
||||
try {
|
||||
Object nmsPlayer = player.getClass().getMethod("getHandle").invoke(player);
|
||||
Object playerConnection = nmsPlayer.getClass().getField("playerConnection").get(nmsPlayer);
|
||||
playerConnection.getClass().getMethod("sendPacket", getNMSClass("Packet")).invoke(playerConnection, packet);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
public static int getProtocolVersion() {
|
||||
return protocolVersion == -1 ?
|
||||
protocolVersion = Via.getAPI().getServerVersion().lowestSupportedVersion() :
|
||||
protocolVersion;
|
||||
}
|
||||
|
||||
public static Class<?> getBlockPositionClass() {
|
||||
try {
|
||||
if (getProtocolVersion() >= PROTOCOL_1_17) {
|
||||
return Class.forName("net.minecraft.core.BlockPosition");
|
||||
}
|
||||
return getLegacyNMSClass("BlockPosition");
|
||||
} catch (ClassNotFoundException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static Class<?> getNMSBlock(String name) {
|
||||
try {
|
||||
if (getProtocolVersion() >= PROTOCOL_1_17) {
|
||||
return Class.forName("net.minecraft.world.level.block." + name);
|
||||
}
|
||||
return getLegacyNMSClass(name);
|
||||
} catch (ClassNotFoundException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static Class getSoundCategoryClass() {
|
||||
try {
|
||||
if (getProtocolVersion() >= PROTOCOL_1_17) {
|
||||
return Class.forName("net.minecraft.sounds.SoundCategory");
|
||||
}
|
||||
return getLegacyNMSClass("SoundCategory");
|
||||
} catch (ClassNotFoundException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static Class<?> getPacketClass() {
|
||||
try {
|
||||
if (getProtocolVersion() >= PROTOCOL_1_17) {
|
||||
return Class.forName("net.minecraft.network.protocol.Packet");
|
||||
}
|
||||
return getLegacyNMSClass("Packet");
|
||||
} catch (ClassNotFoundException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static Class<?> getGamePacketClass(String packetType) {
|
||||
try {
|
||||
if (getProtocolVersion() >= PROTOCOL_1_17) {
|
||||
return Class.forName("net.minecraft.network.protocol.game." + packetType);
|
||||
}
|
||||
return getLegacyNMSClass(packetType);
|
||||
} catch (ClassNotFoundException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static Class<?> getPlayerConnectionClass() {
|
||||
try {
|
||||
if (getProtocolVersion() >= PROTOCOL_1_17) {
|
||||
return Class.forName("net.minecraft.server.network.PlayerConnection");
|
||||
}
|
||||
return getLegacyNMSClass("PlayerConnection");
|
||||
} catch (ClassNotFoundException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static Class<?> getLegacyNMSClass(String name) throws ClassNotFoundException {
|
||||
return Class.forName("net.minecraft.server." + getVersion() + "." + name);
|
||||
}
|
||||
|
||||
public static Class<?> getCraftBukkitClass(String name) {
|
||||
try {
|
||||
return Class.forName("org.bukkit.craftbukkit." + getVersion() + "." + name);
|
||||
} catch (ClassNotFoundException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void sendPacket(Player player, Object packet) {
|
||||
try {
|
||||
Object nmsPlayer = player.getClass().getMethod("getHandle").invoke(player);
|
||||
if (playerConnectionField == null) {
|
||||
playerConnectionField = Arrays.stream(nmsPlayer.getClass().getFields())
|
||||
.filter(field -> field.getType() == getPlayerConnectionClass()).findFirst()
|
||||
.orElseThrow(() -> new ReflectiveOperationException("Failed to find PlayerConnection field in EntityPlayer"));
|
||||
}
|
||||
Object playerConnection = playerConnectionField.get(nmsPlayer);
|
||||
playerConnection.getClass().getMethod("sendPacket", getPacketClass()).invoke(playerConnection, packet);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -93,8 +93,11 @@ public class SoundListener implements Listener {
|
||||
try {
|
||||
World world = block.getWorld();
|
||||
Object nmsWorld = world.getClass().getMethod("getHandle").invoke(world);
|
||||
Class blockPositionClass = NMSReflection.getNMSClass("BlockPosition");
|
||||
Object blockPosition = blockPositionClass.getConstructor(int.class, int.class, int.class).newInstance(block.getX(), block.getY(), block.getZ());
|
||||
Class<?> blockPositionClass = NMSReflection.getBlockPositionClass();
|
||||
Object blockPosition = null;
|
||||
if (blockPositionClass != null) {
|
||||
blockPosition = blockPositionClass.getConstructor(int.class, int.class, int.class).newInstance(block.getX(), block.getY(), block.getZ());
|
||||
}
|
||||
Object blockData = nmsWorld.getClass().getSuperclass().getMethod("getType", blockPositionClass).invoke(nmsWorld, blockPosition);
|
||||
Method getBlock = blockData.getClass().getMethod("getBlock");
|
||||
getBlock.setAccessible(true);
|
||||
@ -134,7 +137,7 @@ public class SoundListener implements Listener {
|
||||
Object soundEffect = soundEffectMethod.invoke(soundType);
|
||||
float volume = (float) volumeMethod.invoke(soundType);
|
||||
float pitch = (float) pitchMethod.invoke(soundType);
|
||||
Object soundCategory = Enum.valueOf(NMSReflection.getNMSClass("SoundCategory"), "BLOCKS");
|
||||
Object soundCategory = Enum.valueOf(NMSReflection.getSoundCategoryClass(), "BLOCKS");
|
||||
|
||||
volume = (volume + 1.0f) / 2.0f;
|
||||
pitch *= 0.8;
|
||||
@ -147,7 +150,7 @@ public class SoundListener implements Listener {
|
||||
|
||||
private static void playSound(Player player, Object soundEffect, Object soundCategory, double x, double y, double z, float volume, float pitch) {
|
||||
try {
|
||||
Object packet = NMSReflection.getNMSClass("PacketPlayOutNamedSoundEffect").getConstructor(
|
||||
Object packet = NMSReflection.getGamePacketClass("PacketPlayOutNamedSoundEffect").getConstructor(
|
||||
soundEffect.getClass(), soundCategory.getClass(),
|
||||
double.class, double.class, double.class,
|
||||
float.class, float.class
|
||||
|
Loading…
Reference in New Issue
Block a user