public void SetNPC(NPCBase npc)
        {
            NPC = npc;

            if (npc != null)
            {
                NeedsNPC     = false;
                IsValid      = true;
                Owner        = npc.Colony;
                _tmpVals     = npc.CustomData;
                _colony      = npc.Colony;
                _inv         = SettlerInventory.GetSettlerInventory(npc);
                _colonyState = ColonyState.GetColonyState(_colony);
                _stock       = npc.Colony.Stockpile;
            }
            else
            {
                NeedsNPC     = true;
                IsValid      = false;
                Owner        = null;
                _inv         = null;
                _tmpVals     = null;
                _colony      = null;
                _colonyState = null;
                _stock       = null;
            }
        }
        public static void OnNPCCraftedRecipe(IJob job, Recipe recipe, List <RecipeResult> results)
        {
            IncrimentSkill(job.NPC);

            var inv = SettlerInventory.GetSettlerInventory(job.NPC);

            inv.IncrimentStat("Number of Crafts");

            double weightSum = 0;
            double roll      = Random.Next() + inv.GetSkillModifier();
            List <RecipeResult> bonusItems = new List <RecipeResult>();

            foreach (var item in results)
            {
                weightSum += 1;

                if (roll > weightSum)
                {
                    bonusItems.Add(new RecipeResult(item.Type, item.Amount));
                }

                inv.IncrimentStat(ItemTypes.GetType(item.Type).Name, item.Amount);
            }

            results.AddRange(bonusItems);
        }
        private static void AddNewSettlers(double addCount, int numbSkilled, ColonyState state)
        {
            var reason = string.Format(SettlerReasoning.GetSettleReason(), addCount);

            if (numbSkilled > 0)
            {
                if (numbSkilled == 1)
                {
                    reason += string.Format(" {0} of them is skilled!", numbSkilled);
                }
                else
                {
                    reason += string.Format(" {0} of them are skilled!", numbSkilled);
                }
            }

            PandaChat.Send(state.ColonyRef, reason, ChatColor.magenta);

            for (var i = 0; i < addCount; i++)
            {
                var newGuy = new NPCBase(state.ColonyRef, state.ColonyRef.GetRandomBanner().Position);

                NPCTracker.Add(newGuy);
                state.ColonyRef.RegisterNPC(newGuy);
                SettlerInventory.GetSettlerInventory(newGuy);
                newGuy.CustomData.SetAs(ISSETTLER, true);

                if (i <= numbSkilled)
                {
                    newGuy.CustomData.SetAs(GameLoader.ALL_SKILLS, Random.Next(1, 10) * 0.002f);
                }

                ModLoader.Callbacks.OnNPCRecruited.Invoke(newGuy);
            }
        }
 public void OnAssignedNPC(NPCBase npc)
 {
     _usedNPC     = npc;
     _tmpVals     = npc.GetTempValues(true);
     _colony      = npc.Colony;
     _inv         = SettlerInventory.GetSettlerInventory(npc);
     _playerState = PlayerState.GetPlayerState(_colony.Owner);
     _stock       = Stockpile.GetStockPile(_colony.Owner);
 }
