Esempio n. 1
0
        public MechanicalNetworkOld createAndRegisterNetwork(IMechanicalPowerNetworkNode originatorNode)
        {
            MechanicalNetworkOld network = createAndRegisterNetwork();

            network.register(originatorNode);
            network.firstPowerNode = originatorNode.getPosition();

            return(network);
        }
Esempio n. 2
0
        public void rediscoverNetwork(IWorldAccessor world)
        {
            //	System.out.println("rediscovering networks");
            BlockEntity te = world.BlockAccessor.GetBlockEntity(firstPowerNode);

            if (te is IMechanicalPowerNetworkNode)
            {
                //	System.out.println("go");
                IMechanicalPowerNetworkNode node = (IMechanicalPowerNetworkNode)te;
                node.propagateNetworkToNeighbours(myManager.getUniquePropagationId(), networkId, node.getOutputSideForNetworkPropagation());
            }

            //System.out.println("rediscovery complete, found " + powerNodes.size() + " power nodes");
        }
Esempio n. 3
0
 public void forkMechanicalNetwork(IMechanicalPowerNetworkNode powernode, BlockFacing facing)
 {
     powernode.createMechanicalNetwork(this, facing);
 }
Esempio n. 4
0
        public void rebuildNetwork()
        {
            //System.out.println("rebuilding network");

            foreach (IMechanicalPowerDevice device in powerRelays)
            {
                if (device != null)
                {
                    device.clearNetwork();
                }
            }

            if (powerNodes.Count == 0)
            {
                //System.out.println("no more power nodes in the network :(");
                return;
            }
            IMechanicalPowerNetworkNode firstNode = powerNodes[0];
            Dictionary <IMechanicalPowerNetworkNode, BlockFacing> otherNodes = new Dictionary <IMechanicalPowerNetworkNode, BlockFacing>();


            foreach (IMechanicalPowerNetworkNode powernode in powerNodes)
            {
                if (powernode != null && firstNode != powernode)
                {
                    otherNodes[powernode] = powernode.getFacing(this);
                    powernode.clearNetwork();
                }
            }

            if (firstNode == null)
            {
                //System.out.println("node is null");
                return;
            }

            powerNodes.Clear();
            powerRelays.Clear();

            firstNode.propagateNetworkToNeighbours(
                myManager.getUniquePropagationId(),
                networkId,
                firstNode.getOutputSideForNetworkPropagation()
                );


            // Whatever power nodes are now not in the current network now need to have the current network forked for them
            foreach (IMechanicalPowerNetworkNode otherNode in otherNodes.Keys)
            {
                bool found = false;
                foreach (MechanicalNetwork network in otherNode.getNetworks())
                {
                    if (network.networkId == networkId)
                    {
                        found = true;
                    }
                }
                if (!found)
                {
                    //System.out.println("forked network");
                    forkMechanicalNetwork(otherNode, otherNodes[otherNode]);
                }
            }

            //System.out.println("total networks in game: " + myManager.networksById.size());
        }
Esempio n. 5
0
        // Should run every 5 ticks or so
        public void updateNetwork()
        {
            /* 1. Verify network */

            IMechanicalPowerNetworkNode[] powernodesArray = powerNodes.ToArray();
            foreach (IMechanicalPowerNetworkNode node in powernodesArray)
            {
                if (!node.exists())
                {
                    unregister(node);
                }
            }
            if (powerNodes.Count == 0)
            {
                isDead = true;
                return;
            }



            /* 2. Determine total available torque and total resistance of the network */

            totalAvailableTorque = 0;
            totalResistance      = 0;

            IMechanicalPowerNetworkNode dominantNode = null;


            foreach (IMechanicalPowerNetworkNode powerNode in powerNodes)
            {
                totalAvailableTorque += powerNode.getTorque(this);
                totalResistance      += powerNode.getResistance(this);

                if (dominantNode == null || powerNode.getTorque(this) > dominantNode.getTorque(this))
                {
                    dominantNode = powerNode;
                }
            }
            directionFromFacing = dominantNode.getDirectionFromFacing();



            /* 3. Unconsumed torque changes the network speed */

            // Positive free torque => increase speed until maxSpeed
            // Negative free torque => decrease speed until -maxSpeed
            // No free torque => lower speed until 0

            float unusedTorque = Math.Abs(totalAvailableTorque) - totalResistance;
            int   speedChange  = (totalAvailableTorque > 0) ? 1 : -1;

            if (unusedTorque <= 0)
            {
                speedChange = 0;
            }

            /*if (networkId == 6) {
             *  System.out.println("unusedTorque: " + unusedTorque + " / speedChange: " + speedChange);
             * }*/

            // TODO: This step value should be determined by the total system drag
            float step = 0.75f;

            switch (speedChange)
            {
            case 1:
                speed = speed + step;
                break;

            case -1:
                speed = speed - step;
                break;

            case 0:
                if (speed > 0)
                {
                    speed = Math.Max(0, speed - step);
                }
                if (speed < 0)
                {
                    speed = Math.Max(0, speed + step);
                }
                break;
            }



            /* 4. Set direction, also did the direction change? Propagate it through the network */

            int olddirection = direction;

            direction = (int)Math.Sign(speed);

            if (olddirection != direction)
            {
                //System.out.println("=====propagate direction to neighbours");
                foreach (IMechanicalPowerNetworkNode powerNode in powerNodes)
                {
                    // FIXME: This assumes there is only 1 power producer per network
                    if (powerNode.getTorque(this) > 0)
                    {
                        powerNode.propagateDirectionToNeightbours(
                            myManager.getUniquePropagationId(),
                            powerNode.getOutputSideForNetworkPropagation(),
                            direction > 0
                            );
                        break;
                    }
                }
            }
        }