diff --git a/Compatibility/src/com/songoda/core/compatibility/ClassMapping.java b/Compatibility/src/com/songoda/core/compatibility/ClassMapping.java
new file mode 100644
index 00000000..dd36552c
--- /dev/null
+++ b/Compatibility/src/com/songoda/core/compatibility/ClassMapping.java
@@ -0,0 +1,75 @@
+package com.songoda.core.compatibility;
+
+public enum ClassMapping {
+
+ BIOME_BASE("world.level.biome", "BiomeBase"),
+ BIOME_STORAGE("world.level.chunk", "BiomeStorage"),
+ BLOCK("level.block", "BlockPosition"),
+ BLOCK_BASE("world.level.block.state", "BlockBase"),
+ BLOCK_BUTTON_ABSTRACT("world.level.block", "BlockButtonAbstract"),
+ BLOCK_PRESSURE_PLATE_ABSTRACT("world.level.block", "BlockPressurePlateAbstract"),
+ BLOCK_LEVER("world.level.block", "BlockLever"),
+ BLOCKS("world.level.block", "Blocks"),
+ BLOCK_POSITION("core", "BlockPosition"),
+ CHAT_MESSAGE_TYPE("network.chat", "ChatMessageType"),
+ CHUNK("world.level.chunk", "Chunk"),
+ ENTITY("world.entity", "Entity"),
+ ENTITY_INSENTIENT("world.entity", "EntityInsentient"),
+ ENTITY_PLAYER("server.level", "EntityPlayer"),
+ I_BLOCK_DATA("world.level.block.state", "IBlockData"),
+ I_CHAT_BASE_COMPONENT("network.chat", "IChatBaseComponent"),
+ I_REGISTRY("core", "IRegistry"),
+ ITEM("world.item", "Item"),
+ ITEM_STACK("world.item", "ItemStack"),
+ LEVEL_ENTITY_GETTER("level.entity", "LevelEntityGetter"),
+ MINECRAFT_SERVER("server", "MinecraftServer"),
+ NBT_TAG_COMPOUND("nbt", "NBTTagCompound"),
+ NBT_TAG_LIST("nbt", "NBTTagList"),
+ NBT_BASE("nbt", "NBTBase"),
+ PERSISTENT_ENTITY_SECTION_MANAGER("world.level.entity", "PersistentEntitySectionManager"),
+ PACKET("network.protocol", "Packet"),
+ PACKET_PLAY_OUT_CHAT("network.protocol.game", "PacketPlayOutChat"),
+ PACKET_PLAY_OUT_WORLD_BORDER("PacketPlayOutWorldBorder"), // Removed in 1.17
+ PLAYER_CONNECTION("server.network", "PlayerConnection"),
+ WORLD("world.level", "World"),
+ WORLD_BORDER("world.level.border", "WorldBorder"),
+ WORLD_SERVER("server.level", "WorldServer"),
+
+ CRAFT_BLOCK("block", "CraftBlock"),
+ CRAFT_BLOCK_DATA("block.data", "CraftBlockData"),
+ CRAFT_CHUNK("craftChunk"),
+ CRAFT_ENTITY("entity", "CraftEntity"),
+ CRAFT_PLAYER("entity", "CraftPlayer"),
+ CRAFT_WORLD("CraftWorld");
+
+ private final String packageName;
+ private final String className;
+
+ ClassMapping(String packageName) {
+ this(null, packageName);
+ }
+
+ ClassMapping(String packageName, String className) {
+ this.packageName = packageName;
+ this.className = className;
+ }
+
+ public Class> getClazz() {
+ return getClazz(null);
+ }
+
+ public Class> getClazz(String sub) {
+ try {
+ String name = sub == null ? className : className + "$" + sub;
+ if (className.startsWith("Craft"))
+ return Class.forName("org.bukkit.craftbukkit." + ServerVersion.getServerVersionString()
+ + (packageName == null ? "" : "." + packageName) + "." + name);
+ return Class.forName("net.minecraft." + (
+ ServerVersion.isServerVersionAtLeast(ServerVersion.V1_17) && packageName != null
+ ? packageName : "server." + ServerVersion.getServerVersionString()) + "." + name);
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+}
diff --git a/Compatibility/src/com/songoda/core/compatibility/ClientVersion.java b/Compatibility/src/com/songoda/core/compatibility/ClientVersion.java
index 47fc37e9..02fd1add 100644
--- a/Compatibility/src/com/songoda/core/compatibility/ClientVersion.java
+++ b/Compatibility/src/com/songoda/core/compatibility/ClientVersion.java
@@ -98,6 +98,8 @@ public class ClientVersion {
case 753:
case 754:
return ServerVersion.V1_16;
+ case 755:
+ return ServerVersion.V1_17;
}
return version > 498 ? ServerVersion.getServerVersion() : ServerVersion.UNKNOWN;
}
diff --git a/Compatibility/src/com/songoda/core/compatibility/CompatibleBiome.java b/Compatibility/src/com/songoda/core/compatibility/CompatibleBiome.java
index f46698c6..45701b96 100644
--- a/Compatibility/src/com/songoda/core/compatibility/CompatibleBiome.java
+++ b/Compatibility/src/com/songoda/core/compatibility/CompatibleBiome.java
@@ -25,6 +25,10 @@ import java.util.Set;
*/
public enum CompatibleBiome {
+ /* 1.17 */
+ DRIPSTONE_CAVES(ServerVersion.V1_17),
+ LUSH_CAVES(ServerVersion.V1_17),
+
/* 1.16 */
SOUL_SAND_VALLEY(ServerVersion.V1_16),
CRIMSON_FOREST(ServerVersion.V1_16),
@@ -127,12 +131,12 @@ public enum CompatibleBiome {
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_15)) {
try {
- Class> classBiomeBase = Class.forName("net.minecraft.server." + ServerVersion.getServerVersionString() + ".BiomeBase"),
- classCraftChunk = Class.forName("org.bukkit.craftbukkit." + ServerVersion.getServerVersionString() + ".CraftChunk"),
- classCraftBlock = Class.forName("org.bukkit.craftbukkit." + ServerVersion.getServerVersionString() + ".block.CraftBlock"),
- classChunk = Class.forName("net.minecraft.server." + ServerVersion.getServerVersionString() + ".Chunk"),
- classBiomeStorage = Class.forName("net.minecraft.server." + ServerVersion.getServerVersionString() + ".BiomeStorage"),
- classIRegistry = Class.forName("net.minecraft.server." + ServerVersion.getServerVersionString() + ".IRegistry");
+ Class> classBiomeBase = ClassMapping.BIOME_BASE.getClazz(),
+ classCraftChunk = ClassMapping.CRAFT_CHUNK.getClazz(),
+ classCraftBlock = ClassMapping.CRAFT_BLOCK.getClazz(),
+ classChunk = ClassMapping.CHUNK.getClazz(),
+ classBiomeStorage = ClassMapping.BIOME_STORAGE.getClazz(),
+ classIRegistry = ClassMapping.I_REGISTRY.getClazz();
methodBiomeToBiomeBase = isAbove1_16_R1 ? classCraftBlock.getMethod("biomeToBiomeBase", classIRegistry, Biome.class)
: classCraftBlock.getMethod("biomeToBiomeBase", Biome.class);
@@ -149,7 +153,7 @@ public enum CompatibleBiome {
fieldStorageRegistry = classBiomeStorage.getDeclaredField("g");
}
fieldStorageRegistry.setAccessible(true);
- } catch (NoSuchMethodException | NoSuchFieldException | ClassNotFoundException e) {
+ } catch (NoSuchMethodException | NoSuchFieldException e) {
e.printStackTrace();
}
}
diff --git a/Compatibility/src/com/songoda/core/compatibility/CompatibleHand.java b/Compatibility/src/com/songoda/core/compatibility/CompatibleHand.java
index 95d26d69..7b56c0e0 100644
--- a/Compatibility/src/com/songoda/core/compatibility/CompatibleHand.java
+++ b/Compatibility/src/com/songoda/core/compatibility/CompatibleHand.java
@@ -1,9 +1,6 @@
package com.songoda.core.compatibility;
-import org.bukkit.Bukkit;
-import org.bukkit.GameMode;
import org.bukkit.entity.Player;
-import org.bukkit.event.player.PlayerItemBreakEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
@@ -99,56 +96,4 @@ public enum CompatibleHand {
else
player.getInventory().setItemInOffHand(item);
}
-
- private static Class> cb_CraftPlayer;
- private static Method getHandle, playBreak, asNMSCopy;
-
- /**
- * Damage the selected item
- *
- * @param player the player who's item you want to damage
- * @param damage the amount of damage to apply to the item
- */
- public void damageItem(Player player, short damage) {
- if (player.getGameMode() == GameMode.CREATIVE) return;
-
- if (cb_CraftPlayer == null) {
- try {
- cb_CraftPlayer = Class.forName("org.bukkit.craftbukkit." + ServerVersion.getServerVersionString() + ".entity.CraftPlayer");
- Class> mc_EntityLiving = Class.forName("net.minecraft.server." + ServerVersion.getServerVersionString() + ".EntityLiving");
- Class> cb_ItemStack = Class.forName("org.bukkit.craftbukkit." + ServerVersion.getServerVersionString() + ".inventory.CraftItemStack");
- Class> mc_ItemStack = Class.forName("net.minecraft.server." + ServerVersion.getServerVersionString() + ".ItemStack");
- getHandle = cb_CraftPlayer.getMethod("getHandle");
- if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_13))
- playBreak = mc_EntityLiving.getDeclaredMethod("a", mc_ItemStack, int.class); //Consistent from 1.16-1.13
- else
- playBreak = mc_EntityLiving.getDeclaredMethod("b", mc_ItemStack); //Consistent from 1.12-1.8
- playBreak.setAccessible(true);
- asNMSCopy = cb_ItemStack.getDeclaredMethod("asNMSCopy", ItemStack.class);
- } catch (NoSuchMethodException | ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
-
- ItemStack item = getItem(player);
-
- short newDurability = (short) (item.getDurability() + damage);
-
- if (newDurability >= item.getType().getMaxDurability()) {
- PlayerItemBreakEvent breakEvent = new PlayerItemBreakEvent(player, item);
- Bukkit.getServer().getPluginManager().callEvent(breakEvent);
- try {
- if (playBreak.getParameterCount() == 2)
- playBreak.invoke(getHandle.invoke(cb_CraftPlayer.cast(player)), asNMSCopy.invoke(null, item), 1);
- else
- playBreak.invoke(getHandle.invoke(cb_CraftPlayer.cast(player)), asNMSCopy.invoke(item));
- } catch (IllegalAccessException | InvocationTargetException e) {
- e.printStackTrace();
- }
- setItem(player, null);
- return;
- }
-
- item.setDurability(newDurability);
- }
}
diff --git a/Compatibility/src/com/songoda/core/compatibility/CompatibleMaterial.java b/Compatibility/src/com/songoda/core/compatibility/CompatibleMaterial.java
index df0e8cdf..1604da6f 100644
--- a/Compatibility/src/com/songoda/core/compatibility/CompatibleMaterial.java
+++ b/Compatibility/src/com/songoda/core/compatibility/CompatibleMaterial.java
@@ -33,9 +33,160 @@ public enum CompatibleMaterial {
JUNGLE_DOOR_ITEM(429),
ACACIA_DOOR_ITEM(430),
DARK_OAK_DOOR_ITEM(431),
-
*/
+ /* 1.17 */
+ AMETHYST_BLOCK(),
+ AMETHYST_CLUSTER(),
+ AMETHYST_SHARD(),
+ AXOLOTL_BUCKET(),
+ AXOLOTL_SPAWN_EGG(),
+ AZALEA(),
+ AZALEA_LEAVES(),
+ BIG_DRIPLEAF(),
+ BIG_DRIPLEAF_STEM(),
+ BLACK_CANDLE(),
+ BLACK_CANDLE_CAKE(),
+ BLUE_CANDLE(),
+ BLUE_CANDLE_CAKE(),
+ BROWN_CANDLE(),
+ BROWN_CANDLE_CAKE(),
+ BUDDING_AMETHYST(),
+ BUNDLE(),
+ CALCITE(),
+ CANDLE(),
+ CANDLE_CAKE(),
+ CAVE_VINES(),
+ CAVE_VINES_PLANT(),
+ CHISELED_DEEPSLATE(),
+ COBBLED_DEEPSLATE(),
+ COBBLED_DEEPSLATE_SLAB(),
+ COBBLED_DEEPSLATE_STAIRS(),
+ COBBLED_DEEPSLATE_WALL(),
+ COPPER_BLOCK(),
+ COPPER_INGOT(),
+ COPPER_ORE(),
+ CRACKED_DEEPSLATE_BRICKS(),
+ CRACKED_DEEPSLATE_TILES(),
+ CUT_COPPER(),
+ CUT_COPPER_SLAB(),
+ CUT_COPPER_STAIRS(),
+ CYAN_CANDLE(),
+ CYAN_CANDLE_CAKE(),
+ DEEPSLATE(),
+ DEEPSLATE_BRICKS(),
+ DEEPSLATE_BRICK_SLAB(),
+ DEEPSLATE_BRICK_STAIRS(),
+ DEEPSLATE_BRICK_WALL(),
+ DEEPSLATE_COAL_ORE(),
+ DEEPSLATE_COPPER_ORE(),
+ DEEPSLATE_DIAMOND_ORE(),
+ DEEPSLATE_EMERALD_ORE(),
+ DEEPSLATE_GOLD_ORE(),
+ DEEPSLATE_IRON_ORE(),
+ DEEPSLATE_LAPIS_ORE(),
+ DEEPSLATE_REDSTONE_ORE(),
+ DEEPSLATE_TILES(),
+ DEEPSLATE_TILE_SLAB(),
+ DEEPSLATE_TILE_STAIRS(),
+ DEEPSLATE_TILE_WALL(),
+ DRIPSTONE_BLOCK(),
+ EXPOSED_COPPER(),
+ EXPOSED_CUT_COPPER(),
+ EXPOSED_CUT_COPPER_SLAB(),
+ EXPOSED_CUT_COPPER_STAIRS(),
+ FLOWERING_AZALEA(),
+ FLOWERING_AZALEA_LEAVES(),
+ GLOW_BERRIES(),
+ GLOW_INK_SAC(),
+ GLOW_ITEM_FRAME(),
+ GLOW_LICHEN(),
+ GLOW_SQUID_SPAWN_EGG(),
+ GOAT_SPAWN_EGG(),
+ GRAY_CANDLE(),
+ GRAY_CANDLE_CAKE(),
+ GREEN_CANDLE(),
+ GREEN_CANDLE_CAKE(),
+ HANGING_ROOTS(),
+ INFESTED_DEEPSLATE(),
+ LARGE_AMETHYST_BUD(),
+ LAVA_CAULDRON(),
+ LIGHT(),
+ LIGHTNING_ROD(),
+ LIGHT_BLUE_CANDLE(),
+ LIGHT_BLUE_CANDLE_CAKE(),
+ LIGHT_GRAY_CANDLE(),
+ LIGHT_GRAY_CANDLE_CAKE(),
+ LIME_CANDLE(),
+ LIME_CANDLE_CAKE(),
+ MAGENTA_CANDLE(),
+ MAGENTA_CANDLE_CAKE(),
+ MEDIUM_AMETHYST_BUD(),
+ MOSS_BLOCK(),
+ MOSS_CARPET(),
+ ORANGE_CANDLE(),
+ ORANGE_CANDLE_CAKE(),
+ OXIDIZED_COPPER(),
+ OXIDIZED_CUT_COPPER(),
+ OXIDIZED_CUT_COPPER_SLAB(),
+ OXIDIZED_CUT_COPPER_STAIRS(),
+ PINK_CANDLE(),
+ PINK_CANDLE_CAKE(),
+ POINTED_DRIPSTONE(),
+ POLISHED_DEEPSLATE(),
+ POLISHED_DEEPSLATE_SLAB(),
+ POLISHED_DEEPSLATE_STAIRS(),
+ POLISHED_DEEPSLATE_WALL(),
+ POTTED_AZALEA_BUSH(),
+ POTTED_FLOWERING_AZALEA_BUSH(),
+ POWDER_SNOW(),
+ POWDER_SNOW_BUCKET(),
+ POWDER_SNOW_CAULDRON(),
+ PURPLE_CANDLE(),
+ PURPLE_CANDLE_CAKE(),
+ RAW_COPPER(),
+ RAW_COPPER_BLOCK(),
+ RAW_GOLD(),
+ RAW_GOLD_BLOCK(),
+ RAW_IRON(),
+ RAW_IRON_BLOCK(),
+ RED_CANDLE(),
+ RED_CANDLE_CAKE(),
+ ROOTED_DIRT(),
+ SCULK_SENSOR(),
+ SMALL_AMETHYST_BUD(),
+ SMALL_DRIPLEAF(),
+ SMOOTH_BASALT(),
+ SPORE_BLOSSOM(),
+ SPYGLASS(),
+ TINTED_GLASS(),
+ TUFF(),
+ WATER_CAULDRON(),
+ WAXED_COPPER_BLOCK(),
+ WAXED_CUT_COPPER(),
+ WAXED_CUT_COPPER_SLAB(),
+ WAXED_CUT_COPPER_STAIRS(),
+ WAXED_EXPOSED_COPPER(),
+ WAXED_EXPOSED_CUT_COPPER(),
+ WAXED_EXPOSED_CUT_COPPER_SLAB(),
+ WAXED_EXPOSED_CUT_COPPER_STAIRS(),
+ WAXED_OXIDIZED_COPPER(),
+ WAXED_OXIDIZED_CUT_COPPER(),
+ WAXED_OXIDIZED_CUT_COPPER_SLAB(),
+ WAXED_OXIDIZED_CUT_COPPER_STAIRS(),
+ WAXED_WEATHERED_COPPER(),
+ WAXED_WEATHERED_CUT_COPPER(),
+ WAXED_WEATHERED_CUT_COPPER_SLAB(),
+ WAXED_WEATHERED_CUT_COPPER_STAIRS(),
+ WEATHERED_COPPER(),
+ WEATHERED_CUT_COPPER(),
+ WEATHERED_CUT_COPPER_SLAB(),
+ WEATHERED_CUT_COPPER_STAIRS(),
+ WHITE_CANDLE(),
+ WHITE_CANDLE_CAKE(),
+ YELLOW_CANDLE(),
+ YELLOW_CANDLE_CAKE(),
+
/* 1.16 */
ANCIENT_DEBRIS(),
BASALT(),
@@ -527,7 +678,7 @@ public enum CompatibleMaterial {
GRANITE_WALL,
GRASS("LONG_GRASS", (byte) 1),
GRASS_BLOCK("GRASS"),
- GRASS_PATH,
+ GRASS_PATH("GRASS_PATH"),
GRAVEL,
GRAY_BANNER("BANNER", (byte) 8),
GRAY_BED("BED", (byte) 7),
@@ -1940,21 +2091,31 @@ public enum CompatibleMaterial {
case KELP:
return DRIED_KELP;
case IRON_ORE:
+ case DEEPSLATE_IRON_ORE:
return IRON_INGOT;
case GOLD_ORE:
+ case DEEPSLATE_GOLD_ORE:
return GOLD_INGOT;
case DIAMOND_ORE:
+ case DEEPSLATE_DIAMOND_ORE:
return DIAMOND;
case LAPIS_ORE:
+ case DEEPSLATE_LAPIS_ORE:
return LAPIS_LAZULI;
case REDSTONE_ORE:
+ case DEEPSLATE_REDSTONE_ORE:
return REDSTONE;
case COAL_ORE:
+ case DEEPSLATE_COAL_ORE:
return COAL;
case EMERALD_ORE:
+ case DEEPSLATE_EMERALD_ORE:
return EMERALD;
case NETHER_QUARTZ_ORE:
return QUARTZ;
+ case COPPER_ORE:
+ case DEEPSLATE_COPPER_ORE:
+ return COPPER_INGOT;
case SAND:
case RED_SAND:
return GLASS;
diff --git a/Compatibility/src/com/songoda/core/compatibility/CompatibleParticleHandler.java b/Compatibility/src/com/songoda/core/compatibility/CompatibleParticleHandler.java
index c813ad79..f8622b75 100644
--- a/Compatibility/src/com/songoda/core/compatibility/CompatibleParticleHandler.java
+++ b/Compatibility/src/com/songoda/core/compatibility/CompatibleParticleHandler.java
@@ -15,7 +15,7 @@ import java.util.stream.Stream;
public class CompatibleParticleHandler {
public static enum ParticleType {
- EXPLOSION_NORMAL(),
+ EXPLOSION_NORMAL,
EXPLOSION_LARGE,
EXPLOSION_HUGE,
FIREWORKS_SPARK,
@@ -100,6 +100,25 @@ public class CompatibleParticleHandler {
REVERSE_PORTAL(ServerVersion.V1_16, "DRIP_WATER"),
WHITE_ASH(ServerVersion.V1_16, "DRIP_WATER"),
/// End 1.16 ///
+ // ToDo: Someone needs to make better compatible fall backs.
+ LIGHT(ServerVersion.V1_17, "DRIP_WATER"),
+ DUST_COLOR_TRANSITION(ServerVersion.V1_17, "DRIP_WATER"),
+ VIBRATION(ServerVersion.V1_17, "DRIP_WATER"),
+ FALLING_SPORE_BLOSSOM(ServerVersion.V1_17, "DRIP_WATER"),
+ SPORE_BLOSSOM_AIR(ServerVersion.V1_17, "DRIP_WATER"),
+ SMALL_FLAME(ServerVersion.V1_17, "DRIP_WATER"),
+ SNOWFLAKE(ServerVersion.V1_17, "DRIP_WATER"),
+ DRIPPING_DRIPSTONE_LAVA(ServerVersion.V1_17, "DRIP_WATER"),
+ FALLING_DRIPSTONE_LAVA(ServerVersion.V1_17, "DRIP_WATER"),
+ DRIPPING_DRIPSTONE_WATER(ServerVersion.V1_17, "DRIP_WATER"),
+ FALLING_DRIPSTONE_WATER(ServerVersion.V1_17, "DRIP_WATER"),
+ GLOW_SQUID_INK(ServerVersion.V1_17, "DRIP_WATER"),
+ GLOW(ServerVersion.V1_17, "DRIP_WATER"),
+ WAX_ON(ServerVersion.V1_17, "DRIP_WATER"),
+ WAX_OFF(ServerVersion.V1_17, "DRIP_WATER"),
+ ELECTRIC_SPARK(ServerVersion.V1_17, "DRIP_WATER"),
+ SCRAPE(ServerVersion.V1_17, "DRIP_WATER"),
+ /// End 1.17 ///
;
final boolean compatibilityMode;
diff --git a/Compatibility/src/com/songoda/core/compatibility/CompatibleSound.java b/Compatibility/src/com/songoda/core/compatibility/CompatibleSound.java
index 28012941..9452249c 100644
--- a/Compatibility/src/com/songoda/core/compatibility/CompatibleSound.java
+++ b/Compatibility/src/com/songoda/core/compatibility/CompatibleSound.java
@@ -24,6 +24,215 @@ public enum CompatibleSound {
// 1.8 list:
// https://www.minecraftforum.net/forums/mapping-and-modding-java-edition/mapping-and-modding-tutorials/2213619-1-8-all-playsound-sound-arguments
+ /* 1.17 */
+ // TODO: add similar sounds for older versions
+ BLOCK_AMETHYST_BLOCK_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_AMETHYST_BLOCK_CHIME(ServerVersion.V1_17, v(null, true)),
+ BLOCK_AMETHYST_BLOCK_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_AMETHYST_BLOCK_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_AMETHYST_BLOCK_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_AMETHYST_BLOCK_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_AMETHYST_CLUSTER_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_AMETHYST_CLUSTER_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_AMETHYST_CLUSTER_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_AMETHYST_CLUSTER_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_AMETHYST_CLUSTER_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_AZALEA_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_AZALEA_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_AZALEA_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_AZALEA_LEAVES_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_AZALEA_LEAVES_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_AZALEA_LEAVES_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_AZALEA_LEAVES_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_AZALEA_LEAVES_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_AZALEA_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_AZALEA_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_BIG_DRIPLEAF_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_BIG_DRIPLEAF_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_BIG_DRIPLEAF_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_BIG_DRIPLEAF_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_BIG_DRIPLEAF_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_BIG_DRIPLEAF_TILT_DOWN(ServerVersion.V1_17, v(null, true)),
+ BLOCK_BIG_DRIPLEAF_TILT_UP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_CAKE_ADD_CANDLE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_CALCITE_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_CALCITE_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_CALCITE_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_CALCITE_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_CALCITE_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_CANDLE_AMBIENT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_CANDLE_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_CANDLE_EXTINGUISH(ServerVersion.V1_17, v(null, true)),
+ BLOCK_CANDLE_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_CANDLE_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_CANDLE_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_CANDLE_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_CAVE_VINES_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_CAVE_VINES_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_CAVE_VINES_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_CAVE_VINES_PICK_BERRIES(ServerVersion.V1_17, v(null, true)),
+ BLOCK_CAVE_VINES_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_CAVE_VINES_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_COPPER_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_COPPER_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_COPPER_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_COPPER_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_COPPER_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_DEEPSLATE_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_DEEPSLATE_BRICKS_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_DEEPSLATE_BRICKS_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_DEEPSLATE_BRICKS_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_DEEPSLATE_BRICKS_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_DEEPSLATE_BRICKS_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_DEEPSLATE_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_DEEPSLATE_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_DEEPSLATE_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_DEEPSLATE_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_DEEPSLATE_TILES_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_DEEPSLATE_TILES_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_DEEPSLATE_TILES_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_DEEPSLATE_TILES_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_DEEPSLATE_TILES_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_DRIPSTONE_BLOCK_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_DRIPSTONE_BLOCK_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_DRIPSTONE_BLOCK_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_DRIPSTONE_BLOCK_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_DRIPSTONE_BLOCK_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_FLOWERING_AZALEA_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_FLOWERING_AZALEA_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_FLOWERING_AZALEA_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_FLOWERING_AZALEA_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_FLOWERING_AZALEA_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_HANGING_ROOTS_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_HANGING_ROOTS_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_HANGING_ROOTS_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_HANGING_ROOTS_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_HANGING_ROOTS_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_LARGE_AMETHYST_BUD_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_LARGE_AMETHYST_BUD_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_MEDIUM_AMETHYST_BUD_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_MEDIUM_AMETHYST_BUD_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_MOSS_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_MOSS_CARPET_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_MOSS_CARPET_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_MOSS_CARPET_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_MOSS_CARPET_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_MOSS_CARPET_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_MOSS_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_MOSS_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_MOSS_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_MOSS_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_POINTED_DRIPSTONE_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_POINTED_DRIPSTONE_DRIP_LAVA(ServerVersion.V1_17, v(null, true)),
+ BLOCK_POINTED_DRIPSTONE_DRIP_LAVA_INTO_CAULDRON(ServerVersion.V1_17, v(null, true)),
+ BLOCK_POINTED_DRIPSTONE_DRIP_WATER(ServerVersion.V1_17, v(null, true)),
+ BLOCK_POINTED_DRIPSTONE_DRIP_WATER_INTO_CAULDRON(ServerVersion.V1_17, v(null, true)),
+ BLOCK_POINTED_DRIPSTONE_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_POINTED_DRIPSTONE_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_POINTED_DRIPSTONE_LAND(ServerVersion.V1_17, v(null, true)),
+ BLOCK_POINTED_DRIPSTONE_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_POINTED_DRIPSTONE_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_POLISHED_DEEPSLATE_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_POLISHED_DEEPSLATE_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_POLISHED_DEEPSLATE_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_POLISHED_DEEPSLATE_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_POLISHED_DEEPSLATE_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_POWDER_SNOW_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_POWDER_SNOW_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_POWDER_SNOW_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_POWDER_SNOW_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_POWDER_SNOW_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_ROOTED_DIRT_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_ROOTED_DIRT_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_ROOTED_DIRT_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_ROOTED_DIRT_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_ROOTED_DIRT_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_SCULK_SENSOR_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_SCULK_SENSOR_CLICKING(ServerVersion.V1_17, v(null, true)),
+ BLOCK_SCULK_SENSOR_CLICKING_STOP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_SCULK_SENSOR_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_SCULK_SENSOR_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_SCULK_SENSOR_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_SCULK_SENSOR_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_SMALL_AMETHYST_BUD_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_SMALL_AMETHYST_BUD_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_SMALL_DRIPLEAF_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_SMALL_DRIPLEAF_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_SMALL_DRIPLEAF_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_SMALL_DRIPLEAF_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_SMALL_DRIPLEAF_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_SPORE_BLOSSOM_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_SPORE_BLOSSOM_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_SPORE_BLOSSOM_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_SPORE_BLOSSOM_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_SPORE_BLOSSOM_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_SWEET_BERRY_BUSH_PICK_BERRIES(ServerVersion.V1_17, v("ITEM_SWEET_BERRIES_PICK_FROM_BUSH")),
+ BLOCK_TUFF_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_TUFF_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_TUFF_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_TUFF_PLACE(ServerVersion.V1_17, v(null, true)),
+ BLOCK_TUFF_STEP(ServerVersion.V1_17, v(null, true)),
+ BLOCK_VINE_BREAK(ServerVersion.V1_17, v(null, true)),
+ BLOCK_VINE_FALL(ServerVersion.V1_17, v(null, true)),
+ BLOCK_VINE_HIT(ServerVersion.V1_17, v(null, true)),
+ BLOCK_VINE_PLACE(ServerVersion.V1_17, v(null, true)),
+ ENTITY_AXOLOTL_ATTACK(ServerVersion.V1_17, v(null, true)),
+ ENTITY_AXOLOTL_DEATH(ServerVersion.V1_17, v(null, true)),
+ ENTITY_AXOLOTL_HURT(ServerVersion.V1_17, v(null, true)),
+ ENTITY_AXOLOTL_IDLE_AIR(ServerVersion.V1_17, v(null, true)),
+ ENTITY_AXOLOTL_IDLE_WATER(ServerVersion.V1_17, v(null, true)),
+ ENTITY_AXOLOTL_SPLASH(ServerVersion.V1_17, v(null, true)),
+ ENTITY_AXOLOTL_SWIM(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GLOW_ITEM_FRAME_ADD_ITEM(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GLOW_ITEM_FRAME_BREAK(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GLOW_ITEM_FRAME_PLACE(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GLOW_ITEM_FRAME_REMOVE_ITEM(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GLOW_ITEM_FRAME_ROTATE_ITEM(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GLOW_SQUID_AMBIENT(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GLOW_SQUID_DEATH(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GLOW_SQUID_HURT(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GLOW_SQUID_SQUIRT(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GOAT_AMBIENT(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GOAT_DEATH(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GOAT_EAT(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GOAT_HURT(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GOAT_LONG_JUMP(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GOAT_MILK(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GOAT_PREPARE_RAM(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GOAT_RAM_IMPACT(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GOAT_SCREAMING_AMBIENT(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GOAT_SCREAMING_DEATH(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GOAT_SCREAMING_EAT(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GOAT_SCREAMING_HURT(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GOAT_SCREAMING_LONG_JUMP(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GOAT_SCREAMING_MILK(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GOAT_SCREAMING_PREPARE_RAM(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GOAT_SCREAMING_RAM_IMPACT(ServerVersion.V1_17, v(null, true)),
+ ENTITY_GOAT_STEP(ServerVersion.V1_17, v(null, true)),
+ ENTITY_MINECART_INSIDE_UNDERWATER(ServerVersion.V1_17, v(null, true)),
+ ENTITY_PARROT_IMITATE_PIGLIN_BRUTE(ServerVersion.V1_17, v(null, true)),
+ ENTITY_PIGLIN_BRUTE_AMBIENT(ServerVersion.V1_17, v(null, true)),
+ ENTITY_PIGLIN_BRUTE_ANGRY(ServerVersion.V1_17, v(null, true)),
+ ENTITY_PIGLIN_BRUTE_CONVERTED_TO_ZOMBIFIED(ServerVersion.V1_17, v(null, true)),
+ ENTITY_PIGLIN_BRUTE_DEATH(ServerVersion.V1_17, v(null, true)),
+ ENTITY_PIGLIN_BRUTE_HURT(ServerVersion.V1_17, v(null, true)),
+ ENTITY_PIGLIN_BRUTE_STEP(ServerVersion.V1_17, v(null, true)),
+ ENTITY_PLAYER_HURT_FREEZE(ServerVersion.V1_17, v(null, true)),
+ ENTITY_SKELETON_CONVERTED_TO_STRAY(ServerVersion.V1_17, v(null, true)),
+ ITEM_AXE_SCRAPE(ServerVersion.V1_17, v(null, true)),
+ ITEM_AXE_WAX_OFF(ServerVersion.V1_17, v(null, true)),
+ ITEM_BONE_MEAL_USE(ServerVersion.V1_17, v(null, true)),
+ ITEM_BUCKET_EMPTY_AXOLOTL(ServerVersion.V1_17, v(null, true)),
+ ITEM_BUCKET_EMPTY_POWDER_SNOW(ServerVersion.V1_17, v(null, true)),
+ ITEM_BUCKET_FILL_AXOLOTL(ServerVersion.V1_17, v(null, true)),
+ ITEM_BUCKET_FILL_POWDER_SNOW(ServerVersion.V1_17, v(null, true)),
+ ITEM_GLOW_INK_SAC_USE(ServerVersion.V1_17, v(null, true)),
+ ITEM_HONEYCOMB_WAX_ON(ServerVersion.V1_17, v(null, true)),
+ ITEM_INK_SAC_USE(ServerVersion.V1_17, v(null, true)),
+ ITEM_SPYGLASS_STOP_USING(ServerVersion.V1_17, v(null, true)),
+ ITEM_SPYGLASS_USE(ServerVersion.V1_17, v(null, true)),
+ ITEM_DYE_USE(ServerVersion.V1_17, v(null, true)),
+
/* 1.16 */
// TODO: add similar sounds for older versions
AMBIENT_BASALT_DELTAS_ADDITIONS(ServerVersion.V1_16, v(null, true)),
@@ -972,7 +1181,6 @@ public enum CompatibleSound {
ITEM_SHIELD_BLOCK,
ITEM_SHIELD_BREAK,
ITEM_SHOVEL_FLATTEN,
- ITEM_SWEET_BERRIES_PICK_FROM_BUSH,
ITEM_TOTEM_USE,
ITEM_TRIDENT_HIT,
ITEM_TRIDENT_HIT_GROUND,
diff --git a/Compatibility/src/com/songoda/core/compatibility/EntityNamespace.java b/Compatibility/src/com/songoda/core/compatibility/EntityNamespace.java
index 86b9019a..b7aa41c1 100644
--- a/Compatibility/src/com/songoda/core/compatibility/EntityNamespace.java
+++ b/Compatibility/src/com/songoda/core/compatibility/EntityNamespace.java
@@ -45,7 +45,6 @@ public class EntityNamespace {
put("witherboss", "wither");
put("mushroomcow", "mooshroom");
put("snowman", "snow_golem");
- put("snowman", "snow_golem");
put("ozelot", "ocelot");
put("villagergolem", "iron_golem");
put("villager_golem", "iron_golem");
diff --git a/Compatibility/src/com/songoda/core/compatibility/LegacyMaterialAnalouge.java b/Compatibility/src/com/songoda/core/compatibility/LegacyMaterialAnalouge.java
index e307bc01..7c6dad6e 100644
--- a/Compatibility/src/com/songoda/core/compatibility/LegacyMaterialAnalouge.java
+++ b/Compatibility/src/com/songoda/core/compatibility/LegacyMaterialAnalouge.java
@@ -14,110 +14,263 @@ import java.util.Map;
*/
public enum LegacyMaterialAnalouge {
+ /* 1.17 */
+ // ToDo: Improve legal materials.
+ AMETHYST_BLOCK(ServerVersion.V1_17, "STONE"),
+ AMETHYST_CLUSTER(ServerVersion.V1_17, "STONE"),
+ AMETHYST_SHARD(ServerVersion.V1_17, "STONE"),
+ AXOLOTL_BUCKET(ServerVersion.V1_17, "STONE"),
+ AXOLOTL_SPAWN_EGG(ServerVersion.V1_17, "STONE"),
+ AZALEA(ServerVersion.V1_17, "STONE"),
+ AZALEA_LEAVES(ServerVersion.V1_17, "STONE"),
+ BIG_DRIPLEAF(ServerVersion.V1_17, "STONE"),
+ BIG_DRIPLEAF_STEM(ServerVersion.V1_17, "STONE"),
+ BLACK_CANDLE(ServerVersion.V1_17, "STONE"),
+ BLACK_CANDLE_CAKE(ServerVersion.V1_17, "STONE"),
+ BLUE_CANDLE(ServerVersion.V1_17, "STONE"),
+ BLUE_CANDLE_CAKE(ServerVersion.V1_17, "STONE"),
+ BROWN_CANDLE(ServerVersion.V1_17, "STONE"),
+ BROWN_CANDLE_CAKE(ServerVersion.V1_17, "STONE"),
+ BUDDING_AMETHYST(ServerVersion.V1_17, "STONE"),
+ BUNDLE(ServerVersion.V1_17, "STONE"),
+ CALCITE(ServerVersion.V1_17, "STONE"),
+ CANDLE(ServerVersion.V1_17, "STONE"),
+ CANDLE_CAKE(ServerVersion.V1_17, "STONE"),
+ CAVE_VINES(ServerVersion.V1_17, "STONE"),
+ CAVE_VINES_PLANT(ServerVersion.V1_17, "STONE"),
+ CHISELED_DEEPSLATE(ServerVersion.V1_17, "STONE"),
+ COBBLED_DEEPSLATE(ServerVersion.V1_17, "STONE"),
+ COBBLED_DEEPSLATE_SLAB(ServerVersion.V1_17, "STONE"),
+ COBBLED_DEEPSLATE_STAIRS(ServerVersion.V1_17, "STONE"),
+ COBBLED_DEEPSLATE_WALL(ServerVersion.V1_17, "STONE"),
+ COPPER_BLOCK(ServerVersion.V1_17, "STONE"),
+ COPPER_INGOT(ServerVersion.V1_17, "STONE"),
+ COPPER_ORE(ServerVersion.V1_17, "STONE"),
+ CRACKED_DEEPSLATE_BRICKS(ServerVersion.V1_17, "STONE"),
+ CRACKED_DEEPSLATE_TILES(ServerVersion.V1_17, "STONE"),
+ CUT_COPPER(ServerVersion.V1_17, "STONE"),
+ CUT_COPPER_SLAB(ServerVersion.V1_17, "STONE"),
+ CUT_COPPER_STAIRS(ServerVersion.V1_17, "STONE"),
+ CYAN_CANDLE(ServerVersion.V1_17, "STONE"),
+ CYAN_CANDLE_CAKE(ServerVersion.V1_17, "STONE"),
+ DEEPSLATE(ServerVersion.V1_17, "STONE"),
+ DEEPSLATE_BRICKS(ServerVersion.V1_17, "STONE"),
+ DEEPSLATE_BRICK_SLAB(ServerVersion.V1_17, "STONE"),
+ DEEPSLATE_BRICK_STAIRS(ServerVersion.V1_17, "STONE"),
+ DEEPSLATE_BRICK_WALL(ServerVersion.V1_17, "STONE"),
+ DEEPSLATE_COAL_ORE(ServerVersion.V1_17, "STONE"),
+ DEEPSLATE_COPPER_ORE(ServerVersion.V1_17, "STONE"),
+ DEEPSLATE_DIAMOND_ORE(ServerVersion.V1_17, "STONE"),
+ DEEPSLATE_EMERALD_ORE(ServerVersion.V1_17, "STONE"),
+ DEEPSLATE_GOLD_ORE(ServerVersion.V1_17, "STONE"),
+ DEEPSLATE_IRON_ORE(ServerVersion.V1_17, "STONE"),
+ DEEPSLATE_LAPIS_ORE(ServerVersion.V1_17, "STONE"),
+ DEEPSLATE_REDSTONE_ORE(ServerVersion.V1_17, "STONE"),
+ DEEPSLATE_TILES(ServerVersion.V1_17, "STONE"),
+ DEEPSLATE_TILE_SLAB(ServerVersion.V1_17, "STONE"),
+ DEEPSLATE_TILE_STAIRS(ServerVersion.V1_17, "STONE"),
+ DEEPSLATE_TILE_WALL(ServerVersion.V1_17, "STONE"),
+ DRIPSTONE_BLOCK(ServerVersion.V1_17, "STONE"),
+ EXPOSED_COPPER(ServerVersion.V1_17, "STONE"),
+ EXPOSED_CUT_COPPER(ServerVersion.V1_17, "STONE"),
+ EXPOSED_CUT_COPPER_SLAB(ServerVersion.V1_17, "STONE"),
+ EXPOSED_CUT_COPPER_STAIRS(ServerVersion.V1_17, "STONE"),
+ FLOWERING_AZALEA(ServerVersion.V1_17, "STONE"),
+ FLOWERING_AZALEA_LEAVES(ServerVersion.V1_17, "STONE"),
+ GLOW_BERRIES(ServerVersion.V1_17, "STONE"),
+ GLOW_INK_SAC(ServerVersion.V1_17, "STONE"),
+ GLOW_ITEM_FRAME(ServerVersion.V1_17, "STONE"),
+ GLOW_LICHEN(ServerVersion.V1_17, "STONE"),
+ GLOW_SQUID_SPAWN_EGG(ServerVersion.V1_17, "STONE"),
+ GOAT_SPAWN_EGG(ServerVersion.V1_17, "STONE"),
+ GRAY_CANDLE(ServerVersion.V1_17, "STONE"),
+ GRAY_CANDLE_CAKE(ServerVersion.V1_17, "STONE"),
+ GREEN_CANDLE(ServerVersion.V1_17, "STONE"),
+ GREEN_CANDLE_CAKE(ServerVersion.V1_17, "STONE"),
+ HANGING_ROOTS(ServerVersion.V1_17, "STONE"),
+ INFESTED_DEEPSLATE(ServerVersion.V1_17, "STONE"),
+ LARGE_AMETHYST_BUD(ServerVersion.V1_17, "STONE"),
+ LAVA_CAULDRON(ServerVersion.V1_17, "STONE"),
+ LIGHT(ServerVersion.V1_17, "STONE"),
+ LIGHTNING_ROD(ServerVersion.V1_17, "STONE"),
+ LIGHT_BLUE_CANDLE(ServerVersion.V1_17, "STONE"),
+ LIGHT_BLUE_CANDLE_CAKE(ServerVersion.V1_17, "STONE"),
+ LIGHT_GRAY_CANDLE(ServerVersion.V1_17, "STONE"),
+ LIGHT_GRAY_CANDLE_CAKE(ServerVersion.V1_17, "STONE"),
+ LIME_CANDLE(ServerVersion.V1_17, "STONE"),
+ LIME_CANDLE_CAKE(ServerVersion.V1_17, "STONE"),
+ MAGENTA_CANDLE(ServerVersion.V1_17, "STONE"),
+ MAGENTA_CANDLE_CAKE(ServerVersion.V1_17, "STONE"),
+ MEDIUM_AMETHYST_BUD(ServerVersion.V1_17, "STONE"),
+ MOSS_BLOCK(ServerVersion.V1_17, "STONE"),
+ MOSS_CARPET(ServerVersion.V1_17, "STONE"),
+ ORANGE_CANDLE(ServerVersion.V1_17, "STONE"),
+ ORANGE_CANDLE_CAKE(ServerVersion.V1_17, "STONE"),
+ OXIDIZED_COPPER(ServerVersion.V1_17, "STONE"),
+ OXIDIZED_CUT_COPPER(ServerVersion.V1_17, "STONE"),
+ OXIDIZED_CUT_COPPER_SLAB(ServerVersion.V1_17, "STONE"),
+ OXIDIZED_CUT_COPPER_STAIRS(ServerVersion.V1_17, "STONE"),
+ PINK_CANDLE(ServerVersion.V1_17, "STONE"),
+ PINK_CANDLE_CAKE(ServerVersion.V1_17, "STONE"),
+ POINTED_DRIPSTONE(ServerVersion.V1_17, "STONE"),
+ POLISHED_DEEPSLATE(ServerVersion.V1_17, "STONE"),
+ POLISHED_DEEPSLATE_SLAB(ServerVersion.V1_17, "STONE"),
+ POLISHED_DEEPSLATE_STAIRS(ServerVersion.V1_17, "STONE"),
+ POLISHED_DEEPSLATE_WALL(ServerVersion.V1_17, "STONE"),
+ POTTED_AZALEA_BUSH(ServerVersion.V1_17, "STONE"),
+ POTTED_FLOWERING_AZALEA_BUSH(ServerVersion.V1_17, "STONE"),
+ POWDER_SNOW(ServerVersion.V1_17, "STONE"),
+ POWDER_SNOW_BUCKET(ServerVersion.V1_17, "STONE"),
+ POWDER_SNOW_CAULDRON(ServerVersion.V1_17, "STONE"),
+ PURPLE_CANDLE(ServerVersion.V1_17, "STONE"),
+ PURPLE_CANDLE_CAKE(ServerVersion.V1_17, "STONE"),
+ RAW_COPPER(ServerVersion.V1_17, "STONE"),
+ RAW_COPPER_BLOCK(ServerVersion.V1_17, "STONE"),
+ RAW_GOLD(ServerVersion.V1_17, "STONE"),
+ RAW_GOLD_BLOCK(ServerVersion.V1_17, "STONE"),
+ RAW_IRON(ServerVersion.V1_17, "STONE"),
+ RAW_IRON_BLOCK(ServerVersion.V1_17, "STONE"),
+ RED_CANDLE(ServerVersion.V1_17, "STONE"),
+ RED_CANDLE_CAKE(ServerVersion.V1_17, "STONE"),
+ ROOTED_DIRT(ServerVersion.V1_17, "STONE"),
+ SCULK_SENSOR(ServerVersion.V1_17, "STONE"),
+ SMALL_AMETHYST_BUD(ServerVersion.V1_17, "STONE"),
+ SMALL_DRIPLEAF(ServerVersion.V1_17, "STONE"),
+ SMOOTH_BASALT(ServerVersion.V1_17, "STONE"),
+ SPORE_BLOSSOM(ServerVersion.V1_17, "STONE"),
+ SPYGLASS(ServerVersion.V1_17, "STONE"),
+ TINTED_GLASS(ServerVersion.V1_17, "STONE"),
+ TUFF(ServerVersion.V1_17, "STONE"),
+ WATER_CAULDRON(ServerVersion.V1_17, "STONE"),
+ WAXED_COPPER_BLOCK(ServerVersion.V1_17, "STONE"),
+ WAXED_CUT_COPPER(ServerVersion.V1_17, "STONE"),
+ WAXED_CUT_COPPER_SLAB(ServerVersion.V1_17, "STONE"),
+ WAXED_CUT_COPPER_STAIRS(ServerVersion.V1_17, "STONE"),
+ WAXED_EXPOSED_COPPER(ServerVersion.V1_17, "STONE"),
+ WAXED_EXPOSED_CUT_COPPER(ServerVersion.V1_17, "STONE"),
+ WAXED_EXPOSED_CUT_COPPER_SLAB(ServerVersion.V1_17, "STONE"),
+ WAXED_EXPOSED_CUT_COPPER_STAIRS(ServerVersion.V1_17, "STONE"),
+ WAXED_OXIDIZED_COPPER(ServerVersion.V1_17, "STONE"),
+ WAXED_OXIDIZED_CUT_COPPER(ServerVersion.V1_17, "STONE"),
+ WAXED_OXIDIZED_CUT_COPPER_SLAB(ServerVersion.V1_17, "STONE"),
+ WAXED_OXIDIZED_CUT_COPPER_STAIRS(ServerVersion.V1_17, "STONE"),
+ WAXED_WEATHERED_COPPER(ServerVersion.V1_17, "STONE"),
+ WAXED_WEATHERED_CUT_COPPER(ServerVersion.V1_17, "STONE"),
+ WAXED_WEATHERED_CUT_COPPER_SLAB(ServerVersion.V1_17, "STONE"),
+ WAXED_WEATHERED_CUT_COPPER_STAIRS(ServerVersion.V1_17, "STONE"),
+ WEATHERED_COPPER(ServerVersion.V1_17, "STONE"),
+ WEATHERED_CUT_COPPER(ServerVersion.V1_17, "STONE"),
+ WEATHERED_CUT_COPPER_SLAB(ServerVersion.V1_17, "STONE"),
+ WEATHERED_CUT_COPPER_STAIRS(ServerVersion.V1_17, "STONE"),
+ WHITE_CANDLE(ServerVersion.V1_17, "STONE"),
+ WHITE_CANDLE_CAKE(ServerVersion.V1_17, "STONE"),
+ YELLOW_CANDLE(ServerVersion.V1_17, "STONE"),
+ YELLOW_CANDLE_CAKE(ServerVersion.V1_17, "STONE"),
+
/* 1.16 */
// ToDo: Improve legal materials.
- ANCIENT_DEBRIES(ServerVersion.V1_15, "STONE"),
- BASALT(ServerVersion.V1_15, "STONE"),
- BLACKSTONE(ServerVersion.V1_15, "STONE"),
- BLACKSTONE_STAIRS(ServerVersion.V1_15, "STONE"),
- BLACKSTONE_WALL(ServerVersion.V1_15, "STONE"),
- BLASTSTONE_SLAB(ServerVersion.V1_15, "STONE"),
- CHAIN(ServerVersion.V1_15, "STONE"),
- CHISELED_NETHER_BRICKS(ServerVersion.V1_15, "STONE"),
- CHISELED_POLISHED_BLACKSTONE(ServerVersion.V1_15, "STONE"),
- CRACKED_NETHER_BRICKS(ServerVersion.V1_15, "STONE"),
- CRACKED_POLISHED_BLACKSTONE_BRICKS(ServerVersion.V1_15, "STONE"),
- CRIMSON_BUTTON(ServerVersion.V1_15, "STONE"),
- CRIMSON_DOOR(ServerVersion.V1_15, "STONE"),
- CRIMSON_FENCE(ServerVersion.V1_15, "STONE"),
- CRIMSON_FENCE_GATE(ServerVersion.V1_15, "STONE"),
- CRIMSON_FUNGUS(ServerVersion.V1_15, "STONE"),
- CRIMSON_HYPHAE(ServerVersion.V1_15, "STONE"),
- CRIMSON_NYLIUM(ServerVersion.V1_15, "STONE"),
- CRIMSON_PLANKS(ServerVersion.V1_15, "STONE"),
- CRIMSON_PRESSURE_PLATE(ServerVersion.V1_15, "STONE"),
- CRIMSON_ROOTS(ServerVersion.V1_15, "STONE"),
- CRIMSON_SIGN(ServerVersion.V1_15, "STONE"),
- CRIMSON_SLAB(ServerVersion.V1_15, "STONE"),
- CRIMSON_STAIRS(ServerVersion.V1_15, "STONE"),
- CRIMSON_STEM(ServerVersion.V1_15, "STONE"),
- CRIMSON_TRAPDOOR(ServerVersion.V1_15, "STONE"),
- CRIMSON_WALL_SIGN(ServerVersion.V1_15, "STONE"),
- CRYING_OBSIDIAN(ServerVersion.V1_15, "STONE"),
- GILDED_BLACKSTONE(ServerVersion.V1_15, "STONE"),
- HOGLIN_SPAWN_EGG(ServerVersion.V1_15, "STONE"),
- LODESTONE(ServerVersion.V1_15, "STONE"),
- MUSIC_DISC_PIGSTEP(ServerVersion.V1_15, "STONE"),
- NETHERITE_AXE(ServerVersion.V1_15, "STONE"),
- NETHERITE_BLOCK(ServerVersion.V1_15, "STONE"),
- NETHERITE_BOOTS(ServerVersion.V1_15, "STONE"),
- NETHERITE_CHESTPLATE(ServerVersion.V1_15, "STONE"),
- NETHERITE_HELMET(ServerVersion.V1_15, "STONE"),
- NETHERITE_HOE(ServerVersion.V1_15, "STONE"),
- NETHERITE_INGOT(ServerVersion.V1_15, "STONE"),
- NETHERITE_LEGGINGS(ServerVersion.V1_15, "STONE"),
- NETHERITE_PICKAXE(ServerVersion.V1_15, "STONE"),
- NETHERITE_SCRAP(ServerVersion.V1_15, "STONE"),
- NETHERITE_SHOVEL(ServerVersion.V1_15, "STONE"),
- NETHERITE_SWORD(ServerVersion.V1_15, "STONE"),
- NETHER_GOLD_ORE(ServerVersion.V1_15, "STONE"),
- NETHER_SPROUTS(ServerVersion.V1_15, "STONE"),
- PIGLIN_BANNER_PATTERN(ServerVersion.V1_15, "STONE"),
- PIGLIN_SPAWN_EGG(ServerVersion.V1_15, "STONE"),
- POLISHED_BASALT(ServerVersion.V1_15, "STONE"),
- POLISHED_BLACKSTONE(ServerVersion.V1_15, "STONE"),
- POLISHED_BLACKSTONE_BRICKS(ServerVersion.V1_15, "STONE"),
- POLISHED_BLACKSTONE_BRICK_SLAB(ServerVersion.V1_15, "STONE"),
- POLISHED_BLACKSTONE_BRICK_STAIRS(ServerVersion.V1_15, "STONE"),
- POLISHED_BLACKSTONE_BRICK_WALL(ServerVersion.V1_15, "STONE"),
- POLISHED_BLACKSTONE_BUTTON(ServerVersion.V1_15, "STONE"),
- POLISHED_BLACKSTONE_PRESSURE_PLATE(ServerVersion.V1_15, "STONE"),
- POLISHED_BLACKSTONE_SLAB(ServerVersion.V1_15, "STONE"),
- POLISHED_BLACKSTONE_STAIRS(ServerVersion.V1_15, "STONE"),
- POLISHED_BLACKSTONE_WALL(ServerVersion.V1_15, "STONE"),
- POTTED_CRIMSON_FUNGUS(ServerVersion.V1_15, "STONE"),
- POTTED_CRIMSON_ROOTS(ServerVersion.V1_15, "STONE"),
- POTTED_WARPED_FUNGUS(ServerVersion.V1_15, "STONE"),
- POTTED_WARPED_ROOTS(ServerVersion.V1_15, "STONE"),
- QUARTZ_BRICKS(ServerVersion.V1_15, "STONE"),
- RESPAWN_ANCHOR(ServerVersion.V1_15, "STONE"),
- SHROOMLIGHT(ServerVersion.V1_15, "STONE"),
- SOUL_CAMPFIRE(ServerVersion.V1_15, "STONE"),
- SOUL_FIRE(ServerVersion.V1_15, "STONE"),
- SOUL_LANTERN(ServerVersion.V1_15, "STONE"),
- SOUL_SOIL(ServerVersion.V1_15, "STONE"),
- SOUL_TORCH(ServerVersion.V1_15, "STONE"),
- SOUL_WALL_TORCH(ServerVersion.V1_15, "STONE"),
- STRIDER_SPAWN_EGG(ServerVersion.V1_15, "STONE"),
- STRIPPED_CRIMSON_HYPHAE(ServerVersion.V1_15, "STONE"),
- STRIPPED_CRIMSON_STEM(ServerVersion.V1_15, "STONE"),
- STRIPPED_WARPED_HYPHAE(ServerVersion.V1_15, "STONE"),
- STRIPPED_WARPED_STEM(ServerVersion.V1_15, "STONE"),
- TARGET(ServerVersion.V1_15, "STONE"),
- TWISTING_VINES(ServerVersion.V1_15, "STONE"),
- TWISTING_VINES_PLANT(ServerVersion.V1_15, "STONE"),
- WARPED_BUTTON(ServerVersion.V1_15, "STONE"),
- WARPED_DOOR(ServerVersion.V1_15, "STONE"),
- WARPED_FENCE(ServerVersion.V1_15, "STONE"),
- WARPED_FENCE_GATE(ServerVersion.V1_15, "STONE"),
- WARPED_FUNGUS(ServerVersion.V1_15, "STONE"),
- WARPED_FUNGUS_ON_A_STICK(ServerVersion.V1_15, "STONE"),
- WARPED_HYPHAE(ServerVersion.V1_15, "STONE"),
- WARPED_NYLIUM(ServerVersion.V1_15, "STONE"),
- WARPED_PLANKS(ServerVersion.V1_15, "STONE"),
- WARPED_PRESSURE_PLATE(ServerVersion.V1_15, "STONE"),
- WARPED_ROOTS(ServerVersion.V1_15, "STONE"),
- WARPED_SIGN(ServerVersion.V1_15, "STONE"),
- WARPED_SLAB(ServerVersion.V1_15, "STONE"),
- WARPED_STAIRS(ServerVersion.V1_15, "STONE"),
- WARPED_STEM(ServerVersion.V1_15, "STONE"),
- WARPED_TRAPDOOR(ServerVersion.V1_15, "STONE"),
- WARPED_WALL_SIGN(ServerVersion.V1_15, "STONE"),
- WARPED_WART_BLOCK(ServerVersion.V1_15, "STONE"),
- WEEPING_VINES(ServerVersion.V1_15, "STONE"),
- WEEPING_VINES_PLANT(ServerVersion.V1_15, "STONE"),
- ZOGLIN_SPAWN_EGG(ServerVersion.V1_15, "STONE"),
- ZOMBIFIED_PIGLIN_SPAWN_EGG(ServerVersion.V1_15, "STONE"),
+ ANCIENT_DEBRIES(ServerVersion.V1_16, "STONE"),
+ BASALT(ServerVersion.V1_16, "STONE"),
+ BLACKSTONE(ServerVersion.V1_16, "STONE"),
+ BLACKSTONE_STAIRS(ServerVersion.V1_16, "STONE"),
+ BLACKSTONE_WALL(ServerVersion.V1_16, "STONE"),
+ BLASTSTONE_SLAB(ServerVersion.V1_16, "STONE"),
+ CHAIN(ServerVersion.V1_16, "STONE"),
+ CHISELED_NETHER_BRICKS(ServerVersion.V1_16, "STONE"),
+ CHISELED_POLISHED_BLACKSTONE(ServerVersion.V1_16, "STONE"),
+ CRACKED_NETHER_BRICKS(ServerVersion.V1_16, "STONE"),
+ CRACKED_POLISHED_BLACKSTONE_BRICKS(ServerVersion.V1_16, "STONE"),
+ CRIMSON_BUTTON(ServerVersion.V1_16, "STONE"),
+ CRIMSON_DOOR(ServerVersion.V1_16, "STONE"),
+ CRIMSON_FENCE(ServerVersion.V1_16, "STONE"),
+ CRIMSON_FENCE_GATE(ServerVersion.V1_16, "STONE"),
+ CRIMSON_FUNGUS(ServerVersion.V1_16, "STONE"),
+ CRIMSON_HYPHAE(ServerVersion.V1_16, "STONE"),
+ CRIMSON_NYLIUM(ServerVersion.V1_16, "STONE"),
+ CRIMSON_PLANKS(ServerVersion.V1_16, "STONE"),
+ CRIMSON_PRESSURE_PLATE(ServerVersion.V1_16, "STONE"),
+ CRIMSON_ROOTS(ServerVersion.V1_16, "STONE"),
+ CRIMSON_SIGN(ServerVersion.V1_16, "STONE"),
+ CRIMSON_SLAB(ServerVersion.V1_16, "STONE"),
+ CRIMSON_STAIRS(ServerVersion.V1_16, "STONE"),
+ CRIMSON_STEM(ServerVersion.V1_16, "STONE"),
+ CRIMSON_TRAPDOOR(ServerVersion.V1_16, "STONE"),
+ CRIMSON_WALL_SIGN(ServerVersion.V1_16, "STONE"),
+ CRYING_OBSIDIAN(ServerVersion.V1_16, "STONE"),
+ GILDED_BLACKSTONE(ServerVersion.V1_16, "STONE"),
+ HOGLIN_SPAWN_EGG(ServerVersion.V1_16, "STONE"),
+ LODESTONE(ServerVersion.V1_16, "STONE"),
+ MUSIC_DISC_PIGSTEP(ServerVersion.V1_16, "STONE"),
+ NETHERITE_AXE(ServerVersion.V1_16, "STONE"),
+ NETHERITE_BLOCK(ServerVersion.V1_16, "STONE"),
+ NETHERITE_BOOTS(ServerVersion.V1_16, "STONE"),
+ NETHERITE_CHESTPLATE(ServerVersion.V1_16, "STONE"),
+ NETHERITE_HELMET(ServerVersion.V1_16, "STONE"),
+ NETHERITE_HOE(ServerVersion.V1_16, "STONE"),
+ NETHERITE_INGOT(ServerVersion.V1_16, "STONE"),
+ NETHERITE_LEGGINGS(ServerVersion.V1_16, "STONE"),
+ NETHERITE_PICKAXE(ServerVersion.V1_16, "STONE"),
+ NETHERITE_SCRAP(ServerVersion.V1_16, "STONE"),
+ NETHERITE_SHOVEL(ServerVersion.V1_16, "STONE"),
+ NETHERITE_SWORD(ServerVersion.V1_16, "STONE"),
+ NETHER_GOLD_ORE(ServerVersion.V1_16, "STONE"),
+ NETHER_SPROUTS(ServerVersion.V1_16, "STONE"),
+ PIGLIN_BANNER_PATTERN(ServerVersion.V1_16, "STONE"),
+ PIGLIN_SPAWN_EGG(ServerVersion.V1_16, "STONE"),
+ POLISHED_BASALT(ServerVersion.V1_16, "STONE"),
+ POLISHED_BLACKSTONE(ServerVersion.V1_16, "STONE"),
+ POLISHED_BLACKSTONE_BRICKS(ServerVersion.V1_16, "STONE"),
+ POLISHED_BLACKSTONE_BRICK_SLAB(ServerVersion.V1_16, "STONE"),
+ POLISHED_BLACKSTONE_BRICK_STAIRS(ServerVersion.V1_16, "STONE"),
+ POLISHED_BLACKSTONE_BRICK_WALL(ServerVersion.V1_16, "STONE"),
+ POLISHED_BLACKSTONE_BUTTON(ServerVersion.V1_16, "STONE"),
+ POLISHED_BLACKSTONE_PRESSURE_PLATE(ServerVersion.V1_16, "STONE"),
+ POLISHED_BLACKSTONE_SLAB(ServerVersion.V1_16, "STONE"),
+ POLISHED_BLACKSTONE_STAIRS(ServerVersion.V1_16, "STONE"),
+ POLISHED_BLACKSTONE_WALL(ServerVersion.V1_16, "STONE"),
+ POTTED_CRIMSON_FUNGUS(ServerVersion.V1_16, "STONE"),
+ POTTED_CRIMSON_ROOTS(ServerVersion.V1_16, "STONE"),
+ POTTED_WARPED_FUNGUS(ServerVersion.V1_16, "STONE"),
+ POTTED_WARPED_ROOTS(ServerVersion.V1_16, "STONE"),
+ QUARTZ_BRICKS(ServerVersion.V1_16, "STONE"),
+ RESPAWN_ANCHOR(ServerVersion.V1_16, "STONE"),
+ SHROOMLIGHT(ServerVersion.V1_16, "STONE"),
+ SOUL_CAMPFIRE(ServerVersion.V1_16, "STONE"),
+ SOUL_FIRE(ServerVersion.V1_16, "STONE"),
+ SOUL_LANTERN(ServerVersion.V1_16, "STONE"),
+ SOUL_SOIL(ServerVersion.V1_16, "STONE"),
+ SOUL_TORCH(ServerVersion.V1_16, "STONE"),
+ SOUL_WALL_TORCH(ServerVersion.V1_16, "STONE"),
+ STRIDER_SPAWN_EGG(ServerVersion.V1_16, "STONE"),
+ STRIPPED_CRIMSON_HYPHAE(ServerVersion.V1_16, "STONE"),
+ STRIPPED_CRIMSON_STEM(ServerVersion.V1_16, "STONE"),
+ STRIPPED_WARPED_HYPHAE(ServerVersion.V1_16, "STONE"),
+ STRIPPED_WARPED_STEM(ServerVersion.V1_16, "STONE"),
+ TARGET(ServerVersion.V1_16, "STONE"),
+ TWISTING_VINES(ServerVersion.V1_16, "STONE"),
+ TWISTING_VINES_PLANT(ServerVersion.V1_16, "STONE"),
+ WARPED_BUTTON(ServerVersion.V1_16, "STONE"),
+ WARPED_DOOR(ServerVersion.V1_16, "STONE"),
+ WARPED_FENCE(ServerVersion.V1_16, "STONE"),
+ WARPED_FENCE_GATE(ServerVersion.V1_16, "STONE"),
+ WARPED_FUNGUS(ServerVersion.V1_16, "STONE"),
+ WARPED_FUNGUS_ON_A_STICK(ServerVersion.V1_16, "STONE"),
+ WARPED_HYPHAE(ServerVersion.V1_16, "STONE"),
+ WARPED_NYLIUM(ServerVersion.V1_16, "STONE"),
+ WARPED_PLANKS(ServerVersion.V1_16, "STONE"),
+ WARPED_PRESSURE_PLATE(ServerVersion.V1_16, "STONE"),
+ WARPED_ROOTS(ServerVersion.V1_16, "STONE"),
+ WARPED_SIGN(ServerVersion.V1_16, "STONE"),
+ WARPED_SLAB(ServerVersion.V1_16, "STONE"),
+ WARPED_STAIRS(ServerVersion.V1_16, "STONE"),
+ WARPED_STEM(ServerVersion.V1_16, "STONE"),
+ WARPED_TRAPDOOR(ServerVersion.V1_16, "STONE"),
+ WARPED_WALL_SIGN(ServerVersion.V1_16, "STONE"),
+ WARPED_WART_BLOCK(ServerVersion.V1_16, "STONE"),
+ WEEPING_VINES(ServerVersion.V1_16, "STONE"),
+ WEEPING_VINES_PLANT(ServerVersion.V1_16, "STONE"),
+ ZOGLIN_SPAWN_EGG(ServerVersion.V1_16, "STONE"),
+ ZOMBIFIED_PIGLIN_SPAWN_EGG(ServerVersion.V1_16, "STONE"),
/* 1.15 */
BEE_SPAWN_EGG(ServerVersion.V1_15, "PARROT_SPAWN_EGG", ServerVersion.V1_12, "MONSTER_EGG", (byte) 65),
diff --git a/Compatibility/src/com/songoda/core/compatibility/ServerVersion.java b/Compatibility/src/com/songoda/core/compatibility/ServerVersion.java
index 21d66d2a..486df2cf 100644
--- a/Compatibility/src/com/songoda/core/compatibility/ServerVersion.java
+++ b/Compatibility/src/com/songoda/core/compatibility/ServerVersion.java
@@ -5,7 +5,7 @@ import org.bukkit.Bukkit;
public enum ServerVersion {
- UNKNOWN, V1_7, V1_8, V1_9, V1_10, V1_11, V1_12, V1_13, V1_14, V1_15, V1_16, V1_17, V1_18, V1_19, V1_20;
+ UNKNOWN, V1_7, V1_8, V1_9, V1_10, V1_11, V1_12, V1_13, V1_14, V1_15, V1_16, V1_17, V1_18, V1_19, V1_20, V1_21;
private final static String serverPackagePath = Bukkit.getServer().getClass().getPackage().getName();
private final static String serverPackageVersion = serverPackagePath.substring(serverPackagePath.lastIndexOf('.') + 1);
diff --git a/Core/pom.xml b/Core/pom.xml
index d6a581cc..911a7e33 100644
--- a/Core/pom.xml
+++ b/Core/pom.xml
@@ -3,7 +3,7 @@
com.songoda
SongodaCore-Modules
- 2.4.57
+ 2.4.59
../
@@ -40,23 +40,6 @@
-
- org.apache.maven.plugins
- maven-javadoc-plugin
- 3.2.0
-
- none
-
-
-
-
- attach-javadocs
-
- jar
-
-
-
-
org.apache.maven.plugins
maven-shade-plugin
@@ -119,7 +102,7 @@
org.spigotmc
spigot
- 1.16.5
+ 1.17
provided
@@ -243,6 +226,13 @@
jar
compile
+
+ ${project.groupId}
+ SongodaCore-NMS-v1_17_R1
+ ${project.version}
+ jar
+ compile
+
diff --git a/Core/src/main/java/com/songoda/core/chat/ChatMessage.java b/Core/src/main/java/com/songoda/core/chat/ChatMessage.java
index 11ac3e6f..06668198 100644
--- a/Core/src/main/java/com/songoda/core/chat/ChatMessage.java
+++ b/Core/src/main/java/com/songoda/core/chat/ChatMessage.java
@@ -4,7 +4,9 @@ import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.songoda.core.compatibility.ServerVersion;
+import com.songoda.core.compatibility.ClassMapping;
import com.songoda.core.utils.TextUtils;
+import net.minecraft.network.chat.IChatBaseComponent;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -24,7 +26,7 @@ import java.util.regex.Pattern;
public class ChatMessage {
private static final Gson gson = new GsonBuilder().create();
- private List textList = new ArrayList<>();
+ private final List textList = new ArrayList<>();
public void clear() {
textList.clear();
@@ -234,21 +236,21 @@ public class ChatMessage {
Class> cb_craftPlayerClazz, mc_entityPlayerClazz, mc_playerConnectionClazz, mc_PacketInterface,
mc_IChatBaseComponent, mc_IChatBaseComponent_ChatSerializer, mc_PacketPlayOutChat;
- cb_craftPlayerClazz = Class.forName("org.bukkit.craftbukkit." + version + ".entity.CraftPlayer");
+ cb_craftPlayerClazz = ClassMapping.CRAFT_PLAYER.getClazz();
cb_craftPlayer_getHandle = cb_craftPlayerClazz.getDeclaredMethod("getHandle");
- mc_entityPlayerClazz = Class.forName("net.minecraft.server." + version + ".EntityPlayer");
- mc_entityPlayer_playerConnection = mc_entityPlayerClazz.getDeclaredField("playerConnection");
- mc_playerConnectionClazz = Class.forName("net.minecraft.server." + version + ".PlayerConnection");
- mc_PacketInterface = Class.forName("net.minecraft.server." + version + ".Packet");
+ mc_entityPlayerClazz = ClassMapping.ENTITY_PLAYER.getClazz();
+ mc_entityPlayer_playerConnection = mc_entityPlayerClazz.getDeclaredField(ServerVersion.isServerVersionAtLeast(ServerVersion.V1_17) ? "b" : "playerConnection");
+ mc_playerConnectionClazz = ClassMapping.PLAYER_CONNECTION.getClazz();
+ mc_PacketInterface = ClassMapping.PACKET.getClazz();
mc_playerConnection_sendPacket = mc_playerConnectionClazz.getDeclaredMethod("sendPacket", mc_PacketInterface);
- mc_IChatBaseComponent = Class.forName("net.minecraft.server." + version + ".IChatBaseComponent");
- mc_IChatBaseComponent_ChatSerializer = Class.forName("net.minecraft.server." + version + ".IChatBaseComponent$ChatSerializer");
+ mc_IChatBaseComponent = ClassMapping.I_CHAT_BASE_COMPONENT.getClazz();
+ mc_IChatBaseComponent_ChatSerializer = ClassMapping.I_CHAT_BASE_COMPONENT.getClazz("ChatSerializer");
mc_IChatBaseComponent_ChatSerializer_a = mc_IChatBaseComponent_ChatSerializer.getMethod("a", String.class);
- mc_PacketPlayOutChat = Class.forName("net.minecraft.server." + version + ".PacketPlayOutChat");
+ mc_PacketPlayOutChat = ClassMapping.PACKET_PLAY_OUT_CHAT.getClazz();
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_16)) {
- mc_ChatMessageType = Class.forName("net.minecraft.server." + version + ".ChatMessageType");
- mc_chatMessageType_Chat = mc_ChatMessageType.getField("CHAT");
+ mc_ChatMessageType = ClassMapping.CHAT_MESSAGE_TYPE.getClazz();
+ mc_chatMessageType_Chat = mc_ChatMessageType.getField(ServerVersion.isServerVersionAtLeast(ServerVersion.V1_17) ? "a" : "CHAT");
mc_PacketPlayOutChat_new = mc_PacketPlayOutChat.getConstructor(mc_IChatBaseComponent, mc_ChatMessageType, UUID.class);
} else {
mc_PacketPlayOutChat_new = mc_PacketPlayOutChat.getConstructor(mc_IChatBaseComponent);
diff --git a/Core/src/main/java/com/songoda/core/commands/CommandManager.java b/Core/src/main/java/com/songoda/core/commands/CommandManager.java
index b145f747..b0b7758b 100644
--- a/Core/src/main/java/com/songoda/core/commands/CommandManager.java
+++ b/Core/src/main/java/com/songoda/core/commands/CommandManager.java
@@ -10,9 +10,11 @@ import org.bukkit.command.CommandSender;
import org.bukkit.command.PluginCommand;
import org.bukkit.command.SimpleCommandMap;
import org.bukkit.command.TabCompleter;
+import org.bukkit.command.defaults.BukkitCommand;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
+import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
@@ -304,11 +306,12 @@ public class CommandManager implements CommandExecutor, TabCompleter {
public static void registerCommandDynamically(Plugin plugin, String command, CommandExecutor executor, TabCompleter tabManager) {
try {
+
// Retrieve the SimpleCommandMap from the server
- Class> classCraftServer = Bukkit.getServer().getClass();
- Field fieldCommandMap = classCraftServer.getDeclaredField("commandMap");
- fieldCommandMap.setAccessible(true);
- SimpleCommandMap commandMap = (SimpleCommandMap) fieldCommandMap.get(Bukkit.getServer());
+ Class> clazzCraftServer = Bukkit.getServer().getClass();
+ Object craftServer = clazzCraftServer.cast(Bukkit.getServer());
+ SimpleCommandMap commandMap = (SimpleCommandMap) craftServer.getClass()
+ .getDeclaredMethod("getCommandMap").invoke(craftServer);
// Construct a new Command object
Constructor constructorPluginCommand = PluginCommand.class.getDeclaredConstructor(String.class, Plugin.class);
@@ -340,4 +343,12 @@ public class CommandManager implements CommandExecutor, TabCompleter {
e.printStackTrace();
}
}
+
+ /*
+ private class DCommand extends PluginCommand {
+
+ protected DCommand(@NotNull String name, @NotNull Plugin owner) {
+ super(name, owner);
+ }
+ } */
}
diff --git a/Core/src/main/java/com/songoda/core/core/SongodaCoreDiagCommand.java b/Core/src/main/java/com/songoda/core/core/SongodaCoreDiagCommand.java
index 415dc551..1c4d4036 100644
--- a/Core/src/main/java/com/songoda/core/core/SongodaCoreDiagCommand.java
+++ b/Core/src/main/java/com/songoda/core/core/SongodaCoreDiagCommand.java
@@ -4,7 +4,7 @@ import com.songoda.core.SongodaCore;
import com.songoda.core.commands.AbstractCommand;
import com.songoda.core.compatibility.ServerProject;
import com.songoda.core.compatibility.ServerVersion;
-import com.songoda.core.utils.NMSUtils;
+import com.songoda.core.compatibility.ClassMapping;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
@@ -24,7 +24,7 @@ public class SongodaCoreDiagCommand extends AbstractCommand {
super(false, "diag");
try {
- serverInstance = NMSUtils.getNMSClass("MinecraftServer").getMethod("getServer").invoke(null);
+ serverInstance = ClassMapping.MINECRAFT_SERVER.getClazz().getMethod("getServer").invoke(null);
tpsField = serverInstance.getClass().getField("recentTps");
} catch (NoSuchFieldException | SecurityException | IllegalAccessException | IllegalArgumentException
| InvocationTargetException | NoSuchMethodException e) {
diff --git a/Core/src/main/java/com/songoda/core/hooks/worldguard/WorldGuardFlagHandler.java b/Core/src/main/java/com/songoda/core/hooks/worldguard/WorldGuardFlagHandler.java
index fed73b70..3b490b80 100644
--- a/Core/src/main/java/com/songoda/core/hooks/worldguard/WorldGuardFlagHandler.java
+++ b/Core/src/main/java/com/songoda/core/hooks/worldguard/WorldGuardFlagHandler.java
@@ -164,14 +164,14 @@ public class WorldGuardFlagHandler {
private static Object getPrivateField(Class> c, Object handle, String fieldName) throws Exception {
Field field = c.getDeclaredField(fieldName);
- field.setAccessible(true);
+ field.setAccessible(true); // This should be okay since it only runs on older versions.
return field.get(handle);
}
private static void setStaticField(Field field, Object value) throws Exception {
- field.setAccessible(true);
+ field.setAccessible(true); // This should be okay since it only runs on older versions.
Field modifier = Field.class.getDeclaredField("modifiers");
- modifier.setAccessible(true);
+ modifier.setAccessible(true); // This should be okay since it only runs on older versions.
modifier.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, value);
}
diff --git a/Core/src/main/java/com/songoda/core/nms/NmsManager.java b/Core/src/main/java/com/songoda/core/nms/NmsManager.java
index 238aa642..7b22fde3 100644
--- a/Core/src/main/java/com/songoda/core/nms/NmsManager.java
+++ b/Core/src/main/java/com/songoda/core/nms/NmsManager.java
@@ -93,6 +93,11 @@ public class NmsManager {
nbt = new com.songoda.core.nms.v1_16_R3.nbt.NBTCoreImpl();
world = new com.songoda.core.nms.v1_16_R3.world.WorldCoreImpl();
break;
+ case "v1_17_R1":
+ anvil = new com.songoda.core.nms.v1_17_R1.anvil.AnvilCore();
+ nbt = new com.songoda.core.nms.v1_17_R1.nbt.NBTCoreImpl();
+ world = new com.songoda.core.nms.v1_17_R1.world.WorldCoreImpl();
+ break;
default:
Logger.getLogger(NmsManager.class.getName()).log(Level.SEVERE, "Failed to load NMS for this server version: version {0} not found", serverPackageVersion);
anvil = null;
diff --git a/Core/src/main/java/com/songoda/core/utils/BlockUtils.java b/Core/src/main/java/com/songoda/core/utils/BlockUtils.java
index cdba5f0e..93321e50 100644
--- a/Core/src/main/java/com/songoda/core/utils/BlockUtils.java
+++ b/Core/src/main/java/com/songoda/core/utils/BlockUtils.java
@@ -1,5 +1,6 @@
package com.songoda.core.utils;
+import com.songoda.core.compatibility.ClassMapping;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.ServerVersion;
import org.bukkit.Bukkit;
@@ -321,19 +322,17 @@ public class BlockUtils {
try {
// Cache reflection.
if (clazzCraftWorld == null) {
- String serverPackagePath = Bukkit.getServer().getClass().getPackage().getName();
- String ver = serverPackagePath.substring(serverPackagePath.lastIndexOf('.') + 1);
- clazzCraftWorld = Class.forName("org.bukkit.craftbukkit." + ver + ".CraftWorld");
- clazzCraftBlock = Class.forName("org.bukkit.craftbukkit." + ver + ".block.CraftBlock");
- clazzBlockPosition = Class.forName("net.minecraft.server." + ver + ".BlockPosition");
- Class> clazzWorld = Class.forName("net.minecraft.server." + ver + ".World");
- Class> clazzBlock = Class.forName("net.minecraft.server." + ver + ".Block");
+ clazzCraftWorld = ClassMapping.CRAFT_WORLD.getClazz();
+ clazzCraftBlock = ClassMapping.CRAFT_BLOCK.getClazz();
+ clazzBlockPosition = ClassMapping.BLOCK_POSITION.getClazz();
+ Class> clazzWorld = ClassMapping.WORLD.getClazz();
+ Class> clazzBlock = ClassMapping.BLOCK.getClazz();
getHandle = clazzCraftWorld.getMethod("getHandle");
updateAdjacentComparators = clazzWorld.getMethod("updateAdjacentComparators", clazzBlockPosition, clazzBlock);
craftBlock_getNMS = clazzCraftBlock.getDeclaredMethod("getNMS");
- Class> clazzBlockData = Class.forName("net.minecraft.server." + ver + ".BlockBase$BlockData");
+ Class> clazzBlockData = ClassMapping.BLOCK_BASE.getClazz("BlockData");
nmsBlockData_getBlock = clazzBlockData.getDeclaredMethod("getBlock");
}
@@ -374,14 +373,13 @@ public class BlockUtils {
try {
// Cache reflection
if (clazzIBlockData == null) {
- String ver = Bukkit.getServer().getClass().getPackage().getName().substring(23);
- clazzIBlockData = Class.forName("net.minecraft.server." + ver + ".IBlockData");
- clazzBlockPosition = Class.forName("net.minecraft.server." + ver + ".BlockPosition");
- clazzCraftWorld = Class.forName("org.bukkit.craftbukkit." + ver + ".CraftWorld");
- clazzBlocks = Class.forName("net.minecraft.server." + ver + ".Blocks");
- Class> clazzBlock = Class.forName("net.minecraft.server." + ver + ".Block");
- Class> clazzWorld = Class.forName("net.minecraft.server." + ver + ".World");
- Class> clazzChunk = Class.forName("net.minecraft.server." + ver + ".Chunk");
+ clazzIBlockData = ClassMapping.I_BLOCK_DATA.getClazz();
+ clazzBlockPosition = ClassMapping.BLOCK_POSITION.getClazz();
+ clazzCraftWorld = ClassMapping.CRAFT_WORLD.getClazz();
+ clazzBlocks = ClassMapping.BLOCKS.getClazz();
+ Class> clazzBlock = ClassMapping.BLOCK.getClazz();
+ Class> clazzWorld = ClassMapping.WORLD.getClazz();
+ Class> clazzChunk = ClassMapping.CHUNK.getClazz();
getHandle = clazzCraftWorld.getMethod("getHandle");
getChunkAt = clazzWorld.getMethod("getChunkAt", int.class, int.class);
diff --git a/Core/src/main/java/com/songoda/core/utils/BlockUtilsModern.java b/Core/src/main/java/com/songoda/core/utils/BlockUtilsModern.java
index 094b3624..a67d960b 100644
--- a/Core/src/main/java/com/songoda/core/utils/BlockUtilsModern.java
+++ b/Core/src/main/java/com/songoda/core/utils/BlockUtilsModern.java
@@ -1,5 +1,6 @@
package com.songoda.core.utils;
+import com.songoda.core.compatibility.ClassMapping;
import com.songoda.core.compatibility.ServerVersion;
import org.bukkit.Bukkit;
import org.bukkit.Effect;
@@ -86,27 +87,25 @@ public class BlockUtilsModern {
try {
// Cache reflection.
- String ver = Bukkit.getServer().getClass().getPackage().getName().substring(23);
- clazzCraftWorld = Class.forName("org.bukkit.craftbukkit." + ver + ".CraftWorld");
- clazzCraftBlock = Class.forName("org.bukkit.craftbukkit." + ver + ".block.CraftBlock");
- //clazzBlockPosition = Class.forName("net.minecraft.server." + ver + ".BlockPosition");
+ clazzCraftWorld = ClassMapping.CRAFT_WORLD.getClazz();
+ clazzCraftBlock = ClassMapping.CRAFT_BLOCK.getClazz();
craftWorld_getHandle = clazzCraftWorld.getMethod("getHandle");
craftBlock_getPostition = clazzCraftBlock.getDeclaredMethod("getPosition");
craftBlock_getNMS = clazzCraftBlock.getDeclaredMethod("getNMS");
- Class> clazzBlockData = Class.forName("net.minecraft.server." + ver + ".BlockBase$BlockData");
+ Class> clazzBlockData = ClassMapping.BLOCK_BASE.getClazz("BlockData");
nmsBlockData_getBlock = clazzBlockData.getDeclaredMethod("getBlock");
- Class> clazzCraftBlockData = Class.forName("org.bukkit.craftbukkit." + ver + ".block.data.CraftBlockData");
+ Class> clazzCraftBlockData = ClassMapping.CRAFT_BLOCK_DATA.getClazz();
craftBlockData_getState = clazzCraftBlockData.getDeclaredMethod("getState");
- Class> clazzWorld = Class.forName("net.minecraft.server." + ver + ".World");
- Class> clazzBlockState = Class.forName("net.minecraft.server." + ver + ".IBlockData");
- Class> clazzBlockPos = Class.forName("net.minecraft.server." + ver + ".BlockPosition");
- clazzLeverBlock = Class.forName("net.minecraft.server." + ver + ".BlockLever");
- clazzButtonBlock = Class.forName("net.minecraft.server." + ver + ".BlockButtonAbstract");
- clazzPressurePlateBlock = Class.forName("net.minecraft.server." + ver + ".BlockPressurePlateAbstract");
+ Class> clazzWorld = ClassMapping.WORLD.getClazz();
+ Class> clazzBlockState = ClassMapping.I_BLOCK_DATA.getClazz();
+ Class> clazzBlockPos = ClassMapping.BLOCK_POSITION.getClazz();
+ clazzLeverBlock = ClassMapping.BLOCK_LEVER.getClazz();
+ clazzButtonBlock = ClassMapping.BLOCK_BUTTON_ABSTRACT.getClazz();
+ clazzPressurePlateBlock = ClassMapping.BLOCK_PRESSURE_PLATE_ABSTRACT.getClazz();
// nmsLever_updateNeighbours, nmsButton_updateNeighbours, nmsPlate_updateNeighbours
nmsLever_updateNeighbours = clazzLeverBlock.getDeclaredMethod(ServerVersion.isServerVersionAbove(ServerVersion.V1_13)
diff --git a/Core/src/main/java/com/songoda/core/utils/EntityUtils.java b/Core/src/main/java/com/songoda/core/utils/EntityUtils.java
index 7bb5e960..7da89bb2 100644
--- a/Core/src/main/java/com/songoda/core/utils/EntityUtils.java
+++ b/Core/src/main/java/com/songoda/core/utils/EntityUtils.java
@@ -1,8 +1,7 @@
package com.songoda.core.utils;
import com.songoda.core.compatibility.CompatibleMaterial;
-import org.apache.commons.lang.WordUtils;
-import org.bukkit.Bukkit;
+import com.songoda.core.compatibility.ClassMapping;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
@@ -24,12 +23,11 @@ public class EntityUtils {
static {
try {
- String ver = Bukkit.getServer().getClass().getPackage().getName().substring(23);
- clazzEntityInsentient = Class.forName("net.minecraft.server." + ver + ".EntityInsentient");
- clazzEntity = Class.forName("net.minecraft.server." + ver + ".Entity");
- clazzCraftEntity = Class.forName("org.bukkit.craftbukkit." + ver + ".entity.CraftEntity");
+ clazzEntityInsentient = ClassMapping.ENTITY_INSENTIENT.getClazz();
+ clazzEntity = ClassMapping.ENTITY.getClazz();
+ clazzCraftEntity = ClassMapping.CRAFT_ENTITY.getClazz();
methodGetHandle = clazzCraftEntity.getDeclaredMethod("getHandle");
- } catch (ClassNotFoundException | NoSuchMethodException e) {
+ } catch (NoSuchMethodException e) {
e.printStackTrace();
}
diff --git a/Core/src/main/java/com/songoda/core/utils/ItemUtils.java b/Core/src/main/java/com/songoda/core/utils/ItemUtils.java
index cc9296dc..e42102f9 100644
--- a/Core/src/main/java/com/songoda/core/utils/ItemUtils.java
+++ b/Core/src/main/java/com/songoda/core/utils/ItemUtils.java
@@ -7,9 +7,8 @@ import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import com.songoda.core.compatibility.CompatibleHand;
import com.songoda.core.compatibility.CompatibleMaterial;
-import com.songoda.core.compatibility.CompatibleSound;
import com.songoda.core.compatibility.ServerVersion;
-import com.songoda.core.nms.NmsManager;
+import com.songoda.core.compatibility.ClassMapping;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.Material;
@@ -120,43 +119,6 @@ public class ItemUtils {
return clone;
}
- public static ItemStack addDamage(ItemStack item, int damage) {
- return addDamage(null, item, damage);
- }
-
- public static ItemStack addDamage(Player player, ItemStack item, int damage) {
- if (item == null)
- return null;
-
- int maxDurability = item.getType().getMaxDurability();
- int durability;
-
- if (ServerVersion.isServerVersionBelow(ServerVersion.V1_11)
- ? NmsManager.getNbt().of(item).has("Unbreakable")
- : item.getItemMeta().isUnbreakable()) {
- return item;
- } else if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_13)) {
- // ItemStack.setDurability(short) still works in 1.13-1.14, but use these methods now
- ItemMeta meta = item.getItemMeta();
- if (meta instanceof Damageable) {
- Damageable damageable = ((Damageable) meta);
- damageable.setDamage(((Damageable) meta).getDamage() + damage);
- item.setItemMeta(meta);
- durability = damageable.getDamage();
- } else {
- return item;
- }
- } else {
- item.setDurability((short) Math.max(0, item.getDurability() + damage));
- durability = item.getDurability();
- }
- if (durability >= maxDurability && player != null) {
- player.getInventory().removeItem(item);
- CompatibleSound.ENTITY_ITEM_BREAK.play(player);
- }
- return item;
- }
-
public static boolean hasEnoughDurability(ItemStack tool, int requiredAmount) {
if (tool.getType().getMaxDurability() <= 1)
return true;
@@ -173,10 +135,10 @@ public class ItemUtils {
}
static Class cb_ItemStack = NMSUtils.getCraftClass("inventory.CraftItemStack");
- static Class mc_ItemStack = NMSUtils.getNMSClass("ItemStack");
- static Class mc_NBTTagCompound = NMSUtils.getNMSClass("NBTTagCompound");
- static Class mc_NBTTagList = NMSUtils.getNMSClass("NBTTagList");
- static Class mc_NBTBase = NMSUtils.getNMSClass("NBTBase");
+ static Class mc_ItemStack = ClassMapping.ITEM_STACK.getClazz();
+ static Class mc_NBTTagCompound = ClassMapping.NBT_TAG_COMPOUND.getClazz();
+ static Class mc_NBTTagList = ClassMapping.NBT_TAG_LIST.getClazz();
+ static Class mc_NBTBase = ClassMapping.NBT_BASE.getClazz();
static Method mc_ItemStack_getTag;
static Method mc_ItemStack_setTag;
static Method mc_NBTTagCompound_set;
@@ -292,7 +254,7 @@ public class ItemUtils {
return item;
}
- private static Class mc_Item = NMSUtils.getNMSClass("Item");
+ private static Class> mc_Item = ClassMapping.ITEM.getClazz();
private static Method mc_Item_getItem;
private static Field mc_Item_maxStackSize;
@@ -348,15 +310,22 @@ public class ItemUtils {
}
public static ItemStack getCustomHead(String texture) {
+ return getCustomHead(null, texture);
+ }
+
+ public static ItemStack getCustomHead(String signature, String texture) {
ItemStack skullItem = CompatibleMaterial.PLAYER_HEAD.getItem();
- if (ServerVersion.isServerVersionBelow(ServerVersion.V1_8)) {
+ if (ServerVersion.isServerVersionBelow(ServerVersion.V1_8))
return skullItem;
- }
+
SkullMeta sm = (SkullMeta) skullItem.getItemMeta();
GameProfile gm;
if (texture.endsWith("=")) {
gm = new GameProfile(UUID.nameUUIDFromBytes(texture.getBytes()), "CustomHead");
- gm.getProperties().put("textures", new Property("texture", texture.replaceAll("=", "")));
+ if (signature == null)
+ gm.getProperties().put("textures", new Property("texture", texture.replaceAll("=", "")));
+ else
+ gm.getProperties().put("textures", new Property("textures", texture, signature));
} else {
gm = new GameProfile(UUID.nameUUIDFromBytes(texture.getBytes()), "CustomHead");
byte[] encodedData = Base64.getEncoder().encode(String.format("{textures:{SKIN:{url:\"http://textures.minecraft.net/texture/%s\"}}}", texture).getBytes());
diff --git a/Core/src/main/java/com/songoda/core/utils/NMSUtils.java b/Core/src/main/java/com/songoda/core/utils/NMSUtils.java
index eee3c6ab..9876b531 100644
--- a/Core/src/main/java/com/songoda/core/utils/NMSUtils.java
+++ b/Core/src/main/java/com/songoda/core/utils/NMSUtils.java
@@ -1,6 +1,7 @@
package com.songoda.core.utils;
import com.songoda.core.compatibility.ServerVersion;
+import com.songoda.core.compatibility.ClassMapping;
import org.bukkit.entity.Player;
import java.lang.reflect.Field;
@@ -8,17 +9,6 @@ import java.lang.reflect.Method;
public class NMSUtils {
- public static Class> getNMSClass(String className) {
- try {
- String fullName = "net.minecraft.server." + ServerVersion.getServerVersionString() + "." + className;
- Class> clazz = Class.forName(fullName);
- return clazz;
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }
-
public static Class> getCraftClass(String className) {
try {
String fullName = "org.bukkit.craftbukkit." + ServerVersion.getServerVersionString() + "." + className;
@@ -65,14 +55,7 @@ public class NMSUtils {
public static void setField(Object object, String fieldName, Object fieldValue, boolean declared) {
try {
- Field field;
-
- if (declared) {
- field = object.getClass().getDeclaredField(fieldName);
- } else {
- field = object.getClass().getField(fieldName);
- }
-
+ Field field = declared ? object.getClass().getDeclaredField(fieldName) : object.getClass().getField(fieldName);
field.setAccessible(true);
field.set(object, fieldValue);
} catch (Exception e) {
@@ -84,7 +67,7 @@ public class NMSUtils {
try {
Object handle = player.getClass().getMethod("getHandle").invoke(player);
Object playerConnection = handle.getClass().getField("playerConnection").get(handle);
- playerConnection.getClass().getMethod("sendPacket", getNMSClass("Packet")).invoke(playerConnection, packet);
+ playerConnection.getClass().getMethod("sendPacket", ClassMapping.PACKET.getClazz()).invoke(playerConnection, packet);
} catch (Exception e) {
e.printStackTrace();
}
diff --git a/Core/src/main/java/com/songoda/core/world/SItemStack.java b/Core/src/main/java/com/songoda/core/world/SItemStack.java
new file mode 100644
index 00000000..11458fe7
--- /dev/null
+++ b/Core/src/main/java/com/songoda/core/world/SItemStack.java
@@ -0,0 +1,75 @@
+package com.songoda.core.world;
+
+import com.songoda.core.compatibility.CompatibleSound;
+import com.songoda.core.compatibility.ServerVersion;
+import com.songoda.core.nms.NmsManager;
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
+import org.bukkit.event.player.PlayerItemBreakEvent;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.Damageable;
+import org.bukkit.inventory.meta.ItemMeta;
+
+public class SItemStack {
+
+ protected final com.songoda.core.nms.world.SItemStack sItem;
+ protected final ItemStack item;
+
+ public SItemStack(ItemStack item) {
+ this.item = item;
+ this.sItem = NmsManager.getWorld().getItemStack(item);
+ }
+
+ /**
+ * Damage the selected item
+ *
+ * @param player the player who's item you want to damage
+ * @param damage the amount of damage to apply to the item
+ */
+ public ItemStack addDamage(Player player, int damage) {
+ if (item == null)
+ return null;
+
+ int maxDurability = item.getType().getMaxDurability();
+ int durability;
+
+ if (ServerVersion.isServerVersionBelow(ServerVersion.V1_11)
+ ? NmsManager.getNbt().of(item).has("Unbreakable")
+ : item.getItemMeta().isUnbreakable()) {
+ return item;
+ } else if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_13)) {
+ // ItemStack.setDurability(short) still works in 1.13-1.14, but use these methods now
+ ItemMeta meta = item.getItemMeta();
+ if (meta instanceof Damageable) {
+ Damageable damageable = ((Damageable) meta);
+ damageable.setDamage(((Damageable) meta).getDamage() + damage);
+ item.setItemMeta(meta);
+ durability = damageable.getDamage();
+ } else {
+ return item;
+ }
+ } else {
+ item.setDurability((short) Math.max(0, item.getDurability() + damage));
+ durability = item.getDurability();
+ }
+ if (durability >= maxDurability && player != null)
+ destroy(player);
+
+ return item;
+ }
+
+ public void destroy(Player player) {
+ destroy(player, 1);
+ }
+
+ public void destroy(Player player, int amount) {
+ PlayerItemBreakEvent breakEvent = new PlayerItemBreakEvent(player, item);
+ Bukkit.getServer().getPluginManager().callEvent(breakEvent);
+ sItem.breakItem(player, amount);
+ CompatibleSound.ENTITY_ITEM_BREAK.play(player);
+ }
+
+ public ItemStack getItem() {
+ return item;
+ }
+}
diff --git a/Core/src/main/java/com/songoda/core/world/SSpawner.java b/Core/src/main/java/com/songoda/core/world/SSpawner.java
index 0a2ab7b4..b4f0bd6a 100644
--- a/Core/src/main/java/com/songoda/core/world/SSpawner.java
+++ b/Core/src/main/java/com/songoda/core/world/SSpawner.java
@@ -17,12 +17,12 @@ import java.util.concurrent.ThreadLocalRandom;
public class SSpawner {
- private static final WorldCore worldCore = NmsManager.getWorld();
-
+ protected final com.songoda.core.nms.world.SSpawner sSpawner;
protected final Location location;
public SSpawner(Location location) {
this.location = location;
+ this.sSpawner = NmsManager.getWorld().getSpawner(location);
}
public SSpawner(CreatureSpawner spawner) {
@@ -60,7 +60,7 @@ public class SSpawner {
int amountSpawned = 0;
while (spawnCountUsed-- > 0) {
EntityType type = types[ThreadLocalRandom.current().nextInt(types.length)];
- LivingEntity entity = worldCore.getSpawner(location).spawnEntity(type, particle, spawned, canSpawnOn);
+ LivingEntity entity = sSpawner.spawnEntity(type, particle, spawned, canSpawnOn);
if (entity != null) {
// If this entity is indeed stackable then spawn a single stack with the desired stack size.
if (useStackPlugin && amountToSpawn >= EntityStackerManager.getMinStackSize(type)) {
@@ -73,4 +73,8 @@ public class SSpawner {
}
return amountSpawned;
}
+
+ public Location getLocation() {
+ return location;
+ }
}
diff --git a/Core/src/main/java/com/songoda/core/world/SWorld.java b/Core/src/main/java/com/songoda/core/world/SWorld.java
new file mode 100644
index 00000000..e7102f3f
--- /dev/null
+++ b/Core/src/main/java/com/songoda/core/world/SWorld.java
@@ -0,0 +1,39 @@
+package com.songoda.core.world;
+
+import com.songoda.core.compatibility.ServerVersion;
+import com.songoda.core.nms.NmsManager;
+import org.bukkit.Location;
+import org.bukkit.World;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.LivingEntity;
+
+import java.util.List;
+
+public class SWorld {
+
+ protected final com.songoda.core.nms.world.SWorld sWorld;
+ protected final World world;
+
+ public SWorld(World world) {
+ this.world = world;
+ this.sWorld = NmsManager.getWorld().getWorld(world);
+ }
+
+ public Entity[] getEntitiesFromChunk(int x, int z) {
+ Location location = new Location(null, 0.0D, 0.0D, 0.0D);
+ return getLivingEntities().stream().filter((entity) -> {
+ entity.getLocation(location);
+ return location.getBlockX() >> 4 == x && location.getBlockZ() >> 4 == z;
+ }).toArray(Entity[]::new);
+ }
+
+ public List getLivingEntities() {
+ if (ServerVersion.isServerVersionBelow(ServerVersion.V1_17))
+ return world.getLivingEntities();
+ return sWorld.getLivingEntities();
+ }
+
+ public World getWorld() {
+ return world;
+ }
+}
diff --git a/Core/src/main/java/com/songoda/core/world/WorldBorder.java b/Core/src/main/java/com/songoda/core/world/SWorldBorder.java
similarity index 93%
rename from Core/src/main/java/com/songoda/core/world/WorldBorder.java
rename to Core/src/main/java/com/songoda/core/world/SWorldBorder.java
index b9ae890c..1cfb4ad8 100644
--- a/Core/src/main/java/com/songoda/core/world/WorldBorder.java
+++ b/Core/src/main/java/com/songoda/core/world/SWorldBorder.java
@@ -1,6 +1,7 @@
package com.songoda.core.world;
import com.songoda.core.compatibility.ServerVersion;
+import com.songoda.core.compatibility.ClassMapping;
import com.songoda.core.utils.NMSUtils;
import org.bukkit.Location;
import org.bukkit.entity.Player;
@@ -9,7 +10,7 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
-public class WorldBorder {
+public class SWorldBorder {
private static Class> packetPlayOutWorldBorderEnumClass;
private static Class> worldBorderClass;
@@ -18,7 +19,7 @@ public class WorldBorder {
static {
try {
- Class> packetPlayOutWorldBorder = NMSUtils.getNMSClass("PacketPlayOutWorldBorder");
+ Class> packetPlayOutWorldBorder = ClassMapping.PACKET_PLAY_OUT_WORLD_BORDER.getClazz();
if(packetPlayOutWorldBorder != null) {
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_11))
@@ -26,7 +27,7 @@ public class WorldBorder {
else
packetPlayOutWorldBorderEnumClass = packetPlayOutWorldBorder.getDeclaredClasses()[1];
- worldBorderClass = NMSUtils.getNMSClass("WorldBorder");
+ worldBorderClass = ClassMapping.WORLD_BORDER.getClazz();
craftWorldClass = NMSUtils.getCraftClass("CraftWorld");
packetPlayOutWorldBorderConstructor = packetPlayOutWorldBorder.getConstructor(worldBorderClass,
diff --git a/NMS/NMS-API/src/com/songoda/core/nms/world/SItemStack.java b/NMS/NMS-API/src/com/songoda/core/nms/world/SItemStack.java
new file mode 100644
index 00000000..380d478d
--- /dev/null
+++ b/NMS/NMS-API/src/com/songoda/core/nms/world/SItemStack.java
@@ -0,0 +1,13 @@
+package com.songoda.core.nms.world;
+
+import org.bukkit.entity.Player;
+
+import java.util.Random;
+
+public interface SItemStack {
+
+ Random random = new Random();
+
+ void breakItem(Player player, int amount);
+
+}
diff --git a/NMS/NMS-API/src/com/songoda/core/nms/world/SWorld.java b/NMS/NMS-API/src/com/songoda/core/nms/world/SWorld.java
new file mode 100644
index 00000000..63affe2a
--- /dev/null
+++ b/NMS/NMS-API/src/com/songoda/core/nms/world/SWorld.java
@@ -0,0 +1,10 @@
+package com.songoda.core.nms.world;
+
+import org.bukkit.entity.LivingEntity;
+
+import java.util.List;
+
+public interface SWorld {
+
+ List getLivingEntities();
+}
diff --git a/NMS/NMS-API/src/com/songoda/core/nms/world/WorldCore.java b/NMS/NMS-API/src/com/songoda/core/nms/world/WorldCore.java
index aa9d656b..d1143b5f 100644
--- a/NMS/NMS-API/src/com/songoda/core/nms/world/WorldCore.java
+++ b/NMS/NMS-API/src/com/songoda/core/nms/world/WorldCore.java
@@ -1,11 +1,17 @@
package com.songoda.core.nms.world;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.block.CreatureSpawner;
+import org.bukkit.inventory.ItemStack;
public interface WorldCore {
SSpawner getSpawner(CreatureSpawner spawner);
SSpawner getSpawner(Location location);
+
+ SItemStack getItemStack(ItemStack item);
+
+ SWorld getWorld(World world);
}
diff --git a/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/world/SItemStackImpl.java b/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/world/SItemStackImpl.java
new file mode 100644
index 00000000..483bb80d
--- /dev/null
+++ b/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/world/SItemStackImpl.java
@@ -0,0 +1,36 @@
+package com.songoda.core.nms.v1_10_R1.world;
+
+import com.songoda.core.nms.world.SItemStack;
+import net.minecraft.server.v1_10_R1.EntityPlayer;
+import net.minecraft.server.v1_10_R1.EnumParticle;
+import net.minecraft.server.v1_10_R1.Item;
+import net.minecraft.server.v1_10_R1.Vec3D;
+import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftItemStack;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+public class SItemStackImpl implements SItemStack {
+
+ private final ItemStack item;
+
+ public SItemStackImpl(ItemStack item) {
+ this.item = item;
+ }
+
+ @Override
+ public void breakItem(Player player, int amount) {
+ EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
+ for (int i = 0; i < 5; ++i) {
+ Vec3D vec3d = new Vec3D(((double) random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D);
+ vec3d = vec3d.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d = vec3d.b(-entityPlayer.yaw * 0.017453292F);
+ double d0 = (double) (-random.nextFloat()) * 0.6D - 0.3D;
+ Vec3D vec3d1 = new Vec3D(((double) random.nextFloat() - 0.5D) * 0.3D, d0, 0.6D);
+ vec3d1 = vec3d1.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d1 = vec3d1.b(-entityPlayer.yaw * 0.017453292F);
+ vec3d1 = vec3d1.add(entityPlayer.locX, entityPlayer.locY + (double) entityPlayer.getHeadHeight(), entityPlayer.locZ);
+ entityPlayer.world.addParticle(EnumParticle.ITEM_CRACK, vec3d1.x, vec3d1.y, vec3d1.z, vec3d.x, vec3d.y + 0.05D, vec3d.z, new int[]{Item.getId(CraftItemStack.asNMSCopy(item).getItem())});
+ }
+ }
+}
diff --git a/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/world/spawner/SSpawnerImpl.java b/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/world/SSpawnerImpl.java
similarity index 98%
rename from NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/world/spawner/SSpawnerImpl.java
rename to NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/world/SSpawnerImpl.java
index a968ed98..40bd0222 100644
--- a/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/world/spawner/SSpawnerImpl.java
+++ b/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/world/SSpawnerImpl.java
@@ -1,4 +1,4 @@
-package com.songoda.core.nms.v1_10_R1.world.spawner;
+package com.songoda.core.nms.v1_10_R1.world;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.CompatibleParticleHandler;
diff --git a/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/world/SWorldImpl.java b/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/world/SWorldImpl.java
new file mode 100644
index 00000000..64d2e82c
--- /dev/null
+++ b/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/world/SWorldImpl.java
@@ -0,0 +1,18 @@
+package com.songoda.core.nms.v1_10_R1.world;
+
+import com.songoda.core.nms.world.SWorld;
+import org.bukkit.entity.LivingEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SWorldImpl implements SWorld {
+
+ public SWorldImpl() {
+ }
+
+ @Override
+ public List getLivingEntities() {
+ return new ArrayList<>();
+ }
+}
diff --git a/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/world/WorldCoreImpl.java
index fb00f8c8..9fa44825 100644
--- a/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/world/WorldCoreImpl.java
+++ b/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/world/WorldCoreImpl.java
@@ -1,10 +1,13 @@
package com.songoda.core.nms.v1_10_R1.world;
-import com.songoda.core.nms.v1_10_R1.world.spawner.SSpawnerImpl;
+import com.songoda.core.nms.world.SItemStack;
import com.songoda.core.nms.world.SSpawner;
+import com.songoda.core.nms.world.SWorld;
import com.songoda.core.nms.world.WorldCore;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.block.CreatureSpawner;
+import org.bukkit.inventory.ItemStack;
public class WorldCoreImpl implements WorldCore {
@@ -17,4 +20,14 @@ public class WorldCoreImpl implements WorldCore {
public SSpawner getSpawner(Location location) {
return new SSpawnerImpl(location);
}
+
+ @Override
+ public SItemStack getItemStack(ItemStack item) {
+ return new SItemStackImpl(item);
+ }
+
+ @Override
+ public SWorld getWorld(World world) {
+ return new SWorldImpl();
+ }
}
diff --git a/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/world/SItemStackImpl.java b/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/world/SItemStackImpl.java
new file mode 100644
index 00000000..2c88aa51
--- /dev/null
+++ b/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/world/SItemStackImpl.java
@@ -0,0 +1,36 @@
+package com.songoda.core.nms.v1_11_R1.world;
+
+import com.songoda.core.nms.world.SItemStack;
+import net.minecraft.server.v1_11_R1.EntityPlayer;
+import net.minecraft.server.v1_11_R1.EnumParticle;
+import net.minecraft.server.v1_11_R1.Item;
+import net.minecraft.server.v1_11_R1.Vec3D;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftItemStack;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+public class SItemStackImpl implements SItemStack {
+
+ private final ItemStack item;
+
+ public SItemStackImpl(ItemStack item) {
+ this.item = item;
+ }
+
+ @Override
+ public void breakItem(Player player, int amount) {
+ EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
+ for (int i = 0; i < 5; ++i) {
+ Vec3D vec3d = new Vec3D(((double) random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D);
+ vec3d = vec3d.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d = vec3d.b(-entityPlayer.yaw * 0.017453292F);
+ double d0 = (double) (-random.nextFloat()) * 0.6D - 0.3D;
+ Vec3D vec3d1 = new Vec3D(((double) random.nextFloat() - 0.5D) * 0.3D, d0, 0.6D);
+ vec3d1 = vec3d1.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d1 = vec3d1.b(-entityPlayer.yaw * 0.017453292F);
+ vec3d1 = vec3d1.add(entityPlayer.locX, entityPlayer.locY + (double) entityPlayer.getHeadHeight(), entityPlayer.locZ);
+ entityPlayer.world.addParticle(EnumParticle.ITEM_CRACK, vec3d1.x, vec3d1.y, vec3d1.z, vec3d.x, vec3d.y + 0.05D, vec3d.z, new int[]{Item.getId(CraftItemStack.asNMSCopy(item).getItem())});
+ }
+ }
+}
diff --git a/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/world/spawner/SSpawnerImpl.java b/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/world/SSpawnerImpl.java
similarity index 98%
rename from NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/world/spawner/SSpawnerImpl.java
rename to NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/world/SSpawnerImpl.java
index 20daa528..7a376547 100644
--- a/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/world/spawner/SSpawnerImpl.java
+++ b/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/world/SSpawnerImpl.java
@@ -1,4 +1,4 @@
-package com.songoda.core.nms.v1_11_R1.world.spawner;
+package com.songoda.core.nms.v1_11_R1.world;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.CompatibleParticleHandler;
diff --git a/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/world/SWorldImpl.java b/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/world/SWorldImpl.java
new file mode 100644
index 00000000..8a9972f5
--- /dev/null
+++ b/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/world/SWorldImpl.java
@@ -0,0 +1,18 @@
+package com.songoda.core.nms.v1_11_R1.world;
+
+import com.songoda.core.nms.world.SWorld;
+import org.bukkit.entity.LivingEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SWorldImpl implements SWorld {
+
+ public SWorldImpl() {
+ }
+
+ @Override
+ public List getLivingEntities() {
+ return new ArrayList<>();
+ }
+}
diff --git a/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/world/WorldCoreImpl.java
index 864b3bf9..191ba2fa 100644
--- a/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/world/WorldCoreImpl.java
+++ b/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/world/WorldCoreImpl.java
@@ -1,10 +1,13 @@
package com.songoda.core.nms.v1_11_R1.world;
-import com.songoda.core.nms.v1_11_R1.world.spawner.SSpawnerImpl;
+import com.songoda.core.nms.world.SItemStack;
import com.songoda.core.nms.world.SSpawner;
+import com.songoda.core.nms.world.SWorld;
import com.songoda.core.nms.world.WorldCore;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.block.CreatureSpawner;
+import org.bukkit.inventory.ItemStack;
public class WorldCoreImpl implements WorldCore {
@@ -17,4 +20,14 @@ public class WorldCoreImpl implements WorldCore {
public SSpawner getSpawner(Location location) {
return new SSpawnerImpl(location);
}
+
+ @Override
+ public SItemStack getItemStack(ItemStack item) {
+ return new SItemStackImpl(item);
+ }
+
+ @Override
+ public SWorld getWorld(World world) {
+ return new SWorldImpl();
+ }
}
diff --git a/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/world/SItemStackImpl.java b/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/world/SItemStackImpl.java
new file mode 100644
index 00000000..f5f9d382
--- /dev/null
+++ b/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/world/SItemStackImpl.java
@@ -0,0 +1,36 @@
+package com.songoda.core.nms.v1_12_R1.world;
+
+import com.songoda.core.nms.world.SItemStack;
+import net.minecraft.server.v1_12_R1.EntityPlayer;
+import net.minecraft.server.v1_12_R1.EnumParticle;
+import net.minecraft.server.v1_12_R1.Item;
+import net.minecraft.server.v1_12_R1.Vec3D;
+import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_12_R1.inventory.CraftItemStack;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+public class SItemStackImpl implements SItemStack {
+
+ private final ItemStack item;
+
+ public SItemStackImpl(ItemStack item) {
+ this.item = item;
+ }
+
+ @Override
+ public void breakItem(Player player, int amount) {
+ EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
+ for (int i = 0; i < 5; ++i) {
+ Vec3D vec3d = new Vec3D(((double) random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D);
+ vec3d = vec3d.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d = vec3d.b(-entityPlayer.yaw * 0.017453292F);
+ double d0 = (double) (-random.nextFloat()) * 0.6D - 0.3D;
+ Vec3D vec3d1 = new Vec3D(((double) random.nextFloat() - 0.5D) * 0.3D, d0, 0.6D);
+ vec3d1 = vec3d1.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d1 = vec3d1.b(-entityPlayer.yaw * 0.017453292F);
+ vec3d1 = vec3d1.add(entityPlayer.locX, entityPlayer.locY + (double) entityPlayer.getHeadHeight(), entityPlayer.locZ);
+ entityPlayer.world.addParticle(EnumParticle.ITEM_CRACK, vec3d1.x, vec3d1.y, vec3d1.z, vec3d.x, vec3d.y + 0.05D, vec3d.z, new int[]{Item.getId(CraftItemStack.asNMSCopy(item).getItem())});
+ }
+ }
+}
diff --git a/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/world/spawner/SSpawnerImpl.java b/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/world/SSpawnerImpl.java
similarity index 98%
rename from NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/world/spawner/SSpawnerImpl.java
rename to NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/world/SSpawnerImpl.java
index 2715f5a7..097655a2 100644
--- a/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/world/spawner/SSpawnerImpl.java
+++ b/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/world/SSpawnerImpl.java
@@ -1,4 +1,4 @@
-package com.songoda.core.nms.v1_12_R1.world.spawner;
+package com.songoda.core.nms.v1_12_R1.world;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.CompatibleParticleHandler;
diff --git a/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/world/SWorldImpl.java b/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/world/SWorldImpl.java
new file mode 100644
index 00000000..bd345094
--- /dev/null
+++ b/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/world/SWorldImpl.java
@@ -0,0 +1,18 @@
+package com.songoda.core.nms.v1_12_R1.world;
+
+import com.songoda.core.nms.world.SWorld;
+import org.bukkit.entity.LivingEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SWorldImpl implements SWorld {
+
+ public SWorldImpl() {
+ }
+
+ @Override
+ public List getLivingEntities() {
+ return new ArrayList<>();
+ }
+}
diff --git a/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/world/WorldCoreImpl.java
index f99b4980..aeb21a05 100644
--- a/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/world/WorldCoreImpl.java
+++ b/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/world/WorldCoreImpl.java
@@ -1,10 +1,13 @@
package com.songoda.core.nms.v1_12_R1.world;
-import com.songoda.core.nms.v1_12_R1.world.spawner.SSpawnerImpl;
+import com.songoda.core.nms.world.SItemStack;
import com.songoda.core.nms.world.SSpawner;
+import com.songoda.core.nms.world.SWorld;
import com.songoda.core.nms.world.WorldCore;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.block.CreatureSpawner;
+import org.bukkit.inventory.ItemStack;
public class WorldCoreImpl implements WorldCore {
@@ -17,4 +20,14 @@ public class WorldCoreImpl implements WorldCore {
public SSpawner getSpawner(Location location) {
return new SSpawnerImpl(location);
}
+
+ @Override
+ public SItemStack getItemStack(ItemStack item) {
+ return new SItemStackImpl(item);
+ }
+
+ @Override
+ public SWorld getWorld(World world) {
+ return new SWorldImpl();
+ }
}
diff --git a/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/world/SItemStackImpl.java b/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/world/SItemStackImpl.java
new file mode 100644
index 00000000..d5e78191
--- /dev/null
+++ b/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/world/SItemStackImpl.java
@@ -0,0 +1,36 @@
+package com.songoda.core.nms.v1_13_R1.world;
+
+import com.songoda.core.nms.world.SItemStack;
+import net.minecraft.server.v1_13_R1.EntityPlayer;
+import net.minecraft.server.v1_13_R1.ParticleParamItem;
+import net.minecraft.server.v1_13_R1.Particles;
+import net.minecraft.server.v1_13_R1.Vec3D;
+import org.bukkit.craftbukkit.v1_13_R1.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_13_R1.inventory.CraftItemStack;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+public class SItemStackImpl implements SItemStack {
+
+ private final ItemStack item;
+
+ public SItemStackImpl(ItemStack item) {
+ this.item = item;
+ }
+
+ @Override
+ public void breakItem(Player player, int amount) {
+ EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
+ for (int i = 0; i < amount; ++i) {
+ Vec3D vec3d = new Vec3D(((double) this.random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D);
+ vec3d = vec3d.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d = vec3d.b(-entityPlayer.yaw * 0.017453292F);
+ double d0 = (double) (-this.random.nextFloat()) * 0.6D - 0.3D;
+ Vec3D vec3d1 = new Vec3D(((double) this.random.nextFloat() - 0.5D) * 0.3D, d0, 0.6D);
+ vec3d1 = vec3d1.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d1 = vec3d1.b(-entityPlayer.yaw * 0.017453292F);
+ vec3d1 = vec3d1.add(entityPlayer.locX, entityPlayer.locY + (double)entityPlayer.getHeadHeight(), entityPlayer.locZ);
+ entityPlayer.world.addParticle(new ParticleParamItem(Particles.C, CraftItemStack.asNMSCopy(item)), vec3d1.x, vec3d1.y, vec3d1.z, vec3d.x, vec3d.y + 0.05D, vec3d.z);
+ }
+ }
+}
diff --git a/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/world/spawner/SSpawnerImpl.java b/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/world/SSpawnerImpl.java
similarity index 98%
rename from NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/world/spawner/SSpawnerImpl.java
rename to NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/world/SSpawnerImpl.java
index bbc44242..1f8c96c4 100644
--- a/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/world/spawner/SSpawnerImpl.java
+++ b/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/world/SSpawnerImpl.java
@@ -1,4 +1,4 @@
-package com.songoda.core.nms.v1_13_R1.world.spawner;
+package com.songoda.core.nms.v1_13_R1.world;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.CompatibleParticleHandler;
diff --git a/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/world/SWorldImpl.java b/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/world/SWorldImpl.java
new file mode 100644
index 00000000..1c2fc6e4
--- /dev/null
+++ b/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/world/SWorldImpl.java
@@ -0,0 +1,18 @@
+package com.songoda.core.nms.v1_13_R1.world;
+
+import com.songoda.core.nms.world.SWorld;
+import org.bukkit.entity.LivingEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SWorldImpl implements SWorld {
+
+ public SWorldImpl() {
+ }
+
+ @Override
+ public List getLivingEntities() {
+ return new ArrayList<>();
+ }
+}
diff --git a/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/world/WorldCoreImpl.java
index b6afb7c5..7e152faa 100644
--- a/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/world/WorldCoreImpl.java
+++ b/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/world/WorldCoreImpl.java
@@ -1,10 +1,13 @@
package com.songoda.core.nms.v1_13_R1.world;
-import com.songoda.core.nms.v1_13_R1.world.spawner.SSpawnerImpl;
+import com.songoda.core.nms.world.SItemStack;
import com.songoda.core.nms.world.SSpawner;
+import com.songoda.core.nms.world.SWorld;
import com.songoda.core.nms.world.WorldCore;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.block.CreatureSpawner;
+import org.bukkit.inventory.ItemStack;
public class WorldCoreImpl implements WorldCore {
@@ -17,4 +20,14 @@ public class WorldCoreImpl implements WorldCore {
public SSpawner getSpawner(Location location) {
return new SSpawnerImpl(location);
}
+
+ @Override
+ public SItemStack getItemStack(ItemStack item) {
+ return new SItemStackImpl(item);
+ }
+
+ @Override
+ public SWorld getWorld(World world) {
+ return new SWorldImpl();
+ }
}
diff --git a/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/world/SItemStackImpl.java b/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/world/SItemStackImpl.java
new file mode 100644
index 00000000..87fe726a
--- /dev/null
+++ b/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/world/SItemStackImpl.java
@@ -0,0 +1,36 @@
+package com.songoda.core.nms.v1_13_R2.world;
+
+import com.songoda.core.nms.world.SItemStack;
+import net.minecraft.server.v1_13_R2.EntityPlayer;
+import net.minecraft.server.v1_13_R2.ParticleParamItem;
+import net.minecraft.server.v1_13_R2.Particles;
+import net.minecraft.server.v1_13_R2.Vec3D;
+import org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_13_R2.inventory.CraftItemStack;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+public class SItemStackImpl implements SItemStack {
+
+ private final ItemStack item;
+
+ public SItemStackImpl(ItemStack item) {
+ this.item = item;
+ }
+
+ @Override
+ public void breakItem(Player player, int amount) {
+ EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
+ for (int i = 0; i < amount; ++i) {
+ Vec3D vec3d = new Vec3D(((double) this.random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D);
+ vec3d = vec3d.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d = vec3d.b(-entityPlayer.yaw * 0.017453292F);
+ double d0 = (double) (-this.random.nextFloat()) * 0.6D - 0.3D;
+ Vec3D vec3d1 = new Vec3D(((double) this.random.nextFloat() - 0.5D) * 0.3D, d0, 0.6D);
+ vec3d1 = vec3d1.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d1 = vec3d1.b(-entityPlayer.yaw * 0.017453292F);
+ vec3d1 = vec3d1.add(entityPlayer.locX, entityPlayer.locY + (double)entityPlayer.getHeadHeight(), entityPlayer.locZ);
+ entityPlayer.world.addParticle(new ParticleParamItem(Particles.C, CraftItemStack.asNMSCopy(item)), vec3d1.x, vec3d1.y, vec3d1.z, vec3d.x, vec3d.y + 0.05D, vec3d.z);
+ }
+ }
+}
diff --git a/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/world/spawner/SSpawnerImpl.java b/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/world/SSpawnerImpl.java
similarity index 98%
rename from NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/world/spawner/SSpawnerImpl.java
rename to NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/world/SSpawnerImpl.java
index 89d35f8c..bf172a9f 100644
--- a/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/world/spawner/SSpawnerImpl.java
+++ b/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/world/SSpawnerImpl.java
@@ -1,4 +1,4 @@
-package com.songoda.core.nms.v1_13_R2.world.spawner;
+package com.songoda.core.nms.v1_13_R2.world;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.CompatibleParticleHandler;
diff --git a/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/world/SWorldImpl.java b/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/world/SWorldImpl.java
new file mode 100644
index 00000000..7ee970f1
--- /dev/null
+++ b/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/world/SWorldImpl.java
@@ -0,0 +1,18 @@
+package com.songoda.core.nms.v1_13_R2.world;
+
+import com.songoda.core.nms.world.SWorld;
+import org.bukkit.entity.LivingEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SWorldImpl implements SWorld {
+
+ public SWorldImpl() {
+ }
+
+ @Override
+ public List getLivingEntities() {
+ return new ArrayList<>();
+ }
+}
diff --git a/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/world/WorldCoreImpl.java b/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/world/WorldCoreImpl.java
index d1fc902a..de90a615 100644
--- a/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/world/WorldCoreImpl.java
+++ b/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/world/WorldCoreImpl.java
@@ -1,10 +1,13 @@
package com.songoda.core.nms.v1_13_R2.world;
-import com.songoda.core.nms.v1_13_R2.world.spawner.SSpawnerImpl;
+import com.songoda.core.nms.world.SItemStack;
import com.songoda.core.nms.world.SSpawner;
+import com.songoda.core.nms.world.SWorld;
import com.songoda.core.nms.world.WorldCore;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.block.CreatureSpawner;
+import org.bukkit.inventory.ItemStack;
public class WorldCoreImpl implements WorldCore {
@@ -17,4 +20,14 @@ public class WorldCoreImpl implements WorldCore {
public SSpawner getSpawner(Location location) {
return new SSpawnerImpl(location);
}
+
+ @Override
+ public SItemStack getItemStack(ItemStack item) {
+ return new SItemStackImpl(item);
+ }
+
+ @Override
+ public SWorld getWorld(World world) {
+ return new SWorldImpl();
+ }
}
diff --git a/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/world/SItemStackImpl.java b/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/world/SItemStackImpl.java
new file mode 100644
index 00000000..0310f3bf
--- /dev/null
+++ b/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/world/SItemStackImpl.java
@@ -0,0 +1,36 @@
+package com.songoda.core.nms.v1_14_R1.world;
+
+import com.songoda.core.nms.world.SItemStack;
+import net.minecraft.server.v1_14_R1.EntityPlayer;
+import net.minecraft.server.v1_14_R1.ParticleParamItem;
+import net.minecraft.server.v1_14_R1.Particles;
+import net.minecraft.server.v1_14_R1.Vec3D;
+import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftItemStack;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+public class SItemStackImpl implements SItemStack {
+
+ private final ItemStack item;
+
+ public SItemStackImpl(ItemStack item) {
+ this.item = item;
+ }
+
+ @Override
+ public void breakItem(Player player, int amount) {
+ EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
+ for (int i = 0; i < amount; ++i) {
+ Vec3D vec3d = new Vec3D(((double) this.random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D);
+ vec3d = vec3d.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d = vec3d.b(-entityPlayer.yaw * 0.017453292F);
+ double d0 = (double) (-this.random.nextFloat()) * 0.6D - 0.3D;
+ Vec3D vec3d1 = new Vec3D(((double) this.random.nextFloat() - 0.5D) * 0.3D, d0, 0.6D);
+ vec3d1 = vec3d1.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d1 = vec3d1.b(-entityPlayer.yaw * 0.017453292F);
+ vec3d1 = vec3d1.add(entityPlayer.locX, entityPlayer.locY + (double)entityPlayer.getHeadHeight(), entityPlayer.locZ);
+ entityPlayer.world.addParticle(new ParticleParamItem(Particles.ITEM, CraftItemStack.asNMSCopy(item)), vec3d1.x, vec3d1.y, vec3d1.z, vec3d.x, vec3d.y + 0.05D, vec3d.z);
+ }
+ }
+}
diff --git a/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/world/spawner/SSpawnerImpl.java b/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/world/SSpawnerImpl.java
similarity index 98%
rename from NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/world/spawner/SSpawnerImpl.java
rename to NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/world/SSpawnerImpl.java
index 57beec21..e855dfac 100644
--- a/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/world/spawner/SSpawnerImpl.java
+++ b/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/world/SSpawnerImpl.java
@@ -1,4 +1,4 @@
-package com.songoda.core.nms.v1_14_R1.world.spawner;
+package com.songoda.core.nms.v1_14_R1.world;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.CompatibleParticleHandler;
diff --git a/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/world/SWorldImpl.java b/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/world/SWorldImpl.java
new file mode 100644
index 00000000..9bea95d5
--- /dev/null
+++ b/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/world/SWorldImpl.java
@@ -0,0 +1,18 @@
+package com.songoda.core.nms.v1_14_R1.world;
+
+import com.songoda.core.nms.world.SWorld;
+import org.bukkit.entity.LivingEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SWorldImpl implements SWorld {
+
+ public SWorldImpl() {
+ }
+
+ @Override
+ public List getLivingEntities() {
+ return new ArrayList<>();
+ }
+}
diff --git a/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/world/WorldCoreImpl.java
index 569d5830..5650cce8 100644
--- a/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/world/WorldCoreImpl.java
+++ b/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/world/WorldCoreImpl.java
@@ -1,10 +1,13 @@
package com.songoda.core.nms.v1_14_R1.world;
-import com.songoda.core.nms.v1_14_R1.world.spawner.SSpawnerImpl;
+import com.songoda.core.nms.world.SItemStack;
import com.songoda.core.nms.world.SSpawner;
+import com.songoda.core.nms.world.SWorld;
import com.songoda.core.nms.world.WorldCore;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.block.CreatureSpawner;
+import org.bukkit.inventory.ItemStack;
public class WorldCoreImpl implements WorldCore {
@@ -17,4 +20,14 @@ public class WorldCoreImpl implements WorldCore {
public SSpawner getSpawner(Location location) {
return new SSpawnerImpl(location);
}
+
+ @Override
+ public SItemStack getItemStack(ItemStack item) {
+ return new SItemStackImpl(item);
+ }
+
+ @Override
+ public SWorld getWorld(World world) {
+ return new SWorldImpl();
+ }
}
diff --git a/NMS/NMS-v1_15_R1/src/com/songoda/core/nms/v1_15_R1/world/SItemStackImpl.java b/NMS/NMS-v1_15_R1/src/com/songoda/core/nms/v1_15_R1/world/SItemStackImpl.java
new file mode 100644
index 00000000..0bf8d1a3
--- /dev/null
+++ b/NMS/NMS-v1_15_R1/src/com/songoda/core/nms/v1_15_R1/world/SItemStackImpl.java
@@ -0,0 +1,36 @@
+package com.songoda.core.nms.v1_15_R1.world;
+
+import com.songoda.core.nms.world.SItemStack;
+import net.minecraft.server.v1_15_R1.EntityPlayer;
+import net.minecraft.server.v1_15_R1.ParticleParamItem;
+import net.minecraft.server.v1_15_R1.Particles;
+import net.minecraft.server.v1_15_R1.Vec3D;
+import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+public class SItemStackImpl implements SItemStack {
+
+ private final ItemStack item;
+
+ public SItemStackImpl(ItemStack item) {
+ this.item = item;
+ }
+
+ @Override
+ public void breakItem(Player player, int amount) {
+ EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
+ for (int i = 0; i < amount; ++i) {
+ Vec3D vec3d = new Vec3D(((double) this.random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D);
+ vec3d = vec3d.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d = vec3d.b(-entityPlayer.yaw * 0.017453292F);
+ double d0 = (double) (-this.random.nextFloat()) * 0.6D - 0.3D;
+ Vec3D vec3d1 = new Vec3D(((double) this.random.nextFloat() - 0.5D) * 0.3D, d0, 0.6D);
+ vec3d1 = vec3d1.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d1 = vec3d1.b(-entityPlayer.yaw * 0.017453292F);
+ vec3d1 = vec3d1.add(entityPlayer.locX(), entityPlayer.getHeadY(), entityPlayer.locZ());
+ entityPlayer.world.addParticle(new ParticleParamItem(Particles.ITEM, CraftItemStack.asNMSCopy(item)), vec3d1.x, vec3d1.y, vec3d1.z, vec3d.x, vec3d.y + 0.05D, vec3d.z);
+ }
+ }
+}
diff --git a/NMS/NMS-v1_15_R1/src/com/songoda/core/nms/v1_15_R1/world/spawner/SSpawnerImpl.java b/NMS/NMS-v1_15_R1/src/com/songoda/core/nms/v1_15_R1/world/SSpawnerImpl.java
similarity index 98%
rename from NMS/NMS-v1_15_R1/src/com/songoda/core/nms/v1_15_R1/world/spawner/SSpawnerImpl.java
rename to NMS/NMS-v1_15_R1/src/com/songoda/core/nms/v1_15_R1/world/SSpawnerImpl.java
index 0df5f5d0..4e75c59d 100644
--- a/NMS/NMS-v1_15_R1/src/com/songoda/core/nms/v1_15_R1/world/spawner/SSpawnerImpl.java
+++ b/NMS/NMS-v1_15_R1/src/com/songoda/core/nms/v1_15_R1/world/SSpawnerImpl.java
@@ -1,4 +1,4 @@
-package com.songoda.core.nms.v1_15_R1.world.spawner;
+package com.songoda.core.nms.v1_15_R1.world;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.CompatibleParticleHandler;
diff --git a/NMS/NMS-v1_15_R1/src/com/songoda/core/nms/v1_15_R1/world/SWorldImpl.java b/NMS/NMS-v1_15_R1/src/com/songoda/core/nms/v1_15_R1/world/SWorldImpl.java
new file mode 100644
index 00000000..bed8355a
--- /dev/null
+++ b/NMS/NMS-v1_15_R1/src/com/songoda/core/nms/v1_15_R1/world/SWorldImpl.java
@@ -0,0 +1,18 @@
+package com.songoda.core.nms.v1_15_R1.world;
+
+import com.songoda.core.nms.world.SWorld;
+import org.bukkit.entity.LivingEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SWorldImpl implements SWorld {
+
+ public SWorldImpl() {
+ }
+
+ @Override
+ public List getLivingEntities() {
+ return new ArrayList<>();
+ }
+}
diff --git a/NMS/NMS-v1_15_R1/src/com/songoda/core/nms/v1_15_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_15_R1/src/com/songoda/core/nms/v1_15_R1/world/WorldCoreImpl.java
index d5793021..22fd035b 100644
--- a/NMS/NMS-v1_15_R1/src/com/songoda/core/nms/v1_15_R1/world/WorldCoreImpl.java
+++ b/NMS/NMS-v1_15_R1/src/com/songoda/core/nms/v1_15_R1/world/WorldCoreImpl.java
@@ -1,10 +1,13 @@
package com.songoda.core.nms.v1_15_R1.world;
-import com.songoda.core.nms.v1_15_R1.world.spawner.SSpawnerImpl;
+import com.songoda.core.nms.world.SItemStack;
import com.songoda.core.nms.world.SSpawner;
+import com.songoda.core.nms.world.SWorld;
import com.songoda.core.nms.world.WorldCore;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.block.CreatureSpawner;
+import org.bukkit.inventory.ItemStack;
public class WorldCoreImpl implements WorldCore {
@@ -17,4 +20,14 @@ public class WorldCoreImpl implements WorldCore {
public SSpawner getSpawner(Location location) {
return new SSpawnerImpl(location);
}
+
+ @Override
+ public SItemStack getItemStack(ItemStack item) {
+ return new SItemStackImpl(item);
+ }
+
+ @Override
+ public SWorld getWorld(World world) {
+ return new SWorldImpl();
+ }
}
diff --git a/NMS/NMS-v1_16_R1/src/com/songoda/core/nms/v1_16_R1/world/SItemStackImpl.java b/NMS/NMS-v1_16_R1/src/com/songoda/core/nms/v1_16_R1/world/SItemStackImpl.java
new file mode 100644
index 00000000..1945e47d
--- /dev/null
+++ b/NMS/NMS-v1_16_R1/src/com/songoda/core/nms/v1_16_R1/world/SItemStackImpl.java
@@ -0,0 +1,36 @@
+package com.songoda.core.nms.v1_16_R1.world;
+
+import com.songoda.core.nms.world.SItemStack;
+import net.minecraft.server.v1_16_R1.EntityPlayer;
+import net.minecraft.server.v1_16_R1.ParticleParamItem;
+import net.minecraft.server.v1_16_R1.Particles;
+import net.minecraft.server.v1_16_R1.Vec3D;
+import org.bukkit.craftbukkit.v1_16_R1.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftItemStack;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+public class SItemStackImpl implements SItemStack {
+
+ private final ItemStack item;
+
+ public SItemStackImpl(ItemStack item) {
+ this.item = item;
+ }
+
+ @Override
+ public void breakItem(Player player, int amount) {
+ EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
+ for (int i = 0; i < amount; ++i) {
+ Vec3D vec3d = new Vec3D(((double) this.random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D);
+ vec3d = vec3d.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d = vec3d.b(-entityPlayer.yaw * 0.017453292F);
+ double d0 = (double) (-this.random.nextFloat()) * 0.6D - 0.3D;
+ Vec3D vec3d1 = new Vec3D(((double) this.random.nextFloat() - 0.5D) * 0.3D, d0, 0.6D);
+ vec3d1 = vec3d1.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d1 = vec3d1.b(-entityPlayer.yaw * 0.017453292F);
+ vec3d1 = vec3d1.add(entityPlayer.locX(), entityPlayer.getHeadY(), entityPlayer.locZ());
+ entityPlayer.world.addParticle(new ParticleParamItem(Particles.ITEM, CraftItemStack.asNMSCopy(item)), vec3d1.x, vec3d1.y, vec3d1.z, vec3d.x, vec3d.y + 0.05D, vec3d.z);
+ }
+ }
+}
diff --git a/NMS/NMS-v1_16_R1/src/com/songoda/core/nms/v1_16_R1/world/spawner/SSpawnerImpl.java b/NMS/NMS-v1_16_R1/src/com/songoda/core/nms/v1_16_R1/world/SSpawnerImpl.java
similarity index 98%
rename from NMS/NMS-v1_16_R1/src/com/songoda/core/nms/v1_16_R1/world/spawner/SSpawnerImpl.java
rename to NMS/NMS-v1_16_R1/src/com/songoda/core/nms/v1_16_R1/world/SSpawnerImpl.java
index 334c5f4a..e582b3f3 100644
--- a/NMS/NMS-v1_16_R1/src/com/songoda/core/nms/v1_16_R1/world/spawner/SSpawnerImpl.java
+++ b/NMS/NMS-v1_16_R1/src/com/songoda/core/nms/v1_16_R1/world/SSpawnerImpl.java
@@ -1,4 +1,4 @@
-package com.songoda.core.nms.v1_16_R1.world.spawner;
+package com.songoda.core.nms.v1_16_R1.world;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.CompatibleParticleHandler;
diff --git a/NMS/NMS-v1_16_R1/src/com/songoda/core/nms/v1_16_R1/world/SWorldImpl.java b/NMS/NMS-v1_16_R1/src/com/songoda/core/nms/v1_16_R1/world/SWorldImpl.java
new file mode 100644
index 00000000..de5f8e38
--- /dev/null
+++ b/NMS/NMS-v1_16_R1/src/com/songoda/core/nms/v1_16_R1/world/SWorldImpl.java
@@ -0,0 +1,18 @@
+package com.songoda.core.nms.v1_16_R1.world;
+
+import com.songoda.core.nms.world.SWorld;
+import org.bukkit.entity.LivingEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SWorldImpl implements SWorld {
+
+ public SWorldImpl() {
+ }
+
+ @Override
+ public List getLivingEntities() {
+ return new ArrayList<>();
+ }
+}
diff --git a/NMS/NMS-v1_16_R1/src/com/songoda/core/nms/v1_16_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_16_R1/src/com/songoda/core/nms/v1_16_R1/world/WorldCoreImpl.java
index 4925a95b..7167300d 100644
--- a/NMS/NMS-v1_16_R1/src/com/songoda/core/nms/v1_16_R1/world/WorldCoreImpl.java
+++ b/NMS/NMS-v1_16_R1/src/com/songoda/core/nms/v1_16_R1/world/WorldCoreImpl.java
@@ -1,10 +1,13 @@
package com.songoda.core.nms.v1_16_R1.world;
-import com.songoda.core.nms.v1_16_R1.world.spawner.SSpawnerImpl;
+import com.songoda.core.nms.world.SItemStack;
import com.songoda.core.nms.world.SSpawner;
+import com.songoda.core.nms.world.SWorld;
import com.songoda.core.nms.world.WorldCore;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.block.CreatureSpawner;
+import org.bukkit.inventory.ItemStack;
public class WorldCoreImpl implements WorldCore {
@@ -17,4 +20,14 @@ public class WorldCoreImpl implements WorldCore {
public SSpawner getSpawner(Location location) {
return new SSpawnerImpl(location);
}
+
+ @Override
+ public SItemStack getItemStack(ItemStack item) {
+ return new SItemStackImpl(item);
+ }
+
+ @Override
+ public SWorld getWorld(World world) {
+ return new SWorldImpl();
+ }
}
diff --git a/NMS/NMS-v1_16_R2/src/com/songoda/core/nms/v1_16_R2/world/SItemStackImpl.java b/NMS/NMS-v1_16_R2/src/com/songoda/core/nms/v1_16_R2/world/SItemStackImpl.java
new file mode 100644
index 00000000..8203000d
--- /dev/null
+++ b/NMS/NMS-v1_16_R2/src/com/songoda/core/nms/v1_16_R2/world/SItemStackImpl.java
@@ -0,0 +1,36 @@
+package com.songoda.core.nms.v1_16_R2.world;
+
+import com.songoda.core.nms.world.SItemStack;
+import net.minecraft.server.v1_16_R2.EntityPlayer;
+import net.minecraft.server.v1_16_R2.ParticleParamItem;
+import net.minecraft.server.v1_16_R2.Particles;
+import net.minecraft.server.v1_16_R2.Vec3D;
+import org.bukkit.craftbukkit.v1_16_R2.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+public class SItemStackImpl implements SItemStack {
+
+ private final ItemStack item;
+
+ public SItemStackImpl(ItemStack item) {
+ this.item = item;
+ }
+
+ @Override
+ public void breakItem(Player player, int amount) {
+ EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
+ for (int i = 0; i < amount; ++i) {
+ Vec3D vec3d = new Vec3D(((double) this.random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D);
+ vec3d = vec3d.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d = vec3d.b(-entityPlayer.yaw * 0.017453292F);
+ double d0 = (double) (-this.random.nextFloat()) * 0.6D - 0.3D;
+ Vec3D vec3d1 = new Vec3D(((double) this.random.nextFloat() - 0.5D) * 0.3D, d0, 0.6D);
+ vec3d1 = vec3d1.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d1 = vec3d1.b(-entityPlayer.yaw * 0.017453292F);
+ vec3d1 = vec3d1.add(entityPlayer.locX(), entityPlayer.getHeadY(), entityPlayer.locZ());
+ entityPlayer.world.addParticle(new ParticleParamItem(Particles.ITEM, CraftItemStack.asNMSCopy(item)), vec3d1.x, vec3d1.y, vec3d1.z, vec3d.x, vec3d.y + 0.05D, vec3d.z);
+ }
+ }
+}
diff --git a/NMS/NMS-v1_16_R2/src/com/songoda/core/nms/v1_16_R2/world/spawner/SSpawnerImpl.java b/NMS/NMS-v1_16_R2/src/com/songoda/core/nms/v1_16_R2/world/SSpawnerImpl.java
similarity index 98%
rename from NMS/NMS-v1_16_R2/src/com/songoda/core/nms/v1_16_R2/world/spawner/SSpawnerImpl.java
rename to NMS/NMS-v1_16_R2/src/com/songoda/core/nms/v1_16_R2/world/SSpawnerImpl.java
index abcb776e..c2444570 100644
--- a/NMS/NMS-v1_16_R2/src/com/songoda/core/nms/v1_16_R2/world/spawner/SSpawnerImpl.java
+++ b/NMS/NMS-v1_16_R2/src/com/songoda/core/nms/v1_16_R2/world/SSpawnerImpl.java
@@ -1,4 +1,4 @@
-package com.songoda.core.nms.v1_16_R2.world.spawner;
+package com.songoda.core.nms.v1_16_R2.world;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.CompatibleParticleHandler;
diff --git a/NMS/NMS-v1_16_R2/src/com/songoda/core/nms/v1_16_R2/world/SWorldImpl.java b/NMS/NMS-v1_16_R2/src/com/songoda/core/nms/v1_16_R2/world/SWorldImpl.java
new file mode 100644
index 00000000..defd7dc0
--- /dev/null
+++ b/NMS/NMS-v1_16_R2/src/com/songoda/core/nms/v1_16_R2/world/SWorldImpl.java
@@ -0,0 +1,18 @@
+package com.songoda.core.nms.v1_16_R2.world;
+
+import com.songoda.core.nms.world.SWorld;
+import org.bukkit.entity.LivingEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SWorldImpl implements SWorld {
+
+ public SWorldImpl() {
+ }
+
+ @Override
+ public List getLivingEntities() {
+ return new ArrayList<>();
+ }
+}
diff --git a/NMS/NMS-v1_16_R2/src/com/songoda/core/nms/v1_16_R2/world/WorldCoreImpl.java b/NMS/NMS-v1_16_R2/src/com/songoda/core/nms/v1_16_R2/world/WorldCoreImpl.java
index b2f2b08d..17e0a0ad 100644
--- a/NMS/NMS-v1_16_R2/src/com/songoda/core/nms/v1_16_R2/world/WorldCoreImpl.java
+++ b/NMS/NMS-v1_16_R2/src/com/songoda/core/nms/v1_16_R2/world/WorldCoreImpl.java
@@ -1,10 +1,13 @@
package com.songoda.core.nms.v1_16_R2.world;
-import com.songoda.core.nms.v1_16_R2.world.spawner.SSpawnerImpl;
+import com.songoda.core.nms.world.SItemStack;
import com.songoda.core.nms.world.SSpawner;
+import com.songoda.core.nms.world.SWorld;
import com.songoda.core.nms.world.WorldCore;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.block.CreatureSpawner;
+import org.bukkit.inventory.ItemStack;
public class WorldCoreImpl implements WorldCore {
@@ -17,4 +20,14 @@ public class WorldCoreImpl implements WorldCore {
public SSpawner getSpawner(Location location) {
return new SSpawnerImpl(location);
}
+
+ @Override
+ public SItemStack getItemStack(ItemStack item) {
+ return new SItemStackImpl(item);
+ }
+
+ @Override
+ public SWorld getWorld(World world) {
+ return new SWorldImpl();
+ }
}
diff --git a/NMS/NMS-v1_16_R3/src/com/songoda/core/nms/v1_16_R3/world/SItemStackImpl.java b/NMS/NMS-v1_16_R3/src/com/songoda/core/nms/v1_16_R3/world/SItemStackImpl.java
new file mode 100644
index 00000000..0ce0dfb6
--- /dev/null
+++ b/NMS/NMS-v1_16_R3/src/com/songoda/core/nms/v1_16_R3/world/SItemStackImpl.java
@@ -0,0 +1,36 @@
+package com.songoda.core.nms.v1_16_R3.world;
+
+import com.songoda.core.nms.world.SItemStack;
+import net.minecraft.server.v1_16_R3.EntityPlayer;
+import net.minecraft.server.v1_16_R3.ParticleParamItem;
+import net.minecraft.server.v1_16_R3.Particles;
+import net.minecraft.server.v1_16_R3.Vec3D;
+import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+public class SItemStackImpl implements SItemStack {
+
+ private final ItemStack item;
+
+ public SItemStackImpl(ItemStack item) {
+ this.item = item;
+ }
+
+ @Override
+ public void breakItem(Player player, int amount) {
+ EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
+ for (int i = 0; i < amount; ++i) {
+ Vec3D vec3d = new Vec3D(((double) this.random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D);
+ vec3d = vec3d.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d = vec3d.b(-entityPlayer.yaw * 0.017453292F);
+ double d0 = (double) (-this.random.nextFloat()) * 0.6D - 0.3D;
+ Vec3D vec3d1 = new Vec3D(((double) this.random.nextFloat() - 0.5D) * 0.3D, d0, 0.6D);
+ vec3d1 = vec3d1.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d1 = vec3d1.b(-entityPlayer.yaw * 0.017453292F);
+ vec3d1 = vec3d1.add(entityPlayer.locX(), entityPlayer.getHeadY(), entityPlayer.locZ());
+ entityPlayer.world.addParticle(new ParticleParamItem(Particles.ITEM, CraftItemStack.asNMSCopy(item)), vec3d1.x, vec3d1.y, vec3d1.z, vec3d.x, vec3d.y + 0.05D, vec3d.z);
+ }
+ }
+}
diff --git a/NMS/NMS-v1_16_R3/src/com/songoda/core/nms/v1_16_R3/world/spawner/SSpawnerImpl.java b/NMS/NMS-v1_16_R3/src/com/songoda/core/nms/v1_16_R3/world/SSpawnerImpl.java
similarity index 98%
rename from NMS/NMS-v1_16_R3/src/com/songoda/core/nms/v1_16_R3/world/spawner/SSpawnerImpl.java
rename to NMS/NMS-v1_16_R3/src/com/songoda/core/nms/v1_16_R3/world/SSpawnerImpl.java
index 5ee74079..658bb3f7 100644
--- a/NMS/NMS-v1_16_R3/src/com/songoda/core/nms/v1_16_R3/world/spawner/SSpawnerImpl.java
+++ b/NMS/NMS-v1_16_R3/src/com/songoda/core/nms/v1_16_R3/world/SSpawnerImpl.java
@@ -1,4 +1,4 @@
-package com.songoda.core.nms.v1_16_R3.world.spawner;
+package com.songoda.core.nms.v1_16_R3.world;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.CompatibleParticleHandler;
diff --git a/NMS/NMS-v1_16_R3/src/com/songoda/core/nms/v1_16_R3/world/SWorldImpl.java b/NMS/NMS-v1_16_R3/src/com/songoda/core/nms/v1_16_R3/world/SWorldImpl.java
new file mode 100644
index 00000000..59e6bfb1
--- /dev/null
+++ b/NMS/NMS-v1_16_R3/src/com/songoda/core/nms/v1_16_R3/world/SWorldImpl.java
@@ -0,0 +1,18 @@
+package com.songoda.core.nms.v1_16_R3.world;
+
+import com.songoda.core.nms.world.SWorld;
+import org.bukkit.entity.LivingEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SWorldImpl implements SWorld {
+
+ public SWorldImpl() {
+ }
+
+ @Override
+ public List getLivingEntities() {
+ return new ArrayList<>();
+ }
+}
diff --git a/NMS/NMS-v1_16_R3/src/com/songoda/core/nms/v1_16_R3/world/WorldCoreImpl.java b/NMS/NMS-v1_16_R3/src/com/songoda/core/nms/v1_16_R3/world/WorldCoreImpl.java
index f84a2b0b..80fec184 100644
--- a/NMS/NMS-v1_16_R3/src/com/songoda/core/nms/v1_16_R3/world/WorldCoreImpl.java
+++ b/NMS/NMS-v1_16_R3/src/com/songoda/core/nms/v1_16_R3/world/WorldCoreImpl.java
@@ -1,10 +1,13 @@
package com.songoda.core.nms.v1_16_R3.world;
-import com.songoda.core.nms.v1_16_R3.world.spawner.SSpawnerImpl;
+import com.songoda.core.nms.world.SItemStack;
import com.songoda.core.nms.world.SSpawner;
+import com.songoda.core.nms.world.SWorld;
import com.songoda.core.nms.world.WorldCore;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.block.CreatureSpawner;
+import org.bukkit.inventory.ItemStack;
public class WorldCoreImpl implements WorldCore {
@@ -17,4 +20,14 @@ public class WorldCoreImpl implements WorldCore {
public SSpawner getSpawner(Location location) {
return new SSpawnerImpl(location);
}
+
+ @Override
+ public SItemStack getItemStack(ItemStack item) {
+ return new SItemStackImpl(item);
+ }
+
+ @Override
+ public SWorld getWorld(World world) {
+ return new SWorldImpl();
+ }
}
diff --git a/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/anvil/AnvilCore.java b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/anvil/AnvilCore.java
new file mode 100644
index 00000000..1456d7af
--- /dev/null
+++ b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/anvil/AnvilCore.java
@@ -0,0 +1,23 @@
+package com.songoda.core.nms.v1_17_R1.anvil;
+
+import com.songoda.core.nms.anvil.CustomAnvil;
+import net.minecraft.server.level.EntityPlayer;
+import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.InventoryHolder;
+
+public class AnvilCore implements com.songoda.core.nms.anvil.AnvilCore {
+
+ @Override
+ public CustomAnvil createAnvil(Player player) {
+ EntityPlayer p = ((CraftPlayer) player).getHandle();
+ return new AnvilView(p.nextContainerCounter(), p, null);
+ }
+
+ @Override
+ public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
+ EntityPlayer p = ((CraftPlayer) player).getHandle();
+ return new AnvilView(p.nextContainerCounter(), p, holder);
+ }
+
+}
diff --git a/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/anvil/AnvilInventoryCustom.java b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/anvil/AnvilInventoryCustom.java
new file mode 100644
index 00000000..1ffabde7
--- /dev/null
+++ b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/anvil/AnvilInventoryCustom.java
@@ -0,0 +1,22 @@
+package com.songoda.core.nms.v1_17_R1.anvil;
+
+import net.minecraft.world.IInventory;
+import net.minecraft.world.inventory.ContainerAnvil;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryAnvil;
+import org.bukkit.inventory.InventoryHolder;
+
+public class AnvilInventoryCustom extends CraftInventoryAnvil {
+
+ final InventoryHolder holder;
+
+ public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory, ContainerAnvil container) {
+ super(location, inventory, resultInventory, container);
+ this.holder = holder;
+ }
+
+ @Override
+ public InventoryHolder getHolder() {
+ return holder;
+ }
+}
diff --git a/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/anvil/AnvilView.java b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/anvil/AnvilView.java
new file mode 100644
index 00000000..97137e3d
--- /dev/null
+++ b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/anvil/AnvilView.java
@@ -0,0 +1,209 @@
+package com.songoda.core.nms.v1_17_R1.anvil;
+
+import com.songoda.core.nms.anvil.CustomAnvil;
+import com.songoda.core.nms.anvil.methods.AnvilTextChange;
+import jdk.internal.misc.Unsafe;
+import net.minecraft.core.BlockPosition;
+import net.minecraft.network.chat.ChatMessage;
+import net.minecraft.network.protocol.game.PacketPlayOutOpenWindow;
+import net.minecraft.server.level.EntityPlayer;
+import net.minecraft.world.IInventory;
+import net.minecraft.world.entity.player.EntityHuman;
+import net.minecraft.world.inventory.Container;
+import net.minecraft.world.inventory.ContainerAccess;
+import net.minecraft.world.inventory.ContainerAnvil;
+import net.minecraft.world.inventory.ContainerAnvilAbstract;
+import net.minecraft.world.inventory.Containers;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryView;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.InventoryHolder;
+import org.bukkit.inventory.ItemStack;
+
+import java.lang.reflect.Field;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class AnvilView extends ContainerAnvil implements CustomAnvil {
+
+ private final EntityPlayer entity;
+ private final Inventory inventory;
+ private String customTitle = "Repairing";
+ private int cost = -1;
+ private boolean canUse = true;
+ private AnvilTextChange textChange = null;
+
+ // used for setting custom inventory
+ static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result
+ static Field mc_ContainerAnvil_resultInventory; // full inventory
+ static Field mc_ContainerAnvil_bukkitEntity;
+
+ static {
+ try {
+ mc_ContainerAnvil_repairInventory = ContainerAnvilAbstract.class.getDeclaredField("p");
+ mc_ContainerAnvil_repairInventory.setAccessible(true);
+ mc_ContainerAnvil_resultInventory = ContainerAnvilAbstract.class.getDeclaredField("o");
+ mc_ContainerAnvil_resultInventory.setAccessible(true);
+ mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
+ mc_ContainerAnvil_bukkitEntity.setAccessible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
+ }
+ }
+
+ // 1.14 also introduced a title field, also private, which can only be set once and can't be checked
+ static Field mc_Container_title;
+
+ static {
+ try {
+ mc_Container_title = Container.class.getDeclaredField("title");
+ mc_Container_title.setAccessible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
+ }
+ }
+
+ public AnvilView(int id, EntityPlayer entity, InventoryHolder holder) {
+ super(entity.nextContainerCounter(), entity.getInventory(), ContainerAccess.at(entity.getWorld(), new BlockPosition(0, 0, 0)));
+ this.setTitle(new ChatMessage(customTitle != null ? customTitle : ""));
+ this.checkReachable = false;
+ this.entity = entity;
+ if (holder != null) {
+ this.inventory = getBukkitView(entity, holder).getTopInventory();
+ } else {
+ this.inventory = getBukkitView().getTopInventory();
+ }
+ }
+
+ public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
+ try {
+ AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
+ new Location(entity.getWorld().getWorld(), 0, 0, 0),
+ (IInventory) mc_ContainerAnvil_repairInventory.get(this),
+ (IInventory) mc_ContainerAnvil_resultInventory.get(this), this);
+ CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this);
+ mc_ContainerAnvil_bukkitEntity.set(this, view);
+ return view;
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
+ }
+ return getBukkitView();
+ }
+
+ @Override
+ public boolean canUse(EntityHuman entityhuman) {
+ return canUse;
+ }
+
+ @Override
+ public void e() {
+ super.e();
+ if (cost >= 0) {
+ this.setLevelCost(cost);
+ }
+ textChange.onChange();
+ }
+
+ @Override
+ public void update() {
+ e();
+ }
+
+ @Override
+ public String getRenameText() {
+ return this.v;
+ }
+
+ @Override
+ public void setRenameText(String text) {
+ this.a(text);
+ }
+
+ @Override
+ public void setOnChange(AnvilTextChange handler) {
+ textChange = handler;
+ }
+
+ @Override
+ public String getCustomTitle() {
+ return customTitle;
+ }
+
+ @Override
+ public void setCustomTitle(String title) {
+ this.customTitle = title;
+ try {
+ mc_Container_title.set(this, new ChatMessage(customTitle != null ? customTitle : ""));
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
+ }
+ }
+
+ @Override
+ public void setLevelCost(int cost) {
+ this.cost = cost;
+ }
+
+ @Override
+ public int getLevelCost() {
+ if (cost >= 0) {
+ return cost;
+ } else {
+ return this.getLevelCost();
+ }
+ }
+
+ @Override
+ public void setCanUse(boolean bool) {
+ this.canUse = bool;
+ }
+
+ @Override
+ public ItemStack getLeftInput() {
+ return inventory.getItem(0);
+ }
+
+ @Override
+ public ItemStack getRightInput() {
+ return inventory.getItem(1);
+ }
+
+ @Override
+ public ItemStack getOutput() {
+ return inventory.getItem(2);
+ }
+
+ @Override
+ public void setLeftInput(ItemStack item) {
+ inventory.setItem(0, item);
+ }
+
+ @Override
+ public void setRightInput(ItemStack item) {
+ inventory.setItem(1, item);
+ }
+
+ @Override
+ public void setOutput(ItemStack item) {
+ inventory.setItem(2, item);
+ }
+
+ @Override
+ public Inventory getInventory() {
+ return inventory;
+ }
+
+ @Override
+ public void open() {
+ // Send the packet
+ entity.b.sendPacket(new PacketPlayOutOpenWindow(j, Containers.h, new ChatMessage(customTitle != null ? customTitle : "")));
+
+ // Set their active container to this anvil
+ entity.bV = this;
+
+ // Add the slot listener
+ entity.initMenu(entity.bV);
+ //entity.bV.addSlotListener(entity.cX);
+ }
+
+}
\ No newline at end of file
diff --git a/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/nbt/NBTCompoundImpl.java b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/nbt/NBTCompoundImpl.java
new file mode 100644
index 00000000..4a45a267
--- /dev/null
+++ b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/nbt/NBTCompoundImpl.java
@@ -0,0 +1,209 @@
+package com.songoda.core.nms.v1_17_R1.nbt;
+
+import com.songoda.core.nms.nbt.NBTCompound;
+import com.songoda.core.nms.nbt.NBTObject;
+import net.minecraft.nbt.NBTCompressedStreamTools;
+import net.minecraft.nbt.NBTTagCompound;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
+import java.util.Set;
+import java.util.UUID;
+
+public class NBTCompoundImpl implements NBTCompound {
+
+ protected NBTTagCompound compound;
+
+ protected NBTCompoundImpl(NBTTagCompound compound) {
+ this.compound = compound;
+ }
+
+ public NBTCompoundImpl() {
+ this.compound = new NBTTagCompound();
+ }
+
+ @Override
+ public NBTCompound set(String tag, String s) {
+ compound.setString(tag, s);
+ return this;
+ }
+
+ @Override
+ public NBTCompound set(String tag, boolean b) {
+ compound.setBoolean(tag, b);
+ return this;
+ }
+
+ @Override
+ public NBTCompound set(String tag, int i) {
+ compound.setInt(tag, i);
+ return this;
+ }
+
+ @Override
+ public NBTCompound set(String tag, double i) {
+ compound.setDouble(tag, i);
+ return this;
+ }
+
+ @Override
+ public NBTCompound set(String tag, long l) {
+ compound.setLong(tag, l);
+ return this;
+ }
+
+ @Override
+ public NBTCompound set(String tag, short s) {
+ compound.setShort(tag, s);
+ return this;
+ }
+
+ @Override
+ public NBTCompound set(String tag, byte b) {
+ compound.setByte(tag, b);
+ return this;
+ }
+
+ @Override
+ public NBTCompound set(String tag, int[] i) {
+ compound.setIntArray(tag, i);
+ return this;
+ }
+
+ @Override
+ public NBTCompound set(String tag, byte[] b) {
+ compound.setByteArray(tag, b);
+ return this;
+ }
+
+ @Override
+ public NBTCompound set(String tag, UUID u) {
+ compound.a(tag, u);
+ return this;
+ }
+
+ @Override
+ public NBTCompound remove(String tag) {
+ compound.remove(tag);
+ return this;
+ }
+
+ @Override
+ public boolean has(String tag) {
+ return compound.hasKey(tag);
+ }
+
+ @Override
+ public NBTObject getNBTObject(String tag) {
+ return new NBTObjectImpl(compound, tag);
+ }
+
+ @Override
+ public String getString(String tag) {
+ return getNBTObject(tag).asString();
+ }
+
+ @Override
+ public boolean getBoolean(String tag) {
+ return getNBTObject(tag).asBoolean();
+ }
+
+ @Override
+ public int getInt(String tag) {
+ return getNBTObject(tag).asInt();
+ }
+
+ @Override
+ public double getDouble(String tag) {
+ return getNBTObject(tag).asDouble();
+ }
+
+ @Override
+ public long getLong(String tag) {
+ return getNBTObject(tag).asLong();
+ }
+
+ @Override
+ public short getShort(String tag) {
+ return getNBTObject(tag).asShort();
+ }
+
+ @Override
+ public byte getByte(String tag) {
+ return getNBTObject(tag).asByte();
+ }
+
+ @Override
+ public int[] getIntArray(String tag) {
+ return getNBTObject(tag).asIntArray();
+ }
+
+ @Override
+ public byte[] getByteArray(String tag) {
+ return getNBTObject(tag).asByteArray();
+ }
+
+ @Override
+ public NBTCompound getCompound(String tag) {
+ if (has(tag)) {
+ return getNBTObject(tag).asCompound();
+ } else {
+ NBTTagCompound newCompound = new NBTTagCompound();
+ compound.set(tag, newCompound);
+ return new NBTCompoundImpl(newCompound);
+ }
+ }
+
+ @Override
+ public Set getKeys() {
+ return compound.getKeys();
+ }
+
+ @Override
+ public Set getKeys(String tag) {
+ return compound.getCompound(tag).getKeys();
+ }
+
+ @Override
+ public byte[] serialize(String... exclusions) {
+ try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ ObjectOutputStream dataOutput = new ObjectOutputStream(outputStream)) {
+ addExtras();
+ NBTTagCompound compound = this.compound.clone();
+
+ for (String exclusion : exclusions)
+ compound.remove(exclusion);
+
+ NBTCompressedStreamTools.a(compound, (OutputStream) dataOutput);
+
+ return outputStream.toByteArray();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ @Override
+ public void deSerialize(byte[] serialized) {
+ try (ByteArrayInputStream inputStream = new ByteArrayInputStream(serialized);
+ ObjectInputStream dataInput = new ObjectInputStream(inputStream)) {
+ compound = NBTCompressedStreamTools.a((InputStream) dataInput);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void addExtras() {
+ // None
+ }
+
+ @Override
+ public String toString() {
+ return compound.toString();
+ }
+}
diff --git a/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/nbt/NBTCoreImpl.java b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/nbt/NBTCoreImpl.java
new file mode 100644
index 00000000..367b0fc8
--- /dev/null
+++ b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/nbt/NBTCoreImpl.java
@@ -0,0 +1,37 @@
+package com.songoda.core.nms.v1_17_R1.nbt;
+
+import com.songoda.core.nms.nbt.NBTCore;
+import com.songoda.core.nms.nbt.NBTEntity;
+import com.songoda.core.nms.nbt.NBTItem;
+import net.minecraft.nbt.NBTTagCompound;
+import org.bukkit.craftbukkit.v1_17_R1.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack;
+import org.bukkit.entity.Entity;
+import org.bukkit.inventory.ItemStack;
+
+public class NBTCoreImpl implements NBTCore {
+
+ @Override
+ public NBTItem of(ItemStack item) {
+ return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
+ }
+
+ @Override
+ public NBTItem newItem() {
+ return new NBTItemImpl(null);
+ }
+
+ @Override
+ public NBTEntity of(Entity entity) {
+ net.minecraft.world.entity.Entity nmsEntity = ((CraftEntity) entity).getHandle();
+ NBTTagCompound nbt = new NBTTagCompound();
+ nmsEntity.save(nbt);
+ return new NBTEntityImpl(nbt, nmsEntity);
+ }
+
+ @Override
+ public NBTEntity newEntity() {
+ return new NBTEntityImpl(new NBTTagCompound(), null);
+ }
+
+}
diff --git a/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/nbt/NBTEntityImpl.java b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/nbt/NBTEntityImpl.java
new file mode 100644
index 00000000..35e7f572
--- /dev/null
+++ b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/nbt/NBTEntityImpl.java
@@ -0,0 +1,62 @@
+package com.songoda.core.nms.v1_17_R1.nbt;
+
+import com.songoda.core.nms.nbt.NBTEntity;
+import net.minecraft.core.BlockPosition;
+import net.minecraft.core.IRegistry;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.EntityTypes;
+import net.minecraft.world.entity.EnumMobSpawn;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_17_R1.CraftWorld;
+
+import java.util.Optional;
+
+public class NBTEntityImpl extends NBTCompoundImpl implements NBTEntity {
+
+ private Entity nmsEntity;
+
+ public NBTEntityImpl(NBTTagCompound entityNBT, Entity nmsEntity) {
+ super(entityNBT);
+ this.nmsEntity = nmsEntity;
+ }
+
+ @Override
+ public org.bukkit.entity.Entity spawn(Location location) {
+ String entityType = getNBTObject("entity_type").asString();
+
+ Optional> optionalEntity = EntityTypes.a(entityType);
+ if (optionalEntity.isPresent()) {
+ Entity spawned = optionalEntity.get().spawnCreature(
+ ((CraftWorld) location.getWorld()).getHandle(),
+ compound,
+ null,
+ null,
+ new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ()),
+ EnumMobSpawn.n,
+ true,
+ false
+ );
+
+ if (spawned != null) {
+ spawned.load(compound);
+ org.bukkit.entity.Entity entity = spawned.getBukkitEntity();
+ entity.teleport(location);
+ nmsEntity = spawned;
+ return entity;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public org.bukkit.entity.Entity reSpawn(Location location) {
+ nmsEntity.die();
+ return spawn(location);
+ }
+
+ @Override
+ public void addExtras() {
+ compound.setString("entity_type", IRegistry.Y.getKey(nmsEntity.getEntityType()).toString());
+ }
+}
diff --git a/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/nbt/NBTItemImpl.java b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/nbt/NBTItemImpl.java
new file mode 100644
index 00000000..d0a5dd29
--- /dev/null
+++ b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/nbt/NBTItemImpl.java
@@ -0,0 +1,28 @@
+package com.songoda.core.nms.v1_17_R1.nbt;
+
+import com.songoda.core.nms.nbt.NBTItem;
+import net.minecraft.nbt.NBTTagCompound;
+import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack;
+import org.bukkit.inventory.ItemStack;
+
+public class NBTItemImpl extends NBTCompoundImpl implements NBTItem {
+
+ private final net.minecraft.world.item.ItemStack nmsItem;
+
+ public NBTItemImpl(net.minecraft.world.item.ItemStack nmsItem) {
+ super(nmsItem != null && nmsItem.hasTag() ? nmsItem.getTag() : new NBTTagCompound());
+ this.nmsItem = nmsItem;
+ }
+
+ public ItemStack finish() {
+ if (nmsItem == null) {
+ return CraftItemStack.asBukkitCopy(net.minecraft.world.item.ItemStack.a(compound));
+ } else {
+ return CraftItemStack.asBukkitCopy(nmsItem);
+ }
+ }
+
+ @Override
+ public void addExtras() {
+ }
+}
diff --git a/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/nbt/NBTObjectImpl.java b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/nbt/NBTObjectImpl.java
new file mode 100644
index 00000000..7acacce0
--- /dev/null
+++ b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/nbt/NBTObjectImpl.java
@@ -0,0 +1,73 @@
+package com.songoda.core.nms.v1_17_R1.nbt;
+
+import com.songoda.core.nms.nbt.NBTCompound;
+import com.songoda.core.nms.nbt.NBTObject;
+import net.minecraft.nbt.NBTTagCompound;
+
+import java.util.Set;
+
+public class NBTObjectImpl implements NBTObject {
+
+ private final NBTTagCompound compound;
+ private final String tag;
+
+ public NBTObjectImpl(NBTTagCompound compound, String tag) {
+ this.compound = compound;
+ this.tag = tag;
+ }
+
+ @Override
+ public String asString() {
+ return compound.getString(tag);
+ }
+
+ @Override
+ public boolean asBoolean() {
+ return compound.getBoolean(tag);
+ }
+
+ @Override
+ public int asInt() {
+ return compound.getInt(tag);
+ }
+
+ @Override
+ public double asDouble() {
+ return compound.getDouble(tag);
+ }
+
+ @Override
+ public long asLong() {
+ return compound.getLong(tag);
+ }
+
+ @Override
+ public short asShort() {
+ return compound.getShort(tag);
+ }
+
+ @Override
+ public byte asByte() {
+ return compound.getByte(tag);
+ }
+
+ @Override
+ public int[] asIntArray() {
+ return compound.getIntArray(tag);
+ }
+
+ @Override
+ public byte[] asByteArray() {
+ return compound.getByteArray(tag);
+ }
+
+ @Override
+ public NBTCompound asCompound() {
+ return new NBTCompoundImpl(compound.getCompound(tag));
+ }
+
+ @Override
+ public Set getKeys() {
+ return compound.getKeys();
+ }
+}
diff --git a/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/world/SItemStackImpl.java b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/world/SItemStackImpl.java
new file mode 100644
index 00000000..000fdd43
--- /dev/null
+++ b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/world/SItemStackImpl.java
@@ -0,0 +1,36 @@
+package com.songoda.core.nms.v1_17_R1.world;
+
+import com.songoda.core.nms.world.SItemStack;
+import net.minecraft.core.particles.ParticleParamItem;
+import net.minecraft.core.particles.Particles;
+import net.minecraft.server.level.EntityPlayer;
+import net.minecraft.world.phys.Vec3D;
+import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+public class SItemStackImpl implements SItemStack {
+
+ private final ItemStack item;
+
+ public SItemStackImpl(ItemStack item) {
+ this.item = item;
+ }
+
+ @Override
+ public void breakItem(Player player, int amount) {
+ EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
+ for (int i = 0; i < amount; ++i) {
+ Vec3D vec3d = new Vec3D(((double) random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D);
+ vec3d = vec3d.a(-entityPlayer.getXRot() * 0.017453292F);
+ vec3d = vec3d.b(-entityPlayer.getYRot() * 0.017453292F);
+ double d0 = (double) (-random.nextFloat()) * 0.6D - 0.3D;
+ Vec3D vec3d1 = new Vec3D(((double) random.nextFloat() - 0.5D) * 0.3D, d0, 0.6D);
+ vec3d1 = vec3d1.a(-entityPlayer.getXRot() * 0.017453292F);
+ vec3d1 = vec3d1.b(-entityPlayer.getYRot() * 0.017453292F);
+ vec3d1 = vec3d1.add(entityPlayer.locX(), entityPlayer.getHeadY(), entityPlayer.locZ());
+ entityPlayer.t.addParticle(new ParticleParamItem(Particles.K, CraftItemStack.asNMSCopy(item)), vec3d1.b, vec3d1.c, vec3d1.d, vec3d.b, vec3d.c + 0.05D, vec3d.d);
+ }
+ }
+}
diff --git a/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/world/SSpawnerImpl.java b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/world/SSpawnerImpl.java
new file mode 100644
index 00000000..27b499c7
--- /dev/null
+++ b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/world/SSpawnerImpl.java
@@ -0,0 +1,132 @@
+package com.songoda.core.nms.v1_17_R1.world;
+
+import com.songoda.core.compatibility.CompatibleMaterial;
+import com.songoda.core.compatibility.CompatibleParticleHandler;
+import com.songoda.core.nms.world.SSpawner;
+import com.songoda.core.nms.world.SpawnedEntity;
+import net.minecraft.core.BlockPosition;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.server.level.WorldServer;
+import net.minecraft.world.DifficultyDamageScaler;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.EntityInsentient;
+import net.minecraft.world.entity.EntityTypes;
+import net.minecraft.world.entity.EnumMobSpawn;
+import net.minecraft.world.level.MobSpawnerData;
+import org.bukkit.Location;
+import org.bukkit.block.BlockFace;
+import org.bukkit.craftbukkit.v1_17_R1.CraftWorld;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.event.entity.CreatureSpawnEvent;
+
+import java.util.Optional;
+import java.util.Random;
+import java.util.Set;
+
+public class SSpawnerImpl implements SSpawner {
+
+ private final Location spawnerLocation;
+
+ public SSpawnerImpl(Location location) {
+ this.spawnerLocation = location;
+ }
+
+ @Override
+ public LivingEntity spawnEntity(EntityType type, Location spawnerLocation) {
+ return spawnEntity(type, "EXPLOSION_NORMAL", null, null);
+ }
+
+ @Override
+ public LivingEntity spawnEntity(EntityType type, String particleType, SpawnedEntity spawned,
+ Set canSpawnOn) {
+
+ MobSpawnerData data = new MobSpawnerData();
+ NBTTagCompound compound = data.getEntity();
+
+ String name = type.name().toLowerCase().replace("snowman", "snow_golem")
+ .replace("mushroom_cow", "mooshroom");
+ compound.setString("id", "minecraft:" + name);
+
+ short spawnRange = 4;
+ for (int i = 0; i < 50; i++) {
+ WorldServer world = ((CraftWorld) spawnerLocation.getWorld()).getHandle();
+
+ Random random = world.getRandom();
+ double x = spawnerLocation.getX() + (random.nextDouble() - random.nextDouble()) * (double) spawnRange + 0.5D;
+ double y = spawnerLocation.getY() + random.nextInt(3) - 1;
+ double z = spawnerLocation.getZ() + (random.nextDouble() - random.nextDouble()) * (double) spawnRange + 0.5D;
+
+ Optional optionalEntity = EntityTypes.a(compound, world);
+ if (!optionalEntity.isPresent()) continue;
+
+ Entity entity = optionalEntity.get();
+ entity.setPosition(x, y, z);
+
+ BlockPosition position = entity.getChunkCoordinates();
+ DifficultyDamageScaler damageScaler = world.getDamageScaler(position);
+
+ if (!(entity instanceof EntityInsentient))
+ continue;
+
+ EntityInsentient entityInsentient = (EntityInsentient) entity;
+
+ Location spot = new Location(spawnerLocation.getWorld(), x, y, z);
+ if (!canSpawn(world, entityInsentient, spot, canSpawnOn))
+ continue;
+
+ entityInsentient.prepare(world, damageScaler, EnumMobSpawn.c,
+ null, null);
+
+ LivingEntity craftEntity = (LivingEntity) entity.getBukkitEntity();
+
+ if (spawned != null)
+ if (!spawned.onSpawn(craftEntity))
+ return null;
+
+ if (particleType != null) {
+ float xx = (float) (0 + (Math.random() * 1));
+ float yy = (float) (0 + (Math.random() * 2));
+ float zz = (float) (0 + (Math.random() * 1));
+ CompatibleParticleHandler.spawnParticles(CompatibleParticleHandler.ParticleType.getParticle(particleType),
+ spot, 5, xx, yy, zz, 0);
+ }
+
+ world.addEntity(entity, CreatureSpawnEvent.SpawnReason.SPAWNER);
+
+ spot.setYaw(random.nextFloat() * 360.0F);
+ craftEntity.teleport(spot);
+
+ return craftEntity;
+ }
+ return null;
+ }
+
+ private boolean canSpawn(WorldServer world, EntityInsentient entityInsentient, Location location,
+ Set canSpawnOn) {
+
+ if (!world.getCubes(entityInsentient, entityInsentient.getBoundingBox()))
+ return false;
+
+ CompatibleMaterial spawnedIn = CompatibleMaterial.getMaterial(location.getBlock());
+ CompatibleMaterial spawnedOn = CompatibleMaterial.getMaterial(location.getBlock().getRelative(BlockFace.DOWN));
+
+ if (spawnedIn == null || spawnedOn == null)
+ return false;
+
+ if (!spawnedIn.isAir()
+ && spawnedIn != CompatibleMaterial.WATER
+ && !spawnedIn.name().contains("PRESSURE")
+ && !spawnedIn.name().contains("SLAB")) {
+ return false;
+ }
+
+ for (CompatibleMaterial material : canSpawnOn) {
+ if (material == null) continue;
+
+ if (spawnedOn.equals(material) || material.isAir())
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/world/SWorldImpl.java b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/world/SWorldImpl.java
new file mode 100644
index 00000000..2191eff5
--- /dev/null
+++ b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/world/SWorldImpl.java
@@ -0,0 +1,56 @@
+package com.songoda.core.nms.v1_17_R1.world;
+
+import com.songoda.core.nms.world.SWorld;
+import net.minecraft.server.level.WorldServer;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.level.entity.LevelEntityGetter;
+import net.minecraft.world.level.entity.PersistentEntitySectionManager;
+import org.bukkit.World;
+import org.bukkit.craftbukkit.v1_17_R1.CraftWorld;
+import org.bukkit.entity.LivingEntity;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+public class SWorldImpl implements SWorld {
+
+ private final World world;
+
+ private static Field fieldG;
+
+ static {
+ try {
+ fieldG = WorldServer.class.getDeclaredField("G");
+ } catch (NoSuchFieldException e) {
+ e.printStackTrace();
+ }
+ fieldG.setAccessible(true);
+ }
+
+ public SWorldImpl(World world) {
+ this.world = world;
+ }
+
+ @Override
+ public List getLivingEntities() {
+ List list = new ArrayList();
+ try {
+
+ WorldServer worldServer = ((CraftWorld) world).getHandle();
+ LevelEntityGetter entities =
+ ((PersistentEntitySectionManager) fieldG.get(worldServer)).d();
+
+ entities.a().forEach((mcEnt) -> {
+ org.bukkit.entity.Entity bukkitEntity = mcEnt.getBukkitEntity();
+ if (bukkitEntity instanceof LivingEntity && bukkitEntity.isValid()) {
+ list.add((LivingEntity) bukkitEntity);
+ }
+
+ });
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ return list;
+ }
+}
diff --git a/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/world/WorldCoreImpl.java
new file mode 100644
index 00000000..7152abfe
--- /dev/null
+++ b/NMS/NMS-v1_17_R1/src/com/songoda/core/nms/v1_17_R1/world/WorldCoreImpl.java
@@ -0,0 +1,33 @@
+package com.songoda.core.nms.v1_17_R1.world;
+
+import com.songoda.core.nms.world.SItemStack;
+import com.songoda.core.nms.world.SSpawner;
+import com.songoda.core.nms.world.SWorld;
+import com.songoda.core.nms.world.WorldCore;
+import org.bukkit.Location;
+import org.bukkit.World;
+import org.bukkit.block.CreatureSpawner;
+import org.bukkit.inventory.ItemStack;
+
+public class WorldCoreImpl implements WorldCore {
+
+ @Override
+ public SSpawner getSpawner(CreatureSpawner spawner) {
+ return new SSpawnerImpl(spawner.getLocation());
+ }
+
+ @Override
+ public SSpawner getSpawner(Location location) {
+ return new SSpawnerImpl(location);
+ }
+
+ @Override
+ public SItemStack getItemStack(ItemStack item) {
+ return new SItemStackImpl(item);
+ }
+
+ @Override
+ public SWorld getWorld(World world) {
+ return new SWorldImpl(world);
+ }
+}
diff --git a/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/world/SItemStackImpl.java b/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/world/SItemStackImpl.java
new file mode 100644
index 00000000..c39e27d8
--- /dev/null
+++ b/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/world/SItemStackImpl.java
@@ -0,0 +1,36 @@
+package com.songoda.core.nms.v1_8_R1.world;
+
+import com.songoda.core.nms.world.SItemStack;
+import net.minecraft.server.v1_8_R1.EntityPlayer;
+import net.minecraft.server.v1_8_R1.EnumParticle;
+import net.minecraft.server.v1_8_R1.Item;
+import net.minecraft.server.v1_8_R1.Vec3D;
+import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_8_R1.inventory.CraftItemStack;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+public class SItemStackImpl implements SItemStack {
+
+ private final ItemStack item;
+
+ public SItemStackImpl(ItemStack item) {
+ this.item = item;
+ }
+
+ @Override
+ public void breakItem(Player player, int amount) {
+ EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
+ for (int i = 0; i < 5; ++i) {
+ Vec3D vec3d = new Vec3D(((double) random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D);
+ vec3d = vec3d.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d = vec3d.b(-entityPlayer.yaw * 0.017453292F);
+ double d0 = (double) (-random.nextFloat()) * 0.6D - 0.3D;
+ Vec3D vec3d1 = new Vec3D(((double) random.nextFloat() - 0.5D) * 0.3D, d0, 0.6D);
+ vec3d1 = vec3d1.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d1 = vec3d1.b(-entityPlayer.yaw * 0.017453292F);
+ vec3d1 = vec3d1.add(entityPlayer.locX, entityPlayer.locY + (double) entityPlayer.getHeadHeight(), entityPlayer.locZ);
+ entityPlayer.world.addParticle(EnumParticle.ITEM_CRACK, vec3d1.a, vec3d1.b, vec3d1.c, vec3d.a, vec3d.b + 0.05D, vec3d.c, new int[]{Item.getId(CraftItemStack.asNMSCopy(item).getItem())});
+ }
+ }
+}
diff --git a/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/world/spawner/SSpawnerImpl.java b/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/world/SSpawnerImpl.java
similarity index 98%
rename from NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/world/spawner/SSpawnerImpl.java
rename to NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/world/SSpawnerImpl.java
index 99bc969b..1ac40f2c 100644
--- a/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/world/spawner/SSpawnerImpl.java
+++ b/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/world/SSpawnerImpl.java
@@ -1,4 +1,4 @@
-package com.songoda.core.nms.v1_8_R1.world.spawner;
+package com.songoda.core.nms.v1_8_R1.world;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.CompatibleParticleHandler;
diff --git a/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/world/SWorldImpl.java b/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/world/SWorldImpl.java
new file mode 100644
index 00000000..9022ab05
--- /dev/null
+++ b/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/world/SWorldImpl.java
@@ -0,0 +1,18 @@
+package com.songoda.core.nms.v1_8_R1.world;
+
+import com.songoda.core.nms.world.SWorld;
+import org.bukkit.entity.LivingEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SWorldImpl implements SWorld {
+
+ public SWorldImpl() {
+ }
+
+ @Override
+ public List getLivingEntities() {
+ return new ArrayList<>();
+ }
+}
diff --git a/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/world/WorldCoreImpl.java
index 289965e3..ef77f758 100644
--- a/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/world/WorldCoreImpl.java
+++ b/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/world/WorldCoreImpl.java
@@ -1,10 +1,13 @@
package com.songoda.core.nms.v1_8_R1.world;
-import com.songoda.core.nms.v1_8_R1.world.spawner.SSpawnerImpl;
+import com.songoda.core.nms.world.SItemStack;
import com.songoda.core.nms.world.SSpawner;
+import com.songoda.core.nms.world.SWorld;
import com.songoda.core.nms.world.WorldCore;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.block.CreatureSpawner;
+import org.bukkit.inventory.ItemStack;
public class WorldCoreImpl implements WorldCore {
@@ -17,4 +20,14 @@ public class WorldCoreImpl implements WorldCore {
public SSpawner getSpawner(Location location) {
return new SSpawnerImpl(location);
}
+
+ @Override
+ public SItemStack getItemStack(ItemStack item) {
+ return new SItemStackImpl(item);
+ }
+
+ @Override
+ public SWorld getWorld(World world) {
+ return new SWorldImpl();
+ }
}
diff --git a/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/world/SItemStackImpl.java b/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/world/SItemStackImpl.java
new file mode 100644
index 00000000..15d72e94
--- /dev/null
+++ b/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/world/SItemStackImpl.java
@@ -0,0 +1,36 @@
+package com.songoda.core.nms.v1_8_R2.world;
+
+import com.songoda.core.nms.world.SItemStack;
+import net.minecraft.server.v1_8_R2.EntityPlayer;
+import net.minecraft.server.v1_8_R2.EnumParticle;
+import net.minecraft.server.v1_8_R2.Item;
+import net.minecraft.server.v1_8_R2.Vec3D;
+import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_8_R2.inventory.CraftItemStack;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+public class SItemStackImpl implements SItemStack {
+
+ private final ItemStack item;
+
+ public SItemStackImpl(ItemStack item) {
+ this.item = item;
+ }
+
+ @Override
+ public void breakItem(Player player, int amount) {
+ EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
+ for (int i = 0; i < 5; ++i) {
+ Vec3D vec3d = new Vec3D(((double) random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D);
+ vec3d = vec3d.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d = vec3d.b(-entityPlayer.yaw * 0.017453292F);
+ double d0 = (double) (-random.nextFloat()) * 0.6D - 0.3D;
+ Vec3D vec3d1 = new Vec3D(((double) random.nextFloat() - 0.5D) * 0.3D, d0, 0.6D);
+ vec3d1 = vec3d1.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d1 = vec3d1.b(-entityPlayer.yaw * 0.017453292F);
+ vec3d1 = vec3d1.add(entityPlayer.locX, entityPlayer.locY + (double) entityPlayer.getHeadHeight(), entityPlayer.locZ);
+ entityPlayer.world.addParticle(EnumParticle.ITEM_CRACK, vec3d1.a, vec3d1.b, vec3d1.c, vec3d.a, vec3d.b + 0.05D, vec3d.c, new int[]{Item.getId(CraftItemStack.asNMSCopy(item).getItem())});
+ }
+ }
+}
diff --git a/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/world/spawner/SSpawnerImpl.java b/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/world/SSpawnerImpl.java
similarity index 98%
rename from NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/world/spawner/SSpawnerImpl.java
rename to NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/world/SSpawnerImpl.java
index c9068cba..8198d654 100644
--- a/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/world/spawner/SSpawnerImpl.java
+++ b/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/world/SSpawnerImpl.java
@@ -1,4 +1,4 @@
-package com.songoda.core.nms.v1_8_R2.world.spawner;
+package com.songoda.core.nms.v1_8_R2.world;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.CompatibleParticleHandler;
diff --git a/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/world/SWorldImpl.java b/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/world/SWorldImpl.java
new file mode 100644
index 00000000..aaaeb584
--- /dev/null
+++ b/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/world/SWorldImpl.java
@@ -0,0 +1,18 @@
+package com.songoda.core.nms.v1_8_R2.world;
+
+import com.songoda.core.nms.world.SWorld;
+import org.bukkit.entity.LivingEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SWorldImpl implements SWorld {
+
+ public SWorldImpl() {
+ }
+
+ @Override
+ public List getLivingEntities() {
+ return new ArrayList<>();
+ }
+}
diff --git a/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/world/WorldCoreImpl.java b/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/world/WorldCoreImpl.java
index f790a967..c7b8ffe2 100644
--- a/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/world/WorldCoreImpl.java
+++ b/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/world/WorldCoreImpl.java
@@ -1,10 +1,13 @@
package com.songoda.core.nms.v1_8_R2.world;
-import com.songoda.core.nms.v1_8_R2.world.spawner.SSpawnerImpl;
+import com.songoda.core.nms.world.SItemStack;
import com.songoda.core.nms.world.SSpawner;
+import com.songoda.core.nms.world.SWorld;
import com.songoda.core.nms.world.WorldCore;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.block.CreatureSpawner;
+import org.bukkit.inventory.ItemStack;
public class WorldCoreImpl implements WorldCore {
@@ -17,4 +20,14 @@ public class WorldCoreImpl implements WorldCore {
public SSpawner getSpawner(Location location) {
return new SSpawnerImpl(location);
}
+
+ @Override
+ public SItemStack getItemStack(ItemStack item) {
+ return new SItemStackImpl(item);
+ }
+
+ @Override
+ public SWorld getWorld(World world) {
+ return new SWorldImpl();
+ }
}
diff --git a/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/world/SItemStackImpl.java b/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/world/SItemStackImpl.java
new file mode 100644
index 00000000..c5a0d9e9
--- /dev/null
+++ b/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/world/SItemStackImpl.java
@@ -0,0 +1,36 @@
+package com.songoda.core.nms.v1_8_R3.world;
+
+import com.songoda.core.nms.world.SItemStack;
+import net.minecraft.server.v1_8_R3.EntityPlayer;
+import net.minecraft.server.v1_8_R3.EnumParticle;
+import net.minecraft.server.v1_8_R3.Item;
+import net.minecraft.server.v1_8_R3.Vec3D;
+import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+public class SItemStackImpl implements SItemStack {
+
+ private final ItemStack item;
+
+ public SItemStackImpl(ItemStack item) {
+ this.item = item;
+ }
+
+ @Override
+ public void breakItem(Player player, int amount) {
+ EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
+ for (int i = 0; i < 5; ++i) {
+ Vec3D vec3d = new Vec3D(((double) random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D);
+ vec3d = vec3d.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d = vec3d.b(-entityPlayer.yaw * 0.017453292F);
+ double d0 = (double) (-random.nextFloat()) * 0.6D - 0.3D;
+ Vec3D vec3d1 = new Vec3D(((double) random.nextFloat() - 0.5D) * 0.3D, d0, 0.6D);
+ vec3d1 = vec3d1.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d1 = vec3d1.b(-entityPlayer.yaw * 0.017453292F);
+ vec3d1 = vec3d1.add(entityPlayer.locX, entityPlayer.locY + (double) entityPlayer.getHeadHeight(), entityPlayer.locZ);
+ entityPlayer.world.addParticle(EnumParticle.ITEM_CRACK, vec3d1.a, vec3d1.b, vec3d1.c, vec3d.a, vec3d.b + 0.05D, vec3d.c, new int[]{Item.getId(CraftItemStack.asNMSCopy(item).getItem())});
+ }
+ }
+}
diff --git a/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/world/spawner/SSpawnerImpl.java b/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/world/SSpawnerImpl.java
similarity index 98%
rename from NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/world/spawner/SSpawnerImpl.java
rename to NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/world/SSpawnerImpl.java
index 356130bc..48f8ed22 100644
--- a/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/world/spawner/SSpawnerImpl.java
+++ b/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/world/SSpawnerImpl.java
@@ -1,4 +1,4 @@
-package com.songoda.core.nms.v1_8_R3.world.spawner;
+package com.songoda.core.nms.v1_8_R3.world;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.CompatibleParticleHandler;
diff --git a/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/world/SWorldImpl.java b/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/world/SWorldImpl.java
new file mode 100644
index 00000000..cc811416
--- /dev/null
+++ b/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/world/SWorldImpl.java
@@ -0,0 +1,18 @@
+package com.songoda.core.nms.v1_8_R3.world;
+
+import com.songoda.core.nms.world.SWorld;
+import org.bukkit.entity.LivingEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SWorldImpl implements SWorld {
+
+ public SWorldImpl() {
+ }
+
+ @Override
+ public List getLivingEntities() {
+ return new ArrayList<>();
+ }
+}
diff --git a/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/world/WorldCoreImpl.java b/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/world/WorldCoreImpl.java
index 7d8dc57d..d0c61449 100644
--- a/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/world/WorldCoreImpl.java
+++ b/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/world/WorldCoreImpl.java
@@ -1,10 +1,13 @@
package com.songoda.core.nms.v1_8_R3.world;
-import com.songoda.core.nms.v1_8_R3.world.spawner.SSpawnerImpl;
+import com.songoda.core.nms.world.SItemStack;
import com.songoda.core.nms.world.SSpawner;
+import com.songoda.core.nms.world.SWorld;
import com.songoda.core.nms.world.WorldCore;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.block.CreatureSpawner;
+import org.bukkit.inventory.ItemStack;
public class WorldCoreImpl implements WorldCore {
@@ -17,4 +20,14 @@ public class WorldCoreImpl implements WorldCore {
public SSpawner getSpawner(Location location) {
return new SSpawnerImpl(location);
}
+
+ @Override
+ public SItemStack getItemStack(ItemStack item) {
+ return new SItemStackImpl(item);
+ }
+
+ @Override
+ public SWorld getWorld(World world) {
+ return new SWorldImpl();
+ }
}
diff --git a/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/world/SItemStackImpl.java b/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/world/SItemStackImpl.java
new file mode 100644
index 00000000..c8ad8f56
--- /dev/null
+++ b/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/world/SItemStackImpl.java
@@ -0,0 +1,36 @@
+package com.songoda.core.nms.v1_9_R1.world;
+
+import com.songoda.core.nms.world.SItemStack;
+import net.minecraft.server.v1_9_R1.EntityPlayer;
+import net.minecraft.server.v1_9_R1.EnumParticle;
+import net.minecraft.server.v1_9_R1.Item;
+import net.minecraft.server.v1_9_R1.Vec3D;
+import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_9_R1.inventory.CraftItemStack;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+public class SItemStackImpl implements SItemStack {
+
+ private final ItemStack item;
+
+ public SItemStackImpl(ItemStack item) {
+ this.item = item;
+ }
+
+ @Override
+ public void breakItem(Player player, int amount) {
+ EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
+ for (int i = 0; i < 5; ++i) {
+ Vec3D vec3d = new Vec3D(((double) random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D);
+ vec3d = vec3d.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d = vec3d.b(-entityPlayer.yaw * 0.017453292F);
+ double d0 = (double) (-random.nextFloat()) * 0.6D - 0.3D;
+ Vec3D vec3d1 = new Vec3D(((double) random.nextFloat() - 0.5D) * 0.3D, d0, 0.6D);
+ vec3d1 = vec3d1.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d1 = vec3d1.b(-entityPlayer.yaw * 0.017453292F);
+ vec3d1 = vec3d1.add(entityPlayer.locX, entityPlayer.locY + (double) entityPlayer.getHeadHeight(), entityPlayer.locZ);
+ entityPlayer.world.addParticle(EnumParticle.ITEM_CRACK, vec3d1.x, vec3d1.y, vec3d1.z, vec3d.x, vec3d.y + 0.05D, vec3d.z, new int[]{Item.getId(CraftItemStack.asNMSCopy(item).getItem())});
+ }
+ }
+}
diff --git a/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/world/spawner/SSpawnerImpl.java b/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/world/SSpawnerImpl.java
similarity index 98%
rename from NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/world/spawner/SSpawnerImpl.java
rename to NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/world/SSpawnerImpl.java
index 88a9bf72..1df904d7 100644
--- a/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/world/spawner/SSpawnerImpl.java
+++ b/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/world/SSpawnerImpl.java
@@ -1,4 +1,4 @@
-package com.songoda.core.nms.v1_9_R1.world.spawner;
+package com.songoda.core.nms.v1_9_R1.world;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.CompatibleParticleHandler;
diff --git a/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/world/SWorldImpl.java b/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/world/SWorldImpl.java
new file mode 100644
index 00000000..50a61171
--- /dev/null
+++ b/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/world/SWorldImpl.java
@@ -0,0 +1,18 @@
+package com.songoda.core.nms.v1_9_R1.world;
+
+import com.songoda.core.nms.world.SWorld;
+import org.bukkit.entity.LivingEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SWorldImpl implements SWorld {
+
+ public SWorldImpl() {
+ }
+
+ @Override
+ public List getLivingEntities() {
+ return new ArrayList<>();
+ }
+}
diff --git a/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/world/WorldCoreImpl.java b/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/world/WorldCoreImpl.java
index 122972c8..c98c70c0 100644
--- a/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/world/WorldCoreImpl.java
+++ b/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/world/WorldCoreImpl.java
@@ -1,10 +1,13 @@
package com.songoda.core.nms.v1_9_R1.world;
-import com.songoda.core.nms.v1_9_R1.world.spawner.SSpawnerImpl;
+import com.songoda.core.nms.world.SItemStack;
import com.songoda.core.nms.world.SSpawner;
+import com.songoda.core.nms.world.SWorld;
import com.songoda.core.nms.world.WorldCore;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.block.CreatureSpawner;
+import org.bukkit.inventory.ItemStack;
public class WorldCoreImpl implements WorldCore {
@@ -17,4 +20,14 @@ public class WorldCoreImpl implements WorldCore {
public SSpawner getSpawner(Location location) {
return new SSpawnerImpl(location);
}
+
+ @Override
+ public SItemStack getItemStack(ItemStack item) {
+ return new SItemStackImpl(item);
+ }
+
+ @Override
+ public SWorld getWorld(World world) {
+ return new SWorldImpl();
+ }
}
diff --git a/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/world/SItemStackImpl.java b/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/world/SItemStackImpl.java
new file mode 100644
index 00000000..e0f16efe
--- /dev/null
+++ b/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/world/SItemStackImpl.java
@@ -0,0 +1,36 @@
+package com.songoda.core.nms.v1_9_R2.world;
+
+import com.songoda.core.nms.world.SItemStack;
+import net.minecraft.server.v1_9_R2.EntityPlayer;
+import net.minecraft.server.v1_9_R2.EnumParticle;
+import net.minecraft.server.v1_9_R2.Item;
+import net.minecraft.server.v1_9_R2.Vec3D;
+import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_9_R2.inventory.CraftItemStack;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+public class SItemStackImpl implements SItemStack {
+
+ private final ItemStack item;
+
+ public SItemStackImpl(ItemStack item) {
+ this.item = item;
+ }
+
+ @Override
+ public void breakItem(Player player, int amount) {
+ EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
+ for (int i = 0; i < 5; ++i) {
+ Vec3D vec3d = new Vec3D(((double) random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D);
+ vec3d = vec3d.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d = vec3d.b(-entityPlayer.yaw * 0.017453292F);
+ double d0 = (double) (-random.nextFloat()) * 0.6D - 0.3D;
+ Vec3D vec3d1 = new Vec3D(((double) random.nextFloat() - 0.5D) * 0.3D, d0, 0.6D);
+ vec3d1 = vec3d1.a(-entityPlayer.pitch * 0.017453292F);
+ vec3d1 = vec3d1.b(-entityPlayer.yaw * 0.017453292F);
+ vec3d1 = vec3d1.add(entityPlayer.locX, entityPlayer.locY + (double) entityPlayer.getHeadHeight(), entityPlayer.locZ);
+ entityPlayer.world.addParticle(EnumParticle.ITEM_CRACK, vec3d1.x, vec3d1.y, vec3d1.z, vec3d.x, vec3d.y + 0.05D, vec3d.z, new int[]{Item.getId(CraftItemStack.asNMSCopy(item).getItem())});
+ }
+ }
+}
diff --git a/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/world/spawner/SSpawnerImpl.java b/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/world/SSpawnerImpl.java
similarity index 98%
rename from NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/world/spawner/SSpawnerImpl.java
rename to NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/world/SSpawnerImpl.java
index f6967b4c..62e130ec 100644
--- a/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/world/spawner/SSpawnerImpl.java
+++ b/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/world/SSpawnerImpl.java
@@ -1,4 +1,4 @@
-package com.songoda.core.nms.v1_9_R2.world.spawner;
+package com.songoda.core.nms.v1_9_R2.world;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.CompatibleParticleHandler;
diff --git a/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/world/SWorldImpl.java b/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/world/SWorldImpl.java
new file mode 100644
index 00000000..d980a7fc
--- /dev/null
+++ b/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/world/SWorldImpl.java
@@ -0,0 +1,18 @@
+package com.songoda.core.nms.v1_9_R2.world;
+
+import com.songoda.core.nms.world.SWorld;
+import org.bukkit.entity.LivingEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SWorldImpl implements SWorld {
+
+ public SWorldImpl() {
+ }
+
+ @Override
+ public List getLivingEntities() {
+ return new ArrayList<>();
+ }
+}
diff --git a/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/world/WorldCoreImpl.java b/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/world/WorldCoreImpl.java
index 1173d8df..4ab75b8b 100644
--- a/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/world/WorldCoreImpl.java
+++ b/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/world/WorldCoreImpl.java
@@ -1,10 +1,13 @@
package com.songoda.core.nms.v1_9_R2.world;
-import com.songoda.core.nms.v1_9_R2.world.spawner.SSpawnerImpl;
+import com.songoda.core.nms.world.SItemStack;
import com.songoda.core.nms.world.SSpawner;
+import com.songoda.core.nms.world.SWorld;
import com.songoda.core.nms.world.WorldCore;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.block.CreatureSpawner;
+import org.bukkit.inventory.ItemStack;
public class WorldCoreImpl implements WorldCore {
@@ -17,4 +20,14 @@ public class WorldCoreImpl implements WorldCore {
public SSpawner getSpawner(Location location) {
return new SSpawnerImpl(location);
}
+
+ @Override
+ public SItemStack getItemStack(ItemStack item) {
+ return new SItemStackImpl(item);
+ }
+
+ @Override
+ public SWorld getWorld(World world) {
+ return new SWorldImpl();
+ }
}