/*
* This file is part of SpoutcraftPlugin.
*
* Copyright (c) 2011 SpoutcraftDev <http://spoutcraft.org//>
* SpoutcraftPlugin is licensed under the GNU Lesser General Public License.
*
* SpoutcraftPlugin is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* SpoutcraftPlugin 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.getspout.spoutapi;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.logging.Logger;
import com.avaje.ebean.config.ServerConfig;
import gnu.trove.map.hash.TIntObjectHashMap;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.OfflinePlayer;
import org.bukkit.Server;
import org.bukkit.Warning.WarningState;
import org.bukkit.World;
import org.bukkit.WorldCreator;
import org.bukkit.command.CommandException;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.command.PluginCommand;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.help.HelpMap;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemFactory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.Recipe;
import org.bukkit.map.MapView;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.ServicesManager;
import org.bukkit.plugin.messaging.Messenger;
import org.bukkit.scheduler.BukkitScheduler;
import org.bukkit.scoreboard.ScoreboardManager;
import org.getspout.spoutapi.player.EntitySkinType;
import org.getspout.spoutapi.player.SpoutPlayer;
/**
* A proxy class that provides Spout objects for the {@link Server} class
*/
public class SpoutServer implements Server {
private Server server = Bukkit.getServer();
private HashMap<UUID, SpoutWorld> worlds = new HashMap<UUID, SpoutWorld>();
private TIntObjectHashMap<String> titles = new TIntObjectHashMap<String>(250);
private SpoutWorld getSpoutWorld(World world) {
if (world == null) {
return null;
}
return getSpoutWorld(world.getUID());
}
private SpoutWorld getSpoutWorld(UUID id) {
if (worlds.containsKey(id)) {
return worlds.get(id);
}
SpoutWorld world = new SpoutWorld(server.getWorld(id));
worlds.put(id, world);
return world;
}
/**
* Sets the entity skin for the target entity to the url. The Skin Type is
* used when an entity has more than one skin type.
* @param target to set the skin on
* @param url of the skin
* @param type of skin to set
*/
public void setEntitySkin(LivingEntity target, String url, EntitySkinType type) {
SpoutManager.getPlayerChunkMap().getGlobalInfo().setEntitySkin(target, url, type);
ArrayList<LivingEntity> entities = new ArrayList<LivingEntity>(1);
entities.add(target);
for (SpoutPlayer player : getOnlinePlayers()) {
player.updateEntitySkins(entities);
}
}
/**
* Gets the entity skin for the target entity. The Skin Type is used when an
* entity has more than one skin type.
* @param target to get the skin for
* @param type of skin to set
*/
public String getEntitySkin(LivingEntity target, EntitySkinType type) {
return SpoutManager.getPlayerChunkMap().getGlobalInfo().getEntitySkin(target, type);
}
/**
* Resets the entity skin for the target entity.
* @param target to reset the skin for
*/
public void resetEntitySkin(LivingEntity target) {
SpoutManager.getPlayerChunkMap().getGlobalInfo().setEntitySkin(target, null);
ArrayList<LivingEntity> entities = new ArrayList<LivingEntity>(1);
entities.add(target);
for (SpoutPlayer player : getOnlinePlayers()) {
player.updateEntitySkins(entities);
}
}
public String getTitle(LivingEntity entity) {
if (entity instanceof SpoutPlayer) {
return ((SpoutPlayer) entity).getTitle();
}
if (titles.contains(entity.getEntityId())) {
return titles.get(entity.getEntityId());
}
return null;
}
public void setTitle(LivingEntity entity, String title) {
if (entity instanceof SpoutPlayer) {
((SpoutPlayer) entity).setTitle(title);
}
titles.put(entity.getEntityId(), title);
ArrayList<LivingEntity> entities = new ArrayList<LivingEntity>(1);
entities.add(entity);
for (SpoutPlayer player : getOnlinePlayers()) {
player.updateEntitySkins(entities);
}
}
@Override
public boolean addRecipe(Recipe recipe) {
return server.addRecipe(recipe);
}
@Override
public void banIP(String address) {
server.banIP(address);
}
@Override
public int broadcast(String message, String permission) {
return server.broadcast(message, permission);
}
@Override
public int broadcastMessage(String message) {
return server.broadcastMessage(message);
}
@Override
public void configureDbConfig(ServerConfig config) {
server.configureDbConfig(config);
}
@Override
public MapView createMap(World world) {
return server.createMap(world);
}
@Override
public SpoutWorld createWorld(WorldCreator creator) {
return getSpoutWorld(server.createWorld(creator));
}
@Override
public boolean dispatchCommand(CommandSender sender, String commandLine) throws CommandException {
return server.dispatchCommand(sender, commandLine);
}
@Override
public boolean getAllowFlight() {
return server.getAllowFlight();
}
@Override
public boolean isHardcore() {
return server.isHardcore();
}
@Override
public boolean getAllowNether() {
return server.getAllowNether();
}
@Override
public boolean getAllowEnd() {
return true;
//return server.getAllowEnd();
}
@Override
public Set<OfflinePlayer> getBannedPlayers() {
return server.getBannedPlayers();
}
@Override
public String getBukkitVersion() {
return server.getBukkitVersion();
}
@Override
public Map<String, String[]> getCommandAliases() {
return server.getCommandAliases();
}
@Override
public ConsoleCommandSender getConsoleSender() {
return server.getConsoleSender();
}
@Override
public GameMode getDefaultGameMode() {
return server.getDefaultGameMode();
}
@Override
public Set<String> getIPBans() {
return server.getIPBans();
}
@Override
public String getIp() {
return server.getIp();
}
@Override
public Logger getLogger() {
return server.getLogger();
}
@Override
public MapView getMap(short id) {
return server.getMap(id);
}
@Override
public int getMaxPlayers() {
return server.getMaxPlayers();
}
@Override
public String getName() {
return server.getName();
}
@Override
public OfflinePlayer getOfflinePlayer(String name) {
return server.getOfflinePlayer(name);
}
@Override
public boolean getOnlineMode() {
return server.getOnlineMode();
}
@Override
public SpoutPlayer[] getOnlinePlayers() {
return SpoutManager.getOnlinePlayers();
}
@Override
public Set<OfflinePlayer> getOperators() {
return server.getOperators();
}
@Override
public SpoutPlayer getPlayer(String name) {
return (SpoutPlayer) server.getPlayer(name);
}
@Override
public SpoutPlayer getPlayerExact(String name) {
return (SpoutPlayer) server.getPlayerExact(name);
}
@Override
public PluginCommand getPluginCommand(String name) {
return server.getPluginCommand(name);
}
@Override
public PluginManager getPluginManager() {
return server.getPluginManager();
}
@Override
public int getPort() {
return server.getPort();
}
@Override
public BukkitScheduler getScheduler() {
return server.getScheduler();
}
@Override
public String getServerId() {
return server.getServerId();
}
@Override
public String getWorldType() {
return server.getWorldType();
}
@Override
public boolean getGenerateStructures() {
return server.getGenerateStructures();
}
@Override
public String getServerName() {
return server.getServerName();
}
@Override
public ServicesManager getServicesManager() {
return server.getServicesManager();
}
@Override
public int getSpawnRadius() {
return server.getSpawnRadius();
}
@Override
public String getUpdateFolder() {
return server.getUpdateFolder();
}
@Override
public File getUpdateFolderFile() {
return server.getUpdateFolderFile();
}
@Override
public long getConnectionThrottle() {
return server.getConnectionThrottle();
}
@Override
public String getVersion() {
return server.getVersion();
}
@Override
public int getViewDistance() {
return server.getViewDistance();
}
@Override
public Set<OfflinePlayer> getWhitelistedPlayers() {
return server.getWhitelistedPlayers();
}
@Override
public SpoutWorld getWorld(String name) {
return getSpoutWorld(server.getWorld(name));
}
@Override
public SpoutWorld getWorld(UUID uid) {
return getSpoutWorld(server.getWorld(uid));
}
@Override
public List<World> getWorlds() {
List<World> worlds = server.getWorlds();
ArrayList<World> list = new ArrayList<World>(worlds.size());
for (World w : worlds) {
list.add(getSpoutWorld(w));
}
return list;
}
public List<SpoutWorld> getSpoutWorlds() {
List<World> worlds = server.getWorlds();
ArrayList<SpoutWorld> list = new ArrayList<SpoutWorld>(worlds.size());
for (World w : worlds) {
list.add(getSpoutWorld(w));
}
return list;
}
@Override
public boolean hasWhitelist() {
return server.hasWhitelist();
}
@Override
public List<Player> matchPlayer(String name) {
return server.matchPlayer(name);
}
@Override
public void reload() {
server.reload();
}
@Override
public void reloadWhitelist() {
server.reloadWhitelist();
}
@Override
public void savePlayers() {
server.savePlayers();
}
@Override
public void setDefaultGameMode(GameMode mode) {
server.setDefaultGameMode(mode);
}
@Override
public void setSpawnRadius(int value) {
server.setSpawnRadius(value);
}
@Override
public void setWhitelist(boolean value) {
server.setWhitelist(value);
}
@Override
public void shutdown() {
server.shutdown();
}
@Override
public void unbanIP(String address) {
server.unbanIP(address);
}
@Override
public boolean unloadWorld(String name, boolean save) {
return server.unloadWorld(name, save);
}
@Override
public boolean unloadWorld(World world, boolean save) {
return server.unloadWorld(world, save);
}
@Override
public File getWorldContainer() {
return server.getWorldContainer();
}
@Override
public OfflinePlayer[] getOfflinePlayers() {
return server.getOfflinePlayers();
}
@Override
public Set<String> getListeningPluginChannels() {
return server.getListeningPluginChannels();
}
@Override
public void sendPluginMessage(Plugin arg0, String arg1, byte[] arg2) {
server.sendPluginMessage(arg0, arg1, arg2);
}
@Override
public Messenger getMessenger() {
return server.getMessenger();
}
@Override
public boolean useExactLoginLocation() {
return server.useExactLoginLocation();
}
@Override
public int getTicksPerAnimalSpawns() {
return server.getTicksPerAnimalSpawns();
}
@Override
public int getTicksPerMonsterSpawns() {
return server.getTicksPerMonsterSpawns();
}
@Override
public List<Recipe> getRecipesFor(ItemStack is) {
return server.getRecipesFor(is);
}
@Override
public Iterator<Recipe> recipeIterator() {
return server.recipeIterator();
}
@Override
public void clearRecipes() {
server.clearRecipes();
}
@Override
public void resetRecipes() {
server.resetRecipes();
}
@Override
public Inventory createInventory(InventoryHolder owner, InventoryType type) {
return server.createInventory(owner, type);
}
@Override
public Inventory createInventory(InventoryHolder owner, int size) {
return server.createInventory(owner, size);
}
@Override
public Inventory createInventory(InventoryHolder owner, int size, String title) {
return server.createInventory(owner, size, title);
}
@Override
public int getMonsterSpawnLimit() {
return server.getMonsterSpawnLimit();
}
@Override
public int getAnimalSpawnLimit() {
return server.getAnimalSpawnLimit();
}
@Override
public int getWaterAnimalSpawnLimit() {
return server.getWaterAnimalSpawnLimit();
}
@Override
public int getAmbientSpawnLimit() {
return server.getAmbientSpawnLimit();
}
@Override
public HelpMap getHelpMap() {
return server.getHelpMap();
}
@Override
public boolean isPrimaryThread() {
return server.isPrimaryThread();
}
@Override
public String getMotd() {
return server.getMotd();
}
@Override
public String getShutdownMessage() {
return server.getShutdownMessage();
}
@Override
public WarningState getWarningState() {
return server.getWarningState();
}
@Override
public ItemFactory getItemFactory() {
return server.getItemFactory();
}
@Override
public ScoreboardManager getScoreboardManager() {
return server.getScoreboardManager();
}
}