2013-03-01 06:52:01 +01:00
|
|
|
package com.gmail.nossr50.util;
|
|
|
|
|
2019-03-24 00:21:25 +01:00
|
|
|
import com.gmail.nossr50.config.Config;
|
2017-06-10 19:47:20 +02:00
|
|
|
import com.gmail.nossr50.config.experience.ExperienceConfig;
|
2019-05-15 01:14:01 +02:00
|
|
|
import com.gmail.nossr50.datatypes.meta.BonusDropMeta;
|
2019-01-13 08:54:53 +01:00
|
|
|
import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
|
2019-03-24 00:21:25 +01:00
|
|
|
import com.gmail.nossr50.datatypes.skills.SubSkillType;
|
2018-07-24 04:13:57 +02:00
|
|
|
import com.gmail.nossr50.mcMMO;
|
2013-05-21 17:11:55 +02:00
|
|
|
import com.gmail.nossr50.skills.repair.Repair;
|
2013-03-06 18:31:48 +01:00
|
|
|
import com.gmail.nossr50.skills.salvage.Salvage;
|
2019-03-24 00:21:25 +01:00
|
|
|
import com.gmail.nossr50.util.random.RandomChanceSkill;
|
|
|
|
import com.gmail.nossr50.util.random.RandomChanceUtil;
|
2018-07-24 04:13:57 +02:00
|
|
|
import org.bukkit.Material;
|
|
|
|
import org.bukkit.block.BlockState;
|
2018-10-10 03:48:47 +02:00
|
|
|
import org.bukkit.block.data.Ageable;
|
|
|
|
import org.bukkit.block.data.BlockData;
|
2019-03-24 00:21:25 +01:00
|
|
|
import org.bukkit.entity.Player;
|
2018-07-24 04:13:57 +02:00
|
|
|
|
|
|
|
import java.util.HashSet;
|
2013-03-01 06:52:01 +01:00
|
|
|
|
|
|
|
public final class BlockUtils {
|
2017-06-10 19:47:20 +02:00
|
|
|
|
2019-04-23 17:20:00 +02:00
|
|
|
private BlockUtils() {
|
|
|
|
}
|
2013-03-01 06:52:01 +01:00
|
|
|
|
2019-03-24 00:21:25 +01:00
|
|
|
/**
|
|
|
|
* Mark a block for giving bonus drops, double drops are used if triple is false
|
2019-04-23 17:20:00 +02:00
|
|
|
*
|
2019-03-24 00:21:25 +01:00
|
|
|
* @param blockState target blockstate
|
2019-04-23 17:20:00 +02:00
|
|
|
* @param triple marks the block to give triple drops
|
2019-03-24 00:21:25 +01:00
|
|
|
*/
|
2019-04-23 17:20:00 +02:00
|
|
|
public static void markDropsAsBonus(BlockState blockState, boolean triple) {
|
|
|
|
if (triple)
|
2019-05-15 01:14:01 +02:00
|
|
|
blockState.setMetadata(mcMMO.BONUS_DROPS_METAKEY, new BonusDropMeta(2, mcMMO.p));
|
2019-03-30 01:44:54 +01:00
|
|
|
else
|
2019-05-15 01:14:01 +02:00
|
|
|
blockState.setMetadata(mcMMO.BONUS_DROPS_METAKEY, new BonusDropMeta(1, mcMMO.p));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Marks a block to drop extra copies of items
|
|
|
|
* @param blockState target blockstate
|
|
|
|
* @param amount amount of extra items to drop
|
|
|
|
*/
|
|
|
|
public static void markDropsAsBonus(BlockState blockState, int amount) {
|
|
|
|
blockState.setMetadata(mcMMO.BONUS_DROPS_METAKEY, new BonusDropMeta(amount, mcMMO.p));
|
2019-03-24 00:21:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Checks if a player successfully passed the double drop check
|
2019-04-23 17:20:00 +02:00
|
|
|
*
|
2019-03-24 00:21:25 +01:00
|
|
|
* @param blockState the blockstate
|
|
|
|
* @return true if the player succeeded in the check
|
|
|
|
*/
|
2019-04-23 17:20:00 +02:00
|
|
|
public static boolean checkDoubleDrops(Player player, BlockState blockState, PrimarySkillType skillType, SubSkillType subSkillType) {
|
|
|
|
if (Config.getInstance().getDoubleDropsEnabled(skillType, blockState.getType()) && Permissions.isSubSkillEnabled(player, subSkillType)) {
|
2019-03-24 00:21:25 +01:00
|
|
|
return RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkill(player, subSkillType, true));
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2013-03-01 06:52:01 +01:00
|
|
|
/**
|
|
|
|
* Checks to see if a given block awards XP.
|
|
|
|
*
|
2019-04-23 17:20:00 +02:00
|
|
|
* @param blockState The {@link BlockState} of the block to check
|
2013-03-01 06:52:01 +01:00
|
|
|
* @return true if the block awards XP, false otherwise
|
|
|
|
*/
|
|
|
|
public static boolean shouldBeWatched(BlockState blockState) {
|
2013-05-16 14:41:57 +02:00
|
|
|
return affectedByGigaDrillBreaker(blockState) || affectedByGreenTerra(blockState) || affectedBySuperBreaker(blockState) || isLog(blockState);
|
2013-03-01 06:52:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check if a given block should allow for the activation of abilities
|
|
|
|
*
|
2019-04-23 17:20:00 +02:00
|
|
|
* @param blockState The {@link BlockState} of the block to check
|
2017-06-10 19:47:20 +02:00
|
|
|
* @return true if the block should allow ability activation, false
|
2019-04-23 17:20:00 +02:00
|
|
|
* otherwise
|
2013-03-01 06:52:01 +01:00
|
|
|
*/
|
|
|
|
public static boolean canActivateAbilities(BlockState blockState) {
|
2019-04-23 17:20:00 +02:00
|
|
|
return !mcMMO.getMaterialMapStore().isAbilityActivationBlackListed(blockState.getType());
|
2013-03-01 06:52:01 +01:00
|
|
|
}
|
|
|
|
|
2019-01-20 12:17:01 +01:00
|
|
|
/**
|
|
|
|
* 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
|
|
|
|
*
|
2019-04-23 17:20:00 +02:00
|
|
|
* @param blockState The {@link BlockState} of the block to check
|
2019-01-20 12:17:01 +01:00
|
|
|
* @return true if the block should allow ability activation, false
|
2019-04-23 17:20:00 +02:00
|
|
|
* otherwise
|
2019-01-20 12:17:01 +01:00
|
|
|
*/
|
|
|
|
public static boolean canActivateTools(BlockState blockState) {
|
2020-03-20 03:00:50 +01:00
|
|
|
return !mcMMO.getMaterialMapStore().isToolActivationBlackListed(blockState.getType())
|
|
|
|
&& blockState.getType() != Repair.anvilMaterial
|
|
|
|
&& blockState.getType() != Salvage.anvilMaterial;
|
2019-01-20 12:17:01 +01:00
|
|
|
}
|
|
|
|
|
2013-03-01 06:52:01 +01:00
|
|
|
/**
|
|
|
|
* Check if a given block is an ore
|
|
|
|
*
|
2019-04-23 17:20:00 +02:00
|
|
|
* @param blockState The {@link BlockState} of the block to check
|
2013-03-01 06:52:01 +01:00
|
|
|
* @return true if the block is an ore, false otherwise
|
|
|
|
*/
|
|
|
|
public static boolean isOre(BlockState blockState) {
|
2018-10-10 03:48:47 +02:00
|
|
|
return MaterialUtils.isOre(blockState.getType());
|
2013-03-01 06:52:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Determine if a given block can be made mossy
|
|
|
|
*
|
2019-04-23 17:20:00 +02:00
|
|
|
* @param blockState The {@link BlockState} of the block to check
|
2013-03-01 06:52:01 +01:00
|
|
|
* @return true if the block can be made mossy, false otherwise
|
|
|
|
*/
|
|
|
|
public static boolean canMakeMossy(BlockState blockState) {
|
2019-04-23 17:20:00 +02:00
|
|
|
return mcMMO.getMaterialMapStore().isMossyWhiteListed(blockState.getType());
|
2013-03-01 06:52:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Determine if a given block should be affected by Green Terra
|
|
|
|
*
|
2019-04-23 17:20:00 +02:00
|
|
|
* @param blockState The {@link BlockState} of the block to check
|
2013-03-01 06:52:01 +01:00
|
|
|
* @return true if the block should affected by Green Terra, false otherwise
|
|
|
|
*/
|
|
|
|
public static boolean affectedByGreenTerra(BlockState blockState) {
|
2019-01-15 13:36:35 +01:00
|
|
|
if (ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.HERBALISM, blockState.getBlockData())) {
|
2017-06-10 19:47:20 +02:00
|
|
|
return true;
|
2018-07-27 01:53:29 +02:00
|
|
|
}
|
2013-03-01 06:52:01 +01:00
|
|
|
|
2017-06-10 19:47:20 +02:00
|
|
|
return mcMMO.getModManager().isCustomHerbalismBlock(blockState);
|
2013-03-01 06:52:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Determine if a given block should be affected by Super Breaker
|
|
|
|
*
|
2019-04-23 17:20:00 +02:00
|
|
|
* @param blockState The {@link BlockState} of the block to check
|
2017-06-10 19:47:20 +02:00
|
|
|
* @return true if the block should affected by Super Breaker, false
|
2019-04-23 17:20:00 +02:00
|
|
|
* otherwise
|
2013-03-01 06:52:01 +01:00
|
|
|
*/
|
|
|
|
public static Boolean affectedBySuperBreaker(BlockState blockState) {
|
2019-01-15 13:36:35 +01:00
|
|
|
if (ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.MINING, blockState.getBlockData()))
|
2017-06-10 19:47:20 +02:00
|
|
|
return true;
|
2013-03-01 06:52:01 +01:00
|
|
|
|
2017-06-10 19:47:20 +02:00
|
|
|
return isOre(blockState) || mcMMO.getModManager().isCustomMiningBlock(blockState);
|
2013-03-01 06:52:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Determine if a given block should be affected by Giga Drill Breaker
|
|
|
|
*
|
2019-04-23 17:20:00 +02:00
|
|
|
* @param blockState The {@link BlockState} of the block to check
|
2017-06-10 19:47:20 +02:00
|
|
|
* @return true if the block should affected by Giga Drill Breaker, false
|
2019-04-23 17:20:00 +02:00
|
|
|
* otherwise
|
2013-03-01 06:52:01 +01:00
|
|
|
*/
|
|
|
|
public static boolean affectedByGigaDrillBreaker(BlockState blockState) {
|
2019-01-15 13:36:35 +01:00
|
|
|
if (ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.EXCAVATION, blockState.getBlockData()))
|
2017-06-10 19:47:20 +02:00
|
|
|
return true;
|
|
|
|
return mcMMO.getModManager().isCustomExcavationBlock(blockState);
|
2013-03-01 06:52:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check if a given block is a log
|
|
|
|
*
|
2019-04-23 17:20:00 +02:00
|
|
|
* @param blockState The {@link BlockState} of the block to check
|
2013-03-01 06:52:01 +01:00
|
|
|
* @return true if the block is a log, false otherwise
|
|
|
|
*/
|
|
|
|
public static boolean isLog(BlockState blockState) {
|
2019-01-15 13:36:35 +01:00
|
|
|
if (ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.WOODCUTTING, blockState.getBlockData()))
|
2017-06-10 19:47:20 +02:00
|
|
|
return true;
|
|
|
|
return mcMMO.getModManager().isCustomLog(blockState);
|
2013-03-01 06:52:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check if a given block is a leaf
|
|
|
|
*
|
2019-04-23 17:20:00 +02:00
|
|
|
* @param blockState The {@link BlockState} of the block to check
|
2013-03-01 06:52:01 +01:00
|
|
|
* @return true if the block is a leaf, false otherwise
|
|
|
|
*/
|
|
|
|
public static boolean isLeaves(BlockState blockState) {
|
2019-04-23 17:20:00 +02:00
|
|
|
return mcMMO.getMaterialMapStore().isLeavesWhiteListed(blockState.getType());
|
2013-03-01 06:52:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Determine if a given block should be affected by Flux Mining
|
|
|
|
*
|
2019-04-23 17:20:00 +02:00
|
|
|
* @param blockState The {@link BlockState} of the block to check
|
2013-03-01 06:52:01 +01:00
|
|
|
* @return true if the block should affected by Flux Mining, false otherwise
|
|
|
|
*/
|
|
|
|
public static boolean affectedByFluxMining(BlockState blockState) {
|
|
|
|
switch (blockState.getType()) {
|
2019-04-23 17:20:00 +02:00
|
|
|
case IRON_ORE:
|
|
|
|
case GOLD_ORE:
|
2013-03-01 06:52:01 +01:00
|
|
|
return true;
|
|
|
|
|
2019-04-23 17:20:00 +02:00
|
|
|
default:
|
2013-03-01 06:52:01 +01:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Determine if a given block can activate Herbalism abilities
|
|
|
|
*
|
2019-04-23 17:20:00 +02:00
|
|
|
* @param blockState The {@link BlockState} of the block to check
|
2017-06-10 19:47:20 +02:00
|
|
|
* @return true if the block can be activate Herbalism abilities, false
|
2019-04-23 17:20:00 +02:00
|
|
|
* otherwise
|
2013-03-01 06:52:01 +01:00
|
|
|
*/
|
|
|
|
public static boolean canActivateHerbalism(BlockState blockState) {
|
2019-04-23 17:20:00 +02:00
|
|
|
return mcMMO.getMaterialMapStore().isHerbalismAbilityWhiteListed(blockState.getType());
|
2013-03-01 06:52:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Determine if a given block should be affected by Block Cracker
|
|
|
|
*
|
2019-04-23 17:20:00 +02:00
|
|
|
* @param blockState The {@link BlockState} of the block to check
|
2017-06-10 19:47:20 +02:00
|
|
|
* @return true if the block should affected by Block Cracker, false
|
2019-04-23 17:20:00 +02:00
|
|
|
* otherwise
|
2013-03-01 06:52:01 +01:00
|
|
|
*/
|
|
|
|
public static boolean affectedByBlockCracker(BlockState blockState) {
|
2019-04-23 17:20:00 +02:00
|
|
|
return mcMMO.getMaterialMapStore().isBlockCrackerWhiteListed(blockState.getType());
|
2013-03-01 06:52:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Determine if a given block can be made into Mycelium
|
|
|
|
*
|
2019-04-23 17:20:00 +02:00
|
|
|
* @param blockState The {@link BlockState} of the block to check
|
2013-12-02 18:08:12 +01:00
|
|
|
* @return true if the block can be made into Mycelium, false otherwise
|
2013-03-01 06:52:01 +01:00
|
|
|
*/
|
|
|
|
public static boolean canMakeShroomy(BlockState blockState) {
|
2019-04-23 17:20:00 +02:00
|
|
|
return mcMMO.getMaterialMapStore().isShroomyWhiteListed(blockState.getType());
|
2013-03-01 06:52:01 +01:00
|
|
|
}
|
2013-05-16 14:41:57 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Determine if a given block is an mcMMO anvil
|
|
|
|
*
|
2019-04-23 17:20:00 +02:00
|
|
|
* @param blockState The {@link BlockState} of the block to check
|
2013-05-16 14:41:57 +02:00
|
|
|
* @return true if the block is an mcMMO anvil, false otherwise
|
|
|
|
*/
|
2013-05-21 17:11:55 +02:00
|
|
|
public static boolean isMcMMOAnvil(BlockState blockState) {
|
2013-09-13 15:12:21 +02:00
|
|
|
Material type = blockState.getType();
|
2013-05-16 14:41:57 +02:00
|
|
|
|
2013-03-06 18:31:48 +01:00
|
|
|
return type == Repair.anvilMaterial || type == Salvage.anvilMaterial;
|
2013-05-16 14:41:57 +02:00
|
|
|
}
|
2013-08-17 10:11:46 +02:00
|
|
|
|
2014-06-15 14:22:32 +02:00
|
|
|
public static boolean isPistonPiece(BlockState blockState) {
|
|
|
|
Material type = blockState.getType();
|
|
|
|
|
2018-07-24 04:13:57 +02:00
|
|
|
return type == Material.MOVING_PISTON || type == Material.AIR;
|
2014-06-15 14:22:32 +02:00
|
|
|
}
|
|
|
|
|
2013-08-17 10:11:46 +02:00
|
|
|
/**
|
|
|
|
* Get a HashSet containing every transparent block
|
|
|
|
*
|
|
|
|
* @return HashSet with the IDs of every transparent block
|
|
|
|
*/
|
2017-08-05 20:50:24 +02:00
|
|
|
public static HashSet<Material> getTransparentBlocks() {
|
2020-07-13 21:31:30 +02:00
|
|
|
HashSet<Material> transparentBlocks = new HashSet<>();
|
2013-08-19 21:12:08 +02:00
|
|
|
|
|
|
|
for (Material material : Material.values()) {
|
|
|
|
if (material.isTransparent()) {
|
2017-08-05 20:53:38 +02:00
|
|
|
transparentBlocks.add(material);
|
2013-08-19 21:12:08 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return transparentBlocks;
|
2013-08-17 10:11:46 +02:00
|
|
|
}
|
2018-10-10 03:48:47 +02:00
|
|
|
|
2018-10-13 23:09:08 +02:00
|
|
|
public static boolean isFullyGrown(BlockState blockState) {
|
2018-10-10 03:48:47 +02:00
|
|
|
BlockData data = blockState.getBlockData();
|
2019-07-07 10:42:57 +02:00
|
|
|
if (data.getMaterial() == Material.CACTUS || data.getMaterial() == Material.SUGAR_CANE) {
|
2018-10-10 03:48:47 +02:00
|
|
|
return true;
|
2019-07-07 10:42:57 +02:00
|
|
|
}
|
2019-04-23 17:20:00 +02:00
|
|
|
if (data instanceof Ageable) {
|
2018-10-10 03:48:47 +02:00
|
|
|
Ageable ageable = (Ageable) data;
|
|
|
|
return ageable.getAge() == ageable.getMaximumAge();
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
2013-03-01 06:52:01 +01:00
|
|
|
}
|