so://phie

poppy

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

blob: c185ca17adb86b4e504ad6e3d228e81a4fd91708 (3299 bytes)[doc][blame][raw]

1package poppy.modules;

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 poppy.Utils;

16

17

18public class DoubleDoorModule implements Listener

19{

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

21 {

22 Material.OAK_DOOR,

23 Material.SPRUCE_DOOR,

24 Material.BIRCH_DOOR,

25 Material.JUNGLE_DOOR,

26 Material.ACACIA_DOOR,

27 Material.DARK_OAK_DOOR,

28 Material.ACACIA_DOOR,

29 Material.CRIMSON_DOOR,

30 Material.WARPED_DOOR

31 };

32

33 @EventHandler

34 public void onPlayerInteract(PlayerInteractEvent event)

35 {

36 Player player = event.getPlayer();

37

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

39 {

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

41 {

42 Block block = event.getClickedBlock();

43

44 if(isDoor(block.getType()))

45 {

46 if(player.isSneaking())

47 {

48 if(!Utils.isEmpty(player.getInventory().getItemInMainHand()))

49 {

50 return;

51 }

52

53 if(!Utils.isEmpty(player.getInventory().getItemInOffHand()))

54 {

55 return;

56 }

57 }

58

59 BlockState state = block.getState();

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

61

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

63

64 if(location == null)

65 {

66 return;

67 }

68

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

70

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

72 {

73 return;

74 }

75

76 BlockState stateOpposite = opposite.getState();

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

78

79 if(isCompatible(door, doorOpposite))

80 {

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

82 {

83 doorOpposite.setOpen(false);

84

85 stateOpposite.setBlockData(doorOpposite);

86 stateOpposite.update();

87

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

89 }

90

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

92 {

93 doorOpposite.setOpen(true);

94

95 stateOpposite.setBlockData(doorOpposite);

96 stateOpposite.update();

97

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

99 }

100 }

101 }

102 }

103 }

104 }

105

106 private boolean isDoor(Material material)

107 {

108 for(Material door : DOOR_TYPE)

109 {

110 if(material == door)

111 {

112 return true;

113 }

114 }

115

116 return false;

117 }

118

119 private Location getOppositeDoor(Door door, Location location)

120 {

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

122

123 switch(door.getFacing())

124 {

125 case NORTH:

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

127 break;

128 case EAST:

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

130 break;

131 case SOUTH:

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

133 break;

134 case WEST:

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

136 break;

137 default:

138 return null;

139 }

140

141 return location;

142 }

143

144 private boolean isCompatible(Door door, Door doorItem)

145 {

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

147 {

148 return false;

149 }

150

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

152 {

153 return false;

154 }

155

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

157 {

158 return false;

159 }

160

161 return true;

162 }

163}