From ec3fb620dc530d7f0df75aa4793785a24788ad7e Mon Sep 17 00:00:00 2001 From: Christian Weeks Date: Sun, 1 Apr 2012 02:14:14 -0400 Subject: [PATCH] Forge support --- .classpath | 2 +- common/fml/FMLModContainer.java | 18 ++++ common/fml/IWorldGenerator.java | 7 ++ common/fml/Loader.java | 12 +-- common/fml/ModContainer.java | 3 + common/net/minecraft/src/CommonRegistry.java | 6 +- .../server/MinecraftServer.java.patch | 15 ++- .../src/ChunkProviderServer.java.patch | 19 ++++ .../net/minecraft/src/EntityList.java.patch | 4 +- .../net/minecraft/src/TileEntity.java.patch | 2 +- .../src/TileEntityFurnace.java.patch | 19 ++++ server/fml/ml/ModLoaderModContainer.java | 16 +++ server/fml/obf/FMLHandler.java | 27 +++++ server/net/minecraft/src/BaseMod.java | 23 +++- server/net/minecraft/src/ModLoader.java | 102 +++++++++--------- 15 files changed, 202 insertions(+), 73 deletions(-) create mode 100644 common/fml/IWorldGenerator.java create mode 100644 patches/minecraft_server/net/minecraft/src/ChunkProviderServer.java.patch create mode 100644 patches/minecraft_server/net/minecraft/src/TileEntityFurnace.java.patch diff --git a/.classpath b/.classpath index 55afa91d86..feb46f8e4b 100644 --- a/.classpath +++ b/.classpath @@ -2,8 +2,8 @@ - + diff --git a/common/fml/FMLModContainer.java b/common/fml/FMLModContainer.java index 8b8c196eee..de6e654b00 100644 --- a/common/fml/FMLModContainer.java +++ b/common/fml/FMLModContainer.java @@ -94,4 +94,22 @@ public class FMLModContainer implements ModContainer { return null; } + @Override + public boolean generatesWorld() { + // TODO Auto-generated method stub + return false; + } + + @Override + public IWorldGenerator getWorldGenerator() { + // TODO Auto-generated method stub + return null; + } + + @Override + public int lookupFuelValue(int itemId, int itemDamage) { + // TODO Auto-generated method stub + return 0; + } + } diff --git a/common/fml/IWorldGenerator.java b/common/fml/IWorldGenerator.java new file mode 100644 index 0000000000..42c7c8462c --- /dev/null +++ b/common/fml/IWorldGenerator.java @@ -0,0 +1,7 @@ +package fml; + +import java.util.Random; + +public interface IWorldGenerator { + public void generate(Random random, int chunkX, int chunkZ, Object...additionalData); +} diff --git a/common/fml/Loader.java b/common/fml/Loader.java index 970f246984..96e04b0180 100644 --- a/common/fml/Loader.java +++ b/common/fml/Loader.java @@ -42,15 +42,15 @@ public class Loader { }; private static Loader instance; - private static Logger log = Logger.getLogger("ForgeModLoader"); + public static Logger log = Logger.getLogger("ForgeModLoader"); private static Pattern zipJar = Pattern.compile("([^\\s]+).(zip|jar)$"); private static Pattern modClass = Pattern.compile("(.*/?)(mod\\_[^\\s]+).class$"); - private static int major=Integer.parseInt("@MAJOR@"); - private static int minor=Integer.parseInt("@MINOR@"); - private static int rev =Integer.parseInt("@REV@"); - private static int build=Integer.parseInt("@BUILD@"); + private static String major="@MAJOR@"; + private static String minor="@MINOR@"; + private static String rev ="@REV@"; + private static String build="@BUILD@"; private static String mcversion="@MCVERSION@"; private State state; @@ -77,7 +77,7 @@ public class Loader { } catch (Exception e) { // Whatever - give up } - log.info(String.format("Forge Mod Loader version %d.%d.%d.%d for Minecraft %s loading",major,minor,rev,build,mcversion)); + log.info(String.format("Forge Mod Loader version %s.%s.%s.%s for Minecraft %s loading",major,minor,rev,build,mcversion)); } private void sortModList() { diff --git a/common/fml/ModContainer.java b/common/fml/ModContainer.java index dbc323b61c..c8ed9efe5b 100644 --- a/common/fml/ModContainer.java +++ b/common/fml/ModContainer.java @@ -25,4 +25,7 @@ public interface ModContainer { boolean matches(Object mod); String getSource(); Object getMod(); + boolean generatesWorld(); + IWorldGenerator getWorldGenerator(); + int lookupFuelValue(int itemId, int itemDamage); } diff --git a/common/net/minecraft/src/CommonRegistry.java b/common/net/minecraft/src/CommonRegistry.java index 842935afe6..8a3d571abb 100644 --- a/common/net/minecraft/src/CommonRegistry.java +++ b/common/net/minecraft/src/CommonRegistry.java @@ -43,15 +43,15 @@ public class CommonRegistry { } public static void registerEntityID(Class entityClass, String entityName, int id) { - EntityList.addNewMapping(entityClass, entityName, id); + EntityList.addNewEntityListMapping(entityClass, entityName, id); } public static void registerEntityID(Class entityClass, String entityName, int id, int backgroundEggColour, int foregroundEggColour) { - EntityList.addNewMapping(entityClass, entityName, id, backgroundEggColour, foregroundEggColour); + EntityList.addNewEntityListMapping(entityClass, entityName, id, backgroundEggColour, foregroundEggColour); } public static void registerTileEntity(Class tileEntityClass, String id) { - TileEntity.addTileEntityMapping(tileEntityClass, id); + TileEntity.addNewTileEntityMapping(tileEntityClass, id); } public static void addBiome(BiomeGenBase biome) { diff --git a/patches/minecraft_server/net/minecraft/server/MinecraftServer.java.patch b/patches/minecraft_server/net/minecraft/server/MinecraftServer.java.patch index 99d26e7b99..90ecb2a718 100644 --- a/patches/minecraft_server/net/minecraft/server/MinecraftServer.java.patch +++ b/patches/minecraft_server/net/minecraft/server/MinecraftServer.java.patch @@ -18,24 +18,23 @@ if (Runtime.getRuntime().maxMemory() / 1024L / 1024L < 512L) { -@@ -190,6 +194,8 @@ +@@ -190,6 +194,7 @@ logger.warning("To change this, set \"online-mode\" to \"true\" in the server.settings file."); } + FMLHandler.INSTANCE.onLoadComplete(); -+ this.configManager = new ServerConfigurationManager(this); this.entityTracker[0] = new EntityTracker(this, 0); this.entityTracker[1] = new EntityTracker(this, -1); -@@ -433,6 +439,7 @@ +@@ -430,6 +435,7 @@ + var7 = 0L; + } + ++ FMLHandler.INSTANCE.onPreTick(); var3 += var7; var1 = var5; -+ FMLHandler.INSTANCE.onPreTick(); - if (this.worldMngr[0].isAllPlayersFullyAsleep()) - { - this.doTick(); -@@ -446,6 +453,7 @@ +@@ -446,6 +452,7 @@ this.doTick(); } } diff --git a/patches/minecraft_server/net/minecraft/src/ChunkProviderServer.java.patch b/patches/minecraft_server/net/minecraft/src/ChunkProviderServer.java.patch new file mode 100644 index 0000000000..e60e832e36 --- /dev/null +++ b/patches/minecraft_server/net/minecraft/src/ChunkProviderServer.java.patch @@ -0,0 +1,19 @@ +--- src-reference/minecraft_server/net/minecraft/src/ChunkProviderServer.java 0000-00-00 00:00:00.000000000 -0000 ++++ src-work/minecraft_server/net/minecraft/src/ChunkProviderServer.java 0000-00-00 00:00:00.000000000 -0000 +@@ -7,6 +7,8 @@ + import java.util.List; + import java.util.Set; + ++import fml.obf.FMLHandler; ++ + public class ChunkProviderServer implements IChunkProvider + { + private Set droppedChunksSet = new HashSet(); +@@ -200,6 +202,7 @@ + if (this.serverChunkGenerator != null) + { + this.serverChunkGenerator.populate(par1IChunkProvider, par2, par3); ++ FMLHandler.INSTANCE.onChunkPopulate(par1IChunkProvider, par2, par3,this.world,this.serverChunkGenerator); + var4.setChunkModified(); + } + } diff --git a/patches/minecraft_server/net/minecraft/src/EntityList.java.patch b/patches/minecraft_server/net/minecraft/src/EntityList.java.patch index 54823eb816..c44c5800dc 100644 --- a/patches/minecraft_server/net/minecraft/src/EntityList.java.patch +++ b/patches/minecraft_server/net/minecraft/src/EntityList.java.patch @@ -5,11 +5,11 @@ addMapping(EntityEnderCrystal.class, "EnderCrystal", 200); } + -+ public static void addNewMapping(Class entityClass, String entityName, int id) { ++ public static void addNewEntityListMapping(Class entityClass, String entityName, int id) { + addMapping(entityClass, entityName, id); + } + -+ public static void addNewMapping(Class entityClass, String entityName, int id, int backgroundEggColour, int foregroundEggColour) { ++ public static void addNewEntityListMapping(Class entityClass, String entityName, int id, int backgroundEggColour, int foregroundEggColour) { + addMapping(entityClass, entityName, id, backgroundEggColour, foregroundEggColour); + } } diff --git a/patches/minecraft_server/net/minecraft/src/TileEntity.java.patch b/patches/minecraft_server/net/minecraft/src/TileEntity.java.patch index ccfc55416f..abefd61d13 100644 --- a/patches/minecraft_server/net/minecraft/src/TileEntity.java.patch +++ b/patches/minecraft_server/net/minecraft/src/TileEntity.java.patch @@ -5,7 +5,7 @@ addMapping(TileEntityEndPortal.class, "Airportal"); } + -+ public static void addTileEntityMapping(Class tileEntityClass, String id) { ++ public static void addNewTileEntityMapping(Class tileEntityClass, String id) { + addMapping(tileEntityClass, id); + } } diff --git a/patches/minecraft_server/net/minecraft/src/TileEntityFurnace.java.patch b/patches/minecraft_server/net/minecraft/src/TileEntityFurnace.java.patch new file mode 100644 index 0000000000..84eb760976 --- /dev/null +++ b/patches/minecraft_server/net/minecraft/src/TileEntityFurnace.java.patch @@ -0,0 +1,19 @@ +--- src-reference/minecraft_server/net/minecraft/src/TileEntityFurnace.java 0000-00-00 00:00:00.000000000 -0000 ++++ src-work/minecraft_server/net/minecraft/src/TileEntityFurnace.java 0000-00-00 00:00:00.000000000 -0000 +@@ -1,5 +1,7 @@ + package net.minecraft.src; + ++import fml.obf.FMLHandler; ++ + public class TileEntityFurnace extends TileEntity implements IInventory + { + /** +@@ -294,7 +296,7 @@ + else + { + int var2 = par1ItemStack.getItem().shiftedIndex; +- return var2 < 256 && Block.blocksList[var2].blockMaterial == Material.wood ? 300 : (var2 == Item.stick.shiftedIndex ? 100 : (var2 == Item.coal.shiftedIndex ? 1600 : (var2 == Item.bucketLava.shiftedIndex ? 20000 : (var2 == Block.sapling.blockID ? 100 : (var2 == Item.blazeRod.shiftedIndex ? 2400 : 0))))); ++ return var2 < 256 && Block.blocksList[var2].blockMaterial == Material.wood ? 300 : (var2 == Item.stick.shiftedIndex ? 100 : (var2 == Item.coal.shiftedIndex ? 1600 : (var2 == Item.bucketLava.shiftedIndex ? 20000 : (var2 == Block.sapling.blockID ? 100 : (var2 == Item.blazeRod.shiftedIndex ? 2400 : FMLHandler.INSTANCE.fuelLookup(var2,par1ItemStack.getItemDamage())))))); + } + } + diff --git a/server/fml/ml/ModLoaderModContainer.java b/server/fml/ml/ModLoaderModContainer.java index 3849aeb338..1a937c3cad 100644 --- a/server/fml/ml/ModLoaderModContainer.java +++ b/server/fml/ml/ModLoaderModContainer.java @@ -16,6 +16,7 @@ package fml.ml; import java.util.ArrayList; import java.util.List; +import fml.IWorldGenerator; import fml.Loader; import fml.LoaderException; import fml.ModContainer; @@ -112,4 +113,19 @@ public class ModLoaderModContainer implements ModContainer { public Object getMod() { return mod; } + + @Override + public boolean generatesWorld() { + return true; + } + + @Override + public IWorldGenerator getWorldGenerator() { + return mod; + } + + @Override + public int lookupFuelValue(int itemId, int itemDamage) { + return mod.addFuel(itemId, itemDamage); + } } diff --git a/server/fml/obf/FMLHandler.java b/server/fml/obf/FMLHandler.java index 46b462e150..2ddaab255f 100644 --- a/server/fml/obf/FMLHandler.java +++ b/server/fml/obf/FMLHandler.java @@ -13,11 +13,16 @@ */ package fml.obf; +import java.util.Random; import java.util.logging.Logger; import fml.FMLHooks; import fml.Loader; +import fml.ModContainer; import net.minecraft.server.MinecraftServer; +import net.minecraft.src.BaseMod; +import net.minecraft.src.IChunkProvider; +import net.minecraft.src.World; public enum FMLHandler { INSTANCE; @@ -47,4 +52,26 @@ public enum FMLHandler { public static Logger getMinecraftLogger() { return MinecraftServer.logger; } + + 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); + } + } + } + + 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; + } } diff --git a/server/net/minecraft/src/BaseMod.java b/server/net/minecraft/src/BaseMod.java index 2689c70ef8..fb8d06abbe 100644 --- a/server/net/minecraft/src/BaseMod.java +++ b/server/net/minecraft/src/BaseMod.java @@ -14,7 +14,9 @@ package net.minecraft.src; import java.util.Random; +import fml.IWorldGenerator; import fml.Mod; +import fml.obf.FMLHandler; import net.minecraft.server.MinecraftServer; import net.minecraft.src.EntityPlayer; @@ -23,8 +25,8 @@ import net.minecraft.src.ItemStack; import net.minecraft.src.Packet250CustomPayload; import net.minecraft.src.World; -public abstract class BaseMod { - int addFuel(int id, int metadata) { +public abstract class BaseMod implements IWorldGenerator { + public int addFuel(int id, int metadata) { return 0; } @@ -32,6 +34,18 @@ public abstract class BaseMod { return false; } + @Override + public void generate(Random random, int chunkX, int chunkZ, Object... additionalData) { + World w=(World) additionalData[0]; + IChunkProvider cp=(IChunkProvider) additionalData[1]; + + if (cp instanceof ChunkProviderGenerate) { + generateSurface(w, random, chunkX<<4, chunkZ<<4); + } else if (cp instanceof ChunkProviderHell){ + generateNether(w, random, chunkX<<4, chunkZ<<4); + } + } + public void generateNether(World world, Random random, int chunkX, int chunkZ) { } @@ -84,4 +98,9 @@ public abstract class BaseMod { // 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); + + @Override + public String toString() { + return getName()+" "+getVersion(); + } } diff --git a/server/net/minecraft/src/ModLoader.java b/server/net/minecraft/src/ModLoader.java index 618ae9b70c..2fdd3cc958 100644 --- a/server/net/minecraft/src/ModLoader.java +++ b/server/net/minecraft/src/ModLoader.java @@ -1,6 +1,5 @@ /* - * The FML Forge Mod Loader suite. - * Copyright (C) 2012 cpw + * 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. @@ -37,75 +36,75 @@ import net.minecraft.src.TileEntity; import net.minecraft.src.World; public class ModLoader { - static void addAchievementDesc(Achievement achievement, String name, String description) { + public static void addAchievementDesc(Achievement achievement, String name, String description) { } - static int addAllFuel(int id, int metadata) { + public static int addAllFuel(int id, int metadata) { return 0; } - static int addArmor(String armor) { + public static int addArmor(String armor) { return 0; } - static void addBiome(BiomeGenBase biome) { + public static void addBiome(BiomeGenBase biome) { } - static void addLocalization(String key, String value) { + public static void addLocalization(String key, String value) { } - static void addLocalization(String key, String lang, String value) { + public static void addLocalization(String key, String lang, String value) { } - static void addName(Object instance, String name) { + public static void addName(Object instance, String name) { } - static void addName(Object instance, String lang, String name) { + public static void addName(Object instance, String lang, String name) { } - static int addOverride(String fileToOverride, String fileToAdd) { + public static int addOverride(String fileToOverride, String fileToAdd) { return 0; } - static void addOverride(String path, String overlayPath, int index) { + public static void addOverride(String path, String overlayPath, int index) { } - static void addRecipe(ItemStack output, Object... params) { + public static void addRecipe(ItemStack output, Object... params) { CraftingManager.getInstance().addRecipe(output, params); } - static void addShapelessRecipe(ItemStack output, Object... params) { + public static void addShapelessRecipe(ItemStack output, Object... params) { CraftingManager.getInstance().addShapelessRecipe(output, params); } - static void addSmelting(int input, ItemStack output) { + public static void addSmelting(int input, ItemStack output) { FurnaceRecipes.smelting().addSmelting(input, output); } - static void addSpawn(Class entityClass, int weightedProb, int min, int max, EnumCreatureType spawnList) { + public static void addSpawn(Class entityClass, int weightedProb, int min, int max, EnumCreatureType spawnList) { CommonRegistry.addSpawn(entityClass, weightedProb, min, max, spawnList); } - static void addSpawn(Class entityClass, int weightedProb, int min, int max, EnumCreatureType spawnList, BiomeGenBase... biomes) { + public static void addSpawn(Class entityClass, int weightedProb, int min, int max, EnumCreatureType spawnList, BiomeGenBase... biomes) { CommonRegistry.addSpawn(entityClass, weightedProb, min, max, spawnList, biomes); } - static void addSpawn(String entityName, int weightedProb, int min, int max, EnumCreatureType spawnList) { + public static void addSpawn(String entityName, int weightedProb, int min, int max, EnumCreatureType spawnList) { CommonRegistry.addSpawn(entityName, weightedProb, min, max, spawnList); } - static void addSpawn(String entityName, int weightedProb, int min, int max, EnumCreatureType spawnList, BiomeGenBase... biomes) { + public static void addSpawn(String entityName, int weightedProb, int min, int max, EnumCreatureType spawnList, BiomeGenBase... biomes) { CommonRegistry.addSpawn(entityName, weightedProb, min, max, spawnList, biomes); } - static boolean dispenseEntity(World world, double x, double y, double z, int xVel, int zVel, ItemStack item) { + public static boolean dispenseEntity(World world, double x, double y, double z, int xVel, int zVel, ItemStack item) { return false; } - static void genericContainerRemoval(World world, int x, int y, int z) { + public static void genericContainerRemoval(World world, int x, int y, int z) { } - static List getLoadedMods() { + public static List getLoadedMods() { return ModLoaderModContainer.findAll(); } @@ -113,99 +112,102 @@ public class ModLoader { return FMLHandler.getMinecraftLogger(); } - static T getPrivateValue(Class instanceclass, E instance, int fieldindex) { + public static T getPrivateValue(Class instanceclass, E instance, int fieldindex) { return null; } - static T getPrivateValue(Class instanceclass, E instance, String field) { + public static T getPrivateValue(Class instanceclass, E instance, String field) { return null; } - static int getUniqueEntityId() { + public static int getUniqueEntityId() { return 0; } - static boolean isModLoaded(String modname) { + public static boolean isModLoaded(String modname) { return Loader.isModLoaded(modname); } - static void receivePacket(Packet250CustomPayload packet) { + public static void receivePacket(Packet250CustomPayload packet) { } - static void registerBlock(Block block) { + public static void registerBlock(Block block) { CommonRegistry.registerBlock(block); } - static void registerBlock(Block block, Class itemclass) { + public static void registerBlock(Block block, Class itemclass) { CommonRegistry.registerBlock(block, itemclass); } - static void registerEntityID(Class entityClass, String entityName, int id) { + public static void registerEntityID(Class entityClass, String entityName, int id) { CommonRegistry.registerEntityID(entityClass, entityName, id); } - static void registerEntityID(Class entityClass, String entityName, int id, int background, int foreground) { + public static void registerEntityID(Class entityClass, String entityName, int id, int background, int foreground) { CommonRegistry.registerEntityID(entityClass, entityName, id, background, foreground); } - static void registerPacketChannel(BaseMod mod, String channel) { + public static void registerPacketChannel(BaseMod mod, String channel) { } - static void registerTileEntity(Class tileEntityClass, String id) { + public static void registerTileEntity(Class tileEntityClass, String id) { CommonRegistry.registerTileEntity(tileEntityClass, id); } - static void removeBiome(BiomeGenBase biome) { + public static void removeBiome(BiomeGenBase biome) { CommonRegistry.removeBiome(biome); } - static void removeSpawn(Class entityClass, EnumCreatureType spawnList) { + public static void removeSpawn(Class entityClass, EnumCreatureType spawnList) { CommonRegistry.removeSpawn(entityClass, spawnList); } - static void removeSpawn(Class entityClass, EnumCreatureType spawnList, BiomeGenBase... biomes) { + public static void removeSpawn(Class entityClass, EnumCreatureType spawnList, BiomeGenBase... biomes) { CommonRegistry.removeSpawn(entityClass, spawnList, biomes); } - static void removeSpawn(String entityName, EnumCreatureType spawnList) { + public static void removeSpawn(String entityName, EnumCreatureType spawnList) { CommonRegistry.removeSpawn(entityName, spawnList); } - static void removeSpawn(String entityName, EnumCreatureType spawnList, BiomeGenBase... biomes) { + public static void removeSpawn(String entityName, EnumCreatureType spawnList, BiomeGenBase... biomes) { CommonRegistry.removeSpawn(entityName, spawnList, biomes); } - static void saveConfig() { + public static void saveConfig() { } - static void serverChat(String text) { + 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) + * @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) */ - static void setInGameHook(BaseMod mod, boolean enable, boolean useClock) { - ModLoaderModContainer mlmc=(ModLoaderModContainer) ModLoaderModContainer.findContainerFor(mod); + public static void setInGameHook(BaseMod mod, boolean enable, boolean useClock) { + ModLoaderModContainer mlmc = (ModLoaderModContainer) ModLoaderModContainer.findContainerFor(mod); mlmc.setTicking(enable); } - static void setPrivateValue(Class instanceclass, T instance, int fieldindex, E value) { + public static void setPrivateValue(Class instanceclass, T instance, int fieldindex, E value) { } - static void setPrivateValue(Class instanceclass, T instance, String field, E value) { + public static void setPrivateValue(Class instanceclass, T instance, String field, E value) { } - static void takenFromCrafting(EntityPlayer player, ItemStack item, IInventory matrix) { + public static void takenFromCrafting(EntityPlayer player, ItemStack item, IInventory matrix) { } - static void takenFromFurnace(EntityPlayer player, ItemStack item) { + public static void takenFromFurnace(EntityPlayer player, ItemStack item) { } - static void throwException(String message, Throwable e) { + public static void throwException(String message, Throwable e) { } public static MinecraftServer getMinecraftServerInstance() {