A feature-rich Minecraft plugin which enhances gaming experience
git clone git://soophie.de/poppy
blob: c185ca17adb86b4e504ad6e3d228e81a4fd91708 (3299 bytes)[doc][blame][raw]
1
package poppy.modules;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 poppy.Utils;18
public class DoubleDoorModule implements Listener19
{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_DOOR31
};33
@EventHandler34
public void onPlayerInteract(PlayerInteractEvent event)35
{36
Player player = event.getPlayer();38
if(event.getAction() == Action.RIGHT_CLICK_BLOCK)39
{40
if(event.getClickedBlock() != null)41
{42
Block block = event.getClickedBlock();44
if(isDoor(block.getType()))45
{46
if(player.isSneaking())47
{48
if(!Utils.isEmpty(player.getInventory().getItemInMainHand()))49
{50
return;51
}53
if(!Utils.isEmpty(player.getInventory().getItemInOffHand()))54
{55
return;56
}57
}59
BlockState state = block.getState();60
Door door = (Door) state.getBlockData();62
Location location = getOppositeDoor(door, block.getLocation());64
if(location == null)65
{66
return;67
}69
Block opposite = block.getWorld().getBlockAt(location);71
if(block.getType() != opposite.getType())72
{73
return;74
}76
BlockState stateOpposite = opposite.getState();77
Door doorOpposite = (Door) stateOpposite.getBlockData();79
if(isCompatible(door, doorOpposite))80
{81
if(door.isOpen() && doorOpposite.isOpen())82
{83
doorOpposite.setOpen(false);85
stateOpposite.setBlockData(doorOpposite);86
stateOpposite.update();88
player.playSound(player.getLocation(), Sound.BLOCK_WOODEN_DOOR_CLOSE, 1F, 1F);89
}91
if(!door.isOpen() && !doorOpposite.isOpen())92
{93
doorOpposite.setOpen(true);95
stateOpposite.setBlockData(doorOpposite);96
stateOpposite.update();98
player.playSound(player.getLocation(), Sound.BLOCK_WOODEN_DOOR_OPEN, 1F, 1F);99
}100
}101
}102
}103
}104
}106
private boolean isDoor(Material material)107
{108
for(Material door : DOOR_TYPE)109
{110
if(material == door)111
{112
return true;113
}114
}116
return false;117
}119
private Location getOppositeDoor(Door door, Location location)120
{121
int invert = door.getHinge() == Door.Hinge.LEFT ? 1 : -1;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
}141
return location;142
}144
private boolean isCompatible(Door door, Door doorItem)145
{146
if(door.getFacing() != doorItem.getFacing())147
{148
return false;149
}151
if(door.getHalf() != doorItem.getHalf())152
{153
return false;154
}156
if(door.getHinge() == doorItem.getHinge())157
{158
return false;159
}161
return true;162
}163
}