Exemple #5
0
        public static void GetArmor()
        {
            if (_nextUpdate < DateTime.Now)
            {
                Players.PlayerDatabase.ForeachValue(p =>
                {
                    var colony    = Colony.Get(p);
                    var state     = PlayerState.GetPlayerState(p);
                    var stockpile = Stockpile.GetStockPile(p);

                    /// Load up player first.
                    foreach (ArmorSlot slot in ArmorSlotEnum)
                    {
                        var bestArmor = GetBestArmorFromStockpile(stockpile, slot, 0);

                        if (bestArmor != default(ushort))
                        {
                            if (!state.Armor.ContainsKey(slot))
                            {
                                state.Armor.Add(slot, new ArmorState());
                            }

                            // Check if we need one or if there is an upgrade.
                            if (state.Armor[slot].IsEmpty())
                            {
                                stockpile.TryRemove(bestArmor);
                                state.Armor[slot].Id         = bestArmor;
                                state.Armor[slot].Durability = ArmorLookup[bestArmor].Durability;
                            }
                            else
                            {
                                var currentArmor   = ArmorLookup[state.Armor[slot].Id];
                                var stockpileArmor = ArmorLookup[bestArmor];

                                if (stockpileArmor.ArmorRating > currentArmor.ArmorRating)
                                {
                                    // Upgrade armor.
                                    stockpile.TryRemove(bestArmor);
                                    stockpile.Add(state.Armor[slot].Id);
                                    state.Armor[slot].Id         = bestArmor;
                                    state.Armor[slot].Durability = stockpileArmor.Durability;
                                }
                            }
                        }
                    }

                    foreach (var npc in colony.Followers)
                    {
                        var inv = SettlerInventory.GetSettlerInventory(npc);
                        GetBestArmorForNPC(stockpile, npc, inv, 4);
                    }
                });

                _nextUpdate = DateTime.Now + TimeSpan.FromSeconds(30);
            }
        }
        public static void OnNPCRecruited(NPCBase npc)
        {
            if (npc.GetTempValues().TryGet(ISSETTLER, out bool settler) && settler)
            {
                return;
            }

            var ps = PlayerState.GetPlayerState(npc.Colony.Owner);

            if (ps.SettlersEnabled)
            {
                if (Configuration.GetorDefault("ColonistsRecruitment", true))
                {
                    if (ps.SettlersEnabled && npc.Colony.FollowerCount > MAX_BUYABLE)
                    {
                        var cost = Configuration.GetorDefault("CompoundingFoodRecruitmentCost", 5) * ps.ColonistsBought;
                        var num  = 0f;

                        if (cost < 1)
                        {
                            cost = 1;
                        }

                        if (npc.Colony.UsedStockpile.TotalFood < cost ||
                            !npc.Colony.UsedStockpile.TryRemoveFood(ref num, cost))
                        {
                            Chat.Send(npc.Colony.Owner,
                                      $"<color=red>Could not recruit a new colonist; not enough food in stockpile. {cost + ServerManager.ServerVariables.LaborerCost} food required.</color>",
                                      ChatSenderType.Server);

                            npc.Colony.UsedStockpile.Add(BuiltinBlocks.Bread,
                                                         (int)Math.Floor(ServerManager.ServerVariables.LaborerCost /
                                                                         3));

                            npc.health = 0;
                            npc.Update();
                            return;
                        }

                        ps.ColonistsBought++;
                        ps.NextColonistBuyTime = TimeCycle.TotalTime + 24;
                    }

                    SettlerInventory.GetSettlerInventory(npc);
                    UpdateFoodUse(npc.Colony.Owner);
                }
                else
                {
                    PandaChat.Send(npc.Colony.Owner,
                                   "The server administrator has disabled recruitment of colonists while settlers are enabled.");
                }
            }
        }
        public NPCBase.NPCGoal CalculateGoal(ref NPCBase.NPCState state)
        {
            var inv = SettlerInventory.GetSettlerInventory(_usedNPC);

            if (!inv.Weapon.IsEmpty())
            {
                return(NPCBase.NPCGoal.Job);
            }
            else
            {
                return(NPCBase.NPCGoal.Stockpile);
            }
        }
        public static void OnNPCGathered(IJob job, Vector3Int location, List <ItemTypes.ItemTypeDrops> results)
        {
            if (job != null && job.NPC != null && results != null && results.Count > 0)
            {
                var inv = SettlerInventory.GetSettlerInventory(job.NPC);

                foreach (var item in results)
                {
                    if (ItemTypes.TryGetType(item.Type, out var itemType))
                    {
                        inv.IncrimentStat(itemType.Name, item.Amount);
                    }
                }
            }
        }
        public static GuardJobSettings GetWeapon(NPCBase npc)
        {
            GuardJobSettings weapon = null;
            var inv = SettlerInventory.GetSettlerInventory(npc);

            foreach (BlockJobManager <GuardJobInstance> w in ServerManager.BlockEntityCallbacks.AutoLoadedInstances.Where(t => t as BlockJobManager <GuardJobInstance> != null))
            {
                if (npc.Inventory.Contains(w.Settings.RecruitmentItem) || inv.Weapon.Id == w.Settings.RecruitmentItem.Type)
                {
                    weapon = w.Settings as GuardJobSettings;
                    break;
                }
            }

            return(weapon);
        }
        public static GuardBaseJob.GuardSettings GetWeapon(NPC.NPCBase npc)
        {
            GuardBaseJob.GuardSettings weapon = null;
            var inv = SettlerInventory.GetSettlerInventory(npc);

            foreach (var w in Items.ItemFactory.WeaponGuardSettings)
            {
                if (npc.Inventory.Contains(w.recruitmentItem) || inv.Weapon.Id == w.recruitmentItem.Type)
                {
                    weapon = w;
                    break;
                }
            }

            return(weapon);
        }
