Initial Pass at Minecraft 1.12 support

This commit is contained in:
Olof Larsson 2017-06-11 19:02:26 +02:00
parent 22180b7b3d
commit 5503ba44f0
8 changed files with 134 additions and 30 deletions

View File

@ -35,6 +35,7 @@ import com.massivecraft.massivecore.item.WriterItemStack;
import com.massivecraft.massivecore.mixin.MixinEvent;
import com.massivecraft.massivecore.mson.Mson;
import com.massivecraft.massivecore.mson.MsonEvent;
import com.massivecraft.massivecore.nms.NmsBasics;
import com.massivecraft.massivecore.nms.NmsItemStackCreate17R4P;
import com.massivecraft.massivecore.ps.PS;
import com.massivecraft.massivecore.ps.PSAdapter;
@ -261,7 +262,18 @@ public class MassiveCore extends MassivePlugin
return ret;
}
@Override
public List<Class<?>> getClassesActiveNms()
{
List<Class<?>> ret = super.getClassesActiveNms();
ret.remove(NmsBasics.class);
ret.add(0, NmsBasics.class);
return ret;
}
@Override
public List<Class<?>> getClassesActiveMixins()
{

View File

@ -14,6 +14,7 @@ public class NmsChat extends Mixin
// -------------------------------------------- //
private static NmsChat d = new NmsChat().setAlternatives(
NmsChat112R1P.class,
NmsChat18R2P.class,
NmsChat18R1.class,
NmsChatFallback.class

View File

@ -0,0 +1,54 @@
package com.massivecraft.massivecore.nms;
import com.massivecraft.massivecore.particleeffect.ReflectionUtils.PackageType;
import com.massivecraft.massivecore.util.IdUtil;
import com.massivecraft.massivecore.util.ReflectionUtil;
import org.bukkit.entity.Player;
public class NmsChat112R1P extends NmsChatAbstract
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private static NmsChat112R1P i = new NmsChat112R1P();
public static NmsChat112R1P get() { return i; }
// -------------------------------------------- //
// FIELDS
// -------------------------------------------- //
protected Class<?> classChatMessageType;
protected Object instanceChatMessageTypeGameInfo;
// -------------------------------------------- //
// SETUP
// -------------------------------------------- //
@Override
public void setup() throws Throwable
{
this.classChatSerializer = PackageType.MINECRAFT_SERVER.getClass("IChatBaseComponent$ChatSerializer");
this.methodChatSerializer = ReflectionUtil.getMethod(this.classChatSerializer, "a", String.class);
this.classEnumTitleAction = PackageType.MINECRAFT_SERVER.getClass("PacketPlayOutTitle$EnumTitleAction");
setupCommon();
this.classChatMessageType = PackageType.MINECRAFT_SERVER.getClass("ChatMessageType");
this.instanceChatMessageTypeGameInfo = this.classChatMessageType.getEnumConstants()[2];
// CHAT(0),
// SYSTEM(1),
// GAME_INFO(2);
this.constructorPacketPlayOutChatType = ReflectionUtil.getConstructor(this.classPacketPlayOutChat, this.classIChatBaseComponent, this.classChatMessageType);
}
// -------------------------------------------- //
// ACTIONBAR
// -------------------------------------------- //
@Override
public <T> T constructActionBarPacket(Object component) {
return ReflectionUtil.invokeConstructor(this.constructorPacketPlayOutChatType, component, this.instanceChatMessageTypeGameInfo);
}
}

View File

@ -13,16 +13,19 @@ public class NmsChat18R1 extends NmsChatAbstract
public static NmsChat18R1 get() { return i; }
// -------------------------------------------- //
// SETUP SPECIFIC
// SETUP
// -------------------------------------------- //
@Override
public void setupSpecific() throws Throwable
public void setup() throws Throwable
{
this.classChatSerializer = PackageType.MINECRAFT_SERVER.getClass("ChatSerializer");
this.methodChatSerializer = ReflectionUtil.getMethod(this.classChatSerializer, "a", String.class);
this.classEnumTitleAction = PackageType.MINECRAFT_SERVER.getClass("EnumTitleAction");
setupCommon();
this.constructorPacketPlayOutChatType = ReflectionUtil.getConstructor(this.classPacketPlayOutChat, this.classIChatBaseComponent, Byte.TYPE);
}
}

View File

@ -13,16 +13,18 @@ public class NmsChat18R2P extends NmsChatAbstract
public static NmsChat18R2P get() { return i; }
// -------------------------------------------- //
// SETUP SPECIFIC
// SETUP
// -------------------------------------------- //
@Override
public void setupSpecific() throws Throwable
public void setup() throws Throwable
{
this.classChatSerializer = PackageType.MINECRAFT_SERVER.getClass("IChatBaseComponent$ChatSerializer");
this.methodChatSerializer = ReflectionUtil.getMethod(this.classChatSerializer, "a", String.class);
this.classEnumTitleAction = PackageType.MINECRAFT_SERVER.getClass("PacketPlayOutTitle$EnumTitleAction");
setupCommon();
this.constructorPacketPlayOutChatType = ReflectionUtil.getConstructor(this.classPacketPlayOutChat, this.classIChatBaseComponent, Byte.TYPE);
}
}

