public static void PressButton(ButtonPressCallbackData data) { if (data.ButtonIdentifier == GameLoader.NAMESPACE + ".UnemployedLength" && data.Player.ActiveColony != null) { NetworkMenu menu = new NetworkMenu(); menu.LocalStorage.SetAs("header", _localizationHelper.LocalizeOrDefault("UnemployedLength", data.Player)); menu.Width = 800; menu.Height = 600; menu.ForceClosePopups = true; List <ValueTuple <IItem, int> > headerItems = new List <ValueTuple <IItem, int> >(); headerItems.Add((new Label(new LabelData(_localizationHelper.GetLocalizationKey("Colonist"), UnityEngine.Color.black)), 600)); headerItems.Add((new Label(new LabelData(_localizationHelper.GetLocalizationKey("TimeToLeave"), UnityEngine.Color.black, UnityEngine.TextAnchor.MiddleCenter)), 200)); menu.Items.Add(new HorizontalRow(headerItems)); for (var i = 0; i < data.Player.ActiveColony.LaborerCount; i++) { var npc = data.Player.ActiveColony.FindLaborer(i); var npcState = ColonistInventory.Get(npc); List <ValueTuple <IItem, int> > items = new List <ValueTuple <IItem, int> >(); items.Add((new Label(new LabelData(npcState.ColonistsName, UnityEngine.Color.black)), 400)); items.Add((new Label(new LabelData(Pipliz.Math.RoundToInt(npcState.UnemployedLeaveTime - TimeCycle.TotalHours) + "h", UnityEngine.Color.black, UnityEngine.TextAnchor.MiddleCenter)), 200)); menu.Items.Add(new HorizontalRow(items)); } NetworkMenuManager.SendServerPopup(data.Player, menu); } }
public static void OnNPCLoaded(NPCBase npc, JSONNode node) { if (npc.CustomData == null) { npc.CustomData = new JSONNode(); } if (node.TryGetAs <JSONNode>(GameInitializer.SETTLER_INV, out var invNode)) { npc.CustomData.SetAs(GameInitializer.SETTLER_INV, new ColonistInventory(invNode, npc)); } if (node.TryGetAs <float>(GameInitializer.ALL_SKILLS, out var skills)) { npc.CustomData.SetAs(GameInitializer.ALL_SKILLS, skills); } if (node.TryGetAs <int>(KNOWN_ITTERATIONS, out var jobItterations)) { npc.CustomData.SetAs(KNOWN_ITTERATIONS, jobItterations); } var npcInv = ColonistInventory.Get(npc); if (npc.NPCType.IsLaborer) { npcInv.UnemployedLeaveTime = TimeCycle.TotalHours + 48; } else { npcInv.UnemployedLeaveTime = 0; } }
public static void OnNPCCraftedRecipe(IJob job, Recipe recipe, List <RecipeResult> results) { IncrimentSkill(job.NPC); var inv = ColonistInventory.Get(job.NPC); inv.IncrimentStat("Number of Crafts"); }
public static void OnNPCCraftedRecipe(IJob job, Recipe recipe, List <RecipeResult> results) { IncrimentSkill(job.NPC); var inv = ColonistInventory.Get(job.NPC); inv.IncrimentStat("Number of Crafts"); double weightSum = 0; double roll = Random.Next() + inv.GetSkillModifier(); List <RecipeResult> bonusItems = new List <RecipeResult>(); for (int i = 0; i < results.Count; i++) { var item = results.RandomElement(); 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, _localizationHelper, reason, ChatColor.green); for (var i = 0; i < addCount; i++) { var newGuy = new NPCBase(state.ColonyRef, state.ColonyRef.GetRandomBanner().Position); NPCTracker.Add(newGuy); state.ColonyRef.RegisterNPC(newGuy); ColonistInventory.Get(newGuy); newGuy.CustomData.SetAs(ISSETTLER, true); if (i <= numbSkilled) { newGuy.CustomData.SetAs(GameLoader.ALL_SKILLS, Random.Next(5, 10) * 0.005f); } ModLoader.Callbacks.OnNPCRecruited.Invoke(newGuy); } }
public static bool GetBestWeapon(NPC.NPCBase npc, int limit) { var hasItem = false; try { if (npc != null) { var inv = ColonistInventory.Get(npc); var stock = npc.Colony.Stockpile; hasItem = !inv.Weapon.IsEmpty(); IWeapon bestWeapon = null; if (hasItem) { bestWeapon = WeaponFactory.WeaponLookup[inv.Weapon.Id]; } foreach (var wep in WeaponFactory.WeaponLookup.Values.Where(w => w as IPlayerMagicItem == null && w is WeaponMetadata weaponMetadata && weaponMetadata.ItemType != null).Cast <WeaponMetadata>()) { if (stock.Contains(wep.ItemType.ItemIndex) && bestWeapon == null || stock.Contains(wep.ItemType.ItemIndex) && bestWeapon != null && bestWeapon.Damage.TotalDamage() < wep.Damage.TotalDamage() && stock.AmountContained(ItemId.GetItemId(bestWeapon.name)) > limit) { bestWeapon = wep; } } if (bestWeapon != null) { var wepId = ItemId.GetItemId(bestWeapon.name); if (hasItem && inv.Weapon.Id != wepId || !hasItem) { hasItem = true; stock.TryRemove(wepId); if (!inv.Weapon.IsEmpty()) { stock.Add(inv.Weapon.Id); } inv.Weapon = new ItemState { Id = wepId, Durability = bestWeapon.WepDurability }; } } } } catch (Exception ex) { APILogger.LogError(ex); } return(hasItem); }
private static void UpdateMagicItemms(ColonyState state) { try { if (state.HealingUpdateTime < Time.SecondsSinceStartDouble) { var colony = state.ColonyRef; foreach (var follower in colony.Followers) { var inv = ColonistInventory.Get(follower); if (inv.HealingItemUpdateTime < Time.SecondsSinceStartDouble) { 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.HealingItemUpdateTime = Time.SecondsSinceStartDouble + Random.Next(3, 5); } } state.HealingUpdateTime = Time.SecondsSinceStartDouble + 5; } } catch (Exception ex) { SettlersLogger.LogError(ex); } }
public static void OnNPCSaved(NPCBase npc, JSONNode node) { node.SetAs(GameInitializer.SETTLER_INV, ColonistInventory.Get(npc).ToJsonNode()); if (npc.CustomData.TryGetAs(GameInitializer.ALL_SKILLS, out float allSkill)) { node.SetAs(GameInitializer.ALL_SKILLS, allSkill); } }
public static void OnNPCRecruited(NPCBase npc) { try { var npcInv = ColonistInventory.Get(npc); if (npc.CustomData == null) { npc.CustomData = new JSONNode(); } if (npc.NPCType.IsLaborer) { npcInv.UnemployedLeaveTime = TimeCycle.TotalHours + 48; } 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 != API.Models.SettlersState.Disabled) { if (SettlersConfiguration.GetorDefault("ColonistsRecruitment", true)) { if (npc.Colony.FollowerCount > MAX_BUYABLE) { if (!ColonistsBought.BoughtCount.ContainsKey(npc.Colony)) { ColonistsBought.BoughtCount.Add(npc.Colony, new List <double>()); } ColonistsBought.BoughtCount[npc.Colony].Add(TimeCycle.TotalHours + 24); } ColonistInventory.Get(npc); UpdateFoodUse(ps); } else { PandaChat.Send(npc.Colony, _localizationHelper, "AdminDisabled", ChatColor.red); npc.health = 0; npc.Update(); } } } catch (Exception ex) { SettlersLogger.LogError(ex); } }
public static NPCModel MapNPC(NPC.NPCBase follower) { return(new NPCModel() { Health = follower.health, Id = follower.ID, NpcTypeJobId = follower.Job.NPCType.Type, NPCInventory = follower.Inventory, Position = new SerializableVector3(follower.Position), ColonistInventory = ColonistInventory.Get(follower) }); }
private static bool EvaluateLaborers(ColonyState state) { var update = false; if (TimeCycle.TotalHours > state.NextLaborerTime) { var unTrack = new List <NPCBase>(); var left = 0; var leaving = 0; List <NPCBase> leavingNPCs = new List <NPCBase>(); foreach (var npc in state.ColonyRef.Followers) { if (npc.NPCType.IsLaborer) { leaving++; if (leaving > 10) { var inv = ColonistInventory.Get(npc); if (inv.UnemployedLeaveTime == 0) { inv.UnemployedLeaveTime = TimeCycle.TotalHours + 48; } else if (inv.UnemployedLeaveTime < TimeCycle.TotalHours) { left++; leavingNPCs.Add(npc); } } } } foreach (var npc in leavingNPCs) { NPCLeaving(npc); } if (left > 0) { PandaChat.Send(state.ColonyRef, _localizationHelper, "ColonistsLeft", ChatColor.red); } update = unTrack.Count != 0; state.ColonyRef.SendCommonData(); state.NextLaborerTime = TimeCycle.TotalHours + 1; } return(update); }
public static void OnNPCCraftedRecipe(IJob job, Recipe recipe, List <RecipeResult> results) { if (recipe.Name == Elementium.Item.name && job.NPC != null) { var inv = ColonistInventory.Get(job.NPC); var chance = 0.05f + inv.GetSkillModifier(); if (Random.NextFloat() <= chance) { inv.AddBonusProc(Item.ItemIndex); results.Add(new RecipeResult(Item.ItemIndex)); } } }
private static void UpdateMagicItemms(ColonyState state) { try { if (state.MagicUpdateTime < Time.SecondsSinceStartDouble) { var colony = state.ColonyRef; foreach (var follower in colony.Followers) { var inv = ColonistInventory.Get(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 (WeaponFactory.WeaponLookup.TryGetValue(inv.Weapon.Id, out var wep)) { wep.Update(); if (wep.HPTickRegen != 0) { follower.Heal(wep.HPTickRegen); } } inv.MagicItemUpdateTime = Time.SecondsSinceStartDouble + Random.Next(3, 5); } } state.MagicUpdateTime = Time.SecondsSinceStartDouble + 5; } } catch (Exception ex) { APILogger.LogError(ex); } }
public static NPCModel MapNPC(NPC.NPCBase follower) { return(new NPCModel() { FoodHoursCarried = follower.FoodHoursCarried, GoalPosition = new SerializableVector3(follower.UsedPath.path?.Goal.Vector), Health = follower.health, Id = follower.ID, NpcTypeJobId = follower.Job.NPCType.Type, NPCInventory = follower.Inventory, Position = new SerializableVector3(follower.Position), ColonistInventory = ColonistInventory.Get(follower), BedPosition = new SerializableVector3(follower.UsedBedLocation) }); }
public static void OnNPCGathered(IJob job, Vector3Int location, List <ItemTypeDrops> results) { if (job != null && job.NPC != null && results != null && results.Count > 0) { IncrimentSkill(job.NPC); var inv = ColonistInventory.Get(job.NPC); foreach (var item in results) { if (ItemTypes.TryGetType(item.Type, out var itemType)) { inv.IncrimentStat(itemType.Name, item.Amount); } } } }
public static void GetBestArmorForNPC(Stockpile stockpile, NPCBase npc, ColonistInventory 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 IPandaDamage GetWeapon(ModLoader.OnHitData box) { var weap = box.HitSourceObject as IPandaDamage; if (weap == null && box.HitSourceType == ModLoader.OnHitData.EHitSourceType.NPC) { var npc = box.HitSourceObject as NPCBase; if (npc != null) { var inv = ColonistInventory.Get(npc); if (!inv.Weapon.IsEmpty() && WeaponLookup.ContainsKey(inv.Weapon.Id)) { weap = WeaponLookup[inv.Weapon.Id]; } } } if (weap == null && (box.HitSourceType == ModLoader.OnHitData.EHitSourceType.PlayerProjectile || box.HitSourceType == ModLoader.OnHitData.EHitSourceType.PlayerClick)) { var p = box.HitSourceObject as Players.Player; if (p != null) { var ps = PlayerState.GetPlayerState(p); if (!ps.Weapon.IsEmpty() && WeaponLookup.ContainsKey(ps.Weapon.Id)) { weap = WeaponLookup[ps.Weapon.Id]; } } } return(weap); }
public static void PressButton(ButtonPressCallbackData data) { 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(GameInitializer.NAMESPACE + ".FiredJobName", job.Key); menu.LocalStorage.SetAs(GameInitializer.NAMESPACE + ".FiredJobCount", count); NetworkMenuManager.SendServerPopup(data.Player, menu); break; } } } else if (data.ButtonIdentifier.Contains(".KillFired")) { var firedJob = data.Storage.GetAs <string>(GameInitializer.NAMESPACE + ".FiredJobName"); var count = data.Storage.GetAs <int>(GameInitializer.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>(GameInitializer.NAMESPACE + ".FiredJobName"); var count = data.Storage.GetAs <int>(GameInitializer.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, "Notenoughfood", ChatColor.red); break; } else { var newGuy = new NPCBase(data.Player.ActiveColony, data.Player.ActiveColony.GetClosestBanner(new Vector3Int(data.Player.Position)).Position); newGuy.FoodHoursCarried = ServerManager.ServerSettings.NPCs.InitialFoodCarriedHours; data.Player.ActiveColony.RegisterNPC(newGuy); ColonistInventory.Get(newGuy); NPCTracker.Add(newGuy); ModLoader.Callbacks.OnNPCRecruited.Invoke(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)); } } } }
public static void OnNPCJobChanged(ValueTuple <NPCBase, IJob, IJob> data) { try { if (data.Item1 != null) { if (data.Item1.CustomData == null) { data.Item1.CustomData = new JSONNode(); } var inv = ColonistInventory.Get(data.Item1); if (data.Item1.NPCType.IsLaborer) { inv.UnemployedLeaveTime = TimeCycle.TotalHours + 48; } else { inv.UnemployedLeaveTime = 0; } } if (data.Item3 is GuardJobInstance guardJob && data.Item3.TryGetNPCGuardDefaultSettings(out var settings)) { if (settings != null) { guardJob.Settings = new GuardJobSettings() { BlockTypes = settings.BlockTypes, CooldownMissingItem = settings.CooldownMissingItem, CooldownSearchingTarget = settings.CooldownSearchingTarget, CooldownShot = settings.CooldownShot, Damage = settings.Damage, NPCType = settings.NPCType, NPCTypeKey = settings.NPCTypeKey, OnHitAudio = settings.OnHitAudio, OnShootAudio = settings.OnShootAudio, OnShootResultItem = settings.OnShootResultItem, Range = settings.Range, RecruitmentItem = settings.RecruitmentItem, ShootItem = settings.ShootItem, SleepType = settings.SleepType } } ; } else if (data.Item3 is CraftingJobInstance craftingJob) { if (craftingJob.Settings.GetType() == typeof(CraftingJobRotatedLitSettings) && data.Item3.TryGetNPCCraftDefaultSettings(out CraftingJobRotatedLitSettings craftSettingslit)) { craftingJob.Settings = new CraftingJobRotatedLitSettings(craftSettingslit.BlockTypes[0].Name, craftSettingslit.NPCTypeKey, craftSettingslit.CraftingCooldown, craftSettingslit.MaxCraftsPerHaul, craftSettingslit.OnCraftedAudio) { BlockTypes = craftSettingslit.BlockTypes, CraftingCooldown = craftSettingslit.CraftingCooldown, MaxCraftsPerHaul = craftSettingslit.MaxCraftsPerHaul, NPCType = craftSettingslit.NPCType, NPCTypeKey = craftSettingslit.NPCTypeKey, OnCraftedAudio = craftSettingslit.OnCraftedAudio, RecruitmentItem = craftSettingslit.RecruitmentItem } } ; else if (craftingJob.Settings.GetType() == typeof(CraftingJobRotatedSettings) && data.Item3.TryGetNPCCraftDefaultSettings(out CraftingJobRotatedSettings craftSettingsRot)) { craftingJob.Settings = new CraftingJobRotatedSettings(craftSettingsRot.BlockTypes[0].Name, craftSettingsRot.NPCTypeKey, craftSettingsRot.CraftingCooldown, craftSettingsRot.MaxCraftsPerHaul, craftSettingsRot.OnCraftedAudio) { BlockTypes = craftSettingsRot.BlockTypes, CraftingCooldown = craftSettingsRot.CraftingCooldown, MaxCraftsPerHaul = craftSettingsRot.MaxCraftsPerHaul, NPCType = craftSettingsRot.NPCType, NPCTypeKey = craftSettingsRot.NPCTypeKey, OnCraftedAudio = craftSettingsRot.OnCraftedAudio, RecruitmentItem = craftSettingsRot.RecruitmentItem } } ; else if (craftingJob.Settings.GetType() == typeof(CraftingJobSettings) && data.Item3.TryGetNPCCraftDefaultSettings(out CraftingJobSettings craftSettings)) { craftingJob.Settings = new CraftingJobSettings() { BlockTypes = craftSettings.BlockTypes, CraftingCooldown = craftSettings.CraftingCooldown, MaxCraftsPerHaul = craftSettings.MaxCraftsPerHaul, NPCType = craftSettings.NPCType, NPCTypeKey = craftSettings.NPCTypeKey, OnCraftedAudio = craftSettings.OnCraftedAudio, RecruitmentItem = craftSettings.RecruitmentItem } } ; } data.Item1?.ApplyJobResearch(); } catch (Exception ex) { APILogger.LogError(ex); } }
public static void OnNPCDied(NPCBase npc) { ColonistInventory.Get(npc); UpdateFoodUse(ColonyState.GetColonyState(npc.Colony)); }
//[ModLoader.ModCallback(ModLoader.EModCallbackType.OnNPCJobChanged, GameInitializer.NAMESPACE + ".SettlerManager.OnNPCJobChanged")] public static void OnNPCJobChanged(ValueTuple <NPCBase, IJob, IJob> data) { try { if (data.Item1 != null) { if (data.Item1.CustomData == null) { data.Item1.CustomData = new JSONNode(); } var inv = ColonistInventory.Get(data.Item1); if (data.Item1.NPCType.IsLaborer) { inv.UnemployedLeaveTime = TimeCycle.TotalHours + 48; } else { inv.UnemployedLeaveTime = 0; } } if (data.Item3 is GuardJobInstance guardJob && data.Item3.TryGetNPCGuardDefaultSettings(out var settings)) { if (settings != null) { var setting = Activator.CreateInstance(settings.GetType()) as GuardJobSettings; setting.BlockTypes = settings.BlockTypes; setting.CooldownMissingItem = settings.CooldownMissingItem; setting.CooldownSearchingTarget = settings.CooldownSearchingTarget; setting.CooldownShot = settings.CooldownShot; setting.Damage = settings.Damage; setting.NPCType = settings.NPCType; setting.NPCTypeKey = settings.NPCTypeKey; setting.OnHitAudio = settings.OnHitAudio; setting.OnShootAudio = settings.OnShootAudio; setting.OnShootResultItem = settings.OnShootResultItem; setting.Range = settings.Range; setting.RecruitmentItem = settings.RecruitmentItem; setting.ShootItem = settings.ShootItem; setting.SleepType = settings.SleepType; guardJob.Settings = setting; } } else if (data.Item3 is CraftingJobInstance craftingJob) { if (craftingJob.Settings.GetType() == typeof(CraftingJobRotatedLitSettings) && data.Item3.TryGetNPCCraftDefaultSettings(out CraftingJobRotatedLitSettings craftSettingslit)) { var litSettings = Activator.CreateInstance(craftSettingslit.GetType(), craftSettingslit.BlockTypes[0].Name, craftSettingslit.NPCTypeKey, craftSettingslit.CraftingCooldown, craftSettingslit.MaxCraftsPerHaul, craftSettingslit.OnCraftedAudio) as CraftingJobRotatedLitSettings; litSettings.BlockTypes = craftSettingslit.BlockTypes; litSettings.CraftingCooldown = craftSettingslit.CraftingCooldown; litSettings.MaxCraftsPerHaul = craftSettingslit.MaxCraftsPerHaul; litSettings.NPCType = craftSettingslit.NPCType; litSettings.NPCTypeKey = craftSettingslit.NPCTypeKey; litSettings.OnCraftedAudio = craftSettingslit.OnCraftedAudio; litSettings.RecruitmentItem = craftSettingslit.RecruitmentItem; craftingJob.Settings = litSettings; } else if (craftingJob.Settings.GetType() == typeof(CraftingJobRotatedSettings) && data.Item3.TryGetNPCCraftDefaultSettings(out CraftingJobRotatedSettings craftSettingsRot)) { var litSettings = Activator.CreateInstance(craftSettingsRot.GetType(), craftSettingsRot.BlockTypes[0].Name, craftSettingsRot.NPCTypeKey, craftSettingsRot.CraftingCooldown, craftSettingsRot.MaxCraftsPerHaul, craftSettingsRot.OnCraftedAudio) as CraftingJobRotatedSettings; litSettings.BlockTypes = craftSettingsRot.BlockTypes; litSettings.CraftingCooldown = craftSettingsRot.CraftingCooldown; litSettings.MaxCraftsPerHaul = craftSettingsRot.MaxCraftsPerHaul; litSettings.NPCType = craftSettingsRot.NPCType; litSettings.NPCTypeKey = craftSettingsRot.NPCTypeKey; litSettings.OnCraftedAudio = craftSettingsRot.OnCraftedAudio; litSettings.RecruitmentItem = craftSettingsRot.RecruitmentItem; craftingJob.Settings = litSettings; } else if (craftingJob.Settings.GetType() == typeof(CraftingJobSettings) && data.Item3.TryGetNPCCraftDefaultSettings(out CraftingJobSettings craftSettings)) { var cSettings = Activator.CreateInstance(craftSettings.GetType()) as CraftingJobSettings; cSettings.BlockTypes = craftSettings.BlockTypes; cSettings.CraftingCooldown = craftSettings.CraftingCooldown; cSettings.MaxCraftsPerHaul = craftSettings.MaxCraftsPerHaul; cSettings.NPCType = craftSettings.NPCType; cSettings.NPCTypeKey = craftSettings.NPCTypeKey; cSettings.OnCraftedAudio = craftSettings.OnCraftedAudio; cSettings.RecruitmentItem = craftSettings.RecruitmentItem; craftingJob.Settings = cSettings; } } data.Item1?.ApplyJobResearch(); }
public static void OnMonsterHit(IMonster monster, ModLoader.OnHitData d) { var cs = ColonyState.GetColonyState(monster.OriginalGoal); var pandaArmor = monster as IPandaArmor; var pamdaDamage = d.HitSourceObject as IPandaDamage; var skilled = 0f; if (pandaArmor != null && Random.NextFloat() <= pandaArmor.MissChance) { d.ResultDamage = 0; return; } if (pamdaDamage == null && d.HitSourceType == ModLoader.OnHitData.EHitSourceType.NPC) { var npc = d.HitSourceObject as NPCBase; var inv = ColonistInventory.Get(npc); ColonistManager.IncrimentSkill(npc); skilled = inv.GetSkillModifier(); if (inv.Weapon != null && Items.Weapons.WeaponFactory.WeaponLookup.TryGetValue(inv.Weapon.Id, out var wep)) { pamdaDamage = wep; } } if (pandaArmor != null && pamdaDamage != null) { d.ResultDamage = Items.Weapons.WeaponFactory.CalcDamage(pandaArmor, pamdaDamage); } else if (pandaArmor != null) { d.ResultDamage = DamageType.Physical.CalcDamage(pandaArmor.ElementalArmor, d.ResultDamage); if (pandaArmor.AdditionalResistance.TryGetValue(DamageType.Physical, out var flatResist)) { d.ResultDamage = d.ResultDamage - d.ResultDamage * flatResist; } } double skillRoll = Pipliz.Random.Next() + skilled; if (skillRoll < skilled) { d.ResultDamage += d.ResultDamage; } d.ResultDamage = d.ResultDamage - d.ResultDamage * cs.Difficulty.MonsterDamageReduction; if (d.ResultDamage < 0) { d.ResultDamage = 0; } if (d.HitSourceType == ModLoader.OnHitData.EHitSourceType.NPC) { var npc = d.HitSourceObject as NPCBase; var inv = ColonistInventory.Get(npc); inv.IncrimentStat("Damage Done", d.ResultDamage); if (skillRoll < skilled) { inv.IncrimentStat("Double Damage Hits"); } } if (d.ResultDamage >= monster.CurrentHealth) { monster.OnRagdoll(); var rewardMonster = monster as IPandaZombie; string monsterType = "zombie"; if (rewardMonster != null) { monsterType = rewardMonster.MosterType; } if (monster.OriginalGoal.OwnerIsOnline()) { if (!string.IsNullOrEmpty(monsterType) && LootTables.Lookup.TryGetValue(monsterType, out var lootTable)) { float luck = 0; if (d.HitSourceObject is ILucky luckSrc) { luck = luckSrc.Luck; } else if ((d.HitSourceType == ModLoader.OnHitData.EHitSourceType.PlayerClick || d.HitSourceType == ModLoader.OnHitData.EHitSourceType.PlayerProjectile) && d.HitSourceObject is Players.Player player) { var ps = PlayerState.GetPlayerState(player); foreach (var armor in ps.Armor) { if (Items.Armor.ArmorFactory.ArmorLookup.TryGetValue(armor.Value.Id, out var a)) { luck += a.Luck; } } if (Items.Weapons.WeaponFactory.WeaponLookup.TryGetValue(ps.Weapon.Id, out var w)) { luck += w.Luck; } } else if (d.HitSourceType == ModLoader.OnHitData.EHitSourceType.NPC && d.HitSourceObject is NPCBase nPC) { var inv = ColonistInventory.Get(nPC); foreach (var armor in inv.Armor) { if (Items.Armor.ArmorFactory.ArmorLookup.TryGetValue(armor.Value.Id, out var a)) { luck += a.Luck; } } if (Items.Weapons.WeaponFactory.WeaponLookup.TryGetValue(inv.Weapon.Id, out var w)) { luck += w.Luck; } } var roll = lootTable.GetDrops(luck); foreach (var item in roll) { monster.OriginalGoal.Stockpile.Add(item.Key, item.Value); } } } } }