forked from Upstream/mmocore
Added NMS code for 1.15
MMOCore should now be fully compatible with 1.15 (Spigot 1_15_R1)
This commit is contained in:
parent
7342f5420b
commit
bbb0b08c0a
Binary file not shown.
BIN
lib/spigot.jar
BIN
lib/spigot.jar
Binary file not shown.
@ -0,0 +1,229 @@
|
|||||||
|
package net.Indyuce.mmocore.version.nms;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.craftbukkit.libs.org.apache.commons.lang3.reflect.FieldUtils;
|
||||||
|
import org.bukkit.craftbukkit.v1_15_R1.CraftWorld;
|
||||||
|
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
|
||||||
|
import org.bukkit.craftbukkit.v1_15_R1.event.CraftEventFactory;
|
||||||
|
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
|
import org.bukkit.util.BoundingBox;
|
||||||
|
|
||||||
|
import com.mojang.authlib.GameProfile;
|
||||||
|
import com.mojang.authlib.properties.Property;
|
||||||
|
|
||||||
|
import net.Indyuce.mmocore.api.item.NBTItem;
|
||||||
|
import net.minecraft.server.v1_15_R1.BlockPosition;
|
||||||
|
import net.minecraft.server.v1_15_R1.ChatMessage;
|
||||||
|
import net.minecraft.server.v1_15_R1.ChatMessageType;
|
||||||
|
import net.minecraft.server.v1_15_R1.Container;
|
||||||
|
import net.minecraft.server.v1_15_R1.ContainerAccess;
|
||||||
|
import net.minecraft.server.v1_15_R1.ContainerAnvil;
|
||||||
|
import net.minecraft.server.v1_15_R1.Containers;
|
||||||
|
import net.minecraft.server.v1_15_R1.EntityPlayer;
|
||||||
|
import net.minecraft.server.v1_15_R1.IChatBaseComponent.ChatSerializer;
|
||||||
|
import net.minecraft.server.v1_15_R1.ItemStack;
|
||||||
|
import net.minecraft.server.v1_15_R1.NBTTagCompound;
|
||||||
|
import net.minecraft.server.v1_15_R1.PacketPlayOutChat;
|
||||||
|
import net.minecraft.server.v1_15_R1.PacketPlayOutCloseWindow;
|
||||||
|
import net.minecraft.server.v1_15_R1.PacketPlayOutOpenWindow;
|
||||||
|
import net.minecraft.server.v1_15_R1.PacketPlayOutTitle;
|
||||||
|
import net.minecraft.server.v1_15_R1.PacketPlayOutTitle.EnumTitleAction;
|
||||||
|
import net.minecraft.server.v1_15_R1.TileEntitySkull;
|
||||||
|
|
||||||
|
public class NMSHandler_1_15_R1 implements NMSHandler {
|
||||||
|
@Override
|
||||||
|
public void sendJson(Player player, String message) {
|
||||||
|
((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutChat(ChatSerializer.a(message)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendTitle(Player player, String msgTitle, String msgSubTitle, int fadeIn, int ticks, int fadeOut) {
|
||||||
|
((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutTitle(EnumTitleAction.TITLE, ChatSerializer.a("{\"text\": \"" + msgTitle + "\"}")));
|
||||||
|
((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutTitle(EnumTitleAction.SUBTITLE, ChatSerializer.a("{\"text\": \"" + msgSubTitle + "\"}")));
|
||||||
|
((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutTitle(EnumTitleAction.TIMES, null, fadeIn, ticks, fadeOut));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendActionBar(Player player, String message) {
|
||||||
|
((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutChat(ChatSerializer.a("{\"text\": \"" + message + "\"}"), ChatMessageType.GAME_INFO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getNextContainerId(Player player) {
|
||||||
|
return toNMS(player).nextContainerCounter();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleInventoryCloseEvent(Player player) {
|
||||||
|
CraftEventFactory.handleInventoryCloseEvent(toNMS(player));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendPacketOpenWindow(Player player, int containerId) {
|
||||||
|
toNMS(player).playerConnection.sendPacket(new PacketPlayOutOpenWindow(containerId, Containers.ANVIL, new ChatMessage("Repair & Name")));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendPacketCloseWindow(Player player, int containerId) {
|
||||||
|
toNMS(player).playerConnection.sendPacket(new PacketPlayOutCloseWindow(containerId));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setActiveContainerDefault(Player player) {
|
||||||
|
toNMS(player).activeContainer = toNMS(player).defaultContainer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setActiveContainer(Player player, Object container) {
|
||||||
|
toNMS(player).activeContainer = (Container) container;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setActiveContainerId(Object container, int containerId) {
|
||||||
|
Field field = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
field = Container.class.getField("windowId");
|
||||||
|
} catch (NoSuchFieldException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
FieldUtils.removeFinalModifier(field);
|
||||||
|
|
||||||
|
try {
|
||||||
|
FieldUtils.writeField(field, container, containerId);
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addActiveContainerSlotListener(Object container, Player player) {
|
||||||
|
((Container) container).addSlotListener(toNMS(player));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Inventory toBukkitInventory(Object container) {
|
||||||
|
return ((Container) container).getBukkitView().getTopInventory();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object newContainerAnvil(Player player) {
|
||||||
|
return new AnvilContainer(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
private EntityPlayer toNMS(Player player) {
|
||||||
|
return ((CraftPlayer) player).getHandle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private class AnvilContainer extends ContainerAnvil {
|
||||||
|
public AnvilContainer(Player player) {
|
||||||
|
super(getNextContainerId(player), ((CraftPlayer) player).getHandle().inventory, ContainerAccess.at(((CraftWorld) player.getWorld()).getHandle(), new BlockPosition(0, 0, 0)));
|
||||||
|
this.checkReachable = false;
|
||||||
|
setTitle(new ChatMessage("Repair & Name"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NBTItem getNBTItem(org.bukkit.inventory.ItemStack item) {
|
||||||
|
return new NBTItem_v1_13_2(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class NBTItem_v1_13_2 extends NBTItem {
|
||||||
|
private final ItemStack nms;
|
||||||
|
private final NBTTagCompound compound;
|
||||||
|
|
||||||
|
public NBTItem_v1_13_2(org.bukkit.inventory.ItemStack item) {
|
||||||
|
super(item);
|
||||||
|
|
||||||
|
nms = CraftItemStack.asNMSCopy(item);
|
||||||
|
compound = nms.hasTag() ? nms.getTag() : new NBTTagCompound();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getString(String path) {
|
||||||
|
return compound.getString(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean has(String path) {
|
||||||
|
return compound.hasKey(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getBoolean(String path) {
|
||||||
|
return compound.getBoolean(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getDouble(String path) {
|
||||||
|
return compound.getDouble(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getInt(String path) {
|
||||||
|
return compound.getInt(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NBTItem add(ItemTag... tags) {
|
||||||
|
for (ItemTag tag : tags) {
|
||||||
|
if (tag.getValue() instanceof Boolean)
|
||||||
|
compound.setBoolean(tag.getPath(), (boolean) tag.getValue());
|
||||||
|
else if (tag.getValue() instanceof Double)
|
||||||
|
compound.setDouble(tag.getPath(), (double) tag.getValue());
|
||||||
|
else if (tag.getValue() instanceof String)
|
||||||
|
compound.setString(tag.getPath(), (String) tag.getValue());
|
||||||
|
else if (tag.getValue() instanceof Integer)
|
||||||
|
compound.setInt(tag.getPath(), (int) tag.getValue());
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NBTItem remove(String... paths) {
|
||||||
|
for (String path : paths)
|
||||||
|
compound.remove(path);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<String> getTags() {
|
||||||
|
return compound.getKeys();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public org.bukkit.inventory.ItemStack toItem() {
|
||||||
|
nms.setTag(compound);
|
||||||
|
return CraftItemStack.asBukkitCopy(nms);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BoundingBox getBoundingBox(Entity target) {
|
||||||
|
return target.getBoundingBox();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getSkullValue(Block block) {
|
||||||
|
TileEntitySkull skullTile = (TileEntitySkull)((CraftWorld)block.getWorld()).getHandle().getTileEntity(new BlockPosition(block.getX(), block.getY(), block.getZ()));
|
||||||
|
if(skullTile.gameProfile == null) return "";
|
||||||
|
return skullTile.gameProfile.getProperties().get("textures").iterator().next().getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setSkullValue(Block block, String value) {
|
||||||
|
TileEntitySkull skullTile = (TileEntitySkull)((CraftWorld)block.getWorld()).getHandle().getTileEntity(new BlockPosition(block.getX(), block.getY(), block.getZ()));
|
||||||
|
GameProfile profile = new GameProfile(UUID.randomUUID(), null);
|
||||||
|
profile.getProperties().put("textures", new Property("textures", value));
|
||||||
|
skullTile.setGameProfile(profile);
|
||||||
|
skullTile.update();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user