mcMMO/src/main/java/com/gmail/nossr50/skills/woodcutting/Woodcutting.java

176 lines
6.3 KiB
Java
Raw Normal View History

package com.gmail.nossr50.skills.woodcutting;
2012-01-09 20:00:13 +01:00
import org.bukkit.Location;
2012-01-09 20:00:13 +01:00
import org.bukkit.Material;
import org.bukkit.TreeSpecies;
2012-01-09 20:00:13 +01:00
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
2012-06-05 16:13:10 +02:00
import org.bukkit.event.block.BlockBreakEvent;
2012-01-09 20:00:13 +01:00
import org.bukkit.inventory.ItemStack;
2012-06-05 16:13:10 +02:00
import org.getspout.spoutapi.sound.SoundEffect;
import com.gmail.nossr50.mcMMO;
2012-11-21 21:49:54 +01:00
import com.gmail.nossr50.config.AdvancedConfig;
2012-04-26 16:27:57 +02:00
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.datatypes.mods.CustomBlock;
import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent;
import com.gmail.nossr50.skills.SkillType;
import com.gmail.nossr50.skills.Skills;
2012-03-21 03:33:58 +01:00
import com.gmail.nossr50.spout.SpoutSounds;
2012-04-27 11:47:11 +02:00
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.ModChecks;
2012-04-27 11:47:11 +02:00
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.Users;
2013-01-22 22:04:05 +01:00
public abstract class Woodcutting {
public static final int DOUBLE_DROP_MAX_LEVEL = AdvancedConfig.getInstance().getMiningDoubleDropMaxLevel();
public static final double DOUBLE_DROP_CHANCE = AdvancedConfig.getInstance().getMiningDoubleDropChance();
public static final int LEAF_BLOWER_UNLOCK_LEVEL = AdvancedConfig.getInstance().getLeafBlowUnlockLevel();
public static final boolean DOUBLE_DROP_DISABLED = Config.getInstance().woodcuttingDoubleDropsDisabled();
2013-01-22 17:52:06 +01:00
/**
* Begin Tree Feller ability
*
* @param event Event to process
*/
public static void beginTreeFeller(BlockBreakEvent event) {
TreeFeller.process(event);
}
/**
* Begin Leaf Blower ability.
*
* @param player Player using the ability
* @param block Block being broken
*/
public static void beginLeafBlower(Player player, Block block) {
mcMMO.p.getServer().getPluginManager().callEvent(new FakePlayerAnimationEvent(player));
if (mcMMO.spoutEnabled) {
SpoutSounds.playSoundForPlayer(SoundEffect.POP, player, block.getLocation());
}
}
/**
* Begin Woodcutting process
*
* @param player Player breaking the block
* @param block Block being broken
*/
public static void beginWoodcutting(Player player, Block block) {
int xp = 0;
if (Config.getInstance().getBlockModsEnabled() && ModChecks.isCustomLogBlock(block)) {
xp = ModChecks.getCustomBlock(block).getXpGain();
}
else {
try {
xp = getExperienceFromLog(block);
2012-10-31 04:05:37 +01:00
}
catch (IllegalArgumentException exception) {
return;
}
}
checkDoubleDrop(player, block);
Skills.xpProcessing(player, Users.getProfile(player), SkillType.WOODCUTTING, xp);
}
/**
* Retrieve the experience from a log
*
* @param log Log being broken
* @return Amount of experience
* @throws IllegalArgumentException if 'log' is invalid
*/
protected static int getExperienceFromLog(Block log) {
2013-01-22 23:44:53 +01:00
TreeSpecies logType = TreeSpecies.getByData((byte) (log.getData() & 0x3));
// Apparently species can be null in certain cases (custom server mods?)
// https://github.com/mcMMO-Dev/mcMMO/issues/229
if (logType == null) {
throw new IllegalArgumentException();
}
2013-01-10 04:43:21 +01:00
switch (logType) {
case GENERIC:
return Config.getInstance().getWoodcuttingXPOak();
case REDWOOD:
return Config.getInstance().getWoodcuttingXPSpruce();
case BIRCH:
return Config.getInstance().getWoodcuttingXPBirch();
case JUNGLE:
return Config.getInstance().getWoodcuttingXPJungle();
default:
throw new IllegalArgumentException();
}
2012-02-23 05:53:20 +01:00
}
/**
* Check for double drops
*
* @param player Player breaking the block
* @param block Block being broken
*/
protected static void checkDoubleDrop(Player player, Block block) {
if (!Permissions.woodcuttingDoubleDrops(player)) {
return;
}
int chance = (int) ((DOUBLE_DROP_CHANCE / DOUBLE_DROP_MAX_LEVEL) * Users.getProfile(player).getSkillLevel(SkillType.WOODCUTTING));
2013-01-22 02:01:33 +01:00
int activationChance = Misc.calculateActivationChance(Permissions.luckyWoodcutting(player));
if (chance > DOUBLE_DROP_CHANCE) {
chance = (int) DOUBLE_DROP_CHANCE;
}
if (chance <= Misc.getRandom().nextInt(activationChance)) {
return;
}
if (Config.getInstance().getBlockModsEnabled() && ModChecks.isCustomLogBlock(block)) {
CustomBlock customBlock = ModChecks.getCustomBlock(block);
int minimumDropAmount = customBlock.getMinimumDropAmount();
int maximumDropAmount = customBlock.getMaximumDropAmount();
Location location = block.getLocation();
ItemStack item = customBlock.getItemDrop();
Misc.dropItems(location, item, minimumDropAmount);
if (minimumDropAmount != maximumDropAmount) {
Misc.randomDropItems(location, item, 50, maximumDropAmount - minimumDropAmount);
}
}
else {
2013-01-22 23:44:53 +01:00
byte blockData = block.getData();
Location location = block.getLocation();
2013-01-22 23:44:53 +01:00
ItemStack item = new ItemStack(Material.LOG, 1, blockData);
2013-01-22 23:44:53 +01:00
switch (TreeSpecies.getByData((byte) (blockData & 0x3))) {
case GENERIC:
if (Config.getInstance().getOakDoubleDropsEnabled()) {
Misc.dropItem(location, item);
}
break;
case REDWOOD:
if (Config.getInstance().getSpruceDoubleDropsEnabled()) {
Misc.dropItem(location, item);
}
break;
case BIRCH:
if (Config.getInstance().getBirchDoubleDropsEnabled()) {
Misc.dropItem(location, item);
}
break;
case JUNGLE:
if (Config.getInstance().getJungleDoubleDropsEnabled()) {
Misc.dropItem(location, item);
}
break;
default:
break;
}
}
}
2012-01-09 20:00:13 +01:00
}