From 7a5e8241aa6faba153c796157b48d93c4c82aeea Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 29 Mar 2017 16:27:26 +0100 Subject: [PATCH] Implement more elements of persistence --- .../src/mineplex/gemhunters/GemHunters.java | 2 + .../gemhunters/death/quitnpc/QuitNPC.java | 43 ---------- .../death/quitnpc/QuitNPCModule.java | 3 +- .../mineplex/gemhunters/join/JoinModule.java | 79 +++++++++++++++++++ .../persistence/PersistenceData.java | 38 ++++++++- .../persistence/PersistenceModule.java | 38 +++++---- .../persistence/PersistenceRepository.java | 54 +++++++++++-- .../gemhunters/quest/QuestModule.java | 10 +-- .../gemhunters/spawn/SpawnModule.java | 1 - .../gemhunters/world/WorldListeners.java | 2 +- 10 files changed, 195 insertions(+), 75 deletions(-) create mode 100644 Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/GemHunters.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/GemHunters.java index 0edc77dd1..8d4ea4135 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/GemHunters.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/GemHunters.java @@ -2,6 +2,7 @@ package mineplex.gemhunters; import mineplex.core.task.TaskManager; import mineplex.core.texttutorial.TextTutorialManager; +import mineplex.gemhunters.join.JoinModule; import mineplex.gemhunters.persistence.PersistenceModule; import mineplex.gemhunters.tutorial.GemHuntersTutorial; import net.minecraft.server.v1_8_R3.MinecraftServer; @@ -281,6 +282,7 @@ public class GemHunters extends JavaPlugin require(InventoryModule.class); require(LootModule.class); require(ItemMapModule.class); + require(JoinModule.class); require(ModerationModule.class); require(MountModule.class); require(PersistenceModule.class); diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPC.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPC.java index c0b5f38c1..5a860af08 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPC.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPC.java @@ -50,15 +50,8 @@ public class QuitNPC implements Listener private final UUID _uuid; private final PlayerInventory _inventory; - // Unlocked Slots - private final int _slotsUnlocked; - - // Gems private final int _gems; - // Quests - private final QuestPlayerData _questPlayerData; - public QuitNPC(QuitNPCModule npc, Player player, long quitMills) { // Managers @@ -91,47 +84,11 @@ public class QuitNPC implements Listener _name = player.getName(); _uuid = player.getUniqueId(); _inventory = player.getInventory(); - - // Unlocked Slots - _slotsUnlocked = Managers.get(InventoryModule.class).getSlotsUnlocked(player); - - // Gems _gems = Managers.get(EconomyModule.class).Get(player); - // Quests - _questPlayerData = Managers.get(QuestModule.class).Get(player); - UtilServer.RegisterEvents(this); } - public void restore(Player player) - { - // Player - player.getInventory().clear(); - player.teleport(_entity.getLocation()); - player.setHealth(_entity.getHealth()); - - // Inventory - int i = 0; - for (ItemStack itemStack : _inventory.getContents()) - { - player.getInventory().setItem(i++, itemStack); - } - - player.getInventory().setArmorContents(_inventory.getArmorContents()); - - // Unlocked Slots - Managers.get(InventoryModule.class).setSlotsUnlocked(player, _slotsUnlocked); - - // Gems - // Subtract GEM_START_COST (100 by default) because EconomyModule adds - // this value on join regardless if they have an NPC. - Managers.get(EconomyModule.class).setStore(player, _gems - EconomyModule.GEM_START_COST); - - // Quests - Managers.require(QuestModule.class).setPlayerData(player, _questPlayerData); - } - public void despawn(boolean pluginRemove) { QuitNPCDespawnEvent event = new QuitNPCDespawnEvent(this, pluginRemove); diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCModule.java index 6ee5de84f..9ab4eb6d0 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCModule.java @@ -7,6 +7,7 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.TimeUnit; +import mineplex.core.common.util.UtilPlayer; import org.bukkit.GameMode; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -90,7 +91,7 @@ public class QuitNPCModule extends MiniPlugin { Player player = event.getPlayer(); - if (_tutorial.isInTutorial(player)) + if (UtilPlayer.isSpectator(player)) { return; } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java new file mode 100644 index 000000000..b9c13d109 --- /dev/null +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java @@ -0,0 +1,79 @@ +package mineplex.gemhunters.join; + +import mineplex.core.MiniPlugin; +import mineplex.core.ReflectivelyCreateMiniPlugin; +import mineplex.core.account.CoreClient; +import mineplex.core.account.CoreClientManager; +import mineplex.gemhunters.death.quitnpc.QuitNPC; +import mineplex.gemhunters.death.quitnpc.QuitNPCModule; +import mineplex.gemhunters.economy.EconomyModule; +import mineplex.gemhunters.persistence.PersistenceData; +import mineplex.gemhunters.persistence.PersistenceModule; +import mineplex.gemhunters.persistence.PersistenceRepository; +import mineplex.gemhunters.quest.QuestModule; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerJoinEvent; + +import java.util.function.Consumer; + +@ReflectivelyCreateMiniPlugin +public class JoinModule extends MiniPlugin +{ + + private final CoreClientManager _client; + private final EconomyModule _economy; + private final QuestModule _quest; + private final PersistenceModule _persistence; + private final QuitNPCModule _npc; + + private JoinModule() + { + super("Join"); + + _client = require(CoreClientManager.class); + _economy = require(EconomyModule.class); + _quest = require(QuestModule.class); + _persistence = require(PersistenceModule.class); + _npc = require(QuitNPCModule.class); + } + + @EventHandler + public void playerJoin(PlayerJoinEvent event) + { + Player player = event.getPlayer(); + CoreClient client = _client.Get(player); + PersistenceRepository repository = _persistence.getRepository(); + Consumer response = data -> + { + _economy.setStore(player, data.getGems()); + _quest.setPlayerData(player, data.getQuestData()); + player.teleport(data.getLocation()); + player.setHealth(data.getHealth()); + player.setMaxHealth(data.getMaxHealth()); + player.setFoodLevel(data.getHunger()); + player.getInventory().clear(); + player.getInventory().addItem(data.getItems()); + player.getInventory().setArmorContents(data.getArmour()); + }; + + player.getInventory().clear(); + + runAsync(() -> + { + repository.getPersistenceData(response, client); + + if (_npc.hasNPC(player)) + { + QuitNPC npc = _npc.getNPC(player); + npc.despawn(true); + } + + if (repository.exists(client)) + { + + } + }); + } + +} diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceData.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceData.java index f0788c04c..dd0362ea8 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceData.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceData.java @@ -2,6 +2,7 @@ package mineplex.gemhunters.persistence; import mineplex.gemhunters.quest.QuestPlayerData; import org.bukkit.Location; +import org.bukkit.inventory.ItemStack; public class PersistenceData { @@ -9,12 +10,22 @@ public class PersistenceData private final int _gems; private final Location _location; private final QuestPlayerData _questData; + private final int _health; + private final int _maxHealth; + private final int _hunger; + private final ItemStack[] _items; + private final ItemStack[] _armour; - public PersistenceData(int gems, Location location, QuestPlayerData questData) + public PersistenceData(int gems, Location location, QuestPlayerData questData, int health, int maxHealth, int hunger, ItemStack[] items, ItemStack[] armour) { _gems = gems; _location = location; _questData = questData; + _health = health; + _maxHealth = maxHealth; + _hunger = hunger; + _items = items; + _armour = armour; } public int getGems() @@ -32,4 +43,29 @@ public class PersistenceData return _questData; } + public int getHealth() + { + return _health; + } + + public int getMaxHealth() + { + return _maxHealth; + } + + public int getHunger() + { + return _hunger; + } + + public ItemStack[] getItems() + { + return _items; + } + + public ItemStack[] getArmour() + { + return _armour; + } + } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java index 1b0702979..5e767abc5 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java @@ -5,14 +5,21 @@ import mineplex.core.ReflectivelyCreateMiniPlugin; import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; import mineplex.gemhunters.death.event.QuitNPCDespawnEvent; +import mineplex.gemhunters.economy.CashOutModule; import mineplex.gemhunters.economy.EconomyModule; import mineplex.gemhunters.quest.QuestModule; +import mineplex.gemhunters.quest.QuestPlayerData; +import net.minecraft.server.v1_8_R3.EntityItemFrame; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.inventory.ItemStack; @ReflectivelyCreateMiniPlugin public class PersistenceModule extends MiniPlugin @@ -35,26 +42,22 @@ public class PersistenceModule extends MiniPlugin _repository = new PersistenceRepository(); } - @EventHandler(priority = EventPriority.HIGHEST) - public void playerJoin(PlayerJoinEvent event) - { - Player player = event.getPlayer(); - CoreClient client = _client.Get(player); - - runAsync(() -> _repository.getPersistenceData(response -> - { - _economy.setStore(player, response.getGems()); - player.teleport(response.getLocation()); - _quest.setPlayerData(player, response.getQuestData()); - }, client)); - } - @EventHandler public void playerQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); CoreClient client = _client.Get(player); - PersistenceData data = new PersistenceData(_economy.Get(player), player.getLocation(), _quest.Get(player)); + + int gems = _economy.Get(player); + Location location = player.getLocation(); + QuestPlayerData quest = _quest.Get(player); + int health = (int) player.getHealth(); + int maxHealth = (int) player.getMaxHealth(); + int hunger = player.getFoodLevel(); + ItemStack[] items = player.getInventory().getContents(); + ItemStack[] armour = player.getInventory().getArmorContents(); + + PersistenceData data = new PersistenceData(gems, location, quest, health, maxHealth, hunger, items, armour); runAsync(() -> _repository.savePersistence(client, data)); } @@ -76,4 +79,9 @@ public class PersistenceModule extends MiniPlugin runAsync(() -> _client.getOrLoadClient(event.getNpc().getName(), _repository::deletePersistence)); } } + + public final PersistenceRepository getRepository() + { + return _repository; + } } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceRepository.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceRepository.java index 3b2c2c6f8..5d5242d1e 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceRepository.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceRepository.java @@ -10,6 +10,8 @@ import mineplex.serverdata.database.column.ColumnInt; import mineplex.serverdata.database.column.ColumnVarChar; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; import java.sql.Connection; import java.sql.ResultSet; @@ -22,8 +24,8 @@ public class PersistenceRepository extends RepositoryBase { private static final String GET_DATA = "SELECT * FROM gemHunters WHERE accountId=?;"; - private static final String INSERT_DATA = "INSERT INTO gemHunters VALUES (?,?,?,?,?,?,?,?);"; - private static final String UPDATE_DATA = "UPDATE gemHunters SET gems=?,x=?,y=?,z=?,yaw=?,pitch=?,quests=? WHERE accountId=?;"; + private static final String INSERT_DATA = "INSERT INTO gemHunters VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?);"; + private static final String UPDATE_DATA = "UPDATE gemHunters SET gems=?,health=?,maxHealth=?,hunger=?,x=?,y=?,z=?,yaw=?,pitch=?,quests=?,items=?,armour=? WHERE accountId=?;"; private static final String DELETE_DATA = "DELETE FROM gemHunters WHERE accountId=?;"; private static final Gson GSON; @@ -50,6 +52,9 @@ public class PersistenceRepository extends RepositoryBase if (resultSet.next()) { int gems = resultSet.getInt("gems"); + int health = resultSet.getInt("health"); + int maxHealth = resultSet.getInt("maxHealth"); + int hunger = resultSet.getInt("hunger"); int x = resultSet.getInt("x"); int y = resultSet.getInt("y"); int z = resultSet.getInt("z"); @@ -57,9 +62,15 @@ public class PersistenceRepository extends RepositoryBase int pitch = resultSet.getInt("pitch"); String quests = resultSet.getString("quests"); QuestPlayerData questData = GSON.fromJson(quests, QuestPlayerData.class); + String items = resultSet.getString("items"); + ItemStack[] itemsData = GSON.fromJson(items, ItemStack[].class); + String armour = resultSet.getString("armour"); + ItemStack[] armourData = GSON.fromJson(armour, ItemStack[].class); _exists.add(accountId); - PersistenceData data = new PersistenceData(gems, new Location(Bukkit.getWorlds().get(0), x, y, z, yaw, pitch), questData); + Location location = new Location(Bukkit.getWorlds().get(0), x, y, z, yaw, pitch); + + PersistenceData data = new PersistenceData(gems, location, questData, health, maxHealth, hunger, itemsData, armourData); response.accept(data); } }, new ColumnInt("accountId", accountId)); @@ -67,39 +78,67 @@ public class PersistenceRepository extends RepositoryBase public void savePersistence(CoreClient client, PersistenceData data) { + Bukkit.broadcastMessage("Saving data for " + client.getAccountId()); int accountId = client.getAccountId(); int gems = data.getGems(); + int health = data.getHealth(); + int maxHealth = data.getMaxHealth(); + int hunger = data.getHunger(); int x = data.getLocation().getBlockX(); int y = data.getLocation().getBlockY(); int z = data.getLocation().getBlockZ(); int yaw = (int) data.getLocation().getYaw(); int pitch = (int) data.getLocation().getPitch(); + ItemStack[] items = data.getItems(); - if (_exists.contains(accountId)) + for (int i = 0; i < items.length; i++) { + ItemStack itemStack = items[i]; + + if (itemStack != null && (itemStack.getType() == Material.EMERALD || itemStack.getType() == Material.MAP)) + { + Bukkit.broadcastMessage(itemStack.getType().name()); + items[i] = null; + } + } + + if (exists(client)) + { + Bukkit.broadcastMessage("Update"); executeUpdate(UPDATE_DATA, new ColumnInt("gems", gems), + new ColumnInt("health", health), + new ColumnInt("maxHealth", maxHealth), + new ColumnInt("hunger", hunger), new ColumnInt("x", x), new ColumnInt("y", y), new ColumnInt("z", z), new ColumnInt("yaw", yaw), new ColumnInt("pitch", pitch), new ColumnVarChar("quests", 500, GSON.toJson(data.getQuestData())), + new ColumnVarChar("items", 1000, GSON.toJson(data.getItems())), + new ColumnVarChar("armour", 100, GSON.toJson(data.getArmour())), new ColumnInt("accountId", accountId) ); } else { + Bukkit.broadcastMessage("Insert"); executeInsert(INSERT_DATA, null, new ColumnInt("accountId", accountId), new ColumnInt("gems", gems), + new ColumnInt("health", health), + new ColumnInt("maxHealth", maxHealth), + new ColumnInt("hunger", hunger), new ColumnInt("x", x), new ColumnInt("y", y), new ColumnInt("z", z), new ColumnInt("yaw", yaw), new ColumnInt("pitch", pitch), - new ColumnVarChar("quests", 500, GSON.toJson(data.getQuestData())) + new ColumnVarChar("quests", 500, GSON.toJson(data.getQuestData())), + new ColumnVarChar("items", 1000, GSON.toJson(data.getItems())), + new ColumnVarChar("armour", 100, GSON.toJson(data.getArmour())) ); } @@ -112,4 +151,9 @@ public class PersistenceRepository extends RepositoryBase executeUpdate(DELETE_DATA, new ColumnInt("accountId", accountId)); } + + public boolean exists(CoreClient client) + { + return _exists.contains(client.getAccountId()); + } } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/quest/QuestModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/quest/QuestModule.java index 342b1851c..da43ba06c 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/quest/QuestModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/quest/QuestModule.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; +import mineplex.core.common.util.*; import net.md_5.bungee.api.ChatColor; import org.bukkit.Bukkit; @@ -25,14 +26,7 @@ import org.bukkit.metadata.FixedMetadataValue; import mineplex.core.MiniClientPlugin; import mineplex.core.ReflectivelyCreateMiniPlugin; import mineplex.core.common.currency.GlobalCurrency; -import mineplex.core.common.util.C; -import mineplex.core.common.util.F; -import mineplex.core.common.util.UtilInv; -import mineplex.core.common.util.UtilItem; import mineplex.core.common.util.UtilItem.ItemAttribute; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilTextMiddle; -import mineplex.core.common.util.UtilTime; import mineplex.core.itemstack.ItemBuilder; import mineplex.core.menu.Menu; import mineplex.core.recharge.Recharge; @@ -491,7 +485,7 @@ public class QuestModule extends MiniClientPlugin @EventHandler public void debug(PlayerCommandPreprocessEvent event) { - if (event.getMessage().startsWith("/test")) + if (event.getMessage().startsWith("/questdatatest")) { event.setCancelled(true); Player player = event.getPlayer(); diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/spawn/SpawnModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/spawn/SpawnModule.java index 4898f6f0f..7d1025675 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/spawn/SpawnModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/spawn/SpawnModule.java @@ -83,7 +83,6 @@ public class SpawnModule extends MiniPlugin QuitNPC npc = _npc.getNPC(player); npc.despawn(true); - npc.restore(player); return; } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/world/WorldListeners.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/world/WorldListeners.java index 3688a3f17..b81b81279 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/world/WorldListeners.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/world/WorldListeners.java @@ -49,7 +49,7 @@ public class WorldListeners implements Listener plugin.getServer().getPluginManager().registerEvents(this, plugin); } - //@EventHandler + @EventHandler public void deletePlayerData(PlayerQuitEvent event) { _plugin.getServer().getScheduler().runTaskLater(_plugin, () -> {