/* This file is part of mcMMO. mcMMO is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. mcMMO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with mcMMO. If not, see . */ package com.gmail.nossr50.skills; import java.util.ArrayList; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.enchantments.Enchantment; import org.bukkit.event.player.PlayerAnimationEvent; import org.bukkit.Bukkit; import com.gmail.nossr50.Users; import com.gmail.nossr50.m; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.datatypes.AbilityType; import com.gmail.nossr50.datatypes.PlayerProfile; import com.gmail.nossr50.datatypes.SkillType; import com.gmail.nossr50.locale.mcLocale; import com.gmail.nossr50.spout.SpoutStuff; import com.gmail.nossr50.config.*; import org.getspout.spoutapi.sound.SoundEffect; public class WoodCutting { public static void woodCuttingProcCheck(Player player, Block block) { PlayerProfile PP = Users.getProfile(player); byte type = block.getData(); Material mat = Material.getMaterial(block.getTypeId()); if(player != null) { if(PP.getSkillLevel(SkillType.WOODCUTTING) > 1000 || (Math.random() * 1000 <= PP.getSkillLevel(SkillType.WOODCUTTING))) { ItemStack item = new ItemStack(mat, 1, (short) 0, type); m.mcDropItem(block.getLocation(), item); } } } public static void treeFellerCheck(Player player, Block block) { PlayerProfile PP = Users.getProfile(player); if(m.isAxes(player.getItemInHand())) { if(block != null) { if(!m.abilityBlockCheck(block)) return; } /* * CHECK FOR AXE PREP MODE */ if(PP.getAxePreparationMode()) { PP.setAxePreparationMode(false); } int ticks = 2; int x = PP.getSkillLevel(SkillType.WOODCUTTING); while(x >= 50) { x-=50; ticks++; } if(!PP.getTreeFellerMode() && Skills.cooldownOver(player, (PP.getSkillDATS(AbilityType.TREE_FELLER)*1000), LoadProperties.treeFellerCooldown)) { player.sendMessage(mcLocale.getString("Skills.TreeFellerOn")); for(Player y : player.getWorld().getPlayers()) { if(y != null && y != player && m.getDistance(player.getLocation(), y.getLocation()) < 10) y.sendMessage(mcLocale.getString("Skills.TreeFellerPlayer", new Object[] {player.getName()})); } PP.setSkillDATS(AbilityType.TREE_FELLER, System.currentTimeMillis()+(ticks*1000)); PP.setTreeFellerMode(true); } if(!PP.getTreeFellerMode() && !Skills.cooldownOver(player, (PP.getSkillDATS(AbilityType.TREE_FELLER)*1000), LoadProperties.treeFellerCooldown)){ player.sendMessage(ChatColor.RED+"You are too tired to use that ability again." +ChatColor.YELLOW+" ("+Skills.calculateTimeLeft(player, (PP.getSkillDATS(AbilityType.TREE_FELLER)*1000), LoadProperties.treeFellerCooldown)+"s)"); } } } public static ArrayList treeFeller(Block block, Player player) { PlayerProfile PP = Users.getProfile(player); int radius = 1; if(PP.getSkillLevel(SkillType.WOODCUTTING) >= 500) radius++; if(PP.getSkillLevel(SkillType.WOODCUTTING) >= 950) radius++; ArrayList blockList = new ArrayList(); ArrayList returnList = new ArrayList(); if(block != null) blockList.add(block); boolean isDone = false; while(isDone == false){ isDone = addBlocksToTreeFelling(blockList, returnList, radius); } return returnList; } public static boolean addBlocksToTreeFelling(ArrayList blocklist, ArrayList toAdd, Integer radius) { int u = 0; for (Block x : blocklist) { u++; if(toAdd.contains(x)) continue; Location loc = x.getLocation(); int vx = x.getX(); int vy = x.getY(); int vz = x.getZ(); /* * Run through the blocks around the broken block to see if they qualify to be 'felled' */ for (int cx = -radius; cx <= radius; cx++) { for (int cy = -radius; cy <= radius; cy++) { for (int cz = -radius; cz <= radius; cz++) { Block blocktarget = loc.getWorld().getBlockAt(vx + cx, vy + cy, vz + cz); if (!blocklist.contains(blocktarget) && !toAdd.contains(blocktarget) && (blocktarget.getTypeId() == 17 || blocktarget.getTypeId() == 18)) { toAdd.add(blocktarget); } } } } } /* * Add more blocks to blocklist so they can be 'felled' */ for(Block xx : toAdd) { if(!blocklist.contains(xx)) blocklist.add(xx); } if(u >= blocklist.size()) { return true; } else { return false; } } public static void woodcuttingBlockCheck(Player player, Block block, mcMMO plugin) { PlayerProfile PP = Users.getProfile(player); int xp = 0; byte data = block.getData(); if(plugin.misc.blockWatchList.contains(block)) return; switch(data) { case 0: xp += LoadProperties.mpine; break; case 1: xp += LoadProperties.mspruce; break; case 2: xp += LoadProperties.mbirch; break; } if(block.getTypeId() == 17) { WoodCutting.woodCuttingProcCheck(player, block); PP.addXP(SkillType.WOODCUTTING, xp, player); Skills.XpCheckSkill(SkillType.WOODCUTTING, player); } } public static void leafBlower(Player player, Block block){ PlayerAnimationEvent armswing = new PlayerAnimationEvent(player); Bukkit.getPluginManager().callEvent(armswing); if(LoadProperties.toolsLoseDurabilityFromAbilities) { if(!player.getItemInHand().containsEnchantment(Enchantment.DURABILITY)) m.damageTool(player, (short) LoadProperties.abilityDurabilityLoss); } if(LoadProperties.spoutEnabled) SpoutStuff.playSoundForPlayer(SoundEffect.POP, player, block.getLocation()); } }