so://phie

poppy

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

blob: a6ffc225eb59e7b97713c94fd3311fbb4fe69fbf (3331 bytes)[doc][blame][raw]

1package de.typable.minecrafthub.event;

2

3import java.util.ArrayList;

4import java.util.List;

5

6import org.bukkit.Location;

7import org.bukkit.Material;

8import org.bukkit.Sound;

9import org.bukkit.block.Block;

10import org.bukkit.block.BlockState;

11import org.bukkit.block.data.type.Door;

12import org.bukkit.entity.Player;

13import org.bukkit.event.EventHandler;

14import org.bukkit.event.Listener;

15import org.bukkit.event.block.Action;

16import org.bukkit.event.player.PlayerInteractEvent;

17

18public class DoubleDoorListener implements Listener

19{

20 private static final Material[] DOOR_TYPE = new Material[] {

21 Material.OAK_DOOR,

22 Material.SPRUCE_DOOR,

23 Material.BIRCH_DOOR,

24 Material.JUNGLE_DOOR,

25 Material.ACACIA_DOOR,

26 Material.DARK_OAK_DOOR,

27 Material.ACACIA_DOOR,

28 Material.CRIMSON_DOOR,

29 Material.WARPED_DOOR

30 };

31

32 @EventHandler

33 public void onPlayerInteract(PlayerInteractEvent event)

34 {

35 Player player = event.getPlayer();

36

37 if(event.getAction() == Action.RIGHT_CLICK_BLOCK)

38 {

39 if(event.getClickedBlock() != null)

40 {

41 Block block = event.getClickedBlock();

42

43 if(isDoor(block.getType()))

44 {

45 List<Block> blockList = getNearbyDoors(block.getLocation());

46

47 if(player.isSneaking())

48 {

49 return;

50 }

51

52 if(blockList.isEmpty())

53 {

54 return;

55 }

56

57 for(Block blockItem : blockList)

58 {

59 if(block.getType() != blockItem.getType())

60 {

61 continue;

62 }

63

64 BlockState state = block.getState();

65 BlockState stateItem = blockItem.getState();

66

67 Door door = (Door) state.getBlockData();

68 Door doorItem = (Door) stateItem.getBlockData();

69

70 if(isCompatible(door, doorItem))

71 {

72 if(door.isOpen() && doorItem.isOpen())

73 {

74 doorItem.setOpen(false);

75

76 stateItem.setBlockData(doorItem);

77 stateItem.update();

78

79 player.playSound(player.getLocation(), Sound.BLOCK_WOODEN_DOOR_CLOSE, 1F, 1F);

80 }

81

82 if(!door.isOpen() && !doorItem.isOpen())

83 {

84 doorItem.setOpen(true);

85

86 stateItem.setBlockData(doorItem);

87 stateItem.update();

88

89 player.playSound(player.getLocation(), Sound.BLOCK_WOODEN_DOOR_OPEN, 1F, 1F);

90 }

91 }

92 }

93 }

94 }

95 }

96 }

97

98 private boolean isDoor(Material material)

99 {

100 for(Material door : DOOR_TYPE)

101 {

102 if(material == door)

103 {

104 return true;

105 }

106 }

107

108 return false;

109 }

110

111 private boolean isCompatible(Door door, Door doorItem)

112 {

113 if(door.getFacing() != doorItem.getFacing())

114 {

115 return false;

116 }

117

118 if(door.getHalf() != doorItem.getHalf())

119 {

120 return false;

121 }

122

123 if(door.getHinge() == doorItem.getHinge())

124 {

125 return false;

126 }

127

128 return true;

129 }

130

131 private List<Block> getNearbyDoors(Location location)

132 {

133 List<Block> blockList = new ArrayList<>();

134

135 int blockX = location.getBlockX();

136 int blockY = location.getBlockY();

137 int blockZ = location.getBlockZ();

138

139 for(int x = blockX - 1; x <= blockX + 1; x++)

140 {

141 for(int z = blockZ - 1; z <= blockZ + 1; z++)

142 {

143 if(blockX != x || blockZ != z)

144 {

145 Block block = location.getWorld().getBlockAt(x, blockY, z);

146

147 if(block != null && isDoor(block.getType()))

148 {

149 blockList.add(block);

150 }

151 }

152 }

153 }

154

155 return blockList;

156 }

157}