Merge branch 'master' into snapshot15

Conflicts:
	fml-src-1.4.7-4.7.22.539-master.zip
	fml-src-1.4.7-4.7.35.556-master.zip
	fml-src-13w02b-4.99.16.541-snapshot15.zip
This commit is contained in:
Christian 2013-02-27 23:19:11 -05:00
commit 082ee1a5ea
36 changed files with 672 additions and 89 deletions

View file

@ -1,2 +0,0 @@
#!/bin/bash
python build.py "$@"

View file

@ -24,6 +24,7 @@ import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.RenderEngine; import net.minecraft.client.renderer.RenderEngine;
import net.minecraft.client.renderer.RenderGlobal; import net.minecraft.client.renderer.RenderGlobal;
import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraftforge.client.event.DrawBlockHighlightEvent; import net.minecraftforge.client.event.DrawBlockHighlightEvent;
import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.client.event.RenderWorldLastEvent;
import net.minecraftforge.client.event.TextureLoadEvent; import net.minecraftforge.client.event.TextureLoadEvent;
@ -234,6 +235,13 @@ public class ForgeHooksClient
int renderType = Block.blocksList[item.itemID].getRenderType(); int renderType = Block.blocksList[item.itemID].getRenderType();
float scale = (renderType == 1 || renderType == 19 || renderType == 12 || renderType == 2 ? 0.5F : 0.25F); float scale = (renderType == 1 || renderType == 19 || renderType == 12 || renderType == 2 ? 0.5F : 0.25F);
if (RenderItem.field_82407_g)
{
GL11.glScalef(1.25F, 1.25F, 1.25F);
GL11.glTranslatef(0.0F, 0.05F, 0.0F);
GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F);
}
GL11.glScalef(scale, scale, scale); GL11.glScalef(scale, scale, scale);
int size = item.stackSize; int size = item.stackSize;
@ -397,4 +405,9 @@ public class ForgeHooksClient
} }
} }
} }
public static void setRenderPass(int pass)
{
renderPass = pass;
}
} }

View file

