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); }
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); }
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); } }
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)); } }
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; } }
public static void OnNPCDied(NPC.NPCBase npc) { SettlerInventory.GetSettlerInventory(npc); UpdateFoodUse(npc.Colony.Owner); }
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); }
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); }
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)); } }
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); }