Merge branch 'development'

This commit is contained in:
Brianna 2020-09-07 09:49:45 -05:00
commit a787c3e13f
40 changed files with 197 additions and 674 deletions

View File

@ -2,7 +2,7 @@
<groupId>com.songoda</groupId>
<artifactId>UltimateStacker</artifactId>
<modelVersion>4.0.0</modelVersion>
<version>2.0.4</version>
<version>2.0.5</version>
<build>
<defaultGoal>clean install</defaultGoal>
<finalName>UltimateStacker-${project.version}</finalName>

View File

@ -14,7 +14,13 @@ import com.songoda.core.gui.GuiManager;
import com.songoda.core.hooks.HologramManager;
import com.songoda.core.hooks.WorldGuardHook;
import com.songoda.core.utils.TextUtils;
import com.songoda.ultimatestacker.commands.*;
import com.songoda.ultimatestacker.commands.CommandConvert;
import com.songoda.ultimatestacker.commands.CommandGiveSpawner;
import com.songoda.ultimatestacker.commands.CommandLootables;
import com.songoda.ultimatestacker.commands.CommandReload;
import com.songoda.ultimatestacker.commands.CommandRemoveAll;
import com.songoda.ultimatestacker.commands.CommandSettings;
import com.songoda.ultimatestacker.commands.CommandSpawn;
import com.songoda.ultimatestacker.database.DataManager;
import com.songoda.ultimatestacker.database.migrations._1_InitialMigration;
import com.songoda.ultimatestacker.database.migrations._2_EntityStacks;
@ -34,14 +40,10 @@ import com.songoda.ultimatestacker.stackable.entity.EntityStack;
import com.songoda.ultimatestacker.stackable.entity.EntityStackManager;
import com.songoda.ultimatestacker.stackable.spawner.SpawnerStack;
import com.songoda.ultimatestacker.stackable.spawner.SpawnerStackManager;
import com.songoda.ultimatestacker.storage.Storage;
import com.songoda.ultimatestacker.storage.StorageRow;
import com.songoda.ultimatestacker.storage.types.StorageYaml;
import com.songoda.ultimatestacker.tasks.StackingTask;
import com.songoda.ultimatestacker.utils.Methods;
import org.apache.commons.lang.WordUtils;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Item;
@ -50,8 +52,11 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.plugin.PluginManager;
import java.io.File;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class UltimateStacker extends SongodaPlugin {
@ -110,13 +115,13 @@ public class UltimateStacker extends SongodaPlugin {
// Setup plugin commands
this.commandManager = new CommandManager(this);
this.commandManager.addMainCommand("us")
.addSubCommands(new CommandSettings(guiManager),
new CommandRemoveAll(),
new CommandReload(),
new CommandGiveSpawner(),
new CommandSpawn(),
new CommandLootables(),
new CommandConvert(guiManager)
.addSubCommands(new CommandSettings(this, guiManager),
new CommandRemoveAll(this),
new CommandReload(this),
new CommandGiveSpawner(this),
new CommandSpawn(this),
new CommandLootables(this),
new CommandConvert( guiManager)
);
this.lootablesManager = new LootablesManager();
@ -215,31 +220,6 @@ public class UltimateStacker extends SongodaPlugin {
@Override
public void onDataLoad() {
// Legacy Data
File folder = getDataFolder();
File dataFile = new File(folder, "data.yml");
if (dataFile.exists()) {
Storage storage = new StorageYaml(this);
if (storage.containsGroup("spawners")) {
for (StorageRow row : storage.getRowsByGroup("spawners")) {
try {
Location location = Methods.unserializeLocation(row.getKey());
SpawnerStack stack = new SpawnerStack(
location,
row.get("amount").asInt());
getDataManager().createSpawner(stack);
} catch (Exception e) {
console.sendMessage("Failed to load spawner.");
e.printStackTrace();
}
}
}
dataFile.delete();
}
// Load current data.
final boolean useSpawnerHolo = Settings.SPAWNER_HOLOGRAMS.getBoolean();
this.dataManager.getSpawners((spawners) -> {
@ -258,7 +238,7 @@ public class UltimateStacker extends SongodaPlugin {
entityStackManager.addStacks(entities.values());
entityStackManager.tryAndLoadColdEntities();
this.stackingTask = new StackingTask(this);
getServer().getPluginManager().registerEvents(new ChunkListeners(this), this);
getServer().getPluginManager().registerEvents(new ChunkListeners(entityStackManager), this);
});
final boolean useBlockHolo = Settings.SPAWNER_HOLOGRAMS.getBoolean();
this.dataManager.getBlocks((blocks) -> {

View File

@ -2,7 +2,6 @@ package com.songoda.ultimatestacker.commands;
import com.songoda.core.commands.AbstractCommand;
import com.songoda.core.gui.GuiManager;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.gui.GUIConvert;
import com.songoda.ultimatestacker.utils.Methods;
import org.bukkit.Bukkit;
@ -13,13 +12,11 @@ import java.util.List;
public class CommandConvert extends AbstractCommand {
UltimateStacker instance;
GuiManager guiManager;
private final GuiManager guiManager;
public CommandConvert(GuiManager guiManager) {
super(true, "convert");
super(CommandType.PLAYER_ONLY, "convert");
this.guiManager = guiManager;
instance = UltimateStacker.getInstance();
}
@Override

View File

@ -16,18 +16,18 @@ import java.util.stream.Collectors;
public class CommandGiveSpawner extends AbstractCommand {
UltimateStacker instance;
private final UltimateStacker plugin;
public CommandGiveSpawner() {
super(false, "givespawner");
instance = UltimateStacker.getInstance();
public CommandGiveSpawner(UltimateStacker plugin) {
super(CommandType.CONSOLE_OK, "givespawner");
this.plugin = plugin;
}
@Override
protected ReturnType runCommand(CommandSender sender, String... args) {
if (args.length < 2) return ReturnType.SYNTAX_ERROR;
if (Bukkit.getPlayer(args[0]) == null && !args[0].trim().toLowerCase().equals("all")) {
if (Bukkit.getPlayer(args[0]) == null && !args[0].trim().equalsIgnoreCase("all")) {
sender.sendMessage(args[0] + " is not a player...");
return ReturnType.SYNTAX_ERROR;
}
@ -41,7 +41,7 @@ public class CommandGiveSpawner extends AbstractCommand {
}
if (type == null) {
instance.getLocale().newMessage("&7The entity StackType &6" + args[1] + " &7does not exist. Try one of these:").sendPrefixedMessage(sender);
plugin.getLocale().newMessage("&7The entity StackType &6" + args[1] + " &7does not exist. Try one of these:").sendPrefixedMessage(sender);
StringBuilder list = new StringBuilder();
for (EntityType types : EntityType.values()) {
@ -53,16 +53,16 @@ public class CommandGiveSpawner extends AbstractCommand {
int amt = args.length == 3 ? Integer.parseInt(args[2]) : 1;
ItemStack itemStack = Methods.getSpawnerItem(type, amt);
if (!args[0].trim().toLowerCase().equals("all")) {
if (!args[0].trim().equalsIgnoreCase("all")) {
Player player = Bukkit.getOfflinePlayer(args[0]).getPlayer();
player.getInventory().addItem(itemStack);
instance.getLocale().getMessage("command.give.success")
plugin.getLocale().getMessage("command.give.success")
.processPlaceholder("type", Methods.compileSpawnerName(type, amt))
.sendPrefixedMessage(player);
} else {
for (Player player : Bukkit.getOnlinePlayers()) {
player.getInventory().addItem(itemStack);
instance.getLocale().getMessage("command.give.success")
plugin.getLocale().getMessage("command.give.success")
.processPlaceholder("type", Methods.compileSpawnerName(type, amt))
.sendPrefixedMessage(player);
}

View File

@ -10,17 +10,17 @@ import java.util.List;
public class CommandLootables extends AbstractCommand {
UltimateStacker instance;
private final UltimateStacker plugin;
public CommandLootables() {
super(true, "lootables");
instance = UltimateStacker.getInstance();
public CommandLootables(UltimateStacker plugin) {
super(CommandType.PLAYER_ONLY, "lootables");
this.plugin = plugin;
}
@Override
protected ReturnType runCommand(CommandSender sender, String... args) {
Player p = (Player) sender;
instance.getGuiManager().showGUI(p, new GuiEditor(instance.getLootablesManager().getLootManager()));
plugin.getGuiManager().showGUI(p, new GuiEditor(plugin.getLootablesManager().getLootManager()));
return ReturnType.SUCCESS;
}

View File

@ -8,17 +8,17 @@ import java.util.List;
public class CommandReload extends AbstractCommand {
UltimateStacker instance;
private final UltimateStacker plugin;
public CommandReload() {
super(false, "reload");
instance = UltimateStacker.getInstance();
public CommandReload(UltimateStacker plugin) {
super(CommandType.CONSOLE_OK, "reload");
this.plugin = plugin;
}
@Override
protected ReturnType runCommand(CommandSender sender, String... args) {
instance.reloadConfig();
instance.getLocale().getMessage("&7Configuration and Language files reloaded.").sendPrefixedMessage(sender);
plugin.reloadConfig();
plugin.getLocale().getMessage("&7Configuration and Language files reloaded.").sendPrefixedMessage(sender);
return ReturnType.SUCCESS;
}

View File

@ -19,11 +19,11 @@ import java.util.List;
public class CommandRemoveAll extends AbstractCommand {
UltimateStacker instance;
private final UltimateStacker plugin;
public CommandRemoveAll() {
super(false, "removeall");
instance = UltimateStacker.getInstance();
public CommandRemoveAll(UltimateStacker plugin) {
super(CommandType.CONSOLE_OK, "removeall");
this.plugin = plugin;
}
@Override
@ -40,7 +40,7 @@ public class CommandRemoveAll extends AbstractCommand {
}
int amountRemoved = 0;
EntityStackManager stackManager = instance.getEntityStackManager();
EntityStackManager stackManager = plugin.getEntityStackManager();
for (World world : Bukkit.getWorlds()) {
for (Entity entityO : world.getEntities()) {
if (entityO instanceof Player || !(entityO instanceof LivingEntity)) continue;
@ -61,10 +61,10 @@ public class CommandRemoveAll extends AbstractCommand {
if (type.equalsIgnoreCase("items") && amountRemoved == 1) type = "Item";
if (amountRemoved == 0) {
instance.getLocale().newMessage("&7No" + (all ? " " : " stacked ")
plugin.getLocale().newMessage("&7No" + (all ? " " : " stacked ")
+ type + " exist that could be removed.").sendPrefixedMessage(sender);
} else {
instance.getLocale().newMessage("&7Removed &6" + amountRemoved + (all ? " " : " stacked ")
plugin.getLocale().newMessage("&7Removed &6" + amountRemoved + (all ? " " : " stacked ")
+ Methods.formatText(type.toLowerCase(), true) + " &7Successfully.").sendPrefixedMessage(sender);
}
return ReturnType.SUCCESS;

View File

@ -12,18 +12,18 @@ import java.util.List;
public class CommandSettings extends AbstractCommand {
UltimateStacker instance;
GuiManager guiManager;
private final UltimateStacker plugin;
private final GuiManager guiManager;
public CommandSettings(GuiManager guiManager) {
public CommandSettings(UltimateStacker plugin, GuiManager guiManager) {
super(CommandType.PLAYER_ONLY, "Settings");
this.guiManager = guiManager;
instance = UltimateStacker.getInstance();
this.plugin = plugin;
}
@Override
protected ReturnType runCommand(CommandSender sender, String... args) {
guiManager.showGUI((Player) sender, new PluginConfigGui(instance));
guiManager.showGUI((Player) sender, new PluginConfigGui(plugin));
return ReturnType.SUCCESS;
}

View File

@ -22,11 +22,11 @@ import java.util.stream.Collectors;
*/
public class CommandSpawn extends AbstractCommand {
UltimateStacker instance;
private final UltimateStacker plugin;
public CommandSpawn() {
super(true, "spawn");
instance = UltimateStacker.getInstance();
public CommandSpawn(UltimateStacker plugin) {
super(CommandType.PLAYER_ONLY, "spawn");
this.plugin = plugin;
}
@Override
@ -44,7 +44,7 @@ public class CommandSpawn extends AbstractCommand {
}
if (type == null) {
instance.getLocale().newMessage("&7The entity &6" + args[0] + " &7does not exist. Try one of these:").sendPrefixedMessage(sender);
plugin.getLocale().newMessage("&7The entity &6" + args[0] + " &7does not exist. Try one of these:").sendPrefixedMessage(sender);
StringBuilder list = new StringBuilder();
for (EntityType types : EntityType.values()) {
@ -54,10 +54,10 @@ public class CommandSpawn extends AbstractCommand {
sender.sendMessage(Methods.formatText("&6" + list));
} else {
LivingEntity entity = (LivingEntity)player.getWorld().spawnEntity(player.getTargetBlock((Set<Material>)null, 200).getLocation(), type);
EntityStack stack = instance.getEntityStackManager().addStack(entity);
EntityStack stack = plugin.getEntityStackManager().addStack(entity);
stack.createDuplicates(((Methods.isInt(args[1])) ? Integer.parseInt(args[1]) : 1) - 1);
stack.updateStack();
instance.getStackingTask().attemptSplit(stack, entity);
plugin.getStackingTask().attemptSplit(stack, entity);
}
return ReturnType.SUCCESS;

View File

@ -16,7 +16,11 @@ import org.bukkit.plugin.Plugin;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.*;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.function.Consumer;
public class DataManager extends DataManagerAbstract {

View File

@ -11,7 +11,7 @@ import org.bukkit.entity.Player;
public class GUIConvertWhat extends Gui {
private Convert convertFrom = null;
private Convert convertFrom;
private boolean entities = true;
private boolean spawners = true;
@ -41,17 +41,17 @@ public class GUIConvertWhat extends Gui {
}
void toggleEntities() {
private void toggleEntities() {
entities = !entities;
this.updateItem(0, ChatColor.GRAY + "Stacked Entities", entities ? ChatColor.GREEN + "Yes" : ChatColor.RED + "No");
}
void toggleSpawners() {
private void toggleSpawners() {
spawners = !spawners;
this.updateItem(1, ChatColor.GRAY + "Stacked Spawners", spawners ? ChatColor.GREEN + "Yes" : ChatColor.RED + "No");
}
void run(Player player) {
private void run(Player player) {
if (entities) {
convertFrom.convertEntities();
UltimateStacker.getInstance().getEntityStackManager().tryAndLoadColdEntities();

View File

@ -4,8 +4,8 @@ import com.gamingmesh.jobs.Jobs;
import com.gamingmesh.jobs.actions.EntityActionInfo;
import com.gamingmesh.jobs.container.ActionType;
import com.gamingmesh.jobs.container.JobsPlayer;
import com.songoda.ultimatestacker.stackable.entity.EntityStack;
import com.songoda.ultimatestacker.hook.StackerHook;
import com.songoda.ultimatestacker.stackable.entity.EntityStack;
import org.bukkit.GameMode;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;

View File

@ -10,21 +10,21 @@ import org.bukkit.metadata.FixedMetadataValue;
public class BreedListeners implements Listener {
private final UltimateStacker instance;
private final UltimateStacker plugin;
public BreedListeners(UltimateStacker instance) {
this.instance = instance;
public BreedListeners(UltimateStacker plugin) {
this.plugin = plugin;
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onBread(EntityBreedEvent event) {
Bukkit.getScheduler().scheduleSyncDelayedTask(instance, () -> {
event.getFather().removeMetadata("breedCooldown", instance);
event.getMother().removeMetadata("breedCooldown", instance);
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> {
event.getFather().removeMetadata("breedCooldown", plugin);
event.getMother().removeMetadata("breedCooldown", plugin);
}, 5 * 20 * 60);
event.getFather().setMetadata("breedCooldown", new FixedMetadataValue(instance, true));
event.getFather().removeMetadata("inLove", instance);
event.getMother().setMetadata("breedCooldown", new FixedMetadataValue(instance, true));
event.getMother().removeMetadata("inLove", instance);
event.getFather().setMetadata("breedCooldown", new FixedMetadataValue(plugin, true));
event.getFather().removeMetadata("inLove", plugin);
event.getMother().setMetadata("breedCooldown", new FixedMetadataValue(plugin, true));
event.getMother().removeMetadata("inLove", plugin);
}
}

View File

@ -1,6 +1,5 @@
package com.songoda.ultimatestacker.listeners;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.stackable.entity.EntityStackManager;
import org.bukkit.Chunk;
import org.bukkit.entity.Entity;
@ -14,8 +13,8 @@ public class ChunkListeners implements Listener {
private final EntityStackManager entityStackManager;
public ChunkListeners(UltimateStacker plugin) {
this.entityStackManager = plugin.getEntityStackManager();
public ChunkListeners(EntityStackManager entityStackManager) {
this.entityStackManager = entityStackManager;
}
@EventHandler

View File

@ -9,17 +9,17 @@ import org.bukkit.event.Listener;
public class ClearLagListeners implements Listener {
private final UltimateStacker instance;
private final UltimateStacker plugin;
public ClearLagListeners(UltimateStacker instance) {
this.instance = instance;
public ClearLagListeners(UltimateStacker plugin) {
this.plugin = plugin;
}
@EventHandler
public void onClearLaggTask(EntityRemoveEvent event) {
for (Entity entity : event.getWorld().getEntities()) {
if (entity instanceof LivingEntity && instance.getEntityStackManager().isStackedAndLoaded((LivingEntity)entity)) {
instance.getEntityStackManager().removeStack(entity);
if (entity instanceof LivingEntity && plugin.getEntityStackManager().isStackedAndLoaded((LivingEntity)entity)) {
plugin.getEntityStackManager().removeStack(entity);
event.addEntity(entity);
}
}

View File

@ -5,8 +5,8 @@ import com.songoda.core.compatibility.ServerVersion;
import com.songoda.lootables.loot.Drop;
import com.songoda.lootables.loot.DropUtils;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.stackable.entity.EntityStack;
import com.songoda.ultimatestacker.settings.Settings;
import com.songoda.ultimatestacker.stackable.entity.EntityStack;
import org.bukkit.GameRule;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
@ -29,12 +29,12 @@ import java.util.stream.Collectors;
public class DeathListeners implements Listener {
private final UltimateStacker instance;
private Random random;
private final UltimateStacker plugin;
private final Random random;
public DeathListeners(UltimateStacker instance) {
this.instance = instance;
random = new Random();
public DeathListeners(UltimateStacker plugin) {
this.plugin = plugin;
this.random = new Random();
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
@ -43,7 +43,7 @@ public class DeathListeners implements Listener {
|| event.getEntityType() == EntityType.ARMOR_STAND) return;
boolean custom = Settings.CUSTOM_DROPS.getBoolean();
List<Drop> drops = custom ? instance.getLootablesManager().getDrops(event.getEntity())
List<Drop> drops = custom ? plugin.getLootablesManager().getDrops(event.getEntity())
: event.getDrops().stream().map(Drop::new).collect(Collectors.toList());
if (custom) {
@ -57,8 +57,8 @@ public class DeathListeners implements Listener {
&& !event.getEntity().getWorld().getGameRuleValue(GameRule.DO_MOB_LOOT))
drops.clear();
if (instance.getEntityStackManager().isStackedAndLoaded(event.getEntity()))
instance.getEntityStackManager().getStack(event.getEntity())
if (plugin.getEntityStackManager().isStackedAndLoaded(event.getEntity()))
plugin.getEntityStackManager().getStack(event.getEntity())
.onDeath(event.getEntity(), drops, custom, event.getDroppedExp(), event);
else
DropUtils.processStackedDrop(event.getEntity(), drops, event);
@ -70,15 +70,14 @@ public class DeathListeners implements Listener {
items.add(entity.getEquipment().getItemInHand());
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_9))
items.add(entity.getEquipment().getItemInOffHand());
for (ItemStack item : items) {
for (ItemStack item : items)
if (item.getType() == material)
return true;
}
}
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_11) && entity instanceof ChestedHorse) {
if (((ChestedHorse) entity).getInventory().contains(material))
return true;
}
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_11)
&& entity instanceof ChestedHorse
&& ((ChestedHorse) entity).getInventory().contains(material))
return true;
switch (material.name()) {
case "SADDLE":
@ -118,8 +117,8 @@ public class DeathListeners implements Listener {
if (!(event.getEntity() instanceof LivingEntity)) return;
LivingEntity entity = (LivingEntity) event.getEntity();
if (!instance.getEntityStackManager().isStackedAndLoaded(entity)) return;
EntityStack stack = instance.getEntityStackManager().getStack(entity);
if (!plugin.getEntityStackManager().isStackedAndLoaded(entity)) return;
EntityStack stack = plugin.getEntityStackManager().getStack(entity);
if (Settings.KILL_WHOLE_STACK_ON_DEATH.getBoolean() && Settings.REALISTIC_DAMAGE.getBoolean()) {
Player player = (Player) event.getDamager();

View File

@ -13,7 +13,12 @@ import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.CreatureSpawner;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.*;
import org.bukkit.entity.Creeper;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;

View File

@ -3,9 +3,9 @@ package com.songoda.ultimatestacker.listeners;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.ServerVersion;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.settings.Settings;
import com.songoda.ultimatestacker.stackable.entity.EntityStack;
import com.songoda.ultimatestacker.stackable.entity.Split;
import com.songoda.ultimatestacker.settings.Settings;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Ageable;
@ -125,8 +125,9 @@ public class InteractListeners implements Listener {
return type == Material.HAY_BLOCK;
case "TURTLE":
return type == Material.SEAGRASS;
default:
return false;
}
return false;
}
}

View File

@ -3,13 +3,17 @@ package com.songoda.ultimatestacker.listeners;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.ServerVersion;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.settings.Settings;
import com.songoda.ultimatestacker.stackable.entity.EntityStack;
import com.songoda.ultimatestacker.stackable.entity.EntityStackManager;
import com.songoda.ultimatestacker.stackable.entity.Split;
import com.songoda.ultimatestacker.settings.Settings;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.entity.*;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.MushroomCow;
import org.bukkit.entity.Sheep;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@ -20,7 +24,7 @@ import java.util.Random;
public class ShearListeners implements Listener {
private UltimateStacker plugin;
private final UltimateStacker plugin;
public ShearListeners(UltimateStacker plugin) {
this.plugin = plugin;

View File

@ -1,11 +1,11 @@
package com.songoda.ultimatestacker.listeners;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.settings.Settings;
import com.songoda.ultimatestacker.stackable.entity.EntityStack;
import com.songoda.ultimatestacker.stackable.entity.EntityStackManager;
import com.songoda.ultimatestacker.stackable.entity.Split;
import com.songoda.ultimatestacker.settings.Settings;
import org.bukkit.entity.*;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@ -13,7 +13,7 @@ import org.bukkit.event.entity.SheepDyeWoolEvent;
public class SheepDyeListeners implements Listener {
private UltimateStacker plugin;
private final UltimateStacker plugin;
public SheepDyeListeners(UltimateStacker plugin) {
this.plugin = plugin;

View File

@ -3,12 +3,12 @@ package com.songoda.ultimatestacker.listeners;
import com.songoda.core.compatibility.ServerVersion;
import com.songoda.core.nms.NmsManager;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.stackable.entity.EntityStack;
import com.songoda.ultimatestacker.settings.Settings;
import com.songoda.ultimatestacker.stackable.entity.EntityStack;
import com.songoda.ultimatestacker.stackable.spawner.SpawnerStack;
import com.songoda.ultimatestacker.stackable.spawner.SpawnerStackManager;
import com.songoda.ultimatestacker.utils.Methods;
import com.songoda.ultimatestacker.utils.Reflection;
import com.songoda.ultimatestacker.utils.ReflectionUtil;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.block.Block;
@ -92,7 +92,7 @@ public class SpawnerListeners implements Listener {
.replace("MOOSHROOM", "MUSHROOM_COW")
.replace("ZOMBIE_PIGMAN", "PIG_ZOMBIE"));
else if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_12)) {
String str = Reflection.getNBTTagCompound(Reflection.getNMSItemStack(event.getItem())).toString();
String str = ReflectionUtil.getNBTTagCompound(ReflectionUtil.getNMSItemStack(event.getItem())).toString();
if (str.contains("minecraft:"))
entityType = EntityType.fromName(str.substring(str.indexOf("minecraft:") + 10, str.indexOf("\"}")));
else

View File

@ -11,7 +11,7 @@ import org.bukkit.event.entity.EntityTameEvent;
public class TameListeners implements Listener {
private UltimateStacker plugin;
private final UltimateStacker plugin;
public TameListeners(UltimateStacker plugin) {
this.plugin = plugin;

View File

@ -14,6 +14,7 @@ import org.bukkit.event.entity.EntityPickupItemEvent;
import org.bukkit.inventory.ItemStack;
public class ItemCurrentListener implements Listener {
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onPickup(EntityPickupItemEvent event) {
if (!Settings.STACK_ITEMS.getBoolean() || event.getItem() instanceof Arrow) return;

View File

@ -19,10 +19,10 @@ import java.util.List;
public class ItemListeners implements Listener {
private final UltimateStacker instance;
private final UltimateStacker plugin;
public ItemListeners(UltimateStacker instance) {
this.instance = instance;
public ItemListeners(UltimateStacker plugin) {
this.plugin = plugin;
}
@EventHandler
@ -39,7 +39,7 @@ public class ItemListeners implements Listener {
event.setCancelled(true);
int specific = instance.getItemFile().getInt("Items." + itemStack.getType().name() + ".Max Stack Size");
int specific = plugin.getItemFile().getInt("Items." + itemStack.getType().name() + ".Max Stack Size");
int max;
if (UltimateStacker.isMaterialBlacklisted(itemStack))

View File

@ -4,11 +4,21 @@ import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.ServerVersion;
import com.songoda.lootables.Lootables;
import com.songoda.lootables.Modify;
import com.songoda.lootables.loot.*;
import com.songoda.lootables.loot.Drop;
import com.songoda.lootables.loot.Loot;
import com.songoda.lootables.loot.LootBuilder;
import com.songoda.lootables.loot.LootManager;
import com.songoda.lootables.loot.Lootable;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.settings.Settings;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.*;
import org.bukkit.entity.Ageable;
import org.bukkit.entity.Creeper;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.Sheep;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import java.io.File;

View File

@ -5,7 +5,6 @@ import com.songoda.core.configuration.ConfigSetting;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.stackable.entity.Check;
import com.songoda.ultimatestacker.stackable.entity.Split;
import jdk.nashorn.internal.ir.LiteralNode;
import java.util.Arrays;
import java.util.Collections;

View File

@ -4,8 +4,8 @@ import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.settings.Settings;
import com.songoda.ultimatestacker.stackable.Hologramable;
import com.songoda.ultimatestacker.utils.Stackable;
import com.songoda.ultimatestacker.utils.Methods;
import com.songoda.ultimatestacker.utils.Stackable;
import org.bukkit.Location;
import org.bukkit.World;

View File

@ -1,7 +1,6 @@
package com.songoda.ultimatestacker.stackable.block;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.ultimatestacker.stackable.spawner.SpawnerStack;
import org.bukkit.Location;
import org.bukkit.block.Block;

View File

@ -8,7 +8,11 @@ import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import java.util.*;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.stream.Collectors;

View File

@ -16,7 +16,6 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.util.Vector;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

View File

@ -9,7 +9,11 @@ import org.bukkit.World;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import java.util.*;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class EntityStackManager {

View File

@ -6,7 +6,7 @@ import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.settings.Settings;
import com.songoda.ultimatestacker.stackable.Hologramable;
import com.songoda.ultimatestacker.utils.Methods;
import com.songoda.ultimatestacker.utils.Reflection;
import com.songoda.ultimatestacker.utils.ReflectionUtil;
import com.songoda.ultimatestacker.utils.Stackable;
import org.bukkit.Bukkit;
import org.bukkit.Location;
@ -56,7 +56,7 @@ public class SpawnerStack implements Stackable, Hologramable {
creatureSpawner.setMaxNearbyEntities(maxNearby);
creatureSpawner.setSpawnCount(count);
} else {
Reflection.updateSpawner(creatureSpawner, count, maxNearby);
ReflectionUtil.updateSpawner(creatureSpawner, count, maxNearby);
}
creatureSpawner.update();
}, 1L);

View File

@ -1,37 +0,0 @@
package com.songoda.ultimatestacker.storage;
import com.songoda.core.configuration.Config;
import com.songoda.ultimatestacker.UltimateStacker;
import java.util.List;
public abstract class Storage {
protected final UltimateStacker instance;
protected final Config dataFile;
public Storage(UltimateStacker instance) {
this.instance = instance;
this.dataFile = new Config(instance, "data.yml");
this.dataFile.setHeader("UltimateStacker Data File");
this.dataFile.setAutosave(true).setAutosaveInterval(120);
}
public abstract boolean containsGroup(String group);
public abstract List<StorageRow> getRowsByGroup(String group);
public abstract void prepareSaveItem(String group, StorageItem... items);
public void updateData(UltimateStacker instance) {
}
public abstract void doSave();
public abstract void save();
public abstract void makeBackup();
public abstract void closeConnection();
}

View File

@ -1,75 +0,0 @@
package com.songoda.ultimatestacker.storage;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class StorageItem {
private final Object object;
private String key = null;
public StorageItem(Object object) {
this.object = object;
}
public StorageItem(String key, Object object) {
this.key = key;
this.object = object;
}
public StorageItem(String key, List<Material> material) {
String object = "";
for (Material m : material) {
object += m.name() + ";";
}
this.key = key;
this.object = object;
}
public StorageItem(String key, Map<EntityType, Integer> entityKills) {
String object = "";
for (Map.Entry<EntityType, Integer> entry : entityKills.entrySet()) {
object += entry.getKey().name() + ":" + entry.getValue() + ";";
}
this.key = key;
this.object = object;
}
public String getKey() {
return key;
}
public String asString() {
if (object == null) return null;
return (String) object;
}
public boolean asBoolean() {
if (object == null) return false;
return (boolean) object;
}
public int asInt() {
if (object == null) return 0;
return (int) object;
}
public Object asObject() {
return object;
}
public List<Material> asMaterialList() {
List<Material> list = new ArrayList<>();
if (object == null) return list;
String[] stack = ((String) object).split(";");
for (String item : stack) {
if (item.equals("")) continue;
list.add(Material.valueOf(item));
}
return list;
}
}

View File

@ -1,29 +0,0 @@
package com.songoda.ultimatestacker.storage;
import java.util.Collections;
import java.util.Map;
public class StorageRow {
private final String key;
private final Map<String, StorageItem> items;
public StorageRow(String key, Map<String, StorageItem> items) {
this.key = key;
this.items = items;
}
public String getKey() {
return key;
}
public Map<String, StorageItem> getItems() {
return Collections.unmodifiableMap(items);
}
public StorageItem get(String key) {
if (!items.containsKey(key) || items.get(key).asObject().toString().equals("")) return new StorageItem(null);
return items.get(key);
}
}

View File

@ -1,195 +0,0 @@
package com.songoda.ultimatestacker.storage.types;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.storage.Storage;
import com.songoda.ultimatestacker.storage.StorageItem;
import com.songoda.ultimatestacker.storage.StorageRow;
import com.songoda.ultimatestacker.utils.MySQLDatabase;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class StorageMysql extends Storage {
private static Map<String, StorageItem[]> toSave = new HashMap<>();
private static Map<String, StorageItem[]> lastSave = null;
private MySQLDatabase database;
public StorageMysql(UltimateStacker instance) {
super(instance);
this.database = new MySQLDatabase(instance);
}
@Override
public boolean containsGroup(String group) {
try {
DatabaseMetaData dbm = database.getConnection().getMetaData();
ResultSet rs = dbm.getTables(null, null, instance.getConfig().getString("Database.Prefix") + group, null);
if (rs.next()) {
return true;
}
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
@Override
public List<StorageRow> getRowsByGroup(String group) {
List<StorageRow> rows = new ArrayList<>();
try {
ResultSet set = database.getConnection().createStatement().executeQuery(String.format("SELECT * FROM `" + instance.getConfig().getString("Database.Prefix") + "%s`", group));
while (set.next()) {
Map<String, StorageItem> items = new HashMap<>();
String key = set.getString(1);
for (int i = 2; i <= set.getMetaData().getColumnCount(); i++) {
if (set.getObject(i) == null || set.getObject(i) == "") continue;
StorageItem item = new StorageItem(set.getObject(i));
items.put(set.getMetaData().getColumnName(i), item);
}
StorageRow row = new StorageRow(key, items);
rows.add(row);
}
} catch (SQLException e) {
e.printStackTrace();
}
return rows;
}
@Override
public void prepareSaveItem(String group, StorageItem... items) {
toSave.put(group + "]" + items[0].asObject().toString(), items);
}
@Override
public void doSave() {
this.updateData(instance);
if (lastSave == null)
lastSave = new HashMap<>(toSave);
if (toSave.isEmpty()) return;
Map<String, StorageItem[]> nextSave = new HashMap<>(toSave);
this.makeBackup();
this.save();
toSave.clear();
lastSave.clear();
lastSave.putAll(nextSave);
}
@Override
public void save() {
try {
Statement stmt = database.getConnection().createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
last:
for (Map.Entry<String, StorageItem[]> last : lastSave.entrySet()) {
String lastKey = last.getKey().split("]")[0];
String lastValue = last.getValue()[0].asObject().toString();
for (Map.Entry<String, StorageItem[]> to : toSave.entrySet()) {
String toKey = to.getKey().split("]")[0];
if (!toKey.equals(lastKey)
|| !to.getValue()[0].asObject().equals(lastValue)
|| to.getValue().length != last.getValue().length)
continue;
toSave.remove(to.getKey());
for (int i = 0; i < to.getValue().length; i ++) {
if (!to.getValue()[i].asObject().toString()
.equals(last.getValue()[i].asObject().toString())) {
//Update
StorageItem[] items = to.getValue();
StringBuilder sql = new StringBuilder(String.format("UPDATE `" + instance.getConfig().getString("Database.Prefix") + "%s`", toKey));
sql.append(" SET");
for (StorageItem item : items) {
if (item == null || item.asObject() == null) continue;
String key = item.getKey().split("]")[0];
sql.append(String.format("`%s` = '%s', ", key, item.asObject().toString()));
}
sql = new StringBuilder(sql.substring(0, sql.length() - 2));
sql.append(String.format(" WHERE `%s`='%s'", last.getValue()[0].getKey(), last.getValue()[0].asObject().toString()));
stmt.addBatch(sql.toString());
continue last;
}
}
// Already up to date.
continue last;
}
//Was not found delete.
StringBuilder sql = new StringBuilder(String.format("DELETE FROM `" + instance.getConfig().getString("Database.Prefix") + "%s`", lastKey));
sql.append(String.format(" WHERE `%s`='%s'", last.getValue()[0].getKey(), last.getValue()[0].asObject().toString()));
stmt.addBatch(sql.toString());
}
for (Map.Entry<String, StorageItem[]> to : toSave.entrySet()) {
String toKey = to.getKey().split("]")[0];
//Add
StorageItem[] items = to.getValue();
StringBuilder sql = new StringBuilder(String.format("INSERT INTO `" + instance.getConfig().getString("Database.Prefix") + "%s`", toKey));
sql.append(" (");
for (StorageItem item : items) {
if (item == null || item.asObject() == null) continue;
String key = item.getKey().split("]")[0];
sql.append(String.format("`%s`, ", key));
}
sql = new StringBuilder(sql.substring(0, sql.length() - 2));
sql.append(") VALUES (");
for (StorageItem item : items) {
if (item == null || item.asObject() == null) continue;
sql.append(String.format("'%s', ", item.asObject().toString()));
}
sql = new StringBuilder(sql.substring(0, sql.length() - 2));
sql.append(");");
stmt.addBatch(sql.toString());
}
stmt.executeBatch();
toSave.clear();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void makeBackup() {
}
@Override
public void closeConnection() {
try {
database.getConnection().close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

View File

@ -1,157 +0,0 @@
package com.songoda.ultimatestacker.storage.types;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.storage.Storage;
import com.songoda.ultimatestacker.storage.StorageItem;
import com.songoda.ultimatestacker.storage.StorageRow;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.MemorySection;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public class StorageYaml extends Storage {
private static final Map<String, Object> toSave = new HashMap<>();
private static Map<String, Object> lastSave = null;
public StorageYaml(UltimateStacker instance) {
super(instance);
}
@Override
public boolean containsGroup(String group) {
return dataFile.contains("data." + group);
}
@Override
public List<StorageRow> getRowsByGroup(String group) {
List<StorageRow> rows = new ArrayList<>();
ConfigurationSection currentSection = dataFile.getConfigurationSection("data." + group);
for (String key : currentSection.getKeys(false)) {
Map<String, StorageItem> items = new HashMap<>();
ConfigurationSection currentSection2 = dataFile.getConfigurationSection("data." + group + "." + key);
for (String key2 : currentSection2.getKeys(false)) {
String path = "data." + group + "." + key + "." + key2;
items.put(key2, new StorageItem(dataFile.get(path) instanceof MemorySection
? convertToInLineList(path) : dataFile.get(path)));
}
if (items.isEmpty()) continue;
StorageRow row = new StorageRow(key, items);
rows.add(row);
}
return rows;
}
private String convertToInLineList(String path) {
StringBuilder converted = new StringBuilder();
for (String key : dataFile.getConfigurationSection(path).getKeys(false)) {
converted.append(key).append(":").append(dataFile.getInt(path + "." + key)).append(";");
}
return converted.toString();
}
@Override
public void prepareSaveItem(String group, StorageItem... items) {
for (StorageItem item : items) {
if (item == null || item.asObject() == null) continue;
toSave.put("data." + group + "." + items[0].asString() + "." + item.getKey(), item.asObject());
}
}
@Override
public void doSave() {
this.updateData(instance);
if (lastSave == null)
lastSave = new HashMap<>(toSave);
if (toSave.isEmpty()) return;
Map<String, Object> nextSave = new HashMap<>(toSave);
this.makeBackup();
this.save();
toSave.clear();
lastSave.clear();
lastSave.putAll(nextSave);
}
@Override
public void save() {
try {
for (Map.Entry<String, Object> entry : lastSave.entrySet()) {
if (toSave.containsKey(entry.getKey())) {
Object newValue = toSave.get(entry.getKey());
if (!entry.getValue().equals(newValue)) {
dataFile.set(entry.getKey(), newValue);
}
toSave.remove(entry.getKey());
} else {
dataFile.set(entry.getKey(), null);
}
}
for (Map.Entry<String, Object> entry : toSave.entrySet()) {
dataFile.set(entry.getKey(), entry.getValue());
}
dataFile.save();
} catch (NullPointerException e) {
e.printStackTrace();
}
}
@Override
public void makeBackup() {
File data = new File(instance.getDataFolder(), "data.yml");
File dataClone = new File(instance.getDataFolder(), "data-backup-" + System.currentTimeMillis() + ".yml");
try {
copyFile(data, dataClone);
} catch (IOException e) {
e.printStackTrace();
}
Deque<File> backups = new ArrayDeque<>();
for (File file : Objects.requireNonNull(instance.getDataFolder().listFiles())) {
if (file.getName().toLowerCase().contains("data-backup")) {
backups.add(file);
}
}
if (backups.size() > 3) {
backups.getFirst().delete();
}
}
@Override
public void closeConnection() {
dataFile.saveChanges();
}
private static void copyFile(File source, File dest) throws IOException {
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream(source);
os = new FileOutputStream(dest);
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
} finally {
is.close();
os.close();
}
}
}

View File

@ -19,7 +19,15 @@ import org.bukkit.entity.*;
import org.bukkit.inventory.EntityEquipment;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
public class StackingTask extends BukkitRunnable {
@ -345,12 +353,17 @@ public class StackingTask extends BukkitRunnable {
List<LivingEntity> entities = new ArrayList<>();
for (CachedChunk chunk : getNearbyChunks(location, radius, singleChunk)) {
if (chunk == null) continue;
Entity[] entityArray;
Entity[] entityArray = new Entity[0];
if (cachedChunks.containsKey(chunk)) {
entityArray = cachedChunks.get(chunk);
} else {
entityArray = chunk.getEntities();
cachedChunks.put(chunk, entityArray);
try {
entityArray = chunk.getEntities();
cachedChunks.put(chunk, entityArray);
} catch (Exception ignored) {
// Sometimes accessing this method asynchronously throws an error. This is super rare and
// as such doesn't really affect the plugin so we're just going to ignore this failure.
}
}
if (entityArray == null) continue;
for (Entity e : entityArray) {

View File

@ -6,21 +6,26 @@ import com.songoda.core.nms.nbt.NBTItem;
import com.songoda.core.utils.TextUtils;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.settings.Settings;
import org.bukkit.*;
import org.bukkit.block.Block;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.CreatureSpawner;
import org.bukkit.entity.*;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BlockStateMeta;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.util.Vector;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ThreadLocalRandom;
public class Methods {

View File

@ -7,7 +7,8 @@ import org.bukkit.inventory.ItemStack;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Reflection {
public class ReflectionUtil {
private static Class<?> clazzCraftCreatureSpawner, clazzTileEntityMobSpawner = null;
private static Method methodGetTileEntity, methodGetSpawner;
private static Field fieldSpawnount, fieldMaxNearbyEntities, fieldSpawner;
@ -68,12 +69,11 @@ public class Reflection {
}
public static Object getNMSItemStack(ItemStack item) {
@SuppressWarnings("rawtypes")
Class cis = getCraftItemStack();
java.lang.reflect.Method method;
Class<?> cis = getCraftItemStack();
java.lang.reflect.Method methodAsNMSCopy;
try {
method = cis.getMethod("asNMSCopy", ItemStack.class);
Object answer = method.invoke(cis, item);
methodAsNMSCopy = cis.getMethod("asNMSCopy", ItemStack.class);
Object answer = methodAsNMSCopy.invoke(cis, item);
return answer;
} catch (Exception e) {
// TODO Auto-generated catch block
@ -82,15 +82,12 @@ public class Reflection {
return null;
}
@SuppressWarnings({"unchecked"})
public static Object getNBTTagCompound(Object nmsitem) {
@SuppressWarnings("rawtypes")
Class c = nmsitem.getClass();
java.lang.reflect.Method method;
Class<?> c = nmsitem.getClass();
java.lang.reflect.Method methodGetTag;
try {
method = c.getMethod("getTag");
Object answer = method.invoke(nmsitem);
return answer;
methodGetTag = c.getMethod("getTag");
return methodGetTag.invoke(nmsitem);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
@ -98,14 +95,10 @@ public class Reflection {
return null;
}
@SuppressWarnings("rawtypes")
public static Class getCraftItemStack() {
public static Class<?> getCraftItemStack() {
String version = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3];
try {
Class c = Class.forName("org.bukkit.craftbukkit." + version + ".inventory.CraftItemStack");
//Constructor<?> cons = c.getConstructor(ItemStack.class);
//return cons.newInstance(item);
return c;
return Class.forName("org.bukkit.craftbukkit." + version + ".inventory.CraftItemStack");
} catch (Exception ex) {
System.out.println("Error in ItemNBTAPI! (Outdated plugin?)");
ex.printStackTrace();