so://phie

poppy

A feature-rich Minecraft plugin which enhances gaming experience
git clone git://soophie.de/poppy

blob: a5f72a7ffa3fcbc5c3e111ecb9883d7dad717e53 (6028 bytes)[doc][blame][raw]

1package poppy.modules;

2

3import java.util.HashSet;

4

5import org.bukkit.Bukkit;

6import org.bukkit.Material;

7import org.bukkit.Tag;

8import org.bukkit.block.Block;

9import org.bukkit.block.BlockFace;

10import org.bukkit.block.BlockState;

11import org.bukkit.block.Chest;

12import org.bukkit.block.Dispenser;

13import org.bukkit.block.data.Directional;

14import org.bukkit.enchantments.Enchantment;

15import org.bukkit.event.EventHandler;

16import org.bukkit.event.Listener;

17import org.bukkit.event.block.BlockDispenseEvent;

18import org.bukkit.inventory.Inventory;

19import org.bukkit.inventory.ItemStack;

20import org.bukkit.inventory.meta.Damageable;

21import org.bukkit.inventory.meta.ItemMeta;

22import org.bukkit.plugin.Plugin;

23

24import poppy.Utils;

25

26public class AutoBreakerModule implements Listener

27{

28 private Plugin plugin;

29

30 public AutoBreakerModule(Plugin plugin)

31 {

32 this.plugin = plugin;

33 }

34

35 @EventHandler

36 public void onBlockDispenseEvent(BlockDispenseEvent event)

37 {

38 final Block block = event.getBlock();

39 final BlockState blockState = block.getState();

40 final ItemStack item = event.getItem();

41

42 if(blockState instanceof Dispenser)

43 {

44 final Dispenser dispenser = (Dispenser) blockState;

45

46 if(dispenser.getCustomName() != null && dispenser.getCustomName().toLowerCase().equals("breaker"))

47 {

48 event.setCancelled(true);

49

50 if(block.getBlockData() instanceof Directional)

51 {

52 final Directional direction = (Directional) dispenser.getBlockData();

53 final Block faceBlock = dispenser.getBlock().getRelative(direction.getFacing());

54

55 final HashSet<ItemStack> drops = new HashSet<ItemStack>(faceBlock.getDrops(item));

56

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 else

67 {

68 setDamage(item, dispenser);

69 faceBlock.setType(Material.AIR);

70 }

71 }

72 }

73

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 else

84 {

85 setDamage(item, dispenser);

86 faceBlock.setType(Material.AIR);

87 }

88 }

89 }

90

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 else

101 {

102 setDamage(item, dispenser);

103 faceBlock.setType(Material.AIR);

104 }

105 }

106 }

107

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 else

118 {

119 setDamage(item, dispenser);

120 faceBlock.setType(Material.AIR);

121 }

122 }

123 }

124

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 }

138

139 public static boolean isInventoryFullList(Inventory inventory, HashSet<ItemStack> items)

140 {

141 final HashSet<ItemStack> itemsCopy = new HashSet<ItemStack>(items);

142

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 }

152

153 public static boolean addItemToChest(Directional direction, Dispenser dispenser, HashSet<ItemStack> items)

154 {

155 Chest chest = null;

156 boolean succeeded = false;

157

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();

164

165 if(blockAtFacing.getType().equals(Material.CHEST) && blockStateAtFacing instanceof Chest)

166 {

167 final Chest chestBlock = (Chest) blockStateAtFacing;

168

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 }

184

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);

192

193 if(itemMeta instanceof Damageable && slot != -1)

194 {

195 final ItemStack itemstack = dispenser.getInventory().getItem(slot);

196 final Damageable itemDamage = (Damageable) itemstack.getItemMeta();

197

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;

205

206 if(addedDamage < itemstack.getType().getMaxDurability())

207 {

208 itemDamage.setDamage(addedDamage);

209 }

210 else

211 {

212 itemstack.setType(Material.AIR);

213 }

214 }

215 itemstack.setItemMeta(itemDamage);

216 dispenser.getInventory().setItem(slot, itemstack);

217 }

218 }

219 }, 1);

220 }

221

222 private static final BlockFace[] faces = {

223 BlockFace.DOWN,

224 BlockFace.UP,

225 BlockFace.NORTH,

226 BlockFace.EAST,

227 BlockFace.SOUTH,

228 BlockFace.WEST

229 };

230}