A feature-rich Minecraft plugin which enhances gaming experience
git clone git://soophie.de/poppy
blob: 48ab1c7bc7f7077d2189473be84631b07a0a1d0b (3623 bytes)[doc][blame][raw]
1
package de.typable.minecrafthub.event;3
import java.util.HashMap;4
import java.util.Map;5
import java.util.Map.Entry;7
import org.bukkit.Location;8
import org.bukkit.Material;9
import org.bukkit.block.Block;10
import org.bukkit.block.data.Bisected.Half;11
import org.bukkit.block.data.type.Stairs;12
import org.bukkit.entity.AbstractArrow.PickupStatus;13
import org.bukkit.entity.Arrow;14
import org.bukkit.entity.Entity;15
import org.bukkit.entity.Player;16
import org.bukkit.event.EventHandler;17
import org.bukkit.event.Listener;18
import org.bukkit.event.block.Action;19
import org.bukkit.event.block.BlockBreakEvent;20
import org.bukkit.event.player.PlayerInteractEvent;21
import org.bukkit.util.Vector;22
import org.spigotmc.event.entity.EntityDismountEvent;25
public class ChairListener implements Listener26
{27
private static final Material[] CHAIR_TYPE = new Material[] { Material.OAK_STAIRS, Material.SPRUCE_STAIRS, Material.BIRCH_STAIRS, Material.JUNGLE_STAIRS, Material.ACACIA_STAIRS, Material.DARK_OAK_STAIRS, Material.ACACIA_STAIRS, Material.CRIMSON_STAIRS, Material.WARPED_STAIRS };29
private Map<Block, Arrow> blockMap = new HashMap<>();31
@SuppressWarnings("deprecation")32
@EventHandler33
public void onPlayerInteract(PlayerInteractEvent event)34
{35
Player player = event.getPlayer();37
if(event.getAction() == Action.RIGHT_CLICK_BLOCK)38
{39
if(event.getClickedBlock() != null && !event.getPlayer().isSneaking())40
{41
Block block = event.getClickedBlock();43
if(isChair(block.getType()))44
{45
if(block.getLocation().add(0.5, 0.5, 0.5).distance(player.getLocation()) > 2)46
{47
return;48
}50
if(blockMap.containsKey(block))51
{52
return;53
}55
Block upperBlock = block.getWorld().getBlockAt(block.getLocation().add(0, 1, 0));57
if(upperBlock != null && upperBlock.getType() == Material.AIR)58
{59
Stairs stairs = (Stairs) block.getState().getBlockData();61
if(isCompatible(stairs))62
{63
Location location = block.getLocation().add(0.5, 0, 0.5);64
Arrow arrow = (Arrow) block.getWorld()65
.spawnArrow(location, new Vector(), 0F, 0F);66
arrow.setGravity(false);67
arrow.setInvulnerable(true);68
arrow.setPickupStatus(PickupStatus.DISALLOWED);69
arrow.setPassenger((Entity) event.getPlayer());70
arrow.setTicksLived(0);72
event.setCancelled(true);74
blockMap.put(block, arrow);75
}76
}77
}78
}79
}80
}82
@EventHandler83
public void onEntityDismount(EntityDismountEvent event)84
{85
if(event.getEntity() instanceof Player)86
{87
Entity entity = event.getDismounted();89
if(entity != null && entity instanceof Arrow)90
{91
if(blockMap.containsValue(entity))92
{93
for(Entry<Block, Arrow> entry : blockMap.entrySet())94
{95
if(entry.getValue() == entity)96
{97
blockMap.remove(entry.getKey());99
break;100
}101
}102
}104
entity.remove();105
}106
}107
}109
@EventHandler110
public void onBlockBreak(BlockBreakEvent event)111
{112
Block block = event.getBlock();114
if(blockMap.containsKey(block))115
{116
Arrow arrow = blockMap.get(block);117
arrow.eject();119
blockMap.remove(block);120
}121
}123
private boolean isChair(Material material)124
{125
for(Material chair : CHAIR_TYPE)126
{127
if(material == chair)128
{129
return true;130
}131
}133
return false;134
}136
private boolean isCompatible(Stairs stairs)137
{138
if(stairs.getHalf() != Half.BOTTOM)139
{140
return false;141
}143
if(stairs.isWaterlogged())144
{145
return false;146
}148
if(stairs.getShape() == Stairs.Shape.INNER_RIGHT || stairs149
.getShape() == Stairs.Shape.INNER_LEFT)150
{151
return false;152
}154
return true;155
}156
}