A feature-rich Minecraft plugin which enhances gaming experience
git clone git://soophie.de/poppy
blob: 1570687ca102c45f6eb61b759dd5f52d96558429 (2349 bytes)[doc][blame][raw]
1
package poppy.modules;3
import java.util.ArrayList;4
import java.util.Arrays;5
import java.util.Collections;6
import java.util.List;8
import org.bukkit.Tag;9
import org.bukkit.block.Block;10
import org.bukkit.block.BlockFace;11
import org.bukkit.block.data.type.Leaves;12
import org.bukkit.event.EventHandler;13
import org.bukkit.event.Listener;14
import org.bukkit.event.block.BlockBreakEvent;15
import org.bukkit.event.block.LeavesDecayEvent;16
import org.bukkit.plugin.Plugin;18
public class LeavesDecayModule implements Listener19
{20
private static final int DELAY = 25;21
private static final List<BlockFace> NEIGHBORS = Arrays.asList(22
BlockFace.UP,23
BlockFace.NORTH,24
BlockFace.EAST,25
BlockFace.SOUTH,26
BlockFace.WEST,27
BlockFace.DOWN28
);30
private Plugin plugin;31
private List<Block> scheduled = new ArrayList<>();33
public LeavesDecayModule(Plugin plugin)34
{35
this.plugin = plugin;36
}38
@EventHandler39
public void onBlockBreak(BlockBreakEvent event)40
{41
onBlockRemove(event.getBlock());42
}44
@EventHandler45
public void onLeavesDecay(LeavesDecayEvent event)46
{47
onBlockRemove(event.getBlock());48
}50
private void onBlockRemove(Block block)51
{52
if(!Tag.LOGS.isTagged(block.getType()) && !Tag.LEAVES.isTagged(block.getType()))53
{54
return;55
}57
Collections.shuffle(NEIGHBORS);59
for(BlockFace face : NEIGHBORS)60
{61
final Block neighbor = block.getRelative(face);63
if(!Tag.LEAVES.isTagged(neighbor.getType()))64
{65
continue;66
}68
Leaves leaves = (Leaves) neighbor.getBlockData();70
if(leaves.isPersistent())71
{72
continue;73
}75
if(scheduled.contains(neighbor))76
{77
continue;78
}80
plugin.getServer().getScheduler().runTaskLater(plugin, () -> decay(neighbor), DELAY);82
scheduled.add(neighbor);83
}84
}86
private boolean decay(Block block)87
{88
scheduled.remove(block);90
if(!block.getWorld().isChunkLoaded(block.getX() >> 4, block.getZ() >> 4))91
{92
return false;93
}95
if(!Tag.LEAVES.isTagged(block.getType()))96
{97
return false;98
}100
Leaves leaves = (Leaves) block.getBlockData();102
if(leaves.isPersistent())103
{104
return false;105
}107
if(leaves.getDistance() < 7)108
{109
return false;110
}112
LeavesDecayEvent event = new LeavesDecayEvent(block);113
plugin.getServer().getPluginManager().callEvent(event);115
if(event.isCancelled())116
{117
return false;118
}120
block.breakNaturally();122
return true;123
}124
}