A feature-rich Minecraft plugin which enhances gaming experience
git clone git://soophie.de/poppy
blob: 012a3727ec8d6333b62e4ca4263ee6beaa6c7b4e (3489 bytes)[doc][blame][raw]
1
package de.typable.minecrafthub.event;3
import org.bukkit.Location;4
import org.bukkit.Material;5
import org.bukkit.Sound;6
import org.bukkit.block.Block;7
import org.bukkit.block.BlockState;8
import org.bukkit.block.data.type.Door;9
import org.bukkit.entity.Player;10
import org.bukkit.event.EventHandler;11
import org.bukkit.event.Listener;12
import org.bukkit.event.block.Action;13
import org.bukkit.event.player.PlayerInteractEvent;14
import org.bukkit.inventory.ItemStack;17
public class DoubleDoorListener implements Listener18
{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 };21
@EventHandler22
public void onPlayerInteract(PlayerInteractEvent event)23
{24
Player player = event.getPlayer();26
if(event.getAction() == Action.RIGHT_CLICK_BLOCK)27
{28
if(event.getClickedBlock() != null)29
{30
Block block = event.getClickedBlock();32
if(isDoor(block.getType()))33
{34
if(player.isSneaking())35
{36
if(isHoldingItem(player.getInventory().getItemInMainHand()))37
{38
return;39
}41
if(isHoldingItem(player.getInventory().getItemInOffHand()))42
{43
return;44
}45
}47
BlockState state = block.getState();48
Door door = (Door) state.getBlockData();50
Location location = getOppositeDoor(door, block.getLocation());52
if(location == null)53
{54
return;55
}57
Block opposite = block.getWorld().getBlockAt(location);59
if(block.getType() != opposite.getType())60
{61
return;62
}64
BlockState stateOpposite = opposite.getState();65
Door doorOpposite = (Door) stateOpposite.getBlockData();67
if(isCompatible(door, doorOpposite))68
{69
if(door.isOpen() && doorOpposite.isOpen())70
{71
doorOpposite.setOpen(false);73
stateOpposite.setBlockData(doorOpposite);74
stateOpposite.update();76
player.playSound(player.getLocation(), Sound.BLOCK_WOODEN_DOOR_CLOSE, 1F, 1F);77
}79
if(!door.isOpen() && !doorOpposite.isOpen())80
{81
doorOpposite.setOpen(true);83
stateOpposite.setBlockData(doorOpposite);84
stateOpposite.update();86
player.playSound(player.getLocation(), Sound.BLOCK_WOODEN_DOOR_OPEN, 1F, 1F);87
}88
}89
}90
}91
}92
}94
private boolean isHoldingItem(ItemStack item)95
{96
if(item == null)97
{98
return false;99
}101
if(item.getType() == Material.AIR)102
{103
return false;104
}106
return true;107
}109
private boolean isDoor(Material material)110
{111
for(Material door : DOOR_TYPE)112
{113
if(material == door)114
{115
return true;116
}117
}119
return false;120
}122
private Location getOppositeDoor(Door door, Location location)123
{124
int invert = door.getHinge() == Door.Hinge.LEFT ? 1 : -1;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
}144
return location;145
}147
private boolean isCompatible(Door door, Door doorItem)148
{149
if(door.getFacing() != doorItem.getFacing())150
{151
return false;152
}154
if(door.getHalf() != doorItem.getHalf())155
{156
return false;157
}159
if(door.getHinge() == doorItem.getHinge())160
{161
return false;162
}164
return true;165
}166
}