Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/main/java/com/estebes/usefulcrops/UsefulCrops.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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);
}
}

}
}
57 changes: 57 additions & 0 deletions src/main/java/com/estebes/usefulcrops/util/EventListener.java
Original file line number Diff line number Diff line change
@@ -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<TileEntity> tickables = new ArrayList<TileEntity>();
private static final List<TileEntity> toRemove = new ArrayList<TileEntity>();

@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<TileEntity> toRemove = new ArrayList<TileEntity>();
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);
}

}