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); }
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); }
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); }
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); }
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); }
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 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); } } } }
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; } }
public void RemoveNeighbor(MassCrateModule mcm) { neighbors.Remove(mcm); }