improvements in APIs, threaded packet sending, light sensor expansion, highly optimized pipe code

This commit is contained in:
asiekierka 2015-03-15 15:58:51 +01:00
parent 082cda0653
commit f3d14f105a
33 changed files with 477 additions and 136 deletions

View file

@ -0,0 +1,5 @@
package buildcraft.api.facades;
public class FacadeAPI {
public static IFacadeItem facadeItem;
}

View file

@ -6,7 +6,7 @@
* Please check the contents of the license, which should be located
* as "LICENSE.API" in the BuildCraft source code distribution.
*/
@API(apiVersion = "1.0", owner = "BuildCraftAPI|core", provides = "BuildCraftAPI|facades")
@API(apiVersion = "1.1", owner = "BuildCraftAPI|core", provides = "BuildCraftAPI|facades")
package buildcraft.api.facades;
import cpw.mods.fml.common.API;

View file

@ -13,11 +13,13 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
public final class GateExpansions {
private static final Map<String, IGateExpansion> expansions = new HashMap<String, IGateExpansion>();
private static final ArrayList<IGateExpansion> expansionIDs = new ArrayList<IGateExpansion>();
private static final Map<IGateExpansion, ItemStack> recipes = new HashMap<IGateExpansion, ItemStack>();
private GateExpansions() {
}
@ -31,6 +33,11 @@ public final class GateExpansions {
expansionIDs.add(expansion);
}
public static void registerExpansion(IGateExpansion expansion, ItemStack addedRecipe) {
registerExpansion(expansion.getUniqueIdentifier(), expansion);
recipes.put(expansion, addedRecipe);
}
public static IGateExpansion getExpansion(String identifier) {
return expansions.get(identifier);
}
@ -41,6 +48,10 @@ public final class GateExpansions {
return set;
}
public static Map<IGateExpansion, ItemStack> getRecipesForPostInit() {
return recipes;
}
// The code below is used by networking.
public static IGateExpansion getExpansionByID(int id) {

View file

@ -8,15 +8,12 @@
*/
package buildcraft.api.gates;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.statements.containers.ISidedStatementContainer;
import buildcraft.api.transport.IPipe;
public interface IGate {
public interface IGate extends ISidedStatementContainer {
@Deprecated
void setPulsing(boolean pulse);
ForgeDirection getSide();
IPipe getPipe();
}

View file

@ -6,7 +6,7 @@
* Please check the contents of the license, which should be located
* as "LICENSE.API" in the BuildCraft source code distribution.
*/
@API(apiVersion = "4.0", owner = "BuildCraftAPI|core", provides = "BuildCraftAPI|gates")
@API(apiVersion = "4.1", owner = "BuildCraftAPI|core", provides = "BuildCraftAPI|gates")
package buildcraft.api.gates;
import cpw.mods.fml.common.API;

View file

@ -0,0 +1,5 @@
package buildcraft.api.robots;
public interface IDockingStationPluggable {
IDockingStation getStation();
}

View file

@ -6,7 +6,7 @@
* Please check the contents of the license, which should be located
* as "LICENSE.API" in the BuildCraft source code distribution.
*/
@API(apiVersion = "1.1", owner = "BuildCraftAPI|core", provides = "BuildCraftAPI|robotics")
@API(apiVersion = "1.2", owner = "BuildCraftAPI|core", provides = "BuildCraftAPI|robotics")
package buildcraft.api.robots;
import cpw.mods.fml.common.API;

View file

@ -0,0 +1,19 @@
package buildcraft.api.statements.containers;
import net.minecraftforge.common.util.ForgeDirection;
public interface IRedstoneStatementContainer {
/**
* Get the redstone input from a given side.
* @param side The side - use "UNKNOWN" for maximum input.
* @return The redstone input, from 0 to 15.
*/
int getRedstoneInput(ForgeDirection side);
/**
* Set the redstone input for a given side.
* @param side The side - use "UNKNOWN" for all sides.
* @return Whether the set was successful.
*/
boolean setRedstoneOutput(ForgeDirection side, int value);
}

View file

@ -0,0 +1,11 @@
package buildcraft.api.statements.containers;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.statements.IStatementContainer;
/**
* Created by asie on 3/14/15.
*/
public interface ISidedStatementContainer extends IStatementContainer {
ForgeDirection getSide();
}

View file

@ -6,7 +6,7 @@
* Please check the contents of the license, which should be located
* as "LICENSE.API" in the BuildCraft source code distribution.
*/
@API(apiVersion = "1.0", owner = "BuildCraftAPI|core", provides = "BuildCraftAPI|statements")
@API(apiVersion = "1.1", owner = "BuildCraftAPI|core", provides = "BuildCraftAPI|statements")
package buildcraft.api.statements;
import cpw.mods.fml.common.API;

View file

@ -31,20 +31,118 @@ import buildcraft.core.lib.network.Packet;
public class BuildCraftMod {
public EnumMap<Side, FMLEmbeddedChannel> channels;
public void sendToPlayers(Packet packet, World world, int x, int y, int z, int maxDistance) {
static abstract class SendRequest {
final Packet packet;
final BuildCraftMod source;
SendRequest(BuildCraftMod source, Packet packet) {
this.packet = packet;
this.source = source;
}
abstract void send();
void run() {
try {
channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET)
.set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT);
channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS)
.set(new NetworkRegistry.TargetPoint(world.provider.dimensionId, x, y, z, maxDistance));
channels.get(Side.SERVER).writeOutbound(packet);
} catch (Throwable t) {
BCLog.logger.log(Level.WARN, "sendToPlayers crash", t);
send();
} catch(Exception e) {
e.printStackTrace();
}
}
}
class PlayerSendRequest extends SendRequest {
EntityPlayer player;
PlayerSendRequest(BuildCraftMod source, Packet packet, EntityPlayer player) {
super(source, packet);
this.player = player;
}
void send() {
source.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET)
.set(FMLOutboundHandler.OutboundTarget.PLAYER);
source.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(player);
source.channels.get(Side.SERVER).writeOutbound(packet);
}
}
class WorldSendRequest extends SendRequest {
final int dimensionId;
WorldSendRequest(BuildCraftMod source, Packet packet, int dimensionId) {
super(source, packet);
this.dimensionId = dimensionId;
}
void send() {
source.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET)
.set(FMLOutboundHandler.OutboundTarget.DIMENSION);
source.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS)
.set(dimensionId);
source.channels.get(Side.SERVER).writeOutbound(packet);
}
}
class LocationSendRequest extends SendRequest {
final int dimensionId;
final int x, y, z, md;
LocationSendRequest(BuildCraftMod source, Packet packet, int dimensionId, int x, int y, int z, int md) {
super(source, packet);
this.dimensionId = dimensionId;
this.x = x;
this.y = y;
this.z = z;
this.md = md;
}
@Override
void send() {
source.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET)
.set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT);
source.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS)
.set(new NetworkRegistry.TargetPoint(dimensionId, x, y, z, md));
source.channels.get(Side.SERVER).writeOutbound(packet);
}
}
static class PacketSender implements Runnable {
private Queue<SendRequest> packets = new ConcurrentLinkedDeque<SendRequest>();
@Override
public void run() {
while(true) {
try {
Thread.sleep(20);
} catch(Exception e) {
}
while (!packets.isEmpty()) {
packets.remove().run();
}
}
}
public boolean add(SendRequest r) {
return packets.offer(r);
}
}
private static PacketSender sender = new PacketSender();
private static Thread senderThread = new Thread(sender);
static {
senderThread.start();
}
public void sendToPlayers(Packet packet, World world, int x, int y, int z, int maxDistance) {
sender.add(new LocationSendRequest(this, packet, world.provider.dimensionId, x, y, z, maxDistance));
}
public void sendToPlayersNear(Packet packet, TileEntity tileEntity, int maxDistance) {
sendToPlayers(packet, tileEntity.getWorldObj(), tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord, maxDistance);
sender.add(new LocationSendRequest(this, packet, tileEntity.getWorldObj().provider.dimensionId, tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord, maxDistance));
}
public void sendToPlayersNear(Packet packet, TileEntity tileEntity) {
@ -52,35 +150,14 @@ public class BuildCraftMod {
}
public void sendToWorld(Packet packet, World world) {
try {
channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET)
.set(FMLOutboundHandler.OutboundTarget.DIMENSION);
channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS)
.set(world.provider.dimensionId);
channels.get(Side.SERVER).writeOutbound(packet);
} catch (Throwable t) {
BCLog.logger.log(Level.WARN, "sendToWorld crash", t);
}
sender.add(new WorldSendRequest(this, packet, world.provider.dimensionId));
}
public void sendToPlayer(EntityPlayer entityplayer, Packet packet) {
try {
channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET)
.set(FMLOutboundHandler.OutboundTarget.PLAYER);
channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(entityplayer);
channels.get(Side.SERVER).writeOutbound(packet);
} catch (Throwable t) {
String name = entityplayer.getDisplayName();
if (name == null) {
name = "<no name>";
sender.add(new PlayerSendRequest(this, packet, entityplayer));
}
BCLog.logger.log(Level.WARN, "sendToPlayer \"" + name + "\" crash", t);
}
}
public void sendToAll(Packet packet) {
/* public void sendToAll(Packet packet) {
try {
channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET)
.set(FMLOutboundHandler.OutboundTarget.ALL);
@ -88,14 +165,14 @@ public class BuildCraftMod {
} catch (Throwable t) {
BCLog.logger.log(Level.WARN, "sendToAll crash", t);
}
}
} */
public void sendToServer(Packet packet) {
try {
channels.get(Side.CLIENT).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(OutboundTarget.TOSERVER);
channels.get(Side.CLIENT).writeOutbound(packet);
} catch (Throwable t) {
BCLog.logger.log(Level.WARN, "sendToServer crash", t);
} catch (Exception e) {
e.printStackTrace();
}
}
}