@ -440,6 +440,7 @@ public class Configuration
} }
BufferedReader buffer = null; BufferedReader buffer = null;
UnicodeInputStreamReader input = null;
try try
{ {
if (file.getParentFile() != null) if (file.getParentFile() != null)
@ -454,7 +455,7 @@ public class Configuration
if (file.canRead()) if (file.canRead())
{ {
UnicodeInputStreamReader input = new UnicodeInputStreamReader(new FileInputStream(file), defaultEncoding); input = new UnicodeInputStreamReader(new FileInputStream(file), defaultEncoding);
defaultEncoding = input.getEncoding(); defaultEncoding = input.getEncoding();
buffer = new BufferedReader(input); buffer = new BufferedReader(input);
@ -638,6 +639,13 @@ public class Configuration
buffer.close(); buffer.close();
} catch (IOException e){} } catch (IOException e){}
} }
if (input != null)
{
try
{
input.close();
} catch (IOException e){}
}
} }
} }
@ -666,8 +674,7 @@ public class Configuration
FileOutputStream fos = new FileOutputStream(file); FileOutputStream fos = new FileOutputStream(file);
BufferedWriter buffer = new BufferedWriter(new OutputStreamWriter(fos, defaultEncoding)); BufferedWriter buffer = new BufferedWriter(new OutputStreamWriter(fos, defaultEncoding));
buffer.write("# Configuration file" + NEW_LINE); buffer.write("# Configuration file" + NEW_LINE + NEW_LINE);
buffer.write("# Generated on " + DateFormat.getInstance().format(new Date()) + NEW_LINE + NEW_LINE);
if (children.isEmpty()) if (children.isEmpty())
{ {

View file

@ -2,16 +2,25 @@ package net.minecraftforge.common;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.BitSet; import java.util.BitSet;
import java.util.HashSet;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.List;
import java.util.ListIterator;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ConcurrentMap;
import java.util.logging.Level; import java.util.logging.Level;
import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableListMultimap; import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ListMultimap; import com.google.common.collect.ListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.MapMaker;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.FMLLog;
@ -40,9 +49,10 @@ public class DimensionManager
private static Hashtable<Integer, WorldServer> worlds = new Hashtable<Integer, WorldServer>(); private static Hashtable<Integer, WorldServer> worlds = new Hashtable<Integer, WorldServer>();
private static boolean hasInit = false; private static boolean hasInit = false;
private static Hashtable<Integer, Integer> dimensions = new Hashtable<Integer, Integer>(); private static Hashtable<Integer, Integer> dimensions = new Hashtable<Integer, Integer>();
private static Map<World, ListMultimap<ChunkCoordIntPair, String>> persistentChunkStore = Maps.newHashMap(); //FIXME: Unused?
private static ArrayList<Integer> unloadQueue = new ArrayList<Integer>(); private static ArrayList<Integer> unloadQueue = new ArrayList<Integer>();
private static BitSet dimensionMap = new BitSet(Long.SIZE << 4); private static BitSet dimensionMap = new BitSet(Long.SIZE << 4);
private static ConcurrentMap<World, World> weakWorldMap = new MapMaker().weakKeys().weakValues().<World,World>makeMap();
private static Set<Integer> leakedWorlds = Sets.newHashSet();
public static boolean registerProviderType(int id, Class<? extends WorldProvider> provider, boolean keepLoaded) public static boolean registerProviderType(int id, Class<? extends WorldProvider> provider, boolean keepLoaded)
{ {
@ -55,6 +65,38 @@ public class DimensionManager
return true; return true;
} }
/**
* Unregisters a Provider type, and returns a array of all dimensions that are
* registered to this provider type.
* If the return size is greater then 0, it is required that the caller either
* change those dimensions's registered type, or replace this type before the
* world is attempted to load, else the loader will throw an exception.
*
* @param id The provider type ID to unreigster
* @return An array containing all dimension IDs still registered to this provider type.
*/
public static int[] unregisterProviderType(int id)
{
if (!providers.containsKey(id))
{
return new int[0];
}
providers.remove(id);
spawnSettings.remove(id);
int[] ret = new int[dimensions.size()];
int x = 0;
for (Map.Entry<Integer, Integer> ent : dimensions.entrySet())
{
if (ent.getValue() == id)
{
ret[x++] = ent.getKey();
}
}
return Arrays.copyOf(ret, x);
}
public static void init() public static void init()
{ {
if (hasInit) if (hasInit)
@ -115,6 +157,34 @@ public class DimensionManager
return getWorld(dim).provider; return getWorld(dim).provider;
} }
public static Integer[] getIDs(boolean check)
{
if (check)
{
List<World> allWorlds = Lists.newArrayList(weakWorldMap.keySet());
allWorlds.removeAll(worlds.values());
Set<Integer> newLeaks = Sets.newHashSet();
for (ListIterator<World> li = allWorlds.listIterator(); li.hasNext(); )
{
World w = li.next();
if (leakedWorlds.contains(System.identityHashCode(w)))
{
li.remove();
}
newLeaks.add(System.identityHashCode(w));
}
leakedWorlds = newLeaks;
if (allWorlds.size() > 0)
{
FMLLog.severe("Detected leaking worlds in memory. There are %d worlds that appear to be persisting. A mod is likely caching the world incorrectly\n", allWorlds.size() + leakedWorlds.size());
for (World w : allWorlds)
{
FMLLog.severe("The world %x (%s) has leaked.\n", System.identityHashCode(w), w.getWorldInfo().getWorldName());
}
}
}
return getIDs();
}
public static Integer[] getIDs() public static Integer[] getIDs()
{ {
return worlds.keySet().toArray(new Integer[worlds.size()]); //Only loaded dims, since usually used to cycle through loaded worlds return worlds.keySet().toArray(new Integer[worlds.size()]); //Only loaded dims, since usually used to cycle through loaded worlds
@ -124,6 +194,7 @@ public class DimensionManager
{ {
if (world != null) { if (world != null) {
worlds.put(id, world); worlds.put(id, world);
weakWorldMap.put(world, world);
MinecraftServer.getServer().worldTickTimes.put(id, new long[100]); MinecraftServer.getServer().worldTickTimes.put(id, new long[100]);
FMLLog.info("Loading dimension %d (%s) (%s)", id, world.getWorldInfo().getWorldName(), world.getMinecraftServer()); FMLLog.info("Loading dimension %d (%s) (%s)", id, world.getWorldInfo().getWorldName(), world.getMinecraftServer());
} else { } else {

View file

@ -3,6 +3,9 @@ package net.minecraftforge.common;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Random; import java.util.Random;
import cpw.mods.fml.common.FMLLog;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.WeightedRandom; import net.minecraft.util.WeightedRandom;
@ -154,6 +157,12 @@ public class DungeonHooks
return ret; return ret;
} }
@Override
protected final ItemStack[] generateChestContent(Random random, IInventory newInventory)
{
FMLLog.warning("Some mod is still using DungeonHooks.DungonLoot, tell them to stop! %s", this);
return new ItemStack[] { generateStack(random) };
}
public boolean equals(ItemStack item, int min, int max) public boolean equals(ItemStack item, int min, int max)
{ {
int minCount = theMinimumChanceToGenerateItem; int minCount = theMinimumChanceToGenerateItem;

View file

@ -653,10 +653,13 @@ public class ForgeChunkManager
int allowedCount = ticketConstraints.containsKey(modId) ? ticketConstraints.get(modId) : defaultMaxCount; int allowedCount = ticketConstraints.containsKey(modId) ? ticketConstraints.get(modId) : defaultMaxCount;
if (tickets.get(world).get(modId).size() >= allowedCount && !warnedMods.contains(modId)) if (tickets.get(world).get(modId).size() >= allowedCount)
{
if (!warnedMods.contains(modId))
{ {
FMLLog.info("The mod %s has attempted to allocate a chunkloading ticket beyond it's currently allocated maximum : %d", modId, allowedCount); FMLLog.info("The mod %s has attempted to allocate a chunkloading ticket beyond it's currently allocated maximum : %d", modId, allowedCount);
warnedMods.add(modId); warnedMods.add(modId);
}
return null; return null;
} }
Ticket ticket = new Ticket(modId, type, world); Ticket ticket = new Ticket(modId, type, world);
@ -933,7 +936,7 @@ public class ForgeChunkManager
Property dormantChunkCacheSizeProperty = config.get("defaults", "dormantChunkCacheSize", 0); Property dormantChunkCacheSizeProperty = config.get("defaults", "dormantChunkCacheSize", 0);
dormantChunkCacheSizeProperty.comment = "Unloaded chunks can first be kept in a dormant cache for quicker\n" + dormantChunkCacheSizeProperty.comment = "Unloaded chunks can first be kept in a dormant cache for quicker\n" +
"loading times. Specify the size of that cache here"; "loading times. Specify the size (in chunks) of that cache here";
dormantChunkCacheSize = dormantChunkCacheSizeProperty.getInt(0); dormantChunkCacheSize = dormantChunkCacheSizeProperty.getInt(0);
FMLLog.info("Configured a dormant chunk cache size of %d", dormantChunkCacheSizeProperty.getInt(0)); FMLLog.info("Configured a dormant chunk cache size of %d", dormantChunkCacheSizeProperty.getInt(0));

View file

@ -25,7 +25,7 @@ import static net.minecraftforge.common.ForgeVersion.*;
public class ForgeDummyContainer extends DummyModContainer implements WorldAccessContainer public class ForgeDummyContainer extends DummyModContainer implements WorldAccessContainer
{ {
public static int clumpingThreshold; public static int clumpingThreshold = 64;
public ForgeDummyContainer() public ForgeDummyContainer()
{ {

View file

@ -35,7 +35,6 @@ public class MinecraftForge
public static final EventBus ORE_GEN_BUS = new EventBus(); public static final EventBus ORE_GEN_BUS = new EventBus();
@Deprecated //Vanilla feature now @Deprecated //Vanilla feature now
public static boolean SPAWNER_ALLOW_ON_INVERTED = false; public static boolean SPAWNER_ALLOW_ON_INVERTED = false;
public static final int clumpingThreshold = ForgeDummyContainer.clumpingThreshold;
private static final ForgeInternalHandler INTERNAL_HANDLER = new ForgeInternalHandler(); private static final ForgeInternalHandler INTERNAL_HANDLER = new ForgeInternalHandler();

View file

@ -3,7 +3,8 @@ package net.minecraftforge.event;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayerMP;
@Cancelable @Cancelable
public class ServerChatEvent extends Event { public class ServerChatEvent extends Event
{
public final String message, username; public final String message, username;
public final EntityPlayerMP player; public final EntityPlayerMP player;
public String line; public String line;
@ -13,6 +14,6 @@ public class ServerChatEvent extends Event {
this.message = message; this.message = message;
this.player = player; this.player = player;
this.username = player.username; this.username = player.username;
this.line = "<" + username + "> " + message; this.line = line;
} }
} }

View file

@ -3,10 +3,9 @@ package net.minecraftforge.liquids;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import net.minecraft.item.ItemStack; import net.minecraft.block.Block;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.Event; import net.minecraftforge.event.Event;
import net.minecraftforge.oredict.OreDictionary.OreRegisterEvent;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
@ -87,4 +86,10 @@ public abstract class LiquidDictionary
this.Liquid = liquid.copy(); this.Liquid = liquid.copy();
} }
} }
static
{
getOrCreateLiquid("Water", new LiquidStack(Block.waterStill, LiquidContainerRegistry.BUCKET_VOLUME));
getOrCreateLiquid("Lava", new LiquidStack(Block.lavaStill, LiquidContainerRegistry.BUCKET_VOLUME));
}
} }

View file

@ -75,7 +75,17 @@ public class LiquidStack
*/ */
public boolean isLiquidEqual(ItemStack other) public boolean isLiquidEqual(ItemStack other)
{ {
return other != null && itemID == other.itemID && itemMeta == other.getItemDamage(); if (other == null)
{
return false;
}
if (itemID == other.itemID && itemMeta == other.getItemDamage())
{
return true;
}
return isLiquidEqual(LiquidContainerRegistry.getLiquidForFilledItem(other));
} }
/** /**

View file

@ -185,14 +185,18 @@ public class OreDictionary
public static int getOreID(ItemStack itemStack) public static int getOreID(ItemStack itemStack)
{ {
if (itemStack == null) if (itemStack == null)
return -1;
for(int oreID : oreStacks.keySet())
{ {
for(ItemStack target : oreStacks.get(oreID)) return -1;
}
for(Entry<Integer, ArrayList<ItemStack>> ore : oreStacks.entrySet())
{
for(ItemStack target : ore.getValue())
{ {
if(itemStack.itemID == target.itemID && (target.getItemDamage() == -1 || itemStack.getItemDamage() == target.getItemDamage())) if(itemStack.itemID == target.itemID && (target.getItemDamage() == -1 || itemStack.getItemDamage() == target.getItemDamage()))
return oreID; {
return ore.getKey();
}
} }
} }
return -1; // didn't find it. return -1; // didn't find it.

View file

@ -251,4 +251,14 @@ public class ShapedOreRecipe implements IRecipe
mirrored = mirror; mirrored = mirror;
return this; return this;
} }
/**
* Returns the input for this recipe, any mod accessing this value should never
* manipulate the values in this array as it will effect the recipe itself.
* @return The recipes input vales.
*/
public Object[] getInput()
{
return this.input;
}
} }

View file

@ -139,4 +139,14 @@ public class ShapelessOreRecipe implements IRecipe
{ {
return (target.itemID == input.itemID && (target.getItemDamage() == -1 || target.getItemDamage() == input.getItemDamage())); return (target.itemID == input.itemID && (target.getItemDamage() == -1 || target.getItemDamage() == input.getItemDamage()));
} }
/**
* Returns the input for this recipe, any mod accessing this value should never
* manipulate the values in this array as it will effect the recipe itself.
* @return The recipes input vales.
*/
public ArrayList getInput()
{
return this.input;
}
} }

View file

@ -22,7 +22,7 @@ public class EventTransformer implements IClassTransformer
@Override @Override
public byte[] transform(String name, byte[] bytes) public byte[] transform(String name, byte[] bytes)
{ {
if (name.equals("net.minecraftforge.event.Event") || name.startsWith("net.minecraft.") || name.indexOf('.') == -1) if (bytes == null || name.equals("net.minecraftforge.event.Event") || name.startsWith("net.minecraft.") || name.indexOf('.') == -1)
{ {
return bytes; return bytes;
} }

View file

@ -150,7 +150,22 @@
{ {
ItemStack itemstack = this.createStackedBlock(par6); ItemStack itemstack = this.createStackedBlock(par6);
@@ -1398,4 +1418,846 @@ @@ -1097,12 +1117,13 @@
}
}
+ private int silk_check_meta = -1; //Dirty hack to stop us from needing to special case the silk check hook.
/**
* Return true if a player with Silk Touch can harvest this block directly, and not its normal drops.
*/
protected boolean canSilkHarvest()
{
- return this.renderAsNormalBlock() && !this.isBlockContainer;
+ return this.renderAsNormalBlock() && !this.hasTileEntity(silk_check_meta);
}
/**
@@ -1398,4 +1419,870 @@
canBlockGrass[0] = true; canBlockGrass[0] = true;
StatList.initBreakableStats(); StatList.initBreakableStats();
} }
@ -484,7 +499,7 @@
+ int count = quantityDropped(metadata, fortune, world.rand); + int count = quantityDropped(metadata, fortune, world.rand);
+ for(int i = 0; i < count; i++) + for(int i = 0; i < count; i++)
+ { + {
+ int id = idDropped(metadata, world.rand, 0); + int id = idDropped(metadata, world.rand, fortune);
+ if (id > 0) + if (id > 0)
+ { + {
+ ret.add(new ItemStack(id, 1, damageDropped(metadata))); + ret.add(new ItemStack(id, 1, damageDropped(metadata)));
@ -506,11 +521,10 @@
+ */ + */
+ public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata) + public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata)
+ { + {
+ if (this instanceof BlockGlass || this instanceof BlockEnderChest) + silk_check_meta = metadata;
+ { + boolean ret = this.canSilkHarvest();
+ return true; + silk_check_meta = 0;
+ } + return ret;
+ return renderAsNormalBlock() && !hasTileEntity(metadata);
+ } + }
+ +
+ /** + /**
@ -926,6 +940,31 @@
+ } + }
+ +
+ /** + /**
+ * Called when a plant grows on this block, only implemented for saplings using the WorldGen*Trees classes right now.
+ * Modder may implement this for custom plants.
+ * This does not use ForgeDirection, because large/huge trees can be located in non-representable direction,
+ * so the source location is specified.
+ * Currently this just changes the block to dirt if it was grass.
+ *
+ * Note: This happens DURING the generation, the generation may not be complete when this is called.
+ *
+ * @param world Current world
+ * @param x Soil X
+ * @param y Soil Y
+ * @param z Soil Z
+ * @param sourceX Plant growth location X
+ * @param sourceY Plant growth location Y
+ * @param sourceZ Plant growth location Z
+ */
+ public void onPlantGrow(World world, int x, int y, int z, int sourceX, int sourceY, int sourceZ)
+ {
+ if (blockID == grass.blockID)
+ {
+ world.func_94575_c(x, y, z, dirt.blockID);
+ }
+ }
+
+ /**
+ * Checks if this soil is fertile, typically this means that growth rates + * Checks if this soil is fertile, typically this means that growth rates
+ * of plants on this soil will be slightly sped up. + * of plants on this soil will be slightly sped up.
+ * Only vanilla case is tilledField when it is within range of water. + * Only vanilla case is tilledField when it is within range of water.

View file

@ -0,0 +1,25 @@
--- ../src_base/minecraft/net/minecraft/client/renderer/OpenGlHelper.java
+++ ../src_work/minecraft/net/minecraft/client/renderer/OpenGlHelper.java
@@ -25,6 +25,10 @@
* True if the renderer supports multitextures and the OpenGL version != 1.3
*/
private static boolean useMultitextureARB = false;
+
+ /* Stores the last values sent into setLightmapTextureCoords */
+ public static float lastBrightnessX = 0.0f;
+ public static float lastBrightnessY = 0.0f;
/**
* Initializes the texture constants to be used when rendering lightmap values
@@ -88,5 +92,11 @@
{
GL13.glMultiTexCoord2f(par0, par1, par2);
}
+
+ if (par0 == lightmapTexUnit)
+ {
+ lastBrightnessX = par1;
+ lastBrightnessY = par2;
+ }
}
}

View file

@ -0,0 +1,26 @@
--- ../src_base/minecraft/net/minecraft/client/renderer/tileentity/TileEntityChestRenderer.java
+++ ../src_work/minecraft/net/minecraft/client/renderer/tileentity/TileEntityChestRenderer.java
@@ -1,5 +1,6 @@
package net.minecraft.client.renderer.tileentity;
+import cpw.mods.fml.common.FMLLog;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.Calendar;
@@ -50,7 +51,15 @@
if (block instanceof BlockChest && i == 0)
{
- ((BlockChest)block).unifyAdjacentChests(par1TileEntityChest.getWorldObj(), par1TileEntityChest.xCoord, par1TileEntityChest.yCoord, par1TileEntityChest.zCoord);
+ try
+ {
+ ((BlockChest)block).unifyAdjacentChests(par1TileEntityChest.getWorldObj(), par1TileEntityChest.xCoord, par1TileEntityChest.yCoord, par1TileEntityChest.zCoord);
+ }
+ catch (ClassCastException e)
+ {
+ FMLLog.severe("Attempted to render a chest at %d, %d, %d that was not a chest",
+ par1TileEntityChest.xCoord, par1TileEntityChest.yCoord, par1TileEntityChest.zCoord);
+ }
i = par1TileEntityChest.getBlockMetadata();
}

View file

@ -350,3 +350,19 @@
} }
/** /**
@@ -2176,7 +2292,14 @@
*/
public void setCurrentItemOrArmor(int par1, ItemStack par2ItemStack)
{
- this.inventory.armorInventory[par1] = par2ItemStack;
+ if (par1 == 0)
+ {
+ this.inventory.mainInventory[this.inventory.currentItem] = par2ItemStack;
+ }
+ else
+ {
+ this.inventory.armorInventory[par1 - 1] = par2ItemStack;
+ }
}
public ItemStack[] getLastActiveItems()

View file

@ -0,0 +1,17 @@
--- ../src_base/minecraft/net/minecraft/entity/player/InventoryPlayer.java
+++ ../src_work/minecraft/net/minecraft/entity/player/InventoryPlayer.java
@@ -337,6 +337,14 @@
this.mainInventory[i].updateAnimation(this.player.worldObj, this.player, i, this.currentItem == i);
}
}
+
+ for (int i = 0; i < this.armorInventory.length; i++)
+ {
+ if (this.armorInventory[i] != null)
+ {
+ this.armorInventory[i].getItem().onArmorTickUpdate(this.player.worldObj, this.player, this.armorInventory[i]);
+ }
+ }
}
/**

View file

@ -0,0 +1,12 @@
--- ../src_base/minecraft/net/minecraft/inventory/SlotArmor.java
+++ ../src_work/minecraft/net/minecraft/inventory/SlotArmor.java
@@ -41,7 +41,8 @@
*/
public boolean isItemValid(ItemStack par1ItemStack)
{
- return par1ItemStack == null ? false : (par1ItemStack.getItem() instanceof ItemArmor ? ((ItemArmor)par1ItemStack.getItem()).armorType == this.armorType : (par1ItemStack.getItem().itemID != Block.pumpkin.blockID && par1ItemStack.getItem().itemID != Item.skull.itemID ? false : this.armorType == 0));
+ Item item = (par1ItemStack == null ? null : par1ItemStack.getItem());
+ return item != null && item.isValidArmor(par1ItemStack, armorType);
}
@SideOnly(Side.CLIENT)

