diff --git a/phantom-classes/build.gradle b/phantom-classes/build.gradle new file mode 100644 index 0000000..4e7c334 --- /dev/null +++ b/phantom-classes/build.gradle @@ -0,0 +1,3 @@ +dependencies { + compileOnly libs.bukkit +} \ No newline at end of file diff --git a/phantom-classes/gradle.properties b/phantom-classes/gradle.properties new file mode 100644 index 0000000..0461b43 --- /dev/null +++ b/phantom-classes/gradle.properties @@ -0,0 +1,2 @@ +moduleName=phantom-classes +moduleVersion=1.0-SNAPSHOT \ No newline at end of file diff --git a/phantom-classes/src/main/java/com/mojang/authlib/GameProfile.java b/phantom-classes/src/main/java/com/mojang/authlib/GameProfile.java new file mode 100644 index 0000000..ec0f667 --- /dev/null +++ b/phantom-classes/src/main/java/com/mojang/authlib/GameProfile.java @@ -0,0 +1,16 @@ +package com.mojang.authlib; + +import com.mojang.authlib.properties.PropertyMap; + +import java.util.UUID; + +public class GameProfile { + + public GameProfile(UUID id, String name) { + + } + + public PropertyMap getProperties() { + return null; + } +} diff --git a/phantom-classes/src/main/java/com/mojang/authlib/properties/Property.java b/phantom-classes/src/main/java/com/mojang/authlib/properties/Property.java new file mode 100644 index 0000000..31ca57c --- /dev/null +++ b/phantom-classes/src/main/java/com/mojang/authlib/properties/Property.java @@ -0,0 +1,8 @@ +package com.mojang.authlib.properties; + +public class Property { + + public Property(String value, String name) { + + } +} diff --git a/phantom-classes/src/main/java/com/mojang/authlib/properties/PropertyMap.java b/phantom-classes/src/main/java/com/mojang/authlib/properties/PropertyMap.java new file mode 100644 index 0000000..fa3d519 --- /dev/null +++ b/phantom-classes/src/main/java/com/mojang/authlib/properties/PropertyMap.java @@ -0,0 +1,12 @@ +package com.mojang.authlib.properties; + +import com.google.common.collect.ForwardingMultimap; +import com.google.common.collect.Multimap; + +public class PropertyMap extends ForwardingMultimap { + + @Override + protected Multimap delegate() { + return null; + } +} diff --git a/phantom-classes/src/main/java/net/minecraft/server/v1_12_R1/BlockPosition.java b/phantom-classes/src/main/java/net/minecraft/server/v1_12_R1/BlockPosition.java new file mode 100644 index 0000000..af9225b --- /dev/null +++ b/phantom-classes/src/main/java/net/minecraft/server/v1_12_R1/BlockPosition.java @@ -0,0 +1,7 @@ +package net.minecraft.server.v1_12_R1; + +public class BlockPosition { + + public BlockPosition(double x, double y, double z) { + } +} diff --git a/phantom-classes/src/main/java/net/minecraft/server/v1_12_R1/TileEntity.java b/phantom-classes/src/main/java/net/minecraft/server/v1_12_R1/TileEntity.java new file mode 100644 index 0000000..af37696 --- /dev/null +++ b/phantom-classes/src/main/java/net/minecraft/server/v1_12_R1/TileEntity.java @@ -0,0 +1,5 @@ +package net.minecraft.server.v1_12_R1; + +public class TileEntity { + +} diff --git a/phantom-classes/src/main/java/net/minecraft/server/v1_12_R1/TileEntitySkull.java b/phantom-classes/src/main/java/net/minecraft/server/v1_12_R1/TileEntitySkull.java new file mode 100644 index 0000000..231b1ad --- /dev/null +++ b/phantom-classes/src/main/java/net/minecraft/server/v1_12_R1/TileEntitySkull.java @@ -0,0 +1,10 @@ +package net.minecraft.server.v1_12_R1; + +import com.mojang.authlib.GameProfile; + +public class TileEntitySkull extends TileEntity { + + public void setGameProfile(GameProfile gameprofile) { + + } +} diff --git a/phantom-classes/src/main/java/net/minecraft/server/v1_12_R1/WorldServer.java b/phantom-classes/src/main/java/net/minecraft/server/v1_12_R1/WorldServer.java new file mode 100644 index 0000000..120881c --- /dev/null +++ b/phantom-classes/src/main/java/net/minecraft/server/v1_12_R1/WorldServer.java @@ -0,0 +1,8 @@ +package net.minecraft.server.v1_12_R1; + +public class WorldServer { + + public TileEntity getTileEntity(BlockPosition pos) { + return null; + } +} diff --git a/phantom-classes/src/main/java/org/bukkit/craftbukkit/v1_12_R1/CraftWorld.java b/phantom-classes/src/main/java/org/bukkit/craftbukkit/v1_12_R1/CraftWorld.java new file mode 100644 index 0000000..73cf2c7 --- /dev/null +++ b/phantom-classes/src/main/java/org/bukkit/craftbukkit/v1_12_R1/CraftWorld.java @@ -0,0 +1,10 @@ +package org.bukkit.craftbukkit.v1_12_R1; + +import net.minecraft.server.v1_12_R1.WorldServer; + +public class CraftWorld { + + public WorldServer getHandle() { + return null; + } +} diff --git a/settings.gradle b/settings.gradle index dcdebbd..50ae36a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,2 @@ +include 'phantom-classes' include 'tools' - diff --git a/tools/build.gradle b/tools/build.gradle index c89368b..a9416c6 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -4,6 +4,7 @@ repositories { } dependencies { + compileOnly project(':phantom-classes') compileOnly libs.bukkit implementation libs.commons_text implementation libs.refobj diff --git a/tools/src/main/java/ghast/BuildHelper.java b/tools/src/main/java/ghast/BuildHelper.java index 70d97f4..3bd5975 100644 --- a/tools/src/main/java/ghast/BuildHelper.java +++ b/tools/src/main/java/ghast/BuildHelper.java @@ -1,6 +1,10 @@ package ghast; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.Property; import lombok.experimental.UtilityClass; +import net.minecraft.server.v1_12_R1.BlockPosition; +import net.minecraft.server.v1_12_R1.TileEntitySkull; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.SkullType; @@ -8,8 +12,7 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.Sign; import org.bukkit.block.Skull; -import ru.dmitriymx.reflection.ReflectionClass; -import ru.dmitriymx.reflection.ReflectionObject; +import org.bukkit.craftbukkit.v1_12_R1.CraftWorld; import java.nio.charset.StandardCharsets; import java.util.Base64; @@ -19,9 +22,6 @@ import java.util.UUID; @SuppressWarnings("unused") public class BuildHelper { - private final Class CLASS_BLOCKPOSITION = getClassForName("net.minecraft.server.v1_12_R1.BlockPosition"); - private final Class CLASS_GAMEPROFILE = getClassForName("com.mojang.authlib.GameProfile"); - /** * Установка черепа. *

@@ -95,17 +95,10 @@ public class BuildHelper { * @param skinUrl URL на текстуру */ public static void setPlayerHeadSkin(Skull skull, String skinUrl) { - //TODO заменить рефлексию на "фантомные" классы - ReflectionObject refobjBlockPosition = new ReflectionClass(CLASS_BLOCKPOSITION) - .constructor(double.class, double.class, double.class) - .newInstance(skull.getX(), skull.getY(), skull.getZ()); - - new ReflectionObject(skull.getWorld()) - .method("getHandle").invoke() - .method("getTileEntity", CLASS_BLOCKPOSITION) - .invoke(refobjBlockPosition.getOriginalObject()) - .method("setGameProfile", CLASS_GAMEPROFILE) - .invoke(getRefObjPlayerProfile(skinUrl).getOriginalObject()); + ((TileEntitySkull) (((CraftWorld) skull.getWorld()) + .getHandle() + .getTileEntity(new BlockPosition(skull.getX(), skull.getY(), skull.getZ())))) + .setGameProfile(generateTexturedPlayerProfile(skinUrl)); } public Sign placeSignWall(Location location, BlockFace face) { @@ -119,29 +112,12 @@ public class BuildHelper { return sign; } - private ReflectionObject getRefObjPlayerProfile(String url){ - ReflectionObject refobjProperty = new ReflectionClass( - getClassForName("com.mojang.authlib.properties.Property")) - .constructor(String.class, String.class) - .newInstance("textures", Base64.getEncoder() - .encodeToString(("{textures:{SKIN:{url:\"" + url + "\"}}}").getBytes(StandardCharsets.UTF_8))); + private GameProfile generateTexturedPlayerProfile(String skinUrl) { + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), null); - ReflectionObject refobjGameProfile = new ReflectionClass(CLASS_GAMEPROFILE) - .constructor(UUID.class, String.class) - .newInstance(UUID.randomUUID(), null); - refobjGameProfile - .method("getProperties").invoke() - .method("put", Object.class, Object.class) - .invoke("textures", refobjProperty.getOriginalObject()); - - return refobjGameProfile; - } - - private Class getClassForName(String className) { - try { - return Class.forName(className); - } catch (Exception e) { - throw new RuntimeException(e); - } + gameProfile.getProperties().put("textures", + new Property("textures", Base64.getEncoder().encodeToString( + ("{textures:{SKIN:{url:\"" + skinUrl + "\"}}}").getBytes(StandardCharsets.UTF_8)))); + return gameProfile; } }