2010-12-21 17:52:15 +01:00
package org.bukkit.craftbukkit ;
2010-12-24 18:24:21 +01:00
import java.io.File ;
2011-07-17 18:19:41 +02:00
import java.io.FileInputStream ;
2012-01-30 21:51:53 +01:00
import java.io.FileNotFoundException ;
2011-08-13 03:13:35 +02:00
import java.io.IOException ;
2011-01-07 03:42:53 +01:00
import java.util.ArrayList ;
2011-12-27 06:48:09 +01:00
import java.util.Arrays ;
2011-09-03 02:59:28 +02:00
import java.util.HashSet ;
2011-07-24 05:16:14 +02:00
import java.util.Iterator ;
2011-02-09 21:25:14 +01:00
import java.util.LinkedHashMap ;
2012-06-15 05:43:46 +02:00
import java.util.LinkedHashSet ;
2010-12-22 16:22:23 +01:00
import java.util.List ;
2011-02-08 13:03:36 +01:00
import java.util.Map ;
2011-07-17 18:19:41 +02:00
import java.util.Set ;
2012-01-30 21:51:53 +01:00
import java.util.UUID ;
2010-12-24 18:24:21 +01:00
import java.util.logging.Level ;
import java.util.logging.Logger ;
2012-01-30 21:51:53 +01:00
2011-02-23 03:37:56 +01:00
import net.minecraft.server.ChunkCoordinates ;
2011-02-24 13:07:33 +01:00
import net.minecraft.server.ConvertProgressUpdater ;
import net.minecraft.server.Convertable ;
2011-07-24 05:16:14 +02:00
import net.minecraft.server.CraftingManager ;
2011-11-27 01:39:25 +01:00
import net.minecraft.server.Enchantment ;
2011-01-29 22:50:29 +01:00
import net.minecraft.server.EntityPlayer ;
2011-05-26 14:48:22 +02:00
import net.minecraft.server.EntityTracker ;
2011-07-24 05:16:14 +02:00
import net.minecraft.server.FurnaceRecipes ;
2011-06-07 08:54:14 +02:00
import net.minecraft.server.IProgressUpdate ;
2012-01-30 21:51:53 +01:00
import net.minecraft.server.IWorldAccess ;
import net.minecraft.server.Item ;
2010-12-27 03:13:03 +01:00
import net.minecraft.server.MinecraftServer ;
2012-01-09 08:51:32 +01:00
import net.minecraft.server.MobEffectList ;
2011-01-20 04:53:43 +01:00
import net.minecraft.server.PropertyManager ;
2012-01-30 21:51:53 +01:00
import net.minecraft.server.ServerCommand ;
2010-12-27 03:13:03 +01:00
import net.minecraft.server.ServerConfigurationManager ;
2011-02-23 03:37:56 +01:00
import net.minecraft.server.ServerNBTManager ;
2011-02-24 13:07:33 +01:00
import net.minecraft.server.WorldLoaderServer ;
2011-02-07 02:59:06 +01:00
import net.minecraft.server.WorldManager ;
2011-08-13 04:47:47 +02:00
import net.minecraft.server.WorldMap ;
import net.minecraft.server.WorldMapCollection ;
2011-12-04 18:57:00 +01:00
import net.minecraft.server.WorldNBTStorage ;
2012-01-30 21:51:53 +01:00
import net.minecraft.server.WorldServer ;
2011-09-15 02:23:52 +02:00
import net.minecraft.server.WorldSettings ;
2012-01-12 23:10:13 +01:00
import net.minecraft.server.WorldType ;
2012-01-30 21:51:53 +01:00
import org.bukkit.Bukkit ;
import org.bukkit.ChatColor ;
import org.bukkit.GameMode ;
import org.bukkit.OfflinePlayer ;
import org.bukkit.Server ;
import org.bukkit.World ;
import org.bukkit.World.Environment ;
import org.bukkit.WorldCreator ;
import org.bukkit.command.Command ;
import org.bukkit.command.CommandSender ;
import org.bukkit.command.ConsoleCommandSender ;
import org.bukkit.command.PluginCommand ;
import org.bukkit.command.SimpleCommandMap ;
2011-10-10 22:10:48 +02:00
import org.bukkit.configuration.ConfigurationSection ;
import org.bukkit.configuration.file.YamlConfiguration ;
import org.bukkit.configuration.serialization.ConfigurationSerialization ;
2012-01-19 09:32:05 +01:00
import org.bukkit.conversations.Conversable ;
2012-03-01 06:19:11 +01:00
import org.bukkit.craftbukkit.help.SimpleHelpMap ;
2011-04-16 04:11:13 +02:00
import org.bukkit.craftbukkit.inventory.CraftFurnaceRecipe ;
2012-02-29 19:56:35 +01:00
import org.bukkit.craftbukkit.inventory.CraftInventoryCustom ;
2011-04-16 04:11:13 +02:00
import org.bukkit.craftbukkit.inventory.CraftRecipe ;
import org.bukkit.craftbukkit.inventory.CraftShapedRecipe ;
import org.bukkit.craftbukkit.inventory.CraftShapelessRecipe ;
2011-07-24 05:16:14 +02:00
import org.bukkit.craftbukkit.inventory.RecipeIterator ;
2011-08-13 04:47:47 +02:00
import org.bukkit.craftbukkit.map.CraftMapView ;
2011-12-08 06:33:59 +01:00
import org.bukkit.craftbukkit.metadata.EntityMetadataStore ;
import org.bukkit.craftbukkit.metadata.PlayerMetadataStore ;
import org.bukkit.craftbukkit.metadata.WorldMetadataStore ;
2012-01-09 08:51:32 +01:00
import org.bukkit.craftbukkit.potion.CraftPotionBrewer ;
2011-02-03 00:53:04 +01:00
import org.bukkit.craftbukkit.scheduler.CraftScheduler ;
2012-02-16 23:31:40 +01:00
import org.bukkit.craftbukkit.updater.AutoUpdater ;
import org.bukkit.craftbukkit.updater.BukkitDLUpdaterService ;
2011-12-04 18:57:00 +01:00
import org.bukkit.craftbukkit.util.DatFileFilter ;
2011-10-31 05:02:54 +01:00
import org.bukkit.craftbukkit.util.Versioning ;
2012-01-30 21:51:53 +01:00
import org.bukkit.entity.Player ;
2012-02-29 19:56:35 +01:00
import org.bukkit.event.inventory.InventoryType ;
2011-06-06 15:52:02 +02:00
import org.bukkit.event.world.WorldInitEvent ;
2012-01-30 21:51:53 +01:00
import org.bukkit.event.world.WorldLoadEvent ;
import org.bukkit.event.world.WorldSaveEvent ;
import org.bukkit.event.world.WorldUnloadEvent ;
import org.bukkit.generator.ChunkGenerator ;
2012-03-01 06:19:11 +01:00
import org.bukkit.help.HelpMap ;
2012-01-30 21:51:53 +01:00
import org.bukkit.inventory.FurnaceRecipe ;
2011-07-24 05:16:14 +02:00
import org.bukkit.inventory.ItemStack ;
2012-02-29 19:56:35 +01:00
import org.bukkit.inventory.Inventory ;
import org.bukkit.inventory.InventoryHolder ;
2012-01-30 21:51:53 +01:00
import org.bukkit.inventory.Recipe ;
import org.bukkit.inventory.ShapedRecipe ;
import org.bukkit.inventory.ShapelessRecipe ;
import org.bukkit.permissions.Permissible ;
2011-07-17 18:19:41 +02:00
import org.bukkit.permissions.Permission ;
2012-01-30 21:51:53 +01:00
import org.bukkit.plugin.Plugin ;
2011-06-22 18:46:12 +02:00
import org.bukkit.plugin.PluginLoadOrder ;
2012-01-30 21:51:53 +01:00
import org.bukkit.plugin.PluginManager ;
import org.bukkit.plugin.ServicesManager ;
import org.bukkit.plugin.SimplePluginManager ;
import org.bukkit.plugin.SimpleServicesManager ;
import org.bukkit.plugin.java.JavaPluginLoader ;
import org.bukkit.plugin.messaging.Messenger ;
2012-01-09 08:51:32 +01:00
import org.bukkit.potion.Potion ;
import org.bukkit.potion.PotionEffectType ;
2012-01-13 09:52:26 +01:00
import org.bukkit.plugin.messaging.StandardMessenger ;
2012-01-30 21:51:53 +01:00
import org.bukkit.scheduler.BukkitScheduler ;
import org.bukkit.scheduler.BukkitWorker ;
import org.bukkit.util.permissions.DefaultPermissions ;
2011-07-17 18:19:41 +02:00
import org.yaml.snakeyaml.Yaml ;
import org.yaml.snakeyaml.constructor.SafeConstructor ;
import org.yaml.snakeyaml.error.MarkedYAMLException ;
2010-12-21 17:52:15 +01:00
2012-02-29 19:56:35 +01:00
import org.apache.commons.lang.Validate ;
2012-01-30 21:51:53 +01:00
import com.avaje.ebean.config.DataSourceConfig ;
import com.avaje.ebean.config.ServerConfig ;
import com.avaje.ebean.config.dbplatform.SQLitePlatform ;
import com.avaje.ebeaninternal.server.lib.sql.TransactionIsolation ;
2012-02-29 17:27:38 +01:00
import com.google.common.collect.ImmutableList ;
2012-01-30 21:51:53 +01:00
import com.google.common.collect.MapMaker ;
2012-03-14 21:59:14 +01:00
import jline.console.ConsoleReader ;
2012-01-30 21:51:53 +01:00
2011-01-20 04:53:43 +01:00
public final class CraftServer implements Server {
2012-01-28 00:23:16 +01:00
private final String serverName = " CraftBukkit " ;
2011-02-01 22:55:30 +01:00
private final String serverVersion ;
2011-10-31 05:02:54 +01:00
private final String bukkitVersion = Versioning . getBukkitVersion ( ) ;
2011-05-02 20:31:02 +02:00
private final ServicesManager servicesManager = new SimpleServicesManager ( ) ;
2012-01-30 21:51:53 +01:00
private final BukkitScheduler scheduler = new CraftScheduler ( ) ;
2011-06-17 05:09:43 +02:00
private final SimpleCommandMap commandMap = new SimpleCommandMap ( this ) ;
2012-03-15 04:39:19 +01:00
private final SimpleHelpMap helpMap = new SimpleHelpMap ( this ) ;
2012-01-13 09:52:26 +01:00
private final StandardMessenger messenger = new StandardMessenger ( ) ;
2011-06-26 03:46:04 +02:00
private final PluginManager pluginManager = new SimplePluginManager ( this , commandMap ) ;
2010-12-22 16:22:23 +01:00
protected final MinecraftServer console ;
2010-12-26 03:20:29 +01:00
protected final ServerConfigurationManager server ;
2011-02-09 21:25:14 +01:00
private final Map < String , World > worlds = new LinkedHashMap < String , World > ( ) ;
2011-10-10 22:10:48 +02:00
private YamlConfiguration configuration ;
2011-07-17 18:19:41 +02:00
private final Yaml yaml = new Yaml ( new SafeConstructor ( ) ) ;
2011-09-25 05:21:35 +02:00
private final Map < String , OfflinePlayer > offlinePlayers = new MapMaker ( ) . softValues ( ) . makeMap ( ) ;
2012-02-16 23:31:40 +01:00
private AutoUpdater updater ;
2011-12-08 06:33:59 +01:00
private final EntityMetadataStore entityMetadata = new EntityMetadataStore ( ) ;
private final PlayerMetadataStore playerMetadata = new PlayerMetadataStore ( ) ;
private final WorldMetadataStore worldMetadata = new WorldMetadataStore ( ) ;
2012-04-24 02:01:22 +02:00
private int monsterSpawn = - 1 ;
private int animalSpawn = - 1 ;
private int waterAnimalSpawn = - 1 ;
2010-12-22 16:22:23 +01:00
2011-10-10 22:10:48 +02:00
static {
ConfigurationSerialization . registerClass ( CraftOfflinePlayer . class ) ;
}
2011-01-03 20:41:23 +01:00
public CraftServer ( MinecraftServer console , ServerConfigurationManager server ) {
this . console = console ;
this . server = server ;
2011-02-01 22:55:30 +01:00
this . serverVersion = CraftServer . class . getPackage ( ) . getImplementationVersion ( ) ;
2010-12-24 18:24:21 +01:00
2011-03-30 15:55:42 +02:00
Bukkit . setServer ( this ) ;
2011-11-20 09:01:14 +01:00
2012-01-09 08:51:32 +01:00
// Register all the Enchantments and PotionTypes now so we can stop new registration immediately after
2011-11-27 01:39:25 +01:00
Enchantment . DAMAGE_ALL . getClass ( ) ;
org . bukkit . enchantments . Enchantment . stopAcceptingRegistrations ( ) ;
2012-01-09 08:51:32 +01:00
Potion . setPotionBrewer ( new CraftPotionBrewer ( ) ) ;
MobEffectList . BLINDNESS . getClass ( ) ;
PotionEffectType . stopAcceptingRegistrations ( ) ;
2011-11-27 01:39:25 +01:00
// Ugly hack :(
2011-11-05 21:14:26 +01:00
if ( ! Main . useConsole ) {
getLogger ( ) . info ( " Console input is disabled due to --noconsole command argument " ) ;
}
2011-03-30 15:55:42 +02:00
2011-10-10 22:10:48 +02:00
configuration = YamlConfiguration . loadConfiguration ( getConfigFile ( ) ) ;
configuration . options ( ) . copyDefaults ( true ) ;
configuration . setDefaults ( YamlConfiguration . loadConfiguration ( getClass ( ) . getClassLoader ( ) . getResourceAsStream ( " configurations/bukkit.yml " ) ) ) ;
saveConfig ( ) ;
2012-02-10 20:56:16 +01:00
( ( SimplePluginManager ) pluginManager ) . useTimings ( configuration . getBoolean ( " settings.plugin-profiling " ) ) ;
2012-04-24 02:01:22 +02:00
monsterSpawn = configuration . getInt ( " spawn-limits.monsters " ) ;
animalSpawn = configuration . getInt ( " spawn-limits.animals " ) ;
waterAnimalSpawn = configuration . getInt ( " spawn-limits.water-animals " ) ;
2011-11-20 09:01:14 +01:00
2012-02-16 23:31:40 +01:00
updater = new AutoUpdater ( new BukkitDLUpdaterService ( configuration . getString ( " auto-updater.host " ) ) , getLogger ( ) , configuration . getString ( " auto-updater.preferred-channel " ) ) ;
updater . setEnabled ( configuration . getBoolean ( " auto-updater.enabled " ) ) ;
2012-03-01 17:04:18 +01:00
updater . setSuggestChannels ( configuration . getBoolean ( " auto-updater.suggest-channels " ) ) ;
2012-02-16 23:31:40 +01:00
updater . getOnBroken ( ) . addAll ( configuration . getStringList ( " auto-updater.on-broken " ) ) ;
updater . getOnUpdate ( ) . addAll ( configuration . getStringList ( " auto-updater.on-update " ) ) ;
updater . check ( serverVersion ) ;
2011-06-22 18:46:12 +02:00
loadPlugins ( ) ;
enablePlugins ( PluginLoadOrder . STARTUP ) ;
2011-07-26 18:03:52 +02:00
ChunkCompressionThread . startThread ( ) ;
2011-03-31 03:35:08 +02:00
}
2011-11-20 09:01:14 +01:00
2011-10-10 22:10:48 +02:00
private File getConfigFile ( ) {
2012-01-14 23:02:10 +01:00
return ( File ) console . options . valueOf ( " bukkit-settings " ) ;
2011-10-10 22:10:48 +02:00
}
2011-11-20 09:01:14 +01:00
2011-10-10 22:10:48 +02:00
private void saveConfig ( ) {
try {
configuration . save ( getConfigFile ( ) ) ;
} catch ( IOException ex ) {
Logger . getLogger ( CraftServer . class . getName ( ) ) . log ( Level . SEVERE , " Could not save " + getConfigFile ( ) , ex ) ;
2011-06-17 05:09:43 +02:00
}
2011-01-06 19:33:59 +01:00
}
2011-01-17 21:50:37 +01:00
2011-01-06 19:33:59 +01:00
public void loadPlugins ( ) {
2011-03-07 19:58:19 +01:00
pluginManager . registerInterface ( JavaPluginLoader . class ) ;
2011-06-12 01:12:43 +02:00
File pluginFolder = ( File ) console . options . valueOf ( " plugins " ) ;
2011-01-03 03:25:09 +01:00
2010-12-24 20:04:35 +01:00
if ( pluginFolder . exists ( ) ) {
2011-06-22 18:46:12 +02:00
Plugin [ ] plugins = pluginManager . loadPlugins ( pluginFolder ) ;
for ( Plugin plugin : plugins ) {
try {
2012-02-15 20:56:36 +01:00
String message = String . format ( " Loading %s " , plugin . getDescription ( ) . getFullName ( ) ) ;
plugin . getLogger ( ) . info ( message ) ;
2011-06-22 18:46:12 +02:00
plugin . onLoad ( ) ;
} catch ( Throwable ex ) {
Logger . getLogger ( CraftServer . class . getName ( ) ) . log ( Level . SEVERE , ex . getMessage ( ) + " initializing " + plugin . getDescription ( ) . getFullName ( ) + " (Is it up to date?) " , ex ) ;
2011-03-12 18:38:10 +01:00
}
2010-12-24 20:04:35 +01:00
}
} else {
pluginFolder . mkdir ( ) ;
2010-12-24 18:24:21 +01:00
}
2010-12-21 17:52:15 +01:00
}
2011-06-22 18:46:12 +02:00
public void enablePlugins ( PluginLoadOrder type ) {
2012-03-01 06:19:11 +01:00
if ( type = = PluginLoadOrder . STARTUP ) {
helpMap . clear ( ) ;
2012-03-15 04:39:19 +01:00
helpMap . initializeGeneralTopics ( ) ;
2012-03-01 06:19:11 +01:00
}
2011-06-22 18:46:12 +02:00
Plugin [ ] plugins = pluginManager . getPlugins ( ) ;
2011-06-24 01:57:46 +02:00
2011-06-22 18:46:12 +02:00
for ( Plugin plugin : plugins ) {
if ( ( ! plugin . isEnabled ( ) ) & & ( plugin . getDescription ( ) . getLoad ( ) = = type ) ) {
loadPlugin ( plugin ) ;
}
}
2011-06-24 01:57:46 +02:00
if ( type = = PluginLoadOrder . POSTWORLD ) {
commandMap . registerServerAliases ( ) ;
2011-07-17 18:19:41 +02:00
loadCustomPermissions ( ) ;
2011-08-18 15:04:59 +02:00
DefaultPermissions . registerCorePermissions ( ) ;
2012-03-15 04:39:19 +01:00
helpMap . initializeCommands ( ) ;
2011-06-24 01:57:46 +02:00
}
2011-06-22 18:46:12 +02:00
}
2011-01-27 22:15:41 +01:00
public void disablePlugins ( ) {
pluginManager . disablePlugins ( ) ;
}
2011-01-18 01:13:45 +01:00
private void loadPlugin ( Plugin plugin ) {
2011-02-27 15:55:29 +01:00
try {
pluginManager . enablePlugin ( plugin ) ;
2011-07-17 18:19:41 +02:00
List < Permission > perms = plugin . getDescription ( ) . getPermissions ( ) ;
for ( Permission perm : perms ) {
try {
pluginManager . addPermission ( perm ) ;
} catch ( IllegalArgumentException ex ) {
getLogger ( ) . log ( Level . WARNING , " Plugin " + plugin . getDescription ( ) . getFullName ( ) + " tried to register permission ' " + perm . getName ( ) + " ' but it's already registered " , ex ) ;
}
}
2011-02-27 15:55:29 +01:00
} catch ( Throwable ex ) {
Logger . getLogger ( CraftServer . class . getName ( ) ) . log ( Level . SEVERE , ex . getMessage ( ) + " loading " + plugin . getDescription ( ) . getFullName ( ) + " (Is it up to date?) " , ex ) ;
}
2011-01-18 01:13:45 +01:00
}
2010-12-21 17:52:15 +01:00
public String getName ( ) {
2010-12-22 16:22:23 +01:00
return serverName ;
2010-12-21 17:52:15 +01:00
}
public String getVersion ( ) {
2011-11-20 09:01:14 +01:00
return serverVersion + " (MC: " + console . getVersion ( ) + " ) " ;
2010-12-22 16:22:23 +01:00
}
2011-11-20 09:01:14 +01:00
2011-10-31 05:02:54 +01:00
public String getBukkitVersion ( ) {
return bukkitVersion ;
}
2010-12-22 16:22:23 +01:00
2011-07-17 15:34:40 +02:00
@SuppressWarnings ( " unchecked " )
2010-12-22 16:22:23 +01:00
public Player [ ] getOnlinePlayers ( ) {
2011-04-20 19:05:14 +02:00
List < EntityPlayer > online = server . players ;
2010-12-22 16:22:23 +01:00
Player [ ] players = new Player [ online . size ( ) ] ;
for ( int i = 0 ; i < players . length ; i + + ) {
2011-04-20 19:05:14 +02:00
players [ i ] = online . get ( i ) . netServerHandler . getPlayer ( ) ;
2010-12-22 16:22:23 +01:00
}
return players ;
2010-12-21 17:52:15 +01:00
}
2011-01-03 01:16:00 +01:00
public Player getPlayer ( final String name ) {
Player [ ] players = getOnlinePlayers ( ) ;
2011-01-17 21:50:37 +01:00
Player found = null ;
String lowerName = name . toLowerCase ( ) ;
int delta = Integer . MAX_VALUE ;
2011-01-03 01:16:00 +01:00
for ( Player player : players ) {
2011-01-17 21:50:37 +01:00
if ( player . getName ( ) . toLowerCase ( ) . startsWith ( lowerName ) ) {
int curDelta = player . getName ( ) . length ( ) - lowerName . length ( ) ;
if ( curDelta < delta ) {
found = player ;
delta = curDelta ;
}
2011-03-11 22:25:35 +01:00
if ( curDelta = = 0 ) break ;
2011-01-03 01:16:00 +01:00
}
}
2011-01-17 21:50:37 +01:00
return found ;
2011-01-03 01:16:00 +01:00
}
2011-01-17 21:50:37 +01:00
2011-09-03 16:57:54 +02:00
public Player getPlayerExact ( String name ) {
String lname = name . toLowerCase ( ) ;
for ( Player player : getOnlinePlayers ( ) ) {
if ( player . getName ( ) . equalsIgnoreCase ( lname ) ) {
return player ;
}
}
return null ;
}
2011-01-15 22:40:15 +01:00
public int broadcastMessage ( String message ) {
2011-09-02 23:24:28 +02:00
return broadcast ( message , BROADCAST_CHANNEL_USERS ) ;
2011-01-15 22:40:15 +01:00
}
2011-01-03 01:16:00 +01:00
2011-01-29 22:50:29 +01:00
public Player getPlayer ( final EntityPlayer entity ) {
2011-04-20 19:05:14 +02:00
return entity . netServerHandler . getPlayer ( ) ;
2010-12-26 03:20:29 +01:00
}
2011-01-17 21:50:37 +01:00
2011-01-07 03:42:53 +01:00
public List < Player > matchPlayer ( String partialName ) {
List < Player > matchedPlayers = new ArrayList < Player > ( ) ;
2011-01-17 21:50:37 +01:00
2011-01-06 06:10:28 +01:00
for ( Player iterPlayer : this . getOnlinePlayers ( ) ) {
String iterPlayerName = iterPlayer . getName ( ) ;
2011-01-07 03:42:53 +01:00
if ( partialName . equalsIgnoreCase ( iterPlayerName ) ) {
2011-01-06 06:10:28 +01:00
// Exact match
2011-01-10 09:30:34 +01:00
matchedPlayers . clear ( ) ;
matchedPlayers . add ( iterPlayer ) ;
break ;
}
2011-01-07 03:42:53 +01:00
if ( iterPlayerName . toLowerCase ( ) . indexOf ( partialName . toLowerCase ( ) ) ! = - 1 ) {
2011-01-10 09:30:34 +01:00
// Partial match
2011-01-07 03:42:53 +01:00
matchedPlayers . add ( iterPlayer ) ;
2011-01-06 06:10:28 +01:00
}
}
2011-01-07 03:42:53 +01:00
return matchedPlayers ;
2011-01-06 06:10:28 +01:00
}
2010-12-26 03:20:29 +01:00
2011-02-04 07:12:33 +01:00
public int getMaxPlayers ( ) {
2011-04-20 19:05:14 +02:00
return server . maxPlayers ;
2011-02-04 07:12:33 +01:00
}
2011-02-06 13:30:50 +01:00
2011-03-12 19:23:57 +01:00
// NOTE: These are dependent on the corrisponding call in MinecraftServer
// so if that changes this will need to as well
public int getPort ( ) {
return this . getConfigInt ( " server-port " , 25565 ) ;
}
2011-08-15 20:27:02 +02:00
public int getViewDistance ( ) {
return this . getConfigInt ( " view-distance " , 10 ) ;
}
2011-03-12 19:23:57 +01:00
public String getIp ( ) {
return this . getConfigString ( " server-ip " , " " ) ;
}
2011-03-26 09:39:23 +01:00
public String getServerName ( ) {
2011-03-12 19:23:57 +01:00
return this . getConfigString ( " server-name " , " Unknown Server " ) ;
}
2011-03-26 09:39:23 +01:00
public String getServerId ( ) {
return this . getConfigString ( " server-id " , " unnamed " ) ;
}
2012-03-10 08:28:32 +01:00
public String getWorldType ( ) {
return this . getConfigString ( " level-type " , " DEFAULT " ) ;
}
public boolean getGenerateStructures ( ) {
return this . getConfigBoolean ( " generate-structures " , true ) ;
}
2011-12-09 18:55:36 +01:00
public boolean getAllowEnd ( ) {
return this . configuration . getBoolean ( " settings.allow-end " ) ;
}
2011-08-08 02:25:46 +02:00
public boolean getAllowNether ( ) {
return this . getConfigBoolean ( " allow-nether " , true ) ;
}
2012-01-15 11:11:25 +01:00
public boolean getWarnOnOverload ( ) {
return this . configuration . getBoolean ( " settings.warn-on-overload " ) ;
}
2011-08-08 02:25:46 +02:00
public boolean hasWhitelist ( ) {
return this . getConfigBoolean ( " white-list " , false ) ;
}
2011-03-12 19:23:57 +01:00
// NOTE: Temporary calls through to server.properies until its replaced
2011-03-26 09:39:23 +01:00
private String getConfigString ( String variable , String defaultValue ) {
2011-04-20 19:05:14 +02:00
return this . console . propertyManager . getString ( variable , defaultValue ) ;
2011-03-12 19:23:57 +01:00
}
2011-03-26 09:39:23 +01:00
private int getConfigInt ( String variable , int defaultValue ) {
2011-04-20 19:05:14 +02:00
return this . console . propertyManager . getInt ( variable , defaultValue ) ;
2011-03-12 19:23:57 +01:00
}
2011-03-26 09:39:23 +01:00
2011-08-08 02:25:46 +02:00
private boolean getConfigBoolean ( String variable , boolean defaultValue ) {
return this . console . propertyManager . getBoolean ( variable , defaultValue ) ;
}
2011-03-12 19:23:57 +01:00
// End Temporary calls
2011-05-05 22:57:22 +02:00
public String getUpdateFolder ( ) {
return this . configuration . getString ( " settings.update-folder " , " update " ) ;
}
2011-09-25 03:22:06 +02:00
public File getUpdateFolderFile ( ) {
return new File ( ( File ) console . options . valueOf ( " plugins " ) , this . configuration . getString ( " settings.update-folder " , " update " ) ) ;
}
2011-09-17 02:57:43 +02:00
public int getPingPacketLimit ( ) {
return this . configuration . getInt ( " settings.ping-packet-limit " , 100 ) ;
}
2012-03-22 13:03:24 +01:00
public long getConnectionThrottle ( ) {
return this . configuration . getInt ( " settings.connection-throttle " ) ;
}
2012-02-10 16:23:52 +01:00
public int getTicksPerAnimalSpawns ( ) {
return this . configuration . getInt ( " ticks-per.animal-spawns " ) ;
}
public int getTicksPerMonsterSpawns ( ) {
return this . configuration . getInt ( " ticks-per.monster-spawns " ) ;
}
2010-12-24 18:24:21 +01:00
public PluginManager getPluginManager ( ) {
return pluginManager ;
}
2010-12-27 03:13:03 +01:00
2011-02-03 00:53:04 +01:00
public BukkitScheduler getScheduler ( ) {
return scheduler ;
}
2011-05-02 20:31:02 +02:00
public ServicesManager getServicesManager ( ) {
return servicesManager ;
}
2011-02-07 02:59:06 +01:00
public List < World > getWorlds ( ) {
2011-02-08 13:03:36 +01:00
return new ArrayList < World > ( worlds . values ( ) ) ;
2010-12-27 03:13:03 +01:00
}
2010-12-30 05:30:12 +01:00
public ServerConfigurationManager getHandle ( ) {
return server ;
}
2011-01-16 16:35:37 +01:00
2011-03-12 19:23:57 +01:00
// NOTE: Should only be called from MinecraftServer.b()
2012-01-19 09:32:05 +01:00
public boolean dispatchServerCommand ( CommandSender sender , ServerCommand serverCommand ) {
if ( sender instanceof Conversable ) {
Conversable conversable = ( Conversable ) sender ;
if ( conversable . isConversing ( ) ) {
conversable . acceptConversationInput ( serverCommand . command ) ;
return true ;
}
}
2011-09-03 16:57:54 +02:00
return dispatchCommand ( sender , serverCommand . command ) ;
2011-03-12 19:23:57 +01:00
}
2011-01-29 22:04:02 +01:00
public boolean dispatchCommand ( CommandSender sender , String commandLine ) {
2011-03-12 19:23:57 +01:00
if ( commandMap . dispatch ( sender , commandLine ) ) {
return true ;
}
2011-08-13 04:47:47 +02:00
2011-09-03 16:57:54 +02:00
sender . sendMessage ( " Unknown command. Type \" help \" for help. " ) ;
2011-03-12 19:23:57 +01:00
2011-09-03 16:57:54 +02:00
return false ;
2011-01-16 16:35:37 +01:00
}
2011-01-20 04:53:43 +01:00
public void reload ( ) {
2011-10-10 22:10:48 +02:00
configuration = YamlConfiguration . loadConfiguration ( getConfigFile ( ) ) ;
2011-01-20 04:53:43 +01:00
PropertyManager config = new PropertyManager ( console . options ) ;
2011-04-20 19:05:14 +02:00
console . propertyManager = config ;
2011-01-29 22:04:02 +01:00
2011-05-22 21:29:55 +02:00
boolean animals = config . getBoolean ( " spawn-animals " , console . spawnAnimals ) ;
2011-09-24 23:03:31 +02:00
boolean monsters = config . getBoolean ( " spawn-monsters " , console . worlds . get ( 0 ) . difficulty > 0 ) ;
2011-10-03 16:08:38 +02:00
int difficulty = config . getInt ( " difficulty " , console . worlds . get ( 0 ) . difficulty ) ;
2011-01-20 04:53:43 +01:00
2011-04-20 19:05:14 +02:00
console . onlineMode = config . getBoolean ( " online-mode " , console . onlineMode ) ;
console . spawnAnimals = config . getBoolean ( " spawn-animals " , console . spawnAnimals ) ;
console . pvpMode = config . getBoolean ( " pvp " , console . pvpMode ) ;
2011-06-27 00:25:01 +02:00
console . allowFlight = config . getBoolean ( " allow-flight " , console . allowFlight ) ;
2012-04-24 02:01:22 +02:00
monsterSpawn = configuration . getInt ( " spawn-limits.monsters " ) ;
animalSpawn = configuration . getInt ( " spawn-limits.animals " ) ;
waterAnimalSpawn = configuration . getInt ( " spawn-limits.water-animals " ) ;
2011-01-20 04:53:43 +01:00
2011-02-05 19:15:04 +01:00
for ( WorldServer world : console . worlds ) {
2011-10-03 16:08:38 +02:00
world . difficulty = difficulty ;
2011-04-20 19:05:14 +02:00
world . setSpawnFlags ( monsters , animals ) ;
2012-02-10 16:23:52 +01:00
if ( this . getTicksPerAnimalSpawns ( ) < 0 ) {
world . ticksPerAnimalSpawns = 400 ;
} else {
world . ticksPerAnimalSpawns = this . getTicksPerAnimalSpawns ( ) ;
}
if ( this . getTicksPerMonsterSpawns ( ) < 0 ) {
world . ticksPerMonsterSpawns = 1 ;
} else {
world . ticksPerMonsterSpawns = this . getTicksPerMonsterSpawns ( ) ;
}
2011-02-05 19:15:04 +01:00
}
2011-01-28 15:18:49 +01:00
pluginManager . clearPlugins ( ) ;
commandMap . clearCommands ( ) ;
2011-07-24 05:16:14 +02:00
resetRecipes ( ) ;
2011-04-28 21:10:39 +02:00
int pollCount = 0 ;
// Wait for at most 2.5 seconds for plugins to close their threads
2011-06-12 01:12:43 +02:00
while ( pollCount < 50 & & getScheduler ( ) . getActiveWorkers ( ) . size ( ) > 0 ) {
2011-04-28 21:10:39 +02:00
try {
Thread . sleep ( 50 ) ;
2011-06-12 01:12:43 +02:00
} catch ( InterruptedException e ) { }
2011-04-28 21:10:39 +02:00
pollCount + + ;
}
List < BukkitWorker > overdueWorkers = getScheduler ( ) . getActiveWorkers ( ) ;
2011-06-12 01:12:43 +02:00
for ( BukkitWorker worker : overdueWorkers ) {
2011-04-28 21:10:39 +02:00
Plugin plugin = worker . getOwner ( ) ;
String author = " <NoAuthorGiven> " ;
if ( plugin . getDescription ( ) . getAuthors ( ) . size ( ) > 0 ) {
author = plugin . getDescription ( ) . getAuthors ( ) . get ( 0 ) ;
}
getLogger ( ) . log ( Level . SEVERE , String . format (
" Nag author: '%s' of '%s' about the following: %s " ,
author ,
plugin . getDescription ( ) . getName ( ) ,
" This plugin is not properly shutting down its async tasks when it is being reloaded. This may cause conflicts with the newly loaded version of the plugin "
) ) ;
}
2011-01-28 15:18:49 +01:00
loadPlugins ( ) ;
2011-06-22 18:46:12 +02:00
enablePlugins ( PluginLoadOrder . STARTUP ) ;
enablePlugins ( PluginLoadOrder . POSTWORLD ) ;
2011-01-20 04:53:43 +01:00
}
2011-02-02 19:23:19 +01:00
2012-01-30 21:51:53 +01:00
@SuppressWarnings ( { " unchecked " , " finally " } )
2011-07-17 18:19:41 +02:00
private void loadCustomPermissions ( ) {
File file = new File ( configuration . getString ( " settings.permissions-file " ) ) ;
FileInputStream stream ;
try {
stream = new FileInputStream ( file ) ;
} catch ( FileNotFoundException ex ) {
try {
file . createNewFile ( ) ;
} finally {
return ;
}
}
Map < String , Map < String , Object > > perms ;
try {
2012-01-14 23:02:10 +01:00
perms = ( Map < String , Map < String , Object > > ) yaml . load ( stream ) ;
2011-07-17 18:19:41 +02:00
} catch ( MarkedYAMLException ex ) {
getLogger ( ) . log ( Level . WARNING , " Server permissions file " + file + " is not valid YAML: " + ex . toString ( ) ) ;
return ;
} catch ( Throwable ex ) {
getLogger ( ) . log ( Level . WARNING , " Server permissions file " + file + " is not valid YAML. " , ex ) ;
return ;
2011-08-13 03:13:35 +02:00
} finally {
try {
stream . close ( ) ;
} catch ( IOException ex ) { }
2011-07-17 18:19:41 +02:00
}
if ( perms = = null ) {
getLogger ( ) . log ( Level . INFO , " Server permissions file " + file + " is empty, ignoring it " ) ;
return ;
}
2012-04-15 20:24:38 +02:00
List < Permission > permsList = Permission . loadPermissions ( perms , " Permission node '%s' in " + file + " is invalid " , Permission . DEFAULT_PERMISSION ) ;
2011-07-17 18:19:41 +02:00
2012-04-15 20:24:38 +02:00
for ( Permission perm : permsList ) {
2011-07-17 18:19:41 +02:00
try {
2012-04-15 20:24:38 +02:00
pluginManager . addPermission ( perm ) ;
} catch ( IllegalArgumentException ex ) {
getLogger ( ) . log ( Level . SEVERE , " Permission in " + file + " was already defined " , ex ) ;
2011-07-17 18:19:41 +02:00
}
}
}
2011-02-02 19:23:19 +01:00
@Override
public String toString ( ) {
2011-11-20 09:01:14 +01:00
return " CraftServer{ " + " serverName= " + serverName + " ,serverVersion= " + serverVersion + " ,minecraftVersion= " + console . getVersion ( ) + '}' ;
2011-02-02 19:23:19 +01:00
}
2011-02-05 21:51:22 +01:00
2011-02-06 21:50:57 +01:00
public World createWorld ( String name , World . Environment environment ) {
2011-09-25 02:05:10 +02:00
return WorldCreator . name ( name ) . environment ( environment ) . createWorld ( ) ;
2011-03-31 22:40:00 +02:00
}
public World createWorld ( String name , World . Environment environment , long seed ) {
2011-09-25 02:05:10 +02:00
return WorldCreator . name ( name ) . environment ( environment ) . seed ( seed ) . createWorld ( ) ;
2011-06-06 15:52:02 +02:00
}
public World createWorld ( String name , Environment environment , ChunkGenerator generator ) {
2011-09-25 02:05:10 +02:00
return WorldCreator . name ( name ) . environment ( environment ) . generator ( generator ) . createWorld ( ) ;
2011-06-06 15:52:02 +02:00
}
public World createWorld ( String name , Environment environment , long seed , ChunkGenerator generator ) {
2011-09-25 02:05:10 +02:00
return WorldCreator . name ( name ) . environment ( environment ) . seed ( seed ) . generator ( generator ) . createWorld ( ) ;
}
public World createWorld ( WorldCreator creator ) {
if ( creator = = null ) {
throw new IllegalArgumentException ( " Creator may not be null " ) ;
}
String name = creator . name ( ) ;
ChunkGenerator generator = creator . generator ( ) ;
2012-01-14 18:50:31 +01:00
File folder = new File ( getWorldContainer ( ) , name ) ;
2011-02-08 13:03:36 +01:00
World world = getWorld ( name ) ;
2012-02-29 22:31:04 +01:00
WorldType type = WorldType . getType ( creator . type ( ) . getName ( ) ) ;
2012-01-29 18:40:45 +01:00
boolean generateStructures = creator . generateStructures ( ) ;
2011-02-08 13:03:36 +01:00
if ( world ! = null ) {
return world ;
}
2011-03-12 19:23:57 +01:00
2011-02-05 21:51:22 +01:00
if ( ( folder . exists ( ) ) & & ( ! folder . isDirectory ( ) ) ) {
throw new IllegalArgumentException ( " File exists with the name ' " + name + " ' and isn't a folder " ) ;
}
2011-07-08 20:01:03 +02:00
if ( generator = = null ) {
generator = getGenerator ( name ) ;
}
2012-03-04 02:36:16 +01:00
Convertable converter = new WorldLoaderServer ( getWorldContainer ( ) ) ;
2011-04-20 19:05:14 +02:00
if ( converter . isConvertable ( name ) ) {
2011-02-24 13:07:33 +01:00
getLogger ( ) . info ( " Converting world ' " + name + " ' " ) ;
2011-04-20 19:05:14 +02:00
converter . convert ( name , new ConvertProgressUpdater ( console ) ) ;
2011-02-24 13:07:33 +01:00
}
2011-07-07 21:29:57 +02:00
int dimension = 10 + console . worlds . size ( ) ;
2012-01-19 17:09:24 +01:00
boolean used = false ;
do {
for ( WorldServer server : console . worlds ) {
used = server . dimension = = dimension ;
2012-01-09 08:51:32 +01:00
if ( used ) {
2012-01-19 17:09:24 +01:00
dimension + + ;
break ;
}
}
} while ( used ) ;
2011-11-20 09:01:14 +01:00
boolean hardcore = false ;
2012-01-29 18:40:45 +01:00
WorldServer internal = new WorldServer ( console , new ServerNBTManager ( getWorldContainer ( ) , name , true ) , name , dimension , new WorldSettings ( creator . seed ( ) , getDefaultGameMode ( ) . getValue ( ) , generateStructures , hardcore , type ) , creator . environment ( ) , generator ) ;
2011-07-13 09:29:43 +02:00
2011-07-13 21:35:05 +02:00
if ( ! ( worlds . containsKey ( name . toLowerCase ( ) ) ) ) {
2011-07-13 09:29:43 +02:00
return null ;
}
2011-06-27 00:25:01 +02:00
internal . worldMaps = console . worlds . get ( 0 ) . worldMaps ;
2011-02-05 21:51:22 +01:00
2011-12-06 14:52:45 +01:00
internal . tracker = new EntityTracker ( console , internal ) ; // CraftBukkit
2011-06-12 01:12:43 +02:00
internal . addIWorldAccess ( ( IWorldAccess ) new WorldManager ( console , internal ) ) ;
2011-09-24 23:03:31 +02:00
internal . difficulty = 1 ;
2011-04-20 19:05:14 +02:00
internal . setSpawnFlags ( true , true ) ;
2011-02-05 21:51:22 +01:00
console . worlds . add ( internal ) ;
2011-06-06 15:52:02 +02:00
if ( generator ! = null ) {
internal . getWorld ( ) . getPopulators ( ) . addAll ( generator . getDefaultPopulators ( internal . getWorld ( ) ) ) ;
}
pluginManager . callEvent ( new WorldInitEvent ( internal . getWorld ( ) ) ) ;
2012-01-14 23:02:10 +01:00
System . out . print ( " Preparing start region for level " + ( console . worlds . size ( ) - 1 ) + " (Seed: " + internal . getSeed ( ) + " ) " ) ;
2011-06-06 15:52:02 +02:00
2011-07-27 01:24:27 +02:00
if ( internal . getWorld ( ) . getKeepSpawnInMemory ( ) ) {
short short1 = 196 ;
long i = System . currentTimeMillis ( ) ;
for ( int j = - short1 ; j < = short1 ; j + = 16 ) {
for ( int k = - short1 ; k < = short1 ; k + = 16 ) {
long l = System . currentTimeMillis ( ) ;
if ( l < i ) {
i = l ;
}
if ( l > i + 1000L ) {
int i1 = ( short1 * 2 + 1 ) * ( short1 * 2 + 1 ) ;
int j1 = ( j + short1 ) * ( short1 * 2 + 1 ) + k + 1 ;
System . out . println ( " Preparing spawn area for " + name + " , " + ( j1 * 100 / i1 ) + " % " ) ;
i = l ;
}
ChunkCoordinates chunkcoordinates = internal . getSpawn ( ) ;
internal . chunkProviderServer . getChunkAt ( chunkcoordinates . x + j > > 4 , chunkcoordinates . z + k > > 4 ) ;
2011-11-30 00:17:43 +01:00
while ( internal . updateLights ( ) ) {
2011-07-27 01:24:27 +02:00
;
}
2011-02-05 21:51:22 +01:00
}
}
}
2011-03-27 05:50:52 +02:00
pluginManager . callEvent ( new WorldLoadEvent ( internal . getWorld ( ) ) ) ;
2011-03-24 22:43:21 +01:00
return internal . getWorld ( ) ;
2011-02-05 21:51:22 +01:00
}
2011-06-07 08:54:14 +02:00
public boolean unloadWorld ( String name , boolean save ) {
return unloadWorld ( getWorld ( name ) , save ) ;
}
public boolean unloadWorld ( World world , boolean save ) {
if ( world = = null ) {
return false ;
}
WorldServer handle = ( ( CraftWorld ) world ) . getHandle ( ) ;
if ( ! ( console . worlds . contains ( handle ) ) ) {
return false ;
}
if ( ! ( handle . dimension > 1 ) ) {
return false ;
}
if ( handle . players . size ( ) > 0 ) {
return false ;
}
WorldUnloadEvent e = new WorldUnloadEvent ( handle . getWorld ( ) ) ;
2011-11-24 21:27:16 +01:00
pluginManager . callEvent ( e ) ;
2011-06-07 08:54:14 +02:00
if ( e . isCancelled ( ) ) {
return false ;
}
if ( save ) {
handle . save ( true , ( IProgressUpdate ) null ) ;
handle . saveLevel ( ) ;
WorldSaveEvent event = new WorldSaveEvent ( handle . getWorld ( ) ) ;
getPluginManager ( ) . callEvent ( event ) ;
}
worlds . remove ( world . getName ( ) . toLowerCase ( ) ) ;
console . worlds . remove ( console . worlds . indexOf ( handle ) ) ;
return true ;
}
2011-02-05 21:51:22 +01:00
public MinecraftServer getServer ( ) {
return console ;
}
2011-02-08 13:03:36 +01:00
public World getWorld ( String name ) {
return worlds . get ( name . toLowerCase ( ) ) ;
}
2011-07-13 06:06:07 +02:00
public World getWorld ( UUID uid ) {
2011-07-07 20:47:42 +02:00
for ( World world : worlds . values ( ) ) {
2011-07-13 06:06:07 +02:00
if ( world . getUID ( ) . equals ( uid ) ) {
2011-07-05 05:48:27 +02:00
return world ;
}
}
return null ;
}
2011-06-17 04:06:45 +02:00
public void addWorld ( World world ) {
2011-07-13 21:35:05 +02:00
// Check if a World already exists with the UID.
if ( getWorld ( world . getUID ( ) ) ! = null ) {
System . out . println ( " World " + world . getName ( ) + " is a duplicate of another world and has been prevented from loading. Please delete the uid.dat file from " + world . getName ( ) + " 's world directory if you want to be able to load the duplicate world. " ) ;
return ;
}
2011-02-08 13:03:36 +01:00
worlds . put ( world . getName ( ) . toLowerCase ( ) , world ) ;
}
2011-02-20 02:53:06 +01:00
public Logger getLogger ( ) {
2011-04-20 19:05:14 +02:00
return MinecraftServer . log ;
2011-02-20 02:53:06 +01:00
}
2011-02-25 17:12:38 +01:00
public ConsoleReader getReader ( ) {
return console . reader ;
}
2011-02-28 01:31:25 +01:00
public PluginCommand getPluginCommand ( String name ) {
Command command = commandMap . getCommand ( name ) ;
if ( command instanceof PluginCommand ) {
2011-06-12 01:12:43 +02:00
return ( PluginCommand ) command ;
2011-02-28 01:31:25 +01:00
} else {
return null ;
}
}
2011-02-26 03:29:42 +01:00
public void savePlayers ( ) {
2011-04-20 19:05:14 +02:00
server . savePlayers ( ) ;
2011-02-26 03:29:42 +01:00
}
2011-03-12 19:23:57 +01:00
2011-03-31 03:35:08 +02:00
public void configureDbConfig ( ServerConfig config ) {
DataSourceConfig ds = new DataSourceConfig ( ) ;
ds . setDriver ( configuration . getString ( " database.driver " ) ) ;
ds . setUrl ( configuration . getString ( " database.url " ) ) ;
ds . setUsername ( configuration . getString ( " database.username " ) ) ;
ds . setPassword ( configuration . getString ( " database.password " ) ) ;
ds . setIsolationLevel ( TransactionIsolation . getLevel ( configuration . getString ( " database.isolation " ) ) ) ;
if ( ds . getDriver ( ) . contains ( " sqlite " ) ) {
config . setDatabasePlatform ( new SQLitePlatform ( ) ) ;
config . getDatabasePlatform ( ) . getDbDdlSyntax ( ) . setIdentity ( " " ) ;
}
config . setDataSourceConfig ( ds ) ;
}
2011-04-16 04:11:13 +02:00
public boolean addRecipe ( Recipe recipe ) {
CraftRecipe toAdd ;
2011-06-12 01:12:43 +02:00
if ( recipe instanceof CraftRecipe ) {
2011-04-16 04:11:13 +02:00
toAdd = ( CraftRecipe ) recipe ;
} else {
if ( recipe instanceof ShapedRecipe ) {
toAdd = CraftShapedRecipe . fromBukkitRecipe ( ( ShapedRecipe ) recipe ) ;
} else if ( recipe instanceof ShapelessRecipe ) {
toAdd = CraftShapelessRecipe . fromBukkitRecipe ( ( ShapelessRecipe ) recipe ) ;
} else if ( recipe instanceof FurnaceRecipe ) {
toAdd = CraftFurnaceRecipe . fromBukkitRecipe ( ( FurnaceRecipe ) recipe ) ;
} else {
return false ;
}
}
toAdd . addToCraftingManager ( ) ;
2011-07-24 05:16:14 +02:00
CraftingManager . getInstance ( ) . sort ( ) ;
2011-04-16 04:11:13 +02:00
return true ;
}
2011-06-17 05:09:43 +02:00
2011-07-24 05:16:14 +02:00
public List < Recipe > getRecipesFor ( ItemStack result ) {
List < Recipe > results = new ArrayList < Recipe > ( ) ;
Iterator < Recipe > iter = recipeIterator ( ) ;
while ( iter . hasNext ( ) ) {
Recipe recipe = iter . next ( ) ;
ItemStack stack = recipe . getResult ( ) ;
if ( stack . getType ( ) ! = result . getType ( ) ) {
continue ;
}
if ( result . getDurability ( ) = = - 1 | | result . getDurability ( ) = = stack . getDurability ( ) ) {
results . add ( recipe ) ;
}
}
return results ;
}
public Iterator < Recipe > recipeIterator ( ) {
return new RecipeIterator ( ) ;
}
2012-02-29 17:27:38 +01:00
2011-07-24 05:16:14 +02:00
public void clearRecipes ( ) {
2012-02-29 22:31:04 +01:00
CraftingManager . getInstance ( ) . recipies . clear ( ) ;
FurnaceRecipes . getInstance ( ) . recipies . clear ( ) ;
2011-07-24 05:16:14 +02:00
}
2012-02-29 17:27:38 +01:00
2011-07-24 05:16:14 +02:00
public void resetRecipes ( ) {
2012-02-29 22:31:04 +01:00
CraftingManager . getInstance ( ) . recipies = new CraftingManager ( ) . recipies ;
FurnaceRecipes . getInstance ( ) . recipies = new FurnaceRecipes ( ) . recipies ;
2011-07-24 05:16:14 +02:00
}
2011-06-22 20:10:29 +02:00
public Map < String , String [ ] > getCommandAliases ( ) {
2011-10-10 22:10:48 +02:00
ConfigurationSection section = configuration . getConfigurationSection ( " aliases " ) ;
2011-07-13 05:14:28 +02:00
Map < String , String [ ] > result = new LinkedHashMap < String , String [ ] > ( ) ;
2011-06-17 05:09:43 +02:00
2011-10-10 22:10:48 +02:00
if ( section ! = null ) {
for ( String key : section . getKeys ( false ) ) {
List < String > commands = null ;
2011-06-22 20:10:29 +02:00
2011-10-10 22:10:48 +02:00
if ( section . isList ( key ) ) {
2012-02-29 17:27:38 +01:00
commands = section . getStringList ( key ) ;
2011-06-22 20:10:29 +02:00
} else {
2012-02-29 17:27:38 +01:00
commands = ImmutableList . < String > of ( section . getString ( key ) ) ;
2011-06-22 20:10:29 +02:00
}
result . put ( key , commands . toArray ( new String [ 0 ] ) ) ;
2011-06-17 05:09:43 +02:00
}
}
return result ;
}
2011-06-17 05:49:58 +02:00
public int getSpawnRadius ( ) {
return configuration . getInt ( " settings.spawn-radius " , 16 ) ;
}
public void setSpawnRadius ( int value ) {
2011-10-10 22:10:48 +02:00
configuration . set ( " settings.spawn-radius " , value ) ;
saveConfig ( ) ;
2011-06-17 05:49:58 +02:00
}
2011-06-19 12:13:52 +02:00
public boolean getOnlineMode ( ) {
return this . console . onlineMode ;
}
2011-06-22 19:27:27 +02:00
2011-08-08 02:25:46 +02:00
public boolean getAllowFlight ( ) {
return this . console . allowFlight ;
}
2012-01-29 12:36:43 +01:00
public boolean useExactLoginLocation ( ) {
return configuration . getBoolean ( " settings.use-exact-login-location " ) ;
}
2011-06-22 19:27:27 +02:00
public ChunkGenerator getGenerator ( String world ) {
2011-10-10 22:10:48 +02:00
ConfigurationSection section = configuration . getConfigurationSection ( " worlds " ) ;
2011-06-22 19:27:27 +02:00
ChunkGenerator result = null ;
2011-10-10 22:10:48 +02:00
if ( section ! = null ) {
section = section . getConfigurationSection ( world ) ;
2011-06-22 19:27:27 +02:00
2011-10-10 22:10:48 +02:00
if ( section ! = null ) {
String name = section . getString ( " generator " ) ;
2011-06-22 19:27:27 +02:00
2011-06-23 21:41:07 +02:00
if ( ( name ! = null ) & & ( ! name . equals ( " " ) ) ) {
2011-06-22 19:27:27 +02:00
String [ ] split = name . split ( " : " , 2 ) ;
String id = ( split . length > 1 ) ? split [ 1 ] : null ;
Plugin plugin = pluginManager . getPlugin ( split [ 0 ] ) ;
if ( plugin = = null ) {
getLogger ( ) . severe ( " Could not set generator for default world ' " + world + " ': Plugin ' " + split [ 0 ] + " ' does not exist " ) ;
} else if ( ! plugin . isEnabled ( ) ) {
getLogger ( ) . severe ( " Could not set generator for default world ' " + world + " ': Plugin ' " + split [ 0 ] + " ' is not enabled yet (is it load:STARTUP?) " ) ;
} else {
result = plugin . getDefaultWorldGenerator ( world , id ) ;
}
}
}
}
return result ;
}
2011-08-13 04:47:47 +02:00
public CraftMapView getMap ( short id ) {
WorldMapCollection collection = console . worlds . get ( 0 ) . worldMaps ;
2012-01-12 16:27:39 +01:00
WorldMap worldmap = ( WorldMap ) collection . get ( WorldMap . class , " map_ " + id ) ;
2011-08-13 04:47:47 +02:00
if ( worldmap = = null ) {
return null ;
}
return worldmap . mapView ;
}
public CraftMapView createMap ( World world ) {
2011-07-24 05:16:14 +02:00
net . minecraft . server . ItemStack stack = new net . minecraft . server . ItemStack ( Item . MAP , 1 , - 1 ) ;
2012-01-12 16:27:39 +01:00
WorldMap worldmap = Item . MAP . getSavedMap ( stack , ( ( CraftWorld ) world ) . getHandle ( ) ) ;
2011-08-13 04:47:47 +02:00
return worldmap . mapView ;
}
2011-09-02 21:18:35 +02:00
public void shutdown ( ) {
2011-09-24 23:03:31 +02:00
console . safeShutdown ( ) ;
2011-09-02 21:18:35 +02:00
}
2011-09-02 23:24:28 +02:00
public int broadcast ( String message , String permission ) {
int count = 0 ;
Set < Permissible > permissibles = getPluginManager ( ) . getPermissionSubscriptions ( permission ) ;
for ( Permissible permissible : permissibles ) {
2012-01-15 11:32:00 +01:00
if ( permissible instanceof CommandSender & & permissible . hasPermission ( permission ) ) {
2012-01-14 23:02:10 +01:00
CommandSender user = ( CommandSender ) permissible ;
2011-09-02 23:24:28 +02:00
user . sendMessage ( message ) ;
count + + ;
}
}
return count ;
}
2011-09-03 01:41:48 +02:00
public OfflinePlayer getOfflinePlayer ( String name ) {
2011-09-09 02:17:53 +02:00
OfflinePlayer result = getPlayerExact ( name ) ;
2011-09-25 05:21:35 +02:00
String lname = name . toLowerCase ( ) ;
2011-09-03 01:41:48 +02:00
if ( result = = null ) {
2011-09-25 05:21:35 +02:00
result = offlinePlayers . get ( lname ) ;
if ( result = = null ) {
result = new CraftOfflinePlayer ( this , name ) ;
offlinePlayers . put ( lname , result ) ;
}
} else {
offlinePlayers . remove ( lname ) ;
2011-09-03 01:41:48 +02:00
}
return result ;
}
2011-09-03 02:59:28 +02:00
2012-01-30 21:51:53 +01:00
@SuppressWarnings ( " unchecked " )
2011-09-03 02:59:28 +02:00
public Set < String > getIPBans ( ) {
2012-01-30 21:51:53 +01:00
return new HashSet < String > ( server . banByIP ) ;
2011-09-03 02:59:28 +02:00
}
public void banIP ( String address ) {
2011-09-24 23:03:31 +02:00
server . addIpBan ( address ) ;
2011-09-03 02:59:28 +02:00
}
public void unbanIP ( String address ) {
2011-09-24 23:03:31 +02:00
server . removeIpBan ( address ) ;
2011-09-03 02:59:28 +02:00
}
2011-09-03 03:13:07 +02:00
public Set < OfflinePlayer > getBannedPlayers ( ) {
Set < OfflinePlayer > result = new HashSet < OfflinePlayer > ( ) ;
for ( Object name : server . banByName ) {
2012-01-14 23:02:10 +01:00
result . add ( getOfflinePlayer ( ( String ) name ) ) ;
2011-09-03 03:13:07 +02:00
}
return result ;
}
2011-09-03 16:57:54 +02:00
public void setWhitelist ( boolean value ) {
2011-09-24 23:03:31 +02:00
server . hasWhitelist = value ;
console . propertyManager . setBoolean ( " white-list " , value ) ;
2011-09-03 16:57:54 +02:00
}
public Set < OfflinePlayer > getWhitelistedPlayers ( ) {
2012-06-15 05:43:46 +02:00
Set < OfflinePlayer > result = new LinkedHashSet < OfflinePlayer > ( ) ;
2011-09-03 16:57:54 +02:00
2011-09-24 23:03:31 +02:00
for ( Object name : server . getWhitelisted ( ) ) {
2012-01-14 23:02:10 +01:00
result . add ( getOfflinePlayer ( ( String ) name ) ) ;
2011-09-03 16:57:54 +02:00
}
return result ;
}
2011-09-25 04:28:00 +02:00
public Set < OfflinePlayer > getOperators ( ) {
Set < OfflinePlayer > result = new HashSet < OfflinePlayer > ( ) ;
for ( Object name : server . operators ) {
2012-01-14 23:02:10 +01:00
result . add ( getOfflinePlayer ( ( String ) name ) ) ;
2011-09-25 04:28:00 +02:00
}
return result ;
}
2011-09-03 16:57:54 +02:00
public void reloadWhitelist ( ) {
2011-09-24 23:03:31 +02:00
server . reloadWhitelist ( ) ;
2011-09-03 16:57:54 +02:00
}
2011-09-09 02:17:53 +02:00
public GameMode getDefaultGameMode ( ) {
2011-09-24 23:03:31 +02:00
return GameMode . getByValue ( console . worlds . get ( 0 ) . worldData . getGameType ( ) ) ;
2011-09-09 02:17:53 +02:00
}
public void setDefaultGameMode ( GameMode mode ) {
2011-09-15 03:22:20 +02:00
if ( mode = = null ) {
throw new IllegalArgumentException ( " Mode cannot be null " ) ;
}
for ( World world : getWorlds ( ) ) {
2012-01-14 23:02:10 +01:00
( ( CraftWorld ) world ) . getHandle ( ) . worldData . setGameType ( mode . getValue ( ) ) ;
2011-09-15 03:22:20 +02:00
}
2011-09-09 02:17:53 +02:00
}
2011-09-25 00:14:13 +02:00
public ConsoleCommandSender getConsoleSender ( ) {
return console . console ;
}
2011-10-03 01:34:51 +02:00
2011-12-08 06:33:59 +01:00
public EntityMetadataStore getEntityMetadata ( ) {
return entityMetadata ;
}
public PlayerMetadataStore getPlayerMetadata ( ) {
return playerMetadata ;
}
public WorldMetadataStore getWorldMetadata ( ) {
return worldMetadata ;
}
2011-10-03 01:34:51 +02:00
public void detectListNameConflict ( EntityPlayer entityPlayer ) {
// Collisions will make for invisible people
for ( int i = 0 ; i < getHandle ( ) . players . size ( ) ; + + i ) {
2012-01-14 23:02:10 +01:00
EntityPlayer testEntityPlayer = ( EntityPlayer ) getHandle ( ) . players . get ( i ) ;
2011-10-03 01:34:51 +02:00
// We have a problem!
if ( testEntityPlayer ! = entityPlayer & & testEntityPlayer . listName . equals ( entityPlayer . listName ) ) {
String oldName = entityPlayer . listName ;
int spaceLeft = 16 - oldName . length ( ) ;
2012-01-14 23:02:10 +01:00
if ( spaceLeft < = 1 ) { // We also hit the list name length limit!
entityPlayer . listName = oldName . subSequence ( 0 , oldName . length ( ) - 2 - spaceLeft ) + String . valueOf ( System . currentTimeMillis ( ) % 99 ) ;
2011-10-03 01:34:51 +02:00
} else {
entityPlayer . listName = oldName + String . valueOf ( System . currentTimeMillis ( ) % 99 ) ;
}
return ;
}
}
}
2011-11-20 09:01:14 +01:00
2011-10-12 05:24:41 +02:00
public File getWorldContainer ( ) {
return new File ( configuration . getString ( " settings.world-container " , " . " ) ) ;
}
2011-12-04 18:57:00 +01:00
public OfflinePlayer [ ] getOfflinePlayers ( ) {
2011-12-27 06:48:09 +01:00
WorldNBTStorage storage = ( WorldNBTStorage ) console . worlds . get ( 0 ) . getDataManager ( ) ;
2011-12-04 18:57:00 +01:00
String [ ] files = storage . getPlayerDir ( ) . list ( new DatFileFilter ( ) ) ;
2011-12-27 06:48:09 +01:00
Set < OfflinePlayer > players = new HashSet < OfflinePlayer > ( ) ;
2011-12-04 18:57:00 +01:00
for ( int i = 0 ; i < files . length ; i + + ) {
2011-12-27 06:48:09 +01:00
players . add ( getOfflinePlayer ( files [ i ] . substring ( 0 , files [ i ] . length ( ) - 4 ) ) ) ;
2011-12-04 18:57:00 +01:00
}
2011-12-27 06:48:09 +01:00
players . addAll ( Arrays . asList ( getOnlinePlayers ( ) ) ) ;
2011-12-04 18:57:00 +01:00
2012-01-02 00:25:43 +01:00
return players . toArray ( new OfflinePlayer [ players . size ( ) ] ) ;
2011-12-04 18:57:00 +01:00
}
2012-01-13 09:52:26 +01:00
public Messenger getMessenger ( ) {
return messenger ;
}
public void sendPluginMessage ( Plugin source , String channel , byte [ ] message ) {
StandardMessenger . validatePluginMessage ( getMessenger ( ) , source , channel , message ) ;
for ( Player player : getOnlinePlayers ( ) ) {
player . sendPluginMessage ( source , channel , message ) ;
}
}
public Set < String > getListeningPluginChannels ( ) {
Set < String > result = new HashSet < String > ( ) ;
for ( Player player : getOnlinePlayers ( ) ) {
result . addAll ( player . getListeningPluginChannels ( ) ) ;
}
return result ;
}
2012-02-16 23:31:40 +01:00
public void onPlayerJoin ( Player player ) {
2012-02-18 15:06:21 +01:00
if ( ( updater . isEnabled ( ) ) & & ( updater . getCurrent ( ) ! = null ) & & ( player . hasPermission ( Server . BROADCAST_CHANNEL_ADMINISTRATIVE ) ) ) {
2012-02-16 23:31:40 +01:00
if ( ( updater . getCurrent ( ) . isBroken ( ) ) & & ( updater . getOnBroken ( ) . contains ( updater . WARN_OPERATORS ) ) ) {
player . sendMessage ( ChatColor . DARK_RED + " The version of CraftBukkit that this server is running is known to be broken. Please consider updating to the latest version at dl.bukkit.org. " ) ;
} else if ( ( updater . isUpdateAvailable ( ) ) & & ( updater . getOnUpdate ( ) . contains ( updater . WARN_OPERATORS ) ) ) {
player . sendMessage ( ChatColor . DARK_PURPLE + " The version of CraftBukkit that this server is running is out of date. Please consider updating to the latest version at dl.bukkit.org. " ) ;
}
}
}
2012-02-29 19:56:35 +01:00
public Inventory createInventory ( InventoryHolder owner , InventoryType type ) {
// TODO: Create the appropriate type, rather than Custom?
return new CraftInventoryCustom ( owner , type ) ;
}
public Inventory createInventory ( InventoryHolder owner , int size ) throws IllegalArgumentException {
Validate . isTrue ( size % 9 = = 0 , " Chests must have a size that is a multiple of 9! " ) ;
return new CraftInventoryCustom ( owner , size ) ;
}
public Inventory createInventory ( InventoryHolder owner , int size , String title ) throws IllegalArgumentException {
Validate . isTrue ( size % 9 = = 0 , " Chests must have a size that is a multiple of 9! " ) ;
return new CraftInventoryCustom ( owner , size , title ) ;
}
2012-03-01 06:19:11 +01:00
public HelpMap getHelpMap ( ) {
return helpMap ;
}
public SimpleCommandMap getCommandMap ( ) {
return commandMap ;
}
2012-04-24 02:01:22 +02:00
public int getMonsterSpawnLimit ( ) {
return monsterSpawn ;
}
public int getAnimalSpawnLimit ( ) {
return animalSpawn ;
}
public int getWaterAnimalSpawnLimit ( ) {
return waterAnimalSpawn ;
}
2012-06-14 04:52:49 +02:00
public boolean isPrimaryThread ( ) {
return Thread . currentThread ( ) . equals ( console . primaryThread ) ;
}
2010-12-21 17:52:15 +01:00
}