Mixin Improvement Step 1
This commit is contained in:
parent
053a54190a
commit
3f46a3bfac
@ -70,12 +70,12 @@ public class Integration extends Engine
|
|||||||
|
|
||||||
this.integrationActive = integrationActive;
|
this.integrationActive = integrationActive;
|
||||||
|
|
||||||
String message = Txt.parse(integrationActive ? "<g>Activated Integration <h>%s" : "<b>Deactivated Integration <h>%s", this.getName());
|
String message = Txt.parse(integrationActive ? "<g>Integration Activated <h>%s" : "<b>Integration Deactivated <h>%s", this.getName());
|
||||||
this.getPlugin().log(message);
|
this.getPlugin().log(message);
|
||||||
}
|
}
|
||||||
catch (Throwable t)
|
catch (Throwable t)
|
||||||
{
|
{
|
||||||
String message = Txt.parse(integrationActive ? "<b>Activating Integration <h>%s<b> FAILED:" : "<b>Deactivating Integration <h>%s<b> FAILED:", this.getName());
|
String message = Txt.parse(integrationActive ? "<b>Integration Activation <h>%s<b> FAILED:" : "<b>Integration Deactivation <h>%s<b> FAILED:", this.getName());
|
||||||
this.getPlugin().log(message);
|
this.getPlugin().log(message);
|
||||||
t.printStackTrace();
|
t.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -84,7 +84,11 @@ import com.massivecraft.massivecore.mixin.MixinVisibility;
|
|||||||
import com.massivecraft.massivecore.mixin.MixinWorld;
|
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.NmsItemStack;
|
import com.massivecraft.massivecore.nms.NmsBasics;
|
||||||
|
import com.massivecraft.massivecore.nms.NmsEntityGet;
|
||||||
|
import com.massivecraft.massivecore.nms.NmsItemStackCreate;
|
||||||
|
import com.massivecraft.massivecore.nms.NmsItemStackCreate17R4P;
|
||||||
|
import com.massivecraft.massivecore.nms.NmsPlayerInventoryCreate;
|
||||||
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;
|
||||||
@ -187,7 +191,7 @@ public class MassiveCore extends MassivePlugin
|
|||||||
|
|
||||||
// ItemStack
|
// ItemStack
|
||||||
ret.registerTypeAdapter(ItemStack.class, AdapterItemStack.get());
|
ret.registerTypeAdapter(ItemStack.class, AdapterItemStack.get());
|
||||||
Class<?> classCraftItemStack = NmsItemStack.get().classCraftItemStack;
|
Class<?> classCraftItemStack = NmsItemStackCreate17R4P.getClassCraftItemStackCatch();
|
||||||
if (classCraftItemStack != null) ret.registerTypeAdapter(classCraftItemStack, AdapterItemStack.get());
|
if (classCraftItemStack != null) ret.registerTypeAdapter(classCraftItemStack, AdapterItemStack.get());
|
||||||
|
|
||||||
// Inventory
|
// Inventory
|
||||||
@ -246,6 +250,12 @@ public class MassiveCore extends MassivePlugin
|
|||||||
MassiveCoreMConfColl.class,
|
MassiveCoreMConfColl.class,
|
||||||
MassiveCoreMSponsorInfoColl.class,
|
MassiveCoreMSponsorInfoColl.class,
|
||||||
|
|
||||||
|
// Nms
|
||||||
|
NmsBasics.class,
|
||||||
|
NmsEntityGet.class,
|
||||||
|
NmsItemStackCreate.class,
|
||||||
|
NmsPlayerInventoryCreate.class,
|
||||||
|
|
||||||
// Writer,
|
// Writer,
|
||||||
WriterItemStack.class,
|
WriterItemStack.class,
|
||||||
|
|
||||||
@ -308,13 +318,6 @@ public class MassiveCore extends MassivePlugin
|
|||||||
// Delete Files (at once and additionally after all plugins loaded)
|
// Delete Files (at once and additionally after all plugins loaded)
|
||||||
MassiveCoreTaskDeleteFiles.get().run();
|
MassiveCoreTaskDeleteFiles.get().run();
|
||||||
Bukkit.getScheduler().scheduleSyncDelayedTask(this, MassiveCoreTaskDeleteFiles.get());
|
Bukkit.getScheduler().scheduleSyncDelayedTask(this, MassiveCoreTaskDeleteFiles.get());
|
||||||
|
|
||||||
// TEST
|
|
||||||
//PickerTest.get().action();
|
|
||||||
//this.activate(
|
|
||||||
// PickerTest.class
|
|
||||||
//);
|
|
||||||
//PickerTest.get().action();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -3,7 +3,7 @@ package com.massivecraft.massivecore.item;
|
|||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import com.massivecraft.massivecore.nms.NmsItemStack;
|
import com.massivecraft.massivecore.nms.NmsItemStackCreate;
|
||||||
|
|
||||||
public abstract class WriterAbstractItemStack<OB, CB, FA, FB> extends WriterAbstract<DataItemStack, OB, DataItemStack, CB, FA, FB, ItemStack>
|
public abstract class WriterAbstractItemStack<OB, CB, FA, FB> extends WriterAbstract<DataItemStack, OB, DataItemStack, CB, FA, FB, ItemStack>
|
||||||
{
|
{
|
||||||
@ -47,7 +47,7 @@ public abstract class WriterAbstractItemStack<OB, CB, FA, FB> extends WriterAbst
|
|||||||
|
|
||||||
public ItemStack createItemStack()
|
public ItemStack createItemStack()
|
||||||
{
|
{
|
||||||
ItemStack ret = NmsItemStack.get().createItemStack();
|
ItemStack ret = NmsItemStackCreate.get().create();
|
||||||
ret.setType(this.getMaterial());
|
ret.setType(this.getMaterial());
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
221
src/com/massivecraft/massivecore/mixin/Mixin.java
Normal file
221
src/com/massivecraft/massivecore/mixin/Mixin.java
Normal file
@ -0,0 +1,221 @@
|
|||||||
|
package com.massivecraft.massivecore.mixin;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.massivecraft.massivecore.Engine;
|
||||||
|
import com.massivecraft.massivecore.collections.MassiveList;
|
||||||
|
import com.massivecraft.massivecore.collections.MassiveMap;
|
||||||
|
import com.massivecraft.massivecore.util.ReflectionUtil;
|
||||||
|
import com.massivecraft.massivecore.util.Txt;
|
||||||
|
|
||||||
|
public class Mixin extends Engine
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// DEFAULT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// The default class contains the static fields.
|
||||||
|
// It should never be abstract and should always be compatible.
|
||||||
|
// A default class instance is set as the default value. This avoids null.
|
||||||
|
// It is detected by the required static field d.
|
||||||
|
|
||||||
|
private final Class<?> defaultClass = ReflectionUtil.getSuperclassDeclaringField(this.getClass(), true, "d");
|
||||||
|
public Class<?> getDefaultClass() { return this.defaultClass; }
|
||||||
|
|
||||||
|
private Mixin defaultInstance = null;
|
||||||
|
public Mixin getDefault()
|
||||||
|
{
|
||||||
|
if (this.defaultInstance == null) this.defaultInstance = ReflectionUtil.getField(this.getDefaultClass(), "d", null);
|
||||||
|
return this.defaultInstance;
|
||||||
|
}
|
||||||
|
public boolean isDefault() { return this == this.getDefault(); }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INSTANCE
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// Access the active static instance using instance methods.
|
||||||
|
// This looks a bit strange but will save us a lot of repetitive source code down the road.
|
||||||
|
// These are not meant to be used for selection or activation.
|
||||||
|
// The standard active interface methods are used for that.
|
||||||
|
|
||||||
|
public Mixin getInstance() { return ReflectionUtil.getField(this.getDefaultClass(), "i", null); }
|
||||||
|
public void setInstance(Mixin i) { ReflectionUtil.setField(this.getDefaultClass(), "i", null, i); }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// FIELDS
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
// This is the base name.
|
||||||
|
// It should describe the function supplied.
|
||||||
|
// It should be set in the base class constructor.
|
||||||
|
private String baseName = this.getDefaultClass().getSimpleName();
|
||||||
|
public String getBaseName() { return this.baseName; }
|
||||||
|
public void setBaseName(String baseName) { this.baseName = baseName; }
|
||||||
|
|
||||||
|
// This is the instance specific name.
|
||||||
|
// It should describe the circumstances for compatibility.
|
||||||
|
// It could for example contain a version number.
|
||||||
|
private String name = this.createName();
|
||||||
|
public String getName() { return this.name; }
|
||||||
|
public void setName(String name) { this.name = name; }
|
||||||
|
|
||||||
|
// Is the Default counted as the Mixin being available?
|
||||||
|
// And based off that information are we available?
|
||||||
|
// NOTE: This field must be set in the default constructor!
|
||||||
|
private Boolean availableDefault = null;
|
||||||
|
public boolean isAvailableDefault() { return (this.availableDefault != null ? this.availableDefault : this.getDefault().getAlternatives().isEmpty()); }
|
||||||
|
public void setAvailableDefault(boolean availableDefault) { this.setAvailableDefault(availableDefault); }
|
||||||
|
public boolean isAvailable() { return this.isAvailableDefault() || this.getInstance() != this.getDefault(); }
|
||||||
|
public void require() { if (this.isAvailable()) return; throw new IllegalStateException(this.getBaseName() + " is Required"); }
|
||||||
|
|
||||||
|
// This is the list of alternatives to choose from.
|
||||||
|
// The first compatible alternative will be chosen for activation.
|
||||||
|
// The list should thus start with the most provoking and detailed alternative.
|
||||||
|
// If the list is empty we simply offer ourselves.
|
||||||
|
private List<Class<?>> alternatives = new MassiveList<>();
|
||||||
|
public List<Class<?>> getAlternatives() { return this.alternatives; }
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public <T extends Mixin> T setAlternatives(List<Class<?>> alternatives) { this.alternatives = alternatives; return (T) this; }
|
||||||
|
public <T extends Mixin> T setAlternatives(Class<?>... alternatives) { return this.setAlternatives(Arrays.asList(alternatives)); }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public Mixin()
|
||||||
|
{
|
||||||
|
// Setup
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.provoke();
|
||||||
|
this.setup();
|
||||||
|
}
|
||||||
|
catch (Throwable t)
|
||||||
|
{
|
||||||
|
throw ReflectionUtil.asRuntimeException(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// PROVOKE
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// This method is run from the constructor.
|
||||||
|
// It may throw upon incompatibility.
|
||||||
|
// --> Returns an object for easier provoking.
|
||||||
|
|
||||||
|
public Object provoke() throws Throwable
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// SETUP
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// This method is run from the constructor.
|
||||||
|
// It may throw upon incompatibility.
|
||||||
|
// --> Does not return anything.
|
||||||
|
|
||||||
|
public void setup() throws Throwable
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// ACTIVE
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// We need to modify the active logic sightly.
|
||||||
|
//
|
||||||
|
// We make use of the standard engine isActive.
|
||||||
|
// That one looks at the engine registry and does not care about the instance.
|
||||||
|
// That behavior tends to work out well for us in this case.
|
||||||
|
//
|
||||||
|
// The reason for this is that the default will be set as the instance from the start.
|
||||||
|
// That does however not mean that it's active.
|
||||||
|
// It means it will be used to set the active which may or may not be itself.
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setActive(boolean active)
|
||||||
|
{
|
||||||
|
// NoChange
|
||||||
|
if (this.isActive() == active) return;
|
||||||
|
|
||||||
|
// Before and After
|
||||||
|
Mixin before = this.getInstance();
|
||||||
|
Mixin after = (active ? ReflectionUtil.getSingletonInstanceFirstCombatible(this.getAlternatives(), this) : this.getDefault());
|
||||||
|
before.setPluginSoft(this.getPlugin());
|
||||||
|
after.setPluginSoft(this.getPlugin());
|
||||||
|
|
||||||
|
// Deactivate Before
|
||||||
|
if (before != this) before.setActive(false);
|
||||||
|
|
||||||
|
// Set Instance
|
||||||
|
this.setInstance(after);
|
||||||
|
|
||||||
|
// Activate After
|
||||||
|
if (after != this) after.setActive(true);
|
||||||
|
|
||||||
|
// This
|
||||||
|
if (after != this) return;
|
||||||
|
|
||||||
|
// Inform
|
||||||
|
String message = Txt.parse("<i>Mixin <h>%s<i> set to <h>%s", this.getBaseName(), this.getName());
|
||||||
|
after.getPlugin().log(message);
|
||||||
|
|
||||||
|
// Super
|
||||||
|
super.setActive(active);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// NOT IMPLEMENTED
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public RuntimeException notImplemented()
|
||||||
|
{
|
||||||
|
return new UnsupportedOperationException("not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// CREATE NAME
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static final Map<String, String> NAME_MAP = new MassiveMap<>(
|
||||||
|
"", "Default",
|
||||||
|
"Fallback", "Fallback (Generic and Weaker)",
|
||||||
|
|
||||||
|
"17R4", "Minecraft 1.7.10 [1_7_R4]",
|
||||||
|
"17R4P", "Minecraft 1.7.10+ [1_7_R4+]",
|
||||||
|
|
||||||
|
"18R1", "Minecraft 1.8.0 --> 1.8.2 [1_8_R1]",
|
||||||
|
"18R1P", "Minecraft 1.8.0+ [1_8_R1+]",
|
||||||
|
|
||||||
|
"18R2", "Minecraft 1.8.3 [1_8_R2]",
|
||||||
|
"18R2P", "Minecraft 1.8.3+ [1_8_R2+]",
|
||||||
|
|
||||||
|
"18R3", "Minecraft 1.8.4 --> 1.8.9 [1_8_R3]",
|
||||||
|
"18R3P", "Minecraft 1.8.4+ [1_8_R3+]",
|
||||||
|
|
||||||
|
"19R1", "Minecraft 1.9.0 --> 1.9.3 [1_9_R1]",
|
||||||
|
"19R1P", "Minecraft 1.9.0+ [1_9_R1+]",
|
||||||
|
|
||||||
|
"19R2", "Minecraft 1.9.4 --> ? [1_9_R2]",
|
||||||
|
"19R2P", "Minecraft 1.9.4+ [1_9_R2+]"
|
||||||
|
);
|
||||||
|
|
||||||
|
public String createName()
|
||||||
|
{
|
||||||
|
// Create
|
||||||
|
String ret = this.getClass().getSimpleName();
|
||||||
|
|
||||||
|
// Tweak
|
||||||
|
String baseName = this.getBaseName();
|
||||||
|
if (ret.startsWith(baseName)) ret = ret.substring(baseName.length());
|
||||||
|
|
||||||
|
String name = NAME_MAP.get(ret);
|
||||||
|
if (name != null) ret = name;
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,39 +0,0 @@
|
|||||||
package com.massivecraft.massivecore.mixin;
|
|
||||||
|
|
||||||
import com.massivecraft.massivecore.Engine;
|
|
||||||
import com.massivecraft.massivecore.util.ReflectionUtil;
|
|
||||||
|
|
||||||
public class MixinAbstract extends Engine
|
|
||||||
{
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// STATIC REFLECTION
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
private Class<?> clazz = ReflectionUtil.getSuperclassDeclaringField(this.getClass(), true, "d");
|
|
||||||
public MixinAbstract getDefault() { return ReflectionUtil.getField(this.clazz, "d", null); }
|
|
||||||
public MixinAbstract getInstance() { return ReflectionUtil.getField(this.clazz, "i", null); }
|
|
||||||
public void setInstance(MixinAbstract i) { ReflectionUtil.setField(this.clazz, "i", null, i); }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// ACTIVE
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isActive()
|
|
||||||
{
|
|
||||||
return this.getInstance() == this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setActive(boolean active)
|
|
||||||
{
|
|
||||||
this.setActiveMixin(active);
|
|
||||||
super.setActive(active);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setActiveMixin(boolean active)
|
|
||||||
{
|
|
||||||
this.setInstance(active ? this : this.getDefault());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -6,7 +6,7 @@ import com.massivecraft.massivecore.nms.NmsPacket;
|
|||||||
import com.massivecraft.massivecore.util.IdUtil;
|
import com.massivecraft.massivecore.util.IdUtil;
|
||||||
import com.massivecraft.massivecore.util.Txt;
|
import com.massivecraft.massivecore.util.Txt;
|
||||||
|
|
||||||
public class MixinActionbar extends MixinAbstract
|
public class MixinActionbar extends Mixin
|
||||||
{
|
{
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// INSTANCE & CONSTRUCT
|
// INSTANCE & CONSTRUCT
|
||||||
@ -15,7 +15,6 @@ public class MixinActionbar extends MixinAbstract
|
|||||||
private static MixinActionbar d = new MixinActionbar();
|
private static MixinActionbar d = new MixinActionbar();
|
||||||
private static MixinActionbar i = d;
|
private static MixinActionbar i = d;
|
||||||
public static MixinActionbar get() { return i; }
|
public static MixinActionbar get() { return i; }
|
||||||
public static void set(MixinActionbar i) { MixinActionbar.i = i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// METHODS
|
// METHODS
|
||||||
|
@ -4,7 +4,7 @@ import org.bukkit.event.player.PlayerJoinEvent;
|
|||||||
|
|
||||||
import com.massivecraft.massivecore.event.EventMassiveCorePlayerLeave;
|
import com.massivecraft.massivecore.event.EventMassiveCorePlayerLeave;
|
||||||
|
|
||||||
public class MixinActual extends MixinAbstract
|
public class MixinActual extends Mixin
|
||||||
{
|
{
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// INSTANCE & CONSTRUCT
|
// INSTANCE & CONSTRUCT
|
||||||
@ -13,7 +13,6 @@ public class MixinActual extends MixinAbstract
|
|||||||
private static MixinActual d = new MixinActual();
|
private static MixinActual d = new MixinActual();
|
||||||
private static MixinActual i = d;
|
private static MixinActual i = d;
|
||||||
public static MixinActual get() { return i; }
|
public static MixinActual get() { return i; }
|
||||||
public static void set(MixinActual i) { MixinActual.i = i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// METHODS
|
// METHODS
|
||||||
|
@ -4,7 +4,7 @@ import org.bukkit.Bukkit;
|
|||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import com.massivecraft.massivecore.util.IdUtil;
|
import com.massivecraft.massivecore.util.IdUtil;
|
||||||
|
|
||||||
public class MixinCommand extends MixinAbstract
|
public class MixinCommand extends Mixin
|
||||||
{
|
{
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// INSTANCE & CONSTRUCT
|
// INSTANCE & CONSTRUCT
|
||||||
@ -13,7 +13,6 @@ public class MixinCommand extends MixinAbstract
|
|||||||
private static MixinCommand d = new MixinCommand();
|
private static MixinCommand d = new MixinCommand();
|
||||||
private static MixinCommand i = d;
|
private static MixinCommand i = d;
|
||||||
public static MixinCommand get() { return i; }
|
public static MixinCommand get() { return i; }
|
||||||
public static void set(MixinCommand i) { MixinCommand.i = i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// METHODS
|
// METHODS
|
||||||
|
@ -5,7 +5,7 @@ import org.bukkit.entity.Player;
|
|||||||
import com.massivecraft.massivecore.mson.Mson;
|
import com.massivecraft.massivecore.mson.Mson;
|
||||||
import com.massivecraft.massivecore.util.IdUtil;
|
import com.massivecraft.massivecore.util.IdUtil;
|
||||||
|
|
||||||
public class MixinDisplayName extends MixinAbstract
|
public class MixinDisplayName extends Mixin
|
||||||
{
|
{
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// INSTANCE & CONSTRUCT
|
// INSTANCE & CONSTRUCT
|
||||||
@ -14,7 +14,6 @@ public class MixinDisplayName extends MixinAbstract
|
|||||||
private static MixinDisplayName d = new MixinDisplayName();
|
private static MixinDisplayName d = new MixinDisplayName();
|
||||||
private static MixinDisplayName i = d;
|
private static MixinDisplayName i = d;
|
||||||
public static MixinDisplayName get() { return i; }
|
public static MixinDisplayName get() { return i; }
|
||||||
public static void set(MixinDisplayName i) { MixinDisplayName.i = i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// METHODS
|
// METHODS
|
||||||
|
@ -5,7 +5,7 @@ import java.io.Serializable;
|
|||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.event.Event;
|
import org.bukkit.event.Event;
|
||||||
|
|
||||||
public class MixinEvent extends MixinAbstract
|
public class MixinEvent extends Mixin
|
||||||
{
|
{
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// INSTANCE & CONSTRUCT
|
// INSTANCE & CONSTRUCT
|
||||||
@ -14,7 +14,6 @@ public class MixinEvent extends MixinAbstract
|
|||||||
private static MixinEvent d = new MixinEvent();
|
private static MixinEvent d = new MixinEvent();
|
||||||
private static MixinEvent i = d;
|
private static MixinEvent i = d;
|
||||||
public static MixinEvent get() { return i; }
|
public static MixinEvent get() { return i; }
|
||||||
public static void set(MixinEvent i) { MixinEvent.i = i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// METHODS
|
// METHODS
|
||||||
|
@ -5,7 +5,7 @@ import org.bukkit.entity.Player;
|
|||||||
|
|
||||||
import com.massivecraft.massivecore.util.IdUtil;
|
import com.massivecraft.massivecore.util.IdUtil;
|
||||||
|
|
||||||
public class MixinGamemode extends MixinAbstract
|
public class MixinGamemode extends Mixin
|
||||||
{
|
{
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// INSTANCE & CONSTRUCT
|
// INSTANCE & CONSTRUCT
|
||||||
@ -14,7 +14,6 @@ public class MixinGamemode extends MixinAbstract
|
|||||||
private static MixinGamemode d = new MixinGamemode();
|
private static MixinGamemode d = new MixinGamemode();
|
||||||
private static MixinGamemode i = d;
|
private static MixinGamemode i = d;
|
||||||
public static MixinGamemode get() { return i; }
|
public static MixinGamemode get() { return i; }
|
||||||
public static void set(MixinGamemode i) { MixinGamemode.i = i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// METHODS
|
// METHODS
|
||||||
|
@ -5,9 +5,9 @@ import org.bukkit.inventory.Inventory;
|
|||||||
import org.bukkit.inventory.InventoryHolder;
|
import org.bukkit.inventory.InventoryHolder;
|
||||||
import org.bukkit.inventory.PlayerInventory;
|
import org.bukkit.inventory.PlayerInventory;
|
||||||
|
|
||||||
import com.massivecraft.massivecore.nms.NmsInventory;
|
import com.massivecraft.massivecore.nms.NmsPlayerInventoryCreate;
|
||||||
|
|
||||||
public class MixinInventory extends MixinAbstract
|
public class MixinInventory extends Mixin
|
||||||
{
|
{
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// INSTANCE & CONSTRUCT
|
// INSTANCE & CONSTRUCT
|
||||||
@ -16,7 +16,6 @@ public class MixinInventory extends MixinAbstract
|
|||||||
private static MixinInventory d = new MixinInventory();
|
private static MixinInventory d = new MixinInventory();
|
||||||
private static MixinInventory i = d;
|
private static MixinInventory i = d;
|
||||||
public static MixinInventory get() { return i; }
|
public static MixinInventory get() { return i; }
|
||||||
public static void set(MixinInventory i) { MixinInventory.i = i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// METHODS
|
// METHODS
|
||||||
@ -24,7 +23,9 @@ public class MixinInventory extends MixinAbstract
|
|||||||
|
|
||||||
public PlayerInventory createPlayerInventory()
|
public PlayerInventory createPlayerInventory()
|
||||||
{
|
{
|
||||||
return NmsInventory.createPlayerInventory();
|
NmsPlayerInventoryCreate nmsPlayerInventory = NmsPlayerInventoryCreate.get();
|
||||||
|
if ( ! nmsPlayerInventory.isAvailable()) return null;
|
||||||
|
return nmsPlayerInventory.create();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Inventory createInventory(InventoryHolder holder, int size, String title)
|
public Inventory createInventory(InventoryHolder holder, int size, String title)
|
||||||
|
@ -4,7 +4,7 @@ import org.bukkit.entity.Player;
|
|||||||
|
|
||||||
import com.massivecraft.massivecore.util.IdUtil;
|
import com.massivecraft.massivecore.util.IdUtil;
|
||||||
|
|
||||||
public class MixinKick extends MixinAbstract
|
public class MixinKick extends Mixin
|
||||||
{
|
{
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// INSTANCE & CONSTRUCT
|
// INSTANCE & CONSTRUCT
|
||||||
@ -13,7 +13,6 @@ public class MixinKick extends MixinAbstract
|
|||||||
private static MixinKick d = new MixinKick();
|
private static MixinKick d = new MixinKick();
|
||||||
private static MixinKick i = d;
|
private static MixinKick i = d;
|
||||||
public static MixinKick get() { return i; }
|
public static MixinKick get() { return i; }
|
||||||
public static void set(MixinKick i) { MixinKick.i = i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// METHODS
|
// METHODS
|
||||||
|
@ -13,7 +13,7 @@ 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;
|
||||||
|
|
||||||
public class MixinMessage extends MixinAbstract
|
public class MixinMessage extends Mixin
|
||||||
{
|
{
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// INSTANCE & CONSTRUCT
|
// INSTANCE & CONSTRUCT
|
||||||
@ -22,7 +22,6 @@ public class MixinMessage extends MixinAbstract
|
|||||||
private static MixinMessage d = new MixinMessage();
|
private static MixinMessage d = new MixinMessage();
|
||||||
private static MixinMessage i = d;
|
private static MixinMessage i = d;
|
||||||
public static MixinMessage get() { return i; }
|
public static MixinMessage get() { return i; }
|
||||||
public static void set(MixinMessage i) { MixinMessage.i = i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// MSG > ALL
|
// MSG > ALL
|
||||||
|
@ -3,7 +3,7 @@ package com.massivecraft.massivecore.mixin;
|
|||||||
import com.massivecraft.massivecore.store.Coll;
|
import com.massivecraft.massivecore.store.Coll;
|
||||||
import com.massivecraft.massivecore.store.Entity;
|
import com.massivecraft.massivecore.store.Entity;
|
||||||
|
|
||||||
public class MixinModification extends MixinAbstract
|
public class MixinModification extends Mixin
|
||||||
{
|
{
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// INSTANCE & CONSTRUCT
|
// INSTANCE & CONSTRUCT
|
||||||
@ -12,7 +12,6 @@ public class MixinModification extends MixinAbstract
|
|||||||
private static MixinModification d = new MixinModification();
|
private static MixinModification d = new MixinModification();
|
||||||
private static MixinModification i = d;
|
private static MixinModification i = d;
|
||||||
public static MixinModification get() { return i; }
|
public static MixinModification get() { return i; }
|
||||||
public static void set(MixinModification i) { MixinModification.i = i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// METHODS
|
// METHODS
|
||||||
|
@ -9,7 +9,7 @@ import org.bukkit.command.CommandSender;
|
|||||||
import com.massivecraft.massivecore.util.IdUtil;
|
import com.massivecraft.massivecore.util.IdUtil;
|
||||||
import com.massivecraft.massivecore.util.MUtil;
|
import com.massivecraft.massivecore.util.MUtil;
|
||||||
|
|
||||||
public class MixinPlayed extends MixinAbstract
|
public class MixinPlayed extends Mixin
|
||||||
{
|
{
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// INSTANCE & CONSTRUCT
|
// INSTANCE & CONSTRUCT
|
||||||
@ -18,7 +18,6 @@ public class MixinPlayed extends MixinAbstract
|
|||||||
private static MixinPlayed d = new MixinPlayed();
|
private static MixinPlayed d = new MixinPlayed();
|
||||||
private static MixinPlayed i = d;
|
private static MixinPlayed i = d;
|
||||||
public static MixinPlayed get() { return i; }
|
public static MixinPlayed get() { return i; }
|
||||||
public static void set(MixinPlayed i) { MixinPlayed.i = i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// METHODS
|
// METHODS
|
||||||
|
@ -5,7 +5,7 @@ import org.bukkit.entity.Player;
|
|||||||
import com.massivecraft.massivecore.ps.PS;
|
import com.massivecraft.massivecore.ps.PS;
|
||||||
import com.massivecraft.massivecore.util.IdUtil;
|
import com.massivecraft.massivecore.util.IdUtil;
|
||||||
|
|
||||||
public class MixinSenderPs extends MixinAbstract
|
public class MixinSenderPs extends Mixin
|
||||||
{
|
{
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// INSTANCE & CONSTRUCT
|
// INSTANCE & CONSTRUCT
|
||||||
@ -14,7 +14,6 @@ public class MixinSenderPs extends MixinAbstract
|
|||||||
private static MixinSenderPs d = new MixinSenderPs();
|
private static MixinSenderPs d = new MixinSenderPs();
|
||||||
private static MixinSenderPs i = d;
|
private static MixinSenderPs i = d;
|
||||||
public static MixinSenderPs get() { return i; }
|
public static MixinSenderPs get() { return i; }
|
||||||
public static void set(MixinSenderPs i) { MixinSenderPs.i = i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// METHODS
|
// METHODS
|
||||||
|
@ -16,7 +16,7 @@ import com.massivecraft.massivecore.teleport.ScheduledTeleport;
|
|||||||
import com.massivecraft.massivecore.util.IdUtil;
|
import com.massivecraft.massivecore.util.IdUtil;
|
||||||
import com.massivecraft.massivecore.util.Txt;
|
import com.massivecraft.massivecore.util.Txt;
|
||||||
|
|
||||||
public class MixinTeleport extends MixinAbstract
|
public class MixinTeleport extends Mixin
|
||||||
{
|
{
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// INSTANCE & CONSTRUCT
|
// INSTANCE & CONSTRUCT
|
||||||
@ -25,7 +25,6 @@ public class MixinTeleport extends MixinAbstract
|
|||||||
private static MixinTeleport d = new MixinTeleport();
|
private static MixinTeleport d = new MixinTeleport();
|
||||||
private static MixinTeleport i = d;
|
private static MixinTeleport i = d;
|
||||||
public static MixinTeleport get() { return i; }
|
public static MixinTeleport get() { return i; }
|
||||||
public static void set(MixinTeleport i) { MixinTeleport.i = i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// METHODS
|
// METHODS
|
||||||
|
@ -6,7 +6,7 @@ import com.massivecraft.massivecore.nms.NmsPacket;
|
|||||||
import com.massivecraft.massivecore.util.IdUtil;
|
import com.massivecraft.massivecore.util.IdUtil;
|
||||||
import com.massivecraft.massivecore.util.Txt;
|
import com.massivecraft.massivecore.util.Txt;
|
||||||
|
|
||||||
public class MixinTitle extends MixinAbstract
|
public class MixinTitle extends Mixin
|
||||||
{
|
{
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// INSTANCE & CONSTRUCT
|
// INSTANCE & CONSTRUCT
|
||||||
@ -15,7 +15,6 @@ public class MixinTitle extends MixinAbstract
|
|||||||
private static MixinTitle d = new MixinTitle();
|
private static MixinTitle d = new MixinTitle();
|
||||||
private static MixinTitle i = d;
|
private static MixinTitle i = d;
|
||||||
public static MixinTitle get() { return i; }
|
public static MixinTitle get() { return i; }
|
||||||
public static void set(MixinTitle i) { MixinTitle.i = i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// METHODS
|
// METHODS
|
||||||
|
@ -4,7 +4,7 @@ import org.bukkit.entity.Player;
|
|||||||
import com.massivecraft.massivecore.util.IdUtil;
|
import com.massivecraft.massivecore.util.IdUtil;
|
||||||
import com.massivecraft.massivecore.util.MUtil;
|
import com.massivecraft.massivecore.util.MUtil;
|
||||||
|
|
||||||
public class MixinVisibility extends MixinAbstract
|
public class MixinVisibility extends Mixin
|
||||||
{
|
{
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// INSTANCE & CONSTRUCT
|
// INSTANCE & CONSTRUCT
|
||||||
@ -13,7 +13,6 @@ public class MixinVisibility extends MixinAbstract
|
|||||||
private static MixinVisibility d = new MixinVisibility();
|
private static MixinVisibility d = new MixinVisibility();
|
||||||
private static MixinVisibility i = d;
|
private static MixinVisibility i = d;
|
||||||
public static MixinVisibility get() { return i; }
|
public static MixinVisibility get() { return i; }
|
||||||
public static void set(MixinVisibility i) { MixinVisibility.i = i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// METHODS
|
// METHODS
|
||||||
|
@ -14,7 +14,7 @@ import com.massivecraft.massivecore.ps.PS;
|
|||||||
import com.massivecraft.massivecore.ps.PSFormatDesc;
|
import com.massivecraft.massivecore.ps.PSFormatDesc;
|
||||||
import com.massivecraft.massivecore.util.MUtil;
|
import com.massivecraft.massivecore.util.MUtil;
|
||||||
|
|
||||||
public class MixinWorld extends MixinAbstract
|
public class MixinWorld extends Mixin
|
||||||
{
|
{
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// INSTANCE & CONSTRUCT
|
// INSTANCE & CONSTRUCT
|
||||||
@ -23,7 +23,6 @@ public class MixinWorld extends MixinAbstract
|
|||||||
private static MixinWorld d = new MixinWorld();
|
private static MixinWorld d = new MixinWorld();
|
||||||
private static MixinWorld i = d;
|
private static MixinWorld i = d;
|
||||||
public static MixinWorld get() { return i; }
|
public static MixinWorld get() { return i; }
|
||||||
public static void set(MixinWorld i) { MixinWorld.i = i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// METHODS
|
// METHODS
|
||||||
|
75
src/com/massivecraft/massivecore/nms/NmsBasics.java
Normal file
75
src/com/massivecraft/massivecore/nms/NmsBasics.java
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.scoreboard.Team;
|
||||||
|
|
||||||
|
import com.massivecraft.massivecore.mixin.Mixin;
|
||||||
|
|
||||||
|
public class NmsBasics extends Mixin
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// DEFAULT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsBasics d = new NmsBasics().setAlternatives(
|
||||||
|
NmsBasics17R4P.class
|
||||||
|
);
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INSTANCE & CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsBasics i = d;
|
||||||
|
public static NmsBasics get() { return i; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// GET HANDLE
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public <T> T getHandle(Entity entity)
|
||||||
|
{
|
||||||
|
throw this.notImplemented();
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> T getHandle(World world)
|
||||||
|
{
|
||||||
|
throw this.notImplemented();
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> T getHandle(Team team)
|
||||||
|
{
|
||||||
|
throw this.notImplemented();
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// GET BUKKIT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public <T extends Entity> T getBukkit(Object handle)
|
||||||
|
{
|
||||||
|
throw this.notImplemented();
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// CONNECTION & PACKET
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public <T> T getConnection(Player player)
|
||||||
|
{
|
||||||
|
throw this.notImplemented();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendPacket(Player player, Object packet)
|
||||||
|
{
|
||||||
|
Object connection = this.getConnection(player);
|
||||||
|
this.sendPacket(connection, packet);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendPacket(Object connection, Object packet)
|
||||||
|
{
|
||||||
|
throw this.notImplemented();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
143
src/com/massivecraft/massivecore/nms/NmsBasics17R4P.java
Normal file
143
src/com/massivecraft/massivecore/nms/NmsBasics17R4P.java
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.scoreboard.Team;
|
||||||
|
|
||||||
|
import com.massivecraft.massivecore.particleeffect.ReflectionUtils.PackageType;
|
||||||
|
import com.massivecraft.massivecore.util.ReflectionUtil;
|
||||||
|
|
||||||
|
public class NmsBasics17R4P extends NmsBasics
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INSTANCE & CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsBasics17R4P i = new NmsBasics17R4P();
|
||||||
|
public static NmsBasics17R4P get() { return i; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// FIELDS
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
// GET HANDLE
|
||||||
|
|
||||||
|
// org.bukkit.craftbukkit.entity.CraftEntity
|
||||||
|
private Class<?> classCraftEntity;
|
||||||
|
// org.bukkit.craftbukkit.entity.Entity#getHandle()
|
||||||
|
private Method methodCraftEntityGetHandle;
|
||||||
|
|
||||||
|
// org.bukkit.craftbukkit.CraftWorld
|
||||||
|
public Class<?> classCraftWorld;
|
||||||
|
// org.bukkit.craftbukkit.CraftWorld#world
|
||||||
|
public Field fieldCraftWorldWorld;
|
||||||
|
|
||||||
|
// org.bukkit.craftbukkit.scoreboard.CraftTeam
|
||||||
|
private Class<?> classCraftTeam;
|
||||||
|
// org.bukkit.craftbukkit.scoreboard.CraftTeam#team
|
||||||
|
private Field fieldCraftTeamHandle;
|
||||||
|
|
||||||
|
// GET BUKKIT
|
||||||
|
// net.minecraft.server.Entity
|
||||||
|
private Class<?> classNmsEntity;
|
||||||
|
// net.minecraft.server.Entity#getBukkitEntity()
|
||||||
|
private Method methodNmsEntityGetBukkitEntity;
|
||||||
|
|
||||||
|
// CONNECTION & PACKET
|
||||||
|
|
||||||
|
// net.minecraft.server.EntityPlayer
|
||||||
|
private Class<?> classNmsPlayer;
|
||||||
|
// net.minecraft.server.EntityPlayer#playerConnection
|
||||||
|
private Field fieldNmsPlayerPlayerConnection;
|
||||||
|
// net.minecraft.server.Packet
|
||||||
|
private Class<?> classNmsPacket;
|
||||||
|
// net.minecraft.server.PlayerConnection
|
||||||
|
private Class<?> classNmsPlayerConnection;
|
||||||
|
// net.minecraft.server.PlayerConnection#sendPacket(Packet)
|
||||||
|
private Method methodPlayerConnectionsendPacket;
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// SETUP
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setup() throws Throwable
|
||||||
|
{
|
||||||
|
// GET HANDLE
|
||||||
|
|
||||||
|
this.classCraftEntity = PackageType.CRAFTBUKKIT_ENTITY.getClass("CraftEntity");
|
||||||
|
this.methodCraftEntityGetHandle = ReflectionUtil.getMethod(this.classCraftEntity, "getHandle");
|
||||||
|
|
||||||
|
this.classCraftWorld = PackageType.CRAFTBUKKIT.getClass("CraftWorld");
|
||||||
|
this.fieldCraftWorldWorld = ReflectionUtil.getField(this.classCraftWorld, "world");
|
||||||
|
|
||||||
|
this.classCraftTeam = PackageType.CRAFTBUKKIT_SCOREBOARD.getClass("CraftTeam");
|
||||||
|
this.fieldCraftTeamHandle = ReflectionUtil.getField(this.classCraftTeam, "team");
|
||||||
|
|
||||||
|
// GET BUKKIT
|
||||||
|
this.classNmsEntity = PackageType.MINECRAFT_SERVER.getClass("Entity");
|
||||||
|
this.methodNmsEntityGetBukkitEntity = ReflectionUtil.getMethod(this.classNmsEntity, "getBukkitEntity");
|
||||||
|
|
||||||
|
// CONNECTION & PACKET
|
||||||
|
|
||||||
|
this.classNmsPlayer = PackageType.MINECRAFT_SERVER.getClass("EntityPlayer");
|
||||||
|
this.fieldNmsPlayerPlayerConnection = ReflectionUtil.getField(this.classNmsPlayer, "playerConnection");
|
||||||
|
this.classNmsPacket = PackageType.MINECRAFT_SERVER.getClass("Packet");
|
||||||
|
this.classNmsPlayerConnection = PackageType.MINECRAFT_SERVER.getClass("PlayerConnection");
|
||||||
|
this.methodPlayerConnectionsendPacket = ReflectionUtil.getMethod(this.classNmsPlayerConnection, "sendPacket", this.classNmsPacket);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// GET HANDLE
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> T getHandle(Entity entity)
|
||||||
|
{
|
||||||
|
return ReflectionUtil.invokeMethod(this.methodCraftEntityGetHandle, entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> T getHandle(World world)
|
||||||
|
{
|
||||||
|
return ReflectionUtil.getField(this.fieldCraftWorldWorld, world);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> T getHandle(Team team)
|
||||||
|
{
|
||||||
|
return ReflectionUtil.getField(this.fieldCraftTeamHandle, team);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// GET BUKKIT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T extends Entity> T getBukkit(Object handle)
|
||||||
|
{
|
||||||
|
return ReflectionUtil.invokeMethod(this.methodNmsEntityGetBukkitEntity, handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// CONNECTION & PACKET
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> T getConnection(Player player)
|
||||||
|
{
|
||||||
|
Object handle = this.getHandle(player);
|
||||||
|
return ReflectionUtil.getField(this.fieldNmsPlayerPlayerConnection, handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendPacket(Object connection, Object packet)
|
||||||
|
{
|
||||||
|
ReflectionUtil.invokeMethod(this.methodPlayerConnectionsendPacket, connection, packet);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -26,12 +26,6 @@ public class NmsBoard extends NmsAbstract
|
|||||||
// FIELDS
|
// FIELDS
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
|
||||||
// org.bukkit.craftbukkit.scoreboard.CraftTeam
|
|
||||||
private Class<?> classCraftTeam;
|
|
||||||
|
|
||||||
// org.bukkit.craftbukkit.scoreboard.CraftTeam#team
|
|
||||||
private Field fieldCraftTeamHandle;
|
|
||||||
|
|
||||||
// net.minecraft.server.ScoreboardTeam
|
// net.minecraft.server.ScoreboardTeam
|
||||||
private Class<?> classNmsTeam;
|
private Class<?> classNmsTeam;
|
||||||
|
|
||||||
@ -66,8 +60,8 @@ public class NmsBoard extends NmsAbstract
|
|||||||
@Override
|
@Override
|
||||||
protected void setup() throws Throwable
|
protected void setup() throws Throwable
|
||||||
{
|
{
|
||||||
this.classCraftTeam = PackageType.CRAFTBUKKIT_SCOREBOARD.getClass("CraftTeam");
|
// TODO: Move to provoke?
|
||||||
this.fieldCraftTeamHandle = ReflectionUtil.getField(this.classCraftTeam, "team");
|
NmsBasics.get().require();
|
||||||
|
|
||||||
this.classNmsTeam = PackageType.MINECRAFT_SERVER.getClass("ScoreboardTeam");
|
this.classNmsTeam = PackageType.MINECRAFT_SERVER.getClass("ScoreboardTeam");
|
||||||
this.fieldNmsTeamColor = ReflectionUtil.getField(this.classNmsTeam, "k");
|
this.fieldNmsTeamColor = ReflectionUtil.getField(this.classNmsTeam, "k");
|
||||||
@ -88,7 +82,7 @@ public class NmsBoard extends NmsAbstract
|
|||||||
{
|
{
|
||||||
if ( ! this.isAvailable()) return null;
|
if ( ! this.isAvailable()) return null;
|
||||||
|
|
||||||
Object nmsTeam = getTeamHandle(team);
|
Object nmsTeam = NmsBasics.get().getHandle(team);
|
||||||
Object nmsColor = ReflectionUtil.getField(this.fieldNmsTeamColor, nmsTeam);
|
Object nmsColor = ReflectionUtil.getField(this.fieldNmsTeamColor, nmsTeam);
|
||||||
|
|
||||||
return convertColor(nmsColor);
|
return convertColor(nmsColor);
|
||||||
@ -98,7 +92,7 @@ public class NmsBoard extends NmsAbstract
|
|||||||
{
|
{
|
||||||
if ( ! this.isAvailable()) return;
|
if ( ! this.isAvailable()) return;
|
||||||
|
|
||||||
Object nmsTeam = getTeamHandle(team);
|
Object nmsTeam = NmsBasics.get().getHandle(team);
|
||||||
Object nmsColor = convertColor(color);
|
Object nmsColor = convertColor(color);
|
||||||
ReflectionUtil.setField(this.fieldNmsTeamColor, nmsTeam, nmsColor);
|
ReflectionUtil.setField(this.fieldNmsTeamColor, nmsTeam, nmsColor);
|
||||||
|
|
||||||
@ -107,15 +101,6 @@ public class NmsBoard extends NmsAbstract
|
|||||||
team.setDisplayName(team.getDisplayName());
|
team.setDisplayName(team.getDisplayName());
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// TEAM
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public <T> T getTeamHandle(Team team)
|
|
||||||
{
|
|
||||||
return ReflectionUtil.getField(this.fieldCraftTeamHandle, team);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// PACKET
|
// PACKET
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
@ -126,14 +111,14 @@ public class NmsBoard extends NmsAbstract
|
|||||||
|
|
||||||
public <T> T createTeamUpdatePacket(Team team)
|
public <T> T createTeamUpdatePacket(Team team)
|
||||||
{
|
{
|
||||||
Object handle = getTeamHandle(team);
|
Object handle = NmsBasics.get().getHandle(team);
|
||||||
return ReflectionUtil.invokeConstructor(this.constructorPacketTeamUpdate, handle, PACKET_UPDATE_MODE);
|
return ReflectionUtil.invokeConstructor(this.constructorPacketTeamUpdate, handle, PACKET_UPDATE_MODE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendTeamUpdatePacket(Team team, Player player)
|
public void sendTeamUpdatePacket(Team team, Player player)
|
||||||
{
|
{
|
||||||
Object packet = this.createTeamUpdatePacket(team);
|
Object packet = this.createTeamUpdatePacket(team);
|
||||||
NmsPacket.sendPacket(player, packet);
|
NmsBasics.get().sendPacket(player, packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
@ -1,145 +0,0 @@
|
|||||||
package com.massivecraft.massivecore.nms;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.UUID;
|
|
||||||
import java.util.WeakHashMap;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.entity.Entity;
|
|
||||||
|
|
||||||
import com.massivecraft.massivecore.particleeffect.ReflectionUtils.PackageType;
|
|
||||||
import com.massivecraft.massivecore.util.ReflectionUtil;
|
|
||||||
|
|
||||||
public class NmsEntity extends NmsAbstract
|
|
||||||
{
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// INSTANCE & CONSTRUCT
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
private static NmsEntity i = new NmsEntity();
|
|
||||||
public static NmsEntity get () { return i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// FIELDS
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
// org.bukkit.craftbukkit.CraftWorld#world
|
|
||||||
public static Class<?> classCraftWorld;
|
|
||||||
public static Field fieldCraftWorldDotWorld;
|
|
||||||
|
|
||||||
// net.minecraft.server.WorldServer#entitiesByUUID
|
|
||||||
public static Class<?> classWorldServer;
|
|
||||||
public static Field fieldWorldServerDotEntitiesByUUID;
|
|
||||||
|
|
||||||
// net.minecraft.server.Entity#getBukkitEntity()
|
|
||||||
public static Class<?> classEntity;
|
|
||||||
public static Method methodEntityDotGetBukkitEntity;
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// OVERRIDE
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
// NOTE: This has been properly researched.
|
|
||||||
// NOTE: The field "WorldServer.entitiesByUUID" was added in 1.8.
|
|
||||||
@Override
|
|
||||||
public int getRequiredVersion()
|
|
||||||
{
|
|
||||||
return 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void setup() throws Throwable
|
|
||||||
{
|
|
||||||
classCraftWorld = PackageType.CRAFTBUKKIT.getClass("CraftWorld");
|
|
||||||
fieldCraftWorldDotWorld = ReflectionUtil.getField(classCraftWorld, "world");
|
|
||||||
|
|
||||||
classWorldServer = PackageType.MINECRAFT_SERVER.getClass("WorldServer");
|
|
||||||
fieldWorldServerDotEntitiesByUUID = ReflectionUtil.getField(classWorldServer, "entitiesByUUID");
|
|
||||||
|
|
||||||
classEntity = PackageType.MINECRAFT_SERVER.getClass("Entity");
|
|
||||||
methodEntityDotGetBukkitEntity = ReflectionUtil.getMethod(classEntity, "getBukkitEntity");
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// REFLECTION METHODS > WORLD MAP
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public Object getNmsWorld(World world)
|
|
||||||
{
|
|
||||||
if (world == null) throw new NullPointerException("world");
|
|
||||||
|
|
||||||
return ReflectionUtil.getField(fieldCraftWorldDotWorld, world);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<UUID, Object> getNmsWorldMap(Object nmsWorld)
|
|
||||||
{
|
|
||||||
if (nmsWorld == null) throw new NullPointerException("nmsWorld");
|
|
||||||
|
|
||||||
return ReflectionUtil.getField(fieldWorldServerDotEntitiesByUUID, nmsWorld);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// REFLECTION METHODS > ENTITY
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public Entity getBukkitEntity(Object nmsEntity)
|
|
||||||
{
|
|
||||||
if (nmsEntity == null) throw new NullPointerException("nmsEntity");
|
|
||||||
|
|
||||||
return ReflectionUtil.invokeMethod(methodEntityDotGetBukkitEntity, nmsEntity);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// WORLD MAP
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
protected Map<World, Map<UUID, Object>> worldMaps = new WeakHashMap<World, Map<UUID, Object>>();
|
|
||||||
|
|
||||||
public Map<UUID, Object> getWorldMap(World world)
|
|
||||||
{
|
|
||||||
if (world == null) throw new NullPointerException("world");
|
|
||||||
|
|
||||||
Map<UUID, Object> ret = this.worldMaps.get(world);
|
|
||||||
if (ret == null)
|
|
||||||
{
|
|
||||||
Object nmsWorld = this.getNmsWorld(world);
|
|
||||||
ret = this.getNmsWorldMap(nmsWorld);
|
|
||||||
this.worldMaps.put(world, ret);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// GET ENTITY
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public Entity getEntity(World world, UUID uuid)
|
|
||||||
{
|
|
||||||
if (world == null) throw new NullPointerException("world");
|
|
||||||
if (uuid == null) return null;
|
|
||||||
|
|
||||||
Map<UUID, Object> worldMap = this.getWorldMap(world);
|
|
||||||
|
|
||||||
Object nmsEntity = worldMap.get(uuid);
|
|
||||||
if (nmsEntity == null) return null;
|
|
||||||
|
|
||||||
return this.getBukkitEntity(nmsEntity);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Entity getEntity(UUID uuid)
|
|
||||||
{
|
|
||||||
if (uuid == null) return null;
|
|
||||||
|
|
||||||
for (World world : Bukkit.getWorlds())
|
|
||||||
{
|
|
||||||
Entity ret = this.getEntity(world, uuid);
|
|
||||||
if (ret != null) return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
41
src/com/massivecraft/massivecore/nms/NmsEntityGet.java
Normal file
41
src/com/massivecraft/massivecore/nms/NmsEntityGet.java
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import com.massivecraft.massivecore.mixin.Mixin;
|
||||||
|
|
||||||
|
public class NmsEntityGet extends Mixin
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// DEFAULT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsEntityGet d = new NmsEntityGet().setAlternatives(
|
||||||
|
NmsEntityGet18R1P.class,
|
||||||
|
NmsEntityGetFallback.class
|
||||||
|
);
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INSTANCE & CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsEntityGet i = d;
|
||||||
|
public static NmsEntityGet get() { return i; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// GET ENTITY
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public Entity getEntity(UUID uuid)
|
||||||
|
{
|
||||||
|
throw notImplemented();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Entity getEntity(World world, UUID uuid)
|
||||||
|
{
|
||||||
|
throw notImplemented();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
108
src/com/massivecraft/massivecore/nms/NmsEntityGet18R1P.java
Normal file
108
src/com/massivecraft/massivecore/nms/NmsEntityGet18R1P.java
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.WeakHashMap;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
|
||||||
|
import com.massivecraft.massivecore.particleeffect.ReflectionUtils.PackageType;
|
||||||
|
import com.massivecraft.massivecore.util.ReflectionUtil;
|
||||||
|
|
||||||
|
public class NmsEntityGet18R1P extends NmsEntityGet
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INSTANCE & CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsEntityGet18R1P i = new NmsEntityGet18R1P();
|
||||||
|
public static NmsEntityGet18R1P get () { return i; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// FIELDS
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
// net.minecraft.server.WorldServer
|
||||||
|
private Class<?> classNmsWorldServer;
|
||||||
|
|
||||||
|
// net.minecraft.server.WorldServer#entitiesByUUID
|
||||||
|
private Field fieldNmsWorldServerEntitiesByUuid;
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// SETUP
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setup() throws Throwable
|
||||||
|
{
|
||||||
|
NmsBasics.get().require();
|
||||||
|
|
||||||
|
this.classNmsWorldServer = PackageType.MINECRAFT_SERVER.getClass("WorldServer");
|
||||||
|
this.fieldNmsWorldServerEntitiesByUuid = ReflectionUtil.getField(this.classNmsWorldServer, "entitiesByUUID");
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// GET ENTITY
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Entity getEntity(UUID uuid)
|
||||||
|
{
|
||||||
|
if (uuid == null) return null;
|
||||||
|
|
||||||
|
for (World world : Bukkit.getWorlds())
|
||||||
|
{
|
||||||
|
Entity ret = this.getEntity(world, uuid);
|
||||||
|
if (ret != null) return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Entity getEntity(World world, UUID uuid)
|
||||||
|
{
|
||||||
|
if (world == null) throw new NullPointerException("world");
|
||||||
|
if (uuid == null) return null;
|
||||||
|
|
||||||
|
Map<UUID, Object> worldMap = this.getWorldMap(world);
|
||||||
|
|
||||||
|
Object nmsEntity = worldMap.get(uuid);
|
||||||
|
if (nmsEntity == null) return null;
|
||||||
|
|
||||||
|
return NmsBasics.get().getBukkit(nmsEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INTERNAL
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private Map<World, Map<UUID, Object>> worldMaps = new WeakHashMap<World, Map<UUID, Object>>();
|
||||||
|
|
||||||
|
private Map<UUID, Object> getWorldMap(Object handle)
|
||||||
|
{
|
||||||
|
if (handle == null) throw new NullPointerException("handle");
|
||||||
|
|
||||||
|
return ReflectionUtil.getField(this.fieldNmsWorldServerEntitiesByUuid, handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<UUID, Object> getWorldMap(World world)
|
||||||
|
{
|
||||||
|
if (world == null) throw new NullPointerException("world");
|
||||||
|
|
||||||
|
Map<UUID, Object> ret = this.worldMaps.get(world);
|
||||||
|
if (ret == null)
|
||||||
|
{
|
||||||
|
Object handle = NmsBasics.get().getHandle(world);
|
||||||
|
ret = this.getWorldMap(handle);
|
||||||
|
this.worldMaps.put(world, ret);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
|
||||||
|
public class NmsEntityGetFallback extends NmsEntityGet
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INSTANCE & CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsEntityGetFallback i = new NmsEntityGetFallback();
|
||||||
|
public static NmsEntityGetFallback get () { return i; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// GET ENTITY
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Entity getEntity(UUID uuid)
|
||||||
|
{
|
||||||
|
if (uuid == null) return null;
|
||||||
|
|
||||||
|
for (World world : Bukkit.getWorlds())
|
||||||
|
{
|
||||||
|
Entity ret = this.getEntity(world, uuid);
|
||||||
|
if (ret != null) return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Entity getEntity(World world, UUID uuid)
|
||||||
|
{
|
||||||
|
if (world == null) throw new NullPointerException("world");
|
||||||
|
if (uuid == null) return null;
|
||||||
|
|
||||||
|
for (Entity entity : world.getEntities())
|
||||||
|
{
|
||||||
|
if (entity.getUniqueId().equals(uuid)) return entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,63 +0,0 @@
|
|||||||
package com.massivecraft.massivecore.nms;
|
|
||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
|
||||||
|
|
||||||
import org.bukkit.inventory.PlayerInventory;
|
|
||||||
|
|
||||||
import com.massivecraft.massivecore.particleeffect.ReflectionUtils;
|
|
||||||
|
|
||||||
public class NmsInventory extends NmsAbstract
|
|
||||||
{
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// INSTANCE & CONSTRUCT
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
private static NmsInventory i = new NmsInventory();
|
|
||||||
public static NmsInventory get () { return i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// FIELDS
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
private static Class<?> playerInventoryClass;
|
|
||||||
private static Class<?> entityHumanClass;
|
|
||||||
private static Constructor<?> playerInventoryConstructor;
|
|
||||||
private static Class<?> craftInventoryPlayerClass;
|
|
||||||
private static Constructor<?> craftInventoryPlayerConstructor;
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// OVERRIDE
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void setup() throws Throwable
|
|
||||||
{
|
|
||||||
playerInventoryClass = ReflectionUtils.PackageType.MINECRAFT_SERVER.getClass("PlayerInventory");
|
|
||||||
entityHumanClass = ReflectionUtils.PackageType.MINECRAFT_SERVER.getClass("EntityHuman");
|
|
||||||
playerInventoryConstructor = ReflectionUtils.getConstructor(playerInventoryClass, entityHumanClass);
|
|
||||||
craftInventoryPlayerClass = ReflectionUtils.PackageType.CRAFTBUKKIT_INVENTORY.getClass("CraftInventoryPlayer");
|
|
||||||
craftInventoryPlayerConstructor = ReflectionUtils.getConstructor(craftInventoryPlayerClass, playerInventoryClass);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// CREATE PLAYERINVENTORY
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public static PlayerInventory createPlayerInventory()
|
|
||||||
{
|
|
||||||
if ( ! get().isAvailable()) return null;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Object playerInventory = playerInventoryConstructor.newInstance(new Object[]{null});
|
|
||||||
Object craftInventoryPlayer = craftInventoryPlayerConstructor.newInstance(playerInventory);
|
|
||||||
return (PlayerInventory)craftInventoryPlayer;
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
e.printStackTrace();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
33
src/com/massivecraft/massivecore/nms/NmsItemStackCreate.java
Normal file
33
src/com/massivecraft/massivecore/nms/NmsItemStackCreate.java
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import com.massivecraft.massivecore.mixin.Mixin;
|
||||||
|
|
||||||
|
public class NmsItemStackCreate extends Mixin
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// DEFAULT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsItemStackCreate d = new NmsItemStackCreate().setAlternatives(
|
||||||
|
NmsItemStackCreate17R4P.class,
|
||||||
|
NmsItemStackCreateFallback.class
|
||||||
|
);
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INSTANCE & CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsItemStackCreate i = d;
|
||||||
|
public static NmsItemStackCreate get() { return i; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// CREATE
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public ItemStack create()
|
||||||
|
{
|
||||||
|
throw notImplemented();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -6,70 +6,69 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import com.massivecraft.massivecore.particleeffect.ReflectionUtils.PackageType;
|
import com.massivecraft.massivecore.particleeffect.ReflectionUtils.PackageType;
|
||||||
import com.massivecraft.massivecore.util.ReflectionUtil;
|
import com.massivecraft.massivecore.util.ReflectionUtil;
|
||||||
|
|
||||||
public class NmsItemStack extends NmsAbstract
|
public class NmsItemStackCreate17R4P extends NmsItemStackCreate
|
||||||
{
|
{
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// INSTANCE & CONSTRUCT
|
// INSTANCE & CONSTRUCT
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
|
||||||
private static NmsItemStack i = new NmsItemStack();
|
private static NmsItemStackCreate17R4P i = new NmsItemStackCreate17R4P();
|
||||||
public static NmsItemStack get () { return i; }
|
public static NmsItemStackCreate17R4P get () { return i; }
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// FIELDS
|
// FIELDS
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
|
||||||
// net.minecraft.server.ItemStack
|
// net.minecraft.server.ItemStack
|
||||||
public Class<?> classNmsItemStack;
|
private Class<?> classNmsItemStack;
|
||||||
|
|
||||||
// org.bukkit.craftbukkit.inventory.CraftItemStack
|
// org.bukkit.craftbukkit.inventory.CraftItemStack
|
||||||
public Class<?> classCraftItemStack;
|
private Class<?> classCraftItemStack;
|
||||||
|
|
||||||
// org.bukkit.craftbukkit.inventory.CraftItemStack(net.minecraft.server.ItemStack)
|
// org.bukkit.craftbukkit.inventory.CraftItemStack(net.minecraft.server.ItemStack)
|
||||||
public Constructor<?> constructorCraftItemStack;
|
private Constructor<?> constructorCraftItemStack;
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// OVERRIDE
|
// SETUP
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
|
||||||
// NOTE: This has been properly researched.
|
|
||||||
// NOTE: The constructor have been the same for quite some time!
|
|
||||||
@Override
|
@Override
|
||||||
public int getRequiredVersion()
|
public void setup() throws Throwable
|
||||||
{
|
{
|
||||||
return 6;
|
this.classNmsItemStack = getClassCraftItemStack();
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void setup() throws Throwable
|
|
||||||
{
|
|
||||||
this.classNmsItemStack = PackageType.MINECRAFT_SERVER.getClass("ItemStack");
|
|
||||||
this.classCraftItemStack = PackageType.CRAFTBUKKIT_INVENTORY.getClass("CraftItemStack");
|
this.classCraftItemStack = PackageType.CRAFTBUKKIT_INVENTORY.getClass("CraftItemStack");
|
||||||
this.constructorCraftItemStack = ReflectionUtil.getConstructor(this.classCraftItemStack, this.classNmsItemStack);
|
this.constructorCraftItemStack = ReflectionUtil.getConstructor(this.classCraftItemStack, this.classNmsItemStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// METHOD
|
// CREATE
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@Override
|
||||||
public ItemStack createItemStack()
|
public ItemStack create()
|
||||||
{
|
{
|
||||||
// Create
|
return ReflectionUtil.invokeConstructor(this.constructorCraftItemStack, (Object)null);
|
||||||
ItemStack ret = null;
|
|
||||||
|
|
||||||
// Fill
|
|
||||||
if (this.isAvailable())
|
|
||||||
{
|
|
||||||
ret = ReflectionUtil.invokeConstructor(this.constructorCraftItemStack, (Object)null);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ret = new ItemStack(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return
|
// -------------------------------------------- //
|
||||||
return ret;
|
// UTIL
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public static Class<?> getClassCraftItemStack() throws ClassNotFoundException
|
||||||
|
{
|
||||||
|
return PackageType.MINECRAFT_SERVER.getClass("ItemStack");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Class<?> getClassCraftItemStackCatch()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return getClassCraftItemStack();
|
||||||
|
}
|
||||||
|
catch (Throwable t)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
public class NmsItemStackCreateFallback extends NmsItemStackCreate
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INSTANCE & CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsItemStackCreateFallback i = new NmsItemStackCreateFallback();
|
||||||
|
public static NmsItemStackCreateFallback get () { return i; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// CREATE
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@Override
|
||||||
|
public ItemStack create()
|
||||||
|
{
|
||||||
|
return new ItemStack(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,10 +1,8 @@
|
|||||||
package com.massivecraft.massivecore.nms;
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
import com.massivecraft.massivecore.util.ReflectionUtil;
|
|
||||||
import com.massivecraft.massivecore.util.Txt;
|
import com.massivecraft.massivecore.util.Txt;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
@ -38,11 +36,6 @@ public final class NmsPacket extends NmsAbstract
|
|||||||
// The object we send instead of a string
|
// The object we send instead of a string
|
||||||
private static Class<?> iChatBaseComponent;
|
private static Class<?> iChatBaseComponent;
|
||||||
|
|
||||||
// Handling the players conenction
|
|
||||||
private static Method getHandle;
|
|
||||||
private static Field playerConnection;
|
|
||||||
private static Method sendPacket;
|
|
||||||
|
|
||||||
// The title packet and its constructor
|
// The title packet and its constructor
|
||||||
private static Constructor<?> titlePacketConstructor;
|
private static Constructor<?> titlePacketConstructor;
|
||||||
private static Constructor<?> titlePacketConstructorTimes;
|
private static Constructor<?> titlePacketConstructorTimes;
|
||||||
@ -64,6 +57,8 @@ public final class NmsPacket extends NmsAbstract
|
|||||||
@Override
|
@Override
|
||||||
protected void setup() throws Throwable
|
protected void setup() throws Throwable
|
||||||
{
|
{
|
||||||
|
NmsBasics.get().require();
|
||||||
|
|
||||||
// The enum used for titles
|
// The enum used for titles
|
||||||
titleEnumClass = getTitleEnumClass();
|
titleEnumClass = getTitleEnumClass();
|
||||||
|
|
||||||
@ -91,11 +86,6 @@ public final class NmsPacket extends NmsAbstract
|
|||||||
chatPacketConstructor = ReflectionUtils.getConstructor(chatPacketClass, iChatBaseComponent);
|
chatPacketConstructor = ReflectionUtils.getConstructor(chatPacketClass, iChatBaseComponent);
|
||||||
chatPacketActionbarConstructor = ReflectionUtils.getConstructor(chatPacketClass, iChatBaseComponent, Byte.TYPE);
|
chatPacketActionbarConstructor = ReflectionUtils.getConstructor(chatPacketClass, iChatBaseComponent, Byte.TYPE);
|
||||||
|
|
||||||
// Player connection
|
|
||||||
getHandle = ReflectionUtils.getMethod("CraftPlayer", PackageType.CRAFTBUKKIT_ENTITY, "getHandle");
|
|
||||||
playerConnection = ReflectionUtils.getField("EntityPlayer", PackageType.MINECRAFT_SERVER, false, "playerConnection");
|
|
||||||
sendPacket = ReflectionUtils.getMethod(playerConnection.getType(), "sendPacket", PackageType.MINECRAFT_SERVER.getClass("Packet"));
|
|
||||||
|
|
||||||
// Set accessible
|
// Set accessible
|
||||||
setAllAccessible();
|
setAllAccessible();
|
||||||
}
|
}
|
||||||
@ -138,9 +128,6 @@ public final class NmsPacket extends NmsAbstract
|
|||||||
titlePacketConstructor.setAccessible(true);
|
titlePacketConstructor.setAccessible(true);
|
||||||
titlePacketConstructorTimes.setAccessible(true);
|
titlePacketConstructorTimes.setAccessible(true);
|
||||||
chatPacketConstructor.setAccessible(true);
|
chatPacketConstructor.setAccessible(true);
|
||||||
getHandle.setAccessible(true);
|
|
||||||
playerConnection.setAccessible(true);
|
|
||||||
sendPacket.setAccessible(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
@ -155,15 +142,16 @@ public final class NmsPacket extends NmsAbstract
|
|||||||
{
|
{
|
||||||
// Fadein, stay, fadeout
|
// Fadein, stay, fadeout
|
||||||
Object timesPacket = titlePacketConstructorTimes.newInstance(titleTimesEnum, null, ticksIn, ticksStay, ticksOut);
|
Object timesPacket = titlePacketConstructorTimes.newInstance(titleTimesEnum, null, ticksIn, ticksStay, ticksOut);
|
||||||
sendPacket(player, timesPacket);
|
|
||||||
|
NmsBasics.get().sendPacket(player, timesPacket);
|
||||||
|
|
||||||
if (titleMain != null)
|
if (titleMain != null)
|
||||||
{
|
{
|
||||||
// Title
|
// Title
|
||||||
Object titleMainChat = toChatBaseComponent(titleMain);
|
Object titleMainChat = toChatBaseComponent(titleMain);
|
||||||
Object titleMainPacket = titlePacketConstructor.newInstance(titleMainEnum, titleMainChat);
|
Object titleMainPacket = titlePacketConstructor.newInstance(titleMainEnum, titleMainChat);
|
||||||
sendPacket(player, titleMainPacket);
|
|
||||||
|
|
||||||
|
NmsBasics.get().sendPacket(player, titleMainPacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (titleSub != null)
|
if (titleSub != null)
|
||||||
@ -171,7 +159,8 @@ public final class NmsPacket extends NmsAbstract
|
|||||||
// SubTitle
|
// SubTitle
|
||||||
Object titleSubChat = toChatBaseComponent(titleSub);
|
Object titleSubChat = toChatBaseComponent(titleSub);
|
||||||
Object titleSubPacket = titlePacketConstructor.newInstance(titleSubEnum, titleSubChat);
|
Object titleSubPacket = titlePacketConstructor.newInstance(titleSubEnum, titleSubChat);
|
||||||
sendPacket(player, titleSubPacket);
|
|
||||||
|
NmsBasics.get().sendPacket(player, titleSubPacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -200,7 +189,7 @@ public final class NmsPacket extends NmsAbstract
|
|||||||
Object rawChat = toChatBaseComponent(string);
|
Object rawChat = toChatBaseComponent(string);
|
||||||
Object chatPacket = chatPacketConstructor.newInstance(rawChat);
|
Object chatPacket = chatPacketConstructor.newInstance(rawChat);
|
||||||
|
|
||||||
sendPacket(player, chatPacket);
|
NmsBasics.get().sendPacket(player, chatPacket);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@ -226,7 +215,7 @@ public final class NmsPacket extends NmsAbstract
|
|||||||
Object actionbar = toChatBaseComponent(string);
|
Object actionbar = toChatBaseComponent(string);
|
||||||
Object chatPacket = chatPacketActionbarConstructor.newInstance(actionbar, (byte) 2);
|
Object chatPacket = chatPacketActionbarConstructor.newInstance(actionbar, (byte) 2);
|
||||||
|
|
||||||
sendPacket(player, chatPacket);
|
NmsBasics.get().sendPacket(player, chatPacket);
|
||||||
}
|
}
|
||||||
catch(Exception ex)
|
catch(Exception ex)
|
||||||
{
|
{
|
||||||
@ -243,23 +232,6 @@ public final class NmsPacket extends NmsAbstract
|
|||||||
// UTIL
|
// UTIL
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
|
||||||
public static void sendPacket(Player player, Object packet)
|
|
||||||
{
|
|
||||||
Object connection = getPlayerConnection(player);
|
|
||||||
ReflectionUtil.invokeMethod(sendPacket, connection, packet);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> T getPlayerConnection(Player player)
|
|
||||||
{
|
|
||||||
Object handle = getHandle(player);
|
|
||||||
return ReflectionUtil.getField(playerConnection, handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> T getHandle(Player player)
|
|
||||||
{
|
|
||||||
return ReflectionUtil.invokeMethod(getHandle, player);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Object toChatBaseComponent(String str) throws Exception
|
public static Object toChatBaseComponent(String str) throws Exception
|
||||||
{
|
{
|
||||||
return chatSerializer.invoke(null, str);
|
return chatSerializer.invoke(null, str);
|
||||||
|
@ -0,0 +1,33 @@
|
|||||||
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
|
import org.bukkit.inventory.PlayerInventory;
|
||||||
|
|
||||||
|
import com.massivecraft.massivecore.mixin.Mixin;
|
||||||
|
|
||||||
|
public class NmsPlayerInventoryCreate extends Mixin
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// DEFAULT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsPlayerInventoryCreate d = new NmsPlayerInventoryCreate().setAlternatives(
|
||||||
|
NmsPlayerInventoryCreate17R4P.class
|
||||||
|
);
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INSTANCE & CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsPlayerInventoryCreate i = d;
|
||||||
|
public static NmsPlayerInventoryCreate get() { return i; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// CREATE
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public PlayerInventory create()
|
||||||
|
{
|
||||||
|
throw notImplemented();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,56 @@
|
|||||||
|
package com.massivecraft.massivecore.nms;
|
||||||
|
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
|
||||||
|
import org.bukkit.inventory.PlayerInventory;
|
||||||
|
|
||||||
|
import com.massivecraft.massivecore.particleeffect.ReflectionUtils;
|
||||||
|
import com.massivecraft.massivecore.util.ReflectionUtil;
|
||||||
|
|
||||||
|
public class NmsPlayerInventoryCreate17R4P extends NmsPlayerInventoryCreate
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INSTANCE & CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static NmsPlayerInventoryCreate17R4P i = new NmsPlayerInventoryCreate17R4P();
|
||||||
|
public static NmsPlayerInventoryCreate17R4P get () { return i; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// FIELDS
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private Class<?> classNmsPlayerInventory;
|
||||||
|
private Class<?> classNmsEntityHuman;
|
||||||
|
private Constructor<?> constructorNmsPlayerInventory;
|
||||||
|
|
||||||
|
private Class<?> classCraftInventoryPlayer;
|
||||||
|
private Constructor<?> constructorCraftInventoryPlayer;
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// SETUP
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setup() throws Throwable
|
||||||
|
{
|
||||||
|
this.classNmsPlayerInventory = ReflectionUtils.PackageType.MINECRAFT_SERVER.getClass("PlayerInventory");
|
||||||
|
this.classNmsEntityHuman = ReflectionUtils.PackageType.MINECRAFT_SERVER.getClass("EntityHuman");
|
||||||
|
this.constructorNmsPlayerInventory = ReflectionUtils.getConstructor(this.classNmsPlayerInventory, this.classNmsEntityHuman);
|
||||||
|
|
||||||
|
this.classCraftInventoryPlayer = ReflectionUtils.PackageType.CRAFTBUKKIT_INVENTORY.getClass("CraftInventoryPlayer");
|
||||||
|
this.constructorCraftInventoryPlayer = ReflectionUtils.getConstructor(this.classCraftInventoryPlayer, this.classNmsPlayerInventory);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// CREATE
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PlayerInventory create()
|
||||||
|
{
|
||||||
|
Object nmsInventory = ReflectionUtil.invokeConstructor(this.constructorNmsPlayerInventory, (Object)null);
|
||||||
|
return ReflectionUtil.invokeConstructor(this.constructorCraftInventoryPlayer, nmsInventory);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,158 +0,0 @@
|
|||||||
package com.massivecraft.massivecore.picker;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import com.massivecraft.massivecore.Engine;
|
|
||||||
import com.massivecraft.massivecore.collections.MassiveList;
|
|
||||||
import com.massivecraft.massivecore.util.ReflectionUtil;
|
|
||||||
|
|
||||||
// TODO: Rename to Mixin... because that's what we are trying to replace.
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public class Picker extends Engine
|
|
||||||
{
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// DEFAULT
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// The default class contains the static fields.
|
|
||||||
// It should never be abstract and should always be compatible.
|
|
||||||
// A default class instance is set as the default value. This avoids null.
|
|
||||||
// It is detected by the required static field d.
|
|
||||||
|
|
||||||
private final Class<?> defaultClass = ReflectionUtil.getSuperclassDeclaringField(this.getClass(), true, "d");
|
|
||||||
public Class<?> getDefaultClass() { return this.defaultClass; }
|
|
||||||
|
|
||||||
public Picker getDefault() { return ReflectionUtil.getField(this.getDefaultClass(), "d", null); }
|
|
||||||
public boolean isDefault() { return this == this.getDefault(); }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// INSTANCE
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// Access the active static instance using instance methods.
|
|
||||||
// This looks a bit strange but will save us a lot of repetitive source code down the road.
|
|
||||||
// These are not meant to be used for selection or activation.
|
|
||||||
// The standard active interface methods are used for that.
|
|
||||||
|
|
||||||
public Picker getInstance() { return ReflectionUtil.getField(this.getDefaultClass(), "i", null); }
|
|
||||||
public void setInstance(Picker i) { ReflectionUtil.setField(this.getDefaultClass(), "i", null, i); }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// FIELDS
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
// This is the base name.
|
|
||||||
// It should describe the function supplied.
|
|
||||||
// It should be set in the base class constructor.
|
|
||||||
private String baseName = this.getDefaultClass().getClass().getSimpleName();
|
|
||||||
public String getBaseName() { return this.baseName; }
|
|
||||||
public void setBaseName(String baseName) { this.baseName = baseName; }
|
|
||||||
|
|
||||||
// This is the instance specific name.
|
|
||||||
// It should describe the circumstances for compatibility.
|
|
||||||
// It could for example contain a version number.
|
|
||||||
private String name = this.getClass().getSimpleName();
|
|
||||||
public String getName() { return this.name; }
|
|
||||||
public void setName(String name) { this.name = name; }
|
|
||||||
|
|
||||||
// This is the list of alternatives to choose from.
|
|
||||||
// The first compatible alternative will be chosen for activation.
|
|
||||||
// The list should thus start with the most provoking and detailed alternative.
|
|
||||||
// If the list is empty we simply offer ourselves.
|
|
||||||
private List<Class<?>> alternatives = new MassiveList<>();
|
|
||||||
public List<Class<?>> getAlternatives() { return this.alternatives; }
|
|
||||||
public <T extends Picker> T setAlternatives(List<Class<?>> alternatives) { this.alternatives = alternatives; return (T) this; }
|
|
||||||
public <T extends Picker> T setAlternatives(Class<?>... alternatives) { return this.setAlternatives(Arrays.asList(alternatives)); }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// CONSTRUCT
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public Picker()
|
|
||||||
{
|
|
||||||
// Provoke!
|
|
||||||
try
|
|
||||||
{
|
|
||||||
this.provoke();
|
|
||||||
}
|
|
||||||
catch (Throwable t)
|
|
||||||
{
|
|
||||||
throw ReflectionUtil.asRuntimeException(t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// PROVOKE
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// Provoke your exceptions and errors here.
|
|
||||||
// If a throwable is thrown here the instance is not compatible with the circumstances.
|
|
||||||
|
|
||||||
public Object provoke() throws Throwable
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// ACTIVE
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// We need to modify the active logic sightly.
|
|
||||||
//
|
|
||||||
// We make use of the standard engine isActive.
|
|
||||||
// That one looks at the engine registry and does not care about the instance.
|
|
||||||
// That behavior tends to work out well for us in this case.
|
|
||||||
//
|
|
||||||
// The reason for this is that the default will be set as the instance from the start.
|
|
||||||
// That does however not mean that it's active.
|
|
||||||
// It means it will be used to set the active which may or may not be itself.
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setActive(boolean active)
|
|
||||||
{
|
|
||||||
// NoChange
|
|
||||||
if (this.isActive() == active) return;
|
|
||||||
|
|
||||||
// Before
|
|
||||||
Picker before = this.getInstance();
|
|
||||||
|
|
||||||
// After
|
|
||||||
Picker after;
|
|
||||||
if (active)
|
|
||||||
{
|
|
||||||
// This
|
|
||||||
after = this;
|
|
||||||
|
|
||||||
// Alternatives
|
|
||||||
for (Class<?> alternative : this.getAlternatives())
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Picker alternativeInstance = ReflectionUtil.getSingletonInstance(alternative);
|
|
||||||
after = alternativeInstance;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
catch (Throwable t)
|
|
||||||
{
|
|
||||||
// Not Compatible
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Default
|
|
||||||
after = this.getDefault();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deactivate Before
|
|
||||||
if (before != this) before.setActive(false);
|
|
||||||
|
|
||||||
// Set Instance
|
|
||||||
this.setInstance(after);
|
|
||||||
|
|
||||||
// Activate After
|
|
||||||
if (after != this) after.setActive(true);
|
|
||||||
|
|
||||||
// Super
|
|
||||||
if (after == this) super.setActive(active);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
package com.massivecraft.massivecore.picker;
|
|
||||||
|
|
||||||
import com.massivecraft.massivecore.MassiveCore;
|
|
||||||
import com.massivecraft.massivecore.util.Txt;
|
|
||||||
|
|
||||||
public class PickerTest extends Picker
|
|
||||||
{
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// DEFAULT
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
private static final PickerTest d = new PickerTest().setAlternatives(
|
|
||||||
PickerTestImpossible.class,
|
|
||||||
PickerTestPossible.class
|
|
||||||
);
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// INSTANCE
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
private static final PickerTest i = d;
|
|
||||||
public static PickerTest get() { return i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// CONSTRUCT
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public PickerTest()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// METHODS
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public void action()
|
|
||||||
{
|
|
||||||
String msg = this.getMsg();
|
|
||||||
String message = Txt.parse(msg);
|
|
||||||
MassiveCore.get().log(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getMsg()
|
|
||||||
{
|
|
||||||
return "<silver>Default...";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,32 +0,0 @@
|
|||||||
package com.massivecraft.massivecore.picker;
|
|
||||||
|
|
||||||
public class PickerTestImpossible extends PickerTest
|
|
||||||
{
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// INSTANCE & CONSTRUCT
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
private static final PickerTestImpossible i = new PickerTestImpossible();
|
|
||||||
public static PickerTestImpossible get() { return i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// PROVOKE
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object provoke() throws Throwable
|
|
||||||
{
|
|
||||||
throw new RuntimeException("so provokative!");
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// METHODS
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getMsg()
|
|
||||||
{
|
|
||||||
return "<rose>Impossible and Unexpected";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
package com.massivecraft.massivecore.picker;
|
|
||||||
|
|
||||||
public class PickerTestPossible extends PickerTest
|
|
||||||
{
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// INSTANCE & CONSTRUCT
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
private static final PickerTestPossible i = new PickerTestPossible();
|
|
||||||
public static PickerTestPossible get() { return i; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// METHODS
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getMsg()
|
|
||||||
{
|
|
||||||
return "<lime>Possible and Expected";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -66,7 +66,7 @@ import com.massivecraft.massivecore.engine.EngineMassiveCoreDatabase;
|
|||||||
import com.massivecraft.massivecore.engine.EngineMassiveCoreMain;
|
import com.massivecraft.massivecore.engine.EngineMassiveCoreMain;
|
||||||
import com.massivecraft.massivecore.engine.EngineMassiveCoreWorldNameSet;
|
import com.massivecraft.massivecore.engine.EngineMassiveCoreWorldNameSet;
|
||||||
import com.massivecraft.massivecore.mixin.MixinMessage;
|
import com.massivecraft.massivecore.mixin.MixinMessage;
|
||||||
import com.massivecraft.massivecore.nms.NmsEntity;
|
import com.massivecraft.massivecore.nms.NmsEntityGet;
|
||||||
import com.massivecraft.massivecore.predicate.Predicate;
|
import com.massivecraft.massivecore.predicate.Predicate;
|
||||||
import com.massivecraft.massivecore.util.extractor.Extractor;
|
import com.massivecraft.massivecore.util.extractor.Extractor;
|
||||||
import com.massivecraft.massivecore.util.extractor.ExtractorPlayer;
|
import com.massivecraft.massivecore.util.extractor.ExtractorPlayer;
|
||||||
@ -189,57 +189,12 @@ public class MUtil
|
|||||||
|
|
||||||
public static Entity getEntity(World world, UUID uuid)
|
public static Entity getEntity(World world, UUID uuid)
|
||||||
{
|
{
|
||||||
if (world == null) throw new NullPointerException("world");
|
return NmsEntityGet.get().getEntity(world, uuid);
|
||||||
if (uuid == null) return null;
|
|
||||||
|
|
||||||
if (NmsEntity.get().isAvailable())
|
|
||||||
{
|
|
||||||
return NmsEntity.get().getEntity(world, uuid);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return getEntityFallback(world, uuid);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Entity getEntity(UUID uuid)
|
public static Entity getEntity(UUID uuid)
|
||||||
{
|
{
|
||||||
if (uuid == null) return null;
|
return NmsEntityGet.get().getEntity(uuid);
|
||||||
|
|
||||||
if (NmsEntity.get().isAvailable())
|
|
||||||
{
|
|
||||||
return NmsEntity.get().getEntity(uuid);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return getEntityFallback(uuid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Entity getEntityFallback(World world, UUID uuid)
|
|
||||||
{
|
|
||||||
if (world == null) throw new NullPointerException("world");
|
|
||||||
if (uuid == null) return null;
|
|
||||||
|
|
||||||
for (Entity entity : world.getEntities())
|
|
||||||
{
|
|
||||||
if (entity.getUniqueId().equals(uuid)) return entity;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Entity getEntityFallback(UUID uuid)
|
|
||||||
{
|
|
||||||
if (uuid == null) return null;
|
|
||||||
|
|
||||||
for (World world : Bukkit.getWorlds())
|
|
||||||
{
|
|
||||||
Entity ret = getEntityFallback(world, uuid);
|
|
||||||
if (ret != null) return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
@ -207,6 +207,22 @@ public class ReflectionUtil
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static <T> T getSingletonInstanceFirstCombatible(Iterable<Class<?>> classes, T fallback)
|
||||||
|
{
|
||||||
|
for (Class<?> c : classes)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return ReflectionUtil.getSingletonInstance(c);
|
||||||
|
}
|
||||||
|
catch (Throwable t)
|
||||||
|
{
|
||||||
|
// Not Compatible
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// FIELD > GET
|
// FIELD > GET
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
Loading…
Reference in New Issue
Block a user