Update to MC 1.13

This commit is contained in:
GeorgH93 2018-08-10 18:05:58 +02:00
parent f697c728c1
commit af875737d7
No known key found for this signature in database
GPG Key ID: D1630D37F9E4B3C8
7 changed files with 86 additions and 53 deletions

View File

@ -1,7 +1,5 @@
Multi Page
Port to message API
DB Migration
API
BungeeCord Sync
Item filter - test
custom backpack name in api
Item filter - test

View File

@ -57,7 +57,7 @@
<dependency>
<groupId>at.pcgamingfreaks</groupId>
<artifactId>PluginLib</artifactId>
<version>1.0.4-SNAPSHOT</version>
<version>1.0.5-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@ -19,6 +19,7 @@ permissions:
backpack.admin: true
backpack.disable:
description: This permission group can be used to disable the plugin for certian users/groups/worlds.
default: false
children:
backpack.use: false
backpack.others: false

View File

@ -17,6 +17,7 @@
package at.pcgamingfreaks.Minepacks.Bukkit;
import at.pcgamingfreaks.Bukkit.MCVersion;
import at.pcgamingfreaks.Bukkit.NMSReflection;
import at.pcgamingfreaks.StringUtils;
@ -31,23 +32,51 @@
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;
public class Backpack implements at.pcgamingfreaks.Minepacks.Bukkit.API.Backpack
{
private final static Method METHOD_GET_INVENTORY = NMSReflection.getOBCMethod("inventory.CraftInventory", "getInventory");
private final static Method METHOD_CRAFT_CHAT_MESSAGE_FROM_STRING = MCVersion.isNewerOrEqualThan(MCVersion.MC_1_13) ? NMSReflection.getOBCMethod("util.CraftChatMessage", "wrapOrNull", String.class) : null;
private final static Field FIELD_TITLE = NMSReflection.getOBCField("inventory.CraftInventoryCustom$MinecraftInventory", "title");
private static Object titleOwn;
private static String titleOtherFormat, titleOther;
private final OfflinePlayer owner;
private final String titleOther;
private final Object titleOtherOBC;
private final HashMap<Player, Boolean> opened = new HashMap<>();
private Inventory bp;
private int size, ownerID;
private boolean hasChanged;
public static void setTitle(final @NotNull String title, final @NotNull String titleOther)
{
titleOwn = prepareTitle(title);
titleOtherFormat = titleOther;
}
private static Object prepareTitle(final @NotNull String title)
{
if(MCVersion.isNewerOrEqualThan(MCVersion.MC_1_13))
{
try
{
//noinspection ConstantConditions
return METHOD_CRAFT_CHAT_MESSAGE_FROM_STRING.invoke(null, title);
}
catch(Exception e)
{
e.printStackTrace();
}
}
else
{
return StringUtils.limitLength(title, 32);
}
return null;
}
public Backpack(OfflinePlayer owner)
{
this(owner, 9);
@ -61,8 +90,19 @@ public Backpack(OfflinePlayer owner, int size)
public Backpack(OfflinePlayer owner, int size, int ID)
{
this.owner = owner;
titleOther = StringUtils.limitLength(String.format(Minepacks.getInstance().backpackTitleOther, owner.getName()), 32);
titleOther = StringUtils.limitLength(String.format(titleOtherFormat, owner.getName()), 32);
bp = Bukkit.createInventory(this, size, titleOther);
Object titleOtherOBC = null;
try
{
//noinspection ConstantConditions
titleOtherOBC = FIELD_TITLE.get(METHOD_GET_INVENTORY.invoke(bp));
}
catch(Exception e)
{
e.printStackTrace();
}
this.titleOtherOBC = titleOtherOBC;
this.size = size;
ownerID = ID;
}
@ -96,7 +136,7 @@ public void open(@NotNull Player player, boolean editable)
}
@Override
public void open(@NotNull Player player, boolean editable, @Nullable String title)
public void open(@NotNull Player player, boolean editable, final @Nullable String title)
{
if(owner.isOnline())
{
@ -119,22 +159,24 @@ public void open(@NotNull Player player, boolean editable, @Nullable String titl
}
opened.put(player, editable);
if(title == null) title = player.equals(owner) ? Minepacks.getInstance().backpackTitle : titleOther;
//region Set backpack title
// It's not perfect, but it is the only way of doing this.
// This sets the title of the inventory based on the person who is opening it.
// The owner will see an other title, then everyone else.
// This way we can add owner name to the tile for everyone else.
try
final Object usedTitle = (title == null) ? (player.equals(owner) ? titleOwn : titleOtherOBC) : prepareTitle(title);
if(usedTitle != null && FIELD_TITLE != null && METHOD_GET_INVENTORY != null)
{
//noinspection ConstantConditions
FIELD_TITLE.setAccessible(true);
//noinspection ConstantConditions
FIELD_TITLE.set(METHOD_GET_INVENTORY.invoke(bp), title);
}
catch(Exception e)
{
e.printStackTrace();
try
{
FIELD_TITLE.set(METHOD_GET_INVENTORY.invoke(bp), usedTitle);
}
catch(Exception e)
{
e.printStackTrace();
}
}
//endregion
player.openInventory(bp);
}
@ -169,13 +211,10 @@ public int getSize()
return size;
}
public List<ItemStack> setSize(int newSize)
public @NotNull List<ItemStack> setSize(int newSize)
{
for(Entry<Player, Boolean> e : opened.entrySet())
{
e.getKey().closeInventory();
}
List<ItemStack> removedItems = new ArrayList<>();
opened.forEach((key, value) -> key.closeInventory()); // Close all open views of the inventory
List<ItemStack> removedItems = new LinkedList<>();
ItemStack[] itemStackArray;
if(bp.getSize() > newSize)
{
@ -185,15 +224,8 @@ public List<ItemStack> setSize(int newSize)
{
if(i != null)
{
if(count < newSize)
{
itemStackArray[count] = i;
count++;
}
else
{
removedItems.add(i);
}
if(count < newSize) itemStackArray[count++] = i;
else removedItems.add(i);
}
}
}
@ -209,10 +241,7 @@ public List<ItemStack> setSize(int newSize)
setChanged();
save(); // Make sure the new inventory is saved
size = newSize;
for(Entry<Player, Boolean> e : opened.entrySet())
{
e.getKey().openInventory(bp);
}
opened.forEach((key, value) -> key.openInventory(bp));
return removedItems;
}

View File

@ -50,7 +50,7 @@ public abstract class Database implements Listener
protected static final String START_UUID_UPDATE = "Start updating database to UUIDs ...", UUIDS_UPDATED = "Updated %d accounts to UUIDs.";
protected final Minepacks plugin;
protected final InventorySerializer itsSerializer = new InventorySerializer();
protected final InventorySerializer itsSerializer;
protected final boolean useUUIDs, bungeeCordMode;
protected boolean useUUIDSeparators;
protected long maxAge;
@ -61,6 +61,7 @@ public abstract class Database implements Listener
public Database(Minepacks mp)
{
plugin = mp;
itsSerializer = new InventorySerializer(plugin.getLogger());
useUUIDSeparators = plugin.getConfiguration().getUseUUIDSeparators();
useUUIDs = plugin.getConfiguration().getUseUUIDs();
bungeeCordMode = plugin.getConfiguration().isBungeeCordModeEnabled();

View File

@ -20,23 +20,28 @@
import at.pcgamingfreaks.Bukkit.ItemStackSerializer.BukkitItemStackSerializer;
import at.pcgamingfreaks.Bukkit.ItemStackSerializer.ItemStackSerializer;
import at.pcgamingfreaks.Bukkit.ItemStackSerializer.NBTItemStackSerializer;
import at.pcgamingfreaks.ConsoleColor;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import java.util.logging.Logger;
public class InventorySerializer
{
private static final ItemStackSerializer BUKKIT_ITEM_STACK_SERIALIZER = new BukkitItemStackSerializer();
private final Logger logger;
private ItemStackSerializer serializer;
private int usedSerializer = 1;
public InventorySerializer()
public InventorySerializer(Logger logger)
{
this.logger = logger;
try
{
if(NBTItemStackSerializer.isMCVersionCompatible())
{
serializer = new NBTItemStackSerializer();
serializer = new NBTItemStackSerializer(logger);
}
}
catch(Exception e)
@ -61,6 +66,7 @@ public ItemStack[] deserialize(byte[] data, int usedSerializer)
switch(usedSerializer)
{
case 0: return BUKKIT_ITEM_STACK_SERIALIZER.deserialize(data);
case 1: if(usedSerializer != this.usedSerializer) { logger.warning(ConsoleColor.RED + "No compatible serializer for item format available!" + ConsoleColor.RESET); return null; }
default: return serializer.deserialize(data);
}
}

View File

@ -28,12 +28,12 @@
import at.pcgamingfreaks.Minepacks.Bukkit.API.MinepacksPlugin;
import at.pcgamingfreaks.Minepacks.Bukkit.Command.CommandManager;
import at.pcgamingfreaks.Minepacks.Bukkit.Database.Config;
import at.pcgamingfreaks.Minepacks.Bukkit.Database.Database;
import at.pcgamingfreaks.Minepacks.Bukkit.Database.Helper.WorldBlacklistMode;
import at.pcgamingfreaks.Minepacks.Bukkit.Database.Language;
import at.pcgamingfreaks.Minepacks.Bukkit.Listener.DisableShulkerboxes;
import at.pcgamingfreaks.Minepacks.Bukkit.Database.Database;
import at.pcgamingfreaks.Minepacks.Bukkit.Listener.DropOnDeath;
import at.pcgamingfreaks.Minepacks.Bukkit.Listener.BackpackEventListener;
import at.pcgamingfreaks.Minepacks.Bukkit.Listener.DisableShulkerboxes;
import at.pcgamingfreaks.Minepacks.Bukkit.Listener.DropOnDeath;
import at.pcgamingfreaks.Minepacks.Bukkit.Listener.ItemFilter;
import at.pcgamingfreaks.PluginLib.Bukkit.PluginLib;
import at.pcgamingfreaks.StringUtils;
@ -66,7 +66,6 @@ public class Minepacks extends JavaPlugin implements MinepacksPlugin
private Language lang;
private Database database;
public String backpackTitleOther = "%s Backpack", backpackTitle = "Backpack";
public Message messageNoPermission, messageInvalidBackpack, messageWorldDisabled, messageNotFromConsole;
private int maxSize;
@ -87,7 +86,7 @@ public void onEnable()
{
Utils.warnOnJava_1_7(getLogger());
//region Check compatibility with used minecraft version
if(MCVersion.is(MCVersion.UNKNOWN) || MCVersion.isNewerThan(MCVersion.MC_NMS_1_12_R1))
if(MCVersion.is(MCVersion.UNKNOWN) || MCVersion.isNewerThan(MCVersion.MC_NMS_1_13_R1))
{
String name = Bukkit.getServer().getClass().getPackage().getName();
String[] version = name.substring(name.lastIndexOf('.') + 2).split("_");
@ -97,7 +96,7 @@ public void onEnable()
}
//endregion
if(PluginLib.getInstance().getVersion().olderThan(new Version("1.0.4-SNAPSHOT")))
if(PluginLib.getInstance().getVersion().olderThan(new Version("1.0.5-SNAPSHOT")))
{
getLogger().warning("You are using an outdated version of the PCGF PluginLib! Please update it!");
setEnabled(false);
@ -122,7 +121,7 @@ public void onEnable()
load();
if(config.getAutoUpdate()) update(null);
StringUtils.getPluginEnabledMessage(getDescription().getName());
getLogger().info(StringUtils.getPluginEnabledMessage(getDescription().getName()));
}
@Override
@ -133,7 +132,7 @@ public void onDisable()
if(config.getAutoUpdate()) updater = update(null);
unload();
if(updater != null) updater.waitForAsyncOperation();
StringUtils.getPluginDisabledMessage(getDescription().getName());
getLogger().info(StringUtils.getPluginDisabledMessage(getDescription().getName()));
instance = null;
}
@ -158,8 +157,7 @@ private void load()
lang.load(config.getLanguage(), config.getLanguageUpdateMode());
database = Database.getDatabase(this);
maxSize = config.getBackpackMaxSize();
backpackTitleOther = config.getBPTitleOther();
backpackTitle = StringUtils.limitLength(config.getBPTitle(), 32);
at.pcgamingfreaks.Minepacks.Bukkit.Backpack.setTitle(config.getBPTitle(), config.getBPTitleOther());
messageNotFromConsole = lang.getMessage("NotFromConsole");
messageNoPermission = lang.getMessage("Ingame.NoPermission");
messageInvalidBackpack = lang.getMessage("Ingame.InvalidBackpack");