2010-12-21 17:52:15 +01:00
package org.bukkit.craftbukkit ;
2011-03-31 03:35:08 +02: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 ;
2011-04-21 16:43:09 +02:00
import net.minecraft.server.IWorldAccess ;
2011-01-29 22:04:02 +01:00
import org.bukkit.command.* ;
2011-01-15 22:21:05 +01:00
import org.bukkit.entity.Player ;
2011-03-26 23:20:35 +01:00
import org.bukkit.event.world.WorldLoadEvent ;
2011-04-16 04:11:13 +02:00
import org.bukkit.inventory.FurnaceRecipe ;
import org.bukkit.inventory.Recipe ;
import org.bukkit.inventory.ShapedRecipe ;
import org.bukkit.inventory.ShapelessRecipe ;
2011-03-26 23:20:35 +01:00
2010-12-24 18:24:21 +01:00
import java.io.File ;
2011-01-07 03:42:53 +01:00
import java.util.ArrayList ;
2011-02-09 21:25:14 +01:00
import java.util.LinkedHashMap ;
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-03-31 22:40:00 +02:00
import java.util.Random ;
2010-12-24 18:24:21 +01:00
import java.util.logging.Level ;
import java.util.logging.Logger ;
2011-02-25 17:12:38 +01:00
import jline.ConsoleReader ;
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-01-29 22:50:29 +01:00
import net.minecraft.server.EntityPlayer ;
2010-12-27 03:13:03 +01:00
import net.minecraft.server.MinecraftServer ;
2011-01-20 04:53:43 +01:00
import net.minecraft.server.PropertyManager ;
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-02-05 19:15:04 +01:00
import net.minecraft.server.WorldServer ;
2011-03-12 19:23:57 +01:00
import net.minecraft.server.ServerCommand ;
import net.minecraft.server.ICommandListener ;
2010-12-22 16:22:23 +01:00
import org.bukkit.* ;
2011-01-03 03:25:09 +01:00
import org.bukkit.plugin.Plugin ;
2010-12-24 18:24:21 +01:00
import org.bukkit.plugin.PluginManager ;
2010-12-25 16:42:17 +01:00
import org.bukkit.plugin.SimplePluginManager ;
2010-12-24 18:24:21 +01:00
import org.bukkit.plugin.java.JavaPluginLoader ;
2011-02-03 00:53:04 +01:00
import org.bukkit.scheduler.BukkitScheduler ;
2011-04-16 04:11:13 +02:00
import org.bukkit.craftbukkit.inventory.CraftFurnaceRecipe ;
import org.bukkit.craftbukkit.inventory.CraftRecipe ;
import org.bukkit.craftbukkit.inventory.CraftShapedRecipe ;
import org.bukkit.craftbukkit.inventory.CraftShapelessRecipe ;
2011-02-03 00:53:04 +01:00
import org.bukkit.craftbukkit.scheduler.CraftScheduler ;
2011-03-31 03:35:08 +02:00
import org.bukkit.util.config.Configuration ;
2010-12-21 17:52:15 +01:00
2011-01-20 04:53:43 +01:00
public final class CraftServer implements Server {
2010-12-24 18:24:21 +01:00
private final String serverName = " Craftbukkit " ;
2011-02-01 22:55:30 +01:00
private final String serverVersion ;
2011-04-20 22:47:26 +02:00
private final String protocolVersion = " 1.5_02 " ;
2010-12-25 16:42:17 +01:00
private final PluginManager pluginManager = new SimplePluginManager ( this ) ;
2011-02-03 00:53:04 +01:00
private final BukkitScheduler scheduler = new CraftScheduler ( this ) ;
2011-01-20 04:53:43 +01:00
private final CommandMap commandMap = new SimpleCommandMap ( this ) ;
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-03-31 03:35:08 +02:00
private final Configuration configuration ;
2010-12-22 16:22:23 +01:00
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-02-05 09:10:03 +01:00
Logger . getLogger ( " Minecraft " ) . log ( Level . INFO , " This server is running " + getName ( ) + " version " + getVersion ( ) ) ;
2011-03-31 03:35:08 +02:00
configuration = new Configuration ( ( File ) console . options . valueOf ( " bukkit-settings " ) ) ;
configuration . load ( ) ;
loadConfigDefaults ( ) ;
configuration . save ( ) ;
}
private void loadConfigDefaults ( ) {
2011-04-01 17:52:00 +02:00
configuration . getString ( " database.url " , " jdbc:sqlite:{DIR}{NAME}.db " ) ;
2011-03-31 03:35:08 +02:00
configuration . getString ( " database.username " , " bukkit " ) ;
configuration . getString ( " database.password " , " walrus " ) ;
configuration . getString ( " database.driver " , " org.sqlite.JDBC " ) ;
configuration . getString ( " database.isolation " , " SERIALIZABLE " ) ;
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-01-18 01:13:45 +01: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 ( ) ) {
try {
2011-01-11 23:11:10 +01:00
Plugin [ ] plugins = pluginManager . loadPlugins ( pluginFolder ) ;
2011-03-12 18:38:10 +01:00
for ( Plugin plugin : plugins ) {
try {
plugin . onLoad ( ) ;
2011-03-31 23:33:06 +02:00
} 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
}
}
2011-01-03 03:25:09 +01:00
for ( Plugin plugin : plugins ) {
2011-01-18 01:13:45 +01:00
loadPlugin ( plugin ) ;
2011-01-03 03:25:09 +01:00
}
2010-12-24 20:04:35 +01:00
} catch ( Throwable ex ) {
2011-01-05 23:56:31 +01:00
Logger . getLogger ( CraftServer . class . getName ( ) ) . log ( Level . SEVERE , ex . getMessage ( ) + " (Is it up to date?) " , ex ) ;
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-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 ) {
List < Command > pluginCommands = PluginCommandYamlParser . parse ( plugin ) ;
2011-02-27 15:55:29 +01:00
2011-01-18 01:13:45 +01:00
if ( ! pluginCommands . isEmpty ( ) ) {
commandMap . registerAll ( plugin . getDescription ( ) . getName ( ) , pluginCommands ) ;
}
2011-02-27 15:55:29 +01:00
try {
pluginManager . enablePlugin ( plugin ) ;
} 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-02-01 22:47:28 +01:00
return serverVersion + " (MC: " + protocolVersion + " ) " ;
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-01-15 22:40:15 +01:00
public int broadcastMessage ( String message ) {
Player [ ] players = getOnlinePlayers ( ) ;
for ( Player player : players ) {
player . sendMessage ( message ) ;
}
return players . length ;
}
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 ) ;
}
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 " ) ;
}
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-03-12 19:23:57 +01:00
// End Temporary calls
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-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()
public boolean dispatchCommand ( CommandSender sender , ServerCommand serverCommand ) {
2011-04-20 19:05:14 +02:00
if ( commandMap . dispatch ( sender , serverCommand . command ) ) {
2011-03-12 19:23:57 +01:00
return true ;
}
2011-04-20 19:05:14 +02:00
return console . consoleCommandHandler . handle ( serverCommand ) ;
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
// CraftBukkit native commands
if ( commandMap . dispatch ( sender , commandLine ) ) {
return true ;
}
if ( ! sender . isOp ( ) ) {
return false ;
}
// See if the server can process this command
2011-04-20 19:05:14 +02:00
return console . consoleCommandHandler . handle ( new ServerCommand ( commandLine , new CommandListener ( sender ) ) ) ;
2011-01-16 16:35:37 +01:00
}
2011-01-20 04:53:43 +01:00
public void reload ( ) {
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-04-20 19:05:14 +02:00
boolean animals = config . getBoolean ( " spawn-monsters " , console . spawnAnimals ) ;
boolean monsters = config . getBoolean ( " spawn-monsters " , console . worlds . get ( 0 ) . spawnMonsters > 0 ) ;
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-04-21 21:40:22 +02:00
console . o = config . getBoolean ( " allow-flight " , console . o ) ;
2011-01-20 04:53:43 +01:00
2011-02-05 19:15:04 +01:00
for ( WorldServer world : console . worlds ) {
2011-04-20 19:05:14 +02:00
world . spawnMonsters = monsters ? 1 : 0 ;
world . setSpawnFlags ( monsters , animals ) ;
2011-02-05 19:15:04 +01:00
}
2011-01-28 15:18:49 +01:00
pluginManager . clearPlugins ( ) ;
commandMap . clearCommands ( ) ;
loadPlugins ( ) ;
2011-01-20 04:53:43 +01:00
}
2011-02-02 19:23:19 +01:00
@Override
public String toString ( ) {
2011-03-12 19:23:57 +01:00
return " CraftServer{ " + " serverName= " + serverName + " ,serverVersion= " + serverVersion + " ,protocolVersion= " + protocolVersion + '}' ;
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-03-31 22:40:00 +02:00
return createWorld ( name , environment , ( new Random ( ) ) . nextLong ( ) ) ;
}
public World createWorld ( String name , World . Environment environment , long seed ) {
2011-02-05 21:51:22 +01:00
File folder = new File ( name ) ;
2011-02-08 13:03:36 +01:00
World world = getWorld ( name ) ;
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-02-24 13:07:33 +01:00
Convertable converter = new WorldLoaderServer ( folder ) ;
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-03-31 22:40:00 +02:00
WorldServer internal = new WorldServer ( console , new ServerNBTManager ( new File ( " . " ) , name , true ) , name , environment = = World . Environment . NETHER ? - 1 : 0 , seed ) ;
2011-02-05 21:51:22 +01:00
2011-04-21 16:43:09 +02:00
internal . addIWorldAccess ( ( IWorldAccess ) new WorldManager ( console , internal ) ) ;
2011-04-20 19:05:14 +02:00
internal . spawnMonsters = 1 ;
internal . setSpawnFlags ( true , true ) ;
console . serverConfigurationManager . setPlayerFileData ( internal ) ;
2011-02-05 21:51:22 +01:00
console . worlds . add ( internal ) ;
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 ;
}
2011-04-20 19:05:14 +02:00
ChunkCoordinates chunkcoordinates = internal . getSpawn ( ) ;
internal . chunkProviderServer . getChunkAt ( chunkcoordinates . x + j > > 4 , chunkcoordinates . z + k > > 4 ) ;
2011-02-05 21:51:22 +01:00
2011-04-20 19:05:14 +02:00
while ( internal . doLighting ( ) ) {
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
}
public MinecraftServer getServer ( ) {
return console ;
}
2011-02-08 13:03:36 +01:00
public World getWorld ( String name ) {
return worlds . get ( name . toLowerCase ( ) ) ;
}
protected void addWorld ( World world ) {
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 ) {
return ( PluginCommand ) command ;
} 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-03-12 19:23:57 +01:00
// Inner class to capture the output of default server commands
class CommandListener implements ICommandListener {
private final CommandSender commandSender ;
private final String prefix ;
CommandListener ( CommandSender commandSender ) {
this . commandSender = commandSender ;
String [ ] parts = commandSender . getClass ( ) . getName ( ) . split ( " \\ . " ) ;
this . prefix = parts [ parts . length - 1 ] ;
}
2011-04-20 19:05:14 +02:00
public void sendMessage ( String msg ) {
2011-03-12 19:23:57 +01:00
this . commandSender . sendMessage ( msg ) ;
}
2011-04-20 19:05:14 +02:00
public String getName ( ) {
2011-03-12 19:23:57 +01:00
return this . prefix ;
}
}
2011-04-16 04:11:13 +02:00
@Override
public boolean addRecipe ( Recipe recipe ) {
CraftRecipe toAdd ;
if ( recipe instanceof CraftRecipe ) {
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 ( ) ;
return true ;
}
2010-12-21 17:52:15 +01:00
}