示例#1
0
 static void Postfix(ActionType type, FishBowlUnitViewer __instance, FishBowlUnit ___fishBowlUnit)
 {
     if (type == ActionType.ActionAttack)
     {
         ShowHunger(__instance, ___fishBowlUnit);
     }
 }
示例#2
0
 static bool Prefix(FishBowlUnitViewer __instance, FishBowlUnit ___fishBowlUnit)
 {
     if (!enabled)
     {
         return(true);
     }
     ShowHunger(__instance, ___fishBowlUnit);
     return(false);
 }
示例#3
0
 static void Postfix(FishBowlUnitViewer __instance, FishBowlUnit ___fishBowlUnit)
 {
     if (!enabled)
     {
         return;
     }
     Dbgl("Fed fish");
     ShowHunger(__instance, ___fishBowlUnit);
 }
示例#4
0
        static void ShowHunger(FishBowlUnitViewer __instance, FishBowlUnit ___fishBowlUnit)
        {
            FieldRef <UnitViewer, PlayerTargetMultiAction> CurPlayerTargetRef = FieldRefAccess <UnitViewer, PlayerTargetMultiAction>("playerTarget");

            PlayerTargetMultiAction CurPlayerTarget = CurPlayerTargetRef(__instance);

            if (CurPlayerTarget == null)
            {
                return;
            }

            Dbgl("Showing Hunger");

            int count  = ___fishBowlUnit.FishCount;
            int hungry = count;

            for (int i = 0; i < count; i++)
            {
                if (___fishBowlUnit.GetFish(i).isFull)
                {
                    hungry--;
                }
            }

            ItemObject curUseItem = Module <Player> .Self.bag.itemBar.GetCurUseItem();

            if (curUseItem != null && FishData.HasId(curUseItem.ItemDataId))
            {
                CurPlayerTarget.SetAction(ActionType.ActionAttack, TextMgr.GetStr(300315, -1), ActionTriggerMode.Normal);
            }
            else if (curUseItem != null && FishFeedItem.HasId(curUseItem.ItemDataId))
            {
                CurPlayerTarget.SetAction(ActionType.ActionAttack, TextMgr.GetStr(300317, -1) + " (Hungry: " + hungry + "/" + ___fishBowlUnit.FishCount + ")", ActionTriggerMode.Normal);
            }
            else
            {
                CurPlayerTarget.RemoveAction(ActionType.ActionAttack, ActionTriggerMode.Normal);
            }
        }
示例#5
0
        static void ShowHunger(FishBowlUnitViewer __instance, FishBowlUnit ___fishBowlUnit)
        {
            PlayerTargetMultiAction CurPlayerTarget = (PlayerTargetMultiAction)typeof(UnitViewer).GetProperty("CurPlayerTarget", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(__instance, null);

            if (CurPlayerTarget == null)
            {
                return;
            }

            Dbgl("Showing Hunger");

            FishBowl fishBowl = AccessTools.FieldRefAccess <FishBowlUnit, FishBowl>(___fishBowlUnit, "fishBowl");
            float    max      = AccessTools.FieldRefAccess <FishBowl, FishBowl.FishBowlData>(fishBowl, "data").volumn;
            float    maxmax   = AccessTools.FieldRefAccess <FishBowl, FishBowl.FishBowlData>(fishBowl, "data").maxVolumn;
            int      count    = ___fishBowlUnit.FishCount;
            int      hungry   = 0;
            float    chp      = 0;
            float    mhp      = 0;
            float    lhp      = 0;
            Dictionary <int, List <FishInFishBowl> > fcounts = new Dictionary <int, List <FishInFishBowl> >();

            for (int i = 0; i < count; i++)
            {
                FishInFishBowl fish = ___fishBowlUnit.GetFish(i);

                if (fcounts.ContainsKey(fish.FishId))
                {
                    fcounts[fish.FishId].Add(fish);
                }
                else
                {
                    fcounts.Add(fish.FishId, new List <FishInFishBowl>()
                    {
                        fish
                    });
                }

                chp += fish.CurHp;
                mhp += fish.MaxHp;
                if (fish.CurHp > 0 && (lhp <= 0 || fish.CurHp / fish.MaxHp < lhp))
                {
                    lhp = fish.CurHp / fish.MaxHp;
                }

                if (fish.IsHunger)
                {
                    hungry++;
                }
            }

            List <string> fishs = new List <string>();

            foreach (KeyValuePair <int, List <FishInFishBowl> > kvp in fcounts)
            {
                int next = int.MaxValue;
                List <FishInFishBowl> list = kvp.Value;
                for (int i = list.Count - 1; i >= 0; i--)
                {
                    if (!list[i].IsDead && (!list[i].IsHunger || list[i].CanReproduce))
                    {
                        for (int j = 0; j < i; j++)
                        {
                            if (!list[j].IsDead && list[j].FishId == list[i].FishId && (!list[i].IsHunger || list[i].CanReproduce))
                            {
                                FishData data1      = AccessTools.FieldRefAccess <FishInFishBowl, FishData>(list[i], "data");
                                int      reproduce1 = AccessTools.FieldRefAccess <FishInFishBowl, int>(list[i], "reproduceDayCount");
                                int      thisNext1  = data1.DayToReproduce - reproduce1;
                                FishData data2      = AccessTools.FieldRefAccess <FishInFishBowl, FishData>(list[j], "data");
                                int      reproduce2 = AccessTools.FieldRefAccess <FishInFishBowl, int>(list[j], "reproduceDayCount");
                                int      thisNext2  = data2.DayToReproduce - reproduce2;
                                int      thisNext   = Math.Max(thisNext1, thisNext2);
                                if (thisNext < next)
                                {
                                    next = thisNext;
                                }
                            }
                        }
                    }
                }
                string nextRepro = next < int.MaxValue ? string.Format(strings[0], next) : "";
                fishs.Add($"{kvp.Value.Count} {Module<ItemDataMgr>.Self.GetItemName(kvp.Key)}{nextRepro}");
            }


            if (___fishBowlUnit.HasDeadFish())
            {
                CurPlayerTarget.SetAction(ActionType.ActionInteract, TextMgr.GetStr(300318, -1), ActionTriggerMode.Normal);
            }
            else if (___fishBowlUnit.FishCount > 0)
            {
                string full = "";
                if (count >= maxmax)
                {
                    full = strings[1];
                }
                else if (count >= max)
                {
                    full = strings[2];
                }
                CurPlayerTarget.SetAction(ActionType.ActionInteract, $"{TextMgr.GetStr(300316, -1)} ({count}/{maxmax}{full})", ActionTriggerMode.Normal);
                CurPlayerTarget.SetAction(ActionType.ActionMoveBack, $"{string.Join("\r\n",fishs.ToArray())}", ActionTriggerMode.Normal);
                CurPlayerTarget.SetAction(ActionType.ActionFavor, string.Format(strings[3], hungry, Math.Round(chp / mhp * 100), Math.Round(lhp * 100)), ActionTriggerMode.Normal);
            }
            else
            {
                CurPlayerTarget.RemoveAction(ActionType.ActionInteract, ActionTriggerMode.Normal);
                CurPlayerTarget.RemoveAction(ActionType.ActionMoveBack, ActionTriggerMode.Normal);
                CurPlayerTarget.RemoveAction(ActionType.ActionFavor, ActionTriggerMode.Normal);
            }
            return;
        }
示例#6
0
 static bool Prefix(FishBowlUnitViewer __instance, FishBowlUnit ___fishBowlUnit)
 {
     ShowHunger(__instance, ___fishBowlUnit);
     return(false);
 }