Created
March 3, 2012 01:13
-
-
Save NeatMonster/1963258 to your computer and use it in GitHub Desktop.
HaveASeat
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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