Exemple #11
0
        public static void OnNPCCraftedRecipe(IJob job, Recipe recipe, List <InventoryItem> results)
        {
            if (recipe.Name == Mana.Item.name && job.NPC != null)
            {
                var inv    = SettlerInventory.GetSettlerInventory(job.NPC);
                var chance = 0.03f;

                if (inv.JobSkills.ContainsKey(ApothecaryRegister.JOB_NAME))
                {
                    chance += inv.JobSkills[ApothecaryRegister.JOB_NAME];
                }

                if (Random.NextFloat() <= chance)
                {
                    results.Add(new InventoryItem(Item.ItemIndex));
                }
            }
        }
        public static void OnNPCSaved(NPCBase npc, JSONNode node)
        {
            node.SetAs(GameLoader.SETTLER_INV, SettlerInventory.GetSettlerInventory(npc).ToJsonNode());

            if (npc.NPCType.IsLaborer && npc.CustomData.TryGetAs(LEAVETIME_JOB, out double leave))
            {
                node.SetAs(LEAVETIME_JOB, leave);
            }

            if (npc.CustomData.TryGetAs(GameLoader.ALL_SKILLS, out float allSkill))
            {
                node.SetAs(GameLoader.ALL_SKILLS, allSkill);
            }

            if (npc.CustomData.TryGetAs(KNOWN_ITTERATIONS, out int itt))
            {
                node.SetAs(KNOWN_ITTERATIONS, itt);
            }
        }
Exemple #13
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;
                        }
                    }
                }
            }
        }
        public static void OnNPCSaved(NPCBase npc, JSONNode node)
        {
            var tmpVals = npc.GetTempValues();

            node.SetAs(GameLoader.SETTLER_INV, SettlerInventory.GetSettlerInventory(npc).ToJsonNode());

            if (npc.NPCType.IsLaborer && tmpVals.Contains(LEAVETIME_JOB))
            {
                node.SetAs(LEAVETIME_JOB, tmpVals.Get <double>(LEAVETIME_JOB));
            }

            if (tmpVals.Contains(GameLoader.ALL_SKILLS))
            {
                node.SetAs(GameLoader.ALL_SKILLS, tmpVals.Get <float>(GameLoader.ALL_SKILLS));
            }

            if (tmpVals.Contains(KNOWN_ITTERATIONS))
            {
                node.SetAs(KNOWN_ITTERATIONS, tmpVals.Get <int>(KNOWN_ITTERATIONS));
            }
        }
