public MassCrateModule provideCratePickup(ItemBase item, MassGiver giver, int amount)
    {
        float           dist = 999999999;
        MassCrateModule ret  = null;

        foreach (MassCrateModule mcm in modules.Keys)
        {
            if (mcm.AttemptTakeItem(item, amount, false) != null)
            {
                float tdist = calcDist(mcm, giver);
                if (tdist < dist)
                {
                    ret  = mcm;
                    dist = tdist;
                }
            }
        }
        return(ret);
    }
    public MassCrateModule provideCrateDropoff(ItemBase item, MassTaker taker, int amount)
    {
        float           dist = 999999999;
        MassCrateModule ret  = null;

        foreach (MassCrateModule mcm in modules.Keys)
        {
            if (mcm.AttemptGiveItem(item, amount, false))
            {
                float tdist = calcDist(mcm, taker);
                if (tdist < dist)
                {
                    ret  = mcm;
                    dist = tdist;
                }
            }
        }
        return(ret);
    }
    public List <MassCrateModule> floodFillFun(MassCrateModule start)
    {
        // Make sure we start of correct
        foreach (MassCrateModule m in modules.Keys)
        {
            m.ping = false;
        }

        // We've already pinged this guy.
        start.ping = true;

        List <MassCrateModule> floodFillResults = new List <MassCrateModule>();
        List <MassCrateModule> floodFill        = new List <MassCrateModule>();

        floodFill.Add(start);
        VicisMod.log(LOGGER_PREFIX, "Starting floodfill with " + floodFill.Count + " guy");
        while (floodFill.Count > 0)
        {
            MassCrateModule m = floodFill[0];

            foreach (MassCrateModule n in m.neighbors)
            {
                if (n.ping)
                {
                    continue;
                }
                n.ping = true;
                floodFill.Add(n);
            }
            floodFillResults.Add(m);
            floodFill.RemoveAt(0);

            VicisMod.log(LOGGER_PREFIX, "Now have " + floodFill.Count + " things to check and " + floodFillResults.Count + " results");
        }
        VicisMod.log(LOGGER_PREFIX, "Returning " + floodFillResults.Count + " results");
        return(floodFillResults);
    }
    public void Remove(MassCrateModule mcm)
    {
        modules.Remove(mcm);

        if (modules.Count == 0)
        {
            VicisMod.log(LOGGER_PREFIX, "I'm All Alone. Goodbye.");
            return;
        }

        // Nothing elso to do
        if (mcm.neighbors.Count == 0)
        {
            return;
        }

        // Need to figure out if we need to split into two groups...
        VicisMod.log(LOGGER_PREFIX, "Getting ready for floodfill");
        List <List <MassCrateModule> > groups    = new List <List <MassCrateModule> >();
        List <MassCrateModule>         neighbors = mcm.neighbors;

        foreach (MassCrateModule neighbor in neighbors)
        {
            bool cont = false;
            foreach (List <MassCrateModule> group in groups)
            {
                if (group.Contains(neighbor))
                {
                    cont = true;
                    break;
                }
            }
            if (cont)
            {
                continue;
            }
            List <MassCrateModule> floodFillResults = floodFillFun(neighbor);
            groups.Add(floodFillResults);
        }

        // We found only one group, don't need to spin off any more managers!
        if (groups.Count == 1 && groups[0].Count == modules.Count)
        {
            return;
        }
        if (groups.Count == 1)
        {
            VicisMod.log(LOGGER_PREFIX, "Found one group, but it has " + groups[0].Count + " crates and I know of " + modules.Count + " crates. What?");
            return;
        }

        VicisMod.log(LOGGER_PREFIX, "I'm now the lord of " + groups[0].Count + " modules (hopefully after I create the other managers");

        // Ok, now we need to create new managers for the extra groups.
        // First, remove the results from current modules
        for (int i = 1; i < groups.Count; ++i)
        {
            VicisMod.log(LOGGER_PREFIX, "Removing " + groups[i].Count + " from old from modules");
            foreach (MassCrateModule m in groups[i])
            {
                modules.Remove(m);
            }
            MassCrateModuleManager newManager = new MassCrateModuleManager();
            newManager.AddAll(groups[i]);
        }

        VicisMod.log(LOGGER_PREFIX, "I'm now the lord of " + modules.Count + " modules, really!");

        if (modules.Count == 0)
        {
            VicisMod.log(LOGGER_PREFIX, "Somehow, I have no more modules...");
        }
    }
    //public Dictionary<ushort, Dictionary<ushort, MassCrateModule>> locations = new Dictionary<ushort, Dictionary<ushort, MassCrateModule>>();

    public void Add(MassCrateModule mcm)
    {
        modules.Add(mcm, mcm);
        mcm.manager = this;
    }
 public void RemoveNeighbor(MassCrateModule mcm)
 {
     neighbors.Remove(mcm);
 }
