so://phie

poppy

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

blob: 012a3727ec8d6333b62e4ca4263ee6beaa6c7b4e (3489 bytes)[doc][blame][raw]

1package de.typable.minecrafthub.event;

2

3import org.bukkit.Location;

4import org.bukkit.Material;

5import org.bukkit.Sound;

6import org.bukkit.block.Block;

7import org.bukkit.block.BlockState;

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

9import org.bukkit.entity.Player;

10import org.bukkit.event.EventHandler;

11import org.bukkit.event.Listener;

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

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

14import org.bukkit.inventory.ItemStack;

15

16

17public class DoubleDoorListener implements Listener

18{

19 private static final Material[] DOOR_TYPE = new Material[] { Material.OAK_DOOR, Material.SPRUCE_DOOR, Material.BIRCH_DOOR, Material.JUNGLE_DOOR, Material.ACACIA_DOOR, Material.DARK_OAK_DOOR, Material.ACACIA_DOOR, Material.CRIMSON_DOOR, Material.WARPED_DOOR };

20

21 @EventHandler

22 public void onPlayerInteract(PlayerInteractEvent event)

23 {

24 Player player = event.getPlayer();

25

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

27 {

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

29 {

30 Block block = event.getClickedBlock();

31

32 if(isDoor(block.getType()))

33 {

34 if(player.isSneaking())

35 {

36 if(isHoldingItem(player.getInventory().getItemInMainHand()))

37 {

38 return;

39 }

40

41 if(isHoldingItem(player.getInventory().getItemInOffHand()))

42 {

43 return;

44 }

45 }

46

47 BlockState state = block.getState();

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

49

50 Location location = getOppositeDoor(door, block.getLocation());

51

52 if(location == null)

53 {

54 return;

55 }

56

57 Block opposite = block.getWorld().getBlockAt(location);

58

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

60 {

61 return;

62 }

63

64 BlockState stateOpposite = opposite.getState();

65 Door doorOpposite = (Door) stateOpposite.getBlockData();

66

67 if(isCompatible(door, doorOpposite))

68 {

69 if(door.isOpen() && doorOpposite.isOpen())

70 {

71 doorOpposite.setOpen(false);

72

73 stateOpposite.setBlockData(doorOpposite);

74 stateOpposite.update();

75

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

77 }

78

79 if(!door.isOpen() && !doorOpposite.isOpen())

80 {

81 doorOpposite.setOpen(true);

82

83 stateOpposite.setBlockData(doorOpposite);

84 stateOpposite.update();

85

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

87 }

88 }

89 }

90 }

91 }

92 }

93

94 private boolean isHoldingItem(ItemStack item)

95 {

96 if(item == null)

97 {

98 return false;

99 }

100

101 if(item.getType() == Material.AIR)

102 {

103 return false;

104 }

105

106 return true;

107 }

108

109 private boolean isDoor(Material material)

110 {

111 for(Material door : DOOR_TYPE)

112 {

113 if(material == door)

114 {

115 return true;

116 }

117 }

118

119 return false;

120 }

121

122 private Location getOppositeDoor(Door door, Location location)

123 {

124 int invert = door.getHinge() == Door.Hinge.LEFT ? 1 : -1;

125

126 switch(door.getFacing())

127 {

128 case NORTH:

129 location.add(1 * invert, 0, 0);

130 break;

131 case EAST:

132 location.add(0, 0, 1 * invert);

133 break;

134 case SOUTH:

135 location.add(-1 * invert, 0, 0);

136 break;

137 case WEST:

138 location.add(0, 0, -1 * invert);

139 break;

140 default:

141 return null;

142 }

143

144 return location;

145 }

146

147 private boolean isCompatible(Door door, Door doorItem)

148 {

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

150 {

151 return false;

152 }

153

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

155 {

156 return false;

157 }

158

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

160 {

161 return false;

162 }

163

164 return true;

165 }

166}