/*
* This file is part of BukkitBridge.
*
* Copyright (c) 2012 Spout LLC <http://www.spout.org/>
* BukkitBridge is licensed under the GNU General Public License.
*
* BukkitBridge is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* BukkitBridge is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.spout.bridge.bukkit.entity;
import java.net.InetSocketAddress;
import java.util.Map;
import java.util.Set;
import org.bukkit.Achievement;
import org.bukkit.Effect;
import org.bukkit.Instrument;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Note;
import org.bukkit.Sound;
import org.bukkit.Statistic;
import org.bukkit.WeatherType;
import org.bukkit.configuration.serialization.DelegateDeserialization;
import org.bukkit.conversations.Conversation;
import org.bukkit.conversations.ConversationAbandonedEvent;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.map.MapView;
import org.bukkit.plugin.Plugin;
import org.bukkit.scoreboard.Scoreboard;
import org.spout.api.Server;
import org.spout.api.util.access.BanType;
import org.spout.bridge.BukkitUtil;
import org.spout.bridge.bukkit.BridgeOfflinePlayer;
import org.spout.vanilla.component.entity.inventory.PlayerInventory;
import org.spout.vanilla.component.entity.living.Human;
import org.spout.vanilla.component.entity.misc.Hunger;
import org.spout.vanilla.component.entity.misc.Level;
import org.spout.vanilla.data.VanillaData;
@DelegateDeserialization (BridgeOfflinePlayer.class)
public class BridgePlayer extends BridgeHumanEntity implements Player {
public BridgePlayer(org.spout.api.entity.Player handle) {
super(handle);
}
@Override
public org.spout.api.entity.Player getHandle() {
return getHandle();
}
@Override
public String getDisplayName() {
return getHandle().getDisplayName();
}
@Override
public void setDisplayName(String name) {
getHandle().setDisplayName(name);
}
@Override
public String getPlayerListName() {
throw new UnsupportedOperationException();
}
@Override
public void setPlayerListName(String s) {
throw new UnsupportedOperationException();
}
@Override
public void setCompassTarget(Location location) {
throw new UnsupportedOperationException();
}
@Override
public Location getCompassTarget() {
throw new UnsupportedOperationException();
}
@Override
public InetSocketAddress getAddress() {
return getHandle().getNetwork().getSession().getAddress();
}
@Override
public boolean isConversing() {
throw new UnsupportedOperationException();
}
@Override
public void acceptConversationInput(String s) {
throw new UnsupportedOperationException();
}
@Override
public boolean beginConversation(Conversation conversation) {
throw new UnsupportedOperationException();
}
@Override
public void abandonConversation(Conversation conversation) {
throw new UnsupportedOperationException();
}
@Override
public void abandonConversation(Conversation conversation, ConversationAbandonedEvent conversationAbandonedEvent) {
throw new UnsupportedOperationException();
}
@Override
public void sendRawMessage(String message) {
throw new UnsupportedOperationException();
}
@Override
public void kickPlayer(String msg) {
getHandle().kick(msg);
}
@Override
public void chat(String s) {
throw new UnsupportedOperationException();
}
@Override
public boolean performCommand(String cmd) {
BukkitUtil.processCommand(getHandle(), cmd);
return true;
}
@Override
public boolean isSneaking() {
return getHandle().getData().get(VanillaData.IS_SNEAKING);
}
@Override
public void setSneaking(boolean b) {
getHandle().getData().put(VanillaData.IS_SNEAKING, b);
}
@Override
public boolean isSprinting() {
return getHandle().getData().get(VanillaData.IS_SPRINTING);
}
@Override
public void setSprinting(boolean b) {
getHandle().getData().put(VanillaData.IS_SPRINTING, b);
}
@Override
public void saveData() {
getHandle().save();
}
@Override
public void loadData() {
throw new UnsupportedOperationException();
}
@Override
public void setSleepingIgnored(boolean b) {
throw new UnsupportedOperationException();
}
@Override
public boolean isSleepingIgnored() {
throw new UnsupportedOperationException();
}
@Override
public void playNote(Location location, byte b, byte b1) {
throw new UnsupportedOperationException();
}
@Override
public void playNote(Location location, Instrument instrument, Note note) {
throw new UnsupportedOperationException();
}
@Override
public void playSound(Location location, Sound sound, float v, float v1) {
throw new UnsupportedOperationException();
}
@Override
public void playSound(Location location, String s, float v, float v2) {
throw new UnsupportedOperationException();
}
@Override
public void playEffect(Location location, Effect effect, int i) {
throw new UnsupportedOperationException();
}
@Override
public <T> void playEffect(Location location, Effect effect, T t) {
throw new UnsupportedOperationException();
}
@Override
public void sendBlockChange(Location location, Material material, byte b) {
throw new UnsupportedOperationException();
}
@Override
public boolean sendChunkChange(Location location, int i, int i1, int i2, byte[] bytes) {
throw new UnsupportedOperationException();
}
@Override
public void sendBlockChange(Location location, int i, byte b) {
throw new UnsupportedOperationException();
}
@Override
public void sendMap(MapView mapView) {
throw new UnsupportedOperationException();
}
@Override
public void updateInventory() {
getHandle().get(PlayerInventory.class).updateAll();
}
@Override
public void awardAchievement(Achievement achievement) {
throw new UnsupportedOperationException();
}
@Override
public void incrementStatistic(Statistic statistic) {
throw new UnsupportedOperationException();
}
@Override
public void incrementStatistic(Statistic statistic, int i) {
throw new UnsupportedOperationException();
}
@Override
public void incrementStatistic(Statistic statistic, Material material) {
throw new UnsupportedOperationException();
}
@Override
public void incrementStatistic(Statistic statistic, Material material, int i) {
throw new UnsupportedOperationException();
}
@Override
public void setPlayerTime(long l, boolean b) {
throw new UnsupportedOperationException();
}
@Override
public long getPlayerTime() {
throw new UnsupportedOperationException();
}
@Override
public long getPlayerTimeOffset() {
throw new UnsupportedOperationException();
}
@Override
public boolean isPlayerTimeRelative() {
throw new UnsupportedOperationException();
}
@Override
public void resetPlayerTime() {
throw new UnsupportedOperationException();
}
@Override
public void setPlayerWeather(WeatherType weatherType) {
throw new UnsupportedOperationException();
}
@Override
public WeatherType getPlayerWeather() {
throw new UnsupportedOperationException();
}
@Override
public void giveExp(int i) {
Level level = getHandle().get(Level.class);
if (level != null) {
level.addExperience(i);
}
}
@Override
public void giveExpLevels(int i) {
Level level = getHandle().get(Level.class);
if (level != null) {
level.addLevel(i);
}
}
@Override
public float getExp() {
Level level = getHandle().get(Level.class);
return level != null ? level.getProgress() : 0;
}
@Override
public void setExp(float v) {
throw new UnsupportedOperationException();
}
@Override
public int getLevel() {
Level level = getHandle().get(Level.class);
return level != null ? level.getLevel() : 0;
}
@Override
public void setLevel(int i) {
Level level = getHandle().get(Level.class);
if (level != null) {
level.addLevel(i - level.getLevel());
}
}
@Override
public int getTotalExperience() {
Level level = getHandle().get(Level.class);
return level != null ? level.getExperience() : 0;
}
@Override
public void setTotalExperience(int i) {
Level level = getHandle().get(Level.class);
if (level != null) {
level.setExperience((short) i);
}
}
@Override
public float getExhaustion() {
Hunger hunger = getHandle().get(Hunger.class);
return hunger != null ? hunger.getExhaustion() : 0;
}
@Override
public void setExhaustion(float v) {
Hunger hunger = getHandle().get(Hunger.class);
if (hunger != null) {
hunger.setExhaustion(v);
}
}
@Override
public float getSaturation() {
Hunger hunger = getHandle().get(Hunger.class);
return hunger != null ? hunger.getExhaustion() : 0;
}
@Override
public void setSaturation(float v) {
Hunger hunger = getHandle().get(Hunger.class);
if (hunger != null) {
hunger.setFoodSaturation(v);
}
}
@Override
public int getFoodLevel() {
Hunger hunger = getHandle().get(Hunger.class);
return hunger != null ? hunger.getHunger() : 0;
}
@Override
public void setFoodLevel(int i) {
Hunger hunger = getHandle().get(Hunger.class);
if (hunger != null) {
hunger.setHunger(i);
}
}
@Override
public boolean isOnline() {
return true;
}
@Override
public boolean isBanned() {
return ((Server) getHandle().getEngine()).getAccessManager().isBanned(BanType.PLAYER, getName());
}
@Override
public void setBanned(boolean b) {
if (b) {
((Server) getHandle().getEngine()).getAccessManager().ban(BanType.PLAYER, getName());
} else {
((Server) getHandle().getEngine()).getAccessManager().unban(BanType.PLAYER, getName());
}
}
@Override
public boolean isWhitelisted() {
return ((Server) getHandle().getEngine()).getAccessManager().isWhitelisted(getName());
}
@Override
public void setWhitelisted(boolean b) {
if (b) {
((Server) getHandle().getEngine()).getAccessManager().whitelist(getName());
} else {
((Server) getHandle().getEngine()).getAccessManager().unwhitelist(getName());
}
}
@Override
public Player getPlayer() {
return this;
}
@Override
public long getFirstPlayed() {
throw new UnsupportedOperationException();
}
@Override
public long getLastPlayed() {
throw new UnsupportedOperationException();
}
@Override
public boolean hasPlayedBefore() {
throw new UnsupportedOperationException();
}
@Override
public Location getBedSpawnLocation() {
throw new UnsupportedOperationException();
}
@Override
public void setBedSpawnLocation(Location location) {
throw new UnsupportedOperationException();
}
@Override
public void setBedSpawnLocation(Location location, boolean b) {
throw new UnsupportedOperationException();
}
@Override
public boolean getAllowFlight() {
return getHandle().get(Human.class).canFly();
}
@Override
public void setAllowFlight(boolean b) {
getHandle().get(Human.class).setCanFly(b, true);
}
@Override
public void hidePlayer(Player player) {
throw new UnsupportedOperationException();
}
@Override
public void showPlayer(Player player) {
throw new UnsupportedOperationException();
}
@Override
public boolean canSee(Player player) {
throw new UnsupportedOperationException();
}
@Override
public boolean isFlying() {
return getHandle().get(Human.class).isFlying();
}
@Override
public void setFlying(boolean b) {
getHandle().get(Human.class).setFlying(b, true);
}
@Override
public void setFlySpeed(float v) throws IllegalArgumentException {
getHandle().get(Human.class).setFlyingSpeed((byte) v, true); // TODO: Check speed conversion loss float -> byte
}
@Override
public void setWalkSpeed(float v) throws IllegalArgumentException {
getHandle().get(Human.class).setWalkingSpeed((byte) v, true); // TODO: Check speed conversion loss float -> byte
}
@Override
public float getFlySpeed() {
return getHandle().get(Human.class).getFlyingSpeed(); // TODO: possible speed conversion issue
}
@Override
public float getWalkSpeed() {
return getHandle().get(Human.class).getWalkingSpeed(); // TODO: possible speed conversion issue
}
@Override
public void setTexturePack(String s) {
throw new UnsupportedOperationException();
}
@Override
public Scoreboard getScoreboard() {
throw new UnsupportedOperationException();
}
@Override
public void setScoreboard(Scoreboard scoreboard) {
throw new UnsupportedOperationException();
}
@Override
public boolean isHealthScaled() {
throw new UnsupportedOperationException();
}
@Override
public void setHealthScaled(boolean b) {
throw new UnsupportedOperationException();
}
@Override
public void setHealthScale(double v) throws IllegalArgumentException {
throw new UnsupportedOperationException();
}
@Override
public double getHealthScale() {
throw new UnsupportedOperationException();
}
@Override
public void sendMessage(String message) {
getHandle().sendMessage(message);
}
@Override
public void sendMessage(String[] message) {
throw new UnsupportedOperationException();
}
@Override
public Map<String, Object> serialize() {
throw new UnsupportedOperationException();
}
@Override
public void sendPluginMessage(Plugin plugin, String s, byte[] bytes) {
throw new UnsupportedOperationException();
}
@Override
public Set<String> getListeningPluginChannels() {
throw new UnsupportedOperationException();
}
@Override
public EntityType getType() {
return EntityType.PLAYER;
}
@Override
public void resetPlayerWeather() {
throw new UnsupportedOperationException();
}
@Override
public String getName() {
return getHandle().getName();
}
}