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); }
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(); }
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(); }