so://phie

poppy

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

blob: f47284dd2060d660f2c4828d0773941fd8f312d1 (2309 bytes)[doc][blame][raw]

1package poppy.modules;

2

3import java.util.Set;

4

5import org.bukkit.Bukkit;

6import org.bukkit.Material;

7import org.bukkit.Tag;

8import org.bukkit.block.Block;

9import org.bukkit.block.BlockState;

10import org.bukkit.block.Dispenser;

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

12import org.bukkit.event.EventHandler;

13import org.bukkit.event.Listener;

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

15import org.bukkit.inventory.ItemStack;

16import org.bukkit.inventory.meta.BlockStateMeta;

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

18import org.bukkit.plugin.Plugin;

19

20import poppy.Utils;

21

22public class AutoPlacerModule implements Listener

23{

24 private Plugin plugin;

25

26 public AutoPlacerModule(Plugin plugin)

27 {

28 this.plugin = plugin;

29 }

30

31 @EventHandler

32 public void onBlockDispenseEvent(BlockDispenseEvent event)

33 {

34 final Block block = event.getBlock();

35 final BlockState blockState = block.getState();

36 final ItemStack item = event.getItem();

37

38 if(blockState instanceof Dispenser)

39 {

40 Dispenser dispenser = (Dispenser) blockState;

41

42 if(dispenser.getCustomName() != null && dispenser.getCustomName().toLowerCase().equals("placer"))

43 {

44 event.setCancelled(true);

45

46 if(block.getBlockData() instanceof Directional)

47 {

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

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

50

51 if(item.getType().isBlock() && Utils.isAir(faceBlock.getType()) && !isShulkerboxContent(item))

52 {

53 faceBlock.setType(item.getType());

54 removeSnapshotItem(dispenser, item.getType(), 1);

55 }

56 }

57

58 if(isShulkerboxContent(item))

59 {

60 event.setCancelled(false);

61 }

62 }

63 }

64 }

65

66 public boolean isShulkerboxContent(ItemStack itemStack)

67 {

68 final ItemMeta itemMeta = itemStack.getItemMeta();

69 final Set<Material> shulkerboxes = Tag.SHULKER_BOXES.getValues();

70

71 for(Material material : shulkerboxes)

72 {

73 if(itemStack.getType().equals(material) && itemMeta instanceof BlockStateMeta)

74 {

75 return true;

76 }

77 }

78 return false;

79 }

80

81 public void removeSnapshotItem(Dispenser dispenser, Material material, int amount)

82 {

83 Bukkit.getScheduler().runTaskLater(plugin, () -> {

84 dispenser.getSnapshotInventory().addItem(new ItemStack(material, -amount));

85 dispenser.update();

86 }, 1);

87 }

88}