Skip to content

Instantly share code, notes, and snippets.

@NeatMonster
Created March 3, 2012 01:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save NeatMonster/1963258 to your computer and use it in GitHub Desktop.
Save NeatMonster/1963258 to your computer and use it in GitHub Desktop.
HaveASeat
package me.neatmonster.haveaseat;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.server.Packet29DestroyEntity;
import net.minecraft.server.Packet39AttachEntity;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Player;
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.block.BlockBreakEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.plugin.java.JavaPlugin;
public class HaveASeat extends JavaPlugin implements Listener {
class Seat {
private Arrow arrow1 = null;
private Arrow arrow2 = null;
private Block block = null;
private Player player = null;
public Seat(final Player player, final Block block) {
this.player = player;
this.block = block;
create();
}
public void create() {
double x = 0.5, z = 0.5;
if (block.getType() != Material.STEP && block.getData() == (byte) 0x0)
x = 0.3;
else if (block.getType() != Material.STEP && block.getData() == (byte) 0x1)
x = 0.7;
else if (block.getType() != Material.STEP && block.getData() == (byte) 0x2)
z = 0.3;
else if (block.getType() != Material.STEP && block.getData() == (byte) 0x3)
z = 0.7;
arrow1 = block.getWorld().spawn(block.getLocation().clone().add(x, 0.9, z), Arrow.class);
arrow1.setPassenger(player);
final Packet29DestroyEntity packet1 = new Packet29DestroyEntity();
packet1.a = arrow1.getEntityId();
((CraftPlayer) player).getHandle().netServerHandler.sendPacket(packet1);
arrow2 = block.getWorld().spawn(block.getLocation().clone().add(x, -0.1, z), Arrow.class);
final Packet39AttachEntity packet2 = new Packet39AttachEntity();
packet2.a = player.getEntityId();
packet2.b = arrow2.getEntityId();
((CraftPlayer) player).getHandle().netServerHandler.sendPacket(packet2);
HaveASeat.seats.add(this);
}
public void destroy() {
try {
arrow1.eject();
} catch (final Exception e) {}
try {
arrow1.remove();
} catch (final Exception e) {}
try {
arrow2.remove();
} catch (final Exception e) {}
HaveASeat.seats.remove(this);
}
public Block getBlock() {
return block;
}
public Player getPlayer() {
return player;
}
}
private static HaveASeat instance = null;
public static List<Seat> seats = new ArrayList<Seat>();
public static HaveASeat getInstance() {
return instance;
}
private static Seat getSeatByBlock(final Block block) {
for (final Seat seat : seats)
if (seat.getBlock().hashCode() == block.hashCode())
return seat;
return null;
}
private static Seat getSeatByPlayer(final Player player) {
for (final Seat seat : seats)
if (seat.getPlayer() == player)
return seat;
return null;
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockBreak(final BlockBreakEvent event) {
if (getSeatByBlock(event.getBlock()) != null)
getSeatByBlock(event.getBlock()).destroy();
}
@Override
public void onDisable() {
super.onDisable();
final List<Seat> seats_ = new ArrayList<Seat>();
seats_.addAll(seats);
for (final Seat seat : seats_)
seat.destroy();
}
@Override
public void onEnable() {
super.onEnable();
instance = this;
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
@Override
public void run() {
final List<Seat> seats_ = new ArrayList<Seat>();
seats_.addAll(seats);
for (final Seat seat : seats_) {
seat.destroy();
seat.create();
}
}
}, 1100L, 1100L);
Bukkit.getPluginManager().registerEvents(this, this);
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityDeath(final EntityDeathEvent event) {
if (event.getEntity() instanceof Player && getSeatByPlayer((Player) event.getEntity()) != null)
getSeatByPlayer((Player) event.getEntity()).destroy();
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityExplodeEvent(final EntityExplodeEvent event) {
for (final Block block : event.blockList())
if (getSeatByBlock(block) != null)
getSeatByBlock(block).destroy();
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerInteract(final PlayerInteractEvent event) {
if (!event.getPlayer().hasPermission("takeaseat.noseat")
&& event.getPlayer().isSneaking()
&& event.getAction() == Action.RIGHT_CLICK_BLOCK
&& (event.getClickedBlock().getType() == Material.WOOD_STAIRS
|| event.getClickedBlock().getType() == Material.COBBLESTONE_STAIRS
|| event.getClickedBlock().getType() == Material.STEP)) {
event.setCancelled(true);
if (getSeatByPlayer(event.getPlayer()) != null && getSeatByBlock(event.getClickedBlock()) != null)
getSeatByPlayer(event.getPlayer()).destroy();
else if (getSeatByPlayer(event.getPlayer()) == null && getSeatByBlock(event.getClickedBlock()) == null
&& event.getClickedBlock().getLocation().clone().add(0, 1, 0).getBlock().getType() == Material.AIR
&& event.getClickedBlock().getLocation().clone().add(0, 2, 0).getBlock().getType() == Material.AIR) {
if (getSeatByPlayer(event.getPlayer()) != null)
getSeatByPlayer(event.getPlayer()).destroy();
new Seat(event.getPlayer(), event.getClickedBlock());
}
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerQuit(final PlayerQuitEvent event) {
if (getSeatByPlayer(event.getPlayer()) != null)
getSeatByPlayer(event.getPlayer()).destroy();
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerTeleport(final PlayerTeleportEvent event) {
if (getSeatByPlayer(event.getPlayer()) != null)
getSeatByPlayer(event.getPlayer()).destroy();
}
}
name: HaveASeat
version: 1.0
description: Seats in Minecraft!
author: NeatMonster
website: http://spacebukkit.xereo.net/
main: me.neatmonster.haveaseat.HaveASeat
database: false
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment