Пример #1
0
        public bool Reachable(Character character)
        {
            foreach (var objective in this.ObjectiveDones)
            {
                if (character.HasReachObjective(objective))
                {
                    continue;
                }
                else
                {
                    return(false);
                }
            }

            foreach (var objective in this.ObjectivesNotDone)
            {
                if (!character.HasReachObjective(objective))
                {
                    continue;
                }
                else
                {
                    return(false);
                }
            }

            return(CriteriaProvider.EvaluateCriterias(character.Client, this.Criteria));
        }
Пример #2
0
        /// <summary>
        /// Permet d'équiper un item
        /// </summary>
        /// <param name="item"></param>
        /// <param name="position"></param>
        /// <param name="quantity"></param>
        private void EquipItem(CharacterItemRecord item, CharacterInventoryPositionEnum position, uint quantity)
        {
            CharacterItemRecord equiped = GetEquipedItem(position);

            CharacterInventoryPositionEnum lastPosition = item.PositionEnum;

            if (equiped != null)
            {
                UnequipItem(equiped, quantity);
                OnObjectMoved(equiped, CharacterInventoryPositionEnum.INVENTORY_POSITION_NOT_EQUIPED);
            }

            if (item.Quantity == 1)
            {
                item.PositionEnum = position;
            }
            else
            {
                CharacterItemRecord newItem = item.Cut(quantity, position);
                AddItem(newItem);
                UpdateItemQuantity(item);
            }

            item.UpdateElement();

            OnItemMoved(item, lastPosition);

            foreach (var item2 in GetEquipedItems())
            {
                if (item != item2 && !CriteriaProvider.EvaluateCriterias(Character.Client, item2.Template.Criteria))
                {
                    SetItemPosition(item2.UId, CharacterInventoryPositionEnum.INVENTORY_POSITION_NOT_EQUIPED, item2.Quantity);
                }
            }
        }
 public static void Apply(FightPlayerResult result)
 {
     foreach (var provider in LootProviders)
     {
         if (result.Fight.FightType == provider.Key.FightType && CriteriaProvider.EvaluateCriterias(result.Character.Client, provider.Key.Criteria))
         {
             CustomLoot customLoot = (CustomLoot)Activator.CreateInstance(provider.Value, result);
             customLoot.Apply();
         }
     }
 }
Пример #4
0
        public static bool Handle(Character character, CharacterItemRecord item)
        {
            if (!CriteriaProvider.EvaluateCriterias(character.Client, item.Template.Criteria))
            {
                character.TextInformation(TextInformationTypeEnum.TEXT_INFORMATION_ERROR, 34);

                return(false);
            }

            var function = Handlers.FirstOrDefault(x => x.Key.GId == item.GId);

            if (function.Value != null)
            {
                return((bool)function.Value.Invoke(null, new object[] { character, item }));
            }
            else
            {
                function = Handlers.FirstOrDefault(x => x.Key.ItemType == item.Template.TypeEnum);
                if (function.Value != null)
                {
                    return((bool)function.Value.Invoke(null, new object[] { character, item }));
                }

                foreach (var effect in item.GetEffects <Effect>())
                {
                    function = Handlers.FirstOrDefault(x => x.Key.Effect == effect.EffectEnum);
                    if (function.Value != null)
                    {
                        try {
                            return((bool)function.Value.Invoke(null, new object[] { character, effect }));
                        }
                        catch (Exception ex) {
                            character.ReplyError(ex.ToString());

                            return(false);
                        }
                    }
                    else
                    {
                        character.Reply(effect.EffectEnum + " is not handled");
                        return(false);
                    }
                }

                return(false);
            }
        }
Пример #5
0
        private List <NpcReplyRecord> GetPossibleReply(List <NpcReplyRecord> replies)
        {
            List <NpcReplyRecord> results = new List <NpcReplyRecord>();

            foreach (var reply in replies)
            {
                if (CriteriaProvider.EvaluateCriterias(Character.Client, reply.Condition))
                {
                    results.Add(reply);
                }
                else
                {
                    if (reply.ConditionExplanation != null && reply.ConditionExplanation != string.Empty)
                    {
                        Character.Reply(reply.ConditionExplanation);
                    }
                }
            }
            return(results);
        }
