A feature-rich Minecraft plugin which enhances gaming experience
git clone git://soophie.de/poppy
blob: d5543ce332db6cb577ffa3a6519b504b0a4f0d90 (4195 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.BlockFace;11
import org.bukkit.block.data.Bisected.Half;12
import org.bukkit.block.data.type.Stairs;13
import org.bukkit.entity.ArmorStand;14
import org.bukkit.entity.Entity;15
import org.bukkit.entity.EntityType;16
import org.bukkit.entity.Player;17
import org.bukkit.event.EventHandler;18
import org.bukkit.event.Listener;19
import org.bukkit.event.block.Action;20
import org.bukkit.event.block.BlockBreakEvent;21
import org.bukkit.event.player.PlayerInteractEvent;22
import org.spigotmc.event.entity.EntityDismountEvent;25
public class ChairListener implements Listener26
{27
private static final Material[] CHAIR_TYPE = new Material[]28
{29
Material.OAK_STAIRS,30
Material.SPRUCE_STAIRS,31
Material.BIRCH_STAIRS,32
Material.JUNGLE_STAIRS,33
Material.ACACIA_STAIRS,34
Material.DARK_OAK_STAIRS,35
Material.ACACIA_STAIRS,36
Material.CRIMSON_STAIRS,37
Material.WARPED_STAIRS38
};40
private Map<Block, ArmorStand> blockMap = new HashMap<>();42
@SuppressWarnings("deprecation")43
@EventHandler44
public void onPlayerInteract(PlayerInteractEvent event)45
{46
Player player = event.getPlayer();48
if(event.getAction() == Action.RIGHT_CLICK_BLOCK)49
{50
if(event.getClickedBlock() != null && !event.getPlayer().isSneaking())51
{52
Block block = event.getClickedBlock();54
if(isChair(block.getType()))55
{56
if(block.getLocation().add(0.5, 0.5, 0.5).distance(player.getLocation()) > 2)57
{58
return;59
}61
if(blockMap.containsKey(block))62
{63
return;64
}66
Block upperBlock = block.getWorld().getBlockAt(block.getLocation().add(0, 1, 0));68
if(upperBlock != null && upperBlock.getType() == Material.AIR)69
{70
Stairs stairs = (Stairs) block.getState().getBlockData();72
if(isCompatible(stairs))73
{74
Float yaw = convertFacingToYaw(stairs.getFacing());76
if(yaw == null)77
{78
return;79
}81
Location location = block.getLocation().add(0.5, -0.4, 0.5);82
location.setYaw(yaw);84
ArmorStand armorStand = (ArmorStand) block.getWorld().spawnEntity(location, EntityType.ARMOR_STAND);85
armorStand.setPassenger((Entity) event.getPlayer());86
armorStand.setSmall(true);87
armorStand.setGravity(false);88
armorStand.setInvulnerable(true);89
armorStand.setVisible(false);91
event.setCancelled(true);93
blockMap.put(block, armorStand);94
}95
}96
}97
}98
}99
}101
@EventHandler102
public void onEntityDismount(EntityDismountEvent event)103
{104
if(event.getEntity() instanceof Player)105
{106
Entity entity = event.getDismounted();108
if(entity != null && entity instanceof ArmorStand)109
{110
if(blockMap.containsValue(entity))111
{112
for(Entry<Block, ArmorStand> entry : blockMap.entrySet())113
{114
if(entry.getValue() == entity)115
{116
blockMap.remove(entry.getKey());118
break;119
}120
}121
}123
entity.remove();124
}125
}126
}128
@EventHandler129
public void onBlockBreak(BlockBreakEvent event)130
{131
Block block = event.getBlock();133
if(blockMap.containsKey(block))134
{135
ArmorStand armorStand = blockMap.get(block);136
armorStand.eject();138
blockMap.remove(block);139
}140
}142
private boolean isChair(Material material)143
{144
for(Material chair : CHAIR_TYPE)145
{146
if(material == chair)147
{148
return true;149
}150
}152
return false;153
}155
private boolean isCompatible(Stairs stairs)156
{157
if(stairs.getHalf() != Half.BOTTOM)158
{159
return false;160
}162
if(stairs.isWaterlogged())163
{164
return false;165
}167
if(stairs.getShape() == Stairs.Shape.INNER_RIGHT || stairs.getShape() == Stairs.Shape.INNER_LEFT)168
{169
return false;170
}172
return true;173
}175
private Float convertFacingToYaw(BlockFace face)176
{177
switch(face)178
{179
case NORTH:180
return 0F;181
case EAST:182
return 90F;183
case SOUTH:184
return 180F;185
case WEST:186
return -90F;187
default:188
break;189
}191
return null;192
}194
public void onDisable()195
{196
for(ArmorStand armorStand : blockMap.values())197
{198
armorStand.eject();199
armorStand.remove();200
}201
}202
}