diff --git a/bukkit/cpw/mods/fml/server/FMLBukkitHandler.java b/bukkit/cpw/mods/fml/server/FMLBukkitHandler.java new file mode 100644 index 0000000000..84faa54786 --- /dev/null +++ b/bukkit/cpw/mods/fml/server/FMLBukkitHandler.java @@ -0,0 +1,568 @@ +/* + * The FML Forge Mod Loader suite. Copyright (C) 2012 cpw + * + * This library 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 2.1 of the License, or any later version. + * + * This library 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 library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +package cpw.mods.fml.server; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Properties; +import java.util.Random; +import java.util.logging.Logger; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.BaseMod; +import net.minecraft.server.BiomeBase; +import net.minecraft.server.EntityItem; +import net.minecraft.server.EntityHuman; +import net.minecraft.server.IChunkProvider; +import net.minecraft.server.ICommandListener; +import net.minecraft.server.IInventory; +import net.minecraft.server.ItemStack; +import net.minecraft.server.NetworkManager; +import net.minecraft.server.Packet1Login; +import net.minecraft.server.Packet250CustomPayload; +import net.minecraft.server.Packet3Chat; +import net.minecraft.server.BukkitRegistry; +import net.minecraft.server.World; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.IFMLSidedHandler; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.ModContainer; +import cpw.mods.fml.common.ModMetadata; +import cpw.mods.fml.common.modloader.ModLoaderModContainer; +import cpw.mods.fml.common.modloader.ModProperty; +import cpw.mods.fml.common.registry.FMLRegistry; + +/** + * Handles primary communication from hooked code into the system + * + * The FML entry point is {@link #onPreLoad(MinecraftServer)} called from {@link MinecraftServer} + * + * Obfuscated code should focus on this class and other members of the "server" (or "client") code + * + * The actual mod loading is handled at arms length by {@link Loader} + * + * It is expected that a similar class will exist for each target environment: Bukkit and Client side. + * + * It should not be directly modified. + * + * @author cpw + * + */ +public class FMLBukkitHandler implements IFMLSidedHandler +{ + /** + * The singleton + */ + private static final FMLBukkitHandler INSTANCE = new FMLBukkitHandler(); + + /** + * A reference to the server itself + */ + private MinecraftServer server; + + /** + * A handy list of the default overworld biomes + */ + private BiomeBase[] defaultOverworldBiomes; + + /** + * Called to start the whole game off from {@link MinecraftServer#startServer} + * @param minecraftServer + */ + public void onPreLoad(MinecraftServer minecraftServer) + { + try + { + Class.forName("BaseModMp", false, getClass().getClassLoader()); + MinecraftServer.log.severe("" + + "Forge Mod Loader has detected that this server has an ModLoaderMP installed alongside Forge Mod Loader.\n" + + "This will cause a serious problem with compatibility. To protect your worlds, this minecraft server will now shutdown.\n" + + "You should follow the installation instructions of either Minecraft Forge of Forge Mod Loader and NOT install ModLoaderMP \n" + + "into the minecraft_server.jar file " + + "before this server will be allowed to start up.\n\nFailure to do so will simply result in more startup failures.\n\n" + + "The authors of Minecraft Forge and Forge Mod Loader strongly suggest you talk to your mod's authors and get them to\nupdate their " + + "requirements. ModLoaderMP is not compatible with Minecraft Forge on the server and they will need to update their mod\n" + + "for Minecraft Forge and other server compatibility, unless they are Minecraft Forge mods, in which case they already\n" + + "don't need ModLoaderMP and the mod author simply has failed to update his requirements and should be informed appropriately.\n\n" + + "The authors of Forge Mod Loader would like to be compatible with ModLoaderMP but it is closed source and owned by SDK.\n" + + "SDK, the author of ModLoaderMP, has a standing invitation to submit compatibility patches \n" + + "to the open source community project that is Forge Mod Loader so that this incompatibility doesn't last. \n" + + "Users who wish to enjoy mods of both types are " + + "encouraged to request of SDK that he submit a\ncompatibility patch to the Forge Mod Loader project at \n" + + "http://github.com/cpw/FML.\nPosting on the minecraft forums at\nhttp://www.minecraftforum.net/topic/86765- (the MLMP thread)\n" + + "may encourage him in this effort. However, I ask that your requests be polite.\n" + + "Now, the server has to shutdown so you can reinstall your minecraft_server.jar\nproperly, until such time as we can work together."); + throw new RuntimeException( + "This FML based server has detected an installation of ModLoaderMP alongside. This will cause serious compatibility issues, so the server will now shut down."); + } + catch (ClassNotFoundException e) + { + // We're safe. continue + } + server = minecraftServer; + FMLCommonHandler.instance().registerSidedDelegate(this); + FMLRegistry.registerRegistry(new BukkitRegistry()); + Loader.instance().loadMods(); + } + + /** + * Called a bit later on during server initialization to finish loading mods + */ + public void onLoadComplete() + { + Loader.instance().initializeMods(); + } + + /** + * Every tick just before world and other ticks occur + */ + public void onPreTick() + { + FMLCommonHandler.instance().worldTickStart(); + } + + /** + * Every tick just after world and other ticks occur + */ + public void onPostTick() + { + FMLCommonHandler.instance().worldTickEnd(); + } + + /** + * Get the server instance + * @return + */ + public MinecraftServer getServer() + { + return server; + } + + /** + * Get a handle to the server's logger instance + */ + public Logger getMinecraftLogger() + { + return MinecraftServer.log; + } + + /** + * Called from ChunkProviderServer when a chunk needs to be populated + * + * To avoid polluting the worldgen seed, we generate a new random from the world seed and + * generate a seed from that + * + * @param chunkProvider + * @param chunkX + * @param chunkZ + * @param world + * @param generator + */ + public void onChunkPopulate(IChunkProvider chunkProvider, int chunkX, int chunkZ, World world, IChunkProvider generator) + { + Random fmlRandom = new Random(world.getSeed()); + long xSeed = fmlRandom.nextLong() >> 2 + 1L; + long zSeed = fmlRandom.nextLong() >> 2 + 1L; + fmlRandom.setSeed((xSeed * chunkX + zSeed * chunkZ) ^ world.getSeed()); + + for (ModContainer mod : Loader.getModList()) + { + if (mod.generatesWorld()) + { + mod.getWorldGenerator().generate(fmlRandom, chunkX, chunkZ, world, generator, chunkProvider); + } + } + } + + /** + * Called from the furnace to lookup fuel values + * + * @param itemId + * @param itemDamage + * @return + */ + public int fuelLookup(int itemId, int itemDamage) + { + int fv = 0; + + for (ModContainer mod : Loader.getModList()) + { + fv = Math.max(fv, mod.lookupFuelValue(itemId, itemDamage)); + } + + return fv; + } + + /** + * Is the offered class and instance of BaseMod and therefore a ModLoader mod? + */ + public boolean isModLoaderMod(Class clazz) + { + return BaseMod.class.isAssignableFrom(clazz); + } + + /** + * Load the supplied mod class into a mod container + */ + public ModContainer loadBaseModMod(Class clazz, File canonicalFile) + { + @SuppressWarnings("unchecked") + Class bmClazz = (Class ) clazz; + return new ModLoaderModContainer(bmClazz, canonicalFile); + } + + /** + * Called to notify that an item was picked up from the world + * @param entityItem + * @param entityPlayer + */ + public void notifyItemPickup(EntityItem entityItem, EntityHuman entityPlayer) + { + for (ModContainer mod : Loader.getModList()) + { + if (mod.wantsPickupNotification()) + { + mod.getPickupNotifier().notifyPickup(entityItem, entityPlayer); + } + } + } + + /** + * Raise an exception + * @param exception + * @param message + * @param stopGame + */ + public void raiseException(Throwable exception, String message, boolean stopGame) + { + FMLCommonHandler.instance().getFMLLogger().throwing("FMLHandler", "raiseException", exception); + throw new RuntimeException(exception); + } + + /** + * Attempt to dispense the item as an entity other than just as a the item itself + * + * @param world + * @param x + * @param y + * @param z + * @param xVelocity + * @param zVelocity + * @param item + * @return + */ + public boolean tryDispensingEntity(World world, double x, double y, double z, byte xVelocity, byte zVelocity, ItemStack item) + { + for (ModContainer mod : Loader.getModList()) + { + if (mod.wantsToDispense() && mod.getDispenseHandler().dispense(x, y, z, xVelocity, zVelocity, world, item)) + { + return true; + } + } + + return false; + } + + /** + * @return the instance + */ + public static FMLBukkitHandler instance() + { + return INSTANCE; + } + + /** + * Build a list of default overworld biomes + * @return + */ + public BiomeBase[] getDefaultOverworldBiomes() + { + if (defaultOverworldBiomes == null) + { + ArrayList biomes = new ArrayList(20); + + for (int i = 0; i < 23; i++) + { + if ("Sky".equals(BiomeBase.biomes[i].y) || "Hell".equals(BiomeBase.biomes[i].y)) + { + continue; + } + + biomes.add(BiomeBase.biomes[i]); + } + + defaultOverworldBiomes = new BiomeBase[biomes.size()]; + biomes.toArray(defaultOverworldBiomes); + } + + return defaultOverworldBiomes; + } + + /** + * Called when an item is crafted + * @param player + * @param craftedItem + * @param craftingGrid + */ + public void onItemCrafted(EntityHuman player, ItemStack craftedItem, IInventory craftingGrid) + { + for (ModContainer mod : Loader.getModList()) + { + if (mod.wantsCraftingNotification()) + { + mod.getCraftingHandler().onCrafting(player, craftedItem, craftingGrid); + } + } + } + + /** + * Called when an item is smelted + * + * @param player + * @param smeltedItem + */ + public void onItemSmelted(EntityHuman player, ItemStack smeltedItem) + { + for (ModContainer mod : Loader.getModList()) + { + if (mod.wantsCraftingNotification()) + { + mod.getCraftingHandler().onSmelting(player, smeltedItem); + } + } + } + + /** + * Called when a chat packet is received + * + * @param chat + * @param player + * @return true if you want the packet to stop processing and not echo to the rest of the world + */ + public boolean handleChatPacket(Packet3Chat chat, EntityHuman player) + { + for (ModContainer mod : Loader.getModList()) + { + if (mod.wantsNetworkPackets() && mod.getNetworkHandler().onChat(chat, player)) + { + return true; + } + } + + return false; + } + + /** + * Called when a packet 250 packet is received from the player + * @param packet + * @param player + */ + public void handlePacket250(Packet250CustomPayload packet, EntityHuman player) + { + if ("REGISTER".equals(packet.tag) || "UNREGISTER".equals(packet.tag)) + { + handleClientRegistration(packet, player); + return; + } + + ModContainer mod = FMLCommonHandler.instance().getModForChannel(packet.tag); + + if (mod != null) + { + mod.getNetworkHandler().onPacket250Packet(packet, player); + } + } + + /** + * Handle register requests for packet 250 channels + * @param packet + */ + private void handleClientRegistration(Packet250CustomPayload packet, EntityHuman player) + { + if (packet.data==null) { + return; + } + try + { + for (String channel : new String(packet.data, "UTF8").split("\0")) + { + // Skip it if we don't know it + if (FMLCommonHandler.instance().getModForChannel(channel) == null) + { + continue; + } + + if ("REGISTER".equals(packet.tag)) + { + FMLCommonHandler.instance().activateChannel(player, channel); + } + else + { + FMLCommonHandler.instance().deactivateChannel(player, channel); + } + } + } + catch (UnsupportedEncodingException e) + { + getMinecraftLogger().warning("Received invalid registration packet"); + } + } + + /** + * Handle a login + * @param loginPacket + * @param networkManager + */ + public void handleLogin(Packet1Login loginPacket, NetworkManager networkManager) + { + Packet250CustomPayload packet = new Packet250CustomPayload(); + packet.tag = "REGISTER"; + packet.data = FMLCommonHandler.instance().getPacketRegistry(); + packet.length = packet.data.length; + if (packet.length>0) { + networkManager.queue(packet); + } + } + + public void announceLogin(EntityHuman player) { + for (ModContainer mod : Loader.getModList()) + { + if (mod.wantsPlayerTracking()) + { + mod.getPlayerTracker().onPlayerLogin(player); + } + } + } + /** + * Are we a server? + */ + @Override + public boolean isServer() + { + return true; + } + + /** + * Are we a client? + */ + @Override + public boolean isClient() + { + return false; + } + + @Override + public File getMinecraftRootDirectory() + { + try { + return server.a(".").getCanonicalFile(); + } catch (IOException ioe) { + return new File("."); + } + } + + /** + * @param var2 + * @return + */ + public boolean handleServerCommand(String command, String player, ICommandListener listener) + { + for (ModContainer mod : Loader.getModList()) { + if (mod.wantsConsoleCommands() && mod.getConsoleHandler().handleCommand(command, player, listener)) { + return true; + } + } + return false; + } + + /** + * @param player + */ + public void announceLogout(EntityHuman player) + { + for (ModContainer mod : Loader.getModList()) + { + if (mod.wantsPlayerTracking()) + { + mod.getPlayerTracker().onPlayerLogout(player); + } + } + } + + /** + * @param p_28168_1_ + */ + public void announceDimensionChange(EntityHuman player) + { + for (ModContainer mod : Loader.getModList()) + { + if (mod.wantsPlayerTracking()) + { + mod.getPlayerTracker().onPlayerChangedDimension(player); + } + } + } + + @Override + public Object getMinecraftInstance() { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getCurrentLanguage() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Properties getCurrentLanguageTable() { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getObjectName(Object minecraftObject) { + // TODO Auto-generated method stub + return null; + } + + @Override + public ModMetadata readMetadataFrom(InputStream input, ModContainer mod) throws Exception { + // TODO Auto-generated method stub + return null; + } + + @Override + public void profileStart(String profileLabel) { + // TODO Auto-generated method stub + + } + + @Override + public void profileEnd() { + // TODO Auto-generated method stub + + } + + @Override + public ModProperty getModLoaderPropertyFor(Field f) { + // TODO Auto-generated method stub + return null; + } +} diff --git a/bukkit/net/minecraft/server/BaseMod.java b/bukkit/net/minecraft/server/BaseMod.java new file mode 100644 index 0000000000..121818131b --- /dev/null +++ b/bukkit/net/minecraft/server/BaseMod.java @@ -0,0 +1,328 @@ +/* + * The FML Forge Mod Loader suite. Copyright (C) 2012 cpw + * + * This library 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 2.1 of the License, or any later version. + * + * This library 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 library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +package net.minecraft.server; + +import java.util.Random; + +import org.bukkit.craftbukkit.generator.NetherChunkGenerator; +import org.bukkit.craftbukkit.generator.NormalChunkGenerator; + +import cpw.mods.fml.common.IConsoleHandler; +import cpw.mods.fml.common.ICraftingHandler; +import cpw.mods.fml.common.IDispenseHandler; +import cpw.mods.fml.common.INetworkHandler; +import cpw.mods.fml.common.IPickupNotifier; +import cpw.mods.fml.common.IPlayerTracker; +import cpw.mods.fml.common.IWorldGenerator; + +public abstract class BaseMod implements cpw.mods.fml.common.modloader.BaseMod +{ + // CALLBACK MECHANISMS + @Override + public final void onCrafting(Object... craftingParameters) + { + takenFromCrafting((EntityHuman)craftingParameters[0], (ItemStack)craftingParameters[1], (IInventory)craftingParameters[2]); + } + + @Override + public final void onSmelting(Object... smeltingParameters) + { + takenFromFurnace((EntityHuman)smeltingParameters[0], (ItemStack)smeltingParameters[1]); + } + @Override + public final boolean dispense(double x, double y, double z, byte xVelocity, byte zVelocity, Object... data) + { + return dispenseEntity((World)data[0], x, y, z, xVelocity, zVelocity, (ItemStack)data[1]); + } + + @Override + public final boolean onChat(Object... data) + { + return onChatMessageReceived((EntityHuman)data[1], (Packet3Chat)data[0]); + } + @Override + public final void onPlayerLogin(Object player) + { + onClientLogin((EntityHuman) player); + } + + @Override + public void onPlayerLogout(Object player) + { + onClientLogout((EntityHuman)player); + } + + @Override + public void onPlayerChangedDimension(Object player) + { + onClientDimensionChanged((EntityHuman)player); + } + + @Override + public final void onPacket250Packet(Object... data) + { + onPacket250Received((EntityHuman)data[1], (Packet250CustomPayload)data[0]); + } + + @Override + public final void notifyPickup(Object... pickupData) + { + EntityItem item = (EntityItem) pickupData[0]; + EntityHuman player = (EntityHuman) pickupData[1]; + onItemPickup(player, item.itemStack); + } + + @Override + public final void generate(Random random, int chunkX, int chunkZ, Object... additionalData) + { + World w = (World) additionalData[0]; + IChunkProvider cp = (IChunkProvider) additionalData[1]; + + if (cp instanceof ChunkProviderHell || cp instanceof NetherChunkGenerator) + { + generateNether(w, random, chunkX << 4, chunkZ << 4); + } + else if (cp instanceof ChunkProviderGenerate || cp instanceof NormalChunkGenerator) + { + generateSurface(w, random, chunkX << 4, chunkZ << 4); + } + } + + @Override + public final boolean handleCommand(String command, Object... data) + { + return onServerCommand(command, (String)data[0], (ICommandListener)data[1]); + } + // BASEMOD API + /** + * Override if you wish to provide a fuel item for the furnace and return the fuel value of the item + * @param id + * @param metadata + * @return + */ + public int addFuel(int id, int metadata) + { + return 0; + } + + /** + * Override if you wish to perform some action other than just dispensing the item from the dispenser + * @param world + * @param x + * @param y + * @param z + * @param xVel + * @param zVel + * @param item + * @return + */ + public boolean dispenseEntity(World world, double x, double y, double z, int xVel, int zVel, ItemStack item) + { + return false; + } + + /** + * Override if you wish to generate Nether (Hell biome) blocks + * @param world + * @param random + * @param chunkX + * @param chunkZ + */ + public void generateNether(World world, Random random, int chunkX, int chunkZ) + { + } + + /** + * Override if you wish to generate Overworld (not hell or the end) blocks + * @param world + * @param random + * @param chunkX + * @param chunkZ + */ + public void generateSurface(World world, Random random, int chunkX, int chunkZ) + { + } + + /** + * Return the name of your mod. Defaults to the class name + * @return + */ + public String getName() + { + return getClass().getSimpleName(); + } + + /** + * Get your mod priorities + * @return + */ + public String getPriorities() + { + return null; + } + + /** + * Return the version of your mod + * @return + */ + public abstract String getVersion(); + + /** + * Load your mod + */ + public abstract void load(); + + /** + * Finish loading your mod + */ + public void modsLoaded() + { + } + + /** + * Handle item pickup + * @param player + * @param item + */ + public void onItemPickup(EntityHuman player, ItemStack item) + { + } + + /** + * Ticked every game tick if you have subscribed to tick events through {@link ModLoader#setInGameHook(BaseMod, boolean, boolean)} + * @param minecraftServer the server + * @return true to continue receiving ticks + */ + public boolean onTickInGame(MinecraftServer minecraftServer) + { + return false; + } + + /** + * Not implemented because on the server you don't know who it's from + * {@link #onChatMessageReceived(EntityHuman, Packet3Chat)} + * @param text + */ + @Deprecated + public void receiveChatPacket(String text) + { + } + + /** + * Not implemented because on the server you don't know who it's from + * {@link #onPacket250Received(EntityHuman, Packet250CustomPayload)} + * @param packet + */ + @Deprecated + public void receiveCustomPacket(Packet250CustomPayload packet) + { + } + + /** + * Called when someone crafts an item from a crafting table + * @param player + * @param item + * @param matrix + */ + public void takenFromCrafting(EntityHuman player, ItemStack item, IInventory matrix) + { + } + + /** + * Called when someone takes a smelted item from a furnace + * + * @param player + * @param item + */ + public void takenFromFurnace(EntityHuman player, ItemStack item) + { + } + + /** + * The identifier string for the mod- used in client<->server negotiation + */ + @Override + public String toString() + { + return getName() + " " + getVersion(); + } + + /** + * Called when a 250 packet is received on a channel registered to this mod + * + * @param source + * @param payload + */ + public void onPacket250Received(EntityHuman source, Packet250CustomPayload payload) + { + } + + /** + * Called when a chat message is received. Return true to stop further processing + * @param source + * @param chat + * @return true if you want to consume the message so it is not available for further processing + */ + public boolean onChatMessageReceived(EntityHuman source, Packet3Chat chat) + { + return false; + } + /** + * Called when a server command is received + * @param command + * @return true if you want to consume the message so it is not available for further processing + */ + public boolean onServerCommand(String command, String sender, ICommandListener listener) + { + return false; + } + + /** + * Called when a new client logs in. + * + * @param player + */ + public void onClientLogin(EntityHuman player) + { + } + + /** + * Called when a client logs out of the server. + * + * @param player + */ + public void onClientLogout(EntityHuman player) + { + + } + + /** + * + * Called when a client changes dimensions on the server. + * + * @param player + */ + public void onClientDimensionChanged(EntityHuman player) + { + + } + + // Spare client junk + // ------- + // void addRenderer(Map, Render> renderers); + // void registerAnimation(Minecraft game); + // void renderInvBlock(RenderBlocks renderer, Block block, int metadata, int modelID); + // boolean renderWorldBlock(RenderBlocks renderer, IBlockAccess world, int x, int y, int z, Block block, int modelID); + // boolean onTickInGUI(float tick, Minecraft game, GuiScreen gui); + // void keyboardEvent(KeyBinding event); +} diff --git a/bukkit/net/minecraft/server/BukkitRegistry.java b/bukkit/net/minecraft/server/BukkitRegistry.java new file mode 100644 index 0000000000..bc113cac84 --- /dev/null +++ b/bukkit/net/minecraft/server/BukkitRegistry.java @@ -0,0 +1,151 @@ +package net.minecraft.server; + +import java.util.Collections; +import java.util.List; + +import net.minecraft.src.BiomeGenBase; + +import cpw.mods.fml.common.registry.IMinecraftRegistry; + +public class BukkitRegistry implements IMinecraftRegistry +{ + + @Override + public void addRecipe(net.minecraft.src.ItemStack output, Object... params) + { + CraftingManager.getInstance().registerShapedRecipe((ItemStack) output, params); + } + + @Override + public void addShapelessRecipe(net.minecraft.src.ItemStack output, Object... params) + { + CraftingManager.getInstance().registerShapelessRecipe((ItemStack) output, params); + } + + @Override + public void addSmelting(int input, net.minecraft.src.ItemStack output) + { + FurnaceRecipes.getInstance().registerRecipe(input, (ItemStack) output); + } + + @Override + public void registerBlock(net.minecraft.src.Block block) + { + registerBlock(block, ItemBlock.class); + } + + @Override + public void registerBlock(net.minecraft.src.Block block, Class itemclass) + { + try + { + assert block != null : "registerBlock: block cannot be null"; + assert itemclass != null : "registerBlock: itemclass cannot be null"; + int blockItemId = ((Block)block).id - 256; + itemclass.getConstructor(int.class).newInstance(blockItemId); + } + catch (Exception e) + { + //HMMM + } + } + + @Override + public void registerEntityID(Class entityClass, String entityName, int id) + { + EntityTypes.addNewEntityListMapping((Class) entityClass, entityName, id); + } + + @Override + public void registerEntityID(Class entityClass, String entityName, int id, int backgroundEggColour, int foregroundEggColour) + { + EntityTypes.addNewEntityListMapping((Class) entityClass, entityName, id, backgroundEggColour, foregroundEggColour); + } + + @Override + public void registerTileEntity(Class tileEntityClass, String id) + { + TileEntity.addNewTileEntityMapping((Class) tileEntityClass, id); + } + + @Override + public void addBiome(BiomeGenBase biome) + { + //TODO + } + + @Override + public void addSpawn(Class entityClass, int weightedProb, int min, int max, net.minecraft.src.EnumCreatureType typeOfCreature, BiomeGenBase... biomes) + { + BiomeBase[] realBiomes=(BiomeBase[]) biomes; + for (BiomeBase biome : realBiomes) + { + @SuppressWarnings("unchecked") + List spawns = ((BiomeBase)biome).getMobs((EnumCreatureType)typeOfCreature); + + for (BiomeMeta entry : spawns) + { + //Adjusting an existing spawn entry + if (entry.a == entityClass) + { + entry.d = weightedProb; + entry.b = min; + entry.c = max; + break; + } + } + + spawns.add(new BiomeMeta(entityClass, weightedProb, min, max)); + } + } + + @Override + @SuppressWarnings("unchecked") + public void addSpawn(String entityName, int weightedProb, int min, int max, net.minecraft.src.EnumCreatureType spawnList, BiomeGenBase... biomes) + { + Class entityClazz = EntityTypes.getEntityToClassMapping().get(entityName); + + if (EntityLiving.class.isAssignableFrom(entityClazz)) + { + addSpawn((Class ) entityClazz, weightedProb, min, max, spawnList, biomes); + } + } + + @Override + public void removeBiome(BiomeGenBase biome) + { + // TODO + } + + @Override + public void removeSpawn(Class entityClass, net.minecraft.src.EnumCreatureType typeOfCreature, BiomeGenBase... biomesO) + { + BiomeBase[] biomes=(BiomeBase[]) biomesO; + for (BiomeBase biome : biomes) + { + @SuppressWarnings("unchecked") + List spawns = ((BiomeBase)biome).getMobs((EnumCreatureType) typeOfCreature); + + for (BiomeMeta entry : Collections.unmodifiableList(spawns)) + { + if (entry.a == entityClass) + { + spawns.remove(entry); + } + } + } + } + + @Override + @SuppressWarnings("unchecked") + public void removeSpawn(String entityName, net.minecraft.src.EnumCreatureType spawnList, BiomeGenBase... biomes) + { + Class entityClazz = EntityTypes.getEntityToClassMapping().get(entityName); + + if (EntityLiving.class.isAssignableFrom(entityClazz)) + { + removeSpawn((Class ) entityClazz, spawnList, biomes); + } + } + +} diff --git a/bukkit/net/minecraft/server/MLProp.java b/bukkit/net/minecraft/server/MLProp.java new file mode 100644 index 0000000000..e17928d3d0 --- /dev/null +++ b/bukkit/net/minecraft/server/MLProp.java @@ -0,0 +1,48 @@ +/* + * The FML Forge Mod Loader suite. Copyright (C) 2012 cpw + * + * This library 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 2.1 of the License, or any later version. + * + * This library 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 library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +package net.minecraft.server; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; +import static java.lang.annotation.RetentionPolicy.*; +import static java.lang.annotation.ElementType.*; + +/** + * @author cpw + * + */ +@Retention(value = RUNTIME) +@Target(value = FIELD) +public @interface MLProp +{ + /** + * Adds additional help to top of configuration file. + */ +String info() default ""; + + /** + * Maximum value allowed if field is a number. + */ + double max() default Double.MAX_VALUE; + + /** + * Minimum value allowed if field is a number. + */ + double min() default Double.MIN_VALUE; + + /** + * Overrides the field name for property key. + */ +String name() default ""; + +} diff --git a/bukkit/net/minecraft/server/ModLoader.java b/bukkit/net/minecraft/server/ModLoader.java new file mode 100644 index 0000000000..69fd90af55 --- /dev/null +++ b/bukkit/net/minecraft/server/ModLoader.java @@ -0,0 +1,618 @@ +/* + * The FML Forge Mod Loader suite. Copyright (C) 2012 cpw + * + * This library 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 2.1 of the License, or any later version. + * + * This library 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 library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +package net.minecraft.server; + +import java.util.List; +import java.util.logging.Logger; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.ReflectionHelper; +import cpw.mods.fml.common.modloader.ModLoaderHelper; +import cpw.mods.fml.common.modloader.ModLoaderModContainer; +import cpw.mods.fml.common.registry.FMLRegistry; +import cpw.mods.fml.server.FMLBukkitHandler; + +public class ModLoader +{ + /** + * Not used on the server. + * + * @param achievement + * @param name + * @param description + */ + public static void addAchievementDesc(Achievement achievement, String name, String description) + { + } + + /** + * This method is a call in hook from modified external code. Implemented elsewhere. + * + * {@link FMLBukkitHandler#fuelLookup(int, int)} + * @param id + * @param metadata + * @return + */ + @Deprecated + public static int addAllFuel(int id, int metadata) + { + return 0; + } + + /** + * This method is unimplemented in server versions to date. + * + * @param armor + * @return + */ + @Deprecated + public static int addArmor(String armor) + { + return 0; + } + + /** + * This method does not work. Creation of a BiomeGenBase is sufficient to populate this array. Using this method will likely corrupt worlds. + * + * @param biome + */ + @Deprecated + public static void addBiome(BiomeBase biome) + { + } + + /** + * Unimplemented on the server as it does not generate names + * @param key + * @param value + */ + @Deprecated + public static void addLocalization(String key, String value) + { + } + + /** + * Unimplemented on the server as it does not generate names + * @param key + * @param lang + * @param value + */ + @Deprecated + public static void addLocalization(String key, String lang, String value) + { + } + + /** + * Unimplemented on the server as it does not generate names + * @param instance + * @param name + */ + @Deprecated + public static void addName(Object instance, String name) + { + } + + /** + * Unimplemented on the server as it does not generate names + * @param instance + * @param lang + * @param name + */ + @Deprecated + public static void addName(Object instance, String lang, String name) + { + } + + /** + * Unimplemented on the server as it does not render textures + * @param fileToOverride + * @param fileToAdd + * @return + */ + @Deprecated + public static int addOverride(String fileToOverride, String fileToAdd) + { + return 0; + } + + /** + * Unimplemented on the server as it does not render textures + * @param path + * @param overlayPath + * @param index + */ + @Deprecated + public static void addOverride(String path, String overlayPath, int index) + { + } + + /** + * Add a Shaped Recipe + * @param output + * @param params + */ + public static void addRecipe(ItemStack output, Object... params) + { + FMLRegistry.addRecipe(output, params); + } + + /** + * Add a shapeless recipe + * @param output + * @param params + */ + public static void addShapelessRecipe(ItemStack output, Object... params) + { + FMLRegistry.addShapelessRecipe(output, params); + } + + /** + * Add a new product to be smelted + * @param input + * @param output + */ + public static void addSmelting(int input, ItemStack output) + { + FMLRegistry.addSmelting(input, output); + } + + /** + * Add a mob to the spawn list + * @param entityClass + * @param weightedProb + * @param min + * @param max + * @param spawnList + */ + public static void addSpawn(Class entityClass, int weightedProb, int min, int max, EnumCreatureType spawnList) + { + FMLRegistry.addSpawn(entityClass, weightedProb, min, max, spawnList, FMLBukkitHandler.instance().getDefaultOverworldBiomes()); + } + + /** + * Add a mob to the spawn list + * @param entityClass + * @param weightedProb + * @param min + * @param max + * @param spawnList + * @param biomes + */ + public static void addSpawn(Class entityClass, int weightedProb, int min, int max, EnumCreatureType spawnList, BiomeBase... biomes) + { + FMLRegistry.addSpawn(entityClass, weightedProb, min, max, spawnList, biomes); + } + + /** + * Add a mob to the spawn list + * @param entityName + * @param weightedProb + * @param min + * @param max + * @param spawnList + */ + public static void addSpawn(String entityName, int weightedProb, int min, int max, EnumCreatureType spawnList) + { + FMLRegistry.addSpawn(entityName, weightedProb, min, max, spawnList, FMLBukkitHandler.instance().getDefaultOverworldBiomes()); + } + + /** + * Add a mob to the spawn list + * @param entityName + * @param weightedProb + * @param min + * @param max + * @param spawnList + * @param biomes + */ + public static void addSpawn(String entityName, int weightedProb, int min, int max, EnumCreatureType spawnList, BiomeBase... biomes) + { + FMLRegistry.addSpawn(entityName, weightedProb, min, max, spawnList, biomes); + } + + /** + * This method is a call in hook from modified external code. Implemented elsewhere. + * {@link FMLBukkitHandler#tryDispensingEntity(World, double, double, double, byte, byte, ItemStack)} + * @param world + * @param x + * @param y + * @param z + * @param xVel + * @param zVel + * @param item + * @return + */ + @Deprecated + public static boolean dispenseEntity(World world, double x, double y, double z, int xVel, int zVel, ItemStack item) + { + return false; + } + + /** + * Remove a container and drop all the items in it on the ground around + * @param world + * @param x + * @param y + * @param z + */ + public static void genericContainerRemoval(World world, int x, int y, int z) + { + TileEntity te = world.getTileEntity(x, y, z); + + if (!(te instanceof IInventory)) + { + return; + } + + IInventory inv = (IInventory)te; + + for (int l = 0; l < inv.getSize(); l++) + { + ItemStack itemstack = inv.getItem(l); + + if (itemstack == null) + { + continue; + } + + float f = world.random.nextFloat() * 0.8F + 0.1F; + float f1 = world.random.nextFloat() * 0.8F + 0.1F; + float f2 = world.random.nextFloat() * 0.8F + 0.1F; + + while (itemstack.count > 0) + { + int i1 = world.random.nextInt(21) + 10; + + if (i1 > itemstack.count) + { + i1 = itemstack.count ; + } + + itemstack.count -= i1; + EntityItem entityitem = new EntityItem(world, (float)te.x + f, (float)te.y + f1, (float)te.z + f2, new ItemStack(itemstack.id, i1, itemstack.getData())); + float f3 = 0.05F; + entityitem.motX = (float)world.random.nextGaussian() * f3; + entityitem.motY = (float)world.random.nextGaussian() * f3 + 0.2F; + entityitem.motZ = (float)world.random.nextGaussian() * f3; + + if (itemstack.hasTag()) + { + entityitem.itemStack.setTag((NBTTagCompound)itemstack.getTag().clone()); + } + + world.addEntity(entityitem); + } + } + } + + /** + * Get a list of all BaseMod loaded into the system + * {@link ModLoaderModContainer#findAll} + * @return + */ + public static List getLoadedMods() + { + return ModLoaderModContainer.findAll(BaseMod.class); + } + + /** + * Get a logger instance + * {@link FMLBukkitHandler#getFMLLogger()} + * @return + */ + public static Logger getLogger() + { + return FMLCommonHandler.instance().getFMLLogger(); + } + + /** + * Get a value from a field using reflection + * {@link ReflectionHelper#getPrivateValue(Class, Object, int)} + * @param instanceclass + * @param instance + * @param fieldindex + * @return + */ + public static T getPrivateValue(Class instanceclass, E instance, int fieldindex) + { + return ReflectionHelper.getPrivateValue(instanceclass, instance, fieldindex); + } + + /** + * Get a value from a field using reflection + * {@link ReflectionHelper#getPrivateValue(Class, Object, String)} + * @param instanceclass + * @param instance + * @param field + * @return + */ + public static T getPrivateValue(Class instanceclass, E instance, String field) + { + return ReflectionHelper.getPrivateValue(instanceclass, instance, field); + } + + /** + * Get a new unique entity id + * {@link Entity#getNextId()} + * @return + */ + public static int getUniqueEntityId() + { + return Entity.getNextId(); + } + + /** + * Is the named mod loaded? + * {@link Loader#isModLoaded(String)} + * @param modname + * @return + */ + public static boolean isModLoaded(String modname) + { + return Loader.isModLoaded(modname); + } + + /** + * This method is a call in hook from modified external code. Implemented elsewhere. + * {@link FMLBukkitHandler#handlePacket250(Packet250CustomPayload, EntityHuman)} + * @param packet + */ + @Deprecated + public static void receivePacket(Packet250CustomPayload packet) + { + } + + /** + * Register a new block + * @param block + */ + public static void registerBlock(Block block) + { + FMLRegistry.registerBlock(block); + } + + /** + * Register a new block + * @param block + * @param itemclass + */ + public static void registerBlock(Block block, Class itemclass) + { + FMLRegistry.registerBlock(block, itemclass); + } + + /** + * Register a new entity ID + * @param entityClass + * @param entityName + * @param id + */ + public static void registerEntityID(Class entityClass, String entityName, int id) + { + FMLRegistry.registerEntityID(entityClass, entityName, id); + } + + /** + * Register a new entity ID + * @param entityClass + * @param entityName + * @param id + * @param background + * @param foreground + */ + public static void registerEntityID(Class entityClass, String entityName, int id, int background, int foreground) + { + FMLRegistry.registerEntityID(entityClass, entityName, id, background, foreground); + } + + /** + * Register the mod for packets on this channel. This only registers the channel with Forge Mod Loader, not + * with clients connecting- use BaseMod.onClientLogin to tell them about your custom channel + * {@link FMLCommonHandler#registerChannel(cpw.mods.fml.common.ModContainer, String)} + * @param mod + * @param channel + */ + public static void registerPacketChannel(BaseMod mod, String channel) + { + FMLCommonHandler.instance().registerChannel(ModLoaderModContainer.findContainerFor(mod), channel); + } + + /** + * Register a new tile entity class + * @param tileEntityClass + * @param id + */ + public static void registerTileEntity(Class tileEntityClass, String id) + { + FMLRegistry.registerTileEntity(tileEntityClass, id); + } + + /** + * Remove a biome. This code will probably not work correctly and will likely corrupt worlds. + * @param biome + */ + @Deprecated + public static void removeBiome(BiomeBase biome) + { + FMLRegistry.removeBiome(biome); + } + + /** + * Remove a spawn + * @param entityClass + * @param spawnList + */ + public static void removeSpawn(Class entityClass, EnumCreatureType spawnList) + { + FMLRegistry.removeSpawn(entityClass, spawnList, FMLBukkitHandler.instance().getDefaultOverworldBiomes()); + } + + /** + * Remove a spawn + * @param entityClass + * @param spawnList + * @param biomes + */ + public static void removeSpawn(Class entityClass, EnumCreatureType spawnList, BiomeBase... biomes) + { + FMLRegistry.removeSpawn(entityClass, spawnList, biomes); + } + + /** + * Remove a spawn + * @param entityName + * @param spawnList + */ + public static void removeSpawn(String entityName, EnumCreatureType spawnList) + { + FMLRegistry.removeSpawn(entityName, spawnList, FMLBukkitHandler.instance().getDefaultOverworldBiomes()); + } + + /** + * Remove a spawn + * @param entityName + * @param spawnList + * @param biomes + */ + public static void removeSpawn(String entityName, EnumCreatureType spawnList, BiomeBase... biomes) + { + FMLRegistry.removeSpawn(entityName, spawnList, biomes); + } + + /** + * Configuration is handled elsewhere + * {@link ModLoaderModContainer} + */ + @Deprecated + public static void saveConfig() + { + } + + /** + * This method is unimplemented on the server: it is meant for clients to send chat to the server + * {@link FMLBukkitHandler#handleChatPacket(Packet3Chat, EntityHuman)} + * @param text + */ + @Deprecated + public static void serverChat(String text) + { + } + + /** + * Indicate that you want to receive ticks + * + * @param mod + * receiving the events + * @param enable + * indicates whether you want to recieve them or not + * @param useClock + * Not used in server side: all ticks are sent on the server side (no render subticks) + */ + public static void setInGameHook(BaseMod mod, boolean enable, boolean useClock) + { + ModLoaderHelper.updateStandardTicks(mod, enable, useClock); + } + + /** + * Set a private field to a value using reflection + * {@link ReflectionHelper#setPrivateValue(Class, Object, int, Object)} + * @param instanceclass + * @param instance + * @param fieldindex + * @param value + */ + public static void setPrivateValue(Class instanceclass, T instance, int fieldindex, E value) + { + ReflectionHelper.setPrivateValue(instanceclass, instance, fieldindex, value); + } + + /** + * Set a private field to a value using reflection + * {@link ReflectionHelper#setPrivateValue(Class, Object, String, Object)} + * @param instanceclass + * @param instance + * @param field + * @param value + */ + public static void setPrivateValue(Class instanceclass, T instance, String field, E value) + { + ReflectionHelper.setPrivateValue(instanceclass, instance, field, value); + } + + /** + * This method is a call in hook from modified external code. Implemented elsewhere. + * {@link FMLBukkitHandler#onItemCrafted(EntityHuman, ItemStack, IInventory)} + * @param player + * @param item + * @param matrix + */ + @Deprecated + public static void takenFromCrafting(EntityHuman player, ItemStack item, IInventory matrix) + { + } + + /** + * This method is a call in hook from modified external code. Implemented elsewhere. + * {@link FMLBukkitHandler#onItemSmelted(EntityHuman, ItemStack)} + * @param player + * @param item + */ + @Deprecated + public static void takenFromFurnace(EntityHuman player, ItemStack item) + { + } + + /** + * Throw the offered exception. Likely will stop the game. + * {@link FMLBukkitHandler#raiseException(Throwable, String, boolean)} + * @param message + * @param e + */ + public static void throwException(String message, Throwable e) + { + FMLBukkitHandler.instance().raiseException(e, message, true); + } + + /** + * Get the minecraft server instance + * {@link FMLBukkitHandler#getServer()} + * @return + */ + public static MinecraftServer getMinecraftServerInstance() + { + return FMLBukkitHandler.instance().getServer(); + } + + /** + * To properly implement packet 250 protocol you should always check your channel + * is active prior to sending the packet + * + * @param player + * @param channel + * @return + */ + public static boolean isChannelActive(EntityHuman player, String channel) + { + return FMLCommonHandler.instance().isChannelActive(channel, player); + } + + /** + * Stubbed method on the server to return a unique model id + * + */ + @Deprecated + public static int getUniqueBlockModelID(BaseMod mod, boolean flag) { + return 0; + } +} \ No newline at end of file diff --git a/bukkit/net/minecraft/src/BiomeGenBase.java b/bukkit/net/minecraft/src/BiomeGenBase.java new file mode 100644 index 0000000000..bf1a123a3b --- /dev/null +++ b/bukkit/net/minecraft/src/BiomeGenBase.java @@ -0,0 +1,5 @@ +package net.minecraft.src; + +public interface BiomeGenBase { + +} diff --git a/bukkit/net/minecraft/src/Block.java b/bukkit/net/minecraft/src/Block.java new file mode 100644 index 0000000000..4468337600 --- /dev/null +++ b/bukkit/net/minecraft/src/Block.java @@ -0,0 +1,5 @@ +package net.minecraft.src; + +public interface Block { + +} diff --git a/bukkit/net/minecraft/src/Entity.java b/bukkit/net/minecraft/src/Entity.java new file mode 100644 index 0000000000..2ffd2feacc --- /dev/null +++ b/bukkit/net/minecraft/src/Entity.java @@ -0,0 +1,5 @@ +package net.minecraft.src; + +public interface Entity { + +} diff --git a/bukkit/net/minecraft/src/EntityLiving.java b/bukkit/net/minecraft/src/EntityLiving.java new file mode 100644 index 0000000000..bb0ead9426 --- /dev/null +++ b/bukkit/net/minecraft/src/EntityLiving.java @@ -0,0 +1,5 @@ +package net.minecraft.src; + +public interface EntityLiving { + +} diff --git a/bukkit/net/minecraft/src/EnumCreatureType.java b/bukkit/net/minecraft/src/EnumCreatureType.java new file mode 100644 index 0000000000..cce43da204 --- /dev/null +++ b/bukkit/net/minecraft/src/EnumCreatureType.java @@ -0,0 +1,5 @@ +package net.minecraft.src; + +public interface EnumCreatureType { + +} diff --git a/bukkit/net/minecraft/src/ItemBlock.java b/bukkit/net/minecraft/src/ItemBlock.java new file mode 100644 index 0000000000..0ed5ab5b79 --- /dev/null +++ b/bukkit/net/minecraft/src/ItemBlock.java @@ -0,0 +1,5 @@ +package net.minecraft.src; + +public interface ItemBlock { + +} diff --git a/bukkit/net/minecraft/src/ItemStack.java b/bukkit/net/minecraft/src/ItemStack.java new file mode 100644 index 0000000000..533c19451d --- /dev/null +++ b/bukkit/net/minecraft/src/ItemStack.java @@ -0,0 +1,5 @@ +package net.minecraft.src; + +public interface ItemStack { + +} diff --git a/bukkit/net/minecraft/src/TileEntity.java b/bukkit/net/minecraft/src/TileEntity.java new file mode 100644 index 0000000000..e29d6a48d2 --- /dev/null +++ b/bukkit/net/minecraft/src/TileEntity.java @@ -0,0 +1,5 @@ +package net.minecraft.src; + +public interface TileEntity { + +}