mcMMO/src/main/java/com/gmail/nossr50/skills/gathering/WoodCutting.java

419 lines
16 KiB
Java
Raw Normal View History

2012-05-01 19:58:47 +02:00
package com.gmail.nossr50.skills.gathering;
2012-01-09 20:00:13 +01:00
import java.util.ArrayList;
2012-03-26 17:04:17 +02:00
import java.util.Random;
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;
import org.bukkit.inventory.ItemStack;
2012-03-16 18:33:03 +01:00
import org.bukkit.material.Tree;
import org.bukkit.event.block.BlockBreakEvent;
import com.gmail.nossr50.mcMMO;
2012-04-26 16:27:57 +02:00
import com.gmail.nossr50.config.Config;
2012-01-09 20:00:13 +01:00
import com.gmail.nossr50.datatypes.PlayerProfile;
import com.gmail.nossr50.datatypes.SkillType;
import com.gmail.nossr50.datatypes.mods.CustomBlock;
import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent;
2012-04-27 11:47:11 +02:00
import com.gmail.nossr50.locale.LocaleLoader;
2012-03-21 03:33:58 +01:00
import com.gmail.nossr50.spout.SpoutSounds;
import com.gmail.nossr50.util.BlockChecks;
2012-04-27 11:47:11 +02:00
import com.gmail.nossr50.util.Combat;
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;
2012-05-01 19:58:47 +02:00
import com.gmail.nossr50.util.Skills;
2012-04-27 11:47:11 +02:00
import com.gmail.nossr50.util.Users;
2012-02-04 07:59:31 +01:00
import org.getspout.spoutapi.sound.SoundEffect;
2012-01-09 20:00:13 +01:00
public class WoodCutting {
2012-01-09 20:00:13 +01:00
2012-03-26 17:04:17 +02:00
private static Random random = new Random();
/**
* Handle the Tree Feller ability.
*
* @param event Event to modify
*/
public static void treeFeller(BlockBreakEvent event) {
Player player = event.getPlayer();
Block firstBlock = event.getBlock();
PlayerProfile PP = Users.getProfile(player);
ArrayList<Block> toBeFelled = new ArrayList<Block>();
/* NOTE: Tree Feller will cut upwards like how you actually fell trees */
processTreeFelling(firstBlock, toBeFelled);
removeBlocks(toBeFelled, player, PP);
}
/**
* Handles removing & dropping the blocks from Tree Feller.
*
* @param toBeFelled List of Blocks to be removed from the tree
* @param player The player using the ability
* @param PP The PlayerProfile of the player
*/
private static void removeBlocks(ArrayList<Block> toBeFelled, Player player, PlayerProfile PP) {
if (toBeFelled.size() >= Config.getInstance().getTreeFellerThreshold()) {
2012-04-27 11:47:11 +02:00
player.sendMessage(LocaleLoader.getString("Woodcutting.Skills.TreeFellerThreshold"));
return;
}
int durabilityLoss = durabilityLossCalulate(toBeFelled);
int xp = 0;
ItemStack inHand = player.getItemInHand();
/* Damage the tool */
inHand.setDurability((short) (inHand.getDurability() + durabilityLoss));
/* This is to prevent using wood axes everytime you tree fell */
if (ModChecks.isCustomTool(inHand)) {
if (inHand.getDurability() + durabilityLoss >= ModChecks.getToolFromItemStack(inHand).getDurability()) {
player.sendMessage(LocaleLoader.getString("Woodcutting.Skills.TreeFeller.Splinter"));
int health = player.getHealth();
if (health >= 2) {
Combat.dealDamage(player, random.nextInt(health - 1));
}
return;
}
}
else if ((inHand.getDurability() + durabilityLoss >= inHand.getType().getMaxDurability()) || inHand.getType().equals(Material.AIR)) {
2012-04-27 11:47:11 +02:00
player.sendMessage(LocaleLoader.getString("Woodcutting.Skills.TreeFeller.Splinter"));
int health = player.getHealth();
if (health >= 2) {
2012-03-26 17:04:17 +02:00
Combat.dealDamage(player, random.nextInt(health - 1));
}
return;
}
//Prepare ItemStacks
ItemStack item = null;
ItemStack oak = new ItemStack(Material.LOG, 1, (short) 0, TreeSpecies.GENERIC.getData());
ItemStack spruce = new ItemStack(Material.LOG, 1, (short) 0, TreeSpecies.REDWOOD.getData());
ItemStack birch = new ItemStack(Material.LOG, 1, (short) 0, TreeSpecies.BIRCH.getData());
ItemStack jungle = new ItemStack(Material.LOG, 1, (short) 0, TreeSpecies.JUNGLE.getData());
2012-02-23 08:42:03 +01:00
for (Block x : toBeFelled) {
2012-04-27 11:47:11 +02:00
if (Misc.blockBreakSimulate(x, player, true)) {
if (Config.getInstance().getBlockModsEnabled()) {
CustomBlock block = ModChecks.getCustomBlock(x);
item = block.getItemDrop();
if (ModChecks.isCustomLogBlock(x)) {
if (!mcMMO.placeStore.isTrue(x)) {
WoodCutting.woodCuttingProcCheck(player, x);
xp = block.getXpGain();
}
/* Remove the block */
x.setData((byte) 0x0);
x.setType(Material.AIR);
2012-05-18 19:40:21 +02:00
Misc.dropItem(x.getLocation(), item);
}
else if (ModChecks.isCustomLeafBlock(x)) {
final int SAPLING_DROP_CHANCE = 10;
/* Remove the block */
x.setData((byte) 0x0);
x.setType(Material.AIR);
2012-05-18 19:40:21 +02:00
Misc.randomDropItem(x.getLocation(), item, SAPLING_DROP_CHANCE);
}
}
else if (x.getType() == Material.LOG) {
2012-03-16 18:33:03 +01:00
Tree tree = (Tree) x.getState().getData();
TreeSpecies species = tree.getSpecies();
switch (species) {
case GENERIC:
item = oak;
break;
case REDWOOD:
item = spruce;
break;
case BIRCH:
item = birch;
break;
case JUNGLE:
item = jungle;
break;
default:
break;
}
if (!mcMMO.placeStore.isTrue(x)) {
2012-02-23 10:34:34 +01:00
WoodCutting.woodCuttingProcCheck(player, x);
switch (species) {
case GENERIC:
xp += Config.getInstance().getWoodcuttingXPOak();
2012-02-23 10:34:34 +01:00
break;
case REDWOOD:
xp += Config.getInstance().getWoodcuttingXPSpruce();
2012-02-23 10:34:34 +01:00
break;
case BIRCH:
xp += Config.getInstance().getWoodcuttingXPBirch();
2012-02-23 10:34:34 +01:00
break;
case JUNGLE:
xp += Config.getInstance().getWoodcuttingXPJungle() / 4; //Nerf XP from Jungle Trees when using Tree Feller
break;
default:
break;
}
2012-02-23 10:34:34 +01:00
}
/* Remove the block */
x.setData((byte) 0x0);
2012-02-23 10:34:34 +01:00
x.setType(Material.AIR);
/* Drop the block */
2012-05-18 19:40:21 +02:00
Misc.dropItem(x.getLocation(), item);
}
else if (x.getType() == Material.LEAVES) {
final int SAPLING_DROP_CHANCE = 10;
2012-03-16 18:33:03 +01:00
item = new ItemStack(Material.SAPLING, 1, (short) 0, (byte) (x.getData() & 3)); //Drop the right type of sapling
2012-05-18 19:40:21 +02:00
Misc.randomDropItem(x.getLocation(), item, SAPLING_DROP_CHANCE);
2012-02-23 10:34:34 +01:00
//Remove the block
x.setData((byte) 0);
x.setType(Material.AIR);
}
}
}
if (Permissions.getInstance().woodcutting(player)) {
2012-05-06 09:47:25 +02:00
PP.addXP(player, SkillType.WOODCUTTING, xp); //Tree Feller gives nerf'd XP
Skills.XpCheckSkill(SkillType.WOODCUTTING, player);
}
}
/**
* Handle the calculations from Tree Feller.
*
* @param currentBlock The current block to be removed
* @param toBeFelled The list of blocks left to be removed
*/
private static void processTreeFelling(Block currentBlock, ArrayList<Block> toBeFelled) {
Material type = currentBlock.getType();
if (toBeFelled.size() >= Config.getInstance().getTreeFellerThreshold()) {
return;
}
if (type.equals(Material.LOG) || type.equals(Material.LEAVES)) {
toBeFelled.add(currentBlock);
}
else if (Config.getInstance().getBlockModsEnabled() && (ModChecks.isCustomLogBlock(currentBlock) || ModChecks.isCustomLeafBlock(currentBlock))) {
toBeFelled.add(currentBlock);
}
Block xPositive = currentBlock.getRelative(1, 0, 0);
Block xNegative = currentBlock.getRelative(-1, 0, 0);
Block zPositive = currentBlock.getRelative(0, 0, 1);
Block zNegative = currentBlock.getRelative(0, 0, -1);
Block yPositive = currentBlock.getRelative(0, 1, 0);
if (!mcMMO.placeStore.isTrue(currentBlock)) {
if (!isTooAggressive(currentBlock, xPositive) && BlockChecks.treeFellerCompatible(xPositive) && !toBeFelled.contains(xPositive)) {
processTreeFelling(xPositive, toBeFelled);
}
if (!isTooAggressive(currentBlock, xNegative) && BlockChecks.treeFellerCompatible(xNegative) && !toBeFelled.contains(xNegative)) {
processTreeFelling(xNegative, toBeFelled);
}
if (!isTooAggressive(currentBlock, zPositive) && BlockChecks.treeFellerCompatible(zPositive) && !toBeFelled.contains(zPositive)) {
processTreeFelling(zPositive, toBeFelled);
}
if (!isTooAggressive(currentBlock, zNegative) && BlockChecks.treeFellerCompatible(zNegative) && !toBeFelled.contains(zNegative)) {
processTreeFelling(zNegative, toBeFelled);
}
}
if (BlockChecks.treeFellerCompatible(yPositive)) {
if(!mcMMO.placeStore.isTrue(currentBlock) && !toBeFelled.contains(yPositive)) {
processTreeFelling(yPositive, toBeFelled);
}
}
}
/**
* Check if Tree Feller is being too aggressive.
*
* @param currentBlock The current block being felled
* @param newBlock The next block to be felled
* @return true if Tree Feller is too aggressive, false otherwise
*/
private static boolean isTooAggressive(Block currentBlock, Block newBlock) {
Material currentType = currentBlock.getType();
Material newType = newBlock.getType();
if ((currentType.equals(Material.LEAVES) || currentType.equals(Material.AIR) || (Config.getInstance().getBlockModsEnabled() && ModChecks.isCustomLeafBlock(currentBlock))) && (newType.equals(Material.LEAVES) || newType.equals(Material.AIR) || (Config.getInstance().getBlockModsEnabled() && ModChecks.isCustomLeafBlock(currentBlock)))) {
return true;
}
else {
return false;
}
2012-02-23 05:53:20 +01:00
}
/**
* Check for double drops.
*
* @param player Player breaking the block
* @param block The block being broken
*/
private static void woodCuttingProcCheck(Player player, Block block) {
final int MAX_SKILL_LEVEL = 1000;
int skillLevel = Users.getProfile(player).getSkillLevel(SkillType.WOODCUTTING);
byte type = block.getData();
Material mat = Material.getMaterial(block.getTypeId());
Tree tree = (Tree) block.getState().getData();
TreeSpecies species = tree.getSpecies();
2012-04-27 11:47:11 +02:00
if ((skillLevel > MAX_SKILL_LEVEL || random.nextInt(1000) <= skillLevel) && Permissions.getInstance().woodcuttingDoubleDrops(player)) {
Config configInstance = Config.getInstance();
ItemStack item;
Location location;
if (configInstance.getBlockModsEnabled() && ModChecks.isCustomLogBlock(block)) {
item = ModChecks.getCustomBlock(block).getItemDrop();
location = block.getLocation();
2012-05-18 19:40:21 +02:00
Misc.dropItem(location, item);
return;
}
else {
item = new ItemStack(mat, 1, (short) 0, type);
location = block.getLocation();
}
/* Drop the block */
switch (species) {
case GENERIC:
if (configInstance.getOakDoubleDropsEnabled()) {
2012-05-18 19:40:21 +02:00
Misc.dropItem(location, item);
}
break;
case REDWOOD:
if (configInstance.getSpruceDoubleDropsEnabled()) {
2012-05-18 19:40:21 +02:00
Misc.dropItem(location, item);
}
break;
case BIRCH:
if (configInstance.getBirchDoubleDropsEnabled()) {
2012-05-18 19:40:21 +02:00
Misc.dropItem(location, item);
}
break;
case JUNGLE:
if (configInstance.getJungleDoubleDropsEnabled()) {
2012-05-18 19:40:21 +02:00
Misc.dropItem(location, item);
}
break;
default:
break;
}
}
2012-01-09 20:00:13 +01:00
}
/**
* Check XP gain for woodcutting.
*
* @param player The player breaking the block
* @param block The block being broken
*/
public static void woodcuttingBlockCheck(Player player, Block block) {
PlayerProfile PP = Users.getProfile(player);
int xp = 0;
TreeSpecies species = TreeSpecies.getByData(block.getData());
if (mcMMO.placeStore.isTrue(block)) {
return;
}
if (Config.getInstance().getBlockModsEnabled() && ModChecks.isCustomLogBlock(block)) {
xp = ModChecks.getCustomBlock(block).getXpGain();
}
else {
switch (species) {
case GENERIC:
xp += Config.getInstance().getWoodcuttingXPOak();
break;
case REDWOOD:
xp += Config.getInstance().getWoodcuttingXPSpruce();
break;
case BIRCH:
xp += Config.getInstance().getWoodcuttingXPBirch();
break;
case JUNGLE:
xp += Config.getInstance().getWoodcuttingXPJungle();
break;
default:
break;
}
}
WoodCutting.woodCuttingProcCheck(player, block);
2012-05-06 09:47:25 +02:00
PP.addXP(player, SkillType.WOODCUTTING, xp);
Skills.XpCheckSkill(SkillType.WOODCUTTING, player);
}
/**
* Handle the Leaf Blower ability.
*
* @param player Player using the ability
* @param block Block being broken
*/
public static void leafBlower(Player player, Block block) {
FakePlayerAnimationEvent armswing = new FakePlayerAnimationEvent(player);
mcMMO.p.getServer().getPluginManager().callEvent(armswing);
if (Config.getInstance().getWoodcuttingRequiresTool()) {
Skills.abilityDurabilityLoss(player.getItemInHand(), Config.getInstance().getAbilityToolDamage());
}
if (mcMMO.p.spoutEnabled) {
2012-03-21 03:33:58 +01:00
SpoutSounds.playSoundForPlayer(SoundEffect.POP, player, block.getLocation());
}
2012-02-04 07:36:03 +01:00
}
private static int durabilityLossCalulate(ArrayList<Block> toBeFelled) {
int durabilityLoss = 0;
for (Block x : toBeFelled) {
if (x.getType().equals(Material.LOG) || (Config.getInstance().getBlockModsEnabled() && ModChecks.isCustomLogBlock(x))) {
durabilityLoss++;
durabilityLoss = durabilityLoss + Config.getInstance().getAbilityToolDamage();
}
}
return durabilityLoss;
}
2012-01-09 20:00:13 +01:00
}