Пример #6
0
        /// <summary>
        /// Permet de définir la nouvelle position d'un item
        /// </summary>
        /// <param name="uid"></param>
        /// <param name="position"></param>
        /// <param name="quantity"></param>
        public void SetItemPosition(uint uid, CharacterInventoryPositionEnum position, uint quantity)
        {
            var item = GetItem(uid);

            if (item != null)
            {
                if (position != CharacterInventoryPositionEnum.INVENTORY_POSITION_NOT_EQUIPED)
                {
                    if (Character.Level < item.Template.Level)
                    {
                        OnError(ObjectErrorEnum.LEVEL_TOO_LOW);
                        return;
                    }

                    if (!CriteriaProvider.EvaluateCriterias(Character.Client, item.Template.Criteria))
                    {
                        OnError(ObjectErrorEnum.CRITERIONS);
                        return;
                    }

                    if (DofusPositions.Contains((CharacterInventoryPositionEnum)item.Position) && DofusPositions.Contains(position))
                    {
                        return;
                    }

                    if (CheckStacks(item, position, RingPositions) && item.Template.HasSet)
                    {
                        OnError(ObjectErrorEnum.CANNOT_EQUIP_HERE);
                        return;
                    }

                    if (CheckStacks(item, position, DofusPositions))
                    {
                        OnError(ObjectErrorEnum.CANNOT_EQUIP_HERE);
                        return;
                    }

                    if (item.PositionEnum != CharacterInventoryPositionEnum.INVENTORY_POSITION_NOT_EQUIPED)
                    {
                        OnError(ObjectErrorEnum.CANNOT_EQUIP_HERE);
                        return;
                    }

                    if (item.Template.TypeEnum == ItemTypeEnum.OBJET_VIVANT)
                    {
                        ItemTypeEnum livingObjectCategory = (ItemTypeEnum)(item.FirstEffect <EffectInteger>(EffectsEnum.Effect_LivingObjectCategory).Value);

                        var targeted = GetEquipedItem(position);

                        if (targeted == null)
                        {
                            OnLivingObjectEquipedDirectly();
                            return;
                        }

                        if (targeted.Template.TypeEnum != livingObjectCategory)
                        {
                            OnError(ObjectErrorEnum.SYMBIOTIC_OBJECT_ERROR);
                            return;
                        }

                        if (targeted.IsAssociated)
                        {
                            OnError(ObjectErrorEnum.SYMBIOTIC_OBJECT_ERROR);
                            return;
                        }

                        if (item.Quantity > 1)
                        {
                            CharacterItemRecord newItem = item.Cut(1, CharacterInventoryPositionEnum.INVENTORY_POSITION_NOT_EQUIPED);
                            this.AssociateLiving(item, targeted);
                            AddItem(newItem);
                            UpdateItemQuantity(item);
                        }
                        else
                        {
                            this.AssociateLiving(item, targeted);
                        }

                        return;
                    }

                    if (item.Template.TypeEnum == ItemTypeEnum.OBJET_D_APPARAT)
                    {
                        var targeted = GetEquipedItem(position);

                        if (targeted == null)
                        {
                            OnError(ObjectErrorEnum.CANNOT_EQUIP_HERE);
                            return;
                        }

                        if (targeted.Template.TypeId != item.FirstEffect <EffectInteger>(EffectsEnum.Effect_Associate).Value)
                        {
                            return;
                        }

                        if (targeted.IsAssociated)
                        {
                            OnError(ObjectErrorEnum.SYMBIOTIC_OBJECT_ERROR);
                            return;
                        }

                        if (item.Quantity > 1)
                        {
                            CharacterItemRecord newItem = item.Cut(1, CharacterInventoryPositionEnum.INVENTORY_POSITION_NOT_EQUIPED);
                            this.AssociateCompatibility(item, targeted);
                            AddItem(newItem);
                            UpdateItemQuantity(item);
                        }
                        else
                        {
                            this.AssociateCompatibility(item, targeted);
                        }

                        return;
                    }

                    if (item.HasEffect <EffectMination>())
                    {
                        EffectMination effect = item.FirstEffect <EffectMination>();

                        var monster = effect.GetTemplate();


                        var level = monster.GetGrade(effect.GradeId).Level;
                        level = (ushort)(level > 200 ? 200 : level);

                        if (level > Character.Level)
                        {
                            Character.Reply("Vous devez être niveau " + level + " pour équiper cette pierre.");
                            return;
                        }

                        if (monster.IsBoss && Character.Level < 180)
                        {
                            Character.Reply("Vous devez être niveau 180 pour équiper un boss de donjon.");
                            return;
                        }

                        if (monster.IsMiniBoss && Character.Level < 150)
                        {
                            Character.Reply("Vous devez être niveau 150 pour équiper un miniboss.");
                            return;
                        }

                        Character.SpellAnim(6021);
                    }

                    if (item.Template.TypeEnum == ItemTypeEnum.MONTILIER || item.Template.TypeEnum == ItemTypeEnum.FAMILIER)
                    {
                        if (HasMountEquiped && Mount.Toggled)
                        {
                            ToggleMount();
                        }
                    }

                    this.CheckTwoHandeds(position, item);

                    EquipItem(item, position, quantity);
                }
                else
                {
                    if (item.PositionEnum == CharacterInventoryPositionEnum.INVENTORY_POSITION_NOT_EQUIPED)
                    {
                        OnError(ObjectErrorEnum.CANNOT_EQUIP_HERE);
                        return;
                    }
                    else
                    {
                        UnequipItem(item, quantity);
                    }
                }

                OnObjectMoved(item, position);
                RefreshWeight();
                Character.RefreshActorOnMap();
                Character.RefreshStats();
            }
        }