private static bool EvaluateBeds(ColonyState state) { var update = false; try { if (!TimeCycle.IsDay && Time.SecondsSinceStartDouble > _nextbedTime) { if (state.ColonyRef.OwnerIsOnline()) { // TODO Fix bed count var remainingBeds = ServerManager.BlockEntityTracker.BedTracker.CalculateBedCount(state.ColonyRef) - state.ColonyRef.FollowerCount; var left = 0; if (remainingBeds >= 0) { state.NeedsABed = 0; } else { if (state.NeedsABed == 0) { state.NeedsABed = Time.SecondsSinceStartDouble + LOABOROR_LEAVE_HOURS; PandaChat.Send(state.ColonyRef, SettlerReasoning.GetNeedBed(), ChatColor.grey); } if (state.NeedsABed != 0 && state.NeedsABed < Time.SecondsSinceStartDouble) { foreach (var follower in state.ColonyRef.Followers) { if (follower.UsedBed == null) { left++; NPCLeaving(follower); } } state.NeedsABed = 0; } if (left > 0) { PandaChat.Send(state.ColonyRef, string.Concat(SettlerReasoning.GetNoBed(), string.Format(" {0} colonists have left your colony.", left)), ChatColor.red); update = true; } } state.ColonyRef.SendCommonData(); } _nextbedTime = Time.SecondsSinceStartDouble + Random.Next(5, 8) * IN_GAME_HOUR_IN_SECONDS * 24; } } catch (Exception ex) { PandaLogger.LogError(ex, "EvaluateBeds"); } return(update); }
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); } }
private static bool EvaluateLaborers(Players.Player p) { var update = false; if (TimeCycle.IsDay && Time.SecondsSinceStartDouble > _nextLaborerTime) { if (p.IsConnected) { var unTrack = new List <NPCBase>(); var colony = Colony.Get(p); var state = PlayerState.GetPlayerState(p); var left = 0; for (var i = 0; i < colony.LaborerCount; i++) { var npc = colony.FindLaborer(i); var tmpVals = npc.GetTempValues(); if (!tmpVals.Contains(LEAVETIME_JOB)) { tmpVals.Set(LEAVETIME_JOB, Time.SecondsSinceStartDouble + LOABOROR_LEAVE_HOURS); } else if (tmpVals.Get <double>(LEAVETIME_JOB) < TimeCycle.TotalTime) { left++; NPCLeaving(npc); } } if (left > 0) { PandaChat.Send(p, string.Concat(SettlerReasoning.GetNoJobReason(), string.Format(" {0} colonists have left your colony.", left)), ChatColor.red); } update = unTrack.Count != 0; colony.SendUpdate(); } _nextLaborerTime = Time.SecondsSinceStartDouble + Random.Next(4, 6) * TimeCycle.SecondsPerHour; } return(update); }
private static bool EvaluateLaborers(ColonyState state) { var update = false; if (TimeCycle.IsDay && Time.SecondsSinceStartDouble > _nextLaborerTime) { if (state.ColonyRef.OwnerIsOnline()) { var unTrack = new List <NPCBase>(); var left = 0; for (var i = 0; i < state.ColonyRef.LaborerCount; i++) { var npc = state.ColonyRef.FindLaborer(i); if (!npc.CustomData.TryGetAs(LEAVETIME_JOB, out double leaveTime)) { npc.CustomData.SetAs(LEAVETIME_JOB, Time.SecondsSinceStartDouble + LOABOROR_LEAVE_HOURS); } else if (leaveTime < Time.SecondsSinceStartDouble) { left++; NPCLeaving(npc); } } if (left > 0) { PandaChat.Send(state.ColonyRef, string.Concat(SettlerReasoning.GetNoJobReason(), string.Format(" {0} colonists have left your colony.", left)), ChatColor.red); } update = unTrack.Count != 0; state.ColonyRef.SendCommonData(); } _nextLaborerTime = Time.SecondsSinceStartDouble + Random.Next(4, 6) * IN_GAME_HOUR_IN_SECONDS * 24; } return(update); }
private static bool EvaluateBeds(Players.Player p) { var update = false; try { if (!TimeCycle.IsDay && Time.SecondsSinceStartDouble > _nextbedTime) { if (p.IsConnected) { var colony = Colony.Get(p); var state = PlayerState.GetPlayerState(p); var remainingBeds = BedBlockTracker.GetCount(p) - colony.FollowerCount; var left = 0; if (remainingBeds >= 0) { state.NeedsABed = 0; } else { if (state.NeedsABed == 0) { state.NeedsABed = Time.SecondsSinceStartDouble + LOABOROR_LEAVE_HOURS; PandaChat.Send(p, SettlerReasoning.GetNeedBed(), ChatColor.grey); } if (state.NeedsABed != 0 && state.NeedsABed < TimeCycle.TotalTime) { foreach (var follower in colony.Followers) { if (follower.GetFieldValue <BedBlock, NPCBase>("bed") == null) { left++; NPCLeaving(follower); } } state.NeedsABed = 0; } if (left > 0) { PandaChat.Send(p, string.Concat(SettlerReasoning.GetNoBed(), string.Format(" {0} colonists have left your colony.", left)), ChatColor.red); update = true; } } colony.SendUpdate(); } _nextbedTime = Time.SecondsSinceStartDouble + Random.Next(5, 8) * TimeCycle.SecondsPerHour; } } catch (Exception ex) { PandaLogger.LogError(ex, "EvaluateBeds"); } 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); }
private static bool EvaluateBeds(ColonyState state) { var update = false; try { if (!TimeCycle.IsDay && TimeCycle.TotalHours > state.NextBedTime) { var remainingBeds = state.ColonyRef.BedTracker.CalculateTotalBedCount() - state.ColonyRef.FollowerCount; var left = 0; if (remainingBeds >= 0) { state.NeedsABed = 0; } else { if (state.NeedsABed == 0) { state.NeedsABed = TimeCycle.TotalHours + 24; PandaChat.Send(state.ColonyRef, _localizationHelper, SettlerReasoning.GetNeedBed(), ChatColor.grey); } else if (state.NeedsABed <= TimeCycle.TotalHours) { List <NPCBase> leaving = new List <NPCBase>(); foreach (var follower in state.ColonyRef.Followers) { if (follower.UsedBed == null) { left++; leaving.Add(follower); } } state.NeedsABed = 0; foreach (var npc in leaving) { NPCLeaving(npc); } } if (left > 0) { PandaChat.Send(state.ColonyRef, _localizationHelper, string.Concat(SettlerReasoning.GetNoBed(), string.Format(" {0} colonists have left your colony.", left)), ChatColor.red); update = true; } state.ColonyRef.SendCommonData(); } state.NextBedTime = TimeCycle.TotalHours + Random.Next(5, 8); } } catch (Exception ex) { SettlersLogger.LogError(ex, "EvaluateBeds"); } return(update); }
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); }