private void SplitStockpileOnLeave(Players.Player player) { Stockpile player_Stockpile = Stockpile.GetStockPile(player); Stockpile fake_player_Stockpile = Stockpile.GetStockPile(fake_player); int split = playersOnTeam.Count + 1; player_Stockpile._items.Clear(); for (ushort item = 0; item < ItemTypes.IndexLookup.MaxRegistered; item++) { int amount = fake_player_Stockpile.AmountContained(item); amount = amount / split; if (amount > 0) { player_Stockpile.Add(item, amount); fake_player_Stockpile.TryRemove(item, amount); } } player.SendStockpileInventory(); fake_player.SendStockpileInventory(); }
// Run on add to world (also runs when added by game - ie: when a crop grows to the next stage) public void OnAddAction(Vector3Int position, ushort newType, Players.Player causedBy) { ushort num; // check if the block below is fertile if (World.TryGetTypeAt(position.Add(0, -1, 0), out num) && ItemTypes.IsFertile(num)) { CropManager.trackCrop(position, this); } else { // Tell the user you can't do this Pipliz.Chatting.Chat.Send(causedBy, string.Format("{0} can't grow here! It's not fertile!", ItemTypes.IndexLookup.GetName(newType))); // Get the air block, and replace the new crop with it ushort airBlockID = ItemTypes.IndexLookup.GetIndex("air"); ServerManager.TryChangeBlock(position, airBlockID); // Give the user the block Stockpile s = Stockpile.GetStockPile(causedBy); // Give them an item back? s.Add(newType, 1); // Update it? s.SendUpdate(); } }
/// <summary> /// INTERNAL /// From gives to items. /// </summary> /// <param name="from">The player sending the items.</param> /// <param name="to">The player recieving the items.</param> /// <param name="give">The ItemID of the item given.</param> /// <param name="giveamt">How many of the item given.</param> public static void tradeGive(Players.Player from, Players.Player to, ushort give, int giveamt) { Stockpile playerStockpile = Stockpile.GetStockPile(from); Stockpile partnerStockpile = Stockpile.GetStockPile(to); string name; bool legalIds = ItemTypes.IndexLookup.TryGetName(give, out name); if (!legalIds) { Chat.Send(from, "Invalid ID's"); return; } if (playerStockpile.AmountContained(give) <= giveamt) { Chat.Send(from, "You can't afford that."); return; } playerStockpile.Remove(give, giveamt); partnerStockpile.Add(give, giveamt); Chat.Send(from, "You sent " + giveamt + " " + name + " to " + to.Name + "."); Chat.Send(to, from.Name + " sent " + giveamt + " " + name + " to you."); }
/// <summary> /// INTERNAL /// From gives to items. /// </summary> /// <param name="from">The player sending the items.</param> /// <param name="to">The player recieving the items.</param> /// <param name="give">The ItemID of the item given.</param> /// <param name="giveamt">How many of the item given.</param> public static void tradeGive(Players.Player from, Players.Player to, ushort give, int giveamt) { if (getTradeEnabled()) { Stockpile playerStockpile = Stockpile.GetStockPile(from); Stockpile partnerStockpile = Stockpile.GetStockPile(to); string name; bool legalIds = ItemTypes.IndexLookup.TryGetName(give, out name); if (!legalIds) { Helpers.Chat.sendSilent(from, "Invalid ID's", Helpers.Chat.ChatColour.orange); return; } if (playerStockpile.AmountContained(give) <= giveamt) { Helpers.Chat.sendSilent(from, "You can't afford that.", Helpers.Chat.ChatColour.orange); return; } playerStockpile.Remove(give, giveamt); partnerStockpile.Add(give, giveamt); Helpers.Chat.sendSilent(from, "You sent " + giveamt + " " + name + " to " + to.Name + ".", Helpers.Chat.ChatColour.orange); Helpers.Chat.sendSilent(to, from.Name + " sent " + giveamt + " " + name + " to you.", Helpers.Chat.ChatColour.orange); } else { Helpers.Chat.sendSilent(from, "Trade Disabled.", Helpers.Chat.ChatColour.red); } }
private static void Process() { if (Time.SecondsSinceStartDouble - _lastUpdate <= _cooldown) { return; } _totalCounts.Clear(); if (Players.CountConnected <= 1) { return; } for (int p = 0; p < Players.CountConnected; p++) { Players.Player player = Players.GetConnectedByIndex(p); Stockpile stockpile = Stockpile.GetStockPile(player); for (int i = 0; i < stockpile.SpotCount; i++) { InventoryItem item = stockpile.GetByIndex(i); long count; if (_totalCounts.TryGetValue(item.Type, out count)) { count += item.Amount; } else { count = item.Amount; } _totalCounts[item.Type] = count; } stockpile._items.Clear(); } for (int p = 0; p < Players.CountConnected; p++) { Players.Player player = Players.GetConnectedByIndex(p); Stockpile stockpile = Stockpile.GetStockPile(player); for (int i = 0; i < _totalCounts.Count; i++) { ushort type = _totalCounts.GetKeyAtIndex(i); long totalCount = _totalCounts.GetValueAtIndex(i); int desiredCount = (int)(totalCount / Players.CountConnected); if (p == 0) { // give remainder to first guy in list desiredCount += (int)(totalCount % Players.CountConnected); } stockpile.Add(type, desiredCount); } } }
public static void Add(this Stockpile stockpile, IEnumerable <StoredItem> items) { if (items != null) { foreach (var item in items) { stockpile.Add(item.Id, item.Amount); } } }
/// <summary> /// INTERNAL /// Accepts the trade in player's current playerdata, set the items, and notify the users. /// </summary> /// <param name="player">The player who is accepting.</param> public static void acceptTrade(Players.Player player) { PlayerData pd = getPlayerData(player); if (pd.tradeData == null) { Chat.Send(Players.GetPlayer(player.ID), "You have no outstanding trade requests."); return; } PlayerData partnerData = pd.tradeData.partner; Stockpile playerStockpile = Stockpile.GetStockPile(Players.GetPlayer(player.ID)); Stockpile partnerStockpile; Stockpile.TryGetStockpile(Players.GetPlayer(partnerData.PID), out partnerStockpile); if (partnerStockpile != null) { if (partnerStockpile.AmountContained(pd.tradeData.giveId) <= pd.tradeData.giveAmount) { Chat.Send(player, "Your partner can't afford this trade. It will need to be remade."); Chat.Send(Players.GetPlayer(partnerData.PID), "You can't afford your trade with " + player.Name + ". Please get the required items and send another request."); rejectTrade(player, true); return; } if (playerStockpile.AmountContained(pd.tradeData.takeId) <= pd.tradeData.takeAmount) { Chat.Send(player, "You can't afford this trade. Please get the required items or reject the trade."); return; } playerStockpile.Remove(pd.tradeData.takeId, pd.tradeData.takeAmount); partnerStockpile.Remove(pd.tradeData.giveId, pd.tradeData.giveAmount); playerStockpile.Add(pd.tradeData.giveId, pd.tradeData.giveAmount); partnerStockpile.Add(pd.tradeData.takeId, pd.tradeData.takeAmount); } else { Chat.Send(player, "Your partner doesn't exist. Ignoring trade."); rejectTrade(player, true); return; } Chat.Send(player, "Trade Accepted."); Chat.Send(Players.GetPlayer(partnerData.PID), player.Name + " accepted your trade request."); pd.tradeData = null; partnerData.tradeData = null; playerDataDict[player.ID] = pd; playerDataDict[partnerData.PID] = partnerData; }
public static void SyncronizeStockpile(Players.Player player, Players.Player fake_player) { Stockpile player_Stockpile = Stockpile.GetStockPile(player); Stockpile fake_player_Stockpile = Stockpile.GetStockPile(fake_player); for (ushort item = 0; item < ItemTypes.IndexLookup.MaxRegistered; item++) { int amount = player_Stockpile.AmountContained(item); if (amount > 0) { fake_player_Stockpile.Add(item, amount); player_Stockpile.TryRemove(item, amount); } } }
private bool ProcessCreative(Players.Player id, string chatItem) { if (PermissionsManager.CheckAndWarnPermission(id, "cheats.creative")) { // get their stockpile Stockpile s = Stockpile.GetStockPile(id); foreach (string itemname in Classes.Managers.TypeManager.CreativeAddedTypes) { ushort i = ItemTypes.IndexLookup.GetIndex(itemname); s.Add(i, 10000); } Chat.Send(id, "Enabled Creative Mode", ChatSenderType.Server); } return(true); }
override protected bool RunCommand(Players.Player ply, string[] args, NetworkID target) { if (PermissionsManager.CheckAndWarnPermission(ply, "cheats.creative")) { // get their stockpile Stockpile s = Stockpile.GetStockPile(ply); foreach (string itemname in ColonyAPI.Managers.TypeManager.CreativeAddedTypes) { ushort i = ItemTypes.IndexLookup.GetIndex(itemname); s.Add(i, 10000); } ColonyAPI.Helpers.Chat.sendSilent(ply, "Enabled Creative Mode", ColonyAPI.Helpers.Chat.ChatColour.lime); } ColonyAPI.Helpers.Utilities.WriteLog("ColonyPlusPlus-Utilities", ply.Name + " attempted to use /creative"); return(true); }
public static void GetBestArmorForNPC(Stockpile stockpile, NPCBase npc, SettlerInventory inv, int limit) { foreach (ArmorSlot slot in ArmorSlotEnum) { if (!inv.Armor[slot].IsEmpty() && ArmorLookup[inv.Armor[slot].Id].IsMagical) { continue; } var bestArmor = GetBestArmorFromStockpile(stockpile, slot, limit); if (bestArmor != default(ushort)) { if (!inv.Armor.ContainsKey(slot)) { inv.Armor.Add(slot, new ItemState()); } // Check if we need one or if there is an upgrade. if (inv.Armor[slot].IsEmpty()) { stockpile.TryRemove(bestArmor); inv.Armor[slot].Id = bestArmor; inv.Armor[slot].Durability = ArmorLookup[bestArmor].Durability; } else { var currentArmor = ArmorLookup[inv.Armor[slot].Id]; var stockpileArmor = ArmorLookup[bestArmor]; if (stockpileArmor.ArmorRating > currentArmor.ArmorRating) { // Upgrade armor. stockpile.TryRemove(bestArmor); stockpile.Add(inv.Armor[slot].Id); inv.Armor[slot].Id = bestArmor; inv.Armor[slot].Durability = stockpileArmor.Durability; } } } } }
public override void Process(Worker worker) { MoveTo moveTo = worker.GetComponent <MoveTo>(); if (moveTo.reachedGoal) { if (!pickedUpMerchandise) { worker.GetComponent <Inventory>().Add(merchandise); pickedUpMerchandise = true; moveTo.SetGoal(stockpile.transform.position, 1); } else { Merchandise merchandise = worker.GetComponent <Inventory>().Remove(); stockpile.Add(merchandise); pickedUpMerchandise = false; Complete(); } } }
private bool GetBestWeapon() { bool hasItem = !_inv.Weapon.IsEmpty(); Items.WeaponMetadata bestWeapon = null; if (hasItem) { bestWeapon = Items.ItemFactory.WeaponLookup[_inv.Weapon.Id]; } foreach (var wep in Items.ItemFactory.WeaponLookup.Values) { if ((_stock.Contains(wep.ItemType.ItemIndex) && bestWeapon == null) || (_stock.Contains(wep.ItemType.ItemIndex) && bestWeapon != null && bestWeapon.Damage < wep.Damage)) { bestWeapon = wep; } } if ((bestWeapon != null && hasItem && _inv.Weapon.Id != bestWeapon.ItemType.ItemIndex) || (!hasItem && bestWeapon != null)) { hasItem = true; _stock.TryRemove(bestWeapon.ItemType.ItemIndex); if (!_inv.Weapon.IsEmpty()) { _stock.Add(_inv.Weapon.Id); } _inv.Weapon = new SettlerInventory.ArmorState() { Id = bestWeapon.ItemType.ItemIndex, Durability = bestWeapon.Durability }; } return(hasItem); }
public void DoJob(IIterationType iterationType, IAreaJob areaJob, ConstructionJobInstance job, ref NPCBase.NPCState state) { int i = 0; var bpi = iterationType as SchematicIterator; if (bpi == null) { SettlersLogger.Log(ChatColor.yellow, "iterationType must be of type SchematicIterator for the SchematicBuilder."); state.SetIndicator(new Shared.IndicatorState(5f, ColonyBuiltIn.ItemTypes.ERRORIDLE.Name)); AreaJobTracker.RemoveJob(areaJob); return; } while (true) // This is to move past air. { if (i > 4000) { break; } var adjX = iterationType.CurrentPosition.x - bpi.BuilderSchematic.StartPos.x; var adjY = iterationType.CurrentPosition.y - bpi.BuilderSchematic.StartPos.y; var adjZ = iterationType.CurrentPosition.z - bpi.BuilderSchematic.StartPos.z; var block = bpi.BuilderSchematic.GetBlock(adjX, adjY, adjZ); var mapped = block.MappedBlock; var buildType = ItemTypes.GetType(mapped.CSIndex); if (buildType == null) { state.SetIndicator(new Shared.IndicatorState(5f, ColonyBuiltIn.ItemTypes.ERRORIDLE.Name)); AreaJobTracker.RemoveJob(areaJob); return; } if (World.TryGetTypeAt(iterationType.CurrentPosition, out ushort foundTypeIndex)) { i++; var founditemId = ItemId.GetItemId(foundTypeIndex); if (foundTypeIndex == buildType.ItemIndex || buildType.Name.Contains("bedend") || (founditemId.Name.Contains("bedend") && buildType.ItemIndex == ColonyBuiltIn.ItemTypes.AIR)) // check if the blocks are the same, if they are, move past. Most of the time this will be air. { if (iterationType.MoveNext()) { continue; } else { if (_needsChunkLoaded.Contains(bpi)) { _needsChunkLoaded.Remove(bpi); } state.SetIndicator(new Shared.IndicatorState(5f, ColonyBuiltIn.ItemTypes.ERRORIDLE.Name)); AreaJobTracker.RemoveJob(areaJob); return; } } Stockpile ownerStockPile = areaJob.Owner.Stockpile; bool stockpileContainsBuildItem = buildType.ItemIndex == ColonyBuiltIn.ItemTypes.AIR.Id; if (!stockpileContainsBuildItem && ownerStockPile.Contains(buildType.ItemIndex)) { stockpileContainsBuildItem = true; } if (!stockpileContainsBuildItem && buildType.Name.Contains("bed") && ownerStockPile.Contains(ItemId.GetItemId("bed"))) { stockpileContainsBuildItem = true; } if (!stockpileContainsBuildItem && !string.IsNullOrWhiteSpace(buildType.ParentType) && ownerStockPile.Contains(buildType.ParentItemType.ItemIndex)) { stockpileContainsBuildItem = true; } if (stockpileContainsBuildItem) { if (foundTypeIndex != ColonyBuiltIn.ItemTypes.AIR.Id && foundTypeIndex != ColonyBuiltIn.ItemTypes.WATER.Id) { var foundItem = ItemTypes.GetType(foundTypeIndex); if (foundItem != null && foundItem.ItemIndex != ColonyBuiltIn.ItemTypes.AIR.Id && foundItem.OnRemoveItems != null && foundItem.OnRemoveItems.Count > 0) { ownerStockPile.Add(foundItem.OnRemoveItems.Select(itm => itm.item).ToList()); } } var changeResult = ServerManager.TryChangeBlock(iterationType.CurrentPosition, buildType.ItemIndex, new BlockChangeRequestOrigin(job.Owner), ESetBlockFlags.DefaultAudio); if (changeResult == EServerChangeBlockResult.Success) { if (buildType.ItemIndex != ColonyBuiltIn.ItemTypes.AIR.Id) { if (--job.StoredItemCount <= 0) { job.ShouldTakeItems = true; state.JobIsDone = true; } ownerStockPile.TryRemove(buildType.ItemIndex); if (buildType.Name.Contains("bed")) { ownerStockPile.TryRemove(ItemId.GetItemId("bed")); } } } else if (changeResult != EServerChangeBlockResult.CancelledByCallback) { if (!_needsChunkLoaded.Contains(bpi)) { _needsChunkLoaded.Add(bpi); } state.SetIndicator(new Shared.IndicatorState(5f, buildType.Name)); ChunkQueue.QueuePlayerSurrounding(iterationType.CurrentPosition.ToChunk()); return; } } else { state.SetIndicator(new Shared.IndicatorState(5f, buildType.Name, true, false)); return; } } else { if (!_needsChunkLoaded.Contains(bpi)) { _needsChunkLoaded.Add(bpi); } ChunkQueue.QueuePlayerSurrounding(iterationType.CurrentPosition.ToChunk()); state.SetIndicator(new Shared.IndicatorState(5f, ColonyBuiltIn.ItemTypes.ERRORIDLE.Name)); return; } if (iterationType.MoveNext()) { if (buildType.ItemIndex != ColonyBuiltIn.ItemTypes.AIR.Id) { state.SetIndicator(new Shared.IndicatorState(GetCooldown(), buildType.ItemIndex)); } else { state.SetIndicator(new Shared.IndicatorState(GetCooldown(), foundTypeIndex)); } return; } else { if (_needsChunkLoaded.Contains(bpi)) { _needsChunkLoaded.Remove(bpi); } // failed to find next position to do job at, self-destruct state.SetIndicator(new Shared.IndicatorState(5f, ColonyBuiltIn.ItemTypes.ERRORIDLE.Name)); AreaJobTracker.RemoveJob(areaJob); return; } } if (iterationType.MoveNext()) { state.SetIndicator(new Shared.IndicatorState(5f, ColonyBuiltIn.ItemTypes.ERRORIDLE.Name)); return; } else { if (_needsChunkLoaded.Contains(bpi)) { _needsChunkLoaded.Remove(bpi); } // failed to find next position to do job at, self-destruct state.SetIndicator(new Shared.IndicatorState(5f, ColonyBuiltIn.ItemTypes.ERRORIDLE.Name)); AreaJobTracker.RemoveJob(areaJob); SettlersLogger.Log(ChatColor.yellow, "Failed to MoveNext after while. Iterator position: {0}.", iterationType.CurrentPosition); return; } }
void CheckItemAmount(Stockpile stockpile, ushort itemType, int minAmount) { var missing = minAmount - stockpile.AmountContained(itemType); stockpile.Add(itemType, missing); }