View file

@ -0,0 +1,11 @@
--- ../src_base/minecraft/net/minecraft/inventory/SlotBrewingStandIngredient.java
+++ ../src_work/minecraft/net/minecraft/inventory/SlotBrewingStandIngredient.java
@@ -19,7 +19,7 @@
*/
public boolean isItemValid(ItemStack par1ItemStack)
{
- return par1ItemStack != null ? Item.itemsList[par1ItemStack.itemID].isPotionIngredient() : false;
+ return par1ItemStack != null ? Item.itemsList[par1ItemStack.itemID].isPotionIngredient(par1ItemStack) : false;
}
/**

View file

@ -47,7 +47,7 @@
Vec3 vec31 = vec3.addVector((double)f7 * d3, (double)f6 * d3, (double)f8 * d3); Vec3 vec31 = vec3.addVector((double)f7 * d3, (double)f6 * d3, (double)f8 * d3);
return par1World.rayTraceBlocks_do_do(vec3, vec31, par3, !par3); return par1World.rayTraceBlocks_do_do(vec3, vec31, par3, !par3);
} }
@@ -705,4 +715,266 @@ @@ -705,4 +715,324 @@
{ {
StatList.initStats(); StatList.initStats();
} }
@ -313,4 +313,62 @@
+ { + {
+ return false; + return false;
+ } + }
+
+
+ /**
+ * Called to tick armor in the armor slot. Override to do something
+ *
+ * @param world
+ * @param player
+ * @param itemStack
+ */
+ public void onArmorTickUpdate(World world, EntityPlayer player, ItemStack itemStack)
+ {
+
+ }
+
+ /**
+ * Determines if the specific ItemStack can be placed in the specified armor slot.
+ *
+ * @param stack The ItemStack
+ * @param armorType Armor slot ID: 0: Helmet, 1: Chest, 2: Legs, 3: Boots
+ * @return True if the given ItemStack can be inserted in the slot
+ */
+ public boolean isValidArmor(ItemStack stack, int armorType)
+ {
+ if (this instanceof ItemArmor)
+ {
+ return ((ItemArmor)this).armorType == armorType;
+ }
+
+ if (armorType == 0)
+ {
+ return itemID == Block.pumpkin.blockID || itemID == Item.skull.itemID;
+ }
+
+ return false;
+ }
+
+ /**
+ * ItemStack sensitive version of isPotionIngredient
+ *
+ * @param stack The item stack
+ * @return True if this stack can be used as a potion ingredient
+ */
+ public boolean isPotionIngredient(ItemStack stack)
+ {
+ return isPotionIngredient();
+ }
+
+ /**
+ * ItemStack sensitive version of getPotionEffect
+ *
+ * @param stack The item stack
+ * @return A string containing the bit manipulation to apply the the potion.
+ */
+ public String getPotionEffect(ItemStack stack)
+ {
+ return getPotionEffect();
+ }
+
} }

