public bool AssignNonExcludedFollower(NPCBase follower, Vector3Int position) { var job = follower.Job; if (!IsJobExcluded(job)) { try { if (follower.Job != null) { follower.Job.NPC = null; follower.ClearJob(); } } catch (Exception ex) { Logger.Log("ActivateMilitia Error has occurred: {0}", ex.Message); } var militiaJob = new MilitiaJob(); militiaJob.InitializeJob(player, position, follower.ID); militiaJob.OnAssignedNPC(follower); follower.TakeJob(militiaJob); ColonyManager.AddJobs(militiaJob); return(true); } return(false); }
public static void OnPlayerConnectedEarly(Players.Player p) { if (p.IsConnected && !Configuration.OfflineColonies) { foreach (Colony c in p.Colonies) { if (c.Owners.Count(own => own.IsConnected) == 1) { var file = $"{GameLoader.GAMEDATA_FOLDER}/savegames/{ServerManager.WorldName}/NPCArchive/{c.ColonyID}.json"; if (File.Exists(file) && JSON.Deserialize(file, out var followersNode, false)) { File.Delete(file); PandaLogger.Log(ChatColor.cyan, $"Player {p.ID.steamID} is reconnected. Restoring Colony."); foreach (var node in followersNode.LoopArray()) { try { node.SetAs("id", GetAIID()); var npc = new NPCBase(c, node); c.RegisterNPC(npc); NPCTracker.Add(npc); ModLoader.TriggerCallbacks(ModLoader.EModCallbackType.OnNPCLoaded, npc, node); foreach (var job in new List <IJob>(c.JobFinder.JobsData.OpenJobs)) { if (node.TryGetAs("JobPoS", out JSONNode pos) && job.GetJobLocation() == (Vector3Int)pos) { if (job.IsValid && job.NeedsNPC) { npc.TakeJob(job); c.JobFinder.Remove(job); } break; } } } catch (Exception ex) { PandaLogger.LogError(ex); } } JSON.Serialize(file, new JSONNode(NodeType.Array)); c.JobFinder.Update(); c.SendCommonData(); } } } } }
public bool AssignLaborerFirst(NPCBase follower, Vector3Int position) { if (follower.NPCType.IsLaborer) { var militiaJob = new MilitiaJob(); militiaJob.InitializeJob(player, position, follower.ID); militiaJob.OnAssignedNPC(follower); follower.TakeJob(militiaJob); ColonyManager.AddJobs(militiaJob); return(true); } return(false); }
public static void OnPlayerConnectedEarly(Players.Player p) { if (p.IsConnected && !Configuration.OfflineColonies) { var jf = JobTracker.GetOrCreateJobFinder(p) as JobTracker.JobFinder; var file = $"{GameLoader.GAMEDATA_FOLDER}/savegames/{ServerManager.WorldName}/players/NPCArchive/{p.ID.steamID.ToString()}.json"; if (File.Exists(file) && JSON.Deserialize(file, out var followersNode, false)) { PandaLogger.Log(ChatColor.cyan, $"Player {p.ID.steamID} is reconnected. Restoring Colony."); foreach (var node in followersNode.LoopArray()) { try { node.SetAs("id", GetAIID()); var npc = new NPCBase(p, node); ModLoader.TriggerCallbacks(ModLoader.EModCallbackType.OnNPCLoaded, npc, node); foreach (var job in jf.openJobs) { if (node.TryGetAs("JobPoS", out JSONNode pos) && job.KeyLocation == (Vector3Int)pos) { if (job.IsValid && job.NeedsNPC) { npc.TakeJob(job); job.NPC = npc; JobTracker.Remove(p, job.KeyLocation); } break; } } } catch (Exception ex) { PandaLogger.LogError(ex); } } JSON.Serialize(file, new JSONNode(NodeType.Array)); jf.Update(); } } }
public virtual void InitializeJob(Players.Player owner, Vector3Int position, int desiredNPCID) { this.position = position; this.owner = owner; if (desiredNPCID != 0 && NPCTracker.TryGetNPC(desiredNPCID, out usedNPC)) { usedNPC.TakeJob(this); } else { desiredNPCID = 0; } if (usedNPC == null) { JobTracker.Add(this); } }
public DefaultFarmerAreaJob(Players.Player owner, Vector3Int min, Vector3Int max, int npcID = 0) { positionMin = min; positionMax = max; this.owner = owner; if (npcID != 0 && NPCTracker.TryGetNPC(npcID, out usedNPC)) { usedNPC.TakeJob(this); } else { npcID = 0; } if (usedNPC == null) { JobTracker.Add(this); } }
public virtual void InitializeJob(Players.Player owner, Vector3Int position, int desiredNPCID) { this.position = position; this.owner = owner; if (desiredNPCID != 0) { if (NPCTracker.TryGetNPC(desiredNPCID, out usedNPC)) { usedNPC.TakeJob(this); } else { Log.WriteWarning("Failed to find npc ID {0}", desiredNPCID); } } if (usedNPC == null) { JobTracker.Add(this); } }
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 PressButton(ButtonPressCallbackData data) { if ((!data.ButtonIdentifier.Contains(".RecruitButton") && !data.ButtonIdentifier.Contains(".FireButton") && !data.ButtonIdentifier.Contains(".SwapJob") && !data.ButtonIdentifier.Contains(".ColonyToolMainMenu") && !data.ButtonIdentifier.Contains(".KillFired") && !data.ButtonIdentifier.Contains(".AutoRecruitment")) || data.Player.ActiveColony == null) { return; } Dictionary <string, JobCounts> jobCounts = GetJobCounts(data.Player.ActiveColony); Dictionary <Players.Player, string> AutoRecruit_Opt = new Dictionary <Players.Player, string>(); 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(Nach0Config.NAMESPACE + ".FiredJobName", job.Key); menu.LocalStorage.SetAs(Nach0Config.NAMESPACE + ".FiredJobCount", count); NetworkMenuManager.SendServerPopup(data.Player, menu); break; } } } else if (data.ButtonIdentifier.Contains(".KillFired")) { var firedJob = data.Storage.GetAs <string>(Nach0Config.NAMESPACE + ".FiredJobName"); var count = data.Storage.GetAs <int>(Nach0Config.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(".SwapJob")) { var firedJob = data.Storage.GetAs <string>(Nach0Config.NAMESPACE + ".FiredJobName"); var count = data.Storage.GetAs <int>(Nach0Config.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); Chat.Send(data.Player, "<color=red>Notenoughfood</color>"); 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(".AutoRecruitment")) { if (AutoRecruit_Opt[data.Player].Equals("on")) { AutoRecruit_Opt[data.Player] = "off"; Chat.Send(data.Player, "<color=blue>Auto Recruitment is now " + AutoRecruit_Opt[data.Player] + "</color>"); } else { AutoRecruit_Opt[data.Player] = "on"; Chat.Send(data.Player, "<color=blue>Auto Recruitment is now " + AutoRecruit_Opt[data.Player] + "</color>"); } } }