Skip to content

Commit

Permalink
major builder improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
asiekierka committed Oct 6, 2015
1 parent 4e38f7e commit 69e2934
Show file tree
Hide file tree
Showing 8 changed files with 200 additions and 65 deletions.
5 changes: 5 additions & 0 deletions buildcraft_resources/changelog/7.1.9
@@ -1,3 +1,8 @@
Improvements:

* Builder "Needed" list now shows exact amount of required blocks on hover (asie)
* More Builder optimizations (asie)

Bugs fixed:

* [#3056] PipeTransportFluids crash (asie)
Expand Down
3 changes: 3 additions & 0 deletions common/buildcraft/BuildCraftBuilders.java
Expand Up @@ -75,6 +75,7 @@
import buildcraft.builders.BlueprintServerDatabase;
import buildcraft.builders.BuilderProxy;
import buildcraft.builders.BuilderProxyClient;
import buildcraft.builders.BuilderTooltipHandler;
import buildcraft.builders.BuildersGuiHandler;
import buildcraft.builders.HeuristicBlockDetection;
import buildcraft.builders.ItemBlueprintStandard;
Expand Down Expand Up @@ -344,6 +345,8 @@ public void postInit(FMLPostInitializationEvent evt) {
public void init(FMLInitializationEvent evt) {
NetworkRegistry.INSTANCE.registerGuiHandler(instance, new BuildersGuiHandler());

MinecraftForge.EVENT_BUS.register(new BuilderTooltipHandler());

// Standard blocks
ISchematicRegistry schemes = BuilderAPI.schematicRegistry;
schemes.registerSchematicBlock(Blocks.air, SchematicAir.class);
Expand Down
32 changes: 25 additions & 7 deletions common/buildcraft/BuildCraftCore.java
Expand Up @@ -94,6 +94,7 @@
import buildcraft.core.Version;
import buildcraft.core.blueprints.SchematicHelper;
import buildcraft.core.blueprints.SchematicRegistry;
import buildcraft.core.blueprints.BuildingSlotMapIterator;
import buildcraft.core.builders.patterns.FillerPattern;
import buildcraft.core.builders.patterns.FillerRegistry;
import buildcraft.core.builders.patterns.PatternBox;
Expand Down Expand Up @@ -195,6 +196,7 @@ public enum RenderMode {
public static boolean canEnginesExplode = false;
public static int itemLifespan = 1200;
public static int updateFactor = 10;
public static int builderMaxPerItemFactor = 1024;
public static long longUpdateFactor = 40;
public static BuildCraftConfiguration mainConfiguration;
public static ConfigManager mainConfigManager;
Expand Down Expand Up @@ -299,6 +301,8 @@ public void loadConfiguration(FMLPreInitializationEvent evt) {
mainConfigManager.getCat("debug").setShowInGui(false);
mainConfigManager.getCat("vars").setShowInGui(false);

mainConfigManager.register("general.builderMaxIterationsPerItemFactor", BuildCraftCore.builderMaxPerItemFactor, "Lower this number if BuildCraft builders/fillers are causing TPS lag. Raise it if you think they are being too slow.", ConfigManager.RestartRequirement.NONE);

mainConfigManager.register("general.miningBreaksPlayerProtectedBlocks", false, "Should BuildCraft miners be allowed to break blocks using player-specific protection?", ConfigManager.RestartRequirement.NONE);
mainConfigManager.register("general.updateCheck", true, "Should I check the BuildCraft version on startup?", ConfigManager.RestartRequirement.NONE);
mainConfigManager.register("display.hidePowerValues", false, "Should all power values (RF, RF/t) be hidden?", ConfigManager.RestartRequirement.NONE);
Expand Down Expand Up @@ -549,19 +553,30 @@ public void postInit(FMLPostInitializationEvent event) {
public void serverStarting(FMLServerStartingEvent event) {
event.registerServerCommand(commandBuildcraft);

/* Increase the builder speed in singleplayer mode.
Singleplayer users generally run far fewer of them. */

if (FMLCommonHandler.instance().getSide() == Side.CLIENT) {
BuildingSlotMapIterator.MAX_PER_ITEM = builderMaxPerItemFactor * 4;
} else {
BuildingSlotMapIterator.MAX_PER_ITEM = builderMaxPerItemFactor;
}

if (Utils.CAULDRON_DETECTED) {
BCLog.logger.warn("############################################");
BCLog.logger.warn("# #");
BCLog.logger.warn("# Cauldron has been detected! Please keep #");
BCLog.logger.warn("# in mind that BuildCraft does NOT support #");
BCLog.logger.warn("# Cauldron and we do not promise to fix #");
BCLog.logger.warn("# bugs caused by its modifications to the #");
BCLog.logger.warn("# Minecraft engine. Please reconsider. #");
BCLog.logger.warn("# in mind that BuildCraft may NOT provide #");
BCLog.logger.warn("# support to Cauldron users, as the mod is #");
BCLog.logger.warn("# primarily tested without Bukkit/Spigot's #");
BCLog.logger.warn("# changes to the Minecraft internals. #");
BCLog.logger.warn("# #");
BCLog.logger.warn("# Any lag caused by BuildCraft on top of #");
BCLog.logger.warn("# Cauldron likely arises from our fixes to #");
BCLog.logger.warn("# their bugs, so please don't report that #");
BCLog.logger.warn("# either. Thanks for your attention! ~BC #");
BCLog.logger.warn("# Cauldron likely arises from workarounds #");
BCLog.logger.warn("# which we apply to make sure BuildCraft #");
BCLog.logger.warn("# works properly with Cauldron installed. #");
BCLog.logger.warn("# #");
BCLog.logger.warn("# Thanks for your attention! ~ BC devs #");
BCLog.logger.warn("# #");
BCLog.logger.warn("############################################");

Expand Down Expand Up @@ -617,6 +632,7 @@ public void reloadConfig(ConfigManager.RestartRequirement restartType) {
} else if (restartType == ConfigManager.RestartRequirement.WORLD) {
reloadConfig(ConfigManager.RestartRequirement.NONE);
} else {
builderMaxPerItemFactor = mainConfigManager.get("general.builderMaxIterationsPerItemFactor").getInt();
hideFluidNumbers = mainConfigManager.get("display.hideFluidValues").getBoolean();
hidePowerNumbers = mainConfigManager.get("display.hidePowerValues").getBoolean();
itemLifespan = mainConfigManager.get("general.itemLifespan").getInt();
Expand All @@ -625,6 +641,8 @@ public void reloadConfig(ConfigManager.RestartRequirement restartType) {
miningMultiplier = (float) mainConfigManager.get("power.miningUsageMultiplier").getDouble();
miningAllowPlayerProtectedBlocks = mainConfigManager.get("general.miningBreaksPlayerProtectedBlocks").getBoolean();

BuildingSlotMapIterator.MAX_PER_ITEM = builderMaxPerItemFactor;

if (mainConfigManager.get("general.updateCheck").getBoolean(true)) {
Version.check();
}
Expand Down
35 changes: 35 additions & 0 deletions common/buildcraft/builders/BuilderTooltipHandler.java
@@ -0,0 +1,35 @@
package buildcraft.builders;

import java.util.List;

import net.minecraft.util.EnumChatFormatting;

import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.event.entity.player.ItemTooltipEvent;

import buildcraft.builders.gui.ContainerBuilder;
import buildcraft.core.blueprints.RequirementItemStack;

/**
* Created by asie on 10/6/15.
*/
public class BuilderTooltipHandler {
@SubscribeEvent
public void itemTooltipEvent(ItemTooltipEvent event) {
if (event.itemStack != null && event.entityPlayer != null && event.entityPlayer.openContainer != null
&& event.entityPlayer.openContainer instanceof ContainerBuilder) {
ContainerBuilder containerBuilder = (ContainerBuilder) event.entityPlayer.openContainer;
TileBuilder builder = containerBuilder.getBuilder();
if (builder != null) {
List<RequirementItemStack> needs = builder.getNeededItems();
if (needs != null) {
for (RequirementItemStack ris : needs) {
if (ris.stack == event.itemStack) {
event.toolTip.add(EnumChatFormatting.GRAY + "" + EnumChatFormatting.ITALIC + "Needed: " + ris.size);
}
}
}
}
}
}
}
49 changes: 31 additions & 18 deletions common/buildcraft/builders/TileBuilder.java
Expand Up @@ -39,6 +39,7 @@
import buildcraft.api.core.IInvSlot;
import buildcraft.api.core.IPathProvider;
import buildcraft.api.core.Position;
import buildcraft.api.core.SafeTimeTracker;
import buildcraft.api.robots.IRequestProvider;
import buildcraft.api.tiles.IControllable;
import buildcraft.api.tiles.IHasWork;
Expand Down Expand Up @@ -80,6 +81,9 @@ public class TileBuilder extends TileAbstractBuilder implements IHasWork, IFluid
};
public TankManager<Tank> fluidTank = new TankManager<Tank>(fluidTanks);

private SafeTimeTracker networkUpdateTracker = new SafeTimeTracker(BuildCraftCore.updateFactor / 2);
private boolean shouldUpdateRequirements;

private SimpleInventory inv = new SimpleInventory(28, "Builder", 64);
private BptBuilderBase currentBuilder;
private RecursiveBlueprintBuilder recursiveBuilder;
Expand Down Expand Up @@ -216,7 +220,6 @@ public void initialize() {
return;
}


if (initNBT != null) {
iterateBpt(true);

Expand Down Expand Up @@ -262,7 +265,6 @@ public void initialize() {

if (path != null && pathLasers.size() == 0) {
createLasersForPath();

sendNetworkUpdate();
}

Expand Down Expand Up @@ -333,7 +335,7 @@ public void iterateBpt(boolean forceIterate) {
currentPathIterator = null;
}

updateRequirements();
scheduleRequirementUpdate();

sendNetworkUpdate();

Expand Down Expand Up @@ -373,13 +375,13 @@ public void iterateBpt(boolean forceIterate) {
done = false;
}

updateRequirements();
scheduleRequirementUpdate();
} else {
if (currentBuilder != null && currentBuilder.isDone(this)) {
currentBuilder.postProcessing(worldObj);
currentBuilder = recursiveBuilder.nextBuilder();

updateRequirements();
scheduleRequirementUpdate();
} else {
BlueprintBase bpt = instanciateBlueprint();

Expand All @@ -389,7 +391,7 @@ public void iterateBpt(boolean forceIterate) {

currentBuilder = recursiveBuilder.nextBuilder();

updateRequirements();
scheduleRequirementUpdate();
}
}

Expand Down Expand Up @@ -572,6 +574,11 @@ public void updateEntity() {
return;
}

if (shouldUpdateRequirements && networkUpdateTracker.markTimeIfDelay(worldObj)) {
updateRequirements();
shouldUpdateRequirements = false;
}

if ((currentBuilder == null || currentBuilder.isDone(this))
&& box.isInitialized()) {
box.reset();
Expand All @@ -591,7 +598,7 @@ public void updateEntity() {
}

if (!isBuilding && this.isBuildingBlueprint()) {
updateRequirements();
scheduleRequirementUpdate();
}
isBuilding = this.isBuildingBlueprint();

Expand All @@ -612,7 +619,7 @@ public boolean isBuildingBlueprint() {
}

public List<RequirementItemStack> getNeededItems() {
return requiredToBuild;
return worldObj.isRemote ? requiredToBuild : (currentBuilder instanceof BptBuilderBlueprint ? ((BptBuilderBlueprint) currentBuilder).getNeededItems() : null);
}

@Override
Expand Down Expand Up @@ -716,28 +723,32 @@ public AxisAlignedBB getRenderBoundingBox() {
public void build() {
if (currentBuilder != null) {
if (currentBuilder.buildNextSlot(worldObj, this, xCoord, yCoord, zCoord)) {
updateRequirements();
scheduleRequirementUpdate();
}
}
}

public void updateRequirements() {
private void updateRequirements() {
List<RequirementItemStack> reqCopy = null;
if (currentBuilder instanceof BptBuilderBlueprint) {
currentBuilder.initialize();
reqCopy = ((BptBuilderBlueprint) currentBuilder).neededItems;
reqCopy = ((BptBuilderBlueprint) currentBuilder).getNeededItems();
}

for (EntityPlayer p : guiWatchers) {
BuildCraftCore.instance.sendToPlayer(p, getItemRequirementsPacket(reqCopy));
}
}

public void updateRequirements(EntityPlayer caller) {
public void scheduleRequirementUpdate() {
shouldUpdateRequirements = true;
}

public void updateRequirementsOnGuiOpen(EntityPlayer caller) {
List<RequirementItemStack> reqCopy = null;
if (currentBuilder instanceof BptBuilderBlueprint) {
currentBuilder.initialize();
reqCopy = ((BptBuilderBlueprint) currentBuilder).neededItems;
reqCopy = ((BptBuilderBlueprint) currentBuilder).getNeededItems();
}

BuildCraftCore.instance.sendToPlayer(caller, getItemRequirementsPacket(reqCopy));
Expand Down Expand Up @@ -830,7 +841,7 @@ public int getRequestsCount() {
} else {
BptBuilderBlueprint bpt = (BptBuilderBlueprint) currentBuilder;

return bpt.neededItems.size();
return bpt.getNeededItems().size();
}
}

Expand All @@ -842,12 +853,13 @@ public ItemStack getRequest(int slot) {
return null;
} else {
BptBuilderBlueprint bpt = (BptBuilderBlueprint) currentBuilder;
List<RequirementItemStack> neededItems = bpt.getNeededItems();

if (bpt.neededItems.size() <= slot) {
if (neededItems.size() <= slot) {
return null;
}

RequirementItemStack requirement = bpt.neededItems.get(slot);
RequirementItemStack requirement = neededItems.get(slot);

int qty = quantityMissing(requirement.stack, requirement.size);

Expand All @@ -868,12 +880,13 @@ public ItemStack offerItem(int slot, ItemStack stack) {
return stack;
} else {
BptBuilderBlueprint bpt = (BptBuilderBlueprint) currentBuilder;
List<RequirementItemStack> neededItems = bpt.getNeededItems();

if (bpt.neededItems.size() <= slot) {
if (neededItems.size() <= slot) {
return stack;
}

RequirementItemStack requirement = bpt.neededItems.get(slot);
RequirementItemStack requirement = neededItems.get(slot);

int qty = quantityMissing(requirement.stack, requirement.size);

Expand Down
6 changes: 5 additions & 1 deletion common/buildcraft/builders/gui/ContainerBuilder.java
Expand Up @@ -52,11 +52,15 @@ public ContainerBuilder(IInventory playerInventory, TileBuilder builder) {
if (!builder.getWorldObj().isRemote && playerInventory instanceof InventoryPlayer) {
// Refresh the requirements list for the player opening the GUI,
// in case he does not have it.
builder.updateRequirements(((InventoryPlayer) playerInventory).player);
builder.updateRequirementsOnGuiOpen(((InventoryPlayer) playerInventory).player);
builder.addGuiWatcher(((InventoryPlayer) playerInventory).player);
}
}

public TileBuilder getBuilder() {
return builder;
}

@Override
public void onContainerClosed(EntityPlayer player) {
super.onContainerClosed(player);
Expand Down

0 comments on commit 69e2934

Please sign in to comment.