View file

@ -26,18 +26,31 @@
} }
this.mcServer.getConfigurationManager().serverUpdateMountedMovingPlayer(this.playerEntity); this.mcServer.getConfigurationManager().serverUpdateMountedMovingPlayer(this.playerEntity);
@@ -327,6 +339,11 @@ @@ -307,9 +319,9 @@
this.playerEntity.addExhaustion(0.2F); d4 = d1 - this.playerEntity.posX;
} double d6 = d2 - this.playerEntity.posY;
double d7 = d3 - this.playerEntity.posZ;
- double d8 = Math.min(Math.abs(d4), Math.abs(this.playerEntity.motionX));
- double d9 = Math.min(Math.abs(d6), Math.abs(this.playerEntity.motionY));
- double d10 = Math.min(Math.abs(d7), Math.abs(this.playerEntity.motionZ));
+ double d8 = Math.max(Math.abs(d4), Math.abs(this.playerEntity.motionX));
+ double d9 = Math.max(Math.abs(d6), Math.abs(this.playerEntity.motionY));
+ double d10 = Math.max(Math.abs(d7), Math.abs(this.playerEntity.motionZ));
double d11 = d8 * d8 + d9 * d9 + d10 * d10;
if (d11 > 100.0D && (!this.mcServer.isSinglePlayer() || !this.mcServer.getServerOwner().equals(this.playerEntity.username)))
@@ -325,6 +337,11 @@
if (this.playerEntity.onGround && !par1Packet10Flying.onGround && d6 > 0.0D)
{
this.playerEntity.addExhaustion(0.2F);
+ }
+
+ if (!this.hasMoved) //Fixes "Moved Too Fast" kick when being teleported while moving + if (!this.hasMoved) //Fixes "Moved Too Fast" kick when being teleported while moving
+ { + {
+ return; + return;
+ } }
+
this.playerEntity.moveEntity(d4, d6, d7); this.playerEntity.moveEntity(d4, d6, d7);
this.playerEntity.onGround = par1Packet10Flying.onGround;
this.playerEntity.addMovementStat(d4, d6, d7);
@@ -349,10 +366,15 @@ @@ -349,10 +366,15 @@
logger.warning(this.playerEntity.username + " moved wrongly!"); logger.warning(this.playerEntity.username + " moved wrongly!");
} }
@ -144,3 +157,12 @@
} }
} }
} }
@@ -1233,7 +1274,7 @@
}
}
}
-
+
@Override