View File

@ -61,8 +61,14 @@ public abstract class NmsChatAbstract extends NmsChat
@Override
public void setup() throws Throwable
{
this.setupSpecific();
throw notImplemented();
}
// -------------------------------------------- //
// SETUP COMMON
// -------------------------------------------- //
protected void setupCommon() throws Throwable {
for (Object object : this.classEnumTitleAction.getEnumConstants())
{
Enum<?> e = (Enum<?>) object;
@ -70,27 +76,20 @@ public abstract class NmsChatAbstract extends NmsChat
else if (e.name().equalsIgnoreCase("SUBTITLE")) this.enumEnumTitleActionSub = e;
else if (e.name().equalsIgnoreCase("TIMES")) this.enumEnumTitleActionTimes = e;
}
this.classIChatBaseComponent = PackageType.MINECRAFT_SERVER.getClass("IChatBaseComponent");
// Get title packet and it's constructor
this.classPacketPlayOutTitle = PackageType.MINECRAFT_SERVER.getClass("PacketPlayOutTitle");
this.constructorPacketPlayOutTitle = ReflectionUtil.getConstructor(this.classPacketPlayOutTitle, this.classEnumTitleAction, this.classIChatBaseComponent);
this.constructorPacketPlayOutTitleTimes = ReflectionUtil.getConstructor(this.classPacketPlayOutTitle, this.classEnumTitleAction, this.classIChatBaseComponent, int.class, int.class, int.class);
// Get Chat packet and it's constructor
this.classPacketPlayOutChat = PackageType.MINECRAFT_SERVER.getClass("PacketPlayOutChat");
this.constructorPacketPlayOutChat = ReflectionUtil.getConstructor(this.classPacketPlayOutChat, this.classIChatBaseComponent);
this.constructorPacketPlayOutChatType = ReflectionUtil.getConstructor(this.classPacketPlayOutChat, this.classIChatBaseComponent, Byte.TYPE);
}
// -------------------------------------------- //
// SETUP SPECIFIC
// -------------------------------------------- //
public abstract void setupSpecific() throws Throwable;
// -------------------------------------------- //
// TO COMPONENT
// -------------------------------------------- //
@ -173,8 +172,12 @@ public abstract class NmsChatAbstract extends NmsChat
if (player == null) return;
Object component = toComponent(raw);
Object packet = ReflectionUtil.invokeConstructor(this.constructorPacketPlayOutChatType, component, (byte)2);
Object packet = this.constructActionBarPacket(component);
NmsBasics.get().sendPacket(player, packet);
}
public <T> T constructActionBarPacket(Object component) {
return ReflectionUtil.invokeConstructor(this.constructorPacketPlayOutChatType, component, (byte)2);
}
}

View File

@ -7,7 +7,7 @@ import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import org.bukkit.permissions.PermissibleBase;
public class BasicCommandSender extends PermissibleBase implements CommandSender
public abstract class BasicCommandSender extends PermissibleBase implements CommandSender
{
public final String name;
@ -32,19 +32,13 @@ public class BasicCommandSender extends PermissibleBase implements CommandSender
{
return this.name;
}
@Override
public Server getServer()
{
return Bukkit.getServer();
}
@Override
public void sendMessage(String message)
{
// Nothing per default
}
@Override
public void sendMessage(String[] messages)
{

View File

@ -1,16 +1,51 @@
package com.massivecraft.massivecore.util;
import com.massivecraft.massivecore.collections.MassiveList;
import com.massivecraft.massivecore.predicate.Predicate;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.Recipe;
import org.bukkit.inventory.ShapelessRecipe;
import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.potion.PotionData;
import org.bukkit.potion.PotionType;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
// NOTE: This utility targets 1.9 and will crash on older servers.
public class RecipeUtil
{
{
// ------------------------------------------- //
// REMOVE
// -------------------------------------------- //
public static void remove(Predicate<Recipe> removePredicate)
{
Objects.requireNonNull(removePredicate);
List<Recipe> recipesToRemove = new MassiveList<>();
List<Recipe> recipesToKeep = new MassiveList<>();
Iterator<Recipe> iterator = Bukkit.recipeIterator();
while (iterator.hasNext())
{
Recipe recipe = iterator.next();
List<Recipe> recipes = removePredicate.apply(recipe) ? recipesToRemove : recipesToKeep;
recipes.add(recipe);
}
if (recipesToRemove.isEmpty()) return;
Bukkit.clearRecipes();
for (Recipe recipe : recipesToKeep) {
Bukkit.addRecipe(recipe);
}
}
// ------------------------------------------- //
// POTION
// -------------------------------------------- //