Exemple #15
0
        public static void OnNPCCraftedRecipe(IJob job, Recipe recipe, List <InventoryItem> results)
        {
            if (recipe.Name == Elementium.Item.name && job.NPC != null)
            {
                var inv    = SettlerInventory.GetSettlerInventory(job.NPC);
                var chance = 0.05f;

                if (inv.JobSkills.ContainsKey(ApothecaryRegister.JOB_NAME))
                {
                    chance += inv.JobSkills[ApothecaryRegister.JOB_NAME];
                }

                if (Random.NextFloat() <= chance)
                {
                    results.Add(new InventoryItem(Item.ItemIndex));

                    PandaChat.Send(job.NPC.Colony.Owner,
                                   $"{inv.SettlerName} the Apothecary has discovered a Void Stone while crafting Elementium!",
                                   ChatColor.orange);
                }
            }
        }
 public static void OnNPCDied(NPCBase npc)
 {
     SettlerInventory.GetSettlerInventory(npc);
     UpdateFoodUse(ColonyState.GetColonyState(npc.Colony));
 }
        public static void OnNPCRecruited(NPCBase npc)
        {
            try
            {
                if (npc.CustomData == null)
                {
                    npc.CustomData = new JSONNode();
                }

                if (npc.CustomData.TryGetAs(ISSETTLER, out bool settler) && settler)
                {
                    return;
                }

                var ps = ColonyState.GetColonyState(npc.Colony);

                npc.FoodHoursCarried = ServerManager.ServerSettings.NPCs.InitialFoodCarriedHours;

                if (ps.SettlersEnabled)
                {
                    if (SettlersConfiguration.GetorDefault("ColonistsRecruitment", true))
                    {
                        //if (ps.SettlersEnabled && npc.Colony.FollowerCount > MAX_BUYABLE)
                        //{
                        //    var cost = SettlersConfiguration.GetorDefault("CompoundingFoodRecruitmentCost", .25) * ps.ColonistsBought;
                        //    var num = 0f;

                        //    if (cost < 1)
                        //        cost = 1;

                        //    if (npc.Colony.Stockpile.TotalFood < cost ||
                        //        !npc.Colony.Stockpile.TryRemoveFood(ref num, cost))
                        //    {
                        //        PandaChat.Send(npc.Colony, $"Could not recruit a new colonist; not enough food in stockpile. {cost + ServerManager.ServerSettings.NPCs.RecruitmentCost} food required.", ChatColor.red);
                        //        npc.Colony.HappinessData.RecruitmentCostCalculator.GetCost(npc.Colony.HappinessData.CachedHappiness, npc.Colony, out float foodCost);

                        //        if (ItemTypes.TryGetType(ColonyBuiltIn.ItemTypes.BREAD.Name, out var bread))
                        //            npc.Colony.Stockpile.Add(ColonyBuiltIn.ItemTypes.BREAD, (int)Math.Floor(foodCost / bread.FoodValue));

                        //        npc.health = 0;
                        //        npc.Update();
                        //        return;
                        //    }

                        //    ps.ColonistsBought++;
                        //    ps.NextColonistBuyTime = TimeCycle.TotalTime.Value.Hours + 24;
                        //}

                        SettlerInventory.GetSettlerInventory(npc);
                        UpdateFoodUse(ps);
                    }
                    else
                    {
                        PandaChat.Send(npc.Colony, "The server administrator has disabled recruitment of colonists while settlers are enabled.");
                        npc.health = 0;
                        npc.Update();
                    }
                }
            }
            catch (Exception ex)
            {
                PandaLogger.LogError(ex);
            }
        }
        public static void OnUpdate()
        {
            if (ServerManager.ColonyTracker != null)
            {
                foreach (var colony in ServerManager.ColonyTracker.ColoniesByID.Values)
                {
                    if (_magicUpdateTime < Time.SecondsSinceStartDouble)
                    {
                        foreach (var follower in colony.Followers)
                        {
                            var inv = SettlerInventory.GetSettlerInventory(follower);

                            if (inv.MagicItemUpdateTime < Time.SecondsSinceStartDouble)
                            {
                                foreach (var item in inv.Armor)
                                {
                                    if (item.Value.Id != 0 && ArmorFactory.ArmorLookup.TryGetValue(item.Value.Id, out var armor))
                                    {
                                        armor.Update();

                                        if (armor.HPTickRegen != 0)
                                        {
                                            follower.Heal(armor.HPTickRegen);
                                        }
                                    }
                                }

                                if (Items.Weapons.WeaponFactory.WeaponLookup.TryGetValue(inv.Weapon.Id, out var wep))
                                {
                                    wep.Update();

                                    if (wep.HPTickRegen != 0)
                                    {
                                        follower.Heal(wep.HPTickRegen);
                                    }
                                }

                                var hasBandages = colony.Stockpile.Contains(TreatedBandage.Item.ItemIndex) ||
                                                  colony.Stockpile.Contains(Bandage.Item.ItemIndex);

                                if (hasBandages &&
                                    follower.health < follower.Colony.NPCHealthMax &&
                                    !HealingOverTimeNPC.NPCIsBeingHealed(follower))
                                {
                                    var healing = false;

                                    if (follower.Colony.NPCHealthMax - follower.health > TreatedBandage.INITIALHEAL)
                                    {
                                        colony.Stockpile.TryRemove(TreatedBandage.Item.ItemIndex);
                                        healing = true;
                                        AudioManager.SendAudio(follower.Position.Vector, GameLoader.NAMESPACE + ".Bandage");

                                        var heal = new HealingOverTimeNPC(follower, TreatedBandage.INITIALHEAL,
                                                                          TreatedBandage.TOTALHOT, 5,
                                                                          TreatedBandage.Item.ItemIndex);
                                    }

                                    if (!healing)
                                    {
                                        colony.Stockpile.TryRemove(Bandage.Item.ItemIndex);
                                        healing = true;
                                        AudioManager.SendAudio(follower.Position.Vector, GameLoader.NAMESPACE + ".Bandage");

                                        var heal = new HealingOverTimeNPC(follower, Bandage.INITIALHEAL, Bandage.TOTALHOT, 5,
                                                                          Bandage.Item.ItemIndex);
                                    }
                                }


                                inv.MagicItemUpdateTime += 5000;
                            }
                        }
                    }


                    if (_updateTime < Time.SecondsSinceStartDouble && colony.OwnerIsOnline())
                    {
                        NPCBase lastNPC = null;

                        foreach (var follower in colony.Followers)
                        {
                            if (TimeCycle.IsDay)
                            {
                                if (lastNPC == null ||
                                    UnityEngine.Vector3.Distance(lastNPC.Position.Vector, follower.Position.Vector) > 15 &&
                                    Random.NextBool())
                                {
                                    lastNPC = follower;
                                    AudioManager.SendAudio(follower.Position.Vector, GameLoader.NAMESPACE + ".TalkingAudio");
                                }
                            }
                        }
                    }

                    var cs = ColonyState.GetColonyState(colony);

                    if (cs.SettlersEnabled)
                    {
                        if (EvaluateSettlers(cs) ||
                            EvaluateLaborers(cs) ||
                            EvaluateBeds(cs))
                        {
                            colony.SendCommonData();
                        }
                    }

                    UpdateFoodUse(cs);
                }
            }

            if (_magicUpdateTime < Time.SecondsSinceStartDouble)
            {
                _magicUpdateTime = Time.SecondsSinceStartDouble + 1;
            }

            if (_updateTime < Time.SecondsSinceStartDouble && TimeCycle.IsDay)
            {
                _updateTime = Time.SecondsSinceStartDouble + _UPDATE_TIME;
            }
        }
