Browse Source

More cleanup on ability activation handling

nossr50 5 years ago
parent
commit
ea2e2bdc9a

+ 1 - 1
src/main/java/com/gmail/nossr50/commands/McabilityCommand.java → src/main/java/com/gmail/nossr50/commands/AbilityToggleCommand.java

@@ -5,7 +5,7 @@ import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.Permissions;
 import org.bukkit.command.CommandSender;
 import org.bukkit.command.CommandSender;
 
 
-public class McabilityCommand extends ToggleCommand {
+public class AbilityToggleCommand extends ToggleCommand {
     @Override
     @Override
     protected boolean hasOtherPermission(CommandSender sender) {
     protected boolean hasOtherPermission(CommandSender sender) {
         return Permissions.mcabilityOthers(sender);
         return Permissions.mcabilityOthers(sender);

+ 6 - 0
src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java

@@ -39,6 +39,7 @@ import com.gmail.nossr50.util.EventUtils;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.experience.ExperienceBarManager;
 import com.gmail.nossr50.util.experience.ExperienceBarManager;
+import com.gmail.nossr50.util.input.AbilityActivationProcessor;
 import com.gmail.nossr50.util.input.SuperAbilityManager;
 import com.gmail.nossr50.util.input.SuperAbilityManager;
 import com.gmail.nossr50.util.player.NotificationManager;
 import com.gmail.nossr50.util.player.NotificationManager;
 import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.player.UserManager;
@@ -93,6 +94,7 @@ public class McMMOPlayer {
     private final FixedMetadataValue playerMetadata;
     private final FixedMetadataValue playerMetadata;
     private final String playerName;
     private final String playerName;
     private final SuperAbilityManager superAbilityManager;
     private final SuperAbilityManager superAbilityManager;
+    private final AbilityActivationProcessor abilityActivationProcessor;
 
 
     public McMMOPlayer(Player player, PlayerProfile profile) {
     public McMMOPlayer(Player player, PlayerProfile profile) {
         this.playerName = player.getName();
         this.playerName = player.getName();
@@ -122,6 +124,7 @@ public class McMMOPlayer {
         }
         }
 
 
         superAbilityManager = new SuperAbilityManager(this);
         superAbilityManager = new SuperAbilityManager(this);
+        abilityActivationProcessor = new AbilityActivationProcessor(this);
 
 
         experienceBarManager = new ExperienceBarManager(this, profile.getXpBarStateMap());
         experienceBarManager = new ExperienceBarManager(this, profile.getXpBarStateMap());
 
 
@@ -834,6 +837,9 @@ public class McMMOPlayer {
         return superAbilityManager;
         return superAbilityManager;
     }
     }
 
 
+    public AbilityActivationProcessor getAbilityActivationProcessor() {
+        return abilityActivationProcessor;
+    }
 
 
     /**
     /**
      * Cleanup various things related to this player
      * Cleanup various things related to this player

+ 7 - 129
src/main/java/com/gmail/nossr50/listeners/PlayerListener.java

@@ -11,20 +11,16 @@ import com.gmail.nossr50.datatypes.party.Party;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
-import com.gmail.nossr50.datatypes.skills.subskills.taming.CallOfTheWildType;
-import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.party.ShareHandler;
 import com.gmail.nossr50.party.ShareHandler;
 import com.gmail.nossr50.runnables.player.PlayerProfileLoadingTask;
 import com.gmail.nossr50.runnables.player.PlayerProfileLoadingTask;
 import com.gmail.nossr50.skills.fishing.FishingManager;
 import com.gmail.nossr50.skills.fishing.FishingManager;
-import com.gmail.nossr50.skills.herbalism.HerbalismManager;
 import com.gmail.nossr50.skills.mining.MiningManager;
 import com.gmail.nossr50.skills.mining.MiningManager;
 import com.gmail.nossr50.skills.repair.Repair;
 import com.gmail.nossr50.skills.repair.Repair;
 import com.gmail.nossr50.skills.repair.RepairManager;
 import com.gmail.nossr50.skills.repair.RepairManager;
 import com.gmail.nossr50.skills.salvage.Salvage;
 import com.gmail.nossr50.skills.salvage.Salvage;
 import com.gmail.nossr50.skills.salvage.SalvageManager;
 import com.gmail.nossr50.skills.salvage.SalvageManager;
-import com.gmail.nossr50.skills.taming.TamingManager;
 import com.gmail.nossr50.util.*;
 import com.gmail.nossr50.util.*;
 import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
 import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
@@ -34,11 +30,9 @@ import com.gmail.nossr50.util.sounds.SoundManager;
 import com.gmail.nossr50.util.sounds.SoundType;
 import com.gmail.nossr50.util.sounds.SoundType;
 import com.gmail.nossr50.worldguard.WorldGuardManager;
 import com.gmail.nossr50.worldguard.WorldGuardManager;
 import com.gmail.nossr50.worldguard.WorldGuardUtils;
 import com.gmail.nossr50.worldguard.WorldGuardUtils;
-import org.bukkit.Bukkit;
 import org.bukkit.GameMode;
 import org.bukkit.GameMode;
 import org.bukkit.Material;
 import org.bukkit.Material;
 import org.bukkit.block.Block;
 import org.bukkit.block.Block;
-import org.bukkit.block.BlockState;
 import org.bukkit.entity.*;
 import org.bukkit.entity.*;
 import org.bukkit.entity.minecart.PoweredMinecart;
 import org.bukkit.entity.minecart.PoweredMinecart;
 import org.bukkit.event.Event;
 import org.bukkit.event.Event;
@@ -709,15 +703,15 @@ public class PlayerListener implements Listener {
     /**
     /**
      * Monitor PlayerInteractEvents.
      * Monitor PlayerInteractEvents.
      *
      *
-     * @param event The event to monitor
+     * @param playerInteractEvent The playerInteractEvent to monitor
      */
      */
     @EventHandler(priority = EventPriority.MONITOR)
     @EventHandler(priority = EventPriority.MONITOR)
-    public void onPlayerInteractMonitor(PlayerInteractEvent event) {
+    public void onPlayerInteractMonitor(PlayerInteractEvent playerInteractEvent) {
         /* WORLD BLACKLIST CHECK */
         /* WORLD BLACKLIST CHECK */
-        if(WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld()))
+        if(WorldBlacklist.isWorldBlacklisted(playerInteractEvent.getPlayer().getWorld()))
             return;
             return;
 
 
-        Player player = event.getPlayer();
+        Player player = playerInteractEvent.getPlayer();
 
 
         /* WORLD GUARD MAIN FLAG CHECK */
         /* WORLD GUARD MAIN FLAG CHECK */
         if(WorldGuardUtils.isWorldGuardLoaded())
         if(WorldGuardUtils.isWorldGuardLoaded())
@@ -726,7 +720,7 @@ public class PlayerListener implements Listener {
                 return;
                 return;
         }
         }
 
 
-        if (event.getHand() != EquipmentSlot.HAND || !UserManager.hasPlayerDataKey(player) || player.getGameMode() == GameMode.CREATIVE) {
+        if (playerInteractEvent.getHand() != EquipmentSlot.HAND || !UserManager.hasPlayerDataKey(player) || player.getGameMode() == GameMode.CREATIVE) {
             return;
             return;
         }
         }
 
 
@@ -740,7 +734,7 @@ public class PlayerListener implements Listener {
         ItemStack heldItem = player.getInventory().getItemInMainHand();
         ItemStack heldItem = player.getInventory().getItemInMainHand();
 
 
         //Spam Fishing Detection
         //Spam Fishing Detection
-        if(event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_AIR)
+        if(playerInteractEvent.getAction() == Action.RIGHT_CLICK_BLOCK || playerInteractEvent.getAction() == Action.RIGHT_CLICK_AIR)
         {
         {
             if(ExperienceConfig.getInstance().isFishingExploitingPrevented()
             if(ExperienceConfig.getInstance().isFishingExploitingPrevented()
                        && (heldItem.getType() == Material.FISHING_ROD || player.getInventory().getItemInOffHand().getType() == Material.FISHING_ROD))
                        && (heldItem.getType() == Material.FISHING_ROD || player.getInventory().getItemInOffHand().getType() == Material.FISHING_ROD))
@@ -755,123 +749,7 @@ public class PlayerListener implements Listener {
             }
             }
         }
         }
 
 
-        switch (event.getAction()) {
-            case RIGHT_CLICK_BLOCK:
-                if(player.getInventory().getItemInOffHand().getType() != Material.AIR && !player.isInsideVehicle() && !player.isSneaking()) {
-                    break;
-                }
-
-                //Hmm
-                if(event.getClickedBlock() == null)
-                    return;
-
-                Block block = event.getClickedBlock();
-                BlockState blockState = block.getState();
-
-                /* ACTIVATION & ITEM CHECKS */
-                if (BlockUtils.canActivateTools(blockState)) {
-                    if (Config.getInstance().getAbilitiesEnabled()) {
-                        if (BlockUtils.canActivateHerbalism(blockState)) {
-                            mcMMOPlayer.getSuperAbilityManager().processAbilityActivation(PrimarySkillType.HERBALISM);
-                        }
-
-                        mcMMOPlayer.getSuperAbilityManager().processAbilityActivation(PrimarySkillType.AXES);
-                        mcMMOPlayer.getSuperAbilityManager().processAbilityActivation(PrimarySkillType.EXCAVATION);
-                        mcMMOPlayer.getSuperAbilityManager().processAbilityActivation(PrimarySkillType.MINING);
-                        mcMMOPlayer.getSuperAbilityManager().processAbilityActivation(PrimarySkillType.SWORDS);
-                        mcMMOPlayer.getSuperAbilityManager().processAbilityActivation(PrimarySkillType.UNARMED);
-                        mcMMOPlayer.getSuperAbilityManager().processAbilityActivation(PrimarySkillType.WOODCUTTING);
-                    }
-
-                    ChimaeraWing.activationCheck(player);
-                }
-
-                /* GREEN THUMB CHECK */
-                HerbalismManager herbalismManager = mcMMOPlayer.getHerbalismManager();
-
-                if (heldItem.getType() == Material.BONE_MEAL) {
-                    switch (blockState.getType()) {
-                        case BEETROOTS:
-                        case CARROT:
-                        case COCOA:
-                        case WHEAT:
-                        case NETHER_WART_BLOCK:
-                        case POTATO:
-                            mcMMO.getPlaceStore().setFalse(blockState);
-                    }
-                }
-
-                FakePlayerAnimationEvent fakeSwing = new FakePlayerAnimationEvent(event.getPlayer()); //PlayerAnimationEvent compat        
-                if (herbalismManager.canGreenThumbBlock(blockState)) {
-                    Bukkit.getPluginManager().callEvent(fakeSwing);
-                    player.getInventory().setItemInMainHand(new ItemStack(Material.WHEAT_SEEDS, heldItem.getAmount() - 1));
-                    if (herbalismManager.processGreenThumbBlocks(blockState) && EventUtils.simulateBlockBreak(block, player, false)) {
-                        blockState.update(true);
-                    }
-                }
-                /* SHROOM THUMB CHECK */
-                else if (herbalismManager.canUseShroomThumb(blockState)) {
-                    Bukkit.getPluginManager().callEvent(fakeSwing);
-                    event.setCancelled(true);
-                    if (herbalismManager.processShroomThumb(blockState) && EventUtils.simulateBlockBreak(block, player, false)) {
-                        blockState.update(true);
-                    }
-                }
-                break;
-
-            case RIGHT_CLICK_AIR:
-                if(player.getInventory().getItemInOffHand().getType() != Material.AIR && !player.isInsideVehicle() && !player.isSneaking()) {
-                    break;
-                }
-                
-                /* ACTIVATION CHECKS */
-                if (Config.getInstance().getAbilitiesEnabled()) {
-                    mcMMOPlayer.getSuperAbilityManager().processAbilityActivation(PrimarySkillType.AXES);
-                    mcMMOPlayer.getSuperAbilityManager().processAbilityActivation(PrimarySkillType.EXCAVATION);
-                    mcMMOPlayer.getSuperAbilityManager().processAbilityActivation(PrimarySkillType.HERBALISM);
-                    mcMMOPlayer.getSuperAbilityManager().processAbilityActivation(PrimarySkillType.MINING);
-                    mcMMOPlayer.getSuperAbilityManager().processAbilityActivation(PrimarySkillType.SWORDS);
-                    mcMMOPlayer.getSuperAbilityManager().processAbilityActivation(PrimarySkillType.UNARMED);
-                    mcMMOPlayer.getSuperAbilityManager().processAbilityActivation(PrimarySkillType.WOODCUTTING);
-                }
-
-                /* ITEM CHECKS */
-                ChimaeraWing.activationCheck(player);
-
-                /* BLAST MINING CHECK */
-                MiningManager miningManager = mcMMOPlayer.getMiningManager();
-                if (miningManager.canDetonate()) {
-                    miningManager.remoteDetonation();
-                }
-
-                break;
-
-            case LEFT_CLICK_AIR:
-            case LEFT_CLICK_BLOCK:
-
-                if (!player.isSneaking()) {
-                    break;
-                }
-
-                /* CALL OF THE WILD CHECKS */
-                Material type = heldItem.getType();
-                TamingManager tamingManager = mcMMOPlayer.getTamingManager();
-
-                if (type == Config.getInstance().getTamingCOTWMaterial(CallOfTheWildType.WOLF.getConfigEntityTypeEntry())) {
-                    tamingManager.summonWolf();
-                }
-                else if (type == Config.getInstance().getTamingCOTWMaterial(CallOfTheWildType.CAT.getConfigEntityTypeEntry())) {
-                    tamingManager.summonOcelot();
-                }
-                else if (type == Config.getInstance().getTamingCOTWMaterial(CallOfTheWildType.HORSE.getConfigEntityTypeEntry())) {
-                    tamingManager.summonHorse();
-                }
-
-                break;
-
-            default:
-                break;
-        }
+        mcMMOPlayer.getAbilityActivationProcessor().processAbilityAndToolActivations(playerInteractEvent);
     }
     }
 
 
     /**
     /**

+ 54 - 0
src/main/java/com/gmail/nossr50/util/BlockUtils.java

@@ -11,6 +11,7 @@ import com.gmail.nossr50.skills.salvage.Salvage;
 import com.gmail.nossr50.util.random.RandomChanceSkill;
 import com.gmail.nossr50.util.random.RandomChanceSkill;
 import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.random.RandomChanceUtil;
 import org.bukkit.Material;
 import org.bukkit.Material;
+import org.bukkit.block.Block;
 import org.bukkit.block.BlockState;
 import org.bukkit.block.BlockState;
 import org.bukkit.block.data.Ageable;
 import org.bukkit.block.data.Ageable;
 import org.bukkit.block.data.BlockData;
 import org.bukkit.block.data.BlockData;
@@ -94,6 +95,48 @@ public final class BlockUtils {
                 && blockState.getType() != Salvage.anvilMaterial;
                 && blockState.getType() != Salvage.anvilMaterial;
     }
     }
 
 
+    /**
+     * Check if a given block should allow for the activation of tools
+     * Activating a tool is step 1 of a 2 step process for super ability activation
+     *
+     * @param block The {@link Block} of the block to check
+     * @return true if the block should allow ability activation, false
+     * otherwise
+     */
+    public static boolean canActivateTools(Block block) {
+        return !mcMMO.getMaterialMapStore().isToolActivationBlackListed(block.getType())
+                && block.getType() != Repair.anvilMaterial
+                && block.getType() != Salvage.anvilMaterial;
+    }
+    /**
+     * Check if a given block should allow for the activation of tools
+     * Activating a tool is step 1 of a 2 step process for super ability activation
+     *
+     * @param material The {@link Material} of the block to check
+     * @return true if the block should allow ability activation, false
+     * otherwise
+     */
+    public static boolean canActivateTools(Material material) {
+        return !mcMMO.getMaterialMapStore().isToolActivationBlackListed(material)
+                && material != Repair.anvilMaterial
+                && material != Salvage.anvilMaterial;
+    }
+
+    /**
+     * Check if a given block should allow for the activation of tools
+     * Activating a tool is step 1 of a 2 step process for super ability activation
+     *
+     * @param blockId The {@link String} of the block namespaced id to check
+     * @return true if the block should allow ability activation, false
+     * otherwise
+     */
+    public static boolean canActivateTools(String blockId) {
+        return !mcMMO.getMaterialMapStore().isToolActivationBlackListed(blockId)
+                && !blockId.equals(Repair.anvilMaterial.getKey().getKey())
+                && !blockId.equals(Salvage.anvilMaterial.getKey().getKey());
+    }
+
+
     /**
     /**
      * Check if a given block is an ore
      * Check if a given block is an ore
      *
      *
@@ -205,6 +248,17 @@ public final class BlockUtils {
         return mcMMO.getMaterialMapStore().isHerbalismAbilityWhiteListed(blockState.getType());
         return mcMMO.getMaterialMapStore().isHerbalismAbilityWhiteListed(blockState.getType());
     }
     }
 
 
+    /**
+     * Determine if a given block can activate Herbalism abilities
+     *
+     * @param block The {@link Block} of the block to check
+     * @return true if the block can be activate Herbalism abilities, false
+     * otherwise
+     */
+    public static boolean canActivateHerbalism(Block block) {
+        return mcMMO.getMaterialMapStore().isHerbalismAbilityWhiteListed(block.getType());
+    }
+
     /**
     /**
      * Determine if a given block should be affected by Block Cracker
      * Determine if a given block should be affected by Block Cracker
      *
      *

+ 5 - 0
src/main/java/com/gmail/nossr50/util/MaterialMapStore.java

@@ -120,6 +120,11 @@ public class MaterialMapStore {
         return toolBlackList.contains(material.getKey().getKey());
         return toolBlackList.contains(material.getKey().getKey());
     }
     }
 
 
+    public boolean isToolActivationBlackListed(String blockId)
+    {
+        return toolBlackList.contains(blockId);
+    }
+
     public boolean isMossyWhiteListed(Material material)
     public boolean isMossyWhiteListed(Material material)
     {
     {
         return mossyWhiteList.contains(material.getKey().getKey());
         return mossyWhiteList.contains(material.getKey().getKey());

+ 1 - 1
src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java

@@ -243,7 +243,7 @@ public final class CommandRegistrationManager {
         command.setPermission("mcmmo.commands.mcability;mcmmo.commands.mcability.others");
         command.setPermission("mcmmo.commands.mcability;mcmmo.commands.mcability.others");
         command.setPermissionMessage(permissionsMessage);
         command.setPermissionMessage(permissionsMessage);
         command.setUsage(LocaleLoader.getString("Commands.Usage.1", "mcability", "[" + LocaleLoader.getString("Commands.Usage.Player") + "]"));
         command.setUsage(LocaleLoader.getString("Commands.Usage.1", "mcability", "[" + LocaleLoader.getString("Commands.Usage.Player") + "]"));
-        command.setExecutor(new McabilityCommand());
+        command.setExecutor(new AbilityToggleCommand());
     }
     }
 
 
     private static void registerMcmmoCommand() {
     private static void registerMcmmoCommand() {

+ 189 - 0
src/main/java/com/gmail/nossr50/util/input/AbilityActivationProcessor.java

@@ -0,0 +1,189 @@
+package com.gmail.nossr50.util.input;
+
+import com.gmail.nossr50.config.Config;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
+import com.gmail.nossr50.datatypes.skills.subskills.taming.CallOfTheWildType;
+import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent;
+import com.gmail.nossr50.mcMMO;
+import com.gmail.nossr50.skills.herbalism.HerbalismManager;
+import com.gmail.nossr50.skills.mining.MiningManager;
+import com.gmail.nossr50.skills.taming.TamingManager;
+import com.gmail.nossr50.util.BlockUtils;
+import com.gmail.nossr50.util.ChimaeraWing;
+import com.gmail.nossr50.util.EventUtils;
+import org.bukkit.Bukkit;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.block.BlockState;
+import org.bukkit.entity.Item;
+import org.bukkit.entity.Player;
+import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.inventory.ItemStack;
+
+public class AbilityActivationProcessor {
+    private final McMMOPlayer mmoPlayer;
+    private final Player player;
+
+    public AbilityActivationProcessor(McMMOPlayer mmoPlayer) {
+        this.mmoPlayer = mmoPlayer;
+        this.player = mmoPlayer.getPlayer();
+    }
+
+    public void processAbilityAndToolActivations(PlayerInteractEvent event) {
+        switch(event.getAction()) {
+            case LEFT_CLICK_BLOCK:
+                processLeftClickBlock();
+                break;
+            case RIGHT_CLICK_BLOCK:
+                processRightClickBlock(event);
+                break;
+            case LEFT_CLICK_AIR:
+                processLeftClickAir();
+                break;
+            case RIGHT_CLICK_AIR:
+                processRightClickAir();
+                break;
+            case PHYSICAL:
+                break;
+        }
+
+    }
+
+    private void processRightClickBlock(PlayerInteractEvent playerInteractEvent) {
+        /*
+            Right clicked on block
+         */
+        if(player.getInventory().getItemInOffHand().getType() != Material.AIR && !player.isInsideVehicle() && !player.isSneaking()) {
+            return;
+        }
+
+        Block block = playerInteractEvent.getClickedBlock();
+
+        if(block == null)
+            return;
+
+        BlockState blockState = block.getState();
+
+        if(playerInteractEvent.getClickedBlock() != null) {
+            if (BlockUtils.canActivateTools(playerInteractEvent.getClickedBlock())) {
+                if (Config.getInstance().getAbilitiesEnabled()) {
+                    if (BlockUtils.canActivateHerbalism(playerInteractEvent.getClickedBlock())) {
+                        getSuperAbilityManager().processAbilityActivation(PrimarySkillType.HERBALISM);
+                    }
+
+                    getSuperAbilityManager().processAbilityActivation(PrimarySkillType.AXES);
+                    getSuperAbilityManager().processAbilityActivation(PrimarySkillType.EXCAVATION);
+                    getSuperAbilityManager().processAbilityActivation(PrimarySkillType.MINING);
+                    getSuperAbilityManager().processAbilityActivation(PrimarySkillType.SWORDS);
+                    getSuperAbilityManager().processAbilityActivation(PrimarySkillType.UNARMED);
+                    getSuperAbilityManager().processAbilityActivation(PrimarySkillType.WOODCUTTING);
+                }
+
+                //TODO: Move this
+                ChimaeraWing.activationCheck(player);
+            }
+        }
+
+        /* GREEN THUMB CHECK */
+        HerbalismManager herbalismManager = mmoPlayer.getHerbalismManager();
+
+        if (getHeldItem().getType() == Material.BONE_MEAL) {
+            switch (blockState.getType()) {
+                case BEETROOTS:
+                case CARROT:
+                case COCOA:
+                case WHEAT:
+                case NETHER_WART_BLOCK:
+                case POTATO:
+                    mcMMO.getPlaceStore().setFalse(blockState);
+            }
+        }
+
+        FakePlayerAnimationEvent fakeSwing = new FakePlayerAnimationEvent(playerInteractEvent.getPlayer()); //PlayerAnimationEvent compat
+        if (herbalismManager.canGreenThumbBlock(blockState)) {
+            Bukkit.getPluginManager().callEvent(fakeSwing);
+            player.getInventory().setItemInMainHand(new ItemStack(Material.WHEAT_SEEDS, getHeldItem().getAmount() - 1));
+            if (herbalismManager.processGreenThumbBlocks(blockState) && EventUtils.simulateBlockBreak(block, player, false)) {
+                blockState.update(true);
+            }
+        }
+
+        /* SHROOM THUMB CHECK */
+        else if (herbalismManager.canUseShroomThumb(blockState)) {
+            Bukkit.getPluginManager().callEvent(fakeSwing);
+            playerInteractEvent.setCancelled(true);
+            if (herbalismManager.processShroomThumb(blockState) && EventUtils.simulateBlockBreak(block, player, false)) {
+                blockState.update(true);
+            }
+        }
+    }
+
+    private void processRightClickAir() {
+        if(player.getInventory().getItemInOffHand().getType() != Material.AIR && !player.isInsideVehicle() && !player.isSneaking()) {
+            return;
+        }
+
+        /* ACTIVATION CHECKS */
+        if (Config.getInstance().getAbilitiesEnabled()) {
+            getSuperAbilityManager().processAbilityActivation(PrimarySkillType.AXES);
+            getSuperAbilityManager().processAbilityActivation(PrimarySkillType.EXCAVATION);
+            getSuperAbilityManager().processAbilityActivation(PrimarySkillType.HERBALISM);
+            getSuperAbilityManager().processAbilityActivation(PrimarySkillType.MINING);
+            getSuperAbilityManager().processAbilityActivation(PrimarySkillType.SWORDS);
+            getSuperAbilityManager().processAbilityActivation(PrimarySkillType.UNARMED);
+            getSuperAbilityManager().processAbilityActivation(PrimarySkillType.WOODCUTTING);
+        }
+
+        /* ITEM CHECKS */
+        ChimaeraWing.activationCheck(player);
+
+        //TODO: This is strange, why is this needed?
+        //TODO: This is strange, why is this needed?
+        //TODO: This is strange, why is this needed?
+        //TODO: This is strange, why is this needed?
+        //TODO: This is strange, why is this needed?
+        /* BLAST MINING CHECK */
+        MiningManager miningManager = mmoPlayer.getMiningManager();
+        if (miningManager.canDetonate()) {
+            miningManager.remoteDetonation();
+        }
+    }
+
+    private void processLeftClickBlock() {
+        processCallOfTheWildActivation();
+    }
+
+    private void processLeftClickAir() {
+        processCallOfTheWildActivation();
+    }
+
+    private void processCallOfTheWildActivation() {
+        if (!player.isSneaking()) {
+            return;
+        }
+
+        /* CALL OF THE WILD CHECKS */
+        Material type = getHeldItem().getType();
+        TamingManager tamingManager = mmoPlayer.getTamingManager();
+
+        if (type == Config.getInstance().getTamingCOTWMaterial(CallOfTheWildType.WOLF.getConfigEntityTypeEntry())) {
+            tamingManager.summonWolf();
+        }
+        else if (type == Config.getInstance().getTamingCOTWMaterial(CallOfTheWildType.CAT.getConfigEntityTypeEntry())) {
+            tamingManager.summonOcelot();
+        }
+        else if (type == Config.getInstance().getTamingCOTWMaterial(CallOfTheWildType.HORSE.getConfigEntityTypeEntry())) {
+            tamingManager.summonHorse();
+        }
+    }
+
+    private SuperAbilityManager getSuperAbilityManager() {
+        return mmoPlayer.getSuperAbilityManager();
+    }
+
+    private ItemStack getHeldItem() {
+        return player.getInventory().getItemInMainHand();
+    }
+
+}

+ 12 - 0
src/main/java/com/gmail/nossr50/util/input/SuperAbilityManager.java

@@ -7,9 +7,16 @@ import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
 import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
 import com.gmail.nossr50.datatypes.skills.ToolType;
 import com.gmail.nossr50.datatypes.skills.ToolType;
+import com.gmail.nossr50.datatypes.skills.subskills.taming.CallOfTheWildType;
+import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.runnables.skills.AbilityDisableTask;
 import com.gmail.nossr50.runnables.skills.AbilityDisableTask;
 import com.gmail.nossr50.runnables.skills.ToolLowerTask;
 import com.gmail.nossr50.runnables.skills.ToolLowerTask;
+import com.gmail.nossr50.skills.herbalism.HerbalismManager;
+import com.gmail.nossr50.skills.mining.MiningManager;
+import com.gmail.nossr50.skills.taming.TamingManager;
+import com.gmail.nossr50.util.BlockUtils;
+import com.gmail.nossr50.util.ChimaeraWing;
 import com.gmail.nossr50.util.EventUtils;
 import com.gmail.nossr50.util.EventUtils;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.player.NotificationManager;
 import com.gmail.nossr50.util.player.NotificationManager;
@@ -18,7 +25,12 @@ import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillUtils;
 import com.gmail.nossr50.util.skills.SkillUtils;
 import com.gmail.nossr50.util.sounds.SoundManager;
 import com.gmail.nossr50.util.sounds.SoundManager;
 import com.gmail.nossr50.util.sounds.SoundType;
 import com.gmail.nossr50.util.sounds.SoundType;
+import org.bukkit.Bukkit;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.block.BlockState;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Player;
+import org.bukkit.event.player.PlayerInteractEvent;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.inventory.ItemStack;
 
 
 import java.util.HashMap;
 import java.util.HashMap;