MassiveCore - Mixin Stuff part 2
This commit is contained in:
parent
3f46a3bfac
commit
4301a8ff31
@ -85,10 +85,13 @@ import com.massivecraft.massivecore.mixin.MixinWorld;
|
|||||||
import com.massivecraft.massivecore.mson.Mson;
|
import com.massivecraft.massivecore.mson.Mson;
|
||||||
import com.massivecraft.massivecore.mson.MsonEvent;
|
import com.massivecraft.massivecore.mson.MsonEvent;
|
||||||
import com.massivecraft.massivecore.nms.NmsBasics;
|
import com.massivecraft.massivecore.nms.NmsBasics;
|
||||||
|
import com.massivecraft.massivecore.nms.NmsChat;
|
||||||
import com.massivecraft.massivecore.nms.NmsEntityGet;
|
import com.massivecraft.massivecore.nms.NmsEntityGet;
|
||||||
import com.massivecraft.massivecore.nms.NmsItemStackCreate;
|
import com.massivecraft.massivecore.nms.NmsItemStackCreate;
|
||||||
import com.massivecraft.massivecore.nms.NmsItemStackCreate17R4P;
|
import com.massivecraft.massivecore.nms.NmsItemStackCreate17R4P;
|
||||||
|
import com.massivecraft.massivecore.nms.NmsItemStackTooltip;
|
||||||
import com.massivecraft.massivecore.nms.NmsPlayerInventoryCreate;
|
import com.massivecraft.massivecore.nms.NmsPlayerInventoryCreate;
|
||||||
|
import com.massivecraft.massivecore.nms.NmsSkullMeta;
|
||||||
import com.massivecraft.massivecore.ps.PS;
|
import com.massivecraft.massivecore.ps.PS;
|
||||||
import com.massivecraft.massivecore.ps.PSAdapter;
|
import com.massivecraft.massivecore.ps.PSAdapter;
|
||||||
import com.massivecraft.massivecore.store.ModificationPollerLocal;
|
import com.massivecraft.massivecore.store.ModificationPollerLocal;
|
||||||
@ -252,9 +255,12 @@ public class MassiveCore extends MassivePlugin
|
|||||||
|
|
||||||
// Nms
|
// Nms
|
||||||
NmsBasics.class,
|
NmsBasics.class,
|
||||||
|
NmsChat.class,
|
||||||
NmsEntityGet.class,
|
NmsEntityGet.class,
|
||||||
NmsItemStackCreate.class,
|
NmsItemStackCreate.class,
|
||||||
|
NmsItemStackTooltip.class,
|
||||||
NmsPlayerInventoryCreate.class,
|
NmsPlayerInventoryCreate.class,
|
||||||
|
NmsSkullMeta.class,
|
||||||
|
|
||||||
// Writer,
|
// Writer,
|
||||||
WriterItemStack.class,
|
WriterItemStack.class,
|
||||||
|
@ -25,7 +25,7 @@ public class RequirementTitlesAvailable extends RequirementAbstract
|
|||||||
@Override
|
@Override
|
||||||
public boolean apply(CommandSender sender, MassiveCommand command)
|
public boolean apply(CommandSender sender, MassiveCommand command)
|
||||||
{
|
{
|
||||||
return MixinTitle.get().isTitlesAvailable();
|
return MixinTitle.get().isAvailable();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -32,8 +32,7 @@ public class WriterItemStackMeta extends WriterAbstractItemStackMetaMorph<Object
|
|||||||
WriterItemStackMetaPotionEffects.class,
|
WriterItemStackMetaPotionEffects.class,
|
||||||
|
|
||||||
// SKULL
|
// SKULL
|
||||||
WriterItemStackMetaSkull17.class,
|
WriterItemStackMetaSkull.class,
|
||||||
WriterItemStackMetaSkull18.class,
|
|
||||||
|
|
||||||
// FIREWORK EFFECT
|
// FIREWORK EFFECT
|
||||||
WriterItemStackMetaFireworkEffect.class,
|
WriterItemStackMetaFireworkEffect.class,
|
||||||
|
@ -7,17 +7,17 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import org.bukkit.inventory.meta.SkullMeta;
|
import org.bukkit.inventory.meta.SkullMeta;
|
||||||
|
|
||||||
import com.massivecraft.massivecore.Couple;
|
import com.massivecraft.massivecore.Couple;
|
||||||
import com.massivecraft.massivecore.nms.NmsHead;
|
import com.massivecraft.massivecore.nms.NmsSkullMeta;
|
||||||
|
|
||||||
public class WriterItemStackMetaSkull18 extends WriterAbstractItemStackMetaField<SkullMeta, String, String>
|
public class WriterItemStackMetaSkull extends WriterAbstractItemStackMetaField<SkullMeta, String, String>
|
||||||
{
|
{
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// INSTANCE & CONSTRUCT
|
// INSTANCE & CONSTRUCT
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
|
||||||
private static final WriterItemStackMetaSkull18 i = new WriterItemStackMetaSkull18();
|
private static final WriterItemStackMetaSkull i = new WriterItemStackMetaSkull();
|
||||||
public static WriterItemStackMetaSkull18 get() { return i; }
|
public static WriterItemStackMetaSkull get() { return i; }
|
||||||
public WriterItemStackMetaSkull18()
|
public WriterItemStackMetaSkull()
|
||||||
{
|
{
|
||||||
super(SkullMeta.class);
|
super(SkullMeta.class);
|
||||||
this.setMaterial(Material.SKULL_ITEM);
|
this.setMaterial(Material.SKULL_ITEM);
|
||||||
@ -50,16 +50,17 @@ public class WriterItemStackMetaSkull18 extends WriterAbstractItemStackMetaField
|
|||||||
public void setB(SkullMeta cb, String fb, ItemStack d)
|
public void setB(SkullMeta cb, String fb, ItemStack d)
|
||||||
{
|
{
|
||||||
String name = fb;
|
String name = fb;
|
||||||
|
|
||||||
UUID id = null;
|
UUID id = null;
|
||||||
|
|
||||||
Couple<String, UUID> resolved = NmsHead.resolve(name, id);
|
NmsSkullMeta nms = NmsSkullMeta.get();
|
||||||
|
|
||||||
|
Couple<String, UUID> resolved = nms.resolve(name, id);
|
||||||
name = resolved.getFirst();
|
name = resolved.getFirst();
|
||||||
id = resolved.getSecond();
|
id = resolved.getSecond();
|
||||||
|
|
||||||
if (name != null || id != null)
|
if (name != null || id != null)
|
||||||
{
|
{
|
||||||
NmsHead.set(cb, name, id);
|
nms.set(cb, name, id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,49 +0,0 @@
|
|||||||
package com.massivecraft.massivecore.item;
|
|
||||||
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
import org.bukkit.inventory.meta.SkullMeta;
|
|
||||||
|
|
||||||
public class WriterItemStackMetaSkull17 extends WriterAbstractItemStackMetaField<SkullMeta, String, String>
|
|
||||||
{
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// INSTANCE & CONSTRUCT
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
private static final WriterItemStackMetaSkull17 i = new WriterItemStackMetaSkull17();
|
|
||||||
public static WriterItemStackMetaSkull17 get() { return i; }
|
|
||||||
public WriterItemStackMetaSkull17()
|
|
||||||
{
|
|
||||||
super(SkullMeta.class);
|
|
||||||
this.setMaterial(Material.SKULL_ITEM);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// ACCESS
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getA(DataItemStack ca, ItemStack d)
|
|
||||||
{
|
|
||||||
return ca.getSkull();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setA(DataItemStack ca, String fa, ItemStack d)
|
|
||||||
{
|
|
||||||
ca.setSkull(fa);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getB(SkullMeta cb, ItemStack d)
|
|
||||||
{
|
|
||||||
return cb.getOwner();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setB(SkullMeta cb, String fb, ItemStack d)
|
|
||||||
{
|
|
||||||
cb.setOwner(fb);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,10 +1,9 @@
|
|||||||
package com.massivecraft.massivecore.mixin;
|
package com.massivecraft.massivecore.mixin;
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import com.massivecraft.massivecore.mson.Mson;
|
import com.massivecraft.massivecore.mson.Mson;
|
||||||
import com.massivecraft.massivecore.nms.NmsPacket;
|
import com.massivecraft.massivecore.nms.NmsChat;
|
||||||
import com.massivecraft.massivecore.util.IdUtil;
|
|
||||||
import com.massivecraft.massivecore.util.Txt;
|
|
||||||
|
|
||||||
public class MixinActionbar extends Mixin
|
public class MixinActionbar extends Mixin
|
||||||
{
|
{
|
||||||
@ -17,40 +16,37 @@ public class MixinActionbar extends Mixin
|
|||||||
public static MixinActionbar get() { return i; }
|
public static MixinActionbar get() { return i; }
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// METHODS
|
// AVAILABLE
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
|
||||||
public boolean sendActionbarMessage(Object watcherObject, String message)
|
@Override
|
||||||
|
public boolean isAvailable()
|
||||||
{
|
{
|
||||||
// Get the player
|
return NmsChat.get().isAvailable();
|
||||||
Player player = IdUtil.getPlayer(watcherObject);
|
|
||||||
if(player == null) return false;
|
|
||||||
|
|
||||||
message = NmsPacket.toJson(message);
|
|
||||||
|
|
||||||
return NmsPacket.sendActionbar(player, message);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean sendActionbarMsg(Object watcherObject, String message)
|
// -------------------------------------------- //
|
||||||
|
// SEND
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public void sendActionbarRaw(Player player, String raw)
|
||||||
{
|
{
|
||||||
return this.sendActionbarMessage(watcherObject, Txt.parse(message));
|
NmsChat.get().sendActionbarRaw(player, raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean sendActionbarMson(Object watcherObject, Mson mson)
|
public void sendActionbarMson(Object watcherObject, Mson mson)
|
||||||
{
|
{
|
||||||
// Get the player
|
NmsChat.get().sendActionbarMson(watcherObject, mson);
|
||||||
Player player = IdUtil.getPlayer(watcherObject);
|
|
||||||
if(player == null) return false;
|
|
||||||
|
|
||||||
// Convert to raw
|
|
||||||
String message = mson.toRaw();
|
|
||||||
|
|
||||||
return NmsPacket.sendActionbar(player, message);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isActionbarAvailable()
|
public void sendActionbarMessage(Object watcherObject, String message)
|
||||||
{
|
{
|
||||||
return NmsPacket.get().isAvailable();
|
NmsChat.get().sendActionbarMessage(watcherObject, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendActionbarMsg(Object watcherObject, String msg)
|
||||||
|
{
|
||||||
|
NmsChat.get().sendActionbarMsg(watcherObject, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,10 +5,9 @@ import java.util.Collection;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
import com.massivecraft.massivecore.mson.Mson;
|
import com.massivecraft.massivecore.mson.Mson;
|
||||||
import com.massivecraft.massivecore.nms.NmsPacket;
|
import com.massivecraft.massivecore.nms.NmsChat;
|
||||||
import com.massivecraft.massivecore.predicate.Predicate;
|
import com.massivecraft.massivecore.predicate.Predicate;
|
||||||
import com.massivecraft.massivecore.util.IdUtil;
|
import com.massivecraft.massivecore.util.IdUtil;
|
||||||
import com.massivecraft.massivecore.util.Txt;
|
import com.massivecraft.massivecore.util.Txt;
|
||||||
@ -179,15 +178,7 @@ public class MixinMessage extends Mixin
|
|||||||
else if (message instanceof Mson)
|
else if (message instanceof Mson)
|
||||||
{
|
{
|
||||||
Mson mson = (Mson)message;
|
Mson mson = (Mson)message;
|
||||||
if (sendee instanceof Player && NmsPacket.get().isAvailable())
|
NmsChat.get().sendChatMson(sendee, mson);
|
||||||
{
|
|
||||||
Player player = (Player) sendee;
|
|
||||||
NmsPacket.sendRaw(player, mson.toRaw());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sendee.sendMessage(mson.toPlain(true));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2,9 +2,8 @@ package com.massivecraft.massivecore.mixin;
|
|||||||
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import com.massivecraft.massivecore.nms.NmsPacket;
|
import com.massivecraft.massivecore.mson.Mson;
|
||||||
import com.massivecraft.massivecore.util.IdUtil;
|
import com.massivecraft.massivecore.nms.NmsChat;
|
||||||
import com.massivecraft.massivecore.util.Txt;
|
|
||||||
|
|
||||||
public class MixinTitle extends Mixin
|
public class MixinTitle extends Mixin
|
||||||
{
|
{
|
||||||
@ -17,35 +16,37 @@ public class MixinTitle extends Mixin
|
|||||||
public static MixinTitle get() { return i; }
|
public static MixinTitle get() { return i; }
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// METHODS
|
// AVAILABLE
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
|
||||||
public boolean sendTitleMessage(Object watcherObject, int ticksIn, int ticksStay, int ticksOut, String titleMain, String titleSub)
|
@Override
|
||||||
|
public boolean isAvailable()
|
||||||
{
|
{
|
||||||
// Get the player
|
return NmsChat.get().isAvailable();
|
||||||
Player player = IdUtil.getPlayer(watcherObject);
|
|
||||||
if (player == null) return false;
|
|
||||||
|
|
||||||
// If we don't send any message (empty is ok) we might end up displaying old messages.
|
|
||||||
if (titleSub == null) titleSub = "";
|
|
||||||
if (titleMain == null) titleMain = "";
|
|
||||||
|
|
||||||
titleSub = NmsPacket.toJson(titleSub);
|
|
||||||
titleMain = NmsPacket.toJson(titleMain);
|
|
||||||
|
|
||||||
return NmsPacket.sendTitle(player, ticksIn, ticksStay, ticksOut, titleMain, titleSub);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean sendTitleMsg(Object watcherObject, int ticksIn, int ticksStay, int ticksOut, String titleMain, String titleSub)
|
// -------------------------------------------- //
|
||||||
|
// SEND
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public void sendTitleRaw(Player player, int ticksIn, int ticksStay, int ticksOut, String rawMain, String rawSub)
|
||||||
{
|
{
|
||||||
if (titleMain != null) titleMain = Txt.parse(titleMain);
|
NmsChat.get().sendTitleRaw(player, ticksIn, ticksStay, ticksOut, rawMain, rawSub);
|
||||||
if (titleSub != null) titleSub = Txt.parse(titleSub);
|
|
||||||
return this.sendTitleMessage(watcherObject, ticksIn, ticksStay, ticksOut, titleMain, titleSub);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isTitlesAvailable()
|
public void sendTitleMson(Object watcherObject, int ticksIn, int ticksStay, int ticksOut, Mson msonMain, Mson msonSub)
|
||||||
{
|
{
|
||||||
return NmsPacket.get().isAvailable();
|
NmsChat.get().sendTitleMson(watcherObject, ticksIn, ticksStay, ticksOut, msonMain, msonSub);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendTitleMessage(Object watcherObject, int ticksIn, int ticksStay, int ticksOut, String messageMain, String messageSub)
|
||||||
|
{
|
||||||
|
NmsChat.get().sendTitleMessage(watcherObject, ticksIn, ticksStay, ticksOut, messageMain, messageSub);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendTitleMsg(Object watcherObject, int ticksIn, int ticksStay, int ticksOut, String msgMain, String msgSub)
|
||||||
|
{
|
||||||
|
NmsChat.get().sendTitleMsg(watcherObject, ticksIn, ticksStay, ticksOut, msgMain, msgSub);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ import java.util.Objects;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import com.massivecraft.massivecore.command.MassiveCommand;
|
import com.massivecraft.massivecore.command.MassiveCommand;
|
||||||
import com.massivecraft.massivecore.nms.NmsItem;
|
import com.massivecraft.massivecore.nms.NmsItemStackTooltip;
|
||||||
import com.massivecraft.massivecore.util.MUtil;
|
import com.massivecraft.massivecore.util.MUtil;
|
||||||
import com.massivecraft.massivecore.util.Txt;
|
import com.massivecraft.massivecore.util.Txt;
|
||||||
|
|
||||||
@ -127,7 +127,10 @@ public final class MsonEvent implements Serializable
|
|||||||
public static MsonEvent item(ItemStack item)
|
public static MsonEvent item(ItemStack item)
|
||||||
{
|
{
|
||||||
if (item == null) throw new NullPointerException("item");
|
if (item == null) throw new NullPointerException("item");
|
||||||
return MsonEvent.valueOf(MsonEventAction.SHOW_ITEM, NmsItem.itemToString(item));
|
String nbtStringTooltip = null;
|
||||||
|
NmsItemStackTooltip nms = NmsItemStackTooltip.get();
|
||||||
|
if (nms.isAvailable()) nbtStringTooltip = nms.getNbtStringTooltip(item);
|
||||||
|
return MsonEvent.valueOf(MsonEventAction.SHOW_ITEM, nbtStringTooltip);
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
120
src/com/massivecraft/massivecore/nms/NmsChat.java
Normal file
120
src/com/massivecraft/massivecore/nms/NmsChat.java
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
|
import com.massivecraft.massivecore.mixin.Mixin;
|
||||||
|
import com.massivecraft.massivecore.mson.Mson;
|
||||||
|
import com.massivecraft.massivecore.util.IdUtil;
|
||||||
|
import com.massivecraft.massivecore.util.Txt;
|
||||||
|
|
||||||
|
public class NmsChat extends Mixin
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// DEFAULT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsChat d = new NmsChat().setAlternatives(
|
||||||
|
NmsChat18R2P.class,
|
||||||
|
NmsChat18R1.class
|
||||||
|
);
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INSTANCE & CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsChat i = d;
|
||||||
|
public static NmsChat get() { return i; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// CHAT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public void sendChatMson(Object sendeeObject, Mson mson)
|
||||||
|
{
|
||||||
|
CommandSender sendee = IdUtil.getSender(sendeeObject);
|
||||||
|
if (sendee == null) return;
|
||||||
|
|
||||||
|
String message = mson.toPlain(true);
|
||||||
|
sendee.sendMessage(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// TITLE
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public void sendTitleRaw(Object sendeeObject, int ticksIn, int ticksStay, int ticksOut, String rawMain, String rawSub)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendTitleMson(Object sendeeObject, int ticksIn, int ticksStay, int ticksOut, Mson msonMain, Mson msonSub)
|
||||||
|
{
|
||||||
|
String rawMain = msonMain.toRaw();
|
||||||
|
String rawSub = msonSub.toRaw();
|
||||||
|
|
||||||
|
this.sendTitleRaw(sendeeObject, ticksIn, ticksStay, ticksOut, rawMain, rawSub);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendTitleMessage(Object sendeeObject, int ticksIn, int ticksStay, int ticksOut, String messageMain, String messageSub)
|
||||||
|
{
|
||||||
|
// If we don't send any message (empty is ok) we might end up displaying old messages.
|
||||||
|
if (messageMain == null) messageMain = "";
|
||||||
|
if (messageSub == null) messageSub = "";
|
||||||
|
|
||||||
|
String rawMain = messageToRaw(messageMain);
|
||||||
|
String rawSub = messageToRaw(messageSub);
|
||||||
|
|
||||||
|
this.sendTitleRaw(sendeeObject, ticksIn, ticksStay, ticksOut, rawMain, rawSub);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendTitleMsg(Object sendeeObject, int ticksIn, int ticksStay, int ticksOut, String msgMain, String msgSub)
|
||||||
|
{
|
||||||
|
String messageMain = Txt.parse(msgMain);
|
||||||
|
String messageSub = Txt.parse(msgSub);
|
||||||
|
|
||||||
|
this.sendTitleMessage(sendeeObject, ticksIn, ticksStay, ticksOut, messageMain, messageSub);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// ACTIONBAR
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public void sendActionbarRaw(Object sendeeObject, String raw)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendActionbarMson(Object sendeeObject, Mson mson)
|
||||||
|
{
|
||||||
|
String message = mson.toRaw();
|
||||||
|
|
||||||
|
this.sendActionbarRaw(sendeeObject, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendActionbarMessage(Object sendeeObject, String message)
|
||||||
|
{
|
||||||
|
message = messageToRaw(message);
|
||||||
|
|
||||||
|
this.sendActionbarRaw(sendeeObject, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendActionbarMsg(Object sendeeObject, String msg)
|
||||||
|
{
|
||||||
|
String message = Txt.parse(msg);
|
||||||
|
|
||||||
|
this.sendActionbarMessage(sendeeObject, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// MESSAGE TO RAW
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public static String messageToRaw(String message)
|
||||||
|
{
|
||||||
|
message = JSONObject.escape(message);
|
||||||
|
message = "{\"text\": \"" + message + "\"}";
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
28
src/com/massivecraft/massivecore/nms/NmsChat18R1.java
Normal file
28
src/com/massivecraft/massivecore/nms/NmsChat18R1.java
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
|
import com.massivecraft.massivecore.particleeffect.ReflectionUtils.PackageType;
|
||||||
|
import com.massivecraft.massivecore.util.ReflectionUtil;
|
||||||
|
|
||||||
|
public class NmsChat18R1 extends NmsChatAbstract
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INSTANCE & CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsChat18R1 i = new NmsChat18R1();
|
||||||
|
public static NmsChat18R1 get() { return i; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// SETUP SPECIFIC
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setupSpecific() throws Throwable
|
||||||
|
{
|
||||||
|
this.classChatSerializer = PackageType.MINECRAFT_SERVER.getClass("ChatSerializer");
|
||||||
|
this.methodChatSerializer = ReflectionUtil.getMethod(this.classChatSerializer, "a", String.class);
|
||||||
|
|
||||||
|
this.classEnumTitleAction = PackageType.MINECRAFT_SERVER.getClass("EnumTitleAction");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
28
src/com/massivecraft/massivecore/nms/NmsChat18R2P.java
Normal file
28
src/com/massivecraft/massivecore/nms/NmsChat18R2P.java
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
|
import com.massivecraft.massivecore.particleeffect.ReflectionUtils.PackageType;
|
||||||
|
import com.massivecraft.massivecore.util.ReflectionUtil;
|
||||||
|
|
||||||
|
public class NmsChat18R2P extends NmsChatAbstract
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INSTANCE & CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsChat18R2P i = new NmsChat18R2P();
|
||||||
|
public static NmsChat18R2P get() { return i; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// SETUP SPECIFIC
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setupSpecific() throws Throwable
|
||||||
|
{
|
||||||
|
this.classChatSerializer = PackageType.MINECRAFT_SERVER.getClass("IChatBaseComponent$ChatSerializer");
|
||||||
|
this.methodChatSerializer = ReflectionUtil.getMethod(this.classChatSerializer, "a", String.class);
|
||||||
|
|
||||||
|
this.classEnumTitleAction = PackageType.MINECRAFT_SERVER.getClass("PacketPlayOutTitle$EnumTitleAction");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
180
src/com/massivecraft/massivecore/nms/NmsChatAbstract.java
Normal file
180
src/com/massivecraft/massivecore/nms/NmsChatAbstract.java
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.ArmorStand;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import com.massivecraft.massivecore.mson.Mson;
|
||||||
|
import com.massivecraft.massivecore.particleeffect.ReflectionUtils.PackageType;
|
||||||
|
import com.massivecraft.massivecore.util.IdUtil;
|
||||||
|
import com.massivecraft.massivecore.util.ReflectionUtil;
|
||||||
|
|
||||||
|
public abstract class NmsChatAbstract extends NmsChat
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// FIELDS
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
// EnumTitleAction
|
||||||
|
protected Class<?> classEnumTitleAction;
|
||||||
|
protected Enum<?> enumEnumTitleActionMain;
|
||||||
|
protected Enum<?> enumEnumTitleActionSub;
|
||||||
|
protected Enum<?> enumEnumTitleActionTimes;
|
||||||
|
|
||||||
|
// ChatSerializer
|
||||||
|
protected Class<?> classChatSerializer;
|
||||||
|
protected Method methodChatSerializer;
|
||||||
|
|
||||||
|
// IChatBaseComponent
|
||||||
|
protected Class<?> classIChatBaseComponent;
|
||||||
|
|
||||||
|
// PacketPlayOutTitle
|
||||||
|
protected Class<?> classPacketPlayOutTitle;
|
||||||
|
protected Constructor<?> constructorPacketPlayOutTitle;
|
||||||
|
protected Constructor<?> constructorPacketPlayOutTitleTimes;
|
||||||
|
|
||||||
|
// PacketPlayOutChat
|
||||||
|
protected Class<?> classPacketPlayOutChat;
|
||||||
|
protected Constructor<?> constructorPacketPlayOutChat;
|
||||||
|
protected Constructor<?> constructorPacketPlayOutChatType;
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// PROVOKE
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<ArmorStand> provoke() throws Throwable
|
||||||
|
{
|
||||||
|
// Require NmsBasics
|
||||||
|
NmsBasics.get().require();
|
||||||
|
|
||||||
|
// Require 1.8
|
||||||
|
return ArmorStand.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// SETUP
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setup() throws Throwable
|
||||||
|
{
|
||||||
|
this.setupSpecific();
|
||||||
|
|
||||||
|
for (Object object : this.classEnumTitleAction.getEnumConstants())
|
||||||
|
{
|
||||||
|
Enum<?> e = (Enum<?>) object;
|
||||||
|
if (e.name().equalsIgnoreCase("TITLE")) this.enumEnumTitleActionMain = e;
|
||||||
|
else if (e.name().equalsIgnoreCase("SUBTITLE")) this.enumEnumTitleActionSub = e;
|
||||||
|
else if (e.name().equalsIgnoreCase("TIMES")) this.enumEnumTitleActionTimes = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.classIChatBaseComponent = PackageType.MINECRAFT_SERVER.getClass("IChatBaseComponent");
|
||||||
|
|
||||||
|
// Get title packet and it's constructor
|
||||||
|
this.classPacketPlayOutTitle = PackageType.MINECRAFT_SERVER.getClass("PacketPlayOutTitle");
|
||||||
|
this.constructorPacketPlayOutTitle = ReflectionUtil.getConstructor(this.classPacketPlayOutTitle, this.classEnumTitleAction, this.classIChatBaseComponent);
|
||||||
|
|
||||||
|
this.constructorPacketPlayOutTitleTimes = ReflectionUtil.getConstructor(this.classPacketPlayOutTitle, this.classEnumTitleAction, this.classIChatBaseComponent, int.class, int.class, int.class);
|
||||||
|
|
||||||
|
// Get Chat packet and it's constructor
|
||||||
|
this.classPacketPlayOutChat = PackageType.MINECRAFT_SERVER.getClass("PacketPlayOutChat");
|
||||||
|
this.constructorPacketPlayOutChat = ReflectionUtil.getConstructor(this.classPacketPlayOutChat, this.classIChatBaseComponent);
|
||||||
|
this.constructorPacketPlayOutChatType = ReflectionUtil.getConstructor(this.classPacketPlayOutChat, this.classIChatBaseComponent, Byte.TYPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// SETUP SPECIFIC
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public abstract void setupSpecific() throws Throwable;
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// TO COMPONENT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
protected Object toComponent(String raw)
|
||||||
|
{
|
||||||
|
return ReflectionUtil.invokeMethod(this.methodChatSerializer, null, raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// CHAT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendChatMson(Object sendeeObject, Mson mson)
|
||||||
|
{
|
||||||
|
CommandSender sendee = IdUtil.getSender(sendeeObject);
|
||||||
|
if (sendee == null) return;
|
||||||
|
|
||||||
|
if (sendee instanceof Player)
|
||||||
|
{
|
||||||
|
Player player = (Player)sendee;
|
||||||
|
String raw = mson.toRaw();
|
||||||
|
Object component = toComponent(raw);
|
||||||
|
Object packet = ReflectionUtil.invokeConstructor(this.constructorPacketPlayOutChat, component);
|
||||||
|
NmsBasics.get().sendPacket(player, packet);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
String message = mson.toPlain(true);
|
||||||
|
sendee.sendMessage(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// TITLE
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendTitleRaw(Object sendeeObject, int ticksIn, int ticksStay, int ticksOut, String rawMain, String rawSub)
|
||||||
|
{
|
||||||
|
Player player = IdUtil.getPlayer(sendeeObject);
|
||||||
|
if (player == null) return;
|
||||||
|
|
||||||
|
Object component;
|
||||||
|
Object packet;
|
||||||
|
Enum<?> action;
|
||||||
|
|
||||||
|
// in, stay, out
|
||||||
|
packet = ReflectionUtil.invokeConstructor(this.constructorPacketPlayOutTitleTimes, this.enumEnumTitleActionTimes, null, ticksIn, ticksStay, ticksOut);
|
||||||
|
NmsBasics.get().sendPacket(player, packet);
|
||||||
|
|
||||||
|
// main
|
||||||
|
if (rawMain != null)
|
||||||
|
{
|
||||||
|
component = toComponent(rawMain);
|
||||||
|
action = this.enumEnumTitleActionMain;
|
||||||
|
packet = ReflectionUtil.invokeConstructor(this.constructorPacketPlayOutTitle, action, component);
|
||||||
|
NmsBasics.get().sendPacket(player, packet);
|
||||||
|
}
|
||||||
|
|
||||||
|
// sub
|
||||||
|
if (rawSub != null)
|
||||||
|
{
|
||||||
|
component = toComponent(rawSub);
|
||||||
|
action = this.enumEnumTitleActionSub;
|
||||||
|
packet = ReflectionUtil.invokeConstructor(constructorPacketPlayOutTitle, action, component);
|
||||||
|
NmsBasics.get().sendPacket(player, packet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// ACTIONBAR
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendActionbarRaw(Object sendeeObject, String raw)
|
||||||
|
{
|
||||||
|
Player player = IdUtil.getPlayer(sendeeObject);
|
||||||
|
if (player == null) return;
|
||||||
|
|
||||||
|
Object component = toComponent(raw);
|
||||||
|
Object packet = ReflectionUtil.invokeConstructor(this.constructorPacketPlayOutChatType, component, (byte)2);
|
||||||
|
NmsBasics.get().sendPacket(player, packet);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,161 +0,0 @@
|
|||||||
package com.massivecraft.massivecore.nms;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import org.bukkit.inventory.meta.SkullMeta;
|
|
||||||
|
|
||||||
import com.massivecraft.massivecore.Couple;
|
|
||||||
import com.massivecraft.massivecore.particleeffect.ReflectionUtils.PackageType;
|
|
||||||
import com.massivecraft.massivecore.util.IdData;
|
|
||||||
import com.massivecraft.massivecore.util.IdUtil;
|
|
||||||
import com.massivecraft.massivecore.util.MUtil;
|
|
||||||
import com.massivecraft.massivecore.util.ReflectionUtil;
|
|
||||||
|
|
||||||
public class NmsHead extends NmsAbstract
|
|
||||||
{
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// INSTANCE & CONSTRUCT
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
private static NmsHead i = new NmsHead();
|
|
||||||
public static NmsHead get () { return i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// FIELDS
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public static Class<?> classCraftMetaSkull;
|
|
||||||
public static Field fieldCraftMetaSkullDotProfile;
|
|
||||||
|
|
||||||
public static Class<?> classGameProfile;
|
|
||||||
public static Field fieldGameProfileDotId;
|
|
||||||
public static Field fieldGameProfileDotName;
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// OVERRIDE
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getRequiredVersion()
|
|
||||||
{
|
|
||||||
return 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void setup() throws Throwable
|
|
||||||
{
|
|
||||||
classCraftMetaSkull = PackageType.CRAFTBUKKIT_INVENTORY.getClass("CraftMetaSkull");
|
|
||||||
fieldCraftMetaSkullDotProfile = ReflectionUtil.getField(classCraftMetaSkull, "profile");
|
|
||||||
|
|
||||||
classGameProfile = Class.forName("com.mojang.authlib.GameProfile");
|
|
||||||
fieldGameProfileDotId = ReflectionUtil.getField(classGameProfile, "id");
|
|
||||||
fieldGameProfileDotName = ReflectionUtil.getField(classGameProfile, "name");
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// GAMEPROFILE: SIMPLE
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public static Object getGameProfile(SkullMeta meta)
|
|
||||||
{
|
|
||||||
return ReflectionUtil.getField(fieldCraftMetaSkullDotProfile, meta);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setGameProfile(SkullMeta meta, Object gameProfile)
|
|
||||||
{
|
|
||||||
ReflectionUtil.setField(fieldCraftMetaSkullDotProfile, meta, gameProfile);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// GAMEPROFILE: GET
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public static String getGameProfileName(Object gameProfile)
|
|
||||||
{
|
|
||||||
return ReflectionUtil.getField(fieldGameProfileDotName, gameProfile);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static UUID getGameProfileId(Object gameProfile)
|
|
||||||
{
|
|
||||||
return ReflectionUtil.getField(fieldGameProfileDotId, gameProfile);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// GAMEPROFILE: SET
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public static void setGameProfileName(Object gameProfile, String name)
|
|
||||||
{
|
|
||||||
ReflectionUtil.setField(fieldGameProfileDotName, gameProfile, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setGameProfileId(Object gameProfile, UUID id)
|
|
||||||
{
|
|
||||||
ReflectionUtil.setField(fieldGameProfileDotId, gameProfile, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// SKULLMETA: RAW
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public static String getName(SkullMeta meta)
|
|
||||||
{
|
|
||||||
// Object gameProfile = getGameProfile(meta);
|
|
||||||
// if (gameProfile == null) return null;
|
|
||||||
// return getGameProfileName(gameProfile);
|
|
||||||
|
|
||||||
return meta.getOwner();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static UUID getId(SkullMeta meta)
|
|
||||||
{
|
|
||||||
Object gameProfile = getGameProfile(meta);
|
|
||||||
if (gameProfile == null) return null;
|
|
||||||
return getGameProfileId(gameProfile);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void set(SkullMeta meta, String name, UUID id)
|
|
||||||
{
|
|
||||||
meta.setOwner(name != null ? name : "adsf");
|
|
||||||
|
|
||||||
Object gameProfile = getGameProfile(meta);
|
|
||||||
setGameProfileName(gameProfile, name);
|
|
||||||
setGameProfileId(gameProfile, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// RESOLVE
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// We resolve the locally best possible information using IdUtil.
|
|
||||||
|
|
||||||
public static Couple<String, UUID> resolve(String name, UUID id)
|
|
||||||
{
|
|
||||||
// Create Ret
|
|
||||||
// We default to the input.
|
|
||||||
String retName = name;
|
|
||||||
UUID retId = id;
|
|
||||||
|
|
||||||
// Fetch IdData
|
|
||||||
// First by name then id.
|
|
||||||
IdData data = null;
|
|
||||||
if (name != null) data = IdUtil.getNameToData().get(name);
|
|
||||||
if (data == null && id != null) data = IdUtil.getIdToData().get(id.toString());
|
|
||||||
|
|
||||||
// Use that data if found
|
|
||||||
if (data != null)
|
|
||||||
{
|
|
||||||
retName = data.getName();
|
|
||||||
retId = MUtil.asUuid(data.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return Ret
|
|
||||||
return new Couple<String, UUID>(retName, retId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Couple<String, UUID> resolve(SkullMeta meta)
|
|
||||||
{
|
|
||||||
return resolve(getName(meta), getId(meta));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,75 +0,0 @@
|
|||||||
package com.massivecraft.massivecore.nms;
|
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
|
|
||||||
import com.massivecraft.massivecore.particleeffect.ReflectionUtils;
|
|
||||||
import com.massivecraft.massivecore.particleeffect.ReflectionUtils.PackageType;
|
|
||||||
|
|
||||||
public class NmsItem extends NmsAbstract
|
|
||||||
{
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// INSTANCE & CONSTRUCT
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
private static NmsItem i = new NmsItem();
|
|
||||||
public static NmsItem get () { return i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// FIELDS
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
// Handling tooltips
|
|
||||||
private static Method toNms;
|
|
||||||
private static Method toJson;
|
|
||||||
private static Class<?> cbItem;
|
|
||||||
private static Class<?> nmsItem;
|
|
||||||
private static Class<?> nbtTag;
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// OVERRIDE
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getRequiredVersion()
|
|
||||||
{
|
|
||||||
return 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void setup() throws Throwable
|
|
||||||
{
|
|
||||||
cbItem = PackageType.CRAFTBUKKIT_INVENTORY.getClass("CraftItemStack");
|
|
||||||
nmsItem = PackageType.MINECRAFT_SERVER.getClass("ItemStack");
|
|
||||||
nbtTag = PackageType.MINECRAFT_SERVER.getClass("NBTTagCompound");
|
|
||||||
|
|
||||||
toNms = ReflectionUtils.getMethod(cbItem, "asNMSCopy", ItemStack.class);
|
|
||||||
toJson = ReflectionUtils.getMethod(nmsItem, "save", nbtTag);
|
|
||||||
|
|
||||||
// Set accessible
|
|
||||||
toNms.setAccessible(true);
|
|
||||||
toJson.setAccessible(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static String itemToString(ItemStack item)
|
|
||||||
{
|
|
||||||
if (item == null) throw new NullPointerException("item");
|
|
||||||
|
|
||||||
if ( ! get().isAvailable()) return null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Object nmsItem = toNms.invoke(null, item);
|
|
||||||
if (nmsItem == null) throw new RuntimeException(item.toString());
|
|
||||||
String str = toJson.invoke(nmsItem, nbtTag.newInstance()).toString();
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
ex.printStackTrace();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,33 @@
|
|||||||
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import com.massivecraft.massivecore.mixin.Mixin;
|
||||||
|
|
||||||
|
public class NmsItemStackTooltip extends Mixin
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// DEFAULT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsItemStackTooltip d = new NmsItemStackTooltip().setAlternatives(
|
||||||
|
NmsItemStackTooltip18R1P.class
|
||||||
|
);
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INSTANCE & CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsItemStackTooltip i = d;
|
||||||
|
public static NmsItemStackTooltip get() { return i; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// TOOLTIP
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public String getNbtStringTooltip(ItemStack item)
|
||||||
|
{
|
||||||
|
throw notImplemented();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,81 @@
|
|||||||
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
import org.bukkit.entity.ArmorStand;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import com.massivecraft.massivecore.particleeffect.ReflectionUtils.PackageType;
|
||||||
|
import com.massivecraft.massivecore.util.ReflectionUtil;
|
||||||
|
|
||||||
|
public class NmsItemStackTooltip18R1P extends NmsItemStackTooltip
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INSTANCE & CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsItemStackTooltip18R1P i = new NmsItemStackTooltip18R1P();
|
||||||
|
public static NmsItemStackTooltip18R1P get () { return i; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// FIELDS
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
// org.bukkit.craftbukkit.inventory.CraftItemStack
|
||||||
|
private Class<?> classCraftItemStack;
|
||||||
|
|
||||||
|
// net.minecraft.server.ItemStack
|
||||||
|
private Class<?> classNmsItemStack;
|
||||||
|
|
||||||
|
// net.minecraft.serverNBTTagCompound
|
||||||
|
private Class<?> classNmsNbtTagCompound;
|
||||||
|
|
||||||
|
// org.bukkit.craftbukkit.inventory.CraftItemStack#asNmsCopy(net.minecraft.server.ItemStack)
|
||||||
|
private Method methodCraftItemStackAsNmsCopy;
|
||||||
|
|
||||||
|
// net.minecraft.server.ItemStack#save(net.minecraft.serverNBTTagCompound)
|
||||||
|
private Method methodNmsItemStackSave;
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// PROVOKE
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<ArmorStand> provoke() throws Throwable
|
||||||
|
{
|
||||||
|
// Demand 1.8
|
||||||
|
// The rich chat system with clickables and tooltips were added in Minecraft 1.8.
|
||||||
|
// At Minecraft 1.7 the reflection in setup will succeed.
|
||||||
|
// The returned String is however an inferior and incompatible version.
|
||||||
|
return ArmorStand.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// SETUP
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setup() throws Throwable
|
||||||
|
{
|
||||||
|
this.classCraftItemStack = PackageType.CRAFTBUKKIT_INVENTORY.getClass("CraftItemStack");
|
||||||
|
this.classNmsItemStack = PackageType.MINECRAFT_SERVER.getClass("ItemStack");
|
||||||
|
this.classNmsNbtTagCompound = PackageType.MINECRAFT_SERVER.getClass("NBTTagCompound");
|
||||||
|
|
||||||
|
this.methodCraftItemStackAsNmsCopy = ReflectionUtil.getMethod(this.classCraftItemStack, "asNMSCopy", ItemStack.class);
|
||||||
|
this.methodNmsItemStackSave = ReflectionUtil.getMethod(this.classNmsItemStack, "save", classNmsNbtTagCompound);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// TOOLTIP
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getNbtStringTooltip(ItemStack item)
|
||||||
|
{
|
||||||
|
Object nmsItemStack = ReflectionUtil.invokeMethod(this.methodCraftItemStackAsNmsCopy, null, item);
|
||||||
|
Object nbtTagCompound = ReflectionUtil.newInstance(this.classNmsNbtTagCompound);
|
||||||
|
nbtTagCompound = ReflectionUtil.invokeMethod(this.methodNmsItemStackSave, nmsItemStack, nbtTagCompound);
|
||||||
|
return nbtTagCompound.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,253 +0,0 @@
|
|||||||
package com.massivecraft.massivecore.nms;
|
|
||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
|
|
||||||
import com.massivecraft.massivecore.util.Txt;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.json.simple.JSONObject;
|
|
||||||
|
|
||||||
import com.massivecraft.massivecore.MassiveCore;
|
|
||||||
import com.massivecraft.massivecore.particleeffect.ReflectionUtils;
|
|
||||||
import com.massivecraft.massivecore.particleeffect.ReflectionUtils.PackageType;
|
|
||||||
|
|
||||||
public final class NmsPacket extends NmsAbstract
|
|
||||||
{
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// INSTANCE & CONSTRUCT
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
private static NmsPacket i = new NmsPacket();
|
|
||||||
public static NmsPacket get () { return i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// FIELDS
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
// The enums used to tell which packet it is.
|
|
||||||
// They correspond to the commands with the same name.
|
|
||||||
private static Class<?> titleEnumClass;
|
|
||||||
private static Enum<?> titleMainEnum;
|
|
||||||
private static Enum<?> titleSubEnum;
|
|
||||||
private static Enum<?> titleTimesEnum;
|
|
||||||
|
|
||||||
// Method used to prepare text so it can be sent
|
|
||||||
private static Method chatSerializer;
|
|
||||||
// The object we send instead of a string
|
|
||||||
private static Class<?> iChatBaseComponent;
|
|
||||||
|
|
||||||
// The title packet and its constructor
|
|
||||||
private static Constructor<?> titlePacketConstructor;
|
|
||||||
private static Constructor<?> titlePacketConstructorTimes;
|
|
||||||
|
|
||||||
// The chat packet and its constructors
|
|
||||||
private static Constructor<?> chatPacketConstructor;
|
|
||||||
private static Constructor<?> chatPacketActionbarConstructor;
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// OVERRIDE
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getRequiredVersion()
|
|
||||||
{
|
|
||||||
return 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void setup() throws Throwable
|
|
||||||
{
|
|
||||||
NmsBasics.get().require();
|
|
||||||
|
|
||||||
// The enum used for titles
|
|
||||||
titleEnumClass = getTitleEnumClass();
|
|
||||||
|
|
||||||
// Get the title enum values.
|
|
||||||
for (Object o : titleEnumClass.getEnumConstants())
|
|
||||||
{
|
|
||||||
Enum<?> e = (Enum<?>) o;
|
|
||||||
if (e.name().equalsIgnoreCase("TITLE")) titleMainEnum = e;
|
|
||||||
else if (e.name().equalsIgnoreCase("SUBTITLE")) titleSubEnum = e;
|
|
||||||
else if (e.name().equalsIgnoreCase("TIMES")) titleTimesEnum = e;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get chatserializer and chat component.
|
|
||||||
iChatBaseComponent = PackageType.MINECRAFT_SERVER.getClass("IChatBaseComponent");
|
|
||||||
|
|
||||||
chatSerializer = getChatSerializer();
|
|
||||||
|
|
||||||
// Get title packet and it's constructor
|
|
||||||
Class<?> titlePacketClass = PackageType.MINECRAFT_SERVER.getClass("PacketPlayOutTitle");
|
|
||||||
titlePacketConstructor = ReflectionUtils.getConstructor(titlePacketClass, titleEnumClass, iChatBaseComponent);
|
|
||||||
titlePacketConstructorTimes = ReflectionUtils.getConstructor(titlePacketClass, titleEnumClass, iChatBaseComponent, Integer.class, Integer.class, Integer.class);
|
|
||||||
|
|
||||||
// Get Chat packet and it's constructor
|
|
||||||
Class<?> chatPacketClass = PackageType.MINECRAFT_SERVER.getClass("PacketPlayOutChat");
|
|
||||||
chatPacketConstructor = ReflectionUtils.getConstructor(chatPacketClass, iChatBaseComponent);
|
|
||||||
chatPacketActionbarConstructor = ReflectionUtils.getConstructor(chatPacketClass, iChatBaseComponent, Byte.TYPE);
|
|
||||||
|
|
||||||
// Set accessible
|
|
||||||
setAllAccessible();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Class<?> getTitleEnumClass() throws ClassNotFoundException
|
|
||||||
{
|
|
||||||
Class<?> ret;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ret = titleEnumClass = PackageType.MINECRAFT_SERVER.getClass("EnumTitleAction");
|
|
||||||
}
|
|
||||||
catch (ClassNotFoundException e)
|
|
||||||
{
|
|
||||||
// Since 1.8.3
|
|
||||||
ret = titleEnumClass = PackageType.MINECRAFT_SERVER.getClass("PacketPlayOutTitle$EnumTitleAction");
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Method getChatSerializer() throws Exception
|
|
||||||
{
|
|
||||||
Method ret;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ret = chatSerializer = PackageType.MINECRAFT_SERVER.getClass("ChatSerializer").getDeclaredMethod("a", String.class);
|
|
||||||
}
|
|
||||||
catch (ClassNotFoundException e)
|
|
||||||
{
|
|
||||||
// Since 1.8.3
|
|
||||||
ret = chatSerializer = PackageType.MINECRAFT_SERVER.getClass("IChatBaseComponent$ChatSerializer").getDeclaredMethod("a", String.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setAllAccessible()
|
|
||||||
{
|
|
||||||
chatSerializer.setAccessible(true);
|
|
||||||
titlePacketConstructor.setAccessible(true);
|
|
||||||
titlePacketConstructorTimes.setAccessible(true);
|
|
||||||
chatPacketConstructor.setAccessible(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// SEND TITLES
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public static boolean sendTitle(Player player, int ticksIn, int ticksStay, int ticksOut, String titleMain, String titleSub)
|
|
||||||
{
|
|
||||||
if ( ! get().isAvailable()) return false;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// Fadein, stay, fadeout
|
|
||||||
Object timesPacket = titlePacketConstructorTimes.newInstance(titleTimesEnum, null, ticksIn, ticksStay, ticksOut);
|
|
||||||
|
|
||||||
NmsBasics.get().sendPacket(player, timesPacket);
|
|
||||||
|
|
||||||
if (titleMain != null)
|
|
||||||
{
|
|
||||||
// Title
|
|
||||||
Object titleMainChat = toChatBaseComponent(titleMain);
|
|
||||||
Object titleMainPacket = titlePacketConstructor.newInstance(titleMainEnum, titleMainChat);
|
|
||||||
|
|
||||||
NmsBasics.get().sendPacket(player, titleMainPacket);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (titleSub != null)
|
|
||||||
{
|
|
||||||
// SubTitle
|
|
||||||
Object titleSubChat = toChatBaseComponent(titleSub);
|
|
||||||
Object titleSubPacket = titlePacketConstructor.newInstance(titleSubEnum, titleSubChat);
|
|
||||||
|
|
||||||
NmsBasics.get().sendPacket(player, titleSubPacket);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
MassiveCore.get().log(Txt.parse("<b>Sending title failed!"));
|
|
||||||
ex.printStackTrace();
|
|
||||||
// So we failed, didn't work.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//It worked.
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// SEND RAW
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public static boolean sendRaw(Player player, String string)
|
|
||||||
{
|
|
||||||
if ( ! get().isAvailable()) return false;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Object rawChat = toChatBaseComponent(string);
|
|
||||||
Object chatPacket = chatPacketConstructor.newInstance(rawChat);
|
|
||||||
|
|
||||||
NmsBasics.get().sendPacket(player, chatPacket);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
MassiveCore.get().log(Txt.parse("<b>Sending raw chat failed!"));
|
|
||||||
ex.printStackTrace();
|
|
||||||
// So we failed and it didn't work.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// SEND ACTIONBAR
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public static boolean sendActionbar(Player player, String string)
|
|
||||||
{
|
|
||||||
if ( ! get().isAvailable()) return false;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Object actionbar = toChatBaseComponent(string);
|
|
||||||
Object chatPacket = chatPacketActionbarConstructor.newInstance(actionbar, (byte) 2);
|
|
||||||
|
|
||||||
NmsBasics.get().sendPacket(player, chatPacket);
|
|
||||||
}
|
|
||||||
catch(Exception ex)
|
|
||||||
{
|
|
||||||
MassiveCore.get().log(Txt.parse("<b>Sending actionbar failed!"));
|
|
||||||
ex.printStackTrace();
|
|
||||||
// So we failed and it didn't work.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// UTIL
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public static Object toChatBaseComponent(String str) throws Exception
|
|
||||||
{
|
|
||||||
return chatSerializer.invoke(null, str);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// JSON
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public static String toJson(String str)
|
|
||||||
{
|
|
||||||
str = JSONObject.escape(str);
|
|
||||||
|
|
||||||
str = "{\"text\": \"" + str + "\"}";
|
|
||||||
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
90
src/com/massivecraft/massivecore/nms/NmsSkullMeta.java
Normal file
90
src/com/massivecraft/massivecore/nms/NmsSkullMeta.java
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.bukkit.inventory.meta.SkullMeta;
|
||||||
|
|
||||||
|
import com.massivecraft.massivecore.Couple;
|
||||||
|
import com.massivecraft.massivecore.mixin.Mixin;
|
||||||
|
import com.massivecraft.massivecore.util.IdData;
|
||||||
|
import com.massivecraft.massivecore.util.IdUtil;
|
||||||
|
import com.massivecraft.massivecore.util.MUtil;
|
||||||
|
|
||||||
|
public class NmsSkullMeta extends Mixin
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// DEFAULT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsSkullMeta d = new NmsSkullMeta().setAlternatives(
|
||||||
|
NmsSkullMeta18R1P.class,
|
||||||
|
NmsSkullMeta17R4.class,
|
||||||
|
NmsSkullMetaFallback.class
|
||||||
|
);
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INSTANCE & CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsSkullMeta i = d;
|
||||||
|
public static NmsSkullMeta get() { return i; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// RAW
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public String getName(SkullMeta meta)
|
||||||
|
{
|
||||||
|
// throw notImplemented();
|
||||||
|
return meta.getOwner();
|
||||||
|
// NOTE: This one is actually this simple.
|
||||||
|
// Bukkit does all the work for us.
|
||||||
|
}
|
||||||
|
|
||||||
|
public UUID getId(SkullMeta meta)
|
||||||
|
{
|
||||||
|
throw notImplemented();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void set(SkullMeta meta, String name, UUID id)
|
||||||
|
{
|
||||||
|
throw notImplemented();
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// RESOLVE
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// We resolve the locally best possible information using IdUtil.
|
||||||
|
|
||||||
|
public Couple<String, UUID> resolve(SkullMeta meta)
|
||||||
|
{
|
||||||
|
String name = this.getName(meta);
|
||||||
|
UUID id = this.getId(meta);
|
||||||
|
return this.resolve(name, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Couple<String, UUID> resolve(String name, UUID id)
|
||||||
|
{
|
||||||
|
// Create Ret
|
||||||
|
// We default to the input.
|
||||||
|
String retName = name;
|
||||||
|
UUID retId = id;
|
||||||
|
|
||||||
|
// Fetch IdData
|
||||||
|
// First by name then id.
|
||||||
|
IdData data = null;
|
||||||
|
if (name != null) data = IdUtil.getNameToData().get(name);
|
||||||
|
if (data == null && id != null) data = IdUtil.getIdToData().get(id.toString());
|
||||||
|
|
||||||
|
// Use that data if found
|
||||||
|
if (data != null)
|
||||||
|
{
|
||||||
|
retName = data.getName();
|
||||||
|
retId = MUtil.asUuid(data.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return Ret
|
||||||
|
return new Couple<String, UUID>(retName, retId);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
21
src/com/massivecraft/massivecore/nms/NmsSkullMeta17R4.java
Normal file
21
src/com/massivecraft/massivecore/nms/NmsSkullMeta17R4.java
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
|
public class NmsSkullMeta17R4 extends NmsSkullMetaAbstract
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INSTANCE & CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsSkullMeta17R4 i = new NmsSkullMeta17R4();
|
||||||
|
public static NmsSkullMeta17R4 get () { return i; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// GAME PROFILE CLASS NAME
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public String getGameProfileClassName()
|
||||||
|
{
|
||||||
|
return "net.minecraft.util.com.mojang.authlib.GameProfile";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
21
src/com/massivecraft/massivecore/nms/NmsSkullMeta18R1P.java
Normal file
21
src/com/massivecraft/massivecore/nms/NmsSkullMeta18R1P.java
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
|
public class NmsSkullMeta18R1P extends NmsSkullMetaAbstract
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INSTANCE & CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsSkullMeta18R1P i = new NmsSkullMeta18R1P();
|
||||||
|
public static NmsSkullMeta18R1P get () { return i; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// GAME PROFILE CLASS NAME
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public String getGameProfileClassName()
|
||||||
|
{
|
||||||
|
return "com.mojang.authlib.GameProfile";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
115
src/com/massivecraft/massivecore/nms/NmsSkullMetaAbstract.java
Normal file
115
src/com/massivecraft/massivecore/nms/NmsSkullMetaAbstract.java
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.bukkit.inventory.meta.SkullMeta;
|
||||||
|
|
||||||
|
import com.massivecraft.massivecore.particleeffect.ReflectionUtils.PackageType;
|
||||||
|
import com.massivecraft.massivecore.util.ReflectionUtil;
|
||||||
|
|
||||||
|
public abstract class NmsSkullMetaAbstract extends NmsSkullMeta
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// FIELDS
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
// org.bukkit.craftbukkit.inventory.CraftMetaSkull
|
||||||
|
public Class<?> classCraftMetaSkull;
|
||||||
|
// org.bukkit.craftbukkit.inventory.CraftMetaSkull#profile
|
||||||
|
public Field fieldCraftMetaSkullProfile;
|
||||||
|
|
||||||
|
// 17R4: net.minecraft.util.com.mojang.authlib.GameProfile
|
||||||
|
// 18R1P: com.mojang.authlib.GameProfile
|
||||||
|
public Class<?> classGameProfile;
|
||||||
|
// ...#id
|
||||||
|
public Field fieldGameProfileId;
|
||||||
|
// ..#name
|
||||||
|
public Field fieldGameProfileName;
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// GAME PROFILE CLASS NAME
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public abstract String getGameProfileClassName();
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// SETUP
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setup() throws Throwable
|
||||||
|
{
|
||||||
|
this.classCraftMetaSkull = PackageType.CRAFTBUKKIT_INVENTORY.getClass("CraftMetaSkull");
|
||||||
|
this.fieldCraftMetaSkullProfile = ReflectionUtil.getField(this.classCraftMetaSkull, "profile");
|
||||||
|
|
||||||
|
this.classGameProfile = Class.forName(this.getGameProfileClassName());
|
||||||
|
this.fieldGameProfileId = ReflectionUtil.getField(this.classGameProfile, "id");
|
||||||
|
this.fieldGameProfileName = ReflectionUtil.getField(this.classGameProfile, "name");
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// RAW
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UUID getId(SkullMeta meta)
|
||||||
|
{
|
||||||
|
Object gameProfile = getGameProfile(meta);
|
||||||
|
if (gameProfile == null) return null;
|
||||||
|
return getGameProfileId(gameProfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void set(SkullMeta meta, String name, UUID id)
|
||||||
|
{
|
||||||
|
meta.setOwner(name != null ? name : "asdf");
|
||||||
|
|
||||||
|
Object gameProfile = getGameProfile(meta);
|
||||||
|
setGameProfileName(gameProfile, name);
|
||||||
|
setGameProfileId(gameProfile, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// GAMEPROFILE
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
protected <T> T getGameProfile(SkullMeta meta)
|
||||||
|
{
|
||||||
|
return ReflectionUtil.getField(this.fieldCraftMetaSkullProfile, meta);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setGameProfile(SkullMeta meta, Object gameProfile)
|
||||||
|
{
|
||||||
|
ReflectionUtil.setField(this.fieldCraftMetaSkullProfile, meta, gameProfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// GAMEPROFILE > GET
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
protected String getGameProfileName(Object gameProfile)
|
||||||
|
{
|
||||||
|
return ReflectionUtil.getField(this.fieldGameProfileName, gameProfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected UUID getGameProfileId(Object gameProfile)
|
||||||
|
{
|
||||||
|
return ReflectionUtil.getField(this.fieldGameProfileId, gameProfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// GAMEPROFILE > SET
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
protected void setGameProfileName(Object gameProfile, String name)
|
||||||
|
{
|
||||||
|
ReflectionUtil.setField(this.fieldGameProfileName, gameProfile, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setGameProfileId(Object gameProfile, UUID id)
|
||||||
|
{
|
||||||
|
ReflectionUtil.setField(this.fieldGameProfileId, gameProfile, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.bukkit.inventory.meta.SkullMeta;
|
||||||
|
|
||||||
|
public class NmsSkullMetaFallback extends NmsSkullMeta
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INSTANCE & CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsSkullMetaFallback i = new NmsSkullMetaFallback();
|
||||||
|
public static NmsSkullMetaFallback get () { return i; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// RAW
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UUID getId(SkullMeta meta)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void set(SkullMeta meta, String name, UUID id)
|
||||||
|
{
|
||||||
|
meta.setOwner(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -194,6 +194,23 @@ public class ReflectionUtil
|
|||||||
return (T) invokeConstructor(constructor, EMPTY_ARRAY_OF_OBJECT);
|
return (T) invokeConstructor(constructor, EMPTY_ARRAY_OF_OBJECT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// NEW INSTANCE
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static <T> T newInstance(Class<?> clazz)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return (T) clazz.newInstance();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
throw asRuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// SINGLETON INSTANCE
|
// SINGLETON INSTANCE
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
Loading…
Reference in New Issue
Block a user