Exemplo n.º 1
0
        public void Execute(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj,
                            CastAction castObj,
                            Skill skill, SkillObject skillObject, DateTime time, int Value1, int Value2, int Value3, int Value4)
        {
            if (caster is Character character)
            {
                character.DisabledSetPosition = true;

                character.SendPacket(
                    new SCLoadInstancePacket(
                        1,
                        character.WorldPosition.ZoneId,
                        character.WorldPosition.X,
                        character.WorldPosition.Y,
                        character.WorldPosition.Z,
                        0,
                        0,
                        0
                        )
                    );

                character.InstanceId    = 1; // TODO ....
                character.Position      = character.WorldPosition.Clone();
                character.WorldPosition = null;
            }
        }
        public void Execute(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj,
                            CastAction castObj, Skill skill, SkillObject skillObject, DateTime time, int Value1, int Value2, int Value3,
                            int Value4)
        {
            var owner     = (Character)caster;
            var skillData = (SkillItem)casterObj;

            var itemInfo = owner.Inventory.GetItem(skillData.ItemId);

            if (itemInfo == null || itemInfo.Count <= 0)
            {
                return;
            }

            var tasks = new List <ItemTask>
            {
                InventoryHelper.GetTaskAndRemoveItem(owner, itemInfo, 1)
            };

            owner.BmPoint += Value1;
            owner.SendPacket(new SCBmPointPacket(owner.BmPoint));
            owner.SendPacket(new SCItemTaskSuccessPacket(ItemTaskType.SkillReagents, tasks, new List <ulong>()));

            // TODO - LOYALT IS ACCOUNT WIDE
        }
Exemplo n.º 3
0
        public bool Check(Unit caster, SkillCaster casterCaster, BaseUnit target, SkillCastTarget targetCaster, SkillObject skillObject)
        {
            var res = true;

            switch (Kind)
            {
            case PlotConditionType.Distance:
                //var dist = MathUtil.CalculateDistance(caster.Position, target.Position);
                var dist = 10;
                res = dist >= Param1 && dist <= Param2;
                break;

            case PlotConditionType.BuffTag:
                res = target.Effects.CheckBuffs(SkillManager.Instance.GetBuffsByTagId((uint)Param1));
                break;

            case PlotConditionType.Unk6:
                res = false;     //TODO
                break;

            case PlotConditionType.Unk7:
                res = false;     //TODO
                break;
            }

            return(NotCondition ? !res : res);
        }
Exemplo n.º 4
0
 public CastTask(Skill skill, Unit caster, SkillCaster casterCaster, BaseUnit target, SkillCastTarget targetCaster, SkillObject skillObject) : base(skill)
 {
     _caster       = caster;
     _casterCaster = casterCaster;
     _target       = target;
     _targetCaster = targetCaster;
     _skillObject  = skillObject;
 }
Exemplo n.º 5
0
 public void Execute(Unit caster, SkillCaster casterCaster, BaseUnit target, SkillCastTarget targetCaster,
                     uint skillId)
 {
     if (target is House house && caster is Character character)
     {
         HousingManager.Instance.Demolish(character.Connection, house);
     }
 }
Exemplo n.º 6
0
 public ApplySkillTask(Skill skill, Unit caster, SkillCaster casterCaster, BaseUnit target, SkillCastTarget targetCaster, SkillObject skillObject)
 {
     _skill        = skill;
     _caster       = caster;
     _casterCaster = casterCaster;
     _target       = target;
     _targetCaster = targetCaster;
     _skillObject  = skillObject;
 }
Exemplo n.º 7
0
 public SCSkillFiredPacket(uint id, ushort tl, SkillCaster caster, SkillCastTarget target, Skill skill, SkillObject skillObject) : base(0x09b, 1)
 {
     _id          = id;
     _tl          = tl;
     _caster      = caster;
     _target      = target;
     _skill       = skill;
     _skillObject = skillObject;
 }
