A feature-rich Minecraft plugin which enhances gaming experience
git clone git://soophie.de/poppy
blob: b3039efb9947fc60e6b6430df097d31932e4f7c6 (6014 bytes)[doc][blame][raw]
1
package poppy.modules;3
import java.util.HashSet;5
import org.bukkit.Bukkit;6
import org.bukkit.Material;7
import org.bukkit.Tag;8
import org.bukkit.block.Block;9
import org.bukkit.block.BlockFace;10
import org.bukkit.block.BlockState;11
import org.bukkit.block.Chest;12
import org.bukkit.block.Dispenser;13
import org.bukkit.block.data.Directional;14
import org.bukkit.enchantments.Enchantment;15
import org.bukkit.event.EventHandler;16
import org.bukkit.event.Listener;17
import org.bukkit.event.block.BlockDispenseEvent;18
import org.bukkit.inventory.Inventory;19
import org.bukkit.inventory.ItemStack;20
import org.bukkit.inventory.meta.Damageable;21
import org.bukkit.inventory.meta.ItemMeta;22
import org.bukkit.plugin.Plugin;24
import poppy.Utils;26
public class AutoBreakerModule implements Listener27
{28
private Plugin plugin;30
public AutoBreakerModule(Plugin plugin)31
{32
this.plugin = plugin;33
}35
@EventHandler36
public void onBlockDispenseEvent(BlockDispenseEvent event)37
{38
final Block block = event.getBlock();39
final BlockState blockState = block.getState();40
final ItemStack item = event.getItem();42
if(blockState instanceof Dispenser)43
{44
final Dispenser dispenser = (Dispenser) blockState;46
if(dispenser.getCustomName() != null && dispenser.getCustomName().toLowerCase().equals("breaker"))47
{48
event.setCancelled(true);50
if(block.getBlockData() instanceof Directional)51
{52
final Directional direction = (Directional) dispenser.getBlockData();53
final Block faceBlock = dispenser.getBlock().getRelative(direction.getFacing());55
final HashSet<ItemStack> drops = new HashSet<ItemStack>(faceBlock.getDrops(item));57
if(item.getType().toString().endsWith("_PICKAXE"))58
{59
if(Tag.MINEABLE_PICKAXE.isTagged(faceBlock.getType()))60
{61
if(!addItemToChest(direction, dispenser, drops))62
{63
setDamage(item, dispenser);64
faceBlock.breakNaturally(item);65
}66
else67
{68
setDamage(item, dispenser);69
faceBlock.setType(Material.AIR);70
}71
}72
}74
if(item.getType().toString().endsWith("_AXE"))75
{76
if(Tag.MINEABLE_AXE.isTagged(faceBlock.getType()))77
{78
if(!addItemToChest(direction, dispenser, drops))79
{80
setDamage(item, dispenser);81
faceBlock.breakNaturally(item);82
}83
else84
{85
setDamage(item, dispenser);86
faceBlock.setType(Material.AIR);87
}88
}89
}91
if(item.getType().toString().endsWith("_SHOVEL"))92
{93
if(Tag.MINEABLE_SHOVEL.isTagged(faceBlock.getType()))94
{95
if(!addItemToChest(direction, dispenser, drops))96
{97
setDamage(item, dispenser);98
faceBlock.breakNaturally(item);99
}100
else101
{102
setDamage(item, dispenser);103
faceBlock.setType(Material.AIR);104
}105
}106
}108
if(item.getType().toString().endsWith("_HOE"))109
{110
if(Tag.MINEABLE_HOE.isTagged(faceBlock.getType()))111
{112
if(!addItemToChest(direction, dispenser, drops))113
{114
setDamage(item, dispenser);115
faceBlock.breakNaturally(item);116
}117
else118
{119
setDamage(item, dispenser);120
faceBlock.setType(Material.AIR);121
}122
}123
}125
if(item.getType().toString().endsWith("_PICKAXE") && !Utils.isAir(faceBlock.getType())126
&& !Tag.MINEABLE_PICKAXE.isTagged(faceBlock.getType())127
&& !Tag.MINEABLE_HOE.isTagged(faceBlock.getType())128
&& !Tag.MINEABLE_AXE.isTagged(faceBlock.getType())129
&& !Tag.MINEABLE_SHOVEL.isTagged(faceBlock.getType()))130
{131
setDamage(item, dispenser);132
faceBlock.breakNaturally(item);133
}134
}135
}136
}137
}139
public boolean isInventoryFullList(Inventory inventory, HashSet<ItemStack> items)140
{141
final HashSet<ItemStack> itemsCopy = new HashSet<ItemStack>(items);143
for(ItemStack item : itemsCopy)144
{145
if(!Utils.isInventoryFull(inventory, item))146
{147
itemsCopy.remove(item);148
}149
}150
return itemsCopy.size() != 0;151
}153
public boolean addItemToChest(Directional direction, Dispenser dispenser, HashSet<ItemStack> items)154
{155
Chest chest = null;156
boolean succeeded = false;158
for(BlockFace face : faces)159
{160
if(!face.equals(direction.getFacing()) && chest == null)161
{162
final Block blockAtFacing = dispenser.getBlock().getRelative(face);163
final BlockState blockStateAtFacing = blockAtFacing.getState();165
if(blockAtFacing.getType().equals(Material.CHEST) && blockStateAtFacing instanceof Chest)166
{167
final Chest chestBlock = (Chest) blockStateAtFacing;169
if(!isInventoryFullList(chestBlock.getInventory(), items))170
{171
for(ItemStack item : items)172
{173
chestBlock.getInventory().addItem(item);174
}175
succeeded = true;176
break;177
}178
chest = chestBlock;179
}180
}181
}182
return succeeded;183
}185
public void setDamage(ItemStack item, Dispenser dispenser)186
{187
Bukkit.getScheduler().runTaskLater(plugin, () -> {188
if(Utils.randomlyReduceDurability(item.getEnchantmentLevel(Enchantment.DURABILITY)))189
{190
final ItemMeta itemMeta = item.getItemMeta();191
final int slot = dispenser.getInventory().first(item);193
if(itemMeta instanceof Damageable && slot != -1)194
{195
final ItemStack itemstack = dispenser.getInventory().getItem(slot);196
final Damageable itemDamage = (Damageable) itemstack.getItemMeta();198
if(itemDamage.getDamage() == 0)199
{200
itemDamage.setDamage(1);201
}202
else if(itemDamage.getDamage() != 0)203
{204
final int addedDamage = itemDamage.getDamage() + 1;206
if(addedDamage < itemstack.getType().getMaxDurability())207
{208
itemDamage.setDamage(addedDamage);209
}210
else211
{212
itemstack.setType(Material.AIR);213
}214
}215
itemstack.setItemMeta(itemDamage);216
dispenser.getInventory().setItem(slot, itemstack);217
}218
}219
}, 1);220
}222
private static final BlockFace[] faces = {223
BlockFace.DOWN,224
BlockFace.UP,225
BlockFace.NORTH,226
BlockFace.EAST,227
BlockFace.SOUTH,228
BlockFace.WEST229
};230
}