diff --git a/pom.xml b/pom.xml
index 38ff94e..d228f09 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
com.songoda
UltimateStacker
4.0.0
- 1.11.20
+ 2
clean install
UltimateStacker-${project.version}
@@ -116,20 +116,20 @@
org.spigotmc
spigot
- 1.16.1
+ 1.16.2
provided
-
- com.songoda
- Lootables
- 1.0.8
-
com.songoda
SongodaCore
LATEST
compile
+
+ com.songoda
+ Lootables
+ 1.0.8
+
com.gamingmesh
jobs
diff --git a/src/main/java/com/songoda/ultimatestacker/UltimateStacker.java b/src/main/java/com/songoda/ultimatestacker/UltimateStacker.java
index 02dc2db..93ebe90 100644
--- a/src/main/java/com/songoda/ultimatestacker/UltimateStacker.java
+++ b/src/main/java/com/songoda/ultimatestacker/UltimateStacker.java
@@ -17,8 +17,8 @@ import com.songoda.core.utils.TextUtils;
import com.songoda.ultimatestacker.commands.*;
import com.songoda.ultimatestacker.database.DataManager;
import com.songoda.ultimatestacker.database.migrations._1_InitialMigration;
-import com.songoda.ultimatestacker.entity.EntityStack;
-import com.songoda.ultimatestacker.entity.EntityStackManager;
+import com.songoda.ultimatestacker.database.migrations._2_EntityStacks;
+import com.songoda.ultimatestacker.database.migrations._3_BlockStacks;
import com.songoda.ultimatestacker.hook.StackerHook;
import com.songoda.ultimatestacker.hook.hooks.JobsHook;
import com.songoda.ultimatestacker.listeners.*;
@@ -27,20 +27,22 @@ import com.songoda.ultimatestacker.listeners.item.ItemLegacyListener;
import com.songoda.ultimatestacker.listeners.item.ItemListeners;
import com.songoda.ultimatestacker.lootables.LootablesManager;
import com.songoda.ultimatestacker.settings.Settings;
-import com.songoda.ultimatestacker.spawner.SpawnerStack;
-import com.songoda.ultimatestacker.spawner.SpawnerStackManager;
+import com.songoda.ultimatestacker.stackable.Hologramable;
+import com.songoda.ultimatestacker.stackable.block.BlockStack;
+import com.songoda.ultimatestacker.stackable.block.BlockStackManager;
+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.EntityUtils;
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.block.Block;
-import org.bukkit.block.CreatureSpawner;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
@@ -65,6 +67,7 @@ public class UltimateStacker extends SongodaPlugin {
private final List stackerHooks = new ArrayList<>();
private EntityStackManager entityStackManager;
private SpawnerStackManager spawnerStackManager;
+ private BlockStackManager blockStackManager;
private LootablesManager lootablesManager;
private CommandManager commandManager;
private StackingTask stackingTask;
@@ -73,8 +76,6 @@ public class UltimateStacker extends SongodaPlugin {
private DataMigrationManager dataMigrationManager;
private DataManager dataManager;
- private EntityUtils entityUtils;
-
public static UltimateStacker getInstance() {
return INSTANCE;
}
@@ -118,8 +119,6 @@ public class UltimateStacker extends SongodaPlugin {
new CommandConvert(guiManager)
);
- this.entityUtils = new EntityUtils();
-
this.lootablesManager = new LootablesManager();
this.lootablesManager.createDefaultLootables();
this.getLootablesManager().getLootManager().loadLootables();
@@ -153,8 +152,8 @@ public class UltimateStacker extends SongodaPlugin {
spawnerFile.saveChanges();
this.spawnerStackManager = new SpawnerStackManager();
- this.entityStackManager = new EntityStackManager();
- this.stackingTask = new StackingTask(this);
+ this.entityStackManager = new EntityStackManager(this);
+ this.blockStackManager = new BlockStackManager();
guiManager.init();
PluginManager pluginManager = Bukkit.getPluginManager();
@@ -185,33 +184,6 @@ public class UltimateStacker extends SongodaPlugin {
}
HologramManager.load(this);
- // Legacy Data
- Bukkit.getScheduler().runTaskLater(this, () -> {
- 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();
- }
- }, 10);
-
// Database stuff, go!
try {
if (Settings.MYSQL_ENABLED.getBoolean()) {
@@ -235,17 +207,72 @@ public class UltimateStacker extends SongodaPlugin {
this.dataManager = new DataManager(this.databaseConnector, this);
this.dataMigrationManager = new DataMigrationManager(this.databaseConnector, this.dataManager,
- new _1_InitialMigration());
+ new _1_InitialMigration(),
+ new _2_EntityStacks(),
+ new _3_BlockStacks());
this.dataMigrationManager.runMigrations();
+ }
- Bukkit.getScheduler().runTaskLater(this, () -> {
- final boolean useHolo = Settings.SPAWNER_HOLOGRAMS.getBoolean();
- this.dataManager.getSpawners((spawners) -> {
- this.spawnerStackManager.addSpawners(spawners);
- if (useHolo)
- loadHolograms();
- });
- }, 20L);
+ @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) -> {
+ this.spawnerStackManager.addSpawners(spawners);
+ if (useSpawnerHolo) {
+ if (spawners.isEmpty()) return;
+
+ for (SpawnerStack spawner : spawners.values()) {
+ if (spawner.getLocation().getWorld() != null) {
+ updateHologram(spawner);
+ }
+ }
+ }
+ });
+ this.dataManager.getEntities((entities) -> {
+ entityStackManager.addStacks(entities.values());
+ entityStackManager.tryAndLoadColdEntities();
+ this.stackingTask = new StackingTask(this);
+ getServer().getPluginManager().registerEvents(new ChunkListeners(this), this);
+ });
+ final boolean useBlockHolo = Settings.SPAWNER_HOLOGRAMS.getBoolean();
+ this.dataManager.getBlocks((blocks) -> {
+ this.blockStackManager.addBlocks(blocks);
+ if (useBlockHolo) {
+ if (blocks.isEmpty()) return;
+
+ for (BlockStack stack : blocks.values()) {
+ if (stack.getLocation().getWorld() != null) {
+ updateHologram(stack);
+ }
+ }
+ }
+ });
}
public void addExp(Player player, EntityStack stack) {
@@ -269,8 +296,6 @@ public class UltimateStacker extends SongodaPlugin {
this.setLocale(getConfig().getString("System.Language Mode"), true);
this.locale.reloadMessages();
- this.entityUtils = new EntityUtils();
-
this.stackingTask.cancel();
this.stackingTask = new StackingTask(this);
@@ -281,7 +306,8 @@ public class UltimateStacker extends SongodaPlugin {
}
public boolean spawnersEnabled() {
- return !this.getServer().getPluginManager().isPluginEnabled("EpicSpawners") && Settings.SPAWNERS_ENABLED.getBoolean();
+ return !this.getServer().getPluginManager().isPluginEnabled("EpicSpawners")
+ && Settings.SPAWNERS_ENABLED.getBoolean();
}
public CommandManager getCommandManager() {
@@ -316,10 +342,6 @@ public class UltimateStacker extends SongodaPlugin {
return spawnerFile;
}
- public EntityUtils getEntityUtils() {
- return entityUtils;
- }
-
public DatabaseConnector getDatabaseConnector() {
return databaseConnector;
}
@@ -332,45 +354,20 @@ public class UltimateStacker extends SongodaPlugin {
return guiManager;
}
- void loadHolograms() {
- Collection spawners = getSpawnerStackManager().getStacks();
- if (spawners.isEmpty()) return;
-
- for (SpawnerStack spawner : spawners) {
- if (spawner.getLocation().getWorld() != null) {
- updateHologram(spawner);
- }
- }
+ public BlockStackManager getBlockStackManager() {
+ return blockStackManager;
}
- public void clearHologram(SpawnerStack stack) {
- HologramManager.removeHologram(stack.getLocation());
- }
- public void updateHologram(SpawnerStack stack) {
+ public void updateHologram(Hologramable stack) {
// are holograms enabled?
- if (!Settings.SPAWNER_HOLOGRAMS.getBoolean() || !HologramManager.getManager().isEnabled()) return;
- Block block = stack.getLocation().getBlock();
- if (block.getType() != CompatibleMaterial.SPAWNER.getBlockMaterial()) return;
- // grab the spawner block
- CreatureSpawner creatureSpawner = (CreatureSpawner) block.getState();
- String name = Methods.compileSpawnerName(creatureSpawner.getSpawnedType(), stack.getAmount());
+ if (!stack.areHologramsEnabled() && !HologramManager.getManager().isEnabled()) return;
// create the hologram
- HologramManager.updateHologram(stack.getLocation(), name);
+ HologramManager.updateHologram(stack.getLocation(), stack.getHologramName());
}
- public void removeHologram(Block block) {
- HologramManager.removeHologram(block.getLocation());
- }
-
- public void updateHologram(Block block) {
- // verify that this is a spawner
- if (block.getType() != CompatibleMaterial.SPAWNER.getMaterial()) return;
- // are holograms enabled?
- if (!Settings.SPAWNER_HOLOGRAMS.getBoolean() || !HologramManager.getManager().isEnabled()) return;
- // update this hologram in a tick
- SpawnerStack spawner = getSpawnerStackManager().getSpawner(block);
- Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this, () -> updateHologram(spawner), 10L);
+ public void removeHologram(Hologramable stack) {
+ HologramManager.removeHologram(stack.getLocation());
}
//////// Convenient API //////////
diff --git a/src/main/java/com/songoda/ultimatestacker/commands/CommandLootables.java b/src/main/java/com/songoda/ultimatestacker/commands/CommandLootables.java
index e8a6992..d83935c 100644
--- a/src/main/java/com/songoda/ultimatestacker/commands/CommandLootables.java
+++ b/src/main/java/com/songoda/ultimatestacker/commands/CommandLootables.java
@@ -2,19 +2,11 @@ package com.songoda.ultimatestacker.commands;
import com.songoda.core.commands.AbstractCommand;
import com.songoda.lootables.gui.GuiEditor;
-import com.songoda.lootables.gui.GuiLootableEditor;
import com.songoda.ultimatestacker.UltimateStacker;
-import com.songoda.ultimatestacker.entity.EntityStack;
-import com.songoda.ultimatestacker.utils.Methods;
import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.EntityType;
-import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
-import java.util.Arrays;
import java.util.List;
-import java.util.stream.Collectors;
public class CommandLootables extends AbstractCommand {
diff --git a/src/main/java/com/songoda/ultimatestacker/commands/CommandRemoveAll.java b/src/main/java/com/songoda/ultimatestacker/commands/CommandRemoveAll.java
index b2cece3..45495f6 100644
--- a/src/main/java/com/songoda/ultimatestacker/commands/CommandRemoveAll.java
+++ b/src/main/java/com/songoda/ultimatestacker/commands/CommandRemoveAll.java
@@ -3,13 +3,14 @@ package com.songoda.ultimatestacker.commands;
import com.songoda.core.commands.AbstractCommand;
import com.songoda.core.utils.TextUtils;
import com.songoda.ultimatestacker.UltimateStacker;
-import com.songoda.ultimatestacker.entity.EntityStackManager;
+import com.songoda.ultimatestacker.stackable.entity.EntityStackManager;
import com.songoda.ultimatestacker.utils.Methods;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
+import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import java.util.Arrays;
@@ -42,9 +43,9 @@ public class CommandRemoveAll extends AbstractCommand {
EntityStackManager stackManager = instance.getEntityStackManager();
for (World world : Bukkit.getWorlds()) {
for (Entity entityO : world.getEntities()) {
- if (entityO instanceof Player) continue;
+ if (entityO instanceof Player || !(entityO instanceof LivingEntity)) continue;
- if (entityO.getType() != EntityType.DROPPED_ITEM && (stackManager.isStacked(entityO) || all) && type.equalsIgnoreCase("entities")) {
+ if (entityO.getType() != EntityType.DROPPED_ITEM && (stackManager.isStackedAndLoaded((LivingEntity)entityO) || all) && type.equalsIgnoreCase("entities")) {
entityO.remove();
amountRemoved++;
} else if (entityO.getType() == EntityType.DROPPED_ITEM && type.equalsIgnoreCase("items")) {
diff --git a/src/main/java/com/songoda/ultimatestacker/commands/CommandSpawn.java b/src/main/java/com/songoda/ultimatestacker/commands/CommandSpawn.java
index 3967f61..c4fb326 100644
--- a/src/main/java/com/songoda/ultimatestacker/commands/CommandSpawn.java
+++ b/src/main/java/com/songoda/ultimatestacker/commands/CommandSpawn.java
@@ -2,16 +2,17 @@ package com.songoda.ultimatestacker.commands;
import com.songoda.core.commands.AbstractCommand;
import com.songoda.ultimatestacker.UltimateStacker;
-import com.songoda.ultimatestacker.entity.EntityStack;
+import com.songoda.ultimatestacker.stackable.entity.EntityStack;
import com.songoda.ultimatestacker.utils.Methods;
+import org.bukkit.Material;
import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import java.util.Arrays;
import java.util.List;
+import java.util.Set;
import java.util.stream.Collectors;
/**
@@ -30,7 +31,7 @@ public class CommandSpawn extends AbstractCommand {
@Override
protected ReturnType runCommand(CommandSender sender, String... args) {
- Player p = (Player) sender;
+ Player player = (Player) sender;
if (args.length < 2) return ReturnType.SYNTAX_ERROR;
@@ -52,9 +53,11 @@ public class CommandSpawn extends AbstractCommand {
}
sender.sendMessage(Methods.formatText("&6" + list));
} else {
- Entity entity = p.getWorld().spawnEntity(p.getLocation(), type);
- EntityStack stack = instance.getEntityStackManager().addStack(entity.getUniqueId(), (Methods.isInt(args[1])) ? Integer.parseInt(args[1]) : 1);
- instance.getStackingTask().attemptSplit(stack, (LivingEntity) entity);
+ LivingEntity entity = (LivingEntity)player.getWorld().spawnEntity(player.getTargetBlock((Set)null, 200).getLocation(), type);
+ EntityStack stack = instance.getEntityStackManager().addStack(entity);
+ stack.createDuplicates(((Methods.isInt(args[1])) ? Integer.parseInt(args[1]) : 1) - 1);
+ stack.updateStack();
+ instance.getStackingTask().attemptSplit(stack, entity);
}
return ReturnType.SUCCESS;
diff --git a/src/main/java/com/songoda/ultimatestacker/convert/StackMobConvert.java b/src/main/java/com/songoda/ultimatestacker/convert/StackMobConvert.java
index 8f7f3db..72be5db 100644
--- a/src/main/java/com/songoda/ultimatestacker/convert/StackMobConvert.java
+++ b/src/main/java/com/songoda/ultimatestacker/convert/StackMobConvert.java
@@ -1,7 +1,7 @@
package com.songoda.ultimatestacker.convert;
import com.songoda.ultimatestacker.UltimateStacker;
-import com.songoda.ultimatestacker.entity.EntityStackManager;
+import com.songoda.ultimatestacker.stackable.entity.EntityStackManager;
import org.bukkit.Bukkit;
import uk.antiperson.stackmob.StackMob;
@@ -38,11 +38,10 @@ public class StackMobConvert implements Convert {
public void convertEntities() {
EntityStackManager entityStackManager = plugin.getEntityStackManager();
for (Map.Entry entry : stackMob.getStorageManager().getAmountCache().entrySet()) {
- if (!entityStackManager.isStacked(entry.getKey())) {
- entityStackManager.addStack(entry.getKey(), entry.getValue());
+ if (!entityStackManager.isStackedAndLoaded(entry.getKey())) {
+ entityStackManager.addLegacyColdStack(entry.getKey(), entry.getValue());
continue;
}
- entityStackManager.getStack(entry.getKey()).setAmount(entry.getValue());
}
}
diff --git a/src/main/java/com/songoda/ultimatestacker/convert/WildStackerConvert.java b/src/main/java/com/songoda/ultimatestacker/convert/WildStackerConvert.java
index f0028c5..047bfff 100644
--- a/src/main/java/com/songoda/ultimatestacker/convert/WildStackerConvert.java
+++ b/src/main/java/com/songoda/ultimatestacker/convert/WildStackerConvert.java
@@ -3,21 +3,27 @@ package com.songoda.ultimatestacker.convert;
import com.bgsoftware.wildstacker.WildStackerPlugin;
import com.bgsoftware.wildstacker.api.WildStackerAPI;
import com.bgsoftware.wildstacker.api.objects.StackedSpawner;
+import com.songoda.core.database.DatabaseConnector;
+import com.songoda.core.database.SQLiteConnector;
import com.songoda.ultimatestacker.UltimateStacker;
-import com.songoda.ultimatestacker.entity.EntityStackManager;
-import com.songoda.ultimatestacker.spawner.SpawnerStack;
+import com.songoda.ultimatestacker.stackable.entity.EntityStackManager;
+import com.songoda.ultimatestacker.stackable.spawner.SpawnerStack;
import org.bukkit.Bukkit;
-import org.bukkit.World;
import org.bukkit.block.CreatureSpawner;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.LivingEntity;
+
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.util.UUID;
public class WildStackerConvert implements Convert {
+ private WildStackerPlugin wildStacker;
private final UltimateStacker plugin;
public WildStackerConvert() {
this.plugin = UltimateStacker.getInstance();
+ this.wildStacker = (WildStackerPlugin) Bukkit.getPluginManager().getPlugin("WildStacker");
+
}
@Override
@@ -38,18 +44,21 @@ public class WildStackerConvert implements Convert {
@Override
public void convertEntities() {
EntityStackManager entityStackManager = plugin.getEntityStackManager();
- for (World world : Bukkit.getWorlds()) {
- for (Entity entity : world.getEntities()) {
- if (!(entity instanceof LivingEntity)) continue;
- if (!entityStackManager.isStacked(entity)) {
- entityStackManager
- .addStack(entity, WildStackerAPI.getEntityAmount((LivingEntity)entity));
- continue;
+
+ DatabaseConnector connector = new SQLiteConnector(this.wildStacker);
+ connector.connect(connection -> {
+
+ try (Statement statement = connection.createStatement()) {
+ ResultSet result = statement.executeQuery("SELECT uuid, stackAmount FROM entities");
+ while (result.next()) {
+ UUID uuid = UUID.fromString(result.getString("uuid"));
+ int amount = result.getInt("stackAmount");
+ if (!entityStackManager.isEntityInColdStorage(uuid))
+ entityStackManager.addLegacyColdStack(uuid, amount);
}
- entityStackManager
- .getStack(entity).setAmount(WildStackerAPI.getEntityAmount((LivingEntity)entity));
}
- }
+ });
+
}
diff --git a/src/main/java/com/songoda/ultimatestacker/database/DataManager.java b/src/main/java/com/songoda/ultimatestacker/database/DataManager.java
index cb3dbb7..942b14d 100644
--- a/src/main/java/com/songoda/ultimatestacker/database/DataManager.java
+++ b/src/main/java/com/songoda/ultimatestacker/database/DataManager.java
@@ -1,20 +1,24 @@
package com.songoda.ultimatestacker.database;
+import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.database.DataManagerAbstract;
import com.songoda.core.database.DatabaseConnector;
-import com.songoda.ultimatestacker.spawner.SpawnerStack;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.Statement;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.function.Consumer;
+import com.songoda.ultimatestacker.stackable.block.BlockStack;
+import com.songoda.ultimatestacker.stackable.entity.ColdEntityStack;
+import com.songoda.ultimatestacker.stackable.entity.EntityStack;
+import com.songoda.ultimatestacker.stackable.entity.StackedEntity;
+import com.songoda.ultimatestacker.stackable.spawner.SpawnerStack;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.plugin.Plugin;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.util.*;
+import java.util.function.Consumer;
+
public class DataManager extends DataManagerAbstract {
public DataManager(DatabaseConnector databaseConnector, Plugin plugin) {
@@ -49,7 +53,7 @@ public class DataManager extends DataManagerAbstract {
public void createSpawner(SpawnerStack spawnerStack) {
- this.async(() -> this.databaseConnector.connect(connection -> {
+ this.queueAsync(() -> this.databaseConnector.connect(connection -> {
String createSpawner = "INSERT INTO " + this.getTablePrefix() + "spawners (amount, world, x, y, z) VALUES (?, ?, ?, ?, ?)";
try (PreparedStatement statement = connection.prepareStatement(createSpawner)) {
@@ -61,8 +65,137 @@ public class DataManager extends DataManagerAbstract {
statement.setInt(5, spawnerStack.getZ());
statement.executeUpdate();
}
- int spawnerId = this.lastInsertedId(connection);
+ int spawnerId = this.lastInsertedId(connection, "spawners");
this.sync(() -> spawnerStack.setId(spawnerId));
+ }), "create");
+ }
+
+ public void updateBlock(BlockStack blockStack) {
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ if (blockStack.getAmount() == 0) return;
+ String updateBlock = "UPDATE " + this.getTablePrefix() + "blocks SET amount = ? WHERE id = ?";
+ try (PreparedStatement statement = connection.prepareStatement(updateBlock)) {
+ statement.setInt(1, blockStack.getAmount());
+ statement.setInt(2, blockStack.getId());
+ statement.executeUpdate();
+ }
+ }));
+ }
+
+
+ public void createBlock(BlockStack blockStack) {
+ this.queueAsync(() -> this.databaseConnector.connect(connection -> {
+
+ String createSpawner = "INSERT INTO " + this.getTablePrefix() + "blocks (amount, material, world, x, y, z) VALUES (?, ?, ?, ?, ?, ?)";
+ try (PreparedStatement statement = connection.prepareStatement(createSpawner)) {
+ statement.setInt(1, blockStack.getAmount());
+ statement.setString(2, blockStack.getMaterial().name());
+
+ statement.setString(3, blockStack.getWorld().getName());
+ statement.setInt(4, blockStack.getX());
+ statement.setInt(5, blockStack.getY());
+ statement.setInt(6, blockStack.getZ());
+ statement.executeUpdate();
+ }
+ int blockId = this.lastInsertedId(connection, "blocks");
+ this.sync(() -> blockStack.setId(blockId));
+ }), "create");
+ }
+
+
+ public void createHostEntity(ColdEntityStack stack) {
+ this.queueAsync(() -> this.databaseConnector.connect(connection -> {
+ if (stack.getHostUniqueId() == null) return;
+ String createSerializedEntity = "INSERT INTO " + this.getTablePrefix() + "host_entities (uuid, create_duplicates) VALUES (?, ?)";
+ try (PreparedStatement statement = connection.prepareStatement(createSerializedEntity)) {
+ statement.setString(1, stack.getHostUniqueId().toString());
+ statement.setInt(2, stack.getCreateDuplicates());
+ statement.executeUpdate();
+ }
+ int stackId = this.lastInsertedId(connection, "host_entities");
+ this.sync(() -> stack.setId(stackId));
+ }), "create");
+ }
+
+ public void createStackedEntity(EntityStack hostStack, StackedEntity stackedEntity) {
+ this.queueAsync(() -> this.databaseConnector.connect(connection -> {
+ if (hostStack.getHostUniqueId() == null) return;
+ String createSerializedEntity = "INSERT INTO " + this.getTablePrefix() + "stacked_entities (uuid, host, serialized_entity) VALUES (?, ?, ?)";
+ try (PreparedStatement statement = connection.prepareStatement(createSerializedEntity)) {
+ statement.setString(1, stackedEntity.getUniqueId().toString());
+ statement.setInt(2, hostStack.getId());
+ statement.setBytes(3, stackedEntity.getSerializedEntity());
+ statement.executeUpdate();
+ }
+ }), "create");
+ }
+
+ public void createStackedEntities(ColdEntityStack hostStack, List stackedEntities) {
+ this.queueAsync(() -> this.databaseConnector.connect(connection -> {
+ if (hostStack.getHostUniqueId() == null) return;
+ String createSerializedEntity = "INSERT INTO " + this.getTablePrefix() + "stacked_entities (uuid, host, serialized_entity) VALUES (?, ?, ?)";
+ try (PreparedStatement statement = connection.prepareStatement(createSerializedEntity)) {
+ for (StackedEntity entity : stackedEntities) {
+ statement.setString(1, entity.getUniqueId().toString());
+ statement.setInt(2, hostStack.getId());
+ statement.setBytes(3, entity.getSerializedEntity());
+ statement.addBatch();
+ }
+ statement.executeBatch();
+ }
+ }), "create");
+ }
+
+ public void updateHost(ColdEntityStack hostStack) {
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ if (hostStack.getHostUniqueId() == null) return;
+ String updateHost = "UPDATE " + this.getTablePrefix() + "host_entities SET uuid = ?, create_duplicates = ? WHERE id = ?";
+ try (PreparedStatement statement = connection.prepareStatement(updateHost)) {
+ statement.setString(1, hostStack.getHostUniqueId().toString());
+ statement.setInt(2, hostStack.getCreateDuplicates());
+ statement.setInt(3, hostStack.getId());
+ statement.executeUpdate();
+ }
+ }));
+ }
+
+ public void deleteHost(ColdEntityStack stack) {
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ String deleteHost = "DELETE FROM " + this.getTablePrefix() + "host_entities WHERE id = ?";
+ try (PreparedStatement statement = connection.prepareStatement(deleteHost)) {
+ statement.setInt(1, stack.getId());
+ statement.executeUpdate();
+ }
+
+ String deleteStackedEntities = "DELETE FROM " + this.getTablePrefix() + "stacked_entities WHERE host = ?";
+ try (PreparedStatement statement = connection.prepareStatement(deleteStackedEntities)) {
+ statement.setInt(1, stack.getId());
+ statement.executeUpdate();
+ }
+ }));
+ }
+
+ public void deleteStackedEntity(UUID uuid) {
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ String deleteStackedEntity = "DELETE FROM " + this.getTablePrefix() + "stacked_entities WHERE uuid = ?";
+ try (PreparedStatement statement = connection.prepareStatement(deleteStackedEntity)) {
+ statement.setString(1, uuid.toString());
+ statement.executeUpdate();
+ }
+ }));
+ }
+
+ public void deleteStackedEntities(List entities) {
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ String deleteStackedEntities = "DELETE FROM " + this.getTablePrefix() + "stacked_entities WHERE uuid = ?";
+ try (PreparedStatement statement = connection.prepareStatement(deleteStackedEntities)) {
+ for (StackedEntity entity : entities) {
+ if (entity == null) continue;
+ statement.setString(1, entity.getUniqueId().toString());
+ statement.addBatch();
+ }
+ statement.executeBatch();
+ }
}));
}
@@ -76,6 +209,59 @@ public class DataManager extends DataManagerAbstract {
}));
}
+ public void deleteBlock(BlockStack blockStack) {
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ String deleteBlock = "DELETE FROM " + this.getTablePrefix() + "blocks WHERE id = ?";
+ try (PreparedStatement statement = connection.prepareStatement(deleteBlock)) {
+ statement.setInt(1, blockStack.getId());
+ statement.executeUpdate();
+ }
+ }));
+ }
+
+ public void getEntities(Consumer