Exemplo n.º 8
0
 public SCSkillStartedPacket(uint id, ushort tl, SkillCaster caster, SkillCastTarget target, Skill skill, SkillObject skillObject)
     : base(SCOffsets.SCSkillStartedPacket, 5)
 {
     _id          = id;
     _tl          = tl;
     _caster      = caster;
     _target      = target;
     _skill       = skill;
     _skillObject = skillObject;
 }
 public PlotTask(Skill skill, Unit caster, SkillCaster casterCaster, BaseUnit target, SkillCastTarget targetCaster,
                 SkillObject skillObject, PlotNextEvent nextEvent) : base(skill)
 {
     _caster       = caster;
     _casterCaster = casterCaster;
     _target       = target;
     _targetCaster = targetCaster;
     _skillObject  = skillObject;
     _nextEvent    = nextEvent;
 }
Exemplo n.º 10
0
 public PlotTask(Skill skill, Unit caster, SkillCaster casterCaster, BaseUnit target, SkillCastTarget targetCaster,
                 SkillObject skillObject, PlotNextEvent nextEvent, Dictionary <uint, int> counter) : base(skill)
 {
     _caster       = caster;
     _casterCaster = casterCaster;
     _target       = target;
     _targetCaster = targetCaster;
     _skillObject  = skillObject;
     _nextEvent    = nextEvent;
     _counter      = counter;
 }
Exemplo n.º 11
0
        public void Execute(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj,
                            CastAction castObj, Skill skill, SkillObject skillObject, DateTime time, int Value1, int Value2, int Value3,
                            int Value4)
        {
            var owner     = (Character)caster;
            var skillData = (SkillItem)casterObj;

            _log.Warn("SlaveCall");

            SlaveManager.Instance.Create(owner, skillData);
        }
Exemplo n.º 12
0
 public void Execute(Unit caster, SkillCaster casterCaster, BaseUnit target, SkillCastTarget targetCaster, uint skillId)
 {
     if (target is Doodad doodad)
     {
         var func = DoodadManager.Instance.GetFunc(doodad.FuncGroupId, skillId);
         if (func == null)
         {
             return;
         }
         func.Use(caster, doodad, skillId);
     }
 }
Exemplo n.º 13
0
        public override void Read(PacketStream stream)
        {
            var skillId = stream.ReadUInt32();

            var skillCasterType = stream.ReadByte(); // кто применяет
            var skillCaster     = SkillCaster.GetByType((SkillCasterType)skillCasterType);

            skillCaster.Read(stream);

            var skillCastTargetType = stream.ReadByte(); // на кого применяют
            var skillCastTarget     = SkillCastTarget.GetByType((SkillCastTargetType)skillCastTargetType);

            skillCastTarget.Read(stream);

            var flag        = stream.ReadByte();
            var flagType    = flag & 15;
            var skillObject = SkillObject.GetByType((SkillObjectType)flagType);

            if (flagType > 0)
            {
                skillObject.Read(stream);
            }

            _log.Debug("StartSkill: Id {0}, flag {1}", skillId, flag);

            if (SkillManager.Instance.IsDefaultSkill(skillId) || SkillManager.Instance.IsCommonSkill(skillId))
            {
                var skill = new Skill(SkillManager.Instance.GetSkillTemplate(skillId)); // TODO переделать...
                skill.Use(Connection.ActiveChar, skillCaster, skillCastTarget, skillObject);
            }
            else if (skillCaster is SkillItem)
            {
                var item = Connection.ActiveChar.Inventory.GetItem(((SkillItem)skillCaster).ItemId);
                if (item == null || skillId != item.Template.UseSkillId)
                {
                    return;
                }
                Connection.ActiveChar.Quests.OnItemUse(item);
                var skill = new Skill(SkillManager.Instance.GetSkillTemplate(skillId));
                skill.Use(Connection.ActiveChar, skillCaster, skillCastTarget, skillObject);
            }
            else if (Connection.ActiveChar.Skills.Skills.ContainsKey(skillId))
            {
                var skill = Connection.ActiveChar.Skills.Skills[skillId];
                skill.Use(Connection.ActiveChar, skillCaster, skillCastTarget, skillObject);
            }
            else
            {
                _log.Warn("StartSkill: Id {0}, undefined use type", skillId);
            }
        }
