|
@@ -2,11 +2,13 @@ package com.gmail.nossr50.listeners;
|
|
|
|
|
|
import com.gmail.nossr50.config.Config;
|
|
|
import com.gmail.nossr50.config.WorldBlacklist;
|
|
|
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
|
|
|
import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
|
|
|
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;
|
|
@@ -15,8 +17,10 @@ import com.gmail.nossr50.util.player.UserManager;
|
|
|
import com.gmail.nossr50.util.skills.SkillUtils;
|
|
|
import com.gmail.nossr50.worldguard.WorldGuardManager;
|
|
|
import com.gmail.nossr50.worldguard.WorldGuardUtils;
|
|
|
+import org.bukkit.Bukkit;
|
|
|
import org.bukkit.Location;
|
|
|
import org.bukkit.Material;
|
|
|
+import org.bukkit.OfflinePlayer;
|
|
|
import org.bukkit.block.Block;
|
|
|
import org.bukkit.block.BlockState;
|
|
|
import org.bukkit.block.BrewingStand;
|
|
@@ -28,10 +32,6 @@ import org.bukkit.event.EventPriority;
|
|
|
import org.bukkit.event.Listener;
|
|
|
import org.bukkit.event.inventory.*;
|
|
|
import org.bukkit.inventory.*;
|
|
|
-import org.bukkit.metadata.MetadataValue;
|
|
|
-import org.jetbrains.annotations.Nullable;
|
|
|
-
|
|
|
-import java.util.List;
|
|
|
|
|
|
public class InventoryListener implements Listener {
|
|
|
private final mcMMO plugin;
|
|
@@ -40,82 +40,6 @@ public class InventoryListener implements Listener {
|
|
|
this.plugin = plugin;
|
|
|
}
|
|
|
|
|
|
- @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
|
|
|
- public void onInventoryOpen(InventoryOpenEvent event) {
|
|
|
- /* WORLD BLACKLIST CHECK */
|
|
|
- if(WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld()))
|
|
|
- return;
|
|
|
-
|
|
|
- HumanEntity humanEntity = event.getPlayer();
|
|
|
- Player player = (Player) humanEntity;
|
|
|
-
|
|
|
- //Profile not loaded
|
|
|
- if(UserManager.getPlayer(player) == null)
|
|
|
- {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- if(event.getInventory() instanceof Furnace) {
|
|
|
-
|
|
|
- }
|
|
|
- Furnace furnace = getFurnace(event.getInventory());
|
|
|
-
|
|
|
- if (furnace != null) {
|
|
|
- if(isFurnaceAvailable(furnace, player)) {
|
|
|
- assignFurnace(furnace, player);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public boolean isFurnaceAvailable(Furnace furnace, Player player) {
|
|
|
- if(!furnace.hasMetadata(mcMMO.furnaceMetadataKey)
|
|
|
- && furnace.getMetadata(mcMMO.furnaceMetadataKey).size() == 0) {
|
|
|
- return true;
|
|
|
- } else {
|
|
|
- if(player != getPlayerFromFurnace(furnace)) {
|
|
|
-
|
|
|
- if(isFurnaceResultEmpty(furnace)) {
|
|
|
- return true;
|
|
|
- } else {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- public boolean isFurnaceResultEmpty(Furnace furnace) {
|
|
|
- return furnace.getInventory().getResult() == null;
|
|
|
- }
|
|
|
-
|
|
|
- public void assignFurnace(Furnace furnace, Player player) {
|
|
|
-
|
|
|
- if(furnace.hasMetadata(mcMMO.furnaceMetadataKey)) {
|
|
|
- furnace.removeMetadata(mcMMO.furnaceMetadataKey, mcMMO.p);
|
|
|
- }
|
|
|
-
|
|
|
- furnace.setMetadata(mcMMO.furnaceMetadataKey, UserManager.getPlayer(player).getPlayerMetadata());
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
|
|
- public void onInventoryClose(InventoryCloseEvent event) {
|
|
|
- /* WORLD BLACKLIST CHECK */
|
|
|
- if(WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld()))
|
|
|
- return;
|
|
|
-
|
|
|
- if(event.getInventory() instanceof FurnaceInventory) {
|
|
|
- if(getFurnace(event.getInventory()) != null) {
|
|
|
- Furnace furnace = getFurnace(event.getInventory());
|
|
|
-
|
|
|
- if(isFurnaceOwned(furnace) && isFurnaceResultEmpty(furnace)) {
|
|
|
- removeFurnaceOwner(furnace);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
|
|
public void onFurnaceBurnEvent(FurnaceBurnEvent event) {
|
|
|
/* WORLD BLACKLIST CHECK */
|
|
@@ -132,26 +56,27 @@ public class InventoryListener implements Listener {
|
|
|
|
|
|
Furnace furnace = (Furnace) furnaceState;
|
|
|
|
|
|
- Player player = getPlayerFromFurnace(furnace);
|
|
|
+ OfflinePlayer offlinePlayer = mcMMO.getSmeltingTracker().getPlayerFromFurnace(furnace);
|
|
|
|
|
|
- /* WORLD GUARD MAIN FLAG CHECK */
|
|
|
- if(WorldGuardUtils.isWorldGuardLoaded())
|
|
|
- {
|
|
|
- if(!WorldGuardManager.getInstance().hasMainFlag(player))
|
|
|
- return;
|
|
|
- }
|
|
|
+ if(offlinePlayer != null && offlinePlayer.isOnline()) {
|
|
|
|
|
|
- if (!UserManager.hasPlayerDataKey(player) || !Permissions.isSubSkillEnabled(player, SubSkillType.SMELTING_FUEL_EFFICIENCY)) {
|
|
|
- return;
|
|
|
- }
|
|
|
+ Player player = Bukkit.getPlayer(offlinePlayer.getUniqueId());
|
|
|
|
|
|
- //Profile not loaded
|
|
|
- if(UserManager.getPlayer(player) == null)
|
|
|
- {
|
|
|
- return;
|
|
|
+ if(player != null) {
|
|
|
+ if (!Permissions.isSubSkillEnabled(player, SubSkillType.SMELTING_FUEL_EFFICIENCY)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ //Profile doesn't exist
|
|
|
+ if(UserManager.getOfflinePlayer(offlinePlayer) == null)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ event.setBurnTime(UserManager.getPlayer(player).getSmeltingManager().fuelEfficiency(event.getBurnTime()));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- event.setBurnTime(UserManager.getPlayer(player).getSmeltingManager().fuelEfficiency(event.getBurnTime()));
|
|
|
}
|
|
|
|
|
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
|
@@ -160,35 +85,28 @@ public class InventoryListener implements Listener {
|
|
|
if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
|
|
|
return;
|
|
|
|
|
|
- Block furnaceBlock = event.getBlock();
|
|
|
+ BlockState blockState = event.getBlock().getState(); //Furnaces can only be cast from a BlockState not a Block
|
|
|
ItemStack smelting = event.getSource();
|
|
|
|
|
|
if (!ItemUtils.isSmeltable(smelting)) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if(furnaceBlock instanceof Furnace)
|
|
|
- {
|
|
|
- Player player = getPlayerFromFurnace((Furnace) furnaceBlock);
|
|
|
+ if(blockState instanceof Furnace) {
|
|
|
+ Furnace furnace = (Furnace) blockState;
|
|
|
+ OfflinePlayer offlinePlayer = mcMMO.getSmeltingTracker().getPlayerFromFurnace(furnace);
|
|
|
|
|
|
- /* WORLD GUARD MAIN FLAG CHECK */
|
|
|
- if(WorldGuardUtils.isWorldGuardLoaded())
|
|
|
- {
|
|
|
- if(!WorldGuardManager.getInstance().hasMainFlag(player))
|
|
|
- return;
|
|
|
- }
|
|
|
+ if(offlinePlayer != null) {
|
|
|
|
|
|
- if (!UserManager.hasPlayerDataKey(player) || !PrimarySkillType.SMELTING.getPermissions(player)) {
|
|
|
- return;
|
|
|
- }
|
|
|
+ McMMOPlayer offlineProfile = UserManager.getOfflinePlayer(offlinePlayer);
|
|
|
|
|
|
- //Profile not loaded
|
|
|
- if(UserManager.getPlayer(player) == null)
|
|
|
- {
|
|
|
- return;
|
|
|
+ //Profile doesn't exist
|
|
|
+ if(offlineProfile != null) {
|
|
|
+ event.setResult(offlineProfile.getSmeltingManager().smeltProcessing(smelting, event.getResult()));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- event.setResult(UserManager.getPlayer(player).getSmeltingManager().smeltProcessing(smelting, event.getResult()));
|
|
|
+ new FurnaceCleanupTask(furnace).runTaskLater(mcMMO.p, 1);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -198,16 +116,15 @@ public class InventoryListener implements Listener {
|
|
|
if(WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld()))
|
|
|
return;
|
|
|
|
|
|
- Block furnaceBlock = event.getBlock();
|
|
|
+ BlockState furnaceBlock = event.getBlock().getState();
|
|
|
|
|
|
if (!ItemUtils.isSmelted(new ItemStack(event.getItemType(), event.getItemAmount()))) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if(furnaceBlock instanceof Furnace) {
|
|
|
- Furnace furnace = (Furnace) furnaceBlock;
|
|
|
- Player player = getPlayerFromFurnace(furnace);
|
|
|
+ Player player = event.getPlayer();
|
|
|
|
|
|
+ if(furnaceBlock instanceof Furnace) {
|
|
|
/* WORLD GUARD MAIN FLAG CHECK */
|
|
|
if(WorldGuardUtils.isWorldGuardLoaded())
|
|
|
{
|
|
@@ -237,26 +154,22 @@ public class InventoryListener implements Listener {
|
|
|
if(WorldBlacklist.isWorldBlacklisted(event.getWhoClicked().getWorld()))
|
|
|
return;
|
|
|
|
|
|
+ //We should never care to do processing if the player clicks outside the window
|
|
|
+// if(isOutsideWindowClick(event))
|
|
|
+// return;
|
|
|
+
|
|
|
Inventory inventory = event.getInventory();
|
|
|
|
|
|
- if(event.getWhoClicked() instanceof Player)
|
|
|
+ Player player = ((Player) event.getWhoClicked()).getPlayer();
|
|
|
+
|
|
|
+ if(event.getInventory() instanceof FurnaceInventory)
|
|
|
{
|
|
|
- Player player = ((Player) event.getWhoClicked()).getPlayer();
|
|
|
- Furnace furnace = getFurnace(event.getInventory());
|
|
|
+ Furnace furnace = mcMMO.getSmeltingTracker().getFurnaceFromInventory(event.getInventory());
|
|
|
|
|
|
if (furnace != null)
|
|
|
{
|
|
|
- if (isFurnaceOwned(furnace)) {
|
|
|
- removeFurnaceOwner(furnace);
|
|
|
- }
|
|
|
-
|
|
|
- //Profile not loaded
|
|
|
- if(UserManager.getPlayer(player) == null)
|
|
|
- {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- assignFurnace(furnace, player);
|
|
|
+ //Switch owners
|
|
|
+ mcMMO.getSmeltingTracker().processFurnaceOwnership(furnace, player);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -276,8 +189,6 @@ public class InventoryListener implements Listener {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- Player player = (Player) whoClicked;
|
|
|
-
|
|
|
/* WORLD GUARD MAIN FLAG CHECK */
|
|
|
if(WorldGuardUtils.isWorldGuardLoaded())
|
|
|
{
|
|
@@ -362,13 +273,10 @@ public class InventoryListener implements Listener {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public boolean isFurnaceOwned(Furnace furnace) {
|
|
|
- return furnace.getMetadata(mcMMO.furnaceMetadataKey).size() > 0;
|
|
|
+ public boolean isOutsideWindowClick(InventoryClickEvent event) {
|
|
|
+ return event.getHotbarButton() == -1;
|
|
|
}
|
|
|
|
|
|
- public void removeFurnaceOwner(Furnace furnace) {
|
|
|
- furnace.removeMetadata(mcMMO.furnaceMetadataKey, mcMMO.p);
|
|
|
- }
|
|
|
|
|
|
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
|
|
|
public void onInventoryDragEvent(InventoryDragEvent event) {
|
|
@@ -480,7 +388,7 @@ public class InventoryListener implements Listener {
|
|
|
public void onInventoryClickEvent(InventoryClickEvent event) {
|
|
|
SkillUtils.removeAbilityBuff(event.getCurrentItem());
|
|
|
if (event.getAction() == InventoryAction.HOTBAR_SWAP) {
|
|
|
- if(event.getHotbarButton() == -1)
|
|
|
+ if(isOutsideWindowClick(event))
|
|
|
return;
|
|
|
|
|
|
PlayerInventory playerInventory = event.getWhoClicked().getInventory();
|
|
@@ -525,28 +433,4 @@ public class InventoryListener implements Listener {
|
|
|
new PlayerUpdateInventoryTask((Player) whoClicked).runTaskLater(plugin, 0);
|
|
|
}
|
|
|
|
|
|
- private Furnace getFurnace(Inventory inventory) {
|
|
|
- if (!(inventory instanceof FurnaceInventory)) {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- Furnace furnace = (Furnace) inventory.getHolder();
|
|
|
-
|
|
|
- if (furnace == null) {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- return furnace;
|
|
|
- }
|
|
|
-
|
|
|
- @Nullable
|
|
|
- private Player getPlayerFromFurnace(Furnace furnace) {
|
|
|
- List<MetadataValue> metadata = furnace.getMetadata(mcMMO.furnaceMetadataKey);
|
|
|
-
|
|
|
- if (metadata.isEmpty()) {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- return plugin.getServer().getPlayerExact(metadata.get(0).asString());
|
|
|
- }
|
|
|
}
|