示例#1
0
        public static RunStatus EquipOptimalRing(EquipmentContext context, ushort slot, ushort other)
        {
            var prospects = GearEvaluator.GetProspects(context, slot)
                            .Where(s => s.Slot != other);

            var current  = Equipment.GetEquipmentSlot(slot);
            var prospect = prospects.FirstOrDefault();

            if (prospect == null || prospect.Slot == slot)
            {
                context.SlotChecked[slot] = true;
                return(RunStatus.Success);
            }

            if (context.OptimizeBySpiritbind && prospect.SpiritBond >= 100f)
            {
                if (current.Item.ItemLevel < context.MinimumItemLevel)
                {
                    EquipItem(current, prospect);
                }

                context.SlotChecked[slot] = true;
                return(RunStatus.Success);
            }

            EquipItem(current, prospect);
            context.SlotChecked[slot] = true;
            return(RunStatus.Success);
        }
示例#2
0
 private static bool NeedsOptimization(EquipmentContext context)
 {
     return(context.Optimizing ||
            context.Level != Core.Me.ClassLevel ||
            context.Job != Core.Me.CurrentJob ||
            !context.InitialCheck ||
            context.TimerElapsed);
 }
示例#3
0
        private static List <BagSlot> GetProspectsByScore(EquipmentContext context, ushort slot)
        {
            byte minLevel    = context.MinimumItemLevel;
            var  statWeights = Database.StatWeights.First(sw => sw.Job == Core.Me.CurrentJob);

            var prospects = Equipment.GetAllEquipmentFor(slot, minLevel)
                            .OrderByDescending(s => s.Item.Score(statWeights))
                            .ThenByDescending(i => i.Item.ItemLevel)
                            .ToList();

            return(prospects);
        }
示例#4
0
        public static Composite GetBehavior(EquipmentContext context)
        {
            var startup = new Decorator(req => !context.Optimizing, new Action(r => context.Optimizing = true));
            var cleanup = new Action(r => context.Reset());

            var optimize = new PrioritySelector(startup, EquipWeapon(context), EquipArmor(context, 2), EquipArmor(context, 7),
                                                EquipArmor(context, 3), EquipArmor(context, 4), EquipArmor(context, 5), EquipRing(context, 11, 12),
                                                EquipArmor(context, 6), EquipArmor(context, 8), EquipArmor(context, 9), EquipRing(context, 12, 11),
                                                EquipArmor(context, 10), EquipOffhand(context), cleanup);

            return(new Decorator(req => CanOptimize && NeedsOptimization(context), optimize));
        }
示例#5
0
        public static Composite CreateBehavior(EquipmentContext equipContext, RepairContext repairContext)
        {
            var repair = repairContext.RepairEnabled ? RepairBehavior.CreateBehavior(repairContext)
                : new Action(r => RunStatus.Failure);

            var optimize = equipContext.OptimizerEnabled ? GearOptimizer.GetBehavior(equipContext)
                : new Action(r => RunStatus.Failure);

            var behavior = new PrioritySelector(repair, optimize);

            return(new Decorator(req => CanAct, behavior));
        }
示例#6
0
        private static RunStatus EquipOptimalOffhand(EquipmentContext context)
        {
            var statWeights = Database.StatWeights.First(sw => sw.Job == Core.Me.CurrentJob);
            var mainHand    = Equipment.GetEquipmentSlot(0);

            if (mainHand.Item.EquipmentCatagory == statWeights.Primary)
            {
                return(EquipOptimalArmor(context, 1));
            }
            context.SlotChecked[1] = true;

            return(RunStatus.Success);
        }
示例#7
0
        private static RunStatus EquipOptimalMainHand(EquipmentContext context)
        {
            var statWeights = Database.StatWeights.First(sw => sw.Job == Core.Me.CurrentJob);
            var mainHands   = GearEvaluator.GetProspects(context, 0);

            var primaries = mainHands
                            .Where(s => s.Item.EquipmentCatagory == statWeights.Primary)
                            .ToList();

            var alternatives = mainHands
                               .Where(s => s.Item.EquipmentCatagory == statWeights.Primary2H)
                               .ToList();

            var secondaries = GearEvaluator.GetProspects(context, 1);

            var bestOneHand = primaries.FirstOrDefault();
            var bestOffhand = secondaries.FirstOrDefault();
            var bestTwoHand = alternatives.FirstOrDefault();

            float oneHandScore = bestOneHand == null ? 0f : bestOneHand.Item.Score();
            float offhandScore = bestOffhand == null ? 0f : bestOffhand.Item.Score();
            float twoHandScore = bestTwoHand == null ? 0f : bestTwoHand.Item.Score();
            float oneHandTotal = oneHandScore + offhandScore;

            var current = Equipment.GetEquipmentSlot(0);

            if (oneHandTotal > twoHandScore && bestOneHand != null)
            {
                if (bestOneHand.Slot != 0)
                {
                    EquipItem(current, bestOneHand);
                }
            }
            else if (bestTwoHand != null && bestTwoHand.Slot != 0)
            {
                EquipItem(current, bestTwoHand);
            }

            context.SlotChecked[0] = true;
            return(RunStatus.Success);
        }
示例#8
0
 public static List <BagSlot> GetProspects(EquipmentContext context, ushort slotId)
 {
     return(context.OptimizeBySpiritbind
         ? GetProspectsBySpiritbond(context, slotId) : GetProspectsByScore(context, slotId));
 }
示例#9
0
        public static Composite EquipRing(EquipmentContext context, ushort slot, ushort other)
        {
            var equip = new Action(r => EquipOptimalRing(context, slot, other));

            return(new Decorator(req => !context.SlotChecked[slot], equip));
        }
示例#10
0
        public static Composite EquipOffhand(EquipmentContext context)
        {
            var equip = new Action(r => EquipOptimalOffhand(context));

            return(new Decorator(req => !context.SlotChecked[1], equip));
        }