From 38122d8f1705351477419b4ddd8e9ef2e1852362 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 28 Jul 2020 21:56:51 -0700 Subject: [PATCH 1/2] Furnace ownership tweaks --- Changelog.txt | 3 +- .../nossr50/datatypes/meta/UUIDMeta.java | 20 +++++++ .../nossr50/listeners/BlockListener.java | 5 +- .../nossr50/listeners/InventoryListener.java | 7 +-- .../runnables/skills/FurnaceCleanupTask.java | 23 ------- .../nossr50/skills/smelting/Smelting.java | 16 ----- .../util/compat/CompatibilityManager.java | 40 +++++++------ .../util/compat/CompatibilityType.java | 3 +- .../layers/AbstractCompatibilityLayer.java | 7 --- .../layers/AbstractNMSCompatibilityLayer.java | 30 ++++++++++ ...rAttackCooldownExploitPreventionLayer.java | 2 +- ...rAttackCooldownExploitPreventionLayer.java | 5 +- .../PlayerAttackCooldownMethods.java | 2 +- .../AbstractPersistentDataLayer.java | 19 ++++++ .../SpigotPersistentDataLayer.java | 60 +++++++++++++++++++ .../SpigotTemporaryDataLayer.java | 44 ++++++++++++++ .../nossr50/util/skills/SmeltingTracker.java | 56 ++++++++--------- 17 files changed, 234 insertions(+), 108 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/datatypes/meta/UUIDMeta.java delete mode 100644 src/main/java/com/gmail/nossr50/runnables/skills/FurnaceCleanupTask.java create mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/AbstractNMSCompatibilityLayer.java rename src/main/java/com/gmail/nossr50/util/compat/layers/{ => attackcooldown}/DummyPlayerAttackCooldownExploitPreventionLayer.java (93%) rename src/main/java/com/gmail/nossr50/util/compat/layers/{ => attackcooldown}/PlayerAttackCooldownExploitPreventionLayer.java (97%) rename src/main/java/com/gmail/nossr50/util/compat/layers/{ => attackcooldown}/PlayerAttackCooldownMethods.java (92%) create mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java create mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java create mode 100644 src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java diff --git a/Changelog.txt b/Changelog.txt index f35b40083..9672cf99b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ Version 2.1.136 - Furnace ownership was made more reliable + Furnace ownership is no longer lost when the furnace stops doing a job + Furnaces remember owners between restarts (requires MC 1.14 or higher) Version 2.1.135 Furnaces no longer simulate block break checks when assigning ownership as it caused some unwanted plugin conflicts diff --git a/src/main/java/com/gmail/nossr50/datatypes/meta/UUIDMeta.java b/src/main/java/com/gmail/nossr50/datatypes/meta/UUIDMeta.java new file mode 100644 index 000000000..3ba795def --- /dev/null +++ b/src/main/java/com/gmail/nossr50/datatypes/meta/UUIDMeta.java @@ -0,0 +1,20 @@ +package com.gmail.nossr50.datatypes.meta; + +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +public class UUIDMeta extends FixedMetadataValue { + /** + * Initializes a FixedMetadataValue with an Object + * + * @param owningPlugin the {@link Plugin} that created this metadata value + * @param value the value assigned to this metadata value + */ + public UUIDMeta(@NotNull Plugin owningPlugin, @Nullable UUID value) { + super(owningPlugin, value); + } +} diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 6fee064e9..a4a7258b3 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -18,7 +18,6 @@ import com.gmail.nossr50.skills.herbalism.HerbalismManager; import com.gmail.nossr50.skills.mining.MiningManager; import com.gmail.nossr50.skills.repair.Repair; import com.gmail.nossr50.skills.salvage.Salvage; -import com.gmail.nossr50.skills.smelting.Smelting; import com.gmail.nossr50.skills.woodcutting.WoodcuttingManager; import com.gmail.nossr50.util.BlockUtils; import com.gmail.nossr50.util.EventUtils; @@ -39,10 +38,8 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.*; import org.bukkit.inventory.ItemStack; -import org.bukkit.metadata.MetadataValue; import java.util.HashSet; -import java.util.List; public class BlockListener implements Listener { private final mcMMO plugin; @@ -666,7 +663,7 @@ public class BlockListener implements Listener { if(mcMMO.getSmeltingTracker().isFurnaceOwned(furnace)) { player.sendMessage("[mcMMO DEBUG] This furnace has a registered owner"); - OfflinePlayer furnacePlayer = mcMMO.getSmeltingTracker().getPlayerFromFurnace(furnace); + OfflinePlayer furnacePlayer = mcMMO.getSmeltingTracker().getFurnaceOwner(furnace); if(furnacePlayer != null) { player.sendMessage("[mcMMO DEBUG] This furnace is owned by player "+furnacePlayer.getName()); diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index 196131717..0052f1644 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -8,7 +8,6 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.events.fake.FakeBrewEvent; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.runnables.player.PlayerUpdateInventoryTask; -import com.gmail.nossr50.runnables.skills.FurnaceCleanupTask; import com.gmail.nossr50.skills.alchemy.Alchemy; import com.gmail.nossr50.skills.alchemy.AlchemyPotionBrewer; import com.gmail.nossr50.util.ItemUtils; @@ -56,7 +55,7 @@ public class InventoryListener implements Listener { Furnace furnace = (Furnace) furnaceState; - OfflinePlayer offlinePlayer = mcMMO.getSmeltingTracker().getPlayerFromFurnace(furnace); + OfflinePlayer offlinePlayer = mcMMO.getSmeltingTracker().getFurnaceOwner(furnace); if(offlinePlayer != null && offlinePlayer.isOnline()) { @@ -94,7 +93,7 @@ public class InventoryListener implements Listener { if(blockState instanceof Furnace) { Furnace furnace = (Furnace) blockState; - OfflinePlayer offlinePlayer = mcMMO.getSmeltingTracker().getPlayerFromFurnace(furnace); + OfflinePlayer offlinePlayer = mcMMO.getSmeltingTracker().getFurnaceOwner(furnace); if(offlinePlayer != null) { @@ -105,8 +104,6 @@ public class InventoryListener implements Listener { event.setResult(offlineProfile.getSmeltingManager().smeltProcessing(smelting, event.getResult())); } } - - new FurnaceCleanupTask(furnace).runTaskLater(mcMMO.p, 1); } } diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/FurnaceCleanupTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/FurnaceCleanupTask.java deleted file mode 100644 index 873a6f507..000000000 --- a/src/main/java/com/gmail/nossr50/runnables/skills/FurnaceCleanupTask.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.gmail.nossr50.runnables.skills; - -import com.gmail.nossr50.mcMMO; -import org.bukkit.block.Furnace; -import org.bukkit.scheduler.BukkitRunnable; - -public class FurnaceCleanupTask extends BukkitRunnable { - - private final Furnace furnace; - - public FurnaceCleanupTask(Furnace furnace) { - this.furnace = furnace; - } - - @Override - public void run() { - if(furnace != null - && furnace.getInventory().getSmelting() == null) { - //Furnace is empty so stop tracking it - mcMMO.getSmeltingTracker().untrackFurnace(furnace); - } - } -} diff --git a/src/main/java/com/gmail/nossr50/skills/smelting/Smelting.java b/src/main/java/com/gmail/nossr50/skills/smelting/Smelting.java index e196eb4ef..c6bbccac1 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/Smelting.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/Smelting.java @@ -2,24 +2,8 @@ package com.gmail.nossr50.skills.smelting; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; -import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.EventUtils; -import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.player.UserManager; -import com.gmail.nossr50.util.skills.RankUtils; -import org.bukkit.Bukkit; -import org.bukkit.OfflinePlayer; -import org.bukkit.block.Furnace; -import org.bukkit.entity.Player; -import org.bukkit.inventory.FurnaceInventory; -import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import org.bukkit.metadata.MetadataValue; -import org.jetbrains.annotations.Nullable; - -import java.util.HashMap; -import java.util.List; public class Smelting { diff --git a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java index 67eededab..d601f2d99 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -3,7 +3,10 @@ package com.gmail.nossr50.util.compat; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.StringUtils; -import com.gmail.nossr50.util.compat.layers.PlayerAttackCooldownExploitPreventionLayer; +import com.gmail.nossr50.util.compat.layers.attackcooldown.PlayerAttackCooldownExploitPreventionLayer; +import com.gmail.nossr50.util.compat.layers.persistentdata.AbstractPersistentDataLayer; +import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer; +import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotTemporaryDataLayer; import com.gmail.nossr50.util.nms.NMSVersion; import com.gmail.nossr50.util.platform.MinecraftGameVersion; import org.bukkit.command.CommandSender; @@ -24,6 +27,7 @@ public class CompatibilityManager { /* Compatibility Layers */ private PlayerAttackCooldownExploitPreventionLayer playerAttackCooldownExploitPreventionLayer; + private AbstractPersistentDataLayer persistentDataLayer; public CompatibilityManager(MinecraftGameVersion minecraftGameVersion) { mcMMO.p.getLogger().info("Loading compatibility layers..."); @@ -42,6 +46,10 @@ public class CompatibilityManager { supportedLayers = new HashMap<>(); //Init map for(CompatibilityType compatibilityType : CompatibilityType.values()) { + //TODO: Remove later + if(compatibilityType == CompatibilityType.PLAYER_ATTACK_COOLDOWN_EXPLOIT_PREVENTION) + continue; + supportedLayers.put(compatibilityType, false); //All layers are set to false when initialized } } @@ -51,26 +59,21 @@ public class CompatibilityManager { * For any unsupported layers, load a dummy layer */ private void initCompatibilityLayers() { - isFullyCompatibleServerSoftware = true; + initPersistentDataLayer(); -// if(nmsVersion == NMSVersion.UNSUPPORTED) { -// mcMMO.p.getLogger().info("NMS not supported for this version of Minecraft, possible solutions include updating mcMMO or updating your server software. NMS Support is not available on every version of Minecraft."); -// mcMMO.p.getLogger().info("Certain features of mcMMO that require NMS will be disabled, you can check what is disabled by running the /mmocompat command!"); -// //Load dummy compatibility layers -// isFullyCompatibleServerSoftware = false; -// loadDummyCompatibilityLayers(); -// } else { -// playerAttackCooldownExploitPreventionLayer = new PlayerAttackCooldownExploitPreventionLayer(nmsVersion); -// -// //Mark as operational -// if(playerAttackCooldownExploitPreventionLayer.noErrorsOnInitialize()) { -// supportedLayers.put(CompatibilityType.PLAYER_ATTACK_COOLDOWN_EXPLOIT_PREVENTION, true); -// } -// } + isFullyCompatibleServerSoftware = true; } - private void loadDummyCompatibilityLayers() { + private void initPersistentDataLayer() { + if(minecraftGameVersion.getMinorVersion().asInt() >= 14 || minecraftGameVersion.getMajorVersion().asInt() >= 2) { + persistentDataLayer = new SpigotPersistentDataLayer(); + } else { + + persistentDataLayer = new SpigotTemporaryDataLayer(); + } + + supportedLayers.put(CompatibilityType.PERSISTENT_DATA, true); } //TODO: move to text manager @@ -128,4 +131,7 @@ public class CompatibilityManager { return playerAttackCooldownExploitPreventionLayer; } + public AbstractPersistentDataLayer getPersistentDataLayer() { + return persistentDataLayer; + } } diff --git a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityType.java b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityType.java index 36aa43bc9..3304982c7 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityType.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityType.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.util.compat; public enum CompatibilityType { - PLAYER_ATTACK_COOLDOWN_EXPLOIT_PREVENTION + PLAYER_ATTACK_COOLDOWN_EXPLOIT_PREVENTION, + PERSISTENT_DATA } diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/AbstractCompatibilityLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/AbstractCompatibilityLayer.java index 68a16938a..2ae4a61e1 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/AbstractCompatibilityLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/AbstractCompatibilityLayer.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.util.compat.layers; import com.gmail.nossr50.util.compat.CompatibilityLayer; -import com.gmail.nossr50.util.nms.NMSVersion; -import org.jetbrains.annotations.NotNull; /** * @@ -13,11 +11,6 @@ import org.jetbrains.annotations.NotNull; public abstract class AbstractCompatibilityLayer implements CompatibilityLayer { protected boolean noErrorsOnInitialize = true; - protected final @NotNull NMSVersion nmsVersion; - - public AbstractCompatibilityLayer(@NotNull NMSVersion nmsVersion) { - this.nmsVersion = nmsVersion; - } /** * Initialize the CompatibilityLayer diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/AbstractNMSCompatibilityLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/AbstractNMSCompatibilityLayer.java new file mode 100644 index 000000000..05136c189 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/AbstractNMSCompatibilityLayer.java @@ -0,0 +1,30 @@ +package com.gmail.nossr50.util.compat.layers; + +import com.gmail.nossr50.util.nms.NMSVersion; +import org.jetbrains.annotations.NotNull; + +/** + * + * These classes are a band-aid solution for adding NMS support into 2.1.XXX + * In 2.2 we are switching to modules and that will clean things up significantly + * + */ +public abstract class AbstractNMSCompatibilityLayer extends AbstractCompatibilityLayer { + + protected final @NotNull NMSVersion nmsVersion; + + public AbstractNMSCompatibilityLayer(@NotNull NMSVersion nmsVersion) { + this.nmsVersion = nmsVersion; + } + + /** + * Initialize the CompatibilityLayer + * @return true if the CompatibilityLayer initialized and should be functional + */ + public abstract boolean initializeLayer(); + + @Override + public boolean noErrorsOnInitialize() { + return noErrorsOnInitialize; + } +} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/DummyPlayerAttackCooldownExploitPreventionLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownExploitPreventionLayer.java similarity index 93% rename from src/main/java/com/gmail/nossr50/util/compat/layers/DummyPlayerAttackCooldownExploitPreventionLayer.java rename to src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownExploitPreventionLayer.java index 79b67138f..39fe4d73e 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/DummyPlayerAttackCooldownExploitPreventionLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownExploitPreventionLayer.java @@ -1,4 +1,4 @@ -package com.gmail.nossr50.util.compat.layers; +package com.gmail.nossr50.util.compat.layers.attackcooldown; import com.gmail.nossr50.util.nms.NMSVersion; import org.bukkit.entity.Player; diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/PlayerAttackCooldownExploitPreventionLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownExploitPreventionLayer.java similarity index 97% rename from src/main/java/com/gmail/nossr50/util/compat/layers/PlayerAttackCooldownExploitPreventionLayer.java rename to src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownExploitPreventionLayer.java index 46769536f..4bcfb6303 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/PlayerAttackCooldownExploitPreventionLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownExploitPreventionLayer.java @@ -1,6 +1,7 @@ -package com.gmail.nossr50.util.compat.layers; +package com.gmail.nossr50.util.compat.layers.attackcooldown; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.compat.layers.AbstractNMSCompatibilityLayer; import com.gmail.nossr50.util.nms.NMSConstants; import com.gmail.nossr50.util.nms.NMSVersion; import org.bukkit.entity.Player; @@ -16,7 +17,7 @@ import java.lang.reflect.Method; * In 2.2 we are switching to modules and that will clean things up significantly * */ -public class PlayerAttackCooldownExploitPreventionLayer extends AbstractCompatibilityLayer implements PlayerAttackCooldownMethods{ +public class PlayerAttackCooldownExploitPreventionLayer extends AbstractNMSCompatibilityLayer implements PlayerAttackCooldownMethods{ private final String cbNMSVersionPath; diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/PlayerAttackCooldownMethods.java b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownMethods.java similarity index 92% rename from src/main/java/com/gmail/nossr50/util/compat/layers/PlayerAttackCooldownMethods.java rename to src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownMethods.java index ae7cd9ae8..b5372987f 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/PlayerAttackCooldownMethods.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownMethods.java @@ -1,4 +1,4 @@ -package com.gmail.nossr50.util.compat.layers; +package com.gmail.nossr50.util.compat.layers.attackcooldown; import org.bukkit.entity.Player; diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java new file mode 100644 index 000000000..0cd936c2d --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/AbstractPersistentDataLayer.java @@ -0,0 +1,19 @@ +package com.gmail.nossr50.util.compat.layers.persistentdata; + +import com.gmail.nossr50.util.compat.layers.AbstractCompatibilityLayer; +import org.bukkit.block.Furnace; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +public abstract class AbstractPersistentDataLayer extends AbstractCompatibilityLayer { + + public AbstractPersistentDataLayer() { + initializeLayer(); + } + + public abstract @Nullable UUID getFurnaceOwner(Furnace furnace); + + public abstract void setFurnaceOwner(Furnace furnace, UUID uuid); + +} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java new file mode 100644 index 000000000..a3672ae6f --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java @@ -0,0 +1,60 @@ +package com.gmail.nossr50.util.compat.layers.persistentdata; + +import com.gmail.nossr50.mcMMO; +import org.bukkit.Bukkit; +import org.bukkit.NamespacedKey; +import org.bukkit.block.Furnace; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataHolder; +import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +public class SpigotPersistentDataLayer extends AbstractPersistentDataLayer { + + private NamespacedKey furnaceOwner_MostSig_Key; + private NamespacedKey furnaceOwner_LeastSig_Key; + + @Override + public boolean initializeLayer() { + initNamespacedKeys(); + return true; + } + + private void initNamespacedKeys() { + furnaceOwner_MostSig_Key = getNamespacedKey("furnace_uuid_most_sig"); + furnaceOwner_LeastSig_Key = getNamespacedKey("furnace_uuid_least_sig"); + } + + @NotNull + public NamespacedKey getNamespacedKey(String key) { + return new NamespacedKey(mcMMO.p, key); + } + + @Override + public @Nullable UUID getFurnaceOwner(Furnace furnace) { + //Get container from entity + PersistentDataContainer dataContainer = ((PersistentDataHolder) furnace).getPersistentDataContainer(); + + Long mostSigBits = dataContainer.get(furnaceOwner_MostSig_Key, PersistentDataType.LONG); + Long leastSigBits = dataContainer.get(furnaceOwner_LeastSig_Key, PersistentDataType.LONG); + + if(mostSigBits != null && leastSigBits != null) { + return new UUID(mostSigBits, leastSigBits); + } else { + return null; + } + } + + @Override + public void setFurnaceOwner(Furnace furnace, UUID uuid) { + PersistentDataContainer dataContainer = ((PersistentDataHolder) furnace).getPersistentDataContainer(); + + dataContainer.set(furnaceOwner_MostSig_Key, PersistentDataType.LONG, uuid.getMostSignificantBits()); + dataContainer.set(furnaceOwner_LeastSig_Key, PersistentDataType.LONG, uuid.getLeastSignificantBits()); + + furnace.update(); + } +} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java new file mode 100644 index 000000000..a912520b4 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotTemporaryDataLayer.java @@ -0,0 +1,44 @@ +package com.gmail.nossr50.util.compat.layers.persistentdata; + +import com.gmail.nossr50.datatypes.meta.UUIDMeta; +import com.gmail.nossr50.mcMMO; +import org.bukkit.block.Furnace; +import org.bukkit.metadata.Metadatable; + +import java.util.UUID; + +/** + * Persistent Data API is unavailable + */ +public class SpigotTemporaryDataLayer extends AbstractPersistentDataLayer { + + private final String FURNACE_OWNER_METADATA_KEY = "mcMMO_furnace_owner"; + + @Override + public boolean initializeLayer() { + return true; + } + + @Override + public UUID getFurnaceOwner(Furnace furnace) { + Metadatable metadatable = (Metadatable) furnace; + + if(metadatable.getMetadata(FURNACE_OWNER_METADATA_KEY).size() > 0) { + UUIDMeta uuidMeta = (UUIDMeta) metadatable.getMetadata(FURNACE_OWNER_METADATA_KEY).get(0); + return (UUID) uuidMeta.value(); + } else { + return null; + } + } + + @Override + public void setFurnaceOwner(Furnace furnace, UUID uuid) { + Metadatable metadatable = (Metadatable) furnace; + + if(metadatable.getMetadata(FURNACE_OWNER_METADATA_KEY).size() > 0) { + metadatable.removeMetadata(FURNACE_OWNER_METADATA_KEY, mcMMO.p); + } + + metadatable.setMetadata(FURNACE_OWNER_METADATA_KEY, new UUIDMeta(mcMMO.p, uuid)); + } +} diff --git a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java index c0cd97773..91faf30d9 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java @@ -3,8 +3,6 @@ package com.gmail.nossr50.util.skills; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.skills.smelting.Smelting; -import com.gmail.nossr50.util.EventUtils; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.player.UserManager; import org.bukkit.Bukkit; @@ -16,15 +14,11 @@ import org.bukkit.inventory.FurnaceInventory; import org.bukkit.inventory.Inventory; import org.jetbrains.annotations.Nullable; -import java.util.HashMap; +import java.util.UUID; public class SmeltingTracker { - private final HashMap furnaceOwners; - - public SmeltingTracker() { - furnaceOwners = new HashMap<>(); - } +// private final HashMap furnaceOwners; private void changeFurnaceOwnership(Furnace furnace, Player player) { @@ -37,7 +31,11 @@ public class SmeltingTracker { printOwnershipLossDebug(furnace); - furnaceOwners.put(furnace, player); + setFurnaceOwner(furnace, player); + } + + private void setFurnaceOwner(Furnace furnace, Player player) { + mcMMO.getCompatibilityManager().getPersistentDataLayer().setFurnaceOwner(furnace, player.getUniqueId()); } private void printOwnershipGainDebug(Furnace furnace, McMMOPlayer mcMMOPlayer) { @@ -52,23 +50,31 @@ public class SmeltingTracker { } private void printOwnershipLossDebug(Furnace furnace) { - if(furnaceOwners.get(furnace) != null) { - OfflinePlayer furnaceOwner = furnaceOwners.get(furnace); + OfflinePlayer furnaceOwner = getFurnaceOwner(furnace); - if(furnaceOwner.isOnline()) { - McMMOPlayer furnaceOwnerProfile = UserManager.getPlayer(furnaceOwner.getPlayer()); + if(furnaceOwner != null && furnaceOwner.isOnline()) { + McMMOPlayer furnaceOwnerProfile = UserManager.getPlayer(furnaceOwner.getPlayer()); - if(furnaceOwnerProfile != null) { - if(furnaceOwnerProfile.isDebugMode()) { - furnaceOwnerProfile.getPlayer().sendMessage("Furnace ownership " + - ChatColor.RED + "lost " + ChatColor.RESET + - "at location: " + furnace.getLocation().toString()); - } + if(furnaceOwnerProfile != null) { + if(furnaceOwnerProfile.isDebugMode()) { + furnaceOwnerProfile.getPlayer().sendMessage("Furnace ownership " + + ChatColor.RED + "lost " + ChatColor.RESET + + "at location: " + furnace.getLocation().toString()); } } } } + public @Nullable OfflinePlayer getFurnaceOwner(Furnace furnace) { + UUID uuid = mcMMO.getCompatibilityManager().getPersistentDataLayer().getFurnaceOwner(furnace); + + if(uuid != null) { + return Bukkit.getOfflinePlayer(uuid); + } else { + return null; + } + } + @Nullable public Furnace getFurnaceFromInventory(Inventory inventory) { if (!(inventory instanceof FurnaceInventory)) { @@ -78,13 +84,8 @@ public class SmeltingTracker { return (Furnace) inventory.getHolder(); } - @Nullable - public OfflinePlayer getPlayerFromFurnace(Furnace furnace) { - return furnaceOwners.get(furnace); - } - public boolean isFurnaceOwned(Furnace furnace) { - return furnaceOwners.get(furnace) != null; + return getFurnaceOwner(furnace) != null; } public void processFurnaceOwnership(Furnace furnace, Player player) { @@ -93,9 +94,4 @@ public class SmeltingTracker { changeFurnaceOwnership(furnace, player); } - - public void untrackFurnace(Furnace furnace) { - printOwnershipLossDebug(furnace); - furnaceOwners.remove(furnace); - } } From 270298c2650065141036bf09102952b501ba370a Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 29 Jul 2020 07:41:47 -0700 Subject: [PATCH 2/2] 2.1.136 --- Changelog.txt | 5 +++++ pom.xml | 2 +- .../layers/persistentdata/SpigotPersistentDataLayer.java | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 9672cf99b..1808d6e88 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,6 +2,11 @@ Version 2.1.136 Furnace ownership is no longer lost when the furnace stops doing a job Furnaces remember owners between restarts (requires MC 1.14 or higher) + NOTES: + I'm making use of a Spigot API for persistent data for versions of MC 1.14 and above, for versions below the data will be temporary as it has been up until this point. + In the future I'll wire up NMS to make use of NBT and all versions will have persistent data support. + + Version 2.1.135 Furnaces no longer simulate block break checks when assigning ownership as it caused some unwanted plugin conflicts Fixed an issue where Fishing would break if exploit protection was turned off for Fishing (Thanks Ineusia) diff --git a/pom.xml b/pom.xml index 2aaffa568..8e60ce5b1 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.136-SNAPSHOT + 2.1.136 mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java index a3672ae6f..87727ad42 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/persistentdata/SpigotPersistentDataLayer.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.util.compat.layers.persistentdata; import com.gmail.nossr50.mcMMO; -import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; import org.bukkit.block.Furnace; import org.bukkit.persistence.PersistentDataContainer; @@ -38,6 +37,7 @@ public class SpigotPersistentDataLayer extends AbstractPersistentDataLayer { //Get container from entity PersistentDataContainer dataContainer = ((PersistentDataHolder) furnace).getPersistentDataContainer(); + //Too lazy to make a custom data type for this stuff Long mostSigBits = dataContainer.get(furnaceOwner_MostSig_Key, PersistentDataType.LONG); Long leastSigBits = dataContainer.get(furnaceOwner_LeastSig_Key, PersistentDataType.LONG);