A feature-rich Minecraft plugin which enhances gaming experience
git clone git://soophie.de/poppy
blob: f9c57c7dc6652ef78d238e240bc1b96d8af6c4ac (4250 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.ArmorStand;13
import org.bukkit.entity.Entity;14
import org.bukkit.entity.EntityType;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.spigotmc.event.entity.EntityDismountEvent;23
import de.typable.minecrafthub.util.Util;26
public class ChairListener implements Listener27
{28
private static final Material[] CHAIR_TYPE = new Material[]29
{30
Material.OAK_STAIRS,31
Material.SPRUCE_STAIRS,32
Material.BIRCH_STAIRS,33
Material.JUNGLE_STAIRS,34
Material.ACACIA_STAIRS,35
Material.DARK_OAK_STAIRS,36
Material.ACACIA_STAIRS,37
Material.CRIMSON_STAIRS,38
Material.WARPED_STAIRS39
};41
private Map<Block, ArmorStand> blockMap = new HashMap<>();43
public void onDisable()44
{45
for(ArmorStand armorStand : blockMap.values())46
{47
armorStand.eject();48
armorStand.remove();49
}50
}52
@EventHandler53
public void onPlayerInteract(PlayerInteractEvent event)54
{55
Player player = event.getPlayer();57
if(event.getAction() == Action.RIGHT_CLICK_BLOCK)58
{59
if(event.getClickedBlock() != null && !event.getPlayer().isSneaking())60
{61
Block block = event.getClickedBlock();63
if(isChair(block.getType()))64
{65
if(!isInRange(block, player))66
{67
return;68
}70
if(blockMap.containsKey(block))71
{72
return;73
}75
if(isCompatible(block))76
{77
ArmorStand armorStand = createMountableChair(block, player);79
if(armorStand == null)80
{81
return;82
}84
event.setCancelled(true);86
blockMap.put(block, armorStand);87
}88
}89
}90
}91
}93
@EventHandler94
public void onEntityDismount(EntityDismountEvent event)95
{96
if(event.getEntity() instanceof Player)97
{98
Entity entity = event.getDismounted();100
if(entity != null && entity instanceof ArmorStand)101
{102
if(blockMap.containsValue(entity))103
{104
for(Entry<Block, ArmorStand> entry : blockMap.entrySet())105
{106
if(entry.getValue() == entity)107
{108
blockMap.remove(entry.getKey());110
break;111
}112
}113
}115
entity.remove();116
}117
}118
}120
@EventHandler121
public void onBlockBreak(BlockBreakEvent event)122
{123
Block block = event.getBlock();125
if(blockMap.containsKey(block))126
{127
ArmorStand armorStand = blockMap.get(block);128
armorStand.eject();130
blockMap.remove(block);131
}132
}134
private boolean isInRange(Block block, Player player)135
{136
return block.getLocation().add(0.5, 0.5, 0.5).distance(player.getLocation()) <= 2;137
}139
private boolean isChair(Material material)140
{141
for(Material chair : CHAIR_TYPE)142
{143
if(material == chair)144
{145
return true;146
}147
}149
return false;150
}152
private boolean isCompatible(Block block)153
{154
Block upperBlock = block.getWorld().getBlockAt(block.getLocation().add(0, 1, 0));156
if(!Util.isAir(upperBlock.getType()))157
{158
return false;159
}161
Stairs stairs = (Stairs) block.getState().getBlockData();163
if(stairs.getHalf() != Half.BOTTOM)164
{165
return false;166
}168
if(stairs.isWaterlogged())169
{170
return false;171
}173
if(stairs.getShape() == Stairs.Shape.INNER_RIGHT || stairs.getShape() == Stairs.Shape.INNER_LEFT)174
{175
return false;176
}178
return true;179
}181
@SuppressWarnings("deprecation")182
private ArmorStand createMountableChair(Block block, Player player)183
{184
Stairs stairs = (Stairs) block.getState().getBlockData();186
Float yaw = Util.convertFacingToYaw(stairs.getFacing());188
if(yaw == null)189
{190
return null;191
}193
Location location = block.getLocation().add(0.5, -0.4, 0.5);194
location.setYaw(yaw);196
ArmorStand armorStand = (ArmorStand) block.getWorld().spawnEntity(location, EntityType.ARMOR_STAND);197
armorStand.setPassenger((Entity) player);198
armorStand.setSmall(true);199
armorStand.setGravity(false);200
armorStand.setInvulnerable(true);201
armorStand.setVisible(false);203
return armorStand;204
}205
}