private static void NPCLeaving(NPCBase npc) { if (Random.NextFloat() > .49f) { float cost = PenalizeFood(npc.Colony, 0.05f); PandaChat.Send(npc.Colony, $"A colonist has left your colony taking {cost} food.", ChatColor.red); } else { var numberOfItems = Random.Next(1, 10); for (var i = 0; i < numberOfItems; i++) { var randItem = Random.Next(npc.Colony.Stockpile.ItemCount); var item = npc.Colony.Stockpile.GetByIndex(randItem); if (item.Type != ColonyBuiltIn.ItemTypes.AIR.Id && item.Amount != 0) { var leaveTax = Pipliz.Math.RoundToInt(item.Amount * .10); npc.Colony.Stockpile.TryRemove(item.Type, leaveTax); PandaChat.Send(npc.Colony, $"A leaving colonist has taken {leaveTax} {Models.ItemId.GetItemId(item.Type).Name}", ChatColor.red); } } PandaChat.Send(npc.Colony, $"A colonist has left your colony taking 10% of {numberOfItems} items from your stockpile.", ChatColor.red); } npc.health = 0; npc.OnDeath(); }
public static void OnMonsterHit(IMonster monster, ModLoader.OnHitData d) { var ps = PlayerState.GetPlayerState(monster.OriginalGoal); var pandaArmor = monster as IPandaArmor; var turret = d.HitSourceObject as IPandaDamage; if (pandaArmor != null && Random.NextFloat() <= pandaArmor.MissChance) { d.ResultDamage = 0; return; } if (pandaArmor != null && turret != null) { var damage = 0f; foreach (var dt in turret.Damage) { var tmpDmg = dt.Key.CalcDamage(pandaArmor.ElementalArmor, dt.Value); if (pandaArmor.AdditionalResistance.TryGetValue(dt.Key, out var flatResist)) { tmpDmg = tmpDmg - tmpDmg * flatResist; } damage += tmpDmg; } d.ResultDamage = damage; } 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; } } d.ResultDamage = d.ResultDamage - d.ResultDamage * ps.Difficulty.MonsterDamageReduction; if (Random.NextFloat() > .5f) { ServerManager.SendAudio(monster.Position, GameLoader.NAMESPACE + ".ZombieAudio"); } }
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(GameLoader.NAMESPACE + ".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(GameLoader.NAMESPACE + ".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(GameLoader.NAMESPACE + ".NumberSkilledLaborer", 0f))); } } catch (Exception ex) { PandaLogger.Log("NumberSkilledLaborer"); PandaLogger.LogError(ex); } if (addCount > 0) { if (addCount > 30) { addCount = 30; } if (!state.NotifySettlers) { AddNewSettlers(addCount, numbSkilled, state); } else { foreach (var p in state.ColonyRef.Owners) { if (p.IsConnected()) { NetworkMenu menu = new NetworkMenu(); menu.LocalStorage.SetAs("header", addCount + _localizationHelper.LocalizeOrDefault("NewSettlers", p)); menu.Width = 600; menu.Height = 300; menu.Items.Add(new ButtonCallback(GameLoader.NAMESPACE + ".NewSettlers.Accept." + addCount + "." + numbSkilled, new LabelData(_localizationHelper.GetLocalizationKey("Accept"), UnityEngine.Color.black, UnityEngine.TextAnchor.MiddleCenter))); menu.Items.Add(new ButtonCallback(GameLoader.NAMESPACE + ".NewSettlers.Decline", new LabelData(_localizationHelper.GetLocalizationKey("Decline"), UnityEngine.Color.black, UnityEngine.TextAnchor.MiddleCenter))); NetworkMenuManager.SendServerPopup(p, menu); } } } } } 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 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 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); } } } } }
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); }