package net.obnoxint.mcdev.util; import java.net.InetSocketAddress; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; import org.bukkit.Achievement; import org.bukkit.Bukkit; import org.bukkit.Effect; import org.bukkit.EntityEffect; import org.bukkit.GameMode; import org.bukkit.Instrument; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Note; import org.bukkit.Server; import org.bukkit.Sound; import org.bukkit.Statistic; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.conversations.Conversation; import org.bukkit.conversations.ConversationAbandonedEvent; import org.bukkit.entity.Arrow; import org.bukkit.entity.Egg; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; import org.bukkit.entity.Snowball; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.InventoryView.Property; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import org.bukkit.map.MapView; import org.bukkit.metadata.MetadataValue; import org.bukkit.permissions.Permission; import org.bukkit.permissions.PermissionAttachment; import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.plugin.Plugin; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.util.Vector; /** * <p> * Abstract implementation of the org.bukkit.entity.Player interface. * </p> * <p> * This class stores the name of a player and uses it to maintain a reference to the according Player object.<br> * Since this reference can become obsolete when a player disconnects from the server, the {@link #update()} method must be called in order to reacquire a valid reference. * </p> * * @since bukkit-1.3.1-R2.1 */ public abstract class AbstractPlayer implements Player { private final String playerName; private Player player; /** * Creates a new instance and calls the {@link #update()} method. Therefore the passed reference and the reference maintained by this instance may not be the same. * * @param player the player. An IllegalArgumentException will be thrown if <i>player</i> is null. */ public AbstractPlayer(final Player player) { if (player == null) { throw new IllegalArgumentException(); } this.playerName = player.getName(); update(); } @Override public void abandonConversation(final Conversation conversation) { player.abandonConversation(conversation); } @Override public void abandonConversation(final Conversation conversation, final ConversationAbandonedEvent details) { player.abandonConversation(conversation, details); } @Override public void acceptConversationInput(final String input) { player.acceptConversationInput(input); } @Override public PermissionAttachment addAttachment(final Plugin plugin) { return player.addAttachment(plugin); } @Override public PermissionAttachment addAttachment(final Plugin plugin, final int ticks) { return player.addAttachment(plugin, ticks); } @Override public PermissionAttachment addAttachment(final Plugin plugin, final String name, final boolean value) { return player.addAttachment(plugin, name, value); } @Override public PermissionAttachment addAttachment(final Plugin plugin, final String name, final boolean value, final int ticks) { return player.addAttachment(plugin, name, value, ticks); } @Override public boolean addPotionEffect(final PotionEffect effect) { return player.addPotionEffect(effect); } @Override public boolean addPotionEffect(final PotionEffect effect, final boolean force) { return player.addPotionEffect(effect, force); } @Override public boolean addPotionEffects(final Collection<PotionEffect> effects) { return player.addPotionEffects(effects); } @Override public void awardAchievement(final Achievement achievement) { player.awardAchievement(achievement); } @Override public boolean beginConversation(final Conversation conversation) { return player.beginConversation(conversation); } @Override public boolean canSee(final Player player) { return player.canSee(player); } @Override public void chat(final String msg) { player.chat(msg); } @Override public void closeInventory() { player.closeInventory(); } @Override public void damage(final int amount) { player.damage(amount); } @Override public void damage(final int amount, final Entity source) { player.damage(amount, source); } @Override public boolean eject() { return player.eject(); } /** * @return true if the given object (String or Player) is equal to this instance. */ @Override public boolean equals(final Object obj) { if (obj != null) { if (obj instanceof Player) { return playerName.equals(((Player) obj).getName()); } else if (obj instanceof String) { return playerName.equals((obj)); } } return false; } @Override public Collection<PotionEffect> getActivePotionEffects() { return player.getActivePotionEffects(); } @Override public InetSocketAddress getAddress() { return player.getAddress(); } @Override public boolean getAllowFlight() { return player.getAllowFlight(); } @Override public Location getBedSpawnLocation() { return player.getBedSpawnLocation(); } @Override public Location getCompassTarget() { return player.getCompassTarget(); } @Override public String getDisplayName() { return player.getDisplayName(); } @Override public Set<PermissionAttachmentInfo> getEffectivePermissions() { return player.getEffectivePermissions(); } @Override public Inventory getEnderChest() { return player.getEnderChest(); } @Override public int getEntityId() { return player.getEntityId(); } @Override public float getExhaustion() { return player.getExhaustion(); } @Override public float getExp() { return player.getExp(); } @Override public int getExpToLevel() { return player.getExpToLevel(); } @Override public double getEyeHeight() { return player.getEyeHeight(); } @Override public double getEyeHeight(final boolean ignoreSneaking) { return player.getEyeHeight(ignoreSneaking); } @Override public Location getEyeLocation() { return player.getEyeLocation(); } @Override public float getFallDistance() { return player.getFallDistance(); } @Override public int getFireTicks() { return player.getFireTicks(); } @Override public long getFirstPlayed() { return player.getFirstPlayed(); } @Override public float getFlySpeed() { return player.getFlySpeed(); } @Override public int getFoodLevel() { return player.getFoodLevel(); } @Override public GameMode getGameMode() { return player.getGameMode(); } @Override public int getHealth() { return player.getHealth(); } @Override public PlayerInventory getInventory() { return player.getInventory(); } @Override public ItemStack getItemInHand() { return player.getItemInHand(); } @Override public ItemStack getItemOnCursor() { return player.getItemOnCursor(); } @Override public Player getKiller() { return player.getKiller(); } @Override public int getLastDamage() { return player.getLastDamage(); } @Override public EntityDamageEvent getLastDamageCause() { return player.getLastDamageCause(); } @Override public long getLastPlayed() { return player.getLastPlayed(); } @Override public List<Block> getLastTwoTargetBlocks(final HashSet<Byte> transparent, final int maxDistance) { return player.getLastTwoTargetBlocks(transparent, maxDistance); } @Override public int getLevel() { return player.getLevel(); } @Override public List<Block> getLineOfSight(final HashSet<Byte> transparent, final int maxDistance) { return player.getLineOfSight(transparent, maxDistance); } @Override public Set<String> getListeningPluginChannels() { return player.getListeningPluginChannels(); } @Override public Location getLocation() { return player.getLocation(); } @Override public int getMaxFireTicks() { return player.getMaxFireTicks(); } @Override public int getMaxHealth() { return player.getMaxHealth(); } @Override public int getMaximumAir() { return player.getMaximumAir(); } @Override public int getMaximumNoDamageTicks() { return player.getMaximumNoDamageTicks(); } @Override public List<MetadataValue> getMetadata(final String metadataKey) { return player.getMetadata(metadataKey); } @Override public String getName() { return player.getName(); } @Override public List<Entity> getNearbyEntities(final double x, final double y, final double z) { return player.getNearbyEntities(x, y, z); } @Override public int getNoDamageTicks() { return player.getNoDamageTicks(); } @Override public InventoryView getOpenInventory() { return player.getOpenInventory(); } @Override public Entity getPassenger() { return player.getPassenger(); } /** * @return the according instance of org.bukkit.entity.Player. */ @Override public final Player getPlayer() { return player; } @Override public String getPlayerListName() { return player.getPlayerListName(); } /** * @return the name of the Player. */ public final String getPlayerName() { return playerName; } @Override public long getPlayerTime() { return player.getPlayerTime(); } @Override public long getPlayerTimeOffset() { return player.getPlayerTimeOffset(); } @Override public int getRemainingAir() { return player.getRemainingAir(); } @Override public float getSaturation() { return player.getSaturation(); } @Override public Server getServer() { return player.getServer(); } @Override public int getSleepTicks() { return player.getSleepTicks(); } @Override public Block getTargetBlock(final HashSet<Byte> transparent, final int maxDistance) { return player.getTargetBlock(transparent, maxDistance); } @Override public int getTicksLived() { return player.getTicksLived(); } @Override public int getTotalExperience() { return player.getTotalExperience(); } @Override public EntityType getType() { return player.getType(); } @Override public UUID getUniqueId() { return player.getUniqueId(); } @Override public Entity getVehicle() { return player.getVehicle(); } @Override public Vector getVelocity() { return player.getVelocity(); } @Override public float getWalkSpeed() { return player.getWalkSpeed(); } @Override public World getWorld() { return player.getWorld(); } @Override public void giveExp(final int amount) { player.giveExp(amount); } @Override public boolean hasLineOfSight(final Entity other) { return player.hasLineOfSight(other); } @Override public boolean hasMetadata(final String metadataKey) { return player.hasMetadata(metadataKey); } @Override public boolean hasPermission(final Permission perm) { return player.hasPermission(perm); } @Override public boolean hasPermission(final String name) { return player.hasPermission(name); } @Override public boolean hasPlayedBefore() { return player.hasPlayedBefore(); } @Override public boolean hasPotionEffect(final PotionEffectType type) { return player.hasPotionEffect(type); } @Override public void hidePlayer(final Player player) { player.hidePlayer(player); } @Override public void incrementStatistic(final Statistic statistic) { player.incrementStatistic(statistic); } @Override public void incrementStatistic(final Statistic statistic, final int amount) { player.incrementStatistic(statistic, amount); } @Override public void incrementStatistic(final Statistic statistic, final Material material) { player.incrementStatistic(statistic, material); } @Override public void incrementStatistic(final Statistic statistic, final Material material, final int amount) { player.incrementStatistic(statistic, material, amount); } @Override public boolean isBanned() { return player.isBanned(); } @Override public boolean isBlocking() { return player.isBlocking(); } @Override public boolean isConversing() { return player.isConversing(); } @Override public boolean isDead() { return player.isDead(); } @Override public boolean isEmpty() { return player.isEmpty(); } @Override public boolean isFlying() { return player.isFlying(); } @Override public boolean isInsideVehicle() { return player.isInsideVehicle(); } @Override public boolean isOnline() { return player.isOnline(); } @Override public boolean isOp() { return player.isOp(); } @Override public boolean isPermissionSet(final Permission perm) { return player.isPermissionSet(perm); } @Override public boolean isPermissionSet(final String name) { return player.isPermissionSet(name); } @Override public boolean isPlayerTimeRelative() { return player.isPlayerTimeRelative(); } @Override public boolean isSleeping() { return player.isSleeping(); } @Override public boolean isSleepingIgnored() { return player.isSleepingIgnored(); } @Override public boolean isSneaking() { return player.isSneaking(); } @Override public boolean isSprinting() { return player.isSprinting(); } @Override public boolean isValid() { return player.isValid(); } @Override public boolean isWhitelisted() { return player.isWhitelisted(); } @Override public void kickPlayer(final String message) { player.kickPlayer(message); } @Override public <T extends Projectile> T launchProjectile(final Class<? extends T> projectile) { return player.launchProjectile(projectile); } @Override public boolean leaveVehicle() { return player.leaveVehicle(); } @Override public void loadData() { player.loadData(); } @Override public InventoryView openEnchanting(final Location location, final boolean force) { return player.openEnchanting(location, force); } @Override public InventoryView openInventory(final Inventory inventory) { return player.openInventory(inventory); } @Override public void openInventory(final InventoryView inventory) { player.openInventory(inventory); } @Override public InventoryView openWorkbench(final Location location, final boolean force) { return player.openWorkbench(location, force); } @Override public boolean performCommand(final String command) { return player.performCommand(command); } @Override public void playEffect(final EntityEffect type) { player.playEffect(type); } @Override public void playEffect(final Location loc, final Effect effect, final int data) { player.playEffect(loc, effect, data); } @Override public <T> void playEffect(final Location loc, final Effect effect, final T data) { player.playEffect(loc, effect, data); } @Override public void playNote(final Location loc, final byte instrument, final byte note) { player.playNote(loc, instrument, note); } @Override public void playNote(final Location loc, final Instrument instrument, final Note note) { player.playNote(loc, instrument, note); } @Override public void playSound(final Location location, final Sound sound, final float volume, final float pitch) { player.playSound(location, sound, volume, pitch); } @Override public void recalculatePermissions() { player.recalculatePermissions(); } @Override public void remove() { player.remove(); } @Override public void removeAttachment(final PermissionAttachment attachment) { player.removeAttachment(attachment); } @Override public void removeMetadata(final String metadataKey, final Plugin owningPlugin) { player.removeMetadata(metadataKey, owningPlugin); } @Override public void removePotionEffect(final PotionEffectType type) { player.removePotionEffect(type); } @Override public void resetPlayerTime() { player.resetPlayerTime(); } @Override public void saveData() { player.saveData(); } @Override public void sendBlockChange(final Location loc, final int material, final byte data) { player.sendBlockChange(loc, material, data); } @Override public void sendBlockChange(final Location loc, final Material material, final byte data) { player.sendBlockChange(loc, material, data); } @Override public boolean sendChunkChange(final Location loc, final int sx, final int sy, final int sz, final byte[] data) { return player.sendChunkChange(loc, sx, sy, sz, data); } @Override public void sendMap(final MapView map) { player.sendMap(map); } @Override public void sendMessage(final String message) { player.sendMessage(message); } @Override public void sendMessage(final String[] messages) { player.sendMessage(messages); } @Override public void sendPluginMessage(final Plugin source, final String channel, final byte[] message) { player.sendPluginMessage(source, channel, message); } @Override public void sendRawMessage(final String message) { player.sendRawMessage(message); } @Override public Map<String, Object> serialize() { return player.serialize(); } @Override public void setAllowFlight(final boolean flight) { player.setAllowFlight(flight); } @Override public void setBanned(final boolean banned) { player.setBanned(banned); } @Override public void setBedSpawnLocation(final Location location) { player.setBedSpawnLocation(location); } @Override public void setCompassTarget(final Location loc) { player.setCompassTarget(loc); } @Override public void setDisplayName(final String name) { player.setDisplayName(name); } @Override public void setExhaustion(final float value) { player.setExhaustion(value); } @Override public void setExp(final float exp) { player.setExp(exp); } @Override public void setFallDistance(final float distance) { player.setFallDistance(distance); } @Override public void setFireTicks(final int ticks) { player.setFireTicks(ticks); } @Override public void setFlying(final boolean value) { player.setFlying(value); } @Override public void setFlySpeed(final float value) throws IllegalArgumentException { player.setFlySpeed(value); } @Override public void setFoodLevel(final int value) { player.setFoodLevel(value); } @Override public void setGameMode(final GameMode mode) { player.setGameMode(mode); } @Override public void setHealth(final int health) { player.setHealth(health); } @Override public void setItemInHand(final ItemStack item) { player.setItemInHand(item); } @Override public void setItemOnCursor(final ItemStack item) { player.setItemOnCursor(item); } @Override public void setLastDamage(final int damage) { player.setLastDamage(damage); } @Override public void setLastDamageCause(final EntityDamageEvent event) { player.setLastDamageCause(event); } @Override public void setLevel(final int level) { player.setLevel(level); } @Override public void setMaximumAir(final int ticks) { player.setMaximumAir(ticks); } @Override public void setMaximumNoDamageTicks(final int ticks) { player.setMaximumNoDamageTicks(ticks); } @Override public void setMetadata(final String metadataKey, final MetadataValue newMetadataValue) { player.setMetadata(metadataKey, newMetadataValue); } @Override public void setNoDamageTicks(final int ticks) { player.setNoDamageTicks(ticks); } @Override public void setOp(final boolean value) { player.setOp(value); } @Override public boolean setPassenger(final Entity passenger) { return player.setPassenger(passenger); } @Override public void setPlayerListName(final String name) { player.setPlayerListName(name); } @Override public void setPlayerTime(final long time, final boolean relative) { player.setPlayerTime(time, relative); } @Override public void setRemainingAir(final int ticks) { player.setRemainingAir(ticks); } @Override public void setSaturation(final float value) { player.setSaturation(value); } @Override public void setSleepingIgnored(final boolean isSleeping) { player.setSleepingIgnored(isSleeping); } @Override public void setSneaking(final boolean sneak) { player.setSneaking(sneak); } @Override public void setSprinting(final boolean sprinting) { player.setSprinting(sprinting); } @Override public void setTicksLived(final int value) { player.setTicksLived(value); } @Override public void setTotalExperience(final int exp) { player.setTotalExperience(exp); } @Override public void setVelocity(final Vector velocity) { player.setVelocity(velocity); } @Override public void setWalkSpeed(final float value) throws IllegalArgumentException { player.setWalkSpeed(value); } @Override public void setWhitelisted(final boolean value) { player.setWhitelisted(value); } @Override public boolean setWindowProperty(final Property prop, final int value) { return player.setWindowProperty(prop, value); } @Override @Deprecated public Arrow shootArrow() { return player.shootArrow(); } @Override public void showPlayer(final Player player) { player.showPlayer(player); } @Override public boolean teleport(final Entity destination) { return player.teleport(destination); } @Override public boolean teleport(final Entity destination, final TeleportCause cause) { return player.teleport(destination, cause); } @Override public boolean teleport(final Location location) { return player.teleport(location); } @Override public boolean teleport(final Location location, final TeleportCause cause) { return player.teleport(location, cause); } @Override @Deprecated public Egg throwEgg() { return player.throwEgg(); } @Override @Deprecated public Snowball throwSnowball() { return player.throwSnowball(); } /** * Updates the reference to the Player object. * * @throws IllegalStateException if the reference could not be acquired. */ public final void update() throws IllegalStateException { final Player p = Bukkit.getPlayerExact(playerName); if (p == null) { throw new IllegalStateException(); } this.player = p; } @Override @Deprecated public void updateInventory() { player.updateInventory(); } }