From e0fc1ca8f6aee3ef4690a307c68ed8a47dcfd6b3 Mon Sep 17 00:00:00 2001 From: Robert Date: Sun, 22 Dec 2013 03:59:30 -0500 Subject: [PATCH] fix pathfiner, add gui textures --- .../assets/darkcore/textures/gui/GuiGrey.png | Bin 0 -> 815 bytes .../assets/darkcore/textures/gui/gui@.png | Bin 0 -> 18675 bytes .../assets/darkcore/textures/gui/gui_base.png | Bin 0 -> 12582 bytes .../darkcore/textures/gui/gui_button.png | Bin 0 -> 5625 bytes .../darkcore/textures/gui/gui_empty.png | Bin 0 -> 3479 bytes .../assets/darkcore/textures/gui/gui_grey.png | Bin 0 -> 978 bytes .../darkcore/textures/gui/gui_message_box.png | Bin 0 -> 875 bytes .../prefab/TileEntityEnergyMachine.java | 16 +- .../prefab/invgui/GuiInvMachineBase.java | 9 - .../minecraft/tilenetwork/IPathCallBack.java | 25 +++ .../minecraft/tilenetwork/Pathfinder.java | 79 ++++++++ .../tilenetwork/PathfinderAStar.java | 175 ++++++++++++++++++ .../tilenetwork/prefab/NetworkPathFinder.java | 4 +- .../prefab/NetworkTileEntities.java | 2 +- 14 files changed, 297 insertions(+), 13 deletions(-) create mode 100644 resources/assets/darkcore/textures/gui/GuiGrey.png create mode 100644 resources/assets/darkcore/textures/gui/gui@.png create mode 100644 resources/assets/darkcore/textures/gui/gui_base.png create mode 100644 resources/assets/darkcore/textures/gui/gui_button.png create mode 100644 resources/assets/darkcore/textures/gui/gui_empty.png create mode 100644 resources/assets/darkcore/textures/gui/gui_grey.png create mode 100644 resources/assets/darkcore/textures/gui/gui_message_box.png delete mode 100644 src/com/builtbroken/minecraft/prefab/invgui/GuiInvMachineBase.java create mode 100644 src/com/builtbroken/minecraft/tilenetwork/IPathCallBack.java create mode 100644 src/com/builtbroken/minecraft/tilenetwork/Pathfinder.java create mode 100644 src/com/builtbroken/minecraft/tilenetwork/PathfinderAStar.java diff --git a/resources/assets/darkcore/textures/gui/GuiGrey.png b/resources/assets/darkcore/textures/gui/GuiGrey.png new file mode 100644 index 0000000000000000000000000000000000000000..ce04479798a110bccd035238bcc1668110037bb0 GIT binary patch literal 815 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6&6|H(?D8gCb z5n0T@z;^_M8K-LVNdpDhOFVsD+3&K7i|}#0(S0q>z`(S})5S5Q;?~<62RRQL@U#W4 zESdFYvF6_X>w)|WFI3+Zn*80*^8W(<$#33ubeuTznOSe$?#o=+HusOmhh9tIo_SMg zL&oWjfYwL1yu}6Xokqz}#jC{|m- literal 0 HcmV?d00001 diff --git a/resources/assets/darkcore/textures/gui/gui@.png b/resources/assets/darkcore/textures/gui/gui@.png new file mode 100644 index 0000000000000000000000000000000000000000..6c22f449189cda61204aa23484d0dae196d118a6 GIT binary patch literal 18675 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 literal 0 HcmV?d00001 diff --git a/resources/assets/darkcore/textures/gui/gui_base.png b/resources/assets/darkcore/textures/gui/gui_base.png new file mode 100644 index 0000000000000000000000000000000000000000..7c84c09d565b329ab872fb9fe20a52a49cce3b85 GIT binary patch literal 12582 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 QG&m1^Z4<33sAI&x0Grs1g#Z8m literal 0 HcmV?d00001 diff --git a/resources/assets/darkcore/textures/gui/gui_grey.png b/resources/assets/darkcore/textures/gui/gui_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..aa9b68bd50bc638be8514be403b7d664b7dbbaf8 GIT binary patch literal 978 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6&6|H(?D8gCb z5n0T@z;_UY8Fx&~ehU<2FY)wsWxvZJ$ttI)!uIVQ0|Rrsr;B4q#jUq@4`x1g5NUY0 z{HSklO#AwMzuy`0Xt|VntU9z+W4eZ*lTn<|jj8v(J1VHCv>$x`{mc=y&>CsxZwqJH zz5M;}dVOW=^-Qr(CcOVGX4RJ&{S7rer);3Pw5HaM=kTlZ(}Es-tT^(sX4?e8kHS{oO8;n&p$ovcPx^d%d0EKx13I-3tze&NZBn#ezS4d3=YO7l{*U0sUp)KG{#<{3m5<@uw!QIo ztM?1{JYAYF?V&gWpEP6s4?%`WZU;VaGkESb{!_+%KZdDD<2~P}FQ4x3|0!wBU@_tO z=b8UjC@?IU`f}TS!3O73U)Jvd#v>yG3xfcI0~Q80F+9o%O9?P|GcYl5FeorIFi?v@ zJ(J)r!Zh;3c@y7c!Mcl@N~>0_I=1h(~Q^e@*eaKIK eHv_Fe0fYQD=gSH4+VA&(tnhU8b6Mw<&;$S?{2bB% literal 0 HcmV?d00001 diff --git a/resources/assets/darkcore/textures/gui/gui_message_box.png b/resources/assets/darkcore/textures/gui/gui_message_box.png new file mode 100644 index 0000000000000000000000000000000000000000..72d97cbc91d56c904d31a059ebc336e0972527f9 GIT binary patch literal 875 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6&6|H(?D8gCb z5n0T@z;^_M8K-LVNdpDhOFVsD+3#}8acK)~F@3X;fr06Vr;B4q#jUq@H})QK5NNwt z@3*eYZpG==9QoIqo-sL0xUK&1bG6_ST(F(Iy?+ Q9~pqa)78&qol`;+0GE}tvj6}9 literal 0 HcmV?d00001 diff --git a/src/com/builtbroken/minecraft/prefab/TileEntityEnergyMachine.java b/src/com/builtbroken/minecraft/prefab/TileEntityEnergyMachine.java index 307431515..ff5d56ed6 100644 --- a/src/com/builtbroken/minecraft/prefab/TileEntityEnergyMachine.java +++ b/src/com/builtbroken/minecraft/prefab/TileEntityEnergyMachine.java @@ -10,8 +10,11 @@ import net.minecraft.nbt.NBTTagFloat; import net.minecraft.nbt.NBTTagLong; import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.oredict.OreDictionary; +import universalelectricity.api.CompatibilityModule; import universalelectricity.api.energy.IEnergyContainer; import universalelectricity.api.energy.IEnergyInterface; +import universalelectricity.api.vector.Vector3; +import universalelectricity.api.vector.VectorHelper; import com.builtbroken.minecraft.interfaces.IPowerLess; @@ -103,7 +106,7 @@ public abstract class TileEntityEnergyMachine extends TileEntityMachine implemen @Override public long onReceiveEnergy(ForgeDirection from, long receive, boolean doReceive) { - if (!this.runPowerLess() && receive > 0 && this.canConnect(from)) + if (!this.runPowerLess() && receive > 0 && this.getInputDirections().contains(from)) { long prevEnergyStored = this.getEnergy(from); long newStoredEnergy = Math.min(this.getEnergy(from) + receive, this.getEnergyCapacity(from)); @@ -151,6 +154,17 @@ public abstract class TileEntityEnergyMachine extends TileEntityMachine implemen return 0; } + protected void produce() + { + for (ForgeDirection direction : this.getOutputDirections()) + { + if (this.onExtractEnergy(direction.getOpposite(), CompatibilityModule.receiveEnergy(VectorHelper.getTileEntityFromSide(this.worldObj, new Vector3(this), direction), direction, this.onExtractEnergy(direction.getOpposite(), this.JOULES_PER_TICK, false), true), true) > 0) + { + break; + } + } + } + /* ******************************************** * Electricity connection logic ***********************************************/ diff --git a/src/com/builtbroken/minecraft/prefab/invgui/GuiInvMachineBase.java b/src/com/builtbroken/minecraft/prefab/invgui/GuiInvMachineBase.java deleted file mode 100644 index 78add6eac..000000000 --- a/src/com/builtbroken/minecraft/prefab/invgui/GuiInvMachineBase.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.builtbroken.minecraft.prefab.invgui; - -/** Same as the GuiMachineBase but supports inventory pages - * - * @author DarkGuardsman */ -public class GuiInvMachineBase -{ - -} diff --git a/src/com/builtbroken/minecraft/tilenetwork/IPathCallBack.java b/src/com/builtbroken/minecraft/tilenetwork/IPathCallBack.java new file mode 100644 index 000000000..ecfcfd4cf --- /dev/null +++ b/src/com/builtbroken/minecraft/tilenetwork/IPathCallBack.java @@ -0,0 +1,25 @@ +package com.builtbroken.minecraft.tilenetwork; + +import java.util.Set; + +import universalelectricity.api.vector.Vector3; + +public interface IPathCallBack +{ + /** + * @param finder - The Pathfinder object. + * @param currentNode - The node being iterated through. + * @return A set of nodes connected to the currentNode. Essentially one should return a set of + * neighboring nodes. + */ + public Set getConnectedNodes(Pathfinder finder, Vector3 currentNode); + + /** + * Called when looping through nodes. + * + * @param finder - The Pathfinder. + * @param node - The node being searched. + * @return True to stop the path finding operation. + */ + public boolean onSearch(Pathfinder finder, Vector3 node); +} \ No newline at end of file diff --git a/src/com/builtbroken/minecraft/tilenetwork/Pathfinder.java b/src/com/builtbroken/minecraft/tilenetwork/Pathfinder.java new file mode 100644 index 000000000..c66d151ce --- /dev/null +++ b/src/com/builtbroken/minecraft/tilenetwork/Pathfinder.java @@ -0,0 +1,79 @@ +package com.builtbroken.minecraft.tilenetwork; + +import java.util.HashSet; +import java.util.Set; + +import universalelectricity.api.vector.Vector3; + +/** + * A class that allows flexible pathfinding for different positions. Compared to AStar pathfinding, + * this version is faster but does not calculated the most optimal path. + * + * @author Calclavia + * + */ +public class Pathfinder +{ + /** + * A pathfinding call back interface used to call back on paths. + */ + public IPathCallBack callBackCheck; + + /** + * A list of nodes that the pathfinder already went through. + */ + public Set closedSet; + + /** + * The resulted path found by the pathfinder. Could be null if no path was found. + */ + public Set results; + + public Pathfinder(IPathCallBack callBack) + { + this.callBackCheck = callBack; + this.reset(); + } + + /** + * @return True on success finding, false on failure. + */ + public boolean findNodes(Vector3 currentNode) + { + this.closedSet.add(currentNode); + + if (this.callBackCheck.onSearch(this, currentNode)) + { + return false; + } + + for (Vector3 node : this.callBackCheck.getConnectedNodes(this, currentNode)) + { + if (!this.closedSet.contains(node)) + { + if (this.findNodes(node)) + { + return true; + } + } + } + + return false; + } + + /** + * Called to execute the pathfinding operation. + */ + public Pathfinder init(Vector3 startNode) + { + this.findNodes(startNode); + return this; + } + + public Pathfinder reset() + { + this.closedSet = new HashSet(); + this.results = new HashSet(); + return this; + } +} diff --git a/src/com/builtbroken/minecraft/tilenetwork/PathfinderAStar.java b/src/com/builtbroken/minecraft/tilenetwork/PathfinderAStar.java new file mode 100644 index 000000000..cb31aa5e7 --- /dev/null +++ b/src/com/builtbroken/minecraft/tilenetwork/PathfinderAStar.java @@ -0,0 +1,175 @@ +package com.builtbroken.minecraft.tilenetwork; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; + +import net.minecraftforge.common.ForgeDirection; +import universalelectricity.api.vector.Vector3; + +/** + * An advanced version of pathfinding to find the shortest path between two points. Uses the A* + * Pathfinding algorithm. + * + * @author Calclavia + * + */ +public class PathfinderAStar extends Pathfinder +{ + /** + * A pathfinding call back interface used to call back on paths. + */ + public IPathCallBack callBackCheck; + + /** + * The set of tentative nodes to be evaluated, initially containing the start node + */ + public Set openSet; + + /** + * The map of navigated nodes storing the data of which position came from which in the format + * of: X came from Y. + */ + public HashMap navigationMap; + + /** + * Score values, used to determine the score for a path to evaluate how optimal the path is. + * G-Score is the cost along the best known path while F-Score is the total cost. + */ + public HashMap gScore, fScore; + + /** + * The node in which the pathfinder is trying to reach. + */ + public Vector3 goal; + + public PathfinderAStar(IPathCallBack callBack, Vector3 goal) + { + super(callBack); + this.goal = goal; + } + + @Override + public boolean findNodes(Vector3 start) + { + this.openSet.add(start); + this.gScore.put(start, 0d); + this.fScore.put(start, this.gScore.get(start) + getHeuristicEstimatedCost(start, this.goal)); + + while (!this.openSet.isEmpty()) + { + // Current is the node in openset having the lowest f_score[] value + Vector3 currentNode = null; + + double lowestFScore = 0; + + for (Vector3 node : this.openSet) + { + if (currentNode == null || this.fScore.get(node) < lowestFScore) + { + currentNode = node; + lowestFScore = this.fScore.get(node); + } + } + + if (currentNode == null) + { + break; + } + + if (this.callBackCheck.onSearch(this, currentNode)) + { + return false; + } + + if (currentNode.equals(this.goal)) + { + this.results = reconstructPath(this.navigationMap, goal); + return true; + } + + this.openSet.remove(currentNode); + this.closedSet.add(currentNode); + + for (Vector3 neighbor : getNeighborNodes(currentNode)) + { + double tentativeGScore = this.gScore.get(currentNode) + currentNode.distance(neighbor); + + if (this.closedSet.contains(neighbor)) + { + if (tentativeGScore >= this.gScore.get(neighbor)) + { + continue; + } + } + + if (!this.openSet.contains(neighbor) || tentativeGScore < this.gScore.get(neighbor)) + { + this.navigationMap.put(neighbor, currentNode); + this.gScore.put(neighbor, tentativeGScore); + this.fScore.put(neighbor, gScore.get(neighbor) + getHeuristicEstimatedCost(neighbor, goal)); + this.openSet.add(neighbor); + } + } + } + + return false; + } + + @Override + public Pathfinder reset() + { + this.openSet = new HashSet(); + this.navigationMap = new HashMap(); + return super.reset(); + } + + /** + * A recursive function to back track and find the path in which we have analyzed. + */ + public Set reconstructPath(HashMap nagivationMap, Vector3 current_node) + { + Set path = new HashSet(); + path.add(current_node); + + if (nagivationMap.containsKey(current_node)) + { + path.addAll(reconstructPath(nagivationMap, nagivationMap.get(current_node))); + return path; + } + else + { + return path; + } + } + + /** + * @return An estimated cost between two points. + */ + public double getHeuristicEstimatedCost(Vector3 start, Vector3 goal) + { + return start.distance(goal); + } + + /** + * @return A Set of neighboring Vector3 positions. + */ + public Set getNeighborNodes(Vector3 vector) + { + if (this.callBackCheck != null) + { + return this.callBackCheck.getConnectedNodes(this, vector); + } + else + { + Set neighbors = new HashSet(); + + for (int i = 0; i < 6; i++) + { + neighbors.add(vector.clone().modifyPositionFromSide(ForgeDirection.getOrientation(i))); + } + + return neighbors; + } + } +} diff --git a/src/com/builtbroken/minecraft/tilenetwork/prefab/NetworkPathFinder.java b/src/com/builtbroken/minecraft/tilenetwork/prefab/NetworkPathFinder.java index bb25b757b..ac433bab2 100644 --- a/src/com/builtbroken/minecraft/tilenetwork/prefab/NetworkPathFinder.java +++ b/src/com/builtbroken/minecraft/tilenetwork/prefab/NetworkPathFinder.java @@ -6,10 +6,10 @@ import java.util.Set; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import universalelectricity.api.vector.Vector3; -import universalelectricity.core.path.IPathCallBack; -import universalelectricity.core.path.Pathfinder; import com.builtbroken.minecraft.tilenetwork.INetworkPart; +import com.builtbroken.minecraft.tilenetwork.IPathCallBack; +import com.builtbroken.minecraft.tilenetwork.Pathfinder; /** Check if a conductor connects with another. */ public class NetworkPathFinder extends Pathfinder diff --git a/src/com/builtbroken/minecraft/tilenetwork/prefab/NetworkTileEntities.java b/src/com/builtbroken/minecraft/tilenetwork/prefab/NetworkTileEntities.java index f0b89b79f..4d1d98421 100644 --- a/src/com/builtbroken/minecraft/tilenetwork/prefab/NetworkTileEntities.java +++ b/src/com/builtbroken/minecraft/tilenetwork/prefab/NetworkTileEntities.java @@ -9,10 +9,10 @@ import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.VectorHelper; -import universalelectricity.core.path.Pathfinder; import com.builtbroken.minecraft.tilenetwork.INetworkPart; import com.builtbroken.minecraft.tilenetwork.ITileNetwork; +import com.builtbroken.minecraft.tilenetwork.Pathfinder; public class NetworkTileEntities implements ITileNetwork {