More cleanup on ability activation handling

This commit is contained in:
nossr50
2020-07-31 17:41:43 -07:00
parent 03f1733387
commit ea2e2bdc9a
8 changed files with 275 additions and 131 deletions

View File

@@ -11,6 +11,7 @@ import com.gmail.nossr50.skills.salvage.Salvage;
import com.gmail.nossr50.util.random.RandomChanceSkill;
import com.gmail.nossr50.util.random.RandomChanceUtil;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.data.Ageable;
import org.bukkit.block.data.BlockData;
@@ -94,6 +95,48 @@ public final class BlockUtils {
&& 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
*
@@ -205,6 +248,17 @@ public final class BlockUtils {
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
*

View File

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

View File

@@ -243,7 +243,7 @@ public final class CommandRegistrationManager {
command.setPermission("mcmmo.commands.mcability;mcmmo.commands.mcability.others");
command.setPermissionMessage(permissionsMessage);
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() {

View File

@@ -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();
}
}

View File

@@ -7,9 +7,16 @@ import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
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.runnables.skills.AbilityDisableTask;
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.Misc;
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.sounds.SoundManager;
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.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import java.util.HashMap;