Allow versioning of classes that are not Entity
This commit is contained in:
parent
00983bfc94
commit
a5747f102b
@ -31,6 +31,7 @@ import com.massivecraft.massivecore.collections.MassiveTreeSet;
|
||||
import com.massivecraft.massivecore.collections.MassiveTreeSetDef;
|
||||
import com.massivecraft.massivecore.command.type.RegistryType;
|
||||
import com.massivecraft.massivecore.item.DataBannerPattern;
|
||||
import com.massivecraft.massivecore.item.DataItemStack;
|
||||
import com.massivecraft.massivecore.item.WriterItemStack;
|
||||
import com.massivecraft.massivecore.mixin.MixinEvent;
|
||||
import com.massivecraft.massivecore.mson.Mson;
|
||||
@ -43,6 +44,7 @@ import com.massivecraft.massivecore.store.Coll;
|
||||
import com.massivecraft.massivecore.store.EntityInternalMap;
|
||||
import com.massivecraft.massivecore.store.ModificationPollerLocal;
|
||||
import com.massivecraft.massivecore.store.ModificationPollerRemote;
|
||||
import com.massivecraft.massivecore.store.migrator.MigratorUtil;
|
||||
import com.massivecraft.massivecore.util.BoardUtil;
|
||||
import com.massivecraft.massivecore.util.ContainerUtil;
|
||||
import com.massivecraft.massivecore.util.EventUtil;
|
||||
@ -231,6 +233,10 @@ public class MassiveCore extends MassivePlugin
|
||||
// Setup RegistryType
|
||||
RegistryType.registerAll();
|
||||
|
||||
MigratorUtil.addJsonRepresentation(ItemStack.class, DataItemStack.class);
|
||||
MigratorUtil.addJsonRepresentation(Inventory.class, null);
|
||||
MigratorUtil.setTargetVersion(Inventory.class, MigratorUtil.getTargetVersion(DataItemStack.class));
|
||||
|
||||
// Activate
|
||||
this.activateAuto();
|
||||
|
||||
|
@ -3,6 +3,7 @@ package com.massivecraft.massivecore.adapter;
|
||||
import com.massivecraft.massivecore.MassiveCore;
|
||||
import com.massivecraft.massivecore.item.DataItemStack;
|
||||
import com.massivecraft.massivecore.mixin.MixinInventory;
|
||||
import com.massivecraft.massivecore.store.migrator.MigratorUtil;
|
||||
import com.massivecraft.massivecore.xlib.gson.JsonDeserializationContext;
|
||||
import com.massivecraft.massivecore.xlib.gson.JsonDeserializer;
|
||||
import com.massivecraft.massivecore.xlib.gson.JsonElement;
|
||||
@ -156,6 +157,10 @@ public class AdapterInventory implements JsonDeserializer<Inventory>, JsonSerial
|
||||
jsonInventory.add(index, jsonItemStack);
|
||||
}
|
||||
|
||||
// Add version
|
||||
int version = MigratorUtil.getTargetVersion(DataItemStack.class);
|
||||
jsonInventory.addProperty(MigratorUtil.VERSION_FIELD_NAME, version);
|
||||
|
||||
return jsonInventory;
|
||||
}
|
||||
|
||||
@ -191,16 +196,14 @@ public class AdapterInventory implements JsonDeserializer<Inventory>, JsonSerial
|
||||
// Helmet
|
||||
if (jsonInventory.has(HELMET))
|
||||
{
|
||||
jsonItemStack = jsonInventory.get(HELMET);
|
||||
itemStack = MassiveCore.gson.fromJson(jsonItemStack, ItemStack.class);
|
||||
itemStack = getItemStack(jsonInventory, HELMET);
|
||||
pret.setHelmet(itemStack);
|
||||
}
|
||||
|
||||
// Chestplate
|
||||
if (jsonInventory.has(CHESTPLATE))
|
||||
{
|
||||
jsonItemStack = jsonInventory.get(CHESTPLATE);
|
||||
itemStack = MassiveCore.gson.fromJson(jsonItemStack, ItemStack.class);
|
||||
itemStack = getItemStack(jsonInventory, CHESTPLATE);
|
||||
pret.setChestplate(itemStack);
|
||||
}
|
||||
|
||||
@ -215,16 +218,14 @@ public class AdapterInventory implements JsonDeserializer<Inventory>, JsonSerial
|
||||
// Boots
|
||||
if (jsonInventory.has(BOOTS))
|
||||
{
|
||||
jsonItemStack = jsonInventory.get(BOOTS);
|
||||
itemStack = MassiveCore.gson.fromJson(jsonItemStack, ItemStack.class);
|
||||
itemStack = getItemStack(jsonInventory, BOOTS);
|
||||
pret.setBoots(itemStack);
|
||||
}
|
||||
|
||||
// Shield (Minecraft 1.9)
|
||||
if (jsonInventory.has(SHIELD) && INDEX_PLAYER_SHIELD < pret.getSize())
|
||||
{
|
||||
jsonItemStack = jsonInventory.get(SHIELD);
|
||||
itemStack = MassiveCore.gson.fromJson(jsonItemStack, ItemStack.class);
|
||||
itemStack = getItemStack(jsonInventory, SHIELD);
|
||||
pret.setItem(INDEX_PLAYER_SHIELD, itemStack);
|
||||
}
|
||||
}
|
||||
@ -241,9 +242,7 @@ public class AdapterInventory implements JsonDeserializer<Inventory>, JsonSerial
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
String stackIdx = String.valueOf(i);
|
||||
jsonItemStack = jsonInventory.get(stackIdx);
|
||||
if (jsonItemStack == null) continue;
|
||||
itemStack = MassiveCore.gson.fromJson(jsonItemStack, ItemStack.class);
|
||||
itemStack = getItemStack(jsonInventory, stackIdx);
|
||||
if (itemStack == null) continue;
|
||||
ret.setItem(i, itemStack);
|
||||
}
|
||||
@ -251,6 +250,16 @@ public class AdapterInventory implements JsonDeserializer<Inventory>, JsonSerial
|
||||
return ret;
|
||||
}
|
||||
|
||||
private static ItemStack getItemStack(JsonObject jsonInventory, String idx)
|
||||
{
|
||||
// Get jsonItemStack
|
||||
JsonElement jsonItemStack = jsonInventory.get(idx);
|
||||
if (jsonItemStack == null) return null;
|
||||
|
||||
ItemStack ret = MassiveCore.gson.fromJson(jsonItemStack, ItemStack.class);
|
||||
return ret;
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// UTIL
|
||||
// -------------------------------------------- //
|
||||
|
@ -1,6 +1,7 @@
|
||||
package com.massivecraft.massivecore.adapter;
|
||||
|
||||
import com.massivecraft.massivecore.item.DataItemStack;
|
||||
import com.massivecraft.massivecore.store.migrator.MigratorUtil;
|
||||
import com.massivecraft.massivecore.xlib.gson.JsonDeserializationContext;
|
||||
import com.massivecraft.massivecore.xlib.gson.JsonDeserializer;
|
||||
import com.massivecraft.massivecore.xlib.gson.JsonElement;
|
||||
|
@ -0,0 +1,522 @@
|
||||
package com.massivecraft.massivecore.entity.migrator;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.massivecraft.massivecore.collections.MassiveMap;
|
||||
import com.massivecraft.massivecore.item.DataItemStack;
|
||||
import com.massivecraft.massivecore.store.migrator.MigratorRoot;
|
||||
import com.massivecraft.massivecore.xlib.gson.JsonElement;
|
||||
import com.massivecraft.massivecore.xlib.gson.JsonObject;
|
||||
import com.massivecraft.massivecore.xlib.gson.JsonPrimitive;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class MigratorDataItemStack001StringId extends MigratorRoot
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
// INSTANCE & CONSTRUCT
|
||||
// -------------------------------------------- //
|
||||
|
||||
private static MigratorDataItemStack001StringId i = new MigratorDataItemStack001StringId();
|
||||
public static MigratorDataItemStack001StringId get() { return i; }
|
||||
private MigratorDataItemStack001StringId()
|
||||
{
|
||||
super(DataItemStack.class);
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// CONVERSION
|
||||
// -------------------------------------------- //
|
||||
|
||||
@Override
|
||||
public void migrateInner(JsonObject json)
|
||||
{
|
||||
// Get the id
|
||||
JsonElement id = json.get("id");
|
||||
if (id == null || id.isJsonNull()) return;
|
||||
|
||||
// The id is either a number or string, always a JsonPrimitive
|
||||
JsonPrimitive primitive = id.getAsJsonPrimitive();
|
||||
|
||||
// Only convert if number
|
||||
if (!primitive.isNumber()) return;
|
||||
int typeId = primitive.getAsInt();
|
||||
String name = id2name.get(typeId);
|
||||
if (name == null) throw new RuntimeException(String.valueOf(typeId));
|
||||
JsonElement newValue = new JsonPrimitive(name);
|
||||
json.add("id", newValue);
|
||||
}
|
||||
|
||||
private static final Map<Integer, String> id2name;
|
||||
|
||||
static
|
||||
{
|
||||
Map<Integer, String> map = new MassiveMap<>();
|
||||
|
||||
map.put(0, "AIR");
|
||||
map.put(1, "STONE");
|
||||
map.put(2, "GRASS");
|
||||
map.put(3, "DIRT");
|
||||
map.put(4, "COBBLESTONE");
|
||||
map.put(5, "WOOD");
|
||||
map.put(6, "SAPLING");
|
||||
map.put(7, "BEDROCK");
|
||||
map.put(8, "WATER");
|
||||
map.put(9, "STATIONARY_WATER");
|
||||
map.put(10, "LAVA");
|
||||
map.put(11, "STATIONARY_LAVA");
|
||||
map.put(12, "SAND");
|
||||
map.put(13, "GRAVEL");
|
||||
map.put(14, "GOLD_ORE");
|
||||
map.put(15, "IRON_ORE");
|
||||
map.put(16, "COAL_ORE");
|
||||
map.put(17, "LOG");
|
||||
map.put(18, "LEAVES");
|
||||
map.put(19, "SPONGE");
|
||||
map.put(20, "GLASS");
|
||||
map.put(21, "LAPIS_ORE");
|
||||
map.put(22, "LAPIS_BLOCK");
|
||||
map.put(23, "DISPENSER");
|
||||
map.put(24, "SANDSTONE");
|
||||
map.put(25, "NOTE_BLOCK");
|
||||
map.put(26, "BED_BLOCK");
|
||||
map.put(27, "POWERED_RAIL");
|
||||
map.put(28, "DETECTOR_RAIL");
|
||||
map.put(29, "PISTON_STICKY_BASE");
|
||||
map.put(30, "WEB");
|
||||
map.put(31, "LONG_GRASS");
|
||||
map.put(32, "DEAD_BUSH");
|
||||
map.put(33, "PISTON_BASE");
|
||||
map.put(34, "PISTON_EXTENSION");
|
||||
map.put(35, "WOOL");
|
||||
map.put(36, "PISTON_MOVING_PIECE");
|
||||
map.put(37, "YELLOW_FLOWER");
|
||||
map.put(38, "RED_ROSE");
|
||||
map.put(39, "BROWN_MUSHROOM");
|
||||
map.put(40, "RED_MUSHROOM");
|
||||
map.put(41, "GOLD_BLOCK");
|
||||
map.put(42, "IRON_BLOCK");
|
||||
map.put(43, "DOUBLE_STEP");
|
||||
map.put(44, "STEP");
|
||||
map.put(45, "BRICK");
|
||||
map.put(46, "TNT");
|
||||
map.put(47, "BOOKSHELF");
|
||||
map.put(48, "MOSSY_COBBLESTONE");
|
||||
map.put(49, "OBSIDIAN");
|
||||
map.put(50, "TORCH");
|
||||
map.put(51, "FIRE");
|
||||
map.put(52, "MOB_SPAWNER");
|
||||
map.put(53, "WOOD_STAIRS");
|
||||
map.put(54, "CHEST");
|
||||
map.put(55, "REDSTONE_WIRE");
|
||||
map.put(56, "DIAMOND_ORE");
|
||||
map.put(57, "DIAMOND_BLOCK");
|
||||
map.put(58, "WORKBENCH");
|
||||
map.put(59, "CROPS");
|
||||
map.put(60, "SOIL");
|
||||
map.put(61, "FURNACE");
|
||||
map.put(62, "BURNING_FURNACE");
|
||||
map.put(63, "SIGN_POST");
|
||||
map.put(64, "WOODEN_DOOR");
|
||||
map.put(65, "LADDER");
|
||||
map.put(66, "RAILS");
|
||||
map.put(67, "COBBLESTONE_STAIRS");
|
||||
map.put(68, "WALL_SIGN");
|
||||
map.put(69, "LEVER");
|
||||
map.put(70, "STONE_PLATE");
|
||||
map.put(71, "IRON_DOOR_BLOCK");
|
||||
map.put(72, "WOOD_PLATE");
|
||||
map.put(73, "REDSTONE_ORE");
|
||||
map.put(74, "GLOWING_REDSTONE_ORE");
|
||||
map.put(75, "REDSTONE_TORCH_OFF");
|
||||
map.put(76, "REDSTONE_TORCH_ON");
|
||||
map.put(77, "STONE_BUTTON");
|
||||
map.put(78, "SNOW");
|
||||
map.put(79, "ICE");
|
||||
map.put(80, "SNOW_BLOCK");
|
||||
map.put(81, "CACTUS");
|
||||
map.put(82, "CLAY");
|
||||
map.put(83, "SUGAR_CANE_BLOCK");
|
||||
map.put(84, "JUKEBOX");
|
||||
map.put(85, "FENCE");
|
||||
map.put(86, "PUMPKIN");
|
||||
map.put(87, "NETHERRACK");
|
||||
map.put(88, "SOUL_SAND");
|
||||
map.put(89, "GLOWSTONE");
|
||||
map.put(90, "PORTAL");
|
||||
map.put(91, "JACK_O_LANTERN");
|
||||
map.put(92, "CAKE_BLOCK");
|
||||
map.put(93, "DIODE_BLOCK_OFF");
|
||||
map.put(94, "DIODE_BLOCK_ON");
|
||||
map.put(95, "STAINED_GLASS");
|
||||
map.put(96, "TRAP_DOOR");
|
||||
map.put(97, "MONSTER_EGGS");
|
||||
map.put(98, "SMOOTH_BRICK");
|
||||
map.put(99, "HUGE_MUSHROOM_1");
|
||||
map.put(100, "HUGE_MUSHROOM_2");
|
||||
map.put(101, "IRON_FENCE");
|
||||
map.put(102, "THIN_GLASS");
|
||||
map.put(103, "MELON_BLOCK");
|
||||
map.put(104, "PUMPKIN_STEM");
|
||||
map.put(105, "MELON_STEM");
|
||||
map.put(106, "VINE");
|
||||
map.put(107, "FENCE_GATE");
|
||||
map.put(108, "BRICK_STAIRS");
|
||||
map.put(109, "SMOOTH_STAIRS");
|
||||
map.put(110, "MYCEL");
|
||||
map.put(111, "WATER_LILY");
|
||||
map.put(112, "NETHER_BRICK");
|
||||
map.put(113, "NETHER_FENCE");
|
||||
map.put(114, "NETHER_BRICK_STAIRS");
|
||||
map.put(115, "NETHER_WARTS");
|
||||
map.put(116, "ENCHANTMENT_TABLE");
|
||||
map.put(117, "BREWING_STAND");
|
||||
map.put(118, "CAULDRON");
|
||||
map.put(119, "ENDER_PORTAL");
|
||||
map.put(120, "ENDER_PORTAL_FRAME");
|
||||
map.put(121, "ENDER_STONE");
|
||||
map.put(122, "DRAGON_EGG");
|
||||
map.put(123, "REDSTONE_LAMP_OFF");
|
||||
map.put(124, "REDSTONE_LAMP_ON");
|
||||
map.put(125, "WOOD_DOUBLE_STEP");
|
||||
map.put(126, "WOOD_STEP");
|
||||
map.put(127, "COCOA");
|
||||
map.put(128, "SANDSTONE_STAIRS");
|
||||
map.put(129, "EMERALD_ORE");
|
||||
map.put(130, "ENDER_CHEST");
|
||||
map.put(131, "TRIPWIRE_HOOK");
|
||||
map.put(132, "TRIPWIRE");
|
||||
map.put(133, "EMERALD_BLOCK");
|
||||
map.put(134, "SPRUCE_WOOD_STAIRS");
|
||||
map.put(135, "BIRCH_WOOD_STAIRS");
|
||||
map.put(136, "JUNGLE_WOOD_STAIRS");
|
||||
map.put(137, "COMMAND");
|
||||
map.put(138, "BEACON");
|
||||
map.put(139, "COBBLE_WALL");
|
||||
map.put(140, "FLOWER_POT");
|
||||
map.put(141, "CARROT");
|
||||
map.put(142, "POTATO");
|
||||
map.put(143, "WOOD_BUTTON");
|
||||
map.put(144, "SKULL");
|
||||
map.put(145, "ANVIL");
|
||||
map.put(146, "TRAPPED_CHEST");
|
||||
map.put(147, "GOLD_PLATE");
|
||||
map.put(148, "IRON_PLATE");
|
||||
map.put(149, "REDSTONE_COMPARATOR_OFF");
|
||||
map.put(150, "REDSTONE_COMPARATOR_ON");
|
||||
map.put(151, "DAYLIGHT_DETECTOR");
|
||||
map.put(152, "REDSTONE_BLOCK");
|
||||
map.put(153, "QUARTZ_ORE");
|
||||
map.put(154, "HOPPER");
|
||||
map.put(155, "QUARTZ_BLOCK");
|
||||
map.put(156, "QUARTZ_STAIRS");
|
||||
map.put(157, "ACTIVATOR_RAIL");
|
||||
map.put(158, "DROPPER");
|
||||
map.put(159, "STAINED_CLAY");
|
||||
map.put(160, "STAINED_GLASS_PANE");
|
||||
map.put(161, "LEAVES_2");
|
||||
map.put(162, "LOG_2");
|
||||
map.put(163, "ACACIA_STAIRS");
|
||||
map.put(164, "DARK_OAK_STAIRS");
|
||||
map.put(165, "SLIME_BLOCK");
|
||||
map.put(166, "BARRIER");
|
||||
map.put(167, "IRON_TRAPDOOR");
|
||||
map.put(168, "PRISMARINE");
|
||||
map.put(169, "SEA_LANTERN");
|
||||
map.put(170, "HAY_BLOCK");
|
||||
map.put(171, "CARPET");
|
||||
map.put(172, "HARD_CLAY");
|
||||
map.put(173, "COAL_BLOCK");
|
||||
map.put(174, "PACKED_ICE");
|
||||
map.put(175, "DOUBLE_PLANT");
|
||||
map.put(176, "STANDING_BANNER");
|
||||
map.put(177, "WALL_BANNER");
|
||||
map.put(178, "DAYLIGHT_DETECTOR_INVERTED");
|
||||
map.put(179, "RED_SANDSTONE");
|
||||
map.put(180, "RED_SANDSTONE_STAIRS");
|
||||
map.put(181, "DOUBLE_STONE_SLAB2");
|
||||
map.put(182, "STONE_SLAB2");
|
||||
map.put(183, "SPRUCE_FENCE_GATE");
|
||||
map.put(184, "BIRCH_FENCE_GATE");
|
||||
map.put(185, "JUNGLE_FENCE_GATE");
|
||||
map.put(186, "DARK_OAK_FENCE_GATE");
|
||||
map.put(187, "ACACIA_FENCE_GATE");
|
||||
map.put(188, "SPRUCE_FENCE");
|
||||
map.put(189, "BIRCH_FENCE");
|
||||
map.put(190, "JUNGLE_FENCE");
|
||||
map.put(191, "DARK_OAK_FENCE");
|
||||
map.put(192, "ACACIA_FENCE");
|
||||
map.put(193, "SPRUCE_DOOR");
|
||||
map.put(194, "BIRCH_DOOR");
|
||||
map.put(195, "JUNGLE_DOOR");
|
||||
map.put(196, "ACACIA_DOOR");
|
||||
map.put(197, "DARK_OAK_DOOR");
|
||||
map.put(198, "END_ROD");
|
||||
map.put(199, "CHORUS_PLANT");
|
||||
map.put(200, "CHORUS_FLOWER");
|
||||
map.put(201, "PURPUR_BLOCK");
|
||||
map.put(202, "PURPUR_PILLAR");
|
||||
map.put(203, "PURPUR_STAIRS");
|
||||
map.put(204, "PURPUR_DOUBLE_SLAB");
|
||||
map.put(205, "PURPUR_SLAB");
|
||||
map.put(206, "END_BRICKS");
|
||||
map.put(207, "BEETROOT_BLOCK");
|
||||
map.put(208, "GRASS_PATH");
|
||||
map.put(209, "END_GATEWAY");
|
||||
map.put(210, "COMMAND_REPEATING");
|
||||
map.put(211, "COMMAND_CHAIN");
|
||||
map.put(212, "FROSTED_ICE");
|
||||
map.put(213, "MAGMA");
|
||||
map.put(214, "NETHER_WART_BLOCK");
|
||||
map.put(215, "RED_NETHER_BRICK");
|
||||
map.put(216, "BONE_BLOCK");
|
||||
map.put(217, "STRUCTURE_VOID");
|
||||
map.put(218, "OBSERVER");
|
||||
map.put(219, "WHITE_SHULKER_BOX");
|
||||
map.put(220, "ORANGE_SHULKER_BOX");
|
||||
map.put(221, "MAGENTA_SHULKER_BOX");
|
||||
map.put(222, "LIGHT_BLUE_SHULKER_BOX");
|
||||
map.put(223, "YELLOW_SHULKER_BOX");
|
||||
map.put(224, "LIME_SHULKER_BOX");
|
||||
map.put(225, "PINK_SHULKER_BOX");
|
||||
map.put(226, "GRAY_SHULKER_BOX");
|
||||
map.put(227, "SILVER_SHULKER_BOX");
|
||||
map.put(228, "CYAN_SHULKER_BOX");
|
||||
map.put(229, "PURPLE_SHULKER_BOX");
|
||||
map.put(230, "BLUE_SHULKER_BOX");
|
||||
map.put(231, "BROWN_SHULKER_BOX");
|
||||
map.put(232, "GREEN_SHULKER_BOX");
|
||||
map.put(233, "RED_SHULKER_BOX");
|
||||
map.put(234, "BLACK_SHULKER_BOX");
|
||||
map.put(235, "WHITE_GLAZED_TERRACOTTA");
|
||||
map.put(236, "ORANGE_GLAZED_TERRACOTTA");
|
||||
map.put(237, "MAGENTA_GLAZED_TERRACOTTA");
|
||||
map.put(238, "LIGHT_BLUE_GLAZED_TERRACOTTA");
|
||||
map.put(239, "YELLOW_GLAZED_TERRACOTTA");
|
||||
map.put(240, "LIME_GLAZED_TERRACOTTA");
|
||||
map.put(241, "PINK_GLAZED_TERRACOTTA");
|
||||
map.put(242, "GRAY_GLAZED_TERRACOTTA");
|
||||
map.put(243, "SILVER_GLAZED_TERRACOTTA");
|
||||
map.put(244, "CYAN_GLAZED_TERRACOTTA");
|
||||
map.put(245, "PURPLE_GLAZED_TERRACOTTA");
|
||||
map.put(246, "BLUE_GLAZED_TERRACOTTA");
|
||||
map.put(247, "BROWN_GLAZED_TERRACOTTA");
|
||||
map.put(248, "GREEN_GLAZED_TERRACOTTA");
|
||||
map.put(249, "RED_GLAZED_TERRACOTTA");
|
||||
map.put(250, "BLACK_GLAZED_TERRACOTTA");
|
||||
map.put(251, "CONCRETE");
|
||||
map.put(252, "CONCRETE_POWDER");
|
||||
map.put(255, "STRUCTURE_BLOCK");
|
||||
map.put(256, "IRON_SPADE");
|
||||
map.put(257, "IRON_PICKAXE");
|
||||
map.put(258, "IRON_AXE");
|
||||
map.put(259, "FLINT_AND_STEEL");
|
||||
map.put(260, "APPLE");
|
||||
map.put(261, "BOW");
|
||||
map.put(262, "ARROW");
|
||||
map.put(263, "COAL");
|
||||
map.put(264, "DIAMOND");
|
||||
map.put(265, "IRON_INGOT");
|
||||
map.put(266, "GOLD_INGOT");
|
||||
map.put(267, "IRON_SWORD");
|
||||
map.put(268, "WOOD_SWORD");
|
||||
map.put(269, "WOOD_SPADE");
|
||||
map.put(270, "WOOD_PICKAXE");
|
||||
map.put(271, "WOOD_AXE");
|
||||
map.put(272, "STONE_SWORD");
|
||||
map.put(273, "STONE_SPADE");
|
||||
map.put(274, "STONE_PICKAXE");
|
||||
map.put(275, "STONE_AXE");
|
||||
map.put(276, "DIAMOND_SWORD");
|
||||
map.put(277, "DIAMOND_SPADE");
|
||||
map.put(278, "DIAMOND_PICKAXE");
|
||||
map.put(279, "DIAMOND_AXE");
|
||||
map.put(280, "STICK");
|
||||
map.put(281, "BOWL");
|
||||
map.put(282, "MUSHROOM_SOUP");
|
||||
map.put(283, "GOLD_SWORD");
|
||||
map.put(284, "GOLD_SPADE");
|
||||
map.put(285, "GOLD_PICKAXE");
|
||||
map.put(286, "GOLD_AXE");
|
||||
map.put(287, "STRING");
|
||||
map.put(288, "FEATHER");
|
||||
map.put(289, "SULPHUR");
|
||||
map.put(290, "WOOD_HOE");
|
||||
map.put(291, "STONE_HOE");
|
||||
map.put(292, "IRON_HOE");
|
||||
map.put(293, "DIAMOND_HOE");
|
||||
map.put(294, "GOLD_HOE");
|
||||
map.put(295, "SEEDS");
|
||||
map.put(296, "WHEAT");
|
||||
map.put(297, "BREAD");
|
||||
map.put(298, "LEATHER_HELMET");
|
||||
map.put(299, "LEATHER_CHESTPLATE");
|
||||
map.put(300, "LEATHER_LEGGINGS");
|
||||
map.put(301, "LEATHER_BOOTS");
|
||||
map.put(302, "CHAINMAIL_HELMET");
|
||||
map.put(303, "CHAINMAIL_CHESTPLATE");
|
||||
map.put(304, "CHAINMAIL_LEGGINGS");
|
||||
map.put(305, "CHAINMAIL_BOOTS");
|
||||
map.put(306, "IRON_HELMET");
|
||||
map.put(307, "IRON_CHESTPLATE");
|
||||
map.put(308, "IRON_LEGGINGS");
|
||||
map.put(309, "IRON_BOOTS");
|
||||
map.put(310, "DIAMOND_HELMET");
|
||||
map.put(311, "DIAMOND_CHESTPLATE");
|
||||
map.put(312, "DIAMOND_LEGGINGS");
|
||||
map.put(313, "DIAMOND_BOOTS");
|
||||
map.put(314, "GOLD_HELMET");
|
||||
map.put(315, "GOLD_CHESTPLATE");
|
||||
map.put(316, "GOLD_LEGGINGS");
|
||||
map.put(317, "GOLD_BOOTS");
|
||||
map.put(318, "FLINT");
|
||||
map.put(319, "PORK");
|
||||
map.put(320, "GRILLED_PORK");
|
||||
map.put(321, "PAINTING");
|
||||
map.put(322, "GOLDEN_APPLE");
|
||||
map.put(323, "SIGN");
|
||||
map.put(324, "WOOD_DOOR");
|
||||
map.put(325, "BUCKET");
|
||||
map.put(326, "WATER_BUCKET");
|
||||
map.put(327, "LAVA_BUCKET");
|
||||
map.put(328, "MINECART");
|
||||
map.put(329, "SADDLE");
|
||||
map.put(330, "IRON_DOOR");
|
||||
map.put(331, "REDSTONE");
|
||||
map.put(332, "SNOW_BALL");
|
||||
map.put(333, "BOAT");
|
||||
map.put(334, "LEATHER");
|
||||
map.put(335, "MILK_BUCKET");
|
||||
map.put(336, "CLAY_BRICK");
|
||||
map.put(337, "CLAY_BALL");
|
||||
map.put(338, "SUGAR_CANE");
|
||||
map.put(339, "PAPER");
|
||||
map.put(340, "BOOK");
|
||||
map.put(341, "SLIME_BALL");
|
||||
map.put(342, "STORAGE_MINECART");
|
||||
map.put(343, "POWERED_MINECART");
|
||||
map.put(344, "EGG");
|
||||
map.put(345, "COMPASS");
|
||||
map.put(346, "FISHING_ROD");
|
||||
map.put(347, "WATCH");
|
||||
map.put(348, "GLOWSTONE_DUST");
|
||||
map.put(349, "RAW_FISH");
|
||||
map.put(350, "COOKED_FISH");
|
||||
map.put(351, "INK_SACK");
|
||||
map.put(352, "BONE");
|
||||
map.put(353, "SUGAR");
|
||||
map.put(354, "CAKE");
|
||||
map.put(355, "BED");
|
||||
map.put(356, "DIODE");
|
||||
map.put(357, "COOKIE");
|
||||
map.put(358, "MAP");
|
||||
map.put(359, "SHEARS");
|
||||
map.put(360, "MELON");
|
||||
map.put(361, "PUMPKIN_SEEDS");
|
||||
map.put(362, "MELON_SEEDS");
|
||||
map.put(363, "RAW_BEEF");
|
||||
map.put(364, "COOKED_BEEF");
|
||||
map.put(365, "RAW_CHICKEN");
|
||||
map.put(366, "COOKED_CHICKEN");
|
||||
map.put(367, "ROTTEN_FLESH");
|
||||
map.put(368, "ENDER_PEARL");
|
||||
map.put(369, "BLAZE_ROD");
|
||||
map.put(370, "GHAST_TEAR");
|
||||
map.put(371, "GOLD_NUGGET");
|
||||
map.put(372, "NETHER_STALK");
|
||||
map.put(373, "POTION");
|
||||
map.put(374, "GLASS_BOTTLE");
|
||||
map.put(375, "SPIDER_EYE");
|
||||
map.put(376, "FERMENTED_SPIDER_EYE");
|
||||
map.put(377, "BLAZE_POWDER");
|
||||
map.put(378, "MAGMA_CREAM");
|
||||
map.put(379, "BREWING_STAND_ITEM");
|
||||
map.put(380, "CAULDRON_ITEM");
|
||||
map.put(381, "EYE_OF_ENDER");
|
||||
map.put(382, "SPECKLED_MELON");
|
||||
map.put(383, "MONSTER_EGG");
|
||||
map.put(384, "EXP_BOTTLE");
|
||||
map.put(385, "FIREBALL");
|
||||
map.put(386, "BOOK_AND_QUILL");
|
||||
map.put(387, "WRITTEN_BOOK");
|
||||
map.put(388, "EMERALD");
|
||||
map.put(389, "ITEM_FRAME");
|
||||
map.put(390, "FLOWER_POT_ITEM");
|
||||
map.put(391, "CARROT_ITEM");
|
||||
map.put(392, "POTATO_ITEM");
|
||||
map.put(393, "BAKED_POTATO");
|
||||
map.put(394, "POISONOUS_POTATO");
|
||||
map.put(395, "EMPTY_MAP");
|
||||
map.put(396, "GOLDEN_CARROT");
|
||||
map.put(397, "SKULL_ITEM");
|
||||
map.put(398, "CARROT_STICK");
|
||||
map.put(399, "NETHER_STAR");
|
||||
map.put(400, "PUMPKIN_PIE");
|
||||
map.put(401, "FIREWORK");
|
||||
map.put(402, "FIREWORK_CHARGE");
|
||||
map.put(403, "ENCHANTED_BOOK");
|
||||
map.put(404, "REDSTONE_COMPARATOR");
|
||||
map.put(405, "NETHER_BRICK_ITEM");
|
||||
map.put(406, "QUARTZ");
|
||||
map.put(407, "EXPLOSIVE_MINECART");
|
||||
map.put(408, "HOPPER_MINECART");
|
||||
map.put(409, "PRISMARINE_SHARD");
|
||||
map.put(410, "PRISMARINE_CRYSTALS");
|
||||
map.put(411, "RABBIT");
|
||||
map.put(412, "COOKED_RABBIT");
|
||||
map.put(413, "RABBIT_STEW");
|
||||
map.put(414, "RABBIT_FOOT");
|
||||
map.put(415, "RABBIT_HIDE");
|
||||
map.put(416, "ARMOR_STAND");
|
||||
map.put(417, "IRON_BARDING");
|
||||
map.put(418, "GOLD_BARDING");
|
||||
map.put(419, "DIAMOND_BARDING");
|
||||
map.put(420, "LEASH");
|
||||
map.put(421, "NAME_TAG");
|
||||
map.put(422, "COMMAND_MINECART");
|
||||
map.put(423, "MUTTON");
|
||||
map.put(424, "COOKED_MUTTON");
|
||||
map.put(425, "BANNER");
|
||||
map.put(426, "END_CRYSTAL");
|
||||
map.put(427, "SPRUCE_DOOR_ITEM");
|
||||
map.put(428, "BIRCH_DOOR_ITEM");
|
||||
map.put(429, "JUNGLE_DOOR_ITEM");
|
||||
map.put(430, "ACACIA_DOOR_ITEM");
|
||||
map.put(431, "DARK_OAK_DOOR_ITEM");
|
||||
map.put(432, "CHORUS_FRUIT");
|
||||
map.put(433, "CHORUS_FRUIT_POPPED");
|
||||
map.put(434, "BEETROOT");
|
||||
map.put(435, "BEETROOT_SEEDS");
|
||||
map.put(436, "BEETROOT_SOUP");
|
||||
map.put(437, "DRAGONS_BREATH");
|
||||
map.put(438, "SPLASH_POTION");
|
||||
map.put(439, "SPECTRAL_ARROW");
|
||||
map.put(440, "TIPPED_ARROW");
|
||||
map.put(441, "LINGERING_POTION");
|
||||
map.put(442, "SHIELD");
|
||||
map.put(443, "ELYTRA");
|
||||
map.put(444, "BOAT_SPRUCE");
|
||||
map.put(445, "BOAT_BIRCH");
|
||||
map.put(446, "BOAT_JUNGLE");
|
||||
map.put(447, "BOAT_ACACIA");
|
||||
map.put(448, "BOAT_DARK_OAK");
|
||||
map.put(449, "TOTEM");
|
||||
map.put(450, "SHULKER_SHELL");
|
||||
map.put(452, "IRON_NUGGET");
|
||||
map.put(453, "KNOWLEDGE_BOOK");
|
||||
map.put(2256, "GOLD_RECORD");
|
||||
map.put(2257, "GREEN_RECORD");
|
||||
map.put(2258, "RECORD_3");
|
||||
map.put(2259, "RECORD_4");
|
||||
map.put(2260, "RECORD_5");
|
||||
map.put(2261, "RECORD_6");
|
||||
map.put(2262, "RECORD_7");
|
||||
map.put(2263, "RECORD_8");
|
||||
map.put(2264, "RECORD_9");
|
||||
map.put(2265, "RECORD_10");
|
||||
map.put(2266, "RECORD_11");
|
||||
map.put(2267, "RECORD_12");
|
||||
|
||||
id2name = ImmutableMap.copyOf(map);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,69 @@
|
||||
package com.massivecraft.massivecore.entity.migrator;
|
||||
|
||||
import com.massivecraft.massivecore.adapter.AdapterInventory;
|
||||
import com.massivecraft.massivecore.item.DataItemStack;
|
||||
import com.massivecraft.massivecore.store.migrator.MigratorRoot;
|
||||
import com.massivecraft.massivecore.store.migrator.MigratorUtil;
|
||||
import com.massivecraft.massivecore.util.MUtil;
|
||||
import com.massivecraft.massivecore.xlib.gson.JsonElement;
|
||||
import com.massivecraft.massivecore.xlib.gson.JsonObject;
|
||||
import com.massivecraft.massivecore.xlib.gson.JsonPrimitive;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
|
||||
public class MigratorInventory001StringId extends MigratorRoot
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
// CONSTANTS
|
||||
// -------------------------------------------- //
|
||||
|
||||
public static final Set<String> NAMES_EXTRA_FIELDS = MUtil.set(
|
||||
AdapterInventory.HELMET,
|
||||
AdapterInventory.CHESTPLATE,
|
||||
AdapterInventory.LEGGINGS,
|
||||
AdapterInventory.BOOTS,
|
||||
AdapterInventory.SHIELD
|
||||
);
|
||||
|
||||
// -------------------------------------------- //
|
||||
// INSTANCE & CONSTRUCT
|
||||
// -------------------------------------------- //
|
||||
|
||||
private static MigratorInventory001StringId i = new MigratorInventory001StringId();
|
||||
public static MigratorInventory001StringId get() { return i; }
|
||||
private MigratorInventory001StringId()
|
||||
{
|
||||
super(Inventory.class);
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// CONVERSION
|
||||
// -------------------------------------------- //
|
||||
|
||||
@Override
|
||||
public void migrateInner(JsonObject json)
|
||||
{
|
||||
for (Entry<String, JsonElement> entry : json.entrySet())
|
||||
{
|
||||
String name = entry.getKey();
|
||||
boolean updateable = NAMES_EXTRA_FIELDS.contains(name) || StringUtils.isNumeric(name);
|
||||
|
||||
if (!updateable) continue;
|
||||
|
||||
updateField(json, name);
|
||||
}
|
||||
}
|
||||
|
||||
public void updateField(JsonObject json, String name)
|
||||
{
|
||||
JsonElement element = json.get(name);
|
||||
if (element == null) return;
|
||||
if (!element.isJsonObject()) return;
|
||||
JsonObject object = element.getAsJsonObject();
|
||||
MigratorUtil.migrate(DataItemStack.class, object);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package com.massivecraft.massivecore.item;
|
||||
|
||||
import org.bukkit.Material;
|
||||
|
||||
public class ConverterFromMaterial extends Converter<Material, String>
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
// INSTANCE & CONSTRUCT
|
||||
// -------------------------------------------- //
|
||||
|
||||
private static final ConverterFromMaterial i = new ConverterFromMaterial();
|
||||
public static ConverterFromMaterial get() { return i; }
|
||||
|
||||
// -------------------------------------------- //
|
||||
// OVERRIDE
|
||||
// -------------------------------------------- //
|
||||
|
||||
@Override
|
||||
public String convert(Material x)
|
||||
{
|
||||
if (x == null) return null;
|
||||
return x.name();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package com.massivecraft.massivecore.item;
|
||||
|
||||
import org.bukkit.Material;
|
||||
|
||||
public class ConverterToMaterial extends Converter<String, Material>
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
// INSTANCE & CONSTRUCT
|
||||
// -------------------------------------------- //
|
||||
|
||||
private static final ConverterToMaterial i = new ConverterToMaterial();
|
||||
public static ConverterToMaterial get() { return i; }
|
||||
|
||||
// -------------------------------------------- //
|
||||
// OVERRIDE
|
||||
// -------------------------------------------- //
|
||||
|
||||
@Override
|
||||
public Material convert(String x)
|
||||
{
|
||||
if (x == null) return null;
|
||||
Material ret = Material.getMaterial(x);
|
||||
if (ret == null) throw new NullPointerException(x);
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
@ -5,6 +5,7 @@ import com.massivecraft.massivecore.collections.MassiveListDef;
|
||||
import com.massivecraft.massivecore.collections.MassiveMap;
|
||||
import com.massivecraft.massivecore.collections.MassiveTreeMapDef;
|
||||
import com.massivecraft.massivecore.collections.MassiveTreeSetDef;
|
||||
import com.massivecraft.massivecore.command.editor.annotation.EditorEditable;
|
||||
import com.massivecraft.massivecore.command.editor.annotation.EditorMethods;
|
||||
import com.massivecraft.massivecore.command.editor.annotation.EditorType;
|
||||
import com.massivecraft.massivecore.command.editor.annotation.EditorTypeInner;
|
||||
@ -21,6 +22,7 @@ import com.massivecraft.massivecore.util.InventoryUtil;
|
||||
import com.massivecraft.massivecore.util.MUtil;
|
||||
import com.massivecraft.massivecore.xlib.gson.annotations.SerializedName;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.Collection;
|
||||
@ -56,7 +58,7 @@ public class DataItemStack implements Comparable<DataItemStack>
|
||||
// Since Bukkit doesn't NPE evade much we save ourselves a lot of trouble that way.
|
||||
// Especially note how all collections default to empty immutables instead of null.
|
||||
|
||||
public static final transient Integer DEFAULT_ID = 0;
|
||||
public static final transient String DEFAULT_ID = Material.AIR.name();
|
||||
public static final transient Integer DEFAULT_COUNT = 1;
|
||||
public static final transient Integer DEFAULT_DAMAGE = 0;
|
||||
public static final transient String DEFAULT_NAME = null;
|
||||
@ -83,14 +85,22 @@ public class DataItemStack implements Comparable<DataItemStack>
|
||||
public static final transient Integer DEFAULT_POTION_COLOR = null;
|
||||
public static final transient Integer DEFAULT_MAP_COLOR = null;
|
||||
|
||||
// -------------------------------------------- //
|
||||
// FIELDS > VERSION
|
||||
// -------------------------------------------- //
|
||||
|
||||
@EditorEditable(false)
|
||||
@EditorVisible(false)
|
||||
private int version = 1;
|
||||
|
||||
// -------------------------------------------- //
|
||||
// FIELDS > BASIC
|
||||
// -------------------------------------------- //
|
||||
|
||||
@EditorType(value = TypeMaterialId.class)
|
||||
private Integer id = null;
|
||||
public int getId() { return get(this.id, DEFAULT_ID); }
|
||||
public DataItemStack setId(int id) { this.id = set(id, DEFAULT_ID); return this; }
|
||||
private String id = null;
|
||||
public String getId() { return get(this.id, DEFAULT_ID); }
|
||||
public DataItemStack setId(String id) { this.id = set(id, DEFAULT_ID); return this; }
|
||||
|
||||
private Integer count = null;
|
||||
public int getCount() { return get(this.count, DEFAULT_COUNT); }
|
||||
@ -461,7 +471,7 @@ public class DataItemStack implements Comparable<DataItemStack>
|
||||
public static boolean isSomething(DataItemStack dataItemStack)
|
||||
{
|
||||
if (dataItemStack == null) return false;
|
||||
if (dataItemStack.getId() == 0) return false;
|
||||
if (dataItemStack.getId().equals(DEFAULT_ID)) return false;
|
||||
// In Minecraft 1.9 zero quantity is a thing.
|
||||
return true;
|
||||
}
|
||||
|
@ -1,8 +1,9 @@
|
||||
package com.massivecraft.massivecore.item;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public class WriterItemStackId extends WriterAbstractItemStackField<Integer, Integer>
|
||||
public class WriterItemStackId extends WriterAbstractItemStackField<String, Material>
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
// INSTANCE & CONSTRUCT
|
||||
@ -10,35 +11,38 @@ public class WriterItemStackId extends WriterAbstractItemStackField<Integer, Int
|
||||
|
||||
private static final WriterItemStackId i = new WriterItemStackId();
|
||||
public static WriterItemStackId get() { return i; }
|
||||
public WriterItemStackId()
|
||||
{
|
||||
this.setConverterTo(ConverterToMaterial.get());
|
||||
this.setConverterFrom(ConverterFromMaterial.get());
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// ACCESS
|
||||
// -------------------------------------------- //
|
||||
|
||||
@Override
|
||||
public Integer getA(DataItemStack ca, ItemStack d)
|
||||
public String getA(DataItemStack ca, ItemStack d)
|
||||
{
|
||||
return ca.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setA(DataItemStack ca, Integer fa, ItemStack d)
|
||||
public void setA(DataItemStack ca, String fa, ItemStack d)
|
||||
{
|
||||
ca.setId(fa);
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public Integer getB(ItemStack cb, ItemStack d)
|
||||
public Material getB(ItemStack cb, ItemStack d)
|
||||
{
|
||||
return cb.getTypeId();
|
||||
return cb.getType();
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public void setB(ItemStack cb, Integer fb, ItemStack d)
|
||||
public void setB(ItemStack cb, Material fb, ItemStack d)
|
||||
{
|
||||
cb.setTypeId(fb);
|
||||
cb.setType(fb);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -138,10 +138,6 @@ public class Coll<E extends Entity<E>> extends CollAbstract<E>
|
||||
// BEHAVIOR
|
||||
// -------------------------------------------- //
|
||||
|
||||
// What entity version do we want?
|
||||
protected final int entityTargetVersion;
|
||||
@Override public int getEntityTargetVersion() { return this.entityTargetVersion; }
|
||||
|
||||
// This should be false under most circumstances.
|
||||
// In some cases such as Factions we want it though.
|
||||
// Especially so we don't change the years old way Factions does it.
|
||||
@ -290,14 +286,14 @@ public class Coll<E extends Entity<E>> extends CollAbstract<E>
|
||||
Long mtime = remoteEntry.getValue();
|
||||
|
||||
int version = MigratorUtil.getVersion(raw);
|
||||
if (version > this.getEntityTargetVersion())
|
||||
if (version > MigratorUtil.getTargetVersion(this.getEntityClass()))
|
||||
{
|
||||
logLoadError(id, String.format("Cannot load entity of entity version %d", version));
|
||||
return;
|
||||
}
|
||||
|
||||
// Migrate if another version is wanted
|
||||
boolean migrated = MigratorUtil.migrate(this.getEntityClass(), raw, this.getEntityTargetVersion());
|
||||
boolean migrated = MigratorUtil.migrate(this.getEntityClass(), raw);
|
||||
|
||||
// Calculate temp but handle raw cases.
|
||||
E temp;
|
||||
@ -320,8 +316,13 @@ public class Coll<E extends Entity<E>> extends CollAbstract<E>
|
||||
}
|
||||
else
|
||||
{
|
||||
// Create first
|
||||
entity = this.createNewInstance();
|
||||
// Create first (or load from registry)
|
||||
// The registry is used by MassiveMagic
|
||||
Map<String, E> tempRegistry = this.getTempRegistry();
|
||||
if(tempRegistry != null) entity = tempRegistry.get(id);
|
||||
if (entity == null) entity = this.createNewInstance();
|
||||
|
||||
if (tempRegistry != null) tempRegistry.remove(id);
|
||||
|
||||
// Copy over data first
|
||||
this.copy(temp, entity);
|
||||
@ -774,18 +775,6 @@ public class Coll<E extends Entity<E>> extends CollAbstract<E>
|
||||
this.idToEntity = new ConcurrentHashMap<>();
|
||||
this.identifiedModifications = new ConcurrentHashMap<>();
|
||||
|
||||
// Migration
|
||||
int version = 0;
|
||||
try
|
||||
{
|
||||
version = ReflectionUtil.getField(this.getEntityClass(), MigratorUtil.VERSION_FIELD_NAME, this.createNewInstance());
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// The field was not there
|
||||
}
|
||||
this.entityTargetVersion = version;
|
||||
|
||||
// Tasks
|
||||
this.tickTask = new Runnable()
|
||||
{
|
||||
@ -877,7 +866,7 @@ public class Coll<E extends Entity<E>> extends CollAbstract<E>
|
||||
// TODO: Clean up this stuff below. It branches too late.
|
||||
if (active)
|
||||
{
|
||||
MigratorUtil.validateMigratorsPresent(entityClass, 0, this.getEntityTargetVersion());
|
||||
MigratorUtil.validateMigratorsPresent(entityClass, 0, MigratorUtil.getTargetVersion(entityClass));
|
||||
|
||||
if (this.supportsPusher())
|
||||
{
|
||||
|
@ -2,6 +2,7 @@ package com.massivecraft.massivecore.store;
|
||||
|
||||
import com.massivecraft.massivecore.xlib.gson.JsonObject;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
|
||||
@ -47,6 +48,11 @@ public abstract class CollAbstract<E extends Entity<E>> extends EntityContainerA
|
||||
this.saveToRemoteFixed(this.fixIdOrThrow(oid));
|
||||
}
|
||||
|
||||
@Override public Map<String, E> getTempRegistry()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadFromRemote(Object oid, Entry<JsonObject, Long> remoteEntry)
|
||||
{
|
||||
|
@ -41,12 +41,6 @@ public interface CollInterface<E extends Entity<E>> extends Named, Active, Ident
|
||||
|
||||
Collection<String> getIdsRemote();
|
||||
|
||||
// -------------------------------------------- //
|
||||
// BEHAVIOR
|
||||
// -------------------------------------------- //
|
||||
|
||||
int getEntityTargetVersion();
|
||||
|
||||
// -------------------------------------------- //
|
||||
// SYNC LOG
|
||||
// -------------------------------------------- //
|
||||
@ -69,6 +63,8 @@ public interface CollInterface<E extends Entity<E>> extends Named, Active, Ident
|
||||
void saveToRemoteFixed(String id);
|
||||
void loadFromRemoteFixed(String id, Entry<JsonObject, Long> remoteEntry);
|
||||
|
||||
Map<String, E> getTempRegistry();
|
||||
|
||||
// -------------------------------------------- //
|
||||
// SYNC EXAMINE AND DO
|
||||
// -------------------------------------------- //
|
||||
|
@ -2,12 +2,6 @@ package com.massivecraft.massivecore.store;
|
||||
|
||||
import com.massivecraft.massivecore.xlib.gson.JsonObject;
|
||||
|
||||
/**
|
||||
* Usage of this class is highly optional. You may persist anything. If you are
|
||||
* creating the class to be persisted yourself, it might be handy to extend this
|
||||
* Entity class. It just contains a set of shortcut methods.
|
||||
*/
|
||||
|
||||
// Self referencing generic.
|
||||
// http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html#FAQ206
|
||||
public class Entity<E extends Entity<E>> extends EntityInternal<E>
|
||||
|
@ -124,12 +124,14 @@ public class GsonEqualsChecker
|
||||
// Boolean check
|
||||
if (one.isBoolean())
|
||||
{
|
||||
if (!two.isBoolean()) return false;
|
||||
return one.getAsBoolean() == two.getAsBoolean();
|
||||
}
|
||||
|
||||
// Number check
|
||||
if (one.isNumber())
|
||||
{
|
||||
if (!two.isNumber()) return false;
|
||||
Number oneNumber = one.getAsNumber();
|
||||
Number twoNumber = two.getAsNumber();
|
||||
|
||||
@ -149,6 +151,7 @@ public class GsonEqualsChecker
|
||||
// String check
|
||||
if (one.isString())
|
||||
{
|
||||
if (!two.isString()) return false;
|
||||
return one.getAsString().equals(two.getAsString());
|
||||
}
|
||||
|
||||
|
@ -24,16 +24,16 @@ public class MigratorRoot implements Migrator, Active
|
||||
this.innerMigrators.add(innerMigrator);
|
||||
}
|
||||
|
||||
private final Class<? extends Entity<?>> entityClass;
|
||||
public Class<? extends Entity<?>> getEntityClass() { return entityClass; }
|
||||
private final Class<?> clazz;
|
||||
public Class<?> getClazz() { return clazz; }
|
||||
|
||||
// -------------------------------------------- //
|
||||
// CONSTRUCT
|
||||
// -------------------------------------------- //
|
||||
|
||||
public MigratorRoot(Class<? extends Entity<?>> entityClass)
|
||||
public MigratorRoot(Class<?> clazz)
|
||||
{
|
||||
this.entityClass = entityClass;
|
||||
this.clazz = clazz;
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
|
@ -2,15 +2,22 @@ package com.massivecraft.massivecore.store.migrator;
|
||||
|
||||
import com.massivecraft.massivecore.collections.MassiveList;
|
||||
import com.massivecraft.massivecore.collections.MassiveMap;
|
||||
import com.massivecraft.massivecore.store.Entity;
|
||||
import com.massivecraft.massivecore.util.ReflectionUtil;
|
||||
import com.massivecraft.massivecore.util.Txt;
|
||||
import com.massivecraft.massivecore.xlib.gson.JsonElement;
|
||||
import com.massivecraft.massivecore.xlib.gson.JsonObject;
|
||||
import com.massivecraft.massivecore.xlib.gson.annotations.SerializedName;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.ParameterizedType;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
public class MigratorUtil
|
||||
{
|
||||
@ -21,10 +28,10 @@ public class MigratorUtil
|
||||
public static final String VERSION_FIELD_NAME = "version";
|
||||
|
||||
// -------------------------------------------- //
|
||||
// REGISTRY
|
||||
// MIGRATOR REGISTRY
|
||||
// -------------------------------------------- //
|
||||
|
||||
private static Map<Class<? extends Entity<?>>, Map<Integer, MigratorRoot>> migrators = new HashMap<>();
|
||||
private static Map<Class<?>, Map<Integer, MigratorRoot>> migrators = new HashMap<>();
|
||||
|
||||
public static boolean isActive(MigratorRoot migrator)
|
||||
{
|
||||
@ -50,7 +57,7 @@ public class MigratorUtil
|
||||
}
|
||||
|
||||
// GET
|
||||
public static MigratorRoot getMigrator(Class<? extends Entity<?>> entityClass, int version)
|
||||
public static MigratorRoot getMigrator(Class<?> entityClass, int version)
|
||||
{
|
||||
Map<Integer, MigratorRoot> migratorMap = getMigratorMap(entityClass);
|
||||
|
||||
@ -66,10 +73,10 @@ public class MigratorUtil
|
||||
// GET MAP
|
||||
private static Map<Integer, MigratorRoot> getMigratorMap(MigratorRoot migrator)
|
||||
{
|
||||
return getMigratorMap(migrator.getEntityClass());
|
||||
return getMigratorMap(migrator.getClazz());
|
||||
}
|
||||
|
||||
private static Map<Integer, MigratorRoot> getMigratorMap(Class<? extends Entity<?>> entityClass)
|
||||
private static Map<Integer, MigratorRoot> getMigratorMap(Class<?> entityClass)
|
||||
{
|
||||
Map<Integer, MigratorRoot> ret = migrators.get(entityClass);
|
||||
if (ret == null)
|
||||
@ -80,15 +87,139 @@ public class MigratorUtil
|
||||
return ret;
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// TARGET VERSION
|
||||
// -------------------------------------------- //
|
||||
|
||||
private static Map<Class<?>, Integer> targetVersions = new HashMap<>();
|
||||
|
||||
// ADD
|
||||
public static void setTargetVersion(Class<?> clazz, int targetVersion)
|
||||
{
|
||||
targetVersions.put(clazz, targetVersion);
|
||||
}
|
||||
|
||||
// GET
|
||||
public static int getTargetVersion(Class<?> entityClass)
|
||||
{
|
||||
if (!targetVersions.containsKey(entityClass))
|
||||
{
|
||||
targetVersions.put(entityClass, computeTargetVersion(entityClass));
|
||||
}
|
||||
return targetVersions.get(entityClass);
|
||||
}
|
||||
|
||||
public static int computeTargetVersion(Class<?> clazz)
|
||||
{
|
||||
int version = 0;
|
||||
try
|
||||
{
|
||||
version = ReflectionUtil.getField(clazz, VERSION_FIELD_NAME, ReflectionUtil.newInstance(clazz));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// The field was not there
|
||||
}
|
||||
return version;
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// JSON REPRESENTATION
|
||||
// -------------------------------------------- //
|
||||
|
||||
private static Map<Class<?>, Type> jsonRepresentation = new HashMap<>();
|
||||
|
||||
// ADD
|
||||
public static void addJsonRepresentation(Class<?> clazz, Type representation)
|
||||
{
|
||||
jsonRepresentation.put(clazz, representation);
|
||||
}
|
||||
|
||||
// GET
|
||||
public static Type getJsonRepresentation(Type actualType)
|
||||
{
|
||||
if (!jsonRepresentation.containsKey(actualType))
|
||||
{
|
||||
return actualType;
|
||||
}
|
||||
return jsonRepresentation.get(actualType);
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------------------- //
|
||||
// MIGRATE
|
||||
// -------------------------------------------- //
|
||||
|
||||
public static boolean migrate(Class<? extends Entity<?>> entityClass, JsonObject entity, int targetVersion)
|
||||
public static boolean migrate(Type realType, JsonElement jsonElement)
|
||||
{
|
||||
if (entityClass == null) throw new NullPointerException("entityClass");
|
||||
if (jsonElement == null) throw new NullPointerException("element");
|
||||
|
||||
if (jsonElement.isJsonNull()) return false;
|
||||
if (jsonElement.isJsonPrimitive()) return false;
|
||||
|
||||
Type jsonType = getJsonRepresentation(realType);
|
||||
|
||||
if (jsonElement.isJsonObject())
|
||||
{
|
||||
if (jsonType != null && Map.class.isAssignableFrom(getClassType(jsonType)))
|
||||
{
|
||||
ParameterizedType parameterizedType = (ParameterizedType) jsonType;
|
||||
Type keyType = parameterizedType.getActualTypeArguments()[0];
|
||||
Type valueType = parameterizedType.getActualTypeArguments()[1];
|
||||
|
||||
JsonObject object = jsonElement.getAsJsonObject();
|
||||
|
||||
boolean migrated = false;
|
||||
for (Entry<String, JsonElement> entry : object.entrySet())
|
||||
{
|
||||
migrated = migrate(valueType, entry.getValue()) | migrated;
|
||||
}
|
||||
return migrated;
|
||||
}
|
||||
|
||||
boolean migrated = false;
|
||||
JsonObject object = jsonElement.getAsJsonObject();
|
||||
Type classType = jsonType != null ? jsonType : realType;
|
||||
migrated = migrateClass(classType, object) | migrated;
|
||||
if (jsonType != null) migrated = migrateFields(jsonType, object) | migrated;
|
||||
return migrated;
|
||||
|
||||
}
|
||||
if (jsonElement.isJsonArray())
|
||||
{
|
||||
Class<?> clazz = getClassType(jsonType);
|
||||
|
||||
Type elementType = null;
|
||||
|
||||
if (clazz.isArray())
|
||||
{
|
||||
elementType = clazz.getComponentType();
|
||||
}
|
||||
else if (Collection.class.isAssignableFrom(clazz))
|
||||
{
|
||||
ParameterizedType parameterizedType = (ParameterizedType) jsonType;
|
||||
elementType = parameterizedType.getActualTypeArguments()[0];
|
||||
}
|
||||
|
||||
boolean migrated = false;
|
||||
for (JsonElement element1 : jsonElement.getAsJsonArray())
|
||||
{
|
||||
migrated = migrate(elementType, element1) | migrated;
|
||||
}
|
||||
return migrated;
|
||||
}
|
||||
|
||||
throw new RuntimeException();
|
||||
}
|
||||
|
||||
public static boolean migrateClass(Type type, JsonObject entity)
|
||||
{
|
||||
if (type == null) throw new NullPointerException("entityClass");
|
||||
if (entity == null) throw new NullPointerException("entity");
|
||||
|
||||
Class<?> entityClass = getClassType(type);
|
||||
|
||||
int targetVersion = getTargetVersion(entityClass);
|
||||
int entityVersion = getVersion(entity);
|
||||
if (entityVersion == targetVersion) return false;
|
||||
|
||||
@ -97,9 +228,6 @@ public class MigratorUtil
|
||||
for (; entityVersion < targetVersion; entityVersion++)
|
||||
{
|
||||
// When upgrading we need the migrator we are updating to.
|
||||
// When downgrading we need the migrator we are downgrading from.
|
||||
// This is done to preserve the same logic within the same class.
|
||||
// That is why when updating we don't use entityVersion and when downgrading we do.
|
||||
Migrator migrator = getMigrator(entityClass, entityVersion+1);
|
||||
migrator.migrate(entity);
|
||||
}
|
||||
@ -107,11 +235,64 @@ public class MigratorUtil
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean migrateFields(Type type, JsonObject object)
|
||||
{
|
||||
if (type == null) throw new NullPointerException("entityClass");
|
||||
if (object == null) throw new NullPointerException("object");
|
||||
|
||||
Class<?> entityClass = getClassType(type);
|
||||
|
||||
// We can't lookup the generic type of a map, so trying to convert the fields is useless
|
||||
// Furthermore maps are stored as jsopnobjects, and we can't treat them like other objects
|
||||
// because their "fields" are dynamically made and can't be looked up with reflection
|
||||
if (Map.class.isAssignableFrom(entityClass)) return false;
|
||||
|
||||
boolean migrated = false;
|
||||
for (Entry<String, JsonElement> entry : object.entrySet())
|
||||
{
|
||||
String name = entry.getKey();
|
||||
JsonElement element = entry.getValue();
|
||||
|
||||
// It might be defined in a superclass, so find the defining class
|
||||
Class<?> superClass = ReflectionUtil.getSuperclassDeclaringField(entityClass, true, name);
|
||||
|
||||
// Try find field if it has a different serialisation name
|
||||
if (superClass == null)
|
||||
{
|
||||
Field field = tryFindField(entityClass, name);
|
||||
if (field != null)
|
||||
{
|
||||
name = field.getName();
|
||||
superClass = entityClass;
|
||||
}
|
||||
}
|
||||
Type elementType = ReflectionUtil.getField(superClass, name).getGenericType();
|
||||
migrated = migrate(elementType, element) | migrated;
|
||||
}
|
||||
|
||||
return migrated;
|
||||
}
|
||||
|
||||
private static Field tryFindField(Class<?> clazz, String name)
|
||||
{
|
||||
for (Field field : clazz.getDeclaredFields())
|
||||
{
|
||||
SerializedName serializedName = field.getAnnotation(SerializedName.class);
|
||||
if (serializedName == null) continue;
|
||||
|
||||
if (serializedName.value().equals(name))
|
||||
{
|
||||
return field;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// MISSING MIGRATORS
|
||||
// -------------------------------------------- //
|
||||
|
||||
public static void validateMigratorsPresent(Class<? extends Entity<?>> entityClass, int from, int to)
|
||||
public static void validateMigratorsPresent(Class<?> entityClass, int from, int to)
|
||||
{
|
||||
List<Integer> missingMigrators = MigratorUtil.getMissingMigratorVersions(entityClass, from, to);
|
||||
if (missingMigrators.isEmpty()) return;
|
||||
@ -121,7 +302,7 @@ public class MigratorUtil
|
||||
throw new IllegalStateException(String.format("Could not find migrators for %s for versions: %s", name, versions));
|
||||
}
|
||||
|
||||
public static List<Integer> getMissingMigratorVersions(Class<? extends Entity<?>> entityClass, int from, int to)
|
||||
public static List<Integer> getMissingMigratorVersions(Class<?> entityClass, int from, int to)
|
||||
{
|
||||
if (from == to) return Collections.emptyList();
|
||||
if (from > to) throw new IllegalArgumentException(String.format("from: %d to: %d", from, to));
|
||||
@ -152,4 +333,21 @@ public class MigratorUtil
|
||||
return element.getAsInt();
|
||||
}
|
||||
|
||||
public static Class<?> getClassType(Type type)
|
||||
{
|
||||
if (type == null) return null;
|
||||
if (type instanceof Class<?>)
|
||||
{
|
||||
return (Class<?>) type;
|
||||
}
|
||||
else if (type instanceof ParameterizedType)
|
||||
{
|
||||
return (Class<?>) ((ParameterizedType) type).getRawType();
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new RuntimeException(type.getTypeName());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,21 +1,14 @@
|
||||
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.NamespacedKey;
|
||||
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
|
||||
{
|
||||
@ -79,7 +72,7 @@ public class RecipeUtil
|
||||
@SuppressWarnings("deprecation")
|
||||
public static ShapelessRecipe createShapeless(ItemStack result, Object... objects)
|
||||
{
|
||||
ShapelessRecipe recipe = new ShapelessRecipe(result);
|
||||
ShapelessRecipe recipe = new ShapelessRecipe(NamespacedKey.randomKey(), result);
|
||||
|
||||
int quantity = 1;
|
||||
int data = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user