Exemplo n.º 14
0
        public void Execute(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj,
                            CastAction castObj, Skill skill, SkillObject skillObject, DateTime time, int Value1, int Value2, int Value3,
                            int Value4)
        {
            var owner     = (Character)caster;
            var skillData = (SkillItem)casterObj;

            switch (Value1)
            {
            // TODO - maybe not hardcoded
            case 4944:     // land
            case 3466:     // sea
                //owner.Mates.SpawnMount(skillData);
                break;
            }
            owner.Mates.SpawnMount(skillData);
        }
Exemplo n.º 15
0
        public override void Execute(Npc npc)
        {
            //先判断距离 / Judge the distance first
            bool  move   = false;
            float x      = npc.Position.X - npc.CurrentTarget.Position.X;
            float y      = npc.Position.Y - npc.CurrentTarget.Position.Y;
            float z      = npc.Position.Z - npc.CurrentTarget.Position.Z;
            float MaxXYZ = Math.Max(Math.Max(Math.Abs(x), Math.Abs(y)), Math.Abs(z));

            //如果最大值超过distance 则放弃攻击转而进行追踪 / If the maximum value exceeds distance, abandon the attack and track it
            if (MaxXYZ > distance)
            {
                var track = new Track();
                track.Pause(npc);
                track.LastPatrol = LastPatrol;
                LastPatrol       = track;
                Stop(npc);
            }
            else
            {
                LoopDelay = 3000;

                var skillId = 2u;

                var skillCasterType = SkillCasterType.Unit; // who applies / кто применяет
                var skillCaster     = SkillCaster.GetByType(skillCasterType);
                skillCaster.ObjId = npc.ObjId;

                var skillCastTargetType = 0; // on whom apply / на кого применяют
                var skillCastTarget     = SkillCastTarget.GetByType((SkillCastTargetType)skillCastTargetType);
                skillCastTarget.ObjId = npc.CurrentTarget.ObjId;

                var flag        = 0;
                var flagType    = flag & 15;
                var skillObject = SkillObject.GetByType((SkillObjectType)flagType);
                if (flagType > 0)
                {
                    skillObject.Flag = SkillObjectType.None;
                }

                var skill = new Skill(SkillManager.Instance.GetSkillTemplate(skillId)); // TODO переделать...
                skill.Use(npc, skillCaster, skillCastTarget, skillObject);

                LoopAuto(npc);
            }
        }
 public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj,
                            Skill skill, SkillObject skillObject, DateTime time)
 {
     _log.Debug("ReportCrimeEffect");
 }
        public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj,
                                   CastAction castObj,
                                   Skill skill, SkillObject skillObject, DateTime time)
        {
            _log.Debug("AcceptQuestEffect");

            if (target is Character character)
            {
                character.Quests.Add(QuestId);
            }
        }