Exemple #7
0
    public override void LowFrequencyUpdate()
    {
        if (mcm == null)
        {
            LookForAttachedModules();
        }

        if (chosen == null)
        {
            return;
        }

        if (mcm != null && chosen != null && headTo == null && carriedItems.Count == 0)
        {
            VicisMod.log(getPrefix(), "LFU Trying to find new target crate");
            headTo = mcm.manager.provideCratePickup(chosen, this, batch);
            if (headTo != null)
            {
                lastInteracted = headTo;
            }
        }

        if (headTo != null && carriedItems.Count == 0)
        {
            float dist = (drone.getPos() - targetCoords).magnitude;
            VicisMod.log(getPrefix(), "LFU Drone is at " + drone.getPos() + ", dist = " + dist);
            if (dist <= 0.05f)
            {
                VicisMod.log(getPrefix(), "LFU Attempting to pick up item");
                if (AttemptTakeItem())
                {
                    MarkDirtyDelayed();
                    return;
                }
                else if (getStoredItemsCount() == 0)
                {
                    // Well darn, someone picked this up before us. Better restart
                    headTo       = null;
                    targetCoords = Vector3.zero;
                }
            }
        }

        if (headTo != null && carriedItems.Count > 0)
        {
            VicisMod.log(getPrefix(), "LFU Carrying something, resetting headTo and targetCoords");
            headTo       = null;
            targetCoords = Vector3.zero;
        }

        if (headTo == null && carriedItems.Count > 0)
        {
            float dist = (drone.getPos() - mUnityDroneRestPos).magnitude;
            VicisMod.log(getPrefix(), "LFU Drone is at " + drone.getPos() + ", dist = " + dist);
            if (dist <= 0.05f)
            {
                VicisMod.log(getPrefix(), "LFU Attempting to drop off item");
                FinishTakeItem();
                MarkDirtyDelayed();
            }
        }

        if (!linkedToGo)
        {
            droneLogic(LowFrequencyThread.mrPreviousUpdateTimeStep);
        }

        if (items.Count == 0)
        {
            return;
        }
        dropOffToConveyors();
    }
Exemple #8
0
    public override void LowFrequencyUpdate()
    {
        if (mcm == null)
        {
            LookForAttachedModules();
        }

        if (mcm != null && items.Count > 0 && headTo == null)
        {
            VicisMod.log(getPrefix(), "LFU trying to find place to drop off " + items[0].GetDisplayString());
            headTo = mcm.manager.provideCrateDropoff(items[0], this, getDropOffSize());
            if (headTo != null)
            {
                lastInteracted = headTo;
            }
        }

        if (headTo != null && carriedItems.Count == 0)
        {
            float dist = (drone.getPos() - mUnityDroneRestPos).magnitude;
            VicisMod.log(getPrefix(), "LFU Attempting to give item to drone, drone is at " + drone.getPos() + ", dist = " + dist);
            if (dist <= 0.05f)
            {
                if (AttemptGiveItem())
                {
                    MarkDirtyDelayed();
                    return;
                }
            }
        }

        if (headTo != null && carriedItems.Count > 0)
        {
            float dist = (drone.getPos() - targetCoords).magnitude;
            VicisMod.log(getPrefix(), "LFU drone is at " + drone.getPos() + ", dist = " + dist);
            if (dist <= 0.05f)
            {
                VicisMod.log(getPrefix(), "LFU Finalising drop off");
                if (!FinishGiveItem())
                {
                    // Dammit, the crate was filled before the drone got there. Recollect, try again.
                    items.Insert(0, carriedItems[0]);
                    carriedItems.RemoveAt(0);
                    if (carriedItems.Count == 0)
                    {
                        VicisMod.log(getPrefix(), "I'm still carrying something. What?");
                    }
                }
                else
                {
                    MarkDirtyDelayed();
                }
            }
        }

        if (headTo != null && carriedItems.Count == 0)
        {
            VicisMod.log(getPrefix(), "LFU resetting headTo and targetCoords");
            headTo       = null;
            targetCoords = Vector3.zero;
        }

        if (!linkedToGo)
        {
            droneLogic(LowFrequencyThread.mrPreviousUpdateTimeStep);
        }

        if (getStoredItemsCount() >= maxItems)
        {
            return;
        }

        VicisMod.log(getPrefix(), "Looking for ConveyorEntities");

        pickUpFromConveyors();
    }