示例#1
0
        public override string GetPopupText()
        {
            if (Input.GetButton("Interact"))
            {
                if (Input.GetKey(KeyCode.LeftShift))
                {
                    chosen = null;
                }
                else
                {
                    chosen = getCurrentHotBarItem();
                }
                if (carriedItems.Count == 0)
                {
                    headTo = null;
                }
                mbHoloPreviewDirty = true;
                lastInteracted     = null;
            }

            string ret = getFriendlyName() + "\nCurrently holding " + getStoredItemsCount() + " / " + maxItems + " items";

            ret += "\nDrone carrying " + getCarriedItemCount() + " / " + maxItems + " items";
            if (mcm == null)
            {
                ret += "\nLooking for a module to connect to";
            }
            else
            {
                ret += "\nConnected to " + mcm.manager.modules.Count + " sized module group";
            }
            ret += "\nDrone Speed: " + droneSpeed + ", Batch Size " + batch;

            if (chosen != null)
            {
                ret += "\nLooking for " + chosen.GetDisplayString();
            }
            else
            {
                ret += "\nInteract with me with an item in your hotbar for me to grab it";
            }

            return(ret);
        }
示例#2
0
        public MassCrateModule provideCratePickup(ItemBase item, MassGiver giver, int amount)
        {
            float           dist = 99999999999;
            MassCrateModule ret  = null;

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

            foreach (MassCrateModule mcm in modules)
            {
                if (mcm.AttemptGiveItem(item, amount, false))
                {
                    float tdist = calcDist(mcm, taker);
                    if (tdist < dist)
                    {
                        ret  = mcm;
                        dist = tdist;
                    }
                }
            }
            return(ret);
        }
示例#4
0
        public List <MassCrateModule> floodFillFun(MassCrateModule start)
        {
            // Make sure we start of correct
            for (int i = 0; i < modules.Count; ++i)
            {
                modules[i].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];

                for (int i = 0; i < m.neighbors.Count; ++i)
                {
                    MassCrateModule n = m.neighbors[i];
                    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);
        }
示例#5
0
        public MassCrateModule provideCratePickup(ItemBase item, MassGiver giver, int amount)
        {
            float           dist = float.MaxValue;
            MassCrateModule ret  = null;

            for (int i = 0; i < modules.Count; ++i)  // MassCrateModule mcm in modules) {
            {
                if (modules[i].shouldSkip())
                {
                    continue;
                }
                MassCrateModule mcm = modules[i];
                if (mcm.AttemptTakeItem(item, amount, false) != null)
                {
                    float tdist = calcDist(mcm, giver);
                    if (tdist < dist)
                    {
                        ret  = mcm;
                        dist = tdist;
                    }
                }
            }
            return(ret);
        }
示例#6
0
        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...");
            }
        }
示例#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;
            }

            if (getStoredItemsCount() > 0)
            {
                ItemBase item = TakeAnyItem();
                if (item != null)
                {
                    if (!this.GiveToSurrounding(item))
                    {
                        items.Insert(0, item);
                    }
                }
            }
        }
示例#8
0
        public override void LowFrequencyUpdate()
        {
            if (mcm == null)
            {
                LookForAttachedModules();
            }

            if (getStoredItemsCount() < maxItems)
            {
                VicisMod.log(getPrefix(), "Attempting to get item from surroundings");
                ItemBase item = this.TakeFromSurrounding();
                if (item != null)
                {
                    VicisMod.log(getPrefix(), "Got a " + item.GetDisplayString());
                    addItem(item);
                }
            }

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

            if (items.Count == 0 && carriedItems.Count == 0)
            {
                return;
            }

            if (mcm != null && items.Count > 0 && headTo == null)
            {
                if (items[0] == null)
                {
                    items.RemoveAt(0);
                    return;
                }
                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)
            {
                if (carriedItems[0] == null)
                {
                    carriedItems.RemoveAt(0);
                    return;
                }
                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;
            }
        }
示例#9
0
 public void RemoveNeighbor(MassCrateModule mcm)
 {
     neighbors.Remove(mcm);
 }