Exemple #1
0
        public float GetProgress(IPandaQuest quest, Colony colony)
        {
            if (GoalCount == 0)
            {
                return(1);
            }

            var jobs = ColonyTool.GetJobCounts(colony);

            if (jobs.TryGetValue(NpcTypeKey, out var counts))
            {
                if (counts.TakenCount == 0)
                {
                    return(0);
                }

                if (counts.TakenCount == GoalCount)
                {
                    return(1);
                }
                else
                {
                    return(counts.TakenCount / GoalCount);
                }
            }
            else
            {
                return(0);
            }
        }
 public static ColonyModel MapColony(Colony c)
 {
     return(new ColonyModel()
     {
         ColonyId = c.ColonyID,
         Name = c.Name,
         LaborerCount = c.LaborerCount,
         AutoRecruit = c.JobFinder.AutoRecruit,
         AvailableMeals = c.Stockpile.TotalMeals,
         BedCount = c.BedTracker.BedCount,
         OpenJobCount = ColonyTool.GetJobCounts(c).Select(kvp => kvp.Value.AvailableCount).Sum(),
         StockpileCount = c.Stockpile.ItemCount,
         BannerCount = c.Banners.Length,
         ColonistCount = c.FollowerCount,
         Owners = c.Owners.Select(o => o.Name).ToList(),
         ColonyState = ColonyState.GetColonyState(c),
         MonsterCount = MonsterTracker.GetAllMonstersByID().Where(m => m.Value.OriginalGoal.ColonyID == c.ColonyID).Count()
     });
 }
        public static void PressButton(ButtonPressCallbackData data)
        {
            if (data.ButtonIdentifier.Contains(GameLoader.NAMESPACE + ".PlayerDetails"))
            {
                BuildPlayerDetailsMenu(data);
                return;
            }
            else if (data.ButtonIdentifier.Contains(".AddPlayerEquiptmentButton"))
            {
                NetworkMenu menu = new NetworkMenu();
                menu.LocalStorage.SetAs("header", _localizationHelper.LocalizeOrDefault("PlayerEquiptment", data.Player));
                menu.Width  = 1000;
                menu.Height = 600;

                if (data.ButtonIdentifier.Contains("MagicItem."))
                {
                    var id = data.ButtonIdentifier.Replace("AddPlayerEquiptmentButton", "");

                    foreach (var kvp in data.Player.ActiveColony.Stockpile.Items)
                    {
                        if (kvp.Value > 0 &&
                            ItemTypes.TryGetType(kvp.Key, out var itemType) &&
                            MagicItemsCache.PlayerMagicItems.TryGetValue(itemType.Name, out var magicItem) &&
                            !Armor.ArmorFactory.ArmorLookup.ContainsKey(kvp.Key) &&
                            !Weapons.WeaponFactory.WeaponLookup.ContainsKey(kvp.Key))
                        {
                            List <ValueTuple <IItem, int> > items = new List <ValueTuple <IItem, int> >();
                            items.Add(ValueTuple.Create <IItem, int>(new ItemIcon(kvp.Key), 250));
                            items.Add(ValueTuple.Create <IItem, int>(new Label(new LabelData(magicItem.name, UnityEngine.Color.black, UnityEngine.TextAnchor.MiddleLeft, 18, LabelData.ELocalizationType.Type)), 250));
                            items.Add(ValueTuple.Create <IItem, int>(new Label(new LabelData(_localizationHelper.LocalizeOrDefault("Stockpile", data.Player) + ": " + kvp.Value.ToString(), UnityEngine.Color.black)), 250));
                            items.Add(ValueTuple.Create <IItem, int>(new ButtonCallback(id + kvp.Key + ".AddPlayerSelectedEquiptmentButton", new LabelData(_localizationHelper.GetLocalizationKey("Select"), UnityEngine.Color.black, UnityEngine.TextAnchor.MiddleCenter)), 250));
                            menu.Items.Add(new HorizontalRow(items));
                        }
                    }
                }
                else
                {
                    foreach (var kvp in data.Player.ActiveColony.Stockpile.Items)
                    {
                        if (kvp.Value > 0 && Armor.ArmorFactory.ArmorLookup.TryGetValue(kvp.Key, out var armItem) && data.ButtonIdentifier.Contains(armItem.Slot + "."))
                        {
                            List <ValueTuple <IItem, int> > items = new List <ValueTuple <IItem, int> >();
                            items.Add(ValueTuple.Create <IItem, int>(new ItemIcon(kvp.Key), 250));
                            items.Add(ValueTuple.Create <IItem, int>(new Label(new LabelData(armItem.name, UnityEngine.Color.black, UnityEngine.TextAnchor.MiddleLeft, 18, LabelData.ELocalizationType.Type)), 250));
                            items.Add(ValueTuple.Create <IItem, int>(new Label(new LabelData(_localizationHelper.LocalizeOrDefault("Stockpile", data.Player) + ": " + kvp.Value.ToString(), UnityEngine.Color.black)), 250));
                            items.Add(ValueTuple.Create <IItem, int>(new ButtonCallback(kvp.Key + ".AddPlayerSelectedEquiptmentButton", new LabelData(_localizationHelper.GetLocalizationKey("Select"), UnityEngine.Color.black, UnityEngine.TextAnchor.MiddleCenter)), 250));
                            menu.Items.Add(new HorizontalRow(items));
                        }
                    }
                }

                NetworkMenuManager.SendServerPopup(data.Player, menu);
            }
            else if (data.ButtonIdentifier.Contains(".AddPlayerSelectedEquiptmentButton"))
            {
                if (data.ButtonIdentifier.Contains("MagicItem."))
                {
                    var startPos = data.ButtonIdentifier.Replace("MagicItem.", "");

                    if (int.TryParse(startPos.Substring(0, startPos.IndexOf('.')), out var slot))
                    {
                        var itemId = startPos.Substring(startPos.IndexOf('.') + 1, startPos.LastIndexOf(".") - 2);

                        if (ushort.TryParse(itemId, out var id))
                        {
                            var item = ItemId.GetItemId(id);

                            if (MagicItemsCache.PlayerMagicItems.TryGetValue(item.Name, out var magicItem) && data.Player.ActiveColony.Stockpile.TryRemove(id))
                            {
                                var ps = PlayerState.GetPlayerState(data.Player);
                                ps.MagicItems[slot] = magicItem;
                                ps.RecaclculateMagicItems();
                            }
                        }
                    }

                    BuildPlayerDetailsMenu(data);
                    return;
                }
                else
                {
                    foreach (var kvp in data.Player.ActiveColony.Stockpile.Items)
                    {
                        if (Armor.ArmorFactory.ArmorLookup.TryGetValue(kvp.Key, out var armItem) &&
                            data.ButtonIdentifier.Contains(kvp.Key + ".") &&
                            data.Player.ActiveColony.Stockpile.TryRemove(kvp.Key))
                        {
                            var ps = PlayerState.GetPlayerState(data.Player);

                            if (ps.Armor[armItem.Slot].Id != default(ushort))
                            {
                                data.Player.ActiveColony.Stockpile.Add(ps.Armor[armItem.Slot].Id);
                            }

                            ps.Armor[armItem.Slot].Id         = kvp.Key;
                            ps.Armor[armItem.Slot].Durability = armItem.Durability;
                            ps.RecaclculateMagicItems();
                            BuildPlayerDetailsMenu(data);
                            return;
                        }
                    }
                }
            }
            else if (data.ButtonIdentifier.Contains(".RemovePlayerEquiptmentButton"))
            {
                var ps = PlayerState.GetPlayerState(data.Player);

                if (data.ButtonIdentifier.Contains("MagicItem."))
                {
                    if (int.TryParse(data.ButtonIdentifier.Replace("MagicItem.", "").Replace(".RemovePlayerEquiptmentButton", ""), out var id))
                    {
                        data.Player.ActiveColony.Stockpile.Add(ItemId.GetItemId(ps.MagicItems[id].name));
                        ps.MagicItems[id] = null;
                    }
                }
                else
                {
                    foreach (var armor in ps.Armor)
                    {
                        if (data.ButtonIdentifier.Contains(armor.Key + "."))
                        {
                            if (armor.Value.Id != default(ushort))
                            {
                                data.Player.ActiveColony.Stockpile.Add(armor.Value.Id);
                            }

                            armor.Value.Id         = default(ushort);
                            armor.Value.Durability = default(int);
                            break;
                        }
                    }
                }

                ps.RecaclculateMagicItems();
                BuildPlayerDetailsMenu(data);
            }
            else if (data.ButtonIdentifier.Contains(".JobDetailsButton"))
            {
                Dictionary <string, JobCounts> jobCounts = ColonyTool.GetJobCounts(data.Player.ActiveColony);

                foreach (var jobKvp in jobCounts)
                {
                    if (data.ButtonIdentifier.Contains(jobKvp.Key))
                    {
                        NetworkMenu menu = new NetworkMenu();
                        menu.LocalStorage.SetAs("header", _localizationHelper.LocalizeOrDefault(jobKvp.Key.Replace(" ", ""), data.Player) + " " + _localizationHelper.LocalizeOrDefault("JobDetails", data.Player));
                        menu.Width  = 1000;
                        menu.Height = 600;

                        var firstGuy = jobKvp.Value.TakenJobs.FirstOrDefault();
                        var firstInv = Entities.SettlerInventory.GetSettlerInventory(firstGuy.NPC);
                        List <ValueTuple <IItem, int> > headerItems = new List <ValueTuple <IItem, int> >();

                        headerItems.Add(ValueTuple.Create <IItem, int>(new Label(new LabelData(_localizationHelper.GetLocalizationKey("Name"), UnityEngine.Color.black)), 100));
                        headerItems.Add(ValueTuple.Create <IItem, int>(new Label(new LabelData(_localizationHelper.GetLocalizationKey("Weapon"), UnityEngine.Color.black)), 100));

                        foreach (var a in firstInv.Armor)
                        {
                            headerItems.Add(ValueTuple.Create <IItem, int>(new Label(new LabelData(_localizationHelper.GetLocalizationKey(a.Key.ToString()), UnityEngine.Color.black)), 100));
                        }

                        menu.Items.Add(new HorizontalRow(headerItems));

                        foreach (var job in jobKvp.Value.TakenJobs)
                        {
                            var inv = Entities.SettlerInventory.GetSettlerInventory(job.NPC);
                            List <ValueTuple <IItem, int> > items = new List <ValueTuple <IItem, int> >();
                            items.Add(ValueTuple.Create <IItem, int>(new Label(new LabelData(inv.SettlerName, UnityEngine.Color.black)), 100));
                            items.Add(ValueTuple.Create <IItem, int>(new ItemIcon(inv.Weapon.Id), 100));

                            foreach (var armor in inv.Armor)
                            {
                                items.Add(ValueTuple.Create <IItem, int>(new ItemIcon(armor.Value.Id), 100));
                            }

                            items.Add(ValueTuple.Create <IItem, int>(new ButtonCallback(jobKvp.Key + "." + job.NPC.ID + ".EquiptmentButton", new LabelData(_localizationHelper.GetLocalizationKey("Details"), UnityEngine.Color.black, UnityEngine.TextAnchor.MiddleCenter)), 100));
                            menu.Items.Add(new HorizontalRow(items));
                        }

                        menu.Items.Add(new Line());
                        menu.Items.Add(new ButtonCallback(GameLoader.NAMESPACE + ".ColonyToolMainMenu", new LabelData(_localizationHelper.GetLocalizationKey("Back"), UnityEngine.Color.black, UnityEngine.TextAnchor.MiddleCenter)));

                        NetworkMenuManager.SendServerPopup(data.Player, menu);
                        return;
                    }
                }
            }
            else if (data.ButtonIdentifier.Contains(".EquiptmentButton"))
            {
                Dictionary <string, JobCounts> jobCounts = ColonyTool.GetJobCounts(data.Player.ActiveColony);

                foreach (var jobKvp in jobCounts)
                {
                    if (data.ButtonIdentifier.Contains(jobKvp.Key))
                    {
                        foreach (var job in jobKvp.Value.TakenJobs)
                        {
                            if (data.ButtonIdentifier.Contains("." + job.NPC.ID.ToString() + ".EquiptmentButton"))
                            {
                                BuildSettlerDetailMenu(data, jobKvp, job);
                                return;
                            }
                        }
                    }
                }
            }
            else if (data.ButtonIdentifier.Contains(".AddEquiptmentButton"))
            {
                Dictionary <string, JobCounts> jobCounts = ColonyTool.GetJobCounts(data.Player.ActiveColony);

                foreach (var jobKvp in jobCounts)
                {
                    if (data.ButtonIdentifier.Contains(jobKvp.Key))
                    {
                        foreach (var job in jobKvp.Value.TakenJobs)
                        {
                            if (data.ButtonIdentifier.Contains("." + job.NPC.ID.ToString() + "."))
                            {
                                var         inv  = Entities.SettlerInventory.GetSettlerInventory(job.NPC);
                                NetworkMenu menu = new NetworkMenu();
                                menu.LocalStorage.SetAs("header", inv.SettlerName + " " + _localizationHelper.LocalizeOrDefault("Equiptment", data.Player));
                                menu.Width  = 1000;
                                menu.Height = 600;
                                var newButtonID = data.ButtonIdentifier.Replace(".AddEquiptmentButton", "");

                                if (data.ButtonIdentifier.Contains(".wep."))
                                {
                                    foreach (var kvp in data.Player.ActiveColony.Stockpile.Items)
                                    {
                                        if (kvp.Value > 0 && Weapons.WeaponFactory.WeaponLookup.TryGetValue(kvp.Key, out var wepItem))
                                        {
                                            List <ValueTuple <IItem, int> > items = new List <ValueTuple <IItem, int> >();
                                            items.Add(ValueTuple.Create <IItem, int>(new ItemIcon(kvp.Key), 250));
                                            items.Add(ValueTuple.Create <IItem, int>(new Label(new LabelData(wepItem.name, UnityEngine.Color.black, UnityEngine.TextAnchor.MiddleLeft, 18, LabelData.ELocalizationType.Type)), 250));
                                            items.Add(ValueTuple.Create <IItem, int>(new Label(new LabelData(_localizationHelper.LocalizeOrDefault("Stockpile", data.Player) + ": " + kvp.Value.ToString(), UnityEngine.Color.black)), 250));
                                            items.Add(ValueTuple.Create <IItem, int>(new ButtonCallback(newButtonID + "." + kvp.Key + ".AddSelectedEquiptmentButton", new LabelData(_localizationHelper.GetLocalizationKey("Select"), UnityEngine.Color.black, UnityEngine.TextAnchor.MiddleCenter)), 250));
                                            menu.Items.Add(new HorizontalRow(items));
                                        }
                                    }
                                }
                                else if (data.ButtonIdentifier.Contains(".arm."))
                                {
                                    foreach (var kvp in data.Player.ActiveColony.Stockpile.Items)
                                    {
                                        if (kvp.Value > 0 && Armor.ArmorFactory.ArmorLookup.TryGetValue(kvp.Key, out var armItem) && data.ButtonIdentifier.Contains("." + armItem.Slot + "."))
                                        {
                                            List <ValueTuple <IItem, int> > items = new List <ValueTuple <IItem, int> >();
                                            items.Add(ValueTuple.Create <IItem, int>(new ItemIcon(kvp.Key), 250));
                                            items.Add(ValueTuple.Create <IItem, int>(new Label(new LabelData(armItem.name, UnityEngine.Color.black, UnityEngine.TextAnchor.MiddleLeft, 18, LabelData.ELocalizationType.Type)), 250));
                                            items.Add(ValueTuple.Create <IItem, int>(new Label(new LabelData(_localizationHelper.LocalizeOrDefault("Stockpile", data.Player) + ": " + kvp.Value.ToString(), UnityEngine.Color.black)), 250));
                                            items.Add(ValueTuple.Create <IItem, int>(new ButtonCallback(newButtonID + "." + kvp.Key + ".AddSelectedEquiptmentButton", new LabelData(_localizationHelper.GetLocalizationKey("Select"), UnityEngine.Color.black, UnityEngine.TextAnchor.MiddleCenter)), 250));
                                            menu.Items.Add(new HorizontalRow(items));
                                        }
                                    }
                                }

                                NetworkMenuManager.SendServerPopup(data.Player, menu);
                                return;
                            }
                        }
                    }
                }
            }
            else if (data.ButtonIdentifier.Contains(".AddSelectedEquiptmentButton"))
            {
                Dictionary <string, JobCounts> jobCounts = ColonyTool.GetJobCounts(data.Player.ActiveColony);

                foreach (var jobKvp in jobCounts)
                {
                    if (data.ButtonIdentifier.Contains(jobKvp.Key))
                    {
                        foreach (var job in jobKvp.Value.TakenJobs)
                        {
                            if (data.ButtonIdentifier.Contains("." + job.NPC.ID.ToString() + "."))
                            {
                                if (data.ButtonIdentifier.Contains(".wep."))
                                {
                                    foreach (var kvp in data.Player.ActiveColony.Stockpile.Items)
                                    {
                                        if (Weapons.WeaponFactory.WeaponLookup.TryGetValue(kvp.Key, out var wepItem) &&
                                            data.ButtonIdentifier.Contains("." + kvp.Key + ".") &&
                                            job.NPC.Colony.Stockpile.TryRemove(kvp.Key))
                                        {
                                            var inv = Entities.SettlerInventory.GetSettlerInventory(job.NPC);

                                            if (inv.Weapon.Id != default(ushort))
                                            {
                                                job.NPC.Colony.Stockpile.Add(inv.Weapon.Id);
                                            }

                                            inv.Weapon.Id         = kvp.Key;
                                            inv.Weapon.Durability = wepItem.WepDurability;
                                            BuildSettlerDetailMenu(data, jobKvp, job);
                                            return;
                                        }
                                    }
                                }
                                else if (data.ButtonIdentifier.Contains(".arm."))
                                {
                                    foreach (var kvp in data.Player.ActiveColony.Stockpile.Items)
                                    {
                                        if (Armor.ArmorFactory.ArmorLookup.TryGetValue(kvp.Key, out var armItem) &&
                                            data.ButtonIdentifier.Contains("." + kvp.Key + ".") &&
                                            job.NPC.Colony.Stockpile.TryRemove(kvp.Key))
                                        {
                                            var inv = Entities.SettlerInventory.GetSettlerInventory(job.NPC);

                                            if (inv.Armor[armItem.Slot].Id != default(ushort))
                                            {
                                                job.NPC.Colony.Stockpile.Add(inv.Armor[armItem.Slot].Id);
                                            }

                                            inv.Armor[armItem.Slot].Id         = kvp.Key;
                                            inv.Armor[armItem.Slot].Durability = armItem.Durability;
                                            BuildSettlerDetailMenu(data, jobKvp, job);
                                            return;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            else if (data.ButtonIdentifier.Contains(".RemoveEquiptmentButton"))
            {
                Dictionary <string, JobCounts> jobCounts = ColonyTool.GetJobCounts(data.Player.ActiveColony);

                foreach (var jobKvp in jobCounts)
                {
                    if (data.ButtonIdentifier.Contains(jobKvp.Key))
                    {
                        foreach (var job in jobKvp.Value.TakenJobs)
                        {
                            if (data.ButtonIdentifier.Contains("." + job.NPC.ID.ToString() + ".EquiptmentButton"))
                            {
                                var inv = Entities.SettlerInventory.GetSettlerInventory(job.NPC);

                                if (data.ButtonIdentifier.Contains(".wep."))
                                {
                                    if (inv.Weapon.Id != default(ushort))
                                    {
                                        job.NPC.Colony.Stockpile.Add(inv.Weapon.Id);
                                    }

                                    inv.Weapon.Id         = default(ushort);
                                    inv.Weapon.Durability = default(int);
                                }
                                else if (data.ButtonIdentifier.Contains(".arm."))
                                {
                                    foreach (var armor in inv.Armor)
                                    {
                                        if (data.ButtonIdentifier.Contains("." + armor.Key + "."))
                                        {
                                            if (armor.Value.Id != default(ushort))
                                            {
                                                job.NPC.Colony.Stockpile.Add(armor.Value.Id);
                                            }

                                            armor.Value.Id         = default(ushort);
                                            armor.Value.Durability = default(int);
                                            break;
                                        }
                                    }
                                }

                                BuildSettlerDetailMenu(data, jobKvp, job);
                                return;
                            }
                        }
                    }
                }
            }
            else if (data.ButtonIdentifier.Contains(".ColonyToolMainMenu"))
            {
                Dictionary <string, JobCounts> jobCounts = ColonyTool.GetJobCounts(data.Player.ActiveColony);
                NetworkMenuManager.SendServerPopup(data.Player, ColonyTool.BuildMenu(data.Player, jobCounts, false, string.Empty, 0));
            }
        }