Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package de.blablubbabc.test2;
- import java.text.DecimalFormat;
- import org.bukkit.Bukkit;
- import org.bukkit.Location;
- import org.bukkit.Material;
- import org.bukkit.block.Block;
- import org.bukkit.block.BlockFace;
- import org.bukkit.entity.Entity;
- import org.bukkit.entity.Player;
- import org.bukkit.entity.Villager;
- import org.bukkit.event.EventHandler;
- import org.bukkit.event.EventPriority;
- import org.bukkit.event.Listener;
- import org.bukkit.event.block.Action;
- import org.bukkit.event.player.PlayerInteractEvent;
- import org.bukkit.inventory.EquipmentSlot;
- import org.bukkit.plugin.java.JavaPlugin;
- import org.bukkit.scheduler.BukkitRunnable;
- public class Test extends JavaPlugin implements Listener {
- private Entity entity = null;
- @Override
- public void onEnable() {
- Bukkit.getPluginManager().registerEvents(this, this);
- }
- @Override
- public void onDisable() {
- }
- @EventHandler(priority = EventPriority.MONITOR)
- void onBlockClicked(PlayerInteractEvent event) {
- if (event.getHand() != EquipmentSlot.HAND) return;
- Block block = event.getClickedBlock();
- if (block == null || event.getAction() == Action.LEFT_CLICK_BLOCK
- || (event.getItem() != null && event.getItem().getType() != Material.AIR)) return;
- if (entity != null) {
- // cleanup prev entity:
- entity.remove();
- entity = null;
- }
- // spawning slightly above ground, to make sure this is not due to an edge case:
- Location spawnPos = block.getRelative(event.getBlockFace()).getLocation().add(0.5D, 0.1D, 0.5D);
- entity = block.getWorld().spawn(spawnPos, Villager.class, (e) -> {
- e.setAI(false); // no gravity by default
- });
- DecimalFormat df = new DecimalFormat("0.##");
- Player player = event.getPlayer();
- player.sendMessage("Start in 1 sec");
- new BukkitRunnable() {
- int counter = 0;
- boolean end = false;
- @Override
- public void run() {
- if (!player.isValid() || !entity.isValid()) {
- this.cancel();
- return;
- }
- counter++;
- Location cur = entity.getLocation();
- if (cur.getBlock().getRelative(BlockFace.DOWN).getType() == Material.AIR) {
- // teleport 1 block down:
- Location target = cur.add(0.0D, -1.0D, 0.0D);
- entity.teleport(target);
- player.sendMessage("Teleport to height: " + df.format(target.getY()));
- } else if (!end) {
- player.sendMessage("Last height: " + df.format(cur.getY()));
- end = true;
- }
- if (entity.getLocation().getBlock().getType() != Material.AIR) {
- // this is never reached in this experiment, the entity is only visually inside the block
- player.sendMessage("The entity is inside a block!");
- }
- // remove again after 5 sec or when we hit the ground
- if (counter > 100) {
- entity.remove();
- this.cancel();
- }
- }
- }.runTaskTimer(this, 20L, 1L);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement