A feature-rich Minecraft plugin which enhances gaming experience
git clone git://soophie.de/poppy
blob: 63047bd9be4e05694bdd4dfe76b365e4bb8aec82 (3316 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;15
import de.typable.minecrafthub.util.Util;18
public class DoubleDoorListener implements Listener19
{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 };22
@EventHandler23
public void onPlayerInteract(PlayerInteractEvent event)24
{25
Player player = event.getPlayer();27
if(event.getAction() == Action.RIGHT_CLICK_BLOCK)28
{29
if(event.getClickedBlock() != null)30
{31
Block block = event.getClickedBlock();33
if(isDoor(block.getType()))34
{35
if(player.isSneaking())36
{37
if(!Util.isEmpty(player.getInventory().getItemInMainHand()))38
{39
return;40
}42
if(!Util.isEmpty(player.getInventory().getItemInOffHand()))43
{44
return;45
}46
}48
BlockState state = block.getState();49
Door door = (Door) state.getBlockData();51
Location location = getOppositeDoor(door, block.getLocation());53
if(location == null)54
{55
return;56
}58
Block opposite = block.getWorld().getBlockAt(location);60
if(block.getType() != opposite.getType())61
{62
return;63
}65
BlockState stateOpposite = opposite.getState();66
Door doorOpposite = (Door) stateOpposite.getBlockData();68
if(isCompatible(door, doorOpposite))69
{70
if(door.isOpen() && doorOpposite.isOpen())71
{72
doorOpposite.setOpen(false);74
stateOpposite.setBlockData(doorOpposite);75
stateOpposite.update();77
player.playSound(player.getLocation(), Sound.BLOCK_WOODEN_DOOR_CLOSE, 1F, 1F);78
}80
if(!door.isOpen() && !doorOpposite.isOpen())81
{82
doorOpposite.setOpen(true);84
stateOpposite.setBlockData(doorOpposite);85
stateOpposite.update();87
player.playSound(player.getLocation(), Sound.BLOCK_WOODEN_DOOR_OPEN, 1F, 1F);88
}89
}90
}91
}92
}93
}95
private boolean isDoor(Material material)96
{97
for(Material door : DOOR_TYPE)98
{99
if(material == door)100
{101
return true;102
}103
}105
return false;106
}108
private Location getOppositeDoor(Door door, Location location)109
{110
int invert = door.getHinge() == Door.Hinge.LEFT ? 1 : -1;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
}130
return location;131
}133
private boolean isCompatible(Door door, Door doorItem)134
{135
if(door.getFacing() != doorItem.getFacing())136
{137
return false;138
}140
if(door.getHalf() != doorItem.getHalf())141
{142
return false;143
}145
if(door.getHinge() == doorItem.getHinge())146
{147
return false;148
}150
return true;151
}152
}