Implement new computer framework in primary machines

This commit is contained in:
aidancbrady 2015-07-20 11:09:44 -07:00
parent a062ea5e9e
commit a94c13edc7
7 changed files with 110 additions and 90 deletions

View file

@ -12,5 +12,5 @@ public interface IComputerIntegration extends IInventory, IPeripheral
{ {
public String[] getMethods(); public String[] getMethods();
public Object[] invoke(String method, Object[] args) throws Exception; public Object[] invoke(int method, Object[] args) throws Exception;
} }

View file

@ -11,6 +11,7 @@ import li.cil.oc.api.prefab.ManagedEnvironment;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World; import net.minecraft.world.World;
import java.util.Arrays;
import java.util.Locale; import java.util.Locale;
/** /**
@ -60,7 +61,7 @@ public class OCDriver extends DriverTileEntity
@Override @Override
public Object[] invoke(String method, Context context, Arguments args) throws Exception public Object[] invoke(String method, Context context, Arguments args) throws Exception
{ {
return computerTile.invoke(method, args.toArray()); return computerTile.invoke(Arrays.asList(methods()).indexOf(method), args.toArray());
} }
@Override @Override

View file

@ -1,23 +1,12 @@
package mekanism.common.tile; package mekanism.common.tile;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import java.util.ArrayList;
import mekanism.api.Coord4D; import mekanism.api.Coord4D;
import mekanism.api.EnumColor; import mekanism.api.EnumColor;
import mekanism.api.Range4D; import mekanism.api.Range4D;
import mekanism.api.gas.Gas; import mekanism.api.gas.*;
import mekanism.api.gas.GasStack;
import mekanism.api.gas.GasTank;
import mekanism.api.gas.IGasHandler;
import mekanism.api.gas.ITubeConnection;
import mekanism.api.transmitters.TransmissionType; import mekanism.api.transmitters.TransmissionType;
import mekanism.common.Mekanism; import mekanism.common.*;
import mekanism.common.MekanismBlocks;
import mekanism.common.MekanismItems;
import mekanism.common.SideData;
import mekanism.common.Upgrade;
import mekanism.common.base.IFactory.RecipeType; import mekanism.common.base.IFactory.RecipeType;
import mekanism.common.network.PacketTileEntity.TileEntityMessage; import mekanism.common.network.PacketTileEntity.TileEntityMessage;
import mekanism.common.recipe.RecipeHandler; import mekanism.common.recipe.RecipeHandler;
@ -36,10 +25,8 @@ import mekanism.common.util.StatUtils;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import cpw.mods.fml.common.Optional.Method;
import dan200.computercraft.api.lua.ILuaContext; import java.util.ArrayList;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.peripheral.IComputerAccess;
public abstract class TileEntityAdvancedElectricMachine<RECIPE extends AdvancedMachineRecipe<RECIPE>> extends TileEntityBasicMachine<AdvancedMachineInput, ItemStackOutput, RECIPE> implements IGasHandler, ITubeConnection public abstract class TileEntityAdvancedElectricMachine<RECIPE extends AdvancedMachineRecipe<RECIPE>> extends TileEntityBasicMachine<AdvancedMachineInput, ItemStackOutput, RECIPE> implements IGasHandler, ITubeConnection
{ {
@ -437,16 +424,16 @@ public abstract class TileEntityAdvancedElectricMachine<RECIPE extends AdvancedM
} }
} }
private static final String[] methods = new String[] {"getStored", "getSecondaryStored", "getProgress", "isActive", "facing", "canOperate", "getMaxEnergy", "getEnergyNeeded"};
@Override @Override
@Method(modid = "ComputerCraft") public String[] getMethods()
public String[] getMethodNames()
{ {
return new String[] {"getStored", "getSecondaryStored", "getProgress", "isActive", "facing", "canOperate", "getMaxEnergy", "getEnergyNeeded"}; return methods;
} }
@Override @Override
@Method(modid = "ComputerCraft") public Object[] invoke(int method, Object[] arguments) throws Exception
public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException
{ {
switch(method) switch(method)
{ {
@ -467,8 +454,7 @@ public abstract class TileEntityAdvancedElectricMachine<RECIPE extends AdvancedM
case 7: case 7:
return new Object[] {maxEnergy-getEnergy()}; return new Object[] {maxEnergy-getEnergy()};
default: default:
Mekanism.logger.error("Attempted to call unknown method with computer ID " + computer.getID()); throw new NoSuchMethodException();
return new Object[] {"Unknown command."};
} }
} }
} }

View file

@ -1,21 +1,20 @@
package mekanism.common.tile; package mekanism.common.tile;
import cpw.mods.fml.common.Optional.Interface;
import cpw.mods.fml.common.Optional.Method;
import dan200.computercraft.api.lua.ILuaContext;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import java.util.ArrayList;
import java.util.EnumSet;
import mekanism.api.Coord4D; import mekanism.api.Coord4D;
import mekanism.api.MekanismConfig.general; import mekanism.api.MekanismConfig.general;
import mekanism.api.Range4D; import mekanism.api.Range4D;
import mekanism.api.transmitters.TransmissionType; import mekanism.api.transmitters.TransmissionType;
import mekanism.common.Mekanism; import mekanism.common.Mekanism;
import mekanism.common.Upgrade; import mekanism.common.Upgrade;
import mekanism.common.base.IEjector; import mekanism.common.base.*;
import mekanism.common.base.IElectricMachine; import mekanism.common.integration.IComputerIntegration;
import mekanism.common.base.IRedstoneControl;
import mekanism.common.base.ISideConfiguration;
import mekanism.common.base.IUpgradeTile;
import mekanism.common.network.PacketTileEntity.TileEntityMessage; import mekanism.common.network.PacketTileEntity.TileEntityMessage;
import mekanism.common.recipe.inputs.MachineInput; import mekanism.common.recipe.inputs.MachineInput;
import mekanism.common.recipe.machines.MachineRecipe; import mekanism.common.recipe.machines.MachineRecipe;
@ -27,13 +26,12 @@ import mekanism.common.util.MekanismUtils;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import cpw.mods.fml.common.Optional.Interface;
import cpw.mods.fml.common.Optional.Method; import java.util.ArrayList;
import dan200.computercraft.api.peripheral.IComputerAccess; import java.util.EnumSet;
import dan200.computercraft.api.peripheral.IPeripheral;
@Interface(iface = "dan200.computercraft.api.peripheral.IPeripheral", modid = "ComputerCraft") @Interface(iface = "dan200.computercraft.api.peripheral.IPeripheral", modid = "ComputerCraft")
public abstract class TileEntityBasicMachine<INPUT extends MachineInput<INPUT>, OUTPUT extends MachineOutput<OUTPUT>, RECIPE extends MachineRecipe<INPUT, OUTPUT, RECIPE>> extends TileEntityNoisyElectricBlock implements IElectricMachine<INPUT, OUTPUT, RECIPE>, IPeripheral, ISideConfiguration, IUpgradeTile, IRedstoneControl public abstract class TileEntityBasicMachine<INPUT extends MachineInput<INPUT>, OUTPUT extends MachineOutput<OUTPUT>, RECIPE extends MachineRecipe<INPUT, OUTPUT, RECIPE>> extends TileEntityNoisyElectricBlock implements IElectricMachine<INPUT, OUTPUT, RECIPE>, IComputerIntegration, ISideConfiguration, IUpgradeTile, IRedstoneControl
{ {
/** How much energy this machine uses per tick, un-upgraded. */ /** How much energy this machine uses per tick, un-upgraded. */
public double BASE_ENERGY_PER_TICK; public double BASE_ENERGY_PER_TICK;
@ -244,6 +242,26 @@ public abstract class TileEntityBasicMachine<INPUT extends MachineInput<INPUT>,
return this == other; return this == other;
} }
@Override
@Method(modid = "ComputerCraft")
public String[] getMethodNames()
{
return getMethods();
}
@Override
@Method(modid = "ComputerCraft")
public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException
{
try {
return invoke(method, arguments);
} catch(NoSuchMethodException e) {
return new Object[] {"Unknown command."};
} finally {
return new Object[] {"Error."};
}
}
@Override @Override
public boolean canSetFacing(int facing) public boolean canSetFacing(int facing)
{ {

View file

@ -1,7 +1,5 @@
package mekanism.common.tile; package mekanism.common.tile;
import java.util.Map;
import mekanism.api.EnumColor; import mekanism.api.EnumColor;
import mekanism.api.transmitters.TransmissionType; import mekanism.api.transmitters.TransmissionType;
import mekanism.common.MekanismItems; import mekanism.common.MekanismItems;
@ -18,10 +16,8 @@ import mekanism.common.util.InventoryUtils;
import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import cpw.mods.fml.common.Optional.Method;
import dan200.computercraft.api.lua.ILuaContext; import java.util.Map;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.peripheral.IComputerAccess;
public abstract class TileEntityChanceMachine<RECIPE extends ChanceMachineRecipe<RECIPE>> extends TileEntityBasicMachine<ItemStackInput, ChanceOutput, RECIPE> public abstract class TileEntityChanceMachine<RECIPE extends ChanceMachineRecipe<RECIPE>> extends TileEntityBasicMachine<ItemStackInput, ChanceOutput, RECIPE>
{ {
@ -163,17 +159,35 @@ public abstract class TileEntityChanceMachine<RECIPE extends ChanceMachineRecipe
return null; return null;
} }
private static final String[] methods = new String[] {"getStored", "getProgress", "isActive", "facing", "canOperate", "getMaxEnergy", "getEnergyNeeded"};
@Override @Override
@Method(modid = "ComputerCraft") public String[] getMethods()
public String[] getMethodNames()
{ {
return null; return methods;
} }
@Override @Override
@Method(modid = "ComputerCraft") public Object[] invoke(int method, Object[] arguments) throws Exception
public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException
{ {
return null; switch(method)
{
case 0:
return new Object[] {getEnergy()};
case 1:
return new Object[] {operatingTicks};
case 2:
return new Object[] {isActive};
case 3:
return new Object[] {facing};
case 4:
return new Object[] {canOperate(getRecipe())};
case 5:
return new Object[] {getMaxEnergy()};
case 6:
return new Object[] {getMaxEnergy()-getEnergy()};
default:
throw new NoSuchMethodException();
}
} }
} }

