mirror of
				https://github.com/mcMMO-Dev/mcMMO.git
				synced 2025-11-04 02:53:43 +01:00 
			
		
		
		
	Reworked Tree Feller to take down entire tree.
This commit is contained in:
		@@ -16,9 +16,11 @@ Version 1.3.00-dev
 | 
			
		||||
 + Added framework for new Blast Mining skill
 | 
			
		||||
 + Added Fast Food Service subskill to Taming
 | 
			
		||||
 + Re-added mcMMO reporting damage events
 | 
			
		||||
 = Fixed Tree Feller not giving proper XP for different kinds of trees
 | 
			
		||||
 = Fixed memory leak with mob spawner tracking
 | 
			
		||||
 = Fixed /mcability not respecting permissions
 | 
			
		||||
 = Prettied up new config files
 | 
			
		||||
 ! Changed Tree Feller to take down entire trees
 | 
			
		||||
 ! Changed mob spawn tracking to use Unique Entity ID instead of Entity Object
 | 
			
		||||
 ! Changed stats command name to mcstats for better plugin compatibility
 | 
			
		||||
 ! Changed god mode to turn off if player enters world where he does not have mcgod permission
 | 
			
		||||
 
 | 
			
		||||
@@ -16,8 +16,6 @@
 | 
			
		||||
*/
 | 
			
		||||
package com.gmail.nossr50.listeners;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
import com.gmail.nossr50.Users;
 | 
			
		||||
import com.gmail.nossr50.m;
 | 
			
		||||
import com.gmail.nossr50.mcMMO;
 | 
			
		||||
@@ -29,9 +27,7 @@ import com.gmail.nossr50.datatypes.SkillType;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.Statistic;
 | 
			
		||||
import org.bukkit.block.Block;
 | 
			
		||||
import org.bukkit.enchantments.Enchantment;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.event.EventHandler;
 | 
			
		||||
import org.bukkit.event.EventPriority;
 | 
			
		||||
