so://phie

poppy

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

blob: 4c08d177fee2a413da44ca35b7172839077208df (2979 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.block.Block;

9import org.bukkit.block.BlockState;

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

11import org.bukkit.event.EventHandler;

12import org.bukkit.event.Listener;

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

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

15

16public class DoubleDoorListener implements Listener

17{

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

19 Material.OAK_DOOR,

20 Material.SPRUCE_DOOR,

21 Material.BIRCH_DOOR,

22 Material.JUNGLE_DOOR,

23 Material.ACACIA_DOOR,

24 Material.DARK_OAK_DOOR,

25 Material.ACACIA_DOOR,

26 Material.CRIMSON_DOOR,

27 Material.WARPED_DOOR

28 };

29

30 @EventHandler

31 public void onPlayerInteract(PlayerInteractEvent event)

32 {

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

34 {

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

36 {

37 Block block = event.getClickedBlock();

38

39 if(isDoor(block.getType()))

40 {

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

42

43 if(blockList.isEmpty())

44 {

45 return;

46 }

47

48 for(Block blockItem : blockList)

49 {

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

51 {

52 continue;

53 }

54

55 BlockState state = block.getState();

56 BlockState stateItem = blockItem.getState();

57

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

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

60

61 if(isCompatible(door, doorItem))

62 {

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

64 {

65 doorItem.setOpen(false);

66

67 stateItem.setBlockData(doorItem);

68 stateItem.update();

69 }

70

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

72 {

73 doorItem.setOpen(true);

74

75 stateItem.setBlockData(doorItem);

76 stateItem.update();

77 }

78 }

79 }

80 }

81 }

82 }

83 }

84

85 private boolean isDoor(Material material)

86 {

87 for(Material door : DOOR_TYPE)

88 {

89 if(material == door)

90 {

91 return true;

92 }

93 }

94

95 return false;

96 }

97

98 private boolean isCompatible(Door door, Door doorItem)

99 {

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

101 {

102 return false;

103 }

104

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

106 {

107 return false;

108 }

109

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

111 {

112 return false;

113 }

114

115 return true;

116 }

117

118 private List<Block> getNearbyDoors(Location location)

119 {

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

121

122 int blockX = location.getBlockX();

123 int blockY = location.getBlockY();

124 int blockZ = location.getBlockZ();

125

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

127 {

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

129 {

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

131 {

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

133

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

135 {

136 blockList.add(block);

137 }

138 }

139 }

140 }

141

142 return blockList;

143 }

144}