diff --git a/src/main/java/com/estebes/usefulcrops/UsefulCrops.java b/src/main/java/com/estebes/usefulcrops/UsefulCrops.java index 2ccccf3..e439c5c 100644 --- a/src/main/java/com/estebes/usefulcrops/UsefulCrops.java +++ b/src/main/java/com/estebes/usefulcrops/UsefulCrops.java @@ -1,8 +1,13 @@ package com.estebes.usefulcrops; +import net.minecraftforge.common.MinecraftForge; + import com.estebes.usefulcrops.crops.CropParser; import com.estebes.usefulcrops.proxy.ServerProxy; import com.estebes.usefulcrops.reference.Reference; +import com.estebes.usefulcrops.util.EventListener; + +import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.SidedProxy; import cpw.mods.fml.common.event.FMLInitializationEvent; @@ -24,6 +29,9 @@ public void preInit(FMLPreInitializationEvent preinit) { @Mod.EventHandler public void init(FMLInitializationEvent init) { CropParser.init(); + EventListener el = new EventListener(); + MinecraftForge.EVENT_BUS.register(el); + FMLCommonHandler.instance().bus().register(el); } @Mod.EventHandler diff --git a/src/main/java/com/estebes/usefulcrops/crops/cropspecial/CropSpecialEnet.java b/src/main/java/com/estebes/usefulcrops/crops/cropspecial/CropSpecialEnet.java index dd5b0ab..8104f5d 100644 --- a/src/main/java/com/estebes/usefulcrops/crops/cropspecial/CropSpecialEnet.java +++ b/src/main/java/com/estebes/usefulcrops/crops/cropspecial/CropSpecialEnet.java @@ -2,15 +2,23 @@ import com.estebes.usefulcrops.crops.CropProperties; import com.estebes.usefulcrops.reference.Reference; +import com.estebes.usefulcrops.util.EventListener; + import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ic2.api.crops.CropCard; import ic2.api.crops.ICropTile; +import ic2.api.energy.EnergyNet; +import ic2.api.energy.event.EnergyTileLoadEvent; +import ic2.api.energy.event.EnergyTileUnloadEvent; import ic2.api.energy.tile.IEnergySink; +import ic2.api.energy.tile.IEnergySource; +import ic2.core.energy.EnergyNetLocal; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.ForgeDirection; public class CropSpecialEnet extends CropCard { @@ -122,10 +130,63 @@ public void registerSprites(IIconRegister iconRegister) { @Override public void tick(ICropTile crop) { - TileEntity teCrop = (TileEntity) crop; - TileEntity teAux = teCrop.getWorldObj().getTileEntity(teCrop.xCoord, teCrop.yCoord + 1, teCrop.zCoord); - if((teAux != null) && (teAux instanceof IEnergySink)) { - ((IEnergySink)teAux).injectEnergy(ForgeDirection.DOWN, 256.0D, 1.0D); - } + TileEntity te = (TileEntity)crop; + if (EnergyNet.instance.getTileEntity(te.getWorldObj(), te.xCoord, te.yCoord, te.zCoord) == null) { + MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent(new FakeTileEntity(te))); + } + } + + /** + * This method returns the amount of EU the crop emits every tick. + */ + private double producedEnergy(ICropTile crop) { + return crop.getSize() == maxSize() ? 1D : 1D; + } + + public class FakeTileEntity extends TileEntity implements IEnergySource { + + private final TileEntity crop; + + private FakeTileEntity(TileEntity parent) { + this.xCoord = parent.xCoord; + this.yCoord = parent.yCoord; + this.zCoord = parent.zCoord; + this.worldObj = parent.getWorldObj(); + if (!parent.isInvalid()) { + this.validate(); + //If the parent isn't valid, the tile doesn't get registered and we try gain the next tick. + } + crop = parent; + EventListener.addTileEntityTick(this); + } + + @Override + public boolean emitsEnergyTo(TileEntity receiver, + ForgeDirection direction) { + return true; + } + + @Override + public double getOfferedEnergy() { + return producedEnergy((ICropTile)crop); //Emitted energy per tick. + } + + @Override + public void drawEnergy(double amount) {} // we don't have a buffer + + @Override + public int getSourceTier() { + return 1; + } + + @Override + public void updateEntity() { + TileEntity te = worldObj.getTileEntity(xCoord, yCoord, zCoord); + if (te != crop || ((ICropTile)te).getCrop() != CropSpecialEnet.this) { + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this)); + EventListener.removeTileEntityTick(this); + } + } + } } \ No newline at end of file diff --git a/src/main/java/com/estebes/usefulcrops/util/EventListener.java b/src/main/java/com/estebes/usefulcrops/util/EventListener.java new file mode 100644 index 0000000..db265e2 --- /dev/null +++ b/src/main/java/com/estebes/usefulcrops/util/EventListener.java @@ -0,0 +1,57 @@ +package com.estebes.usefulcrops.util; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.event.world.WorldEvent; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent; +import cpw.mods.fml.common.gameevent.TickEvent.Phase; + +public class EventListener { + + private static final List tickables = new ArrayList(); + private static final List toRemove = new ArrayList(); + + @SubscribeEvent + public void tick(TickEvent.ServerTickEvent event) { + if (event.phase != Phase.END) return; + for (TileEntity te : toRemove) { + tickables.remove(te); + } + toRemove.clear(); + for (TileEntity te: tickables) { + te.updateEntity(); + } + } + + @SubscribeEvent + public void onWorldUnload(WorldEvent.Unload event) + { + int dimension = event.world.provider.dimensionId; + if (dimension == 0) { + tickables.clear(); + toRemove.clear(); + } + else { + List toRemove = new ArrayList(); + for (TileEntity te : tickables) { + if (te.getWorldObj() != null && te.getWorldObj().provider.dimensionId == dimension) { + toRemove.add(te); + } + } + tickables.removeAll(toRemove); + } + } + + public static void addTileEntityTick(TileEntity te) { + tickables.add(te); + } + + public static void removeTileEntityTick(TileEntity te) { + if (tickables.contains(te)) + toRemove.add(te); + } + +}