Forge support

This commit is contained in:
Christian Weeks 2012-04-01 02:14:14 -04:00
parent a8351a0e84
commit 8e1f51d792
15 changed files with 202 additions and 73 deletions

View File

@ -2,8 +2,8 @@
<classpath>
<classpathentry kind="src" path="common"/>
<classpathentry kind="src" path="server"/>
<classpathentry kind="src" path="test"/>
<classpathentry kind="src" path="minecraft_server"/>
<classpathentry kind="src" path="test"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
<classpathentry kind="output" path="bin"/>

View File

@ -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;
}
}

View File

@ -0,0 +1,7 @@
package fml;
import java.util.Random;
public interface IWorldGenerator {
public void generate(Random random, int chunkX, int chunkZ, Object...additionalData);
}

View File

@ -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() {

View File

@ -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);
}

View File

@ -43,15 +43,15 @@ public class CommonRegistry {
}
public static void registerEntityID(Class<? extends Entity> entityClass, String entityName, int id) {
EntityList.addNewMapping(entityClass, entityName, id);
EntityList.addNewEntityListMapping(entityClass, entityName, id);
}
public static void registerEntityID(Class<? extends Entity> 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<? extends TileEntity> tileEntityClass, String id) {
TileEntity.addTileEntityMapping(tileEntityClass, id);
TileEntity.addNewTileEntityMapping(tileEntityClass, id);
}
public static void addBiome(BiomeGenBase biome) {

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -5,11 +5,11 @@
addMapping(EntityEnderCrystal.class, "EnderCrystal", 200);
}
+
+ public static void addNewMapping(Class<? extends Entity> entityClass, String entityName, int id) {
+ public static void addNewEntityListMapping(Class<? extends Entity> entityClass, String entityName, int id) {
+ addMapping(entityClass, entityName, id);
+ }
+
+ public static void addNewMapping(Class<? extends Entity> entityClass, String entityName, int id, int backgroundEggColour, int foregroundEggColour) {
+ public static void addNewEntityListMapping(Class<? extends Entity> entityClass, String entityName, int id, int backgroundEggColour, int foregroundEggColour) {
+ addMapping(entityClass, entityName, id, backgroundEggColour, foregroundEggColour);
+ }
}

View File

@ -5,7 +5,7 @@
addMapping(TileEntityEndPortal.class, "Airportal");
}
+
+ public static void addTileEntityMapping(Class<? extends TileEntity> tileEntityClass, String id) {
+ public static void addNewTileEntityMapping(Class<? extends TileEntity> tileEntityClass, String id) {
+ addMapping(tileEntityClass, id);
+ }
}

View File

@ -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()))))));
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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();
}
}

View File

@ -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<? extends EntityLiving> entityClass, int weightedProb, int min, int max, EnumCreatureType spawnList) {
public static void addSpawn(Class<? extends EntityLiving> entityClass, int weightedProb, int min, int max, EnumCreatureType spawnList) {
CommonRegistry.addSpawn(entityClass, weightedProb, min, max, spawnList);
}
static void addSpawn(Class<? extends EntityLiving> entityClass, int weightedProb, int min, int max, EnumCreatureType spawnList, BiomeGenBase... biomes) {
public static void addSpawn(Class<? extends EntityLiving> 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<BaseMod> getLoadedMods() {
public static List<BaseMod> getLoadedMods() {
return ModLoaderModContainer.findAll();
}
@ -113,99 +112,102 @@ public class ModLoader {
return FMLHandler.getMinecraftLogger();
}
static <T, E> T getPrivateValue(Class<? super E> instanceclass, E instance, int fieldindex) {
public static <T, E> T getPrivateValue(Class<? super E> instanceclass, E instance, int fieldindex) {
return null;
}
static <T, E> T getPrivateValue(Class<? super E> instanceclass, E instance, String field) {
public static <T, E> T getPrivateValue(Class<? super E> 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<? extends ItemBlock> itemclass) {
public static void registerBlock(Block block, Class<? extends ItemBlock> itemclass) {
CommonRegistry.registerBlock(block, itemclass);
}
static void registerEntityID(Class<? extends Entity> entityClass, String entityName, int id) {
public static void registerEntityID(Class<? extends Entity> entityClass, String entityName, int id) {
CommonRegistry.registerEntityID(entityClass, entityName, id);
}
static void registerEntityID(Class<? extends Entity> entityClass, String entityName, int id, int background, int foreground) {
public static void registerEntityID(Class<? extends Entity> 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<? extends TileEntity> tileEntityClass, String id) {
public static void registerTileEntity(Class<? extends TileEntity> 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<? extends EntityLiving> entityClass, EnumCreatureType spawnList) {
public static void removeSpawn(Class<? extends EntityLiving> entityClass, EnumCreatureType spawnList) {
CommonRegistry.removeSpawn(entityClass, spawnList);
}
static void removeSpawn(Class<? extends EntityLiving> entityClass, EnumCreatureType spawnList, BiomeGenBase... biomes) {
public static void removeSpawn(Class<? extends EntityLiving> 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 <T, E> void setPrivateValue(Class<? super T> instanceclass, T instance, int fieldindex, E value) {
public static <T, E> void setPrivateValue(Class<? super T> instanceclass, T instance, int fieldindex, E value) {
}
static <T, E> void setPrivateValue(Class<? super T> instanceclass, T instance, String field, E value) {
public static <T, E> void setPrivateValue(Class<? super T> 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() {