View file

@ -1,9 +1,5 @@
package mekanism.common.tile; package mekanism.common.tile;
import cpw.mods.fml.common.Optional.Method;
import dan200.computercraft.api.lua.ILuaContext;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.peripheral.IComputerAccess;
import mekanism.api.Coord4D; import mekanism.api.Coord4D;
import mekanism.api.EnumColor; import mekanism.api.EnumColor;
import mekanism.api.Range4D; import mekanism.api.Range4D;
@ -226,16 +222,16 @@ public abstract class TileEntityElectricMachine<RECIPE extends BasicMachineRecip
return false; return false;
} }
private static final String[] methods = new String[] {"getStored", "getProgress", "isActive", "facing", "canOperate", "getMaxEnergy", "getEnergyNeeded"};
@Override @Override
@Method(modid = "ComputerCraft") public String[] getMethods()
public String[] getMethodNames()
{ {
return new String[] {"getStored", "getProgress", "isActive", "facing", "canOperate", "getMaxEnergy", "getEnergyNeeded"}; return methods;
} }
@Override @Override
@Method(modid = "ComputerCraft") public Object[] invoke(int method, Object[] arguments) throws Exception
public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException
{ {
switch(method) switch(method)
{ {
@ -254,7 +250,7 @@ public abstract class TileEntityElectricMachine<RECIPE extends BasicMachineRecip
case 6: case 6:
return new Object[] {getMaxEnergy()-getEnergy()}; return new Object[] {getMaxEnergy()-getEnergy()};
default: default:
return new Object[] {"Unknown command."}; throw new NoSuchMethodException();
} }
} }
} }