Exemplo n.º 18
0
        public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj,
                                   CastAction castObj,
                                   Skill skill, SkillObject skillObject, DateTime time)
        {
            _log.Debug("CraftEffect, {0}", WorldInteraction);

            var wiGroup = WorldManager.Instance.GetWorldInteractionGroup((uint)WorldInteraction);

            if (caster is Character character)
            {
                switch (wiGroup)
                {
                case WorldInteractionGroup.Craft:
                    character.Craft.EndCraft();
                    break;

                case WorldInteractionGroup.Collect:
                    break;

                case WorldInteractionGroup.Building:     // TODO not done, debug only
                    if (target is House house)
                    {
                        // TODO remove resources...

                        var nextStep = house.CurrentStep + 1;
                        if (house.Template.BuildSteps.Count > nextStep)
                        {
                            house.CurrentStep = nextStep;
                        }
                        else
                        {
                            house.CurrentStep = -1;
                        }

                        // TODO to currStep +1 num action
                        character.BroadcastPacket(
                            new SCHouseBuildProgressPacket(
                                house.TlId,
                                house.ModelId,
                                house.Template.BuildSteps.Count,
                                nextStep
                                ),
                            true
                            );

                        if (house.CurrentStep == -1)
                        {
                            var doodads = house.AttachedDoodads.ToArray();
                            foreach (var doodad in doodads)
                            {
                                doodad.Spawn();
                            }
                        }
                    }

                    break;

                default:
                    _log.Warn("CraftEffect, {0} not have wi group", WorldInteraction);
                    break;
                }

                character.Quests.OnInteraction(WorldInteraction);
            }
        }
