so://phie

poppy

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

blob: 63047bd9be4e05694bdd4dfe76b365e4bb8aec82 (3316 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;

14

15import de.typable.minecrafthub.util.Util;

16

17

18public class DoubleDoorListener implements Listener

19{

20 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 };

21

22 @EventHandler

23 public void onPlayerInteract(PlayerInteractEvent event)

24 {

25 Player player = event.getPlayer();

26

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

28 {

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

30 {

31 Block block = event.getClickedBlock();

32

33 if(isDoor(block.getType()))

34 {

35 if(player.isSneaking())

36 {

37 if(!Util.isEmpty(player.getInventory().getItemInMainHand()))

38 {

39 return;

40 }

41

42 if(!Util.isEmpty(player.getInventory().getItemInOffHand()))

43 {

44 return;

45 }

46 }

47

48 BlockState state = block.getState();

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

50

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

52

53 if(location == null)

54 {

55 return;

56 }

57

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

59

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

61 {

62 return;

63 }

64

65 BlockState stateOpposite = opposite.getState();

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

67

68 if(isCompatible(door, doorOpposite))

69 {

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

71 {

72 doorOpposite.setOpen(false);

73

74 stateOpposite.setBlockData(doorOpposite);

75 stateOpposite.update();

76

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

78 }

79

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

81 {

82 doorOpposite.setOpen(true);

83

84 stateOpposite.setBlockData(doorOpposite);

85 stateOpposite.update();

86

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

88 }

89 }

90 }

91 }

92 }

93 }

94

95 private boolean isDoor(Material material)

96 {

97 for(Material door : DOOR_TYPE)

98 {

99 if(material == door)

100 {

101 return true;

102 }

103 }

104

105 return false;

106 }

107

108 private Location getOppositeDoor(Door door, Location location)

109 {

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

111

112 switch(door.getFacing())

113 {

114 case NORTH:

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

116 break;

117 case EAST:

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

119 break;

120 case SOUTH:

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

122 break;

123 case WEST:

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

125 break;

126 default:

127 return null;

128 }

129

130 return location;

131 }

132

133 private boolean isCompatible(Door door, Door doorItem)

134 {

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

136 {

137 return false;

138 }

139

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

141 {

142 return false;

143 }

144

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

146 {

147 return false;

148 }

149

150 return true;

151 }

152}