View file

@ -1,19 +1,9 @@
package mekanism.common.tile; package mekanism.common.tile;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import java.util.ArrayList;
import java.util.Map;
import mekanism.api.Coord4D;
import mekanism.api.EnumColor; import mekanism.api.EnumColor;
import mekanism.api.MekanismConfig.usage; import mekanism.api.MekanismConfig.usage;
import mekanism.api.gas.Gas; import mekanism.api.gas.*;
import mekanism.api.gas.GasRegistry;
import mekanism.api.gas.GasStack;
import mekanism.api.gas.GasTank;
import mekanism.api.gas.IGasHandler;
import mekanism.api.gas.ITubeConnection;
import mekanism.api.transmitters.TransmissionType; import mekanism.api.transmitters.TransmissionType;
import mekanism.common.SideData; import mekanism.common.SideData;
import mekanism.common.Upgrade; import mekanism.common.Upgrade;
@ -34,19 +24,12 @@ import mekanism.common.util.LangUtils;
import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.*;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack; import java.util.ArrayList;
import net.minecraftforge.fluids.FluidTank; import java.util.Map;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;
import cpw.mods.fml.common.Optional.Method;
import dan200.computercraft.api.lua.ILuaContext;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.peripheral.IComputerAccess;
public class TileEntityPRC extends TileEntityBasicMachine<PressurizedInput, PressurizedOutput, PressurizedRecipe> implements IFluidHandler, IGasHandler, ITubeConnection, ISustainedData, ITankManager public class TileEntityPRC extends TileEntityBasicMachine<PressurizedInput, PressurizedOutput, PressurizedRecipe> implements IFluidHandler, IGasHandler, ITubeConnection, ISustainedData, ITankManager
{ {
@ -310,18 +293,40 @@ public class TileEntityPRC extends TileEntityBasicMachine<PressurizedInput, Pres
return null; return null;
} }
private static final String[] methods = new String[] {"getStored", "getProgress", "isActive", "facing", "canOperate", "getMaxEnergy", "getEnergyNeeded", "getFluidStored", "getGasStored"};
@Override @Override
@Method(modid = "ComputerCraft") public String[] getMethods()
public String[] getMethodNames()
{ {
return null; return methods;
} }
@Override @Override
@Method(modid = "ComputerCraft") public Object[] invoke(int method, Object[] arguments) throws Exception
public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException
{ {
return null; switch(method)
{
case 0:
return new Object[] {getEnergy()};
case 1:
return new Object[] {operatingTicks};
case 2:
return new Object[] {isActive};
case 3:
return new Object[] {facing};
case 4:
return new Object[] {canOperate(getRecipe())};
case 5:
return new Object[] {getMaxEnergy()};
case 6:
return new Object[] {getMaxEnergy()-getEnergy()};
case 7:
return new Object[] {inputFluidTank.getFluidAmount()};
case 8:
return new Object[] {inputGasTank.getStored()};
default:
throw new NoSuchMethodException();
}
} }
@Override @Override