Exemplo n.º 19
0
 public void Execute(Unit caster, SkillCaster casterCaster, BaseUnit target, SkillCastTarget targetCaster, uint skillId)
 {
 }
        public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj,
                                   Skill skill, SkillObject skillObject, DateTime time)
        {
            _log.Debug("DamageEffect");

            //if (!(target is Unit))
            //{
            //    return;
            //}

            var trg = (Unit)target;
            var min = 0;
            var max = 0;

            if (UseFixedDamage)
            {
                min += FixedMin;
                max += FixedMax;
            }

            var unk        = 0f;
            var unk2       = 1f;
            var skillLevel = 1;

            if (skill != null)
            {
                skillLevel = (skill.Level - 1) * skill.Template.LevelStep + skill.Template.AbilityLevel;
                if (skillLevel >= skill.Template.AbilityLevel)
                {
                    unk = 0.015f * (skillLevel - skill.Template.AbilityLevel + 1);
                }
                unk2 = (1 + unk) * 1.3f;
            }

            if (UseLevelDamage)
            {
                var levelMd = (unk + 1) * LevelMd;
                min += (int)(caster.LevelDps * levelMd + 0.5f);
                max += (int)((((skillLevel - 1) * 0.020408163f * (LevelVaEnd - LevelVaStart) + LevelVaStart) * 0.0099999998f + 1f) * caster.LevelDps * levelMd + 0.5f);
            }

            var dpsInc = 0f;

            if (DamageType == DamageType.Melee)
            {
                dpsInc = caster.DpsInc;
            }
            else if (DamageType == DamageType.Magic)
            {
                dpsInc = caster.MDps + caster.MDpsInc;
            }
            else if (DamageType == DamageType.Ranged)
            {
                dpsInc = caster.RangedDpsInc;
            }

            var dps = 0f;

            if (UseMainhandWeapon)
            {
                dps += caster.Dps;
            }
            else if (UseOffhandWeapon)
            {
                dps += caster.OffhandDps;
            }
            else if (UseRangedWeapon)
            {
                dps += caster.RangedDps;
            }
            min += (int)((DpsMultiplier * dps * 0.001f + DpsIncMultiplier * dpsInc * 0.001f) * unk2 + 0.5f);
            max += (int)((DpsMultiplier * dps * 0.001f + DpsIncMultiplier * dpsInc * 0.001f) * unk2 + 0.5f);
            min  = (int)(min * Multiplier);
            max  = (int)(max * Multiplier);
            var value = Rand.Next(min, max);

            trg.ReduceCurrentHp(caster, value);
            trg.BroadcastPacket(new SCUnitDamagedPacket(castObj, casterObj, caster.ObjId, target.ObjId, value), true);

            if (trg is Npc npc && npc.CurrentTarget != caster)
            {
                npc.BroadcastPacket(new SCAiAggroPacket(npc.ObjId, 1, caster.ObjId), true);

                if (npc.Patrol == null || npc.Patrol.PauseAuto(npc))
                {
                    npc.CurrentTarget = caster;
                    npc.BroadcastPacket(new SCCombatEngagedPacket(caster.ObjId), true); // caster
                    npc.BroadcastPacket(new SCCombatEngagedPacket(npc.ObjId), true);    // target

                    npc.BroadcastPacket(new SCCombatFirstHitPacket(npc.ObjId, caster.ObjId, 0), true);
                    npc.BroadcastPacket(new SCAggroTargetChangedPacket(npc.ObjId, caster.ObjId), true);

                    npc.BroadcastPacket(new SCTargetChangedPacket(npc.ObjId, caster.ObjId), true);
                    TaskManager.Instance.Schedule(new UnitMove(new Track(), npc), TimeSpan.FromMilliseconds(100));
                }
            }
        }
        public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj,
                                   Skill skill, SkillObject skillObject, DateTime time)
        {
            var portalInfo  = (SkillObjectUnk1)skillObject;
            var portalOwner = (Character)caster;

            // Private - [DEBUG] EffectTemplate - OpenPortalEffect, Owner: Lemes, PortalId: 4097, Type: 2, X: 20928, Y: 13145,9, Z:114,1004
            // District - [DEBUG] EffectTemplate - OpenPortalEffect, Owner: Lemes, PortalId: 3, Type: 1, X: 20921,96, Y: 13148,55, Z:114,2535
            _log.Debug("OpenPortalEffect, Owner: {0}, PortalId: {1}, Type: {5}, X: {2}, Y: {3}, Z:{4}", portalOwner.Name, portalInfo.Id, portalInfo.X, portalInfo.Y, portalInfo.Z, portalInfo.Type);

            if (portalInfo.X > portalOwner.Position.X + Distance || portalInfo.Y > portalOwner.Position.Y + Distance)
            {
                return;
            }
            PortalManager.Instance.OpenPortal(portalOwner, portalInfo); // TODO - Use Distance
        }
        public void Execute(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj, Skill skill, SkillObject skillObject, DateTime time, int Value1, int Value2, int Value3, int Value4)
        {
            Character character = (Character)caster;

            if (character == null)
            {
                return;
            }

            SkillItem scroll = (SkillItem)casterObj;

            if (scroll == null)
            {
                return;
            }

            SkillCastUnk3Target itemTarget = (SkillCastUnk3Target)targetObj;

            if (itemTarget == null)
            {
                return;
            }

            var useCharm = false;
            SkillObjectItemGradeEnchantingSupport charm = (SkillObjectItemGradeEnchantingSupport)skillObject;

            if (charm != null && charm.SupportItemId != 0)
            {
                useCharm = true;
            }

            bool isLucky       = Value1 != 0;
            Item item          = character.Inventory.GetItem(itemTarget.Id);
            var  initialGrade  = item.Grade;
            var  gradeTemplate = ItemManager.Instance.GetGradeTemplate(item.Grade);
            var  tasks         = new List <ItemTask>();

            int cost = GoldCost(gradeTemplate, item, Value3);

            if (cost == -1)
            {
                return;
            }

            if (character.Money < cost)
            {
                return;
            }
            character.Money -= cost;
            tasks.Add(new MoneyChange(-cost));

            if (!character.Inventory.CheckItems(scroll.ItemTemplateId, 1))
            {
                return;
            }
            Item scrollItem = character.Inventory.GetItem(scroll.ItemId);

            tasks.Add(InventoryHelper.GetTaskAndRemoveItem(character, scrollItem, 1));

            ItemGradeEnchantingSupport charmInfo = null;

            if (useCharm)
            {
                Item charmItem = character.Inventory.GetItem(charm.SupportItemId);
                if (charmItem == null)
                {
                    return;
                }

                charmInfo = ItemManager.Instance.GetItemGradEnchantingSupportByItemId(charmItem.TemplateId);

                if (charmInfo.RequireGradeMin != -1 && item.Grade < charmInfo.RequireGradeMin)
                {
                    return;
                }
                if (charmInfo.RequireGradeMax != -1 && item.Grade > charmInfo.RequireGradeMax)
                {
                    return;
                }

                tasks.Add(InventoryHelper.GetTaskAndRemoveItem(character, charmItem, 1));
            }

            var result = RollRegrade(gradeTemplate, item, isLucky, useCharm, charmInfo);

            if (result == GradeEnchantResult.Break)
            {
                tasks.Add(InventoryHelper.GetTaskAndRemoveItem(character, item, 1));
            }
            else
            {
                // TODO : make sure grade updates with itemupdate
                tasks.Add(new ItemGradeChange(item, item.Grade));
            }

            character.SendPacket(new SCGradeEnchantResultPacket((byte)result, item, initialGrade, item.Grade));
            character.SendPacket(new SCItemTaskSuccessPacket(ItemTaskType.GradeEnchant, tasks, new List <ulong>()));

            if (item.Grade >= 8 && (result == GradeEnchantResult.Success || result == GradeEnchantResult.GreatSuccess))
            {
                WorldManager.Instance.BroadcastPacketToServer(new SCGradeEnchantBroadcastPacket(character.Name, (byte)result, item, initialGrade, item.Grade));
            }
        }
        public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj,
                                   Skill skill, SkillObject skillObject, DateTime time)
        {
            _log.Debug("SpecialEffect, Special: {0}, Value1: {1}, Value2: {2}, Value3: {3}, Value4: {4}", SpecialEffectTypeId, Value1, Value2, Value3, Value4);

            var classType = Type.GetType("AAEmu.Game.Models.Game.Skills.Effects.SpecialEffects." + SpecialEffectTypeId);

            if (classType == null)
            {
                _log.Error("Unknown special effect: {0}", SpecialEffectTypeId);
                return;
            }

            var action = (ISpecialEffect)Activator.CreateInstance(classType);

            action.Execute(caster, casterObj, target, targetObj, castObj, skill, skillObject, time, Value1, Value2, Value3, Value4);
        }
 public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj,
                            Skill skill, SkillObject skillObject, DateTime time)
 {
     if (RequireBuffId > 0 && !target.Effects.CheckBuff(RequireBuffId))
     {
         return; //TODO send error?
     }
     if (target.Effects.CheckBuffImmune(Id))
     {
         return; //TODO  error of immune?
     }
     target.Effects.AddEffect(new Effect(target, caster, casterObj, this, skill, time));
 }
        public virtual bool СheckСonditions(Unit caster, SkillCaster casterCaster, BaseUnit target, SkillCastTarget targetCaster, SkillObject skillObject)
        {
            var result = true;

            foreach (var condition in Conditions)
            {
                if (condition.Condition.Check(caster, casterCaster, target, targetCaster, skillObject))
                {
                    continue;
                }
                result = false;
                break;
            }

            return(result);
        }
        public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj,
                                   Skill skill, SkillObject skillObject, DateTime time)
        {
            _log.Debug("DispelEffect");

            if (BuffTagId > 0 && !target.Effects.CheckBuffs(SkillManager.Instance.GetBuffsByTagId(BuffTagId)))
            {
                return;
            }
            if (DispelCount > 0)
            {
                target.Effects.RemoveBuffs(BuffKind.Good, DispelCount); //TODO ....
            }
            if (CureCount > 0)
            {
                target.Effects.RemoveBuffs(BuffKind.Bad, CureCount);
            }
        }
        public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj,
                                   CastAction castObj,
                                   Skill skill, SkillObject skillObject, DateTime time)
        {
            var character = (Character)caster;

            if (character == null)
            {
                return;
            }

            var lootPack = (SkillItem)casterObj;

            if (lootPack == null)
            {
                return;
            }

            var lootPacks    = ItemManager.Instance.GetLootPacks(LootPackId);
            var lootGroups   = ItemManager.Instance.GetLootGroups(LootPackId);
            var lootPackItem = character.Inventory.GetItem(lootPack.ItemId);

            _log.Debug("LootGroups {0}", lootGroups);

            var rowG = lootGroups.Length;
            var rowP = lootPacks.Length;

            if (rowG >= 1)
            {
                const float maxDropRate = (float)10000000;
                for (var i = 0; i < rowG; i++)
                {
                    var itemIdLoot    = (uint)0;
                    var minAmount     = 0;
                    var maxAmount     = 0;
                    var gradeId       = (byte)0;
                    var dropRateMax   = (uint)0;
                    var dropRate      = Rand.Next(0, maxDropRate);
                    var dropRateGroup = (uint)10000000;
                    if (lootGroups[i].GroupNo > 1 && rowG >= 2)
                    {
                        dropRateGroup = 0;
                        for (var di = 0; di < lootGroups[i].GroupNo; di++)
                        {
                            if (lootGroups[di].GroupNo > 1)
                            {
                                dropRateGroup += lootGroups[di].DropRate;
                            }
                        }
                    }

                    if (dropRateGroup >= dropRate)
                    {
                        for (var ui = 0; ui < rowP; ui++)
                        {
                            if (lootPacks[ui].Group == lootGroups[i].GroupNo)
                            {
                                dropRateMax += lootPacks[ui].DropRate;
                            }
                        }

                        var dropRateItem   = Rand.Next(0, dropRateMax);
                        var dropRateItemId = (uint)0;
                        for (var uii = 0; uii < rowP; uii++)
                        {
                            if (lootPacks[uii].Group == lootGroups[i].GroupNo)
                            {
                                if (lootPacks[uii].DropRate + dropRateItemId >= dropRateItem)
                                {
                                    itemIdLoot = lootPacks[uii].ItemId;
                                    minAmount  = lootPacks[uii].MinAmount;
                                    maxAmount  = lootPacks[uii].MaxAmount;
                                    gradeId    = lootPacks[uii].GradeId;
                                    uii        = rowP;
                                }
                                else
                                {
                                    dropRateItemId += lootPacks[uii].DropRate;
                                }
                            }
                        }
                    }

                    if (minAmount > 1 || itemIdLoot == 500)
                    {
                        AddGold(caster, minAmount, maxAmount);
                    }

                    if (itemIdLoot > 0 && itemIdLoot != 500)
                    {
                        if (InheritGrade)
                        {
                            gradeId = lootPackItem.Grade;
                        }

                        if (lootGroups[i].ItemGradeDistributionId > 0)
                        {
                            gradeId = GetGradeDistributionId(lootGroups[i].ItemGradeDistributionId);
                        }

                        AddItem(caster, itemIdLoot, gradeId, minAmount, maxAmount);
                    }
                }

                RemoveItem(caster, casterObj, 1);
            }
            else
            {
                if (rowP >= 1)
                {
                    for (var i = 1; i <= 17; i++) ////////max group here ////// in sqlite max group = 17 /////
                    {
                        var itemIdLoot  = (uint)0;
                        var minAmount   = 0;
                        var maxAmount   = 0;
                        var gradeId     = (byte)0;
                        var dropRateMax = (uint)0;
                        for (var ui = 0; ui < rowP; ui++)
                        {
                            if (lootPacks[ui].Group == i)
                            {
                                dropRateMax += lootPacks[ui].DropRate;
                            }
                        }

                        var dropRateItem   = Rand.Next(0, dropRateMax);
                        var dropRateItemId = (uint)0;
                        for (var uii = 0; uii < rowP; uii++)
                        {
                            if (lootPacks[uii].Group == i)
                            {
                                if (lootPacks[uii].DropRate + dropRateItemId >= dropRateItem)
                                {
                                    itemIdLoot = lootPacks[uii].ItemId;
                                    minAmount  = lootPacks[uii].MinAmount;
                                    maxAmount  = lootPacks[uii].MaxAmount;
                                    gradeId    = lootPacks[uii].GradeId;
                                    uii        = rowP;
                                }
                                else
                                {
                                    dropRateItemId += lootPacks[uii].DropRate;
                                }
                            }
                        }

                        if (minAmount > 1 || itemIdLoot == 500)
                        {
                            AddGold(caster, minAmount, maxAmount);
                        }

                        if (itemIdLoot > 0 && itemIdLoot != 500)
                        {
                            if (InheritGrade)
                            {
                                gradeId = lootPackItem.Grade;
                            }

                            AddItem(caster, itemIdLoot, gradeId, minAmount, maxAmount);
                        }
                    }

                    RemoveItem(caster, casterObj, 1);
                }
            }

            _log.Debug("GainLootPackItemEffect {0}", LootPackId);
        }
        public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj,
                                   Skill skill, SkillObject skillObject, DateTime time)
        {
            _log.Debug("PutDownBackpackEffect");

            Character character = (Character)caster;

            if (character == null)
            {
                return;
            }

            SkillItem packItem = (SkillItem)casterObj;

            if (packItem == null)
            {
                return;
            }

            Item item = character.Inventory.GetItem(packItem.ItemId);

            if (item == null)
            {
                return;
            }

            InventoryHelper.RemoveItemAndUpdateClient(character, item, 1);

            // Spawn doodad
            var doodadSpawner = new DoodadSpawner();

            doodadSpawner.Id       = 0;
            doodadSpawner.UnitId   = BackpackDoodadId;
            doodadSpawner.Position = character.Position.Clone();
            doodadSpawner.Spawn(0);
        }