@@ -198,7 +194,7 @@ public class mcBlockListener implements Listener
 | 
			
		||||
   		 * WOOD CUTTING
 | 
			
		||||
   		 */
 | 
			
		||||
    	
 | 
			
		||||
   		if(mcPermissions.getInstance().woodcutting(player))
 | 
			
		||||
   		if(mcPermissions.getInstance().woodcutting(player) && block.getTypeId() == 17)
 | 
			
		||||
   		{
 | 
			
		||||
   			if(LoadProperties.woodcuttingrequiresaxe)
 | 
			
		||||
   			{
 | 
			
		||||
@@ -211,61 +207,12 @@ public class mcBlockListener implements Listener
 | 
			
		||||
    			WoodCutting.woodcuttingBlockCheck(player, block, plugin);
 | 
			
		||||
   			}
 | 
			
		||||
   			
 | 
			
		||||
    		/*
 | 
			
		||||
    		 * IF PLAYER IS USING TREEFELLER
 | 
			
		||||
    		 */
 | 
			
		||||
   			if(mcPermissions.getInstance().woodCuttingAbility(player) 
 | 
			
		||||
   					&& PP.getTreeFellerMode() 
 | 
			
		||||
   					&& block.getTypeId() == 17
 | 
			
		||||
   					&& m.blockBreakSimulate(block, player))
 | 
			
		||||
   			if(PP.getTreeFellerMode())
 | 
			
		||||
   			{
 | 
			
		||||
   				if(LoadProperties.spoutEnabled)
 | 
			
		||||
   					SpoutStuff.playSoundForPlayer(SoundEffect.EXPLODE, player, block.getLocation());
 | 
			
		||||
   				
 | 
			
		||||
   				PlayerAnimationEvent armswing = new PlayerAnimationEvent(player);
 | 
			
		||||
   				Bukkit.getPluginManager().callEvent(armswing);
 | 
			
		||||
   				
 | 
			
		||||
    			ArrayList<Block> fell = WoodCutting.treeFeller(block, player);
 | 
			
		||||
    			for(Block blockx : fell)
 | 
			
		||||
    			{
 | 
			
		||||
    				if(blockx != null)
 | 
			
		||||
    				{
 | 
			
		||||
    					Material mat = Material.getMaterial(block.getTypeId());
 | 
			
		||||
    					byte type = 0;
 | 
			
		||||
    					if(block.getTypeId() == 17)
 | 
			
		||||
    						type = block.getData();
 | 
			
		||||
    					ItemStack item = new ItemStack(mat, 1, (byte)0, type);
 | 
			
		||||
    					if(blockx.getTypeId() == 17)
 | 
			
		||||
    					{
 | 
			
		||||
    						m.mcDropItem(blockx.getLocation(), item);
 | 
			
		||||
    						//XP WOODCUTTING
 | 
			
		||||
    						if(!plugin.misc.blockWatchList.contains(block))
 | 
			
		||||
    						{
 | 
			
		||||
	    						WoodCutting.woodCuttingProcCheck(player, blockx);
 | 
			
		||||
	    						PP.addXP(SkillType.WOODCUTTING, LoadProperties.mpine, player);
 | 
			
		||||
    						}
 | 
			
		||||
    					}
 | 
			
		||||
    					if(blockx.getTypeId() == 18)
 | 
			
		||||
    					{
 | 
			
		||||
    						mat = Material.SAPLING;
 | 
			
		||||
    						
 | 
			
		||||
    						item = new ItemStack(mat, 1, (short)0, (byte)(blockx.getData()-8));
 | 
			
		||||
    						
 | 
			
		||||
    						if(Math.random() * 10 > 9)
 | 
			
		||||
    							m.mcDropItem(blockx.getLocation(), item);
 | 
			
		||||
    					}
 | 
			
		||||
    					if(blockx.getType() != Material.AIR)
 | 
			
		||||
    						player.incrementStatistic(Statistic.MINE_BLOCK, event.getBlock().getType());
 | 
			
		||||
    					blockx.setType(Material.AIR);
 | 
			
		||||
    				}
 | 
			
		||||
    			}
 | 
			
		||||
    			if(LoadProperties.toolsLoseDurabilityFromAbilities)
 | 
			
		||||
    	    	{
 | 
			
		||||
    	    		if(!player.getItemInHand().containsEnchantment(Enchantment.DURABILITY))
 | 
			
		||||
    	    			m.damageTool(player, (short) LoadProperties.abilityDurabilityLoss);
 | 
			
		||||
    	    	}
 | 
			
		||||
    		}
 | 
			
		||||
   			    WoodCutting.treeFeller(event, plugin);
 | 
			
		||||
   			}
 | 
			
		||||
    	}
 | 
			
		||||
   		
 | 
			
		||||
    	/*
 | 
			
		||||
    	 * EXCAVATION
 | 
			
		||||
    	 */
 | 
			
		||||
 
 | 
			
		||||