View file

@ -1,19 +1,23 @@
--- ../src_base/minecraft/net/minecraft/network/packet/Packet52MultiBlockChange.java --- ../src_base/minecraft/net/minecraft/network/packet/Packet52MultiBlockChange.java
+++ ../src_work/minecraft/net/minecraft/network/packet/Packet52MultiBlockChange.java +++ ../src_work/minecraft/net/minecraft/network/packet/Packet52MultiBlockChange.java
@@ -6,6 +6,7 @@ @@ -6,6 +6,8 @@
import java.io.IOException; import java.io.IOException;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.common.ForgeDummyContainer;
+import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.MinecraftForge;
public class Packet52MultiBlockChange extends Packet public class Packet52MultiBlockChange extends Packet
{ {
@@ -38,7 +39,7 @@ @@ -38,10 +40,8 @@
try try
{ {
- if (par4 >= 64) - if (par4 >= 64)
+ if (par4 >= MinecraftForge.clumpingThreshold) + if (par4 >= ForgeDummyContainer.clumpingThreshold)
{ {
System.out.println("ChunkTilesUpdatePacket compress " + par4); - System.out.println("ChunkTilesUpdatePacket compress " + par4);
-
if (field_73449_e.length < l)
{
field_73449_e = new byte[l];

View file

@ -117,7 +117,7 @@
- for (i = 0; i < this.worldServers.length; ++i) - for (i = 0; i < this.worldServers.length; ++i)
- { - {
+ Integer[] ids = DimensionManager.getIDs(); + Integer[] ids = DimensionManager.getIDs(this.tickCounter % 200 == 0);
+ for (int x = 0; x < ids.length; x++) + for (int x = 0; x < ids.length; x++)
+ { + {
+ int id = ids[x]; + int id = ids[x];

View file

@ -8,10 +8,11 @@
import java.util.List; import java.util.List;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.network.packet.Packet; import net.minecraft.network.packet.Packet;
@@ -10,9 +11,12 @@ @@ -10,9 +11,13 @@
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.ChunkCoordIntPair;
+import net.minecraftforge.common.ForgeDummyContainer;
+import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.world.ChunkWatchEvent; +import net.minecraftforge.event.world.ChunkWatchEvent;
+ +
@ -22,7 +23,7 @@
/** note: this is final */ /** note: this is final */
private final ChunkCoordIntPair chunkLocation; private final ChunkCoordIntPair chunkLocation;
@@ -56,6 +60,8 @@ @@ -56,6 +61,8 @@
this.playersInChunk.remove(par1EntityPlayerMP); this.playersInChunk.remove(par1EntityPlayerMP);
par1EntityPlayerMP.loadedChunks.remove(this.chunkLocation); par1EntityPlayerMP.loadedChunks.remove(this.chunkLocation);
@ -31,7 +32,7 @@
if (this.playersInChunk.isEmpty()) if (this.playersInChunk.isEmpty())
{ {
long i = (long)this.chunkLocation.chunkXPos + 2147483647L | (long)this.chunkLocation.chunkZPos + 2147483647L << 32; long i = (long)this.chunkLocation.chunkXPos + 2147483647L | (long)this.chunkLocation.chunkZPos + 2147483647L << 32;
@@ -80,20 +86,21 @@ @@ -80,20 +87,21 @@
this.field_73260_f |= 1 << (par2 >> 4); this.field_73260_f |= 1 << (par2 >> 4);
@ -64,12 +65,12 @@
} }
public void sendToAllPlayersWatchingChunk(Packet par1Packet) public void sendToAllPlayersWatchingChunk(Packet par1Packet)
@@ -133,40 +140,26 @@ @@ -133,40 +141,26 @@
{ {
int l; int l;
- if (this.numberOfTilesToUpdate == 64) - if (this.numberOfTilesToUpdate == 64)
+ if (this.numberOfTilesToUpdate >= MinecraftForge.clumpingThreshold) + if (this.numberOfTilesToUpdate >= ForgeDummyContainer.clumpingThreshold)
{ {
i = this.chunkLocation.chunkXPos * 16; i = this.chunkLocation.chunkXPos * 16;
j = this.chunkLocation.chunkZPos * 16; j = this.chunkLocation.chunkZPos * 16;

View file

@ -1,20 +1,22 @@
--- ../src_base/minecraft/net/minecraft/tileentity/TileEntity.java --- ../src_base/minecraft/net/minecraft/tileentity/TileEntity.java
+++ ../src_work/minecraft/net/minecraft/tileentity/TileEntity.java +++ ../src_work/minecraft/net/minecraft/tileentity/TileEntity.java
@@ -11,7 +11,9 @@ @@ -11,7 +11,10 @@
import net.minecraft.block.TileEntityRecordPlayer; import net.minecraft.block.TileEntityRecordPlayer;
import net.minecraft.crash.CrashReportCategory; import net.minecraft.crash.CrashReportCategory;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.INetworkManager; +import net.minecraft.network.INetworkManager;
import net.minecraft.network.packet.Packet; import net.minecraft.network.packet.Packet;
+import net.minecraft.network.packet.Packet132TileEntityData; +import net.minecraft.network.packet.Packet132TileEntityData;
+import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World; import net.minecraft.world.World;
public class TileEntity public class TileEntity
@@ -300,4 +302,52 @@ @@ -300,4 +303,93 @@
addMapping(TileEntityDaylightDetector.class, "DLDetector"); addMapping(TileEntityDaylightDetector.class, "DLDetector");
addMapping(TileEntityHopper.class, "Hopper"); addMapping(TileEntityHopper.class, "Hopper");
} }
+ +
+ // -- BEGIN FORGE PATCHES --
+ /** + /**
+ * Determines if this TileEntity requires update calls. + * Determines if this TileEntity requires update calls.
+ * @return True if you want updateEntity() to be called, false if not + * @return True if you want updateEntity() to be called, false if not
@ -61,5 +63,45 @@
+ public boolean shouldRefresh(int oldID, int newID, int oldMeta, int newMeta, World world, int x, int y, int z) + public boolean shouldRefresh(int oldID, int newID, int oldMeta, int newMeta, World world, int x, int y, int z)
+ { + {
+ return true; + return true;
+ }
+
+ public boolean shouldRenderInPass(int pass)
+ {
+ return pass == 0;
+ }
+ /**
+ * Sometimes default render bounding box: infinite in scope. Used to control rendering on {@link TileEntitySpecialRenderer}.
+ */
+ public static final AxisAlignedBB INFINITE_EXTENT_AABB = AxisAlignedBB.getBoundingBox(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY);
+
+ /**
+ * Return an {@link AxisAlignedBB} that controls the visible scope of a {@link TileEntitySpecialRenderer} associated with this {@link TileEntity}
+ * Defaults to the collision bounding box {@link Block#getCollisionBoundingBoxFromPool(World, int, int, int)} associated with the block
+ * at this location.
+ *
+ * @return an appropriately size {@link AxisAlignedBB} for the {@link TileEntity}
+ */
+ @SideOnly(Side.CLIENT)
+ public AxisAlignedBB getRenderBoundingBox()
+ {
+ AxisAlignedBB bb = INFINITE_EXTENT_AABB;
+ Block type = getBlockType();
+ if (type == Block.enchantmentTable)
+ {
+ bb = AxisAlignedBB.getAABBPool().addOrModifyAABBInPool(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 1, zCoord + 1);
+ }
+ else if (type == Block.chest)
+ {
+ bb = AxisAlignedBB.getAABBPool().addOrModifyAABBInPool(xCoord - 1, yCoord, zCoord - 1, xCoord + 2, yCoord + 1, zCoord + 2);
+ }
+ else if (type != null && type != Block.beacon)
+ {
+ AxisAlignedBB cbb = getBlockType().getCollisionBoundingBoxFromPool(worldObj, xCoord, yCoord, zCoord);
+ if (cbb != null)
+ {
+ bb = cbb;
+ }
+ }
+ return bb;
+ } + }
} }

View file

@ -61,3 +61,22 @@
} }
} }
} }
@@ -109,4 +92,18 @@
return aweightedrandomchestcontent1;
}
+
+ // -- Forge hooks
+ /**
+ * Allow a mod to submit a custom implementation that can delegate item stack generation beyond simple stack lookup
+ *
+ * @param random The current random for generation
+ * @param newInventory The inventory being generated (do not populate it, but you can refer to it)
+ * @return An array of {@link ItemStack} to put into the chest
+ */
+ protected ItemStack[] generateChestContent(Random random, IInventory newInventory)
+ {
+ return ChestGenHooks.generateStacks(random, theItemId, theMinimumChanceToGenerateItem, theMaximumChanceToGenerateItem);
+ }
+
}

View file

@ -0,0 +1,26 @@
--- ../src_base/minecraft/net/minecraft/world/gen/feature/WorldGenBigTree.java
+++ ../src_work/minecraft/net/minecraft/world/gen/feature/WorldGenBigTree.java
@@ -1,9 +1,12 @@
package net.minecraft.world.gen.feature;
import java.util.Random;
+
import net.minecraft.block.Block;
+import net.minecraft.block.BlockSapling;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
+import net.minecraftforge.common.ForgeDirection;
public class WorldGenBigTree extends WorldGenerator
{
@@ -442,7 +445,9 @@
int[] aint1 = new int[] {this.basePos[0], this.basePos[1] + this.heightLimit - 1, this.basePos[2]};
int i = this.worldObj.getBlockId(this.basePos[0], this.basePos[1] - 1, this.basePos[2]);
- if (i != 2 && i != 3)
+ Block soil = Block.blocksList[i];
+ boolean isValidSoil = (soil != null && soil.canSustainPlant(worldObj, basePos[0], basePos[1] - 1, basePos[2], ForgeDirection.UP, (BlockSapling)Block.sapling));
+ if (!isValidSoil)
{
return false;
}

View file

@ -1,6 +1,18 @@
--- ../src_base/minecraft/net/minecraft/world/gen/feature/WorldGenForest.java --- ../src_base/minecraft/net/minecraft/world/gen/feature/WorldGenForest.java
+++ ../src_work/minecraft/net/minecraft/world/gen/feature/WorldGenForest.java +++ ../src_work/minecraft/net/minecraft/world/gen/feature/WorldGenForest.java
@@ -45,7 +45,9 @@ @@ -1,8 +1,11 @@
package net.minecraft.world.gen.feature;
import java.util.Random;
+
import net.minecraft.block.Block;
+import net.minecraft.block.BlockSapling;
import net.minecraft.world.World;
+import net.minecraftforge.common.ForgeDirection;
public class WorldGenForest extends WorldGenerator
{
@@ -45,7 +48,9 @@
{ {
l1 = par1World.getBlockId(j1, i1, k1); l1 = par1World.getBlockId(j1, i1, k1);
@ -11,7 +23,22 @@
{ {
flag = false; flag = false;
} }
@@ -84,7 +86,10 @@ @@ -65,10 +70,12 @@
else
{
i1 = par1World.getBlockId(par3, par4 - 1, par5);
+ Block soil = Block.blocksList[i1];
+ boolean isValidSoil = soil != null && soil.canSustainPlant(par1World, par3, par4 - 1, par5, ForgeDirection.UP, (BlockSapling)Block.sapling);
- if ((i1 == Block.grass.blockID || i1 == Block.dirt.blockID) && par4 < 256 - l - 1)
+ if (isValidSoil && par4 < 256 - l - 1)
{
- this.setBlock(par1World, par3, par4 - 1, par5, Block.dirt.blockID);
+ soil.onPlantGrow(par1World, par3, par4 - 1, par5, par3, par4, par5);
int i2;
for (i2 = par4 - 3 + l; i2 <= par4 + l; ++i2)
@@ -84,7 +91,10 @@
{ {
int l2 = k2 - par5; int l2 = k2 - par5;
@ -23,7 +50,7 @@
{ {
this.setBlockAndMetadata(par1World, l1, i2, k2, Block.leaves.blockID, 2); this.setBlockAndMetadata(par1World, l1, i2, k2, Block.leaves.blockID, 2);
} }
@@ -96,7 +101,9 @@ @@ -96,7 +106,9 @@
{ {
j1 = par1World.getBlockId(par3, par4 + i2, par5); j1 = par1World.getBlockId(par3, par4 + i2, par5);

View file

@ -1,6 +1,17 @@
--- ../src_base/minecraft/net/minecraft/world/gen/feature/WorldGenHugeTrees.java --- ../src_base/minecraft/net/minecraft/world/gen/feature/WorldGenHugeTrees.java
+++ ../src_work/minecraft/net/minecraft/world/gen/feature/WorldGenHugeTrees.java +++ ../src_work/minecraft/net/minecraft/world/gen/feature/WorldGenHugeTrees.java
@@ -58,7 +58,12 @@ @@ -2,8 +2,10 @@
import java.util.Random;
import net.minecraft.block.Block;
+import net.minecraft.block.BlockSapling;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
+import net.minecraftforge.common.ForgeDirection;
public class WorldGenHugeTrees extends WorldGenerator
{
@@ -58,7 +60,12 @@
{ {
l1 = par1World.getBlockId(j1, i1, k1); l1 = par1World.getBlockId(j1, i1, k1);
@ -14,7 +25,29 @@
{ {
flag = false; flag = false;
} }
@@ -106,7 +111,7 @@ @@ -79,12 +86,15 @@
{
i1 = par1World.getBlockId(par3, par4 - 1, par5);
- if ((i1 == Block.grass.blockID || i1 == Block.dirt.blockID) && par4 < 256 - l - 1)
- {
- par1World.setBlockAndMetadataWithNotify(par3, par4 - 1, par5, Block.dirt.blockID, 0, 4);
- par1World.setBlockAndMetadataWithNotify(par3 + 1, par4 - 1, par5, Block.dirt.blockID, 0, 4);
- par1World.setBlockAndMetadataWithNotify(par3, par4 - 1, par5 + 1, Block.dirt.blockID, 0, 4);
- par1World.setBlockAndMetadataWithNotify(par3 + 1, par4 - 1, par5 + 1, Block.dirt.blockID, 0, 4);
+ Block soil = Block.blocksList[i1];
+ boolean isValidSoil = soil != null && soil.canSustainPlant(par1World, par3, par4 - 1, par5, ForgeDirection.UP, (BlockSapling)Block.sapling);
+
+ if (isValidSoil && par4 < 256 - l - 1)
+ {
+ onPlantGrow(par1World, par3, par4 - 1, par5, par3, par4, par5);
+ onPlantGrow(par1World, par3 + 1, par4 - 1, par5, par3, par4, par5);
+ onPlantGrow(par1World, par3, par4 - 1, par5 + 1, par3, par4, par5);
+ onPlantGrow(par1World, par3 + 1, par4 - 1, par5 + 1, par3, par4, par5);
this.growLeaves(par1World, par3, par5, par4 + l, 2, par2Random);
for (int i2 = par4 + l - 2 - par2Random.nextInt(4); i2 > par4 + l / 2; i2 -= 2 + par2Random.nextInt(4))
@@ -106,7 +116,7 @@
{ {
k1 = par1World.getBlockId(par3, par4 + j1, par5); k1 = par1World.getBlockId(par3, par4 + j1, par5);
@ -23,7 +56,7 @@
{ {
this.setBlockAndMetadata(par1World, par3, par4 + j1, par5, Block.wood.blockID, this.woodMetadata); this.setBlockAndMetadata(par1World, par3, par4 + j1, par5, Block.wood.blockID, this.woodMetadata);
@@ -128,7 +133,7 @@ @@ -128,7 +138,7 @@
{ {
k1 = par1World.getBlockId(par3 + 1, par4 + j1, par5); k1 = par1World.getBlockId(par3 + 1, par4 + j1, par5);
@ -32,7 +65,7 @@
{ {
this.setBlockAndMetadata(par1World, par3 + 1, par4 + j1, par5, Block.wood.blockID, this.woodMetadata); this.setBlockAndMetadata(par1World, par3 + 1, par4 + j1, par5, Block.wood.blockID, this.woodMetadata);
@@ -148,7 +153,7 @@ @@ -148,7 +158,7 @@
k1 = par1World.getBlockId(par3 + 1, par4 + j1, par5 + 1); k1 = par1World.getBlockId(par3 + 1, par4 + j1, par5 + 1);
@ -41,7 +74,7 @@
{ {
this.setBlockAndMetadata(par1World, par3 + 1, par4 + j1, par5 + 1, Block.wood.blockID, this.woodMetadata); this.setBlockAndMetadata(par1World, par3 + 1, par4 + j1, par5 + 1, Block.wood.blockID, this.woodMetadata);
@@ -168,7 +173,7 @@ @@ -168,7 +178,7 @@
k1 = par1World.getBlockId(par3, par4 + j1, par5 + 1); k1 = par1World.getBlockId(par3, par4 + j1, par5 + 1);
@ -50,7 +83,7 @@
{ {
this.setBlockAndMetadata(par1World, par3, par4 + j1, par5 + 1, Block.wood.blockID, this.woodMetadata); this.setBlockAndMetadata(par1World, par3, par4 + j1, par5 + 1, Block.wood.blockID, this.woodMetadata);
@@ -219,7 +224,12 @@ @@ -219,7 +229,12 @@
{ {
int k2 = j2 - par3; int k2 = j2 - par3;
@ -64,3 +97,17 @@
{ {
this.setBlockAndMetadata(par1World, l1, i1, j2, Block.leaves.blockID, this.leavesMetadata); this.setBlockAndMetadata(par1World, l1, i1, j2, Block.leaves.blockID, this.leavesMetadata);
} }
@@ -227,4 +242,13 @@
}
}
}
+
+ private void onPlantGrow(World world, int x, int y, int z, int sourceX, int sourceY, int sourceZ)
+ {
+ Block block = Block.blocksList[world.getBlockId(x, y, z)];
+ if (block != null)
+ {
+ block.onPlantGrow(world, x, y, z, sourceX, sourceY, sourceZ);
+ }
+ }
}

View file

@ -1,6 +1,16 @@
--- ../src_base/minecraft/net/minecraft/world/gen/feature/WorldGenTaiga2.java --- ../src_base/minecraft/net/minecraft/world/gen/feature/WorldGenTaiga2.java
+++ ../src_work/minecraft/net/minecraft/world/gen/feature/WorldGenTaiga2.java +++ ../src_work/minecraft/net/minecraft/world/gen/feature/WorldGenTaiga2.java
@@ -47,7 +47,9 @@ @@ -2,7 +2,9 @@
import java.util.Random;
import net.minecraft.block.Block;
+import net.minecraft.block.BlockSapling;
import net.minecraft.world.World;
+import net.minecraftforge.common.ForgeDirection;
public class WorldGenTaiga2 extends WorldGenerator
{
@@ -47,7 +49,9 @@
{ {
j2 = par1World.getBlockId(i2, l1, l2); j2 = par1World.getBlockId(i2, l1, l2);
@ -11,7 +21,22 @@
{ {
flag = false; flag = false;
} }
@@ -89,7 +91,10 @@ @@ -67,10 +71,12 @@
else
{
l1 = par1World.getBlockId(par3, par4 - 1, par5);
+ Block soil = Block.blocksList[l1];
+ boolean isValidSoil = soil != null && soil.canSustainPlant(par1World, par3, par4 - 1, par5, ForgeDirection.UP, (BlockSapling)Block.sapling);
- if ((l1 == Block.grass.blockID || l1 == Block.dirt.blockID) && par4 < 256 - l - 1)
+ if (isValidSoil && par4 < 256 - l - 1)
{
- this.setBlock(par1World, par3, par4 - 1, par5, Block.dirt.blockID);
+ soil.onPlantGrow(par1World, par3, par4 - 1, par5, par3, par4, par5);
k2 = par2Random.nextInt(2);
i2 = 1;
byte b0 = 0;
@@ -89,7 +95,10 @@
{ {
int i4 = l3 - par5; int i4 = l3 - par5;
@ -23,7 +48,7 @@
{ {
this.setBlockAndMetadata(par1World, i3, j3, l3, Block.leaves.blockID, 1); this.setBlockAndMetadata(par1World, i3, j3, l3, Block.leaves.blockID, 1);
} }
@@ -119,7 +124,9 @@ @@ -119,7 +128,9 @@
{ {
i3 = par1World.getBlockId(par3, par4 + j3, par5); i3 = par1World.getBlockId(par3, par4 + j3, par5);

View file

@ -1,6 +1,17 @@
--- ../src_base/minecraft/net/minecraft/world/gen/feature/WorldGenTrees.java --- ../src_base/minecraft/net/minecraft/world/gen/feature/WorldGenTrees.java
+++ ../src_work/minecraft/net/minecraft/world/gen/feature/WorldGenTrees.java +++ ../src_work/minecraft/net/minecraft/world/gen/feature/WorldGenTrees.java
@@ -67,7 +67,13 @@ @@ -2,8 +2,10 @@
import java.util.Random;
import net.minecraft.block.Block;
+import net.minecraft.block.BlockSapling;
import net.minecraft.util.Direction;
import net.minecraft.world.World;
+import net.minecraftforge.common.ForgeDirection;
public class WorldGenTrees extends WorldGenerator
{
@@ -67,7 +69,13 @@
{ {
k1 = par1World.getBlockId(l1, i1, j1); k1 = par1World.getBlockId(l1, i1, j1);
@ -15,7 +26,24 @@
{ {
flag = false; flag = false;
} }
@@ -110,7 +116,10 @@ @@ -87,10 +95,12 @@
else
{
i1 = par1World.getBlockId(par3, par4 - 1, par5);
-
- if ((i1 == Block.grass.blockID || i1 == Block.dirt.blockID) && par4 < 256 - l - 1)
- {
- this.setBlock(par1World, par3, par4 - 1, par5, Block.dirt.blockID);
+ Block soil = Block.blocksList[i1];
+ boolean isSoil = (soil != null && soil.canSustainPlant(par1World, par3, par4 - 1, par5, ForgeDirection.UP, (BlockSapling)Block.sapling));
+
+ if (isSoil && par4 < 256 - l - 1)
+ {
+ soil.onPlantGrow(par1World, par3, par4 - 1, par5, par3, par4, par5);
b0 = 3;
byte b1 = 0;
int i2;
@@ -110,7 +120,10 @@
{ {
int i3 = l2 - par5; int i3 = l2 - par5;
@ -27,7 +55,7 @@
{ {
this.setBlockAndMetadata(par1World, j2, j1, l2, Block.leaves.blockID, this.metaLeaves); this.setBlockAndMetadata(par1World, j2, j1, l2, Block.leaves.blockID, this.metaLeaves);
} }
@@ -122,7 +131,9 @@ @@ -122,7 +135,9 @@
{ {
k1 = par1World.getBlockId(par3, par4 + j1, par5); k1 = par1World.getBlockId(par3, par4 + j1, par5);
@ -38,7 +66,7 @@
{ {
this.setBlockAndMetadata(par1World, par3, par4 + j1, par5, Block.wood.blockID, this.metaWood); this.setBlockAndMetadata(par1World, par3, par4 + j1, par5, Block.wood.blockID, this.metaWood);
@@ -162,7 +173,8 @@ @@ -162,7 +177,8 @@
{ {
for (k2 = par5 - i2; k2 <= par5 + i2; ++k2) for (k2 = par5 - i2; k2 <= par5 + i2; ++k2)
{ {

0
setup.sh Executable file → Normal file
View file

View file

@ -1,2 +0,0 @@
#!/bin/bash
python update_patches.py "$@"