Exemplo n.º 29
0
        public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj,
                                   Skill skill, SkillObject skillObject, DateTime time)
        {
            _log.Debug("HealEffect");

            if (!(target is Unit))
            {
                return;
            }
            var trg = (Unit)target;
            var min = 0;
            var max = 0;

            if (UseFixedHeal)
            {
                min += FixedMin;
                max += FixedMax;
            }

            var unk        = 0f;
            var unk2       = 1f;
            var skillLevel = 1;

            if (skill != null)
            {
                skillLevel = (skill.Level - 1) * skill.Template.LevelStep + skill.Template.AbilityLevel;
                if (skillLevel >= skill.Template.AbilityLevel)
                {
                    unk = 0.15f * (skillLevel - skill.Template.AbilityLevel + 1);
                }
                unk2 = (1 + unk) * 1.3f;
            }

            if (UseLevelHeal)
            {
                var levelMd = (unk + 1) * LevelMd;
                min += (int)(caster.LevelDps * levelMd + 0.5f);
                max += (int)((((skillLevel - 1) * 0.020408163f * (LevelVaEnd - LevelVaStart) + LevelVaStart) * 0.0099999998f + 1f) *
                             caster.LevelDps * levelMd + 0.5f);
            }

            min += (int)((caster.MDps + caster.MDpsInc) * DpsMultiplier * 0.001f * unk2 + 0.5f);
            max += (int)((caster.MDps + caster.MDpsInc) * DpsMultiplier * 0.001f * unk2 + 0.5f);

            var value = Rand.Next(min, max);

            trg.BroadcastPacket(new SCUnitHealedPacket(castObj, casterObj, target.ObjId, 0, value), true);
            trg.Hp += value;
            trg.Hp  = Math.Min(trg.Hp, trg.MaxHp);
            trg.BroadcastPacket(new SCUnitPointsPacket(trg.ObjId, trg.Hp, trg.Mp), true);
        }
Exemplo n.º 30
0
        public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj,
                                   Skill skill, SkillObject skillObject, DateTime time)
        {
            var portalInfo  = (SkillObjectUnk1)skillObject;
            var portalOwner = (Character)caster;

            _log.Debug("OpenPortalEffect, Owner: {0}, PortalId: {1}", portalOwner.Name, portalInfo.Id);

            PortalManager.Instance.OpenPortal(portalOwner, portalInfo); // TODO - Use Distance
        }