예제 #1
0
        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();
        }
예제 #2
0
        // 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();
            }
        }
예제 #3
0
        /// <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);
                }
            }
        }
예제 #6
0
 public static void Add(this Stockpile stockpile, IEnumerable <StoredItem> items)
 {
     if (items != null)
     {
         foreach (var item in items)
         {
             stockpile.Add(item.Id, item.Amount);
         }
     }
 }
예제 #7
0
        /// <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;
        }
예제 #8
0
        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);
                }
            }
        }
예제 #9
0
        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);
        }
예제 #10
0
        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);
        }
예제 #11
0
        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;
                        }
                    }
                }
            }
        }
예제 #12
0
        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();
                }
            }
        }
예제 #13
0
        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);
        }
예제 #14
0
        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;
            }
        }
예제 #15
0
        void CheckItemAmount(Stockpile stockpile, ushort itemType, int minAmount)
        {
            var missing = minAmount - stockpile.AmountContained(itemType);

            stockpile.Add(itemType, missing);
        }