Exemple #19
0
 public static void OnNPCDied(NPC.NPCBase npc)
 {
     SettlerInventory.GetSettlerInventory(npc);
     UpdateFoodUse(npc.Colony.Owner);
 }
Exemple #20
0
        public bool TryDoCommand(Players.Player player, string chat)
        {
            var colony = Colony.Get(player);
            Dictionary <MetalType, Dictionary <Armor.ArmorSlot, int> > counts = new Dictionary <MetalType, Dictionary <Armor.ArmorSlot, int> >();
            Dictionary <Armor.ArmorSlot, int> slots = new Dictionary <Armor.ArmorSlot, int>();

            foreach (Armor.ArmorSlot slot in Armor.ArmorSlotEnum)
            {
                slots.Add(slot, 0);
            }

            foreach (MetalType metal in Enum.GetValues(typeof(MetalType)))
            {
                counts.Add(metal, new Dictionary <Armor.ArmorSlot, int>(slots));
            }

            foreach (var npc in colony.Followers)
            {
                var inv = SettlerInventory.GetSettlerInventory(npc);

                foreach (var item in inv.Armor)
                {
                    if (!item.Value.IsEmpty())
                    {
                        var armor = Armor.ArmorLookup[item.Value.Id];
                        counts[armor.Metal][armor.Slot]++;
                    }
                }
            }

            var           state = PlayerState.GetPlayerState(player);
            StringBuilder psb   = new StringBuilder();

            psb.Append("Player =>");

            foreach (var armor in state.Armor)
            {
                if (armor.Value.IsEmpty())
                {
                    psb.Append($" {armor.Key}: None |");
                }
                else
                {
                    psb.Append($" {armor.Key}: {Armor.ArmorLookup[armor.Value.Id].Metal} | ");
                }
            }

            PandaChat.Send(player, psb.ToString());

            foreach (var type in counts)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append($"{type.Key} =>");
                foreach (var slot in type.Value)
                {
                    sb.Append($" {slot.Key}: {slot.Value} |");
                }

                PandaChat.Send(player, sb.ToString());
            }

            return(true);
        }
        public static bool EvaluateSettlers(Players.Player p)
        {
            var update = false;

            if (p.IsConnected)
            {
                var colony = Colony.Get(p);
                var state  = PlayerState.GetPlayerState(p);

                if (state.NextGenTime == 0)
                {
                    state.NextGenTime = Time.SecondsSinceStartDouble +
                                        Random.Next(8,
                                                    16 - Pipliz.Math.RoundToInt(p.GetTempValues(true)
                                                                                .GetOrDefault(PandaResearch.GetResearchKey(PandaResearch.TimeBetween),
                                                                                              0f))) * TimeCycle
                                        .SecondsPerHour;
                }

                if (Time.SecondsSinceStartDouble > state.NextGenTime && colony.FollowerCount >= MAX_BUYABLE)
                {
                    var chance =
                        p.GetTempValues(true)
                        .GetOrDefault(PandaResearch.GetResearchKey(PandaResearch.SettlerChance), 0f) +
                        state.Difficulty.AdditionalChance;

                    chance += SettlerEvaluation.SpawnChance(p, colony, state);

                    var rand = Random.NextFloat();

                    if (chance > rand)
                    {
                        var addCount = Math.Floor(state.MaxPerSpawn * chance);

                        // if we lost alot of colonists add extra to help build back up.
                        if (colony.FollowerCount < state.HighestColonistCount)
                        {
                            var diff = state.HighestColonistCount - colony.FollowerCount;
                            addCount += Math.Floor(diff * .25);
                        }

                        try
                        {
                            var skillChance = p.GetTempValues(true)
                                              .GetOrDefault(PandaResearch.GetResearchKey(PandaResearch.SkilledLaborer),
                                                            0f);

                            var numbSkilled = 0;

                            rand = Random.NextFloat();

                            try
                            {
                                if (skillChance > rand)
                                {
                                    numbSkilled =
                                        state.Rand.Next(1,
                                                        2 + Pipliz.Math.RoundToInt(p.GetTempValues(true)
                                                                                   .GetOrDefault(PandaResearch.GetResearchKey(PandaResearch.NumberSkilledLaborer),
                                                                                                 0f)));
                                }
                            }
                            catch (Exception ex)
                            {
                                PandaLogger.Log("NumberSkilledLaborer");
                                PandaLogger.LogError(ex);
                            }


                            if (addCount > 0)
                            {
                                if (addCount > 30)
                                {
                                    addCount = 30;
                                }

                                var reason = string.Format(SettlerReasoning.GetSettleReason(), addCount);

                                if (numbSkilled > 0)
                                {
                                    if (numbSkilled == 1)
                                    {
                                        reason += string.Format(" {0} of them is skilled!", numbSkilled);
                                    }
                                    else
                                    {
                                        reason += string.Format(" {0} of them are skilled!", numbSkilled);
                                    }
                                }

                                PandaChat.Send(p, reason, ChatColor.magenta);
                                var playerPos = new Vector3Int(p.Position);

                                for (var i = 0; i < addCount; i++)
                                {
                                    var newGuy = new NPCBase(NPCType.GetByKeyNameOrDefault("pipliz.laborer"),
                                                             BannerTracker.GetClosest(p, playerPos).KeyLocation.Vector,
                                                             colony);

                                    SettlerInventory.GetSettlerInventory(newGuy);
                                    newGuy.GetTempValues().Set(ISSETTLER, true);

                                    if (i <= numbSkilled)
                                    {
                                        var npcTemp = newGuy.GetTempValues(true);
                                        npcTemp.Set(GameLoader.ALL_SKILLS, state.Rand.Next(1, 10) * 0.002f);
                                    }

                                    update = true;
                                    ModLoader.TriggerCallbacks(ModLoader.EModCallbackType.OnNPCRecruited, newGuy);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            PandaLogger.Log("SkilledLaborer");
                            PandaLogger.LogError(ex);
                        }

                        if (colony.FollowerCount > state.HighestColonistCount)
                        {
                            state.HighestColonistCount = colony.FollowerCount;
                        }
                    }


                    state.NextGenTime = Time.SecondsSinceStartDouble +
                                        Random.Next(8,
                                                    16 - Pipliz.Math.RoundToInt(p.GetTempValues(true)
                                                                                .GetOrDefault(PandaResearch.GetResearchKey(PandaResearch.TimeBetween),
                                                                                              0f))) * TimeCycle
                                        .SecondsPerHour;

                    colony.SendUpdate();
                }
            }

            return(update);
        }
Exemple #22
0
 public static void OnNPCSaved(NPC.NPCBase npc, JSONNode node)
 {
     node.SetAs(GameLoader.SETTLER_INV, SettlerInventory.GetSettlerInventory(npc).ToJsonNode());
 }
        public static bool EvaluateSettlers(ColonyState state)
        {
            var update = false;

            if (state.ColonyRef.OwnerIsOnline())
            {
                if (state.NextGenTime == 0)
                {
                    state.NextGenTime = Time.SecondsSinceStartDouble + Random.Next(8, 16) * IN_GAME_HOUR_IN_SECONDS;
                }

                if (Time.SecondsSinceStartDouble > state.NextGenTime && state.ColonyRef.FollowerCount >= MAX_BUYABLE)
                {
                    var chance =
                        state.ColonyRef.TemporaryData.GetAsOrDefault(PandaResearch.GetResearchKey(PandaResearch.SettlerChance), 0f) +
                        state.Difficulty.AdditionalChance;

                    chance += SettlerEvaluation.SpawnChance(state);

                    var rand = Random.NextFloat();

                    if (chance > rand)
                    {
                        var addCount = Math.Floor(state.MaxPerSpawn * chance);

                        // if we lost alot of colonists add extra to help build back up.
                        if (state.ColonyRef.FollowerCount < state.HighestColonistCount)
                        {
                            var diff = state.HighestColonistCount - state.ColonyRef.FollowerCount;
                            addCount += Math.Floor(diff * .25);
                        }

                        try
                        {
                            var skillChance = state.ColonyRef.TemporaryData.GetAsOrDefault(PandaResearch.GetResearchKey(PandaResearch.SkilledLaborer), 0f);
                            var numbSkilled = 0;
                            rand = Random.NextFloat();

                            try
                            {
                                if (skillChance > rand)
                                {
                                    numbSkilled = Pipliz.Random.Next(1,
                                                                     2 + Pipliz.Math.RoundToInt(state.ColonyRef.TemporaryData.GetAsOrDefault(PandaResearch.GetResearchKey(PandaResearch.NumberSkilledLaborer), 0f)));
                                }
                            }
                            catch (Exception ex)
                            {
                                PandaLogger.Log("NumberSkilledLaborer");
                                PandaLogger.LogError(ex);
                            }


                            if (addCount > 0)
                            {
                                if (addCount > 30)
                                {
                                    addCount = 30;
                                }

                                var reason = string.Format(SettlerReasoning.GetSettleReason(), addCount);

                                if (numbSkilled > 0)
                                {
                                    if (numbSkilled == 1)
                                    {
                                        reason += string.Format(" {0} of them is skilled!", numbSkilled);
                                    }
                                    else
                                    {
                                        reason += string.Format(" {0} of them are skilled!", numbSkilled);
                                    }
                                }

                                PandaChat.Send(state.ColonyRef, reason, ChatColor.magenta);

                                for (var i = 0; i < addCount; i++)
                                {
                                    var newGuy = new NPCBase(state.ColonyRef, state.ColonyRef.GetRandomBanner().Position);

                                    NPCTracker.Add(newGuy);
                                    state.ColonyRef.RegisterNPC(newGuy);
                                    SettlerInventory.GetSettlerInventory(newGuy);
                                    newGuy.CustomData.SetAs(ISSETTLER, true);

                                    if (i <= numbSkilled)
                                    {
                                        newGuy.CustomData.SetAs(GameLoader.ALL_SKILLS, Random.Next(1, 10) * 0.002f);
                                    }

                                    update = true;
                                    ModLoader.TriggerCallbacks(ModLoader.EModCallbackType.OnNPCRecruited, newGuy);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            PandaLogger.Log("SkilledLaborer");
                            PandaLogger.LogError(ex);
                        }

                        if (state.ColonyRef.FollowerCount > state.HighestColonistCount)
                        {
                            state.HighestColonistCount = state.ColonyRef.FollowerCount;
                        }
                    }


                    state.NextGenTime = Time.SecondsSinceStartDouble + Random.Next(8, 16) * IN_GAME_HOUR_IN_SECONDS;

                    state.ColonyRef.SendCommonData();
                }
            }

            return(update);
        }
Exemple #24
0
        public static void PressButton(ButtonPressCallbackData data)
        {
            if (data.ButtonIdentifier.Contains(GameLoader.NAMESPACE + ".ResetPlayer."))
            {
                var id = data.ButtonIdentifier.Replace(GameLoader.NAMESPACE + ".ResetPlayer.", "");

                if (data.Player.ID.ToString() == id)
                {
                    BlockTracker.RewindPlayersBlocks(data.Player);
                }
                else
                {
                    foreach (var p in Players.PlayerDatabase)
                    {
                        if (p.Key.ToString() == id)
                        {
                            BlockTracker.RewindPlayersBlocks(p.Value);
                            break;
                        }
                    }
                }

                NetworkMenuManager.CloseServerPopup(data.Player);
                return;
            }

            if ((!data.ButtonIdentifier.Contains(".RecruitButton") &&
                 !data.ButtonIdentifier.Contains(".FireButton") &&
                 !data.ButtonIdentifier.Contains(".MoveFired") &&
                 !data.ButtonIdentifier.Contains(".ColonyToolMainMenu") &&
                 !data.ButtonIdentifier.Contains(".KillFired") &&
                 !data.ButtonIdentifier.Contains(".CallToArms")) || data.Player.ActiveColony == null)
            {
                return;
            }

            Dictionary <string, JobCounts> jobCounts = GetJobCounts(data.Player.ActiveColony);

            if (data.ButtonIdentifier.Contains(".ColonyToolMainMenu"))
            {
                NetworkMenuManager.SendServerPopup(data.Player, BuildMenu(data.Player, jobCounts, false, string.Empty, 0));
            }
            else if (data.ButtonIdentifier.Contains(".FireButton"))
            {
                foreach (var job in jobCounts)
                {
                    if (data.ButtonIdentifier.Contains(job.Key))
                    {
                        var recruit = data.Storage.GetAs <int>(job.Key + ".Recruit");
                        var count   = GetCountValue(recruit);
                        var menu    = BuildMenu(data.Player, jobCounts, true, job.Key, count);

                        menu.LocalStorage.SetAs(GameLoader.NAMESPACE + ".FiredJobName", job.Key);
                        menu.LocalStorage.SetAs(GameLoader.NAMESPACE + ".FiredJobCount", count);

                        NetworkMenuManager.SendServerPopup(data.Player, menu);
                        break;
                    }
                }
            }
            else if (data.ButtonIdentifier.Contains(".KillFired"))
            {
                var firedJob = data.Storage.GetAs <string>(GameLoader.NAMESPACE + ".FiredJobName");
                var count    = data.Storage.GetAs <int>(GameLoader.NAMESPACE + ".FiredJobCount");

                foreach (var job in jobCounts)
                {
                    if (job.Key == firedJob)
                    {
                        if (count > job.Value.TakenCount)
                        {
                            count = job.Value.TakenCount;
                        }

                        for (int i = 0; i < count; i++)
                        {
                            var npc = job.Value.TakenJobs[i].NPC;
                            npc.ClearJob();
                            npc.OnDeath();
                        }

                        break;
                    }
                }

                data.Player.ActiveColony.SendCommonData();
                jobCounts = GetJobCounts(data.Player.ActiveColony);
                NetworkMenuManager.SendServerPopup(data.Player, BuildMenu(data.Player, jobCounts, false, string.Empty, 0));
            }
            else if (data.ButtonIdentifier.Contains(".MoveFired"))
            {
                var firedJob = data.Storage.GetAs <string>(GameLoader.NAMESPACE + ".FiredJobName");
                var count    = data.Storage.GetAs <int>(GameLoader.NAMESPACE + ".FiredJobCount");

                foreach (var job in jobCounts)
                {
                    if (data.ButtonIdentifier.Contains(job.Key))
                    {
                        if (count > job.Value.AvailableCount)
                        {
                            count = job.Value.AvailableCount;
                        }

                        if (jobCounts.TryGetValue(firedJob, out var firedJobCounts))
                        {
                            for (int i = 0; i < count; i++)
                            {
                                if (firedJobCounts.TakenCount > i)
                                {
                                    var npc = firedJobCounts.TakenJobs[i].NPC;
                                    npc.ClearJob();
                                    npc.TakeJob(job.Value.AvailableJobs[i]);
                                    data.Player.ActiveColony.JobFinder.Remove(job.Value.AvailableJobs[i]);
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }

                        data.Player.ActiveColony.SendCommonData();
                        break;
                    }
                }

                jobCounts = GetJobCounts(data.Player.ActiveColony);
                NetworkMenuManager.SendServerPopup(data.Player, BuildMenu(data.Player, jobCounts, false, string.Empty, 0));
            }
            else if (data.ButtonIdentifier.Contains(".RecruitButton"))
            {
                foreach (var job in jobCounts)
                {
                    if (data.ButtonIdentifier.Contains(job.Key))
                    {
                        var recruit = data.Storage.GetAs <int>(job.Key + ".Recruit");
                        var count   = GetCountValue(recruit);

                        if (count > job.Value.AvailableCount)
                        {
                            count = job.Value.AvailableCount;
                        }

                        for (int i = 0; i < count; i++)
                        {
                            var num = 0f;
                            data.Player.ActiveColony.HappinessData.RecruitmentCostCalculator.GetCost(data.Player.ActiveColony.HappinessData.CachedHappiness, data.Player.ActiveColony, out float foodCost);
                            if (data.Player.ActiveColony.Stockpile.TotalFood < foodCost ||
                                !data.Player.ActiveColony.Stockpile.TryRemoveFood(ref num, foodCost))
                            {
                                PandaChat.Send(data.Player, _localizationHelper.LocalizeOrDefault("Notenoughfood", data.Player), ChatColor.red);
                                break;
                            }
                            else
                            {
                                var newGuy = new NPCBase(data.Player.ActiveColony, data.Player.ActiveColony.GetClosestBanner(new Vector3Int(data.Player.Position)).Position);
                                data.Player.ActiveColony.RegisterNPC(newGuy);
                                SettlerInventory.GetSettlerInventory(newGuy);
                                NPCTracker.Add(newGuy);
                                ModLoader.TriggerCallbacks(ModLoader.EModCallbackType.OnNPCRecruited, newGuy);

                                if (newGuy.IsValid)
                                {
                                    newGuy.TakeJob(job.Value.AvailableJobs[i]);
                                    data.Player.ActiveColony.JobFinder.Remove(job.Value.AvailableJobs[i]);
                                }
                            }
                        }


                        data.Player.ActiveColony.SendCommonData();

                        jobCounts = GetJobCounts(data.Player.ActiveColony);
                        NetworkMenuManager.SendServerPopup(data.Player, BuildMenu(data.Player, jobCounts, false, string.Empty, 0));
                    }
                }
            }
            else if (data.ButtonIdentifier.Contains(".CallToArms"))
            {
                AI.CalltoArms.ProcesssCallToArms(data.Player, data.Player.ActiveColony);
                NetworkMenuManager.SendServerPopup(data.Player, BuildMenu(data.Player, jobCounts, false, string.Empty, 0));
            }
        }
Exemple #25
0
        public static void OnNPCHit(NPC.NPCBase npc, Pipliz.Box <float> box)
        {
            var inv = SettlerInventory.GetSettlerInventory(npc);

            DeductArmor(box, inv.Armor, npc.Colony.Owner, inv.SettlerName);
        }