View file

@ -12,6 +12,7 @@ import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
@ -41,7 +42,9 @@ import buildcraft.api.core.BCLog;
import buildcraft.api.core.EnumColor;
import buildcraft.api.core.IIconProvider;
import buildcraft.api.core.JavaTools;
import buildcraft.api.facades.FacadeAPI;
import buildcraft.api.gates.GateExpansions;
import buildcraft.api.gates.IGateExpansion;
import buildcraft.api.recipes.BuildcraftRecipeRegistry;
import buildcraft.api.statements.IActionInternal;
import buildcraft.api.statements.ITriggerInternal;
@ -79,6 +82,7 @@ import buildcraft.transport.TransportProxy;
import buildcraft.transport.WireIconProvider;
import buildcraft.transport.gates.GateDefinition.GateLogic;
import buildcraft.transport.gates.GateDefinition.GateMaterial;
import buildcraft.transport.gates.GateExpansionLightSensor;
import buildcraft.transport.gates.GateExpansionPulsar;
import buildcraft.transport.gates.GateExpansionRedstoneFader;
import buildcraft.transport.gates.GateExpansionTimer;
@ -150,6 +154,7 @@ import buildcraft.transport.statements.ActionValve;
import buildcraft.transport.statements.ActionValve.ValveState;
import buildcraft.transport.statements.TriggerClockTimer;
import buildcraft.transport.statements.TriggerClockTimer.Time;
import buildcraft.transport.statements.TriggerLightSensor;
import buildcraft.transport.statements.TriggerParameterSignal;
import buildcraft.transport.statements.TriggerPipeContents;
import buildcraft.transport.statements.TriggerPipeContents.PipeContents;
@ -227,6 +232,7 @@ public class BuildCraftTransport extends BuildCraftMod {
public static int groupItemsTrigger;
public static String[] facadeBlacklist;
public static ITriggerInternal triggerLightSensorBright, triggerLightSensorDark;
public static ITriggerInternal[] triggerPipe = new ITriggerInternal[PipeContents.values().length];
public static ITriggerInternal[] triggerPipeWireActive = new ITriggerInternal[PipeWire.values().length];
public static ITriggerInternal[] triggerPipeWireInactive = new ITriggerInternal[PipeWire.values().length];
@ -265,6 +271,9 @@ public class BuildCraftTransport extends BuildCraftMod {
public void preInit(FMLPreInitializationEvent evt) {
new BCCreativeTab("pipes");
new BCCreativeTab("facades");
if (Loader.isModLoaded("BuildCraft|Silicon")) {
new BCCreativeTab("gates");
}
try {
Property durability = BuildCraftCore.mainConfiguration.get("general", "pipes.durability", DefaultProps.PIPES_DURABILITY);
@ -286,10 +295,6 @@ public class BuildCraftTransport extends BuildCraftMod {
filteredBufferBlock = new BlockFilteredBuffer();
CoreProxy.proxy.registerBlock(filteredBufferBlock.setBlockName("filteredBufferBlock"));
GateExpansions.registerExpansion(GateExpansionPulsar.INSTANCE);
GateExpansions.registerExpansion(GateExpansionTimer.INSTANCE);
GateExpansions.registerExpansion(GateExpansionRedstoneFader.INSTANCE);
Property groupItemsTriggerProp = BuildCraftCore.mainConfiguration.get("general", "pipes.groupItemsTrigger", 32);
groupItemsTriggerProp.comment = "when reaching this amount of objects in a pipes, items will be automatically grouped";
groupItemsTrigger = groupItemsTriggerProp.getInt();
@ -387,6 +392,7 @@ public class BuildCraftTransport extends BuildCraftMod {
facadeItem = new ItemFacade();
facadeItem.setUnlocalizedName("pipeFacade");
CoreProxy.proxy.registerItem(facadeItem);
FacadeAPI.facadeItem = facadeItem;
plugItem = new ItemPlug();
plugItem.setUnlocalizedName("pipePlug");
@ -437,6 +443,9 @@ public class BuildCraftTransport extends BuildCraftMod {
for (PowerMode limit : PowerMode.VALUES) {
actionPowerLimiter[limit.ordinal()] = new ActionPowerLimiter(limit);
}
triggerLightSensorBright = new TriggerLightSensor(true);
triggerLightSensorDark = new TriggerLightSensor(false);
} finally {
BuildCraftCore.mainConfiguration.save();
}
@ -474,6 +483,7 @@ public class BuildCraftTransport extends BuildCraftMod {
BCCreativeTab.get("pipes").setIcon(new ItemStack(BuildCraftTransport.pipeItemsDiamond, 1));
BCCreativeTab.get("facades").setIcon(facadeItem.getFacadeForBlock(Blocks.brick_block, 0));
BCCreativeTab.get("gates").setIcon(ItemGate.makeGateItem(GateMaterial.DIAMOND, GateLogic.AND));
StatementManager.registerParameterClass(TriggerParameterSignal.class);
StatementManager.registerParameterClass(ActionParameterSignal.class);
@ -494,6 +504,11 @@ public class BuildCraftTransport extends BuildCraftMod {
PipeManager.registerPipePluggable(LensPluggable.class, "lens");
PipeManager.registerPipePluggable(PlugPluggable.class, "plug");
GateExpansions.registerExpansion(GateExpansionPulsar.INSTANCE, Chipset.PULSATING.getStack());
GateExpansions.registerExpansion(GateExpansionTimer.INSTANCE, Chipset.QUARTZ.getStack());
GateExpansions.registerExpansion(GateExpansionRedstoneFader.INSTANCE, Chipset.COMP.getStack());
GateExpansions.registerExpansion(GateExpansionLightSensor.INSTANCE, new ItemStack(Blocks.daylight_detector));
if (BuildCraftCore.loadDefaultRecipes) {
loadRecipes();
}
@ -506,6 +521,10 @@ public class BuildCraftTransport extends BuildCraftMod {
public void postInit(FMLPostInitializationEvent evt) {
facadeItem.initialize();
if (Loader.isModLoaded("BuildCraft|Silicon")) {
postInitSilicon();
}
if (debugPrintFacadeList) {
try {
PrintWriter writer = new PrintWriter("FacadeDebug.txt", "UTF-8");
@ -522,6 +541,17 @@ public class BuildCraftTransport extends BuildCraftMod {
}
}
private void postInitSilicon() {
Map<IGateExpansion, ItemStack> recipes = GateExpansions.getRecipesForPostInit();
int recipeId = 0;
for (IGateExpansion expansion : recipes.keySet()) {
BuildcraftRecipeRegistry.integrationTable.addRecipe(new GateExpansionRecipe("buildcraft:expansion_" + recipeId,
expansion, recipes.get(expansion)));
recipeId++;
}
}
public void loadRecipes() {
// Add base recipe for pipe waterproof.
GameRegistry.addShapelessRecipe(new ItemStack(pipeWaterproof, 1), new ItemStack(Items.dye, 1, 2));
@ -622,14 +652,6 @@ public class BuildCraftTransport extends BuildCraftMod {
// REVERSAL RECIPE
BuildcraftRecipeRegistry.integrationTable.addRecipe(new GateLogicSwapRecipe("buildcraft:gateSwap"));
// EXPANSIONS
BuildcraftRecipeRegistry.integrationTable.addRecipe(new GateExpansionRecipe("buildcraft:expansionPulsar",
GateExpansionPulsar.INSTANCE, Chipset.PULSATING.getStack()));
BuildcraftRecipeRegistry.integrationTable.addRecipe(new GateExpansionRecipe("buildcraft:expansionQuartz",
GateExpansionTimer.INSTANCE, Chipset.QUARTZ.getStack()));
BuildcraftRecipeRegistry.integrationTable.addRecipe(new GateExpansionRecipe("buildcraft:expansionComp",
GateExpansionRedstoneFader.INSTANCE, Chipset.COMP.getStack()));
// FACADE
BuildcraftRecipeRegistry.integrationTable.addRecipe(new AdvancedFacadeRecipe("buildcraft:advancedFacade"));
}

View file

@ -13,9 +13,12 @@ import net.minecraft.client.renderer.texture.IIconRegister;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.statements.IActionInternal;
import buildcraft.api.statements.IStatementContainer;
import buildcraft.api.statements.IStatementParameter;
import buildcraft.api.statements.containers.IRedstoneStatementContainer;
import buildcraft.api.statements.containers.ISidedStatementContainer;
import buildcraft.core.lib.utils.StringUtils;
import buildcraft.transport.Gate;
@ -62,8 +65,12 @@ public class ActionRedstoneOutput extends BCStatement implements IActionInternal
@Override
public void actionActivate(IStatementContainer source,
IStatementParameter[] parameters) {
if (source instanceof Gate) {
((Gate) source).setRedstoneOutput(isSideOnly(parameters), getSignalLevel());
if (source instanceof IRedstoneStatementContainer) {
ForgeDirection side = ForgeDirection.UNKNOWN;
if (source instanceof ISidedStatementContainer && isSideOnly(parameters)) {
side = ((ISidedStatementContainer) source).getSide();
}
((IRedstoneStatementContainer) source).setRedstoneOutput(side, getSignalLevel());
}
}

View file

@ -21,6 +21,7 @@ import buildcraft.api.statements.IActionExternal;
import buildcraft.api.statements.IActionInternal;
import buildcraft.api.statements.IActionProvider;
import buildcraft.api.statements.IStatementContainer;
import buildcraft.api.statements.containers.IRedstoneStatementContainer;
import buildcraft.api.tiles.IControllable;
import buildcraft.api.transport.IPipeTile;
@ -30,7 +31,7 @@ public class DefaultActionProvider implements IActionProvider {
public Collection<IActionInternal> getInternalActions(IStatementContainer container) {
LinkedList<IActionInternal> res = new LinkedList<IActionInternal>();
if (container.getTile() instanceof IPipeTile) {
if (container instanceof IRedstoneStatementContainer) {
res.add(BuildCraftCore.actionRedstone);
}

View file

@ -22,6 +22,7 @@ import buildcraft.api.statements.IStatementContainer;
import buildcraft.api.statements.ITriggerExternal;
import buildcraft.api.statements.ITriggerInternal;
import buildcraft.api.statements.ITriggerProvider;
import buildcraft.api.statements.containers.IRedstoneStatementContainer;
import buildcraft.api.tiles.IHasWork;
public class DefaultTriggerProvider implements ITriggerProvider {
@ -65,6 +66,11 @@ public class DefaultTriggerProvider implements ITriggerProvider {
public LinkedList<ITriggerInternal> getInternalTriggers(IStatementContainer container) {
LinkedList<ITriggerInternal> res = new LinkedList<ITriggerInternal>();
if (container instanceof IRedstoneStatementContainer) {
res.add(BuildCraftCore.triggerRedstoneActive);
res.add(BuildCraftCore.triggerRedstoneInactive);
}
if (TriggerEnergy.isTriggeringPipe(container.getTile()) || TriggerEnergy.getTriggeringNeighbor(container.getTile()) != null) {
res.add((ITriggerInternal) BuildCraftCore.triggerEnergyHigh);
res.add((ITriggerInternal) BuildCraftCore.triggerEnergyLow);

View file

@ -10,10 +10,13 @@ package buildcraft.core.statements;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.gates.IGate;
import buildcraft.api.statements.IStatementContainer;
import buildcraft.api.statements.IStatementParameter;
import buildcraft.api.statements.ITriggerInternal;
import buildcraft.api.statements.containers.IRedstoneStatementContainer;
import buildcraft.api.statements.containers.ISidedStatementContainer;
import buildcraft.core.lib.utils.StringUtils;
import buildcraft.transport.TileGenericPipe;
@ -49,18 +52,18 @@ public class TriggerRedstoneInput extends BCStatement implements ITriggerInterna
@Override
public boolean isTriggerActive(IStatementContainer container, IStatementParameter[] parameters) {
if (!(container.getTile() instanceof TileGenericPipe)) {
return false;
}
TileGenericPipe tile = (TileGenericPipe) container.getTile();
int level = tile.redstoneInput;
if (container instanceof IRedstoneStatementContainer) {
int level = ((IRedstoneStatementContainer) container).getRedstoneInput(ForgeDirection.UNKNOWN);
if (parameters.length > 0 && parameters[0] instanceof StatementParameterRedstoneGateSideOnly &&
((StatementParameterRedstoneGateSideOnly) parameters[0]).isOn) {
level = tile.redstoneInputSide[((IGate) container).getSide().ordinal()];
((StatementParameterRedstoneGateSideOnly) parameters[0]).isOn &&
container instanceof ISidedStatementContainer) {
level = ((IRedstoneStatementContainer) container).getRedstoneInput(((ISidedStatementContainer) container).getSide());
}
return active ? level > 0 : level == 0;
} else {
return false;
}
}
@Override

View file

@ -13,7 +13,7 @@ import net.minecraft.item.ItemStack;
import buildcraft.BuildCraftRobotics;
import buildcraft.api.recipes.CraftingResult;
import buildcraft.silicon.TileIntegrationTable;
import buildcraft.transport.recipes.IntegrationTableRecipe;
import buildcraft.silicon.recipes.IntegrationTableRecipe;
public class RobotIntegrationRecipe extends IntegrationTableRecipe {

View file

@ -15,6 +15,7 @@ import cofh.api.energy.IEnergyReceiver;
import buildcraft.BuildCraftRobotics;
import buildcraft.BuildCraftTransport;
import buildcraft.api.core.render.ITextureStates;
import buildcraft.api.robots.IDockingStationPluggable;
import buildcraft.api.robots.RobotManager;
import buildcraft.api.tiles.IDebuggable;
import buildcraft.api.transport.IPipe;
@ -26,7 +27,8 @@ import buildcraft.core.lib.utils.MatrixTranformations;
import buildcraft.transport.PipeIconProvider;
import buildcraft.transport.TileGenericPipe;
public class RobotStationPluggable extends PipePluggable implements IPipePluggableItem, IEnergyReceiver, IDebuggable {
public class RobotStationPluggable extends PipePluggable implements IPipePluggableItem, IEnergyReceiver, IDebuggable,
IDockingStationPluggable {
public class RobotStationPluggableRenderer implements IPipePluggableRenderer {
private float zFightOffset = 1 / 4096.0F;
@ -175,6 +177,7 @@ public class RobotStationPluggable extends PipePluggable implements IPipePluggab
return new ItemStack[] { new ItemStack(BuildCraftRobotics.robotStationItem) };
}
@Override
public DockingStation getStation() {
return station;
}

View file

@ -6,7 +6,7 @@
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.transport.recipes;
package buildcraft.silicon.recipes;
import net.minecraft.item.ItemStack;

View file

@ -31,8 +31,9 @@ import buildcraft.api.gates.IGateExpansion;
import buildcraft.api.statements.IActionExternal;
import buildcraft.api.statements.IActionInternal;
import buildcraft.api.statements.IActionReceptor;
import buildcraft.api.statements.containers.IRedstoneStatementContainer;
import buildcraft.api.statements.containers.ISidedStatementContainer;
import buildcraft.api.statements.IStatement;
import buildcraft.api.statements.IStatementContainer;
import buildcraft.api.statements.IStatementParameter;
import buildcraft.api.statements.ITriggerExternal;
import buildcraft.api.statements.ITriggerInternal;
@ -48,7 +49,7 @@ import buildcraft.transport.gates.StatementSlot;
import buildcraft.transport.gui.ContainerGateInterface;
import buildcraft.transport.statements.ActionValve;
public final class Gate implements IGate, IStatementContainer {
public final class Gate implements IGate, ISidedStatementContainer, IRedstoneStatementContainer {
public static int MAX_STATEMENTS = 8;
public static int MAX_PARAMETERS = 3;
@ -641,4 +642,19 @@ public final class Gate implements IGate, IStatementContainer {
public TileEntity getTile() {
return pipe.container;
}
@Override
public int getRedstoneInput(ForgeDirection side) {
return side == ForgeDirection.UNKNOWN ? pipe.container.redstoneInput : pipe.container.redstoneInputSide[side.ordinal()];
}
@Override
public boolean setRedstoneOutput(ForgeDirection side, int value) {
if (side != this.getSide() && side != ForgeDirection.UNKNOWN) {
return false;
}
setRedstoneOutput(side != ForgeDirection.UNKNOWN, value);
return true;
}
}

View file

@ -253,10 +253,6 @@ public class PipeTransportItems extends PipeTransport implements IDebuggable {
private void moveSolids() {
items.flush();
if (!container.getWorldObj().isRemote) {
items.purgeCorruptedItems();
}
items.iterating = true;
for (TravelingItem item : items) {
if (item.getContainer() != this.container) {
@ -270,6 +266,11 @@ public class PipeTransportItems extends PipeTransport implements IDebuggable {
item.movePosition(motion.x, motion.y, motion.z);
if ((item.toCenter && middleReached(item)) || outOfBounds(item)) {
if (item.isCorrupted()) {
items.remove(item);
continue;
}
item.toCenter = false;
// Reajusting to the middle
@ -285,6 +286,11 @@ public class PipeTransportItems extends PipeTransport implements IDebuggable {
}
} else if (!item.toCenter && endReached(item)) {
if (item.isCorrupted()) {
items.remove(item);
continue;
}
TileEntity tile = container.getTile(item.output);
PipeEventItem.ReachedEnd event = new PipeEventItem.ReachedEnd(item, tile);

View file

@ -44,9 +44,6 @@ public class PipeTriggerProvider implements ITriggerProvider {
}
}
result.add(BuildCraftCore.triggerRedstoneActive);
result.add(BuildCraftCore.triggerRedstoneInactive);
switch (((TileGenericPipe) tile).getPipeType()) {
case ITEM:
result.add(TriggerPipeContents.PipeContents.empty.trigger);

View file

@ -21,7 +21,7 @@ public class TravelerSet extends ForwardingSet<TravelingItem> {
public boolean iterating;
private final BiMap<Integer, TravelingItem> items = HashBiMap.create();
private final Set<TravelingItem> items = new HashSet<TravelingItem>();
private final Set<TravelingItem> toLoad = new HashSet<TravelingItem>();
private final Set<TravelingItem> toAdd = new HashSet<TravelingItem>();
private final Set<TravelingItem> toRemove = new HashSet<TravelingItem>();
@ -34,7 +34,7 @@ public class TravelerSet extends ForwardingSet<TravelingItem> {
@Override
protected Set<TravelingItem> delegate() {
return items.values();
return items;
}
@Override
@ -42,11 +42,8 @@ public class TravelerSet extends ForwardingSet<TravelingItem> {
if (iterating) {
return toAdd.add(item);
}
if (items.containsValue(item)) {
return false;
}
item.setContainer(transport.container);
items.put(item.id, item);
items.add(item);
return true;
}
@ -76,10 +73,6 @@ public class TravelerSet extends ForwardingSet<TravelingItem> {
throw new UnsupportedOperationException();
}
public TravelingItem get(int id) {
return items.get(id);
}
void scheduleLoad(TravelingItem item) {
delay = 10;
toLoad.add(item);
@ -108,20 +101,10 @@ public class TravelerSet extends ForwardingSet<TravelingItem> {
}
void removeScheduledItems() {
items.values().removeAll(toRemove);
items.removeAll(toRemove);
toRemove.clear();
}
void purgeCorruptedItems() {
Iterator<TravelingItem> it = items.values().iterator();
while (it.hasNext()) {
TravelingItem item = it.next();
if (item.isCorrupted()) {
it.remove();
}
}
}
void flush() {
loadScheduledItems();
addScheduledItems();
@ -130,7 +113,7 @@ public class TravelerSet extends ForwardingSet<TravelingItem> {
@Override
public Iterator<TravelingItem> iterator() {
return items.values().iterator();
return items.iterator();
}
@Override

View file

@ -285,9 +285,7 @@ public class TravelingItem {
@Override
public int hashCode() {
int hash = 7;
hash = 67 * hash + this.id;
return hash;
return this.id;
}
@Override

View file

@ -0,0 +1,46 @@
/**
* Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.transport.gates;
import java.util.Arrays;
import java.util.List;
import net.minecraft.tileentity.TileEntity;
import buildcraft.BuildCraftTransport;
import buildcraft.api.gates.GateExpansionController;
import buildcraft.api.gates.IGateExpansion;
import buildcraft.api.statements.IActionInternal;
import buildcraft.api.statements.ITriggerInternal;
public final class GateExpansionLightSensor extends GateExpansionBuildcraft implements IGateExpansion {
public static GateExpansionLightSensor INSTANCE = new GateExpansionLightSensor();
private GateExpansionLightSensor() {
super("light_sensor");
}
@Override
public GateExpansionController makeController(TileEntity pipeTile) {
return new GateExpansionControllerLightSensor(pipeTile);
}
private class GateExpansionControllerLightSensor extends GateExpansionController {
public GateExpansionControllerLightSensor(TileEntity pipeTile) {
super(GateExpansionLightSensor.this, pipeTile);
}
@Override
public void addTriggers(List<ITriggerInternal> list) {
super.addTriggers(list);
list.add(BuildCraftTransport.triggerLightSensorBright);
list.add(BuildCraftTransport.triggerLightSensorDark);
}
}
}

View file

@ -37,6 +37,7 @@ import buildcraft.api.statements.StatementManager;
import buildcraft.api.transport.IPipe;
import buildcraft.api.transport.pluggable.IPipePluggableItem;
import buildcraft.api.transport.pluggable.PipePluggable;
import buildcraft.core.BCCreativeTab;
import buildcraft.core.lib.items.ItemBuildCraft;
import buildcraft.core.lib.inventory.InvUtils;
import buildcraft.core.lib.utils.StringUtils;
@ -50,12 +51,14 @@ public class ItemGate extends ItemBuildCraft implements IPipePluggableItem {
protected static final String NBT_TAG_MAT = "mat";
protected static final String NBT_TAG_LOGIC = "logic";
protected static final String NBT_TAG_EX = "ex";
private static ArrayList<ItemStack> allGates;
public ItemGate() {
super();
setHasSubtypes(false);
setMaxDamage(0);
setPassSneakClick(true);
setCreativeTab(BCCreativeTab.get("gates"));
}
private static NBTTagCompound getNBT(ItemStack stack) {
@ -207,22 +210,6 @@ public class ItemGate extends ItemBuildCraft implements IPipePluggableItem {
}
}
public static ItemStack[] getGateVarients() {
ArrayList<ItemStack> gates = new ArrayList<ItemStack>();
for (GateMaterial material : GateMaterial.VALUES) {
for (GateLogic logic : GateLogic.VALUES) {
if (material == GateMaterial.REDSTONE && logic == GateLogic.OR) {
continue;
}
gates.add(makeGateItem(material, logic));
}
}
return gates.toArray(new ItemStack[gates.size()]);
}
@Override
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean adv) {
super.addInformation(stack, player, list, adv);
@ -269,4 +256,20 @@ public class ItemGate extends ItemBuildCraft implements IPipePluggableItem {
return new GatePluggable(GateFactory.makeGate(realPipe, stack, side));
}
public static ArrayList<ItemStack> getAllGates() {
if (allGates == null) {
allGates = new ArrayList<ItemStack>();
for (GateDefinition.GateMaterial m : GateDefinition.GateMaterial.VALUES) {
for (GateDefinition.GateLogic l : GateDefinition.GateLogic.VALUES) {
if (m == GateMaterial.REDSTONE && l == GateLogic.OR) {
continue;
}
allGates.add(ItemGate.makeGateItem(m, l));
}
}
}
return allGates;
}
}

View file

@ -131,7 +131,11 @@ public class PipeItemsEmerald extends PipeItemsWood implements ISerializable, IG
}
if (doRemove) {
int stackSize = (int) Math.floor(battery.useEnergy(10, 10 * stack.stackSize, false) / 10);
int maxStackSize = stack.stackSize;
int stackSize = Math.min(maxStackSize, battery.getEnergyStored() / 10);
speedMultiplier = Math.min(4.0F, battery.getEnergyStored() * 10 / stackSize);
int energyUsed = (int) (stackSize * 10 * speedMultiplier);
battery.useEnergy(energyUsed, energyUsed, false);
stack = inventory.decrStackSize(k, stackSize);
}
@ -165,6 +169,9 @@ public class PipeItemsEmerald extends PipeItemsWood implements ISerializable, IG
// In Round Robin mode, extract only 1 item regardless of power level.
stack = inventory.decrStackSize(i, 1);
incrementFilter();
} else {
stack = stack.copy();
stack.stackSize = 1;
}
return new ItemStack[]{ stack };

View file

@ -35,10 +35,11 @@ import buildcraft.transport.PipeTransportItems;
import buildcraft.transport.TravelingItem;
public class PipeItemsWood extends Pipe<PipeTransportItems> implements IEnergyHandler {
protected RFBattery battery = new RFBattery(640, 80, 0);
protected RFBattery battery = new RFBattery(2560, 2560 / 8, 0);
protected int standardIconIndex = PipeIconProvider.TYPE.PipeItemsWood_Standard.ordinal();
protected int solidIconIndex = PipeIconProvider.TYPE.PipeAllWood_Solid.ordinal();
protected float speedMultiplier = 1.0F;
private int ticksSincePull = 0;
@ -114,17 +115,42 @@ public class PipeItemsWood extends Pipe<PipeTransportItems> implements IEnergyHa
battery.setEnergy(0);
ticksSincePull = 0;
speedMultiplier = 1.0F;
}
}
private boolean shouldTick() {
if (battery.getEnergyStored() >= 64 * 10) {
return true;
if (ticksSincePull < 8) {
return false;
} else {
return ticksSincePull >= 16 && battery.getEnergyStored() >= 10;
// Check if we have just enough energy for the next stack.
int meta = container.getBlockMetadata();
if (meta <= 5) {
ForgeDirection side = ForgeDirection.getOrientation(meta);
TileEntity tile = container.getTile(side);
if (tile instanceof IInventory) {
int stackSize = 0;
IInventory inventory = (IInventory) tile;
ItemStack[] extracted = checkExtract(inventory, false, side.getOpposite());
if (extracted != null) {
for (ItemStack s : extracted) {
stackSize += s.stackSize;
}
}
if (battery.getEnergyStored() >= stackSize * 10) {
return true;
}
}
}
}
return ticksSincePull >= 16 && battery.getEnergyStored() >= 10;
}
private void extractItems() {
int meta = container.getBlockMetadata();
@ -157,7 +183,7 @@ public class PipeItemsWood extends Pipe<PipeTransportItems> implements IEnergyHa
entityPos.moveForwards(0.6);
TravelingItem entity = makeItem(entityPos.x, entityPos.y, entityPos.z, stack);
entity.setSpeed(entity.getSpeed() * speedMultiplier);
transport.injectItem(entity, entityPos.orientation);
}
}
@ -197,7 +223,11 @@ public class PipeItemsWood extends Pipe<PipeTransportItems> implements IEnergyHa
if (slot != null && slot.stackSize > 0 && inventory.canExtractItem(k, slot, from.ordinal())) {
if (doRemove) {
int stackSize = (int) Math.floor(battery.useEnergy(10, slot.stackSize * 10, false) / 10);
int maxStackSize = slot.stackSize;
int stackSize = Math.min(maxStackSize, battery.getEnergyStored() / 10);
speedMultiplier = Math.min(4.0F, battery.getEnergyStored() * 10 / stackSize);
int energyUsed = (int) (stackSize * 10 * speedMultiplier);
battery.useEnergy(energyUsed, energyUsed, false);
return inventory.decrStackSize(k, stackSize);
} else {

View file

@ -20,6 +20,7 @@ import buildcraft.api.recipes.CraftingResult;
import buildcraft.api.transport.PipeWire;
import buildcraft.silicon.ItemRedstoneChipset;
import buildcraft.silicon.TileIntegrationTable;
import buildcraft.silicon.recipes.IntegrationTableRecipe;
import buildcraft.transport.ItemFacade;
import buildcraft.transport.ItemFacade.FacadeState;
import buildcraft.transport.ItemPipeWire;

View file

@ -8,6 +8,8 @@
*/
package buildcraft.transport.recipes;
import java.util.ArrayList;
import java.util.Collection;
import net.minecraft.item.ItemStack;
import buildcraft.BuildCraftTransport;
@ -15,6 +17,7 @@ import buildcraft.api.gates.IGateExpansion;
import buildcraft.api.recipes.CraftingResult;
import buildcraft.core.lib.inventory.StackHelper;
import buildcraft.silicon.TileIntegrationTable;
import buildcraft.silicon.recipes.IntegrationTableRecipe;
import buildcraft.transport.gates.ItemGate;
public class GateExpansionRecipe extends IntegrationTableRecipe {
@ -68,4 +71,26 @@ public class GateExpansionRecipe extends IntegrationTableRecipe {
return result;
}
@Override
public Collection<Object> getInputs() {
ArrayList<Object> inputs = new ArrayList<Object>();
inputs.add(ItemGate.getAllGates());
inputs.add(chipset);
return inputs;
}
/*@Override
public Collection<Object> getOutput() {
ArrayList<Object> gates = new ArrayList<Object>();
for (ItemStack stack : ItemGate.getAllGates()) {
ItemStack newStack = stack.copy();
ItemGate.addGateExpansion(stack, expansion);
gates.add(newStack);
}
return gates;
}*/
}

View file

@ -8,6 +8,8 @@
*/
package buildcraft.transport.recipes;
import java.util.ArrayList;
import java.util.Collection;
import net.minecraft.item.ItemStack;
import buildcraft.BuildCraftTransport;
@ -15,6 +17,7 @@ import buildcraft.api.recipes.CraftingResult;
import buildcraft.core.lib.inventory.StackHelper;
import buildcraft.silicon.ItemRedstoneChipset;
import buildcraft.silicon.TileIntegrationTable;
import buildcraft.silicon.recipes.IntegrationTableRecipe;
import buildcraft.transport.gates.GateDefinition.GateLogic;
import buildcraft.transport.gates.GateDefinition.GateMaterial;
import buildcraft.transport.gates.ItemGate;
@ -53,4 +56,14 @@ public class GateLogicSwapRecipe extends IntegrationTableRecipe {
return result;
}
@Override
public Collection<Object> getInputs() {
ArrayList<Object> inputs = new ArrayList<Object>();
inputs.add(ItemGate.getAllGates());
inputs.add(ItemRedstoneChipset.Chipset.RED.getStack());
return inputs;
}
}

View file

@ -796,7 +796,7 @@ public class PipeRendererTESR extends TileEntitySpecialRenderer {
Position motion = new Position(0, 0, 0, item.toCenter ? item.input : item.output);
motion.moveForwards(item.getSpeed() * f);
doRenderItem(item, x + item.xCoord - pipe.container.xCoord + motion.x,y + item.yCoord - pipe.container.yCoord, z + item.zCoord - pipe.container.zCoord, light, item.color);
doRenderItem(item, x + item.xCoord - pipe.container.xCoord + motion.x, y + item.yCoord - pipe.container.yCoord + motion.y, z + item.zCoord - pipe.container.zCoord + motion.z, light, item.color);
count++;
}

View file

@ -0,0 +1,49 @@
package buildcraft.transport.statements;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.tileentity.TileEntity;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import buildcraft.api.core.Position;
import buildcraft.api.statements.containers.ISidedStatementContainer;
import buildcraft.api.statements.IStatementContainer;
import buildcraft.api.statements.IStatementParameter;
import buildcraft.api.statements.ITriggerInternal;
import buildcraft.core.lib.utils.StringUtils;
import buildcraft.core.statements.BCStatement;
/**
* Created by asie on 3/14/15.
*/
public class TriggerLightSensor extends BCStatement implements ITriggerInternal {
private final boolean bright;
public TriggerLightSensor(boolean bright) {
super("buildcraft:light_" + (bright ? "bright" : "dark"));
this.bright = bright;
}
@Override
public String getDescription() {
return StringUtils.localize("gate.trigger.light." + (bright ? "bright" : "dark"));
}
@Override
public boolean isTriggerActive(IStatementContainer source, IStatementParameter[] parameters) {
TileEntity tile = source.getTile();
Position pos = new Position(tile);
pos.orientation = ((ISidedStatementContainer) source).getSide();
pos.moveForwards(1.0);
int lightLevel = tile.getWorldObj().getBlockLightValue((int) pos.x, (int) pos.y, (int) pos.z);
return (lightLevel < 8) ^ bright;
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister iconRegister) {
icon = iconRegister.registerIcon("buildcrafttransport:triggers/trigger_light_" + (bright ? "bright" : "dark"));
}
}