@@ -170,7 +170,6 @@ public class Axes {
 | 
			
		||||
	    					continue;
 | 
			
		||||
	    				}
 | 
			
		||||
	    			}
 | 
			
		||||
    				
 | 
			
		||||
    				else
 | 
			
		||||
	    			{			
 | 
			
		||||
	    				LivingEntity target = (LivingEntity)derp;
 | 
			
		||||
 
 | 
			
		||||
@@ -18,12 +18,13 @@ package com.gmail.nossr50.skills;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import org.bukkit.ChatColor;
 | 
			
		||||
import org.bukkit.Location;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.World;
 | 
			
		||||
import org.bukkit.block.Block;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.inventory.ItemStack;
 | 
			
		||||
import org.bukkit.enchantments.Enchantment;
 | 
			
		||||
import org.bukkit.event.block.BlockBreakEvent;
 | 
			
		||||
import org.bukkit.event.player.PlayerAnimationEvent;
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import com.gmail.nossr50.Users;
 | 
			
		||||
@@ -40,6 +41,107 @@ import org.getspout.spoutapi.sound.SoundEffect;
 | 
			
		||||
 | 
			
		||||
public class WoodCutting 
 | 
			
		||||
{
 | 
			
		||||
    public static void treeFeller(BlockBreakEvent event, mcMMO plugin)
 | 
			
		||||
    {
 | 
			
		||||
        //Setup vars
 | 
			
		||||
        Player player = event.getPlayer();
 | 
			
		||||
        Block firstBlock = event.getBlock();
 | 
			
		||||
        PlayerProfile PP = Users.getProfile(player);
 | 
			
		||||
        World world = firstBlock.getWorld();
 | 
			
		||||
        
 | 
			
		||||
        //Prepare array
 | 
			
		||||
        ArrayList<Block> toBeFelled = new ArrayList<Block>();
 | 
			
		||||
        
 | 
			
		||||
        //NOTE: Tree Feller will cut upwards like how you actually fell trees
 | 
			
		||||
        processTreeFelling(firstBlock, world, toBeFelled);
 | 
			
		||||
        removeBlocks(toBeFelled, player, PP, plugin);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private static void removeBlocks(ArrayList<Block> toBeFelled, Player player, PlayerProfile PP, mcMMO plugin)
 | 
			
		||||
    {
 | 
			
		||||
        for(Block x : toBeFelled)
 | 
			
		||||
        {
 | 
			
		||||
            //Stupid NoCheat compatibility stuff
 | 
			
		||||
            PlayerAnimationEvent armswing = new PlayerAnimationEvent(player);
 | 
			
		||||
            Bukkit.getPluginManager().callEvent(armswing);
 | 
			
		||||
            
 | 
			
		||||
            if(m.blockBreakSimulate(x, player))
 | 
			
		||||
            {
 | 
			
		||||
                if(x.getType() == Material.LOG || x.getType() == Material.LEAVES)
 | 
			
		||||
                {
 | 
			
		||||
                    if(x.getType() == Material.LOG)
 | 
			
		||||
                    {
 | 
			
		||||
                        byte type = x.getData();
 | 
			
		||||
                        ItemStack item = new ItemStack(x.getType(), 1, (byte)0, type);
 | 
			
		||||
                        
 | 
			
		||||
                        if(!plugin.misc.blockWatchList.contains(x))
 | 
			
		||||
                        {
 | 
			
		||||
                            WoodCutting.woodCuttingProcCheck(player, x);
 | 
			
		||||
                            PP.addXP(SkillType.WOODCUTTING, LoadProperties.mpine, player);
 | 
			
		||||
                        }
 | 
			
		||||
                        
 | 
			
		||||
                        //Drop the block
 | 
			
		||||
                        x.getWorld().dropItemNaturally(x.getLocation(), item);
 | 
			
		||||
                        
 | 
			
		||||
                        //Remove the block
 | 
			
		||||
                        x.setData((byte) 0);
 | 
			
		||||
                        x.setType(Material.AIR);
 | 
			
		||||
                        
 | 
			
		||||
                    } else if(x.getType() == Material.LEAVES) 
 | 
			
		||||
                    {
 | 
			
		||||
                        Material mat = Material.SAPLING;
 | 
			
		||||
                        ItemStack item = new ItemStack(mat, 1, (short)0, (byte)(x.getData()-8));
 | 
			
		||||
                        
 | 
			
		||||
                        //1 in 10 chance to drop sapling
 | 
			
		||||
                        if(Math.random() * 10 > 9)
 | 
			
		||||
                            m.mcDropItem(x.getLocation(), item);
 | 
			
		||||
                        
 | 
			
		||||
                        //Remove the block
 | 
			
		||||
                        x.setData((byte) 0);
 | 
			
		||||
                        x.setType(Material.AIR);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    private static boolean treeFellerCompatible(Block block)
 | 
			
		||||
    {
 | 
			
		||||
        return block.getType() == Material.LOG || block.getType() == Material.LEAVES;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private static void processTreeFelling(Block currentBlock, World world, ArrayList<Block> toBeFelled)
 | 
			
		||||
    {
 | 
			
		||||
        int x = currentBlock.getX(), y = currentBlock.getY(), z = currentBlock.getZ();
 | 
			
		||||
        
 | 
			
		||||
        
 | 
			
		||||
       toBeFelled.add(currentBlock);
 | 
			
		||||
        
 | 
			
		||||
        //ORDER = X+, Z+, Z-, X-
 | 
			
		||||
        Block xPositive = world.getBlockAt(x+1, y, z);
 | 
			
		||||
        Block xNegative = world.getBlockAt(x-1, y, z);
 | 
			
		||||
        Block zPositive = world.getBlockAt(x, y, z+1);
 | 
			
		||||
        Block zNegative = world.getBlockAt(x, y, z-1);
 | 
			
		||||
        
 | 
			
		||||
        if(treeFellerCompatible(xPositive) && !toBeFelled.contains(xPositive))
 | 
			
		||||
            processTreeFelling(xPositive, world, toBeFelled);
 | 
			
		||||
        if(treeFellerCompatible(xNegative) && !toBeFelled.contains(xNegative))
 | 
			
		||||
            processTreeFelling(xNegative, world, toBeFelled);
 | 
			
		||||
        if(treeFellerCompatible(zPositive) && !toBeFelled.contains(zPositive))
 | 
			
		||||
            processTreeFelling(zPositive, world, toBeFelled);
 | 
			
		||||
        if(treeFellerCompatible(zNegative) && !toBeFelled.contains(zNegative))
 | 
			
		||||
            processTreeFelling(zNegative, world, toBeFelled);
 | 
			
		||||
        
 | 
			
		||||
        //Finally go Y+
 | 
			
		||||
        Block yPositive = world.getBlockAt(x, y+1, z);
 | 
			
		||||
        
 | 
			
		||||
        if(treeFellerCompatible(yPositive))
 | 
			
		||||
        {
 | 
			
		||||
            if(!toBeFelled.contains(yPositive))
 | 
			
		||||
            {
 | 
			
		||||
                processTreeFelling(yPositive, world, toBeFelled);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public static void woodCuttingProcCheck(Player player, Block block)
 | 
			
		||||
    {
 | 
			
		||||
@@ -55,6 +157,7 @@ public class WoodCutting
 | 
			
		||||
    		}
 | 
			
		||||
    	}
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public static void treeFellerCheck(Player player, Block block)
 | 
			
		||||
    {
 | 
			
		||||
    	PlayerProfile PP = Users.getProfile(player);
 | 
			
		||||
@@ -72,8 +175,10 @@ public class WoodCutting
 | 
			
		||||
    		{
 | 
			
		||||
    			PP.setAxePreparationMode(false);
 | 
			
		||||
    		}
 | 
			
		||||
    		
 | 
			
		||||
    		int ticks = 2;
 | 
			
		||||
    		int x = PP.getSkillLevel(SkillType.WOODCUTTING);
 | 
			
		||||
    		
 | 
			
		||||
    		while(x >= 50)
 | 
			
		||||
    		{
 | 
			
		||||
    			x-=50;
 | 
			
		||||
@@ -97,70 +202,6 @@ public class WoodCutting
 | 
			
		||||
    		}
 | 
			
		||||
    	}
 | 
			
		||||
    }
 | 
			
		||||
    public static ArrayList<Block> 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<Block> blockList = new ArrayList<Block>();
 | 
			
		||||
        ArrayList<Block> returnList = new ArrayList<Block>();
 | 
			
		||||
 | 
			
		||||
        if(block != null)
 | 
			
		||||
        	blockList.add(block);
 | 
			
		||||
 | 
			
		||||
        boolean isDone = false;
 | 
			
		||||
        while(isDone == false){
 | 
			
		||||
        	isDone = addBlocksToTreeFelling(blockList, returnList, radius);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return returnList;
 | 
			
		||||
    }
 | 
			
		||||
    public static boolean addBlocksToTreeFelling(ArrayList<Block> blocklist, ArrayList<Block> 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)
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user