Exemplo n.º 1
0
 public void OnTouch(WorldClient c, MabiPC cr, MabiProp pr)
 {
     var r = RandomProvider.Get();
     var p = _revivalLocations[r.Next(_revivalLocations.Length)];
     // Just warp them for now
     c.Warp(29, p.X, p.Y);
 }
Exemplo n.º 2
0
    public override bool Check(WorldClient c, MabiPC cr, MabiProp prop)
    {
        // Wand
        if(cr.RightHand != null && cr.RightHand.Info.Class >= 40038 && cr.RightHand.Info.Class <= 40041)
            return true;

        return false;
    }
Exemplo n.º 3
0
    public void OnCreatureKilled(MabiCreature victim, MabiCreature killer)
    {
        if((victim is MabiPC && players) || (victim is MabiNPC && npcs))
        {
            var pos = victim.GetPosition();
            var prop = new MabiProp(50, victim.Region, pos.X, pos.Y, (float)Math.PI * 2 / 255 * victim.Direction);
            if(!permanent)
                prop.DisappearTime = DateTime.Now.AddMinutes(duration);

            WorldManager.Instance.AddProp(prop);
        }
    }
Exemplo n.º 4
0
        public void FireballProcessing(MabiCreature attacker, MabiSkill skill, MabiProp bomb, ulong targetId)
        {
            Thread.Sleep(4000);

            var victims = WorldManager.Instance.GetCreaturesInRange(bomb, 800).Where(c => !c.IsDead && c.IsAttackableBy(attacker)).ToList();

            ulong areaTarget = SkillHelper.GetAreaTargetID(bomb.Region, (uint)bomb.Info.X, (uint)bomb.Info.Y);

            var sAction = new AttackerAction(CombatActionType.SpecialHit, attacker, skill.Id, areaTarget);
            sAction.PropId = bomb.Id;
            sAction.Options = AttackerOptions.KnockBackHit1 | AttackerOptions.UseEffect;

            var cap = new CombatActionPack(attacker, skill.Id);
            cap.Add(sAction);

            var rnd = RandomProvider.Get();

            foreach (var target in victims)
            {
                target.StopMove();

                var tAction = new TargetAction(CombatActionType.TakeHit, target, attacker, skill.Id);
                tAction.Options |= TargetOptions.Result;
                tAction.StunTime = target.Stun = 3000;
                tAction.Delay = 200;

                var damage = attacker.GetMagicDamage(attacker.RightHand, rnd.Next((int)skill.RankInfo.Var1, (int)skill.RankInfo.Var2 + 1));

                if (CombatHelper.TryAddCritical(target, ref damage, attacker.CriticalChanceAgainst(target)))
                    tAction.Options |= TargetOptions.Critical;

                target.TakeDamage(tAction.Damage = damage);

                // Knock down if dead
                tAction.OldPosition = CombatHelper.KnockBack(target, bomb);
                if (target.IsDead)
                {
                    tAction.Options |= TargetOptions.FinishingKnockDown;
                }
                else
                {
                    tAction.Options |= TargetOptions.KnockDown;
                    CombatHelper.SetAggro(attacker, target);
                }

                WorldManager.Instance.Broadcast(new MabiPacket(Op.Effect, target.Id).PutInt(Effect.Thunderbolt).PutByte(0), SendTargets.Range, target);
                cap.Add(tAction);
            }

            WorldManager.Instance.HandleCombatActionPack(cap);

            WorldManager.Instance.RemoveProp(bomb);
        }
Exemplo n.º 5
0
        public override SkillResults Start(MabiCreature creature, MabiSkill skill, MabiTags tags)
        {
            ulong chairOId = 0;
            if (tags.Has("ITEMID"))
                chairOId = (ulong)tags.Get("ITEMID");

            if (chairOId > 0)
            {
                // Check item
                var item = creature.GetItem(chairOId);
                if (item != null && item.Type == ItemType.Misc)
                {
                    // Get chair prop id
                    var propId = 0u;
                    var chairInfo = MabiData.ChairDb.Find(item.Info.Class);
                    if (chairInfo != null)
                        propId = (!creature.IsGiant ? chairInfo.PropId : chairInfo.GiantPropId);

                    var pos = creature.GetPosition();

                    // Effect
                    if (chairInfo.Effect != 0)
                        Send.Effect(chairInfo.Effect, creature, true);

                    // Chair prop
                    var prop = new MabiProp(propId, creature.Region, pos.X, pos.Y, MabiMath.DirToRad(creature.Direction));
                    prop.State = "stand";
                    WorldManager.Instance.AddProp(prop);

                    // Move char
                    Send.AssignChair(creature, prop.Id, 1);

                    // Update chair
                    prop.ExtraData = string.Format("<xml OWNER='{0}' SITCHAR='{0}'/>", creature.Id);
                    Send.PropUpdate(prop);

                    creature.Temp.CurrentChair = chairInfo;
                    creature.Temp.SittingProp = prop;
                }
            }

            creature.State |= CreatureStates.SitDown;
            Send.SitDown(creature);

            SkillHelper.GiveSkillExp(creature, skill, 20);

            return SkillResults.Okay;
        }
Exemplo n.º 6
0
    public override bool Check(WorldClient c, MabiPC cr, MabiProp prop)
    {
        // Must have 13+ ranks of Archery Skills
        int rank = 0;
        foreach(var skill in cr.Skills.List.Values)
        {
            if(
                skill.Id != SkillConst.RangedCombatMastery &&
                skill.Id != SkillConst.MagnumShot &&
                skill.Id != SkillConst.ArrowRevolver &&
                skill.Id != SkillConst.ArrowRevolver2 &&
                skill.Id != SkillConst.SupportShot &&
                skill.Id != SkillConst.MirageMissile
            )
                continue;

            if((rank += skill.Info.Rank) >= 13)
                return true;
        }

        return false;
    }
Exemplo n.º 7
0
    public void OpenMapWindow(WorldClient c, MabiPC cr, MabiProp pr)
    {
        var gate = _gates.Values.FirstOrDefault(a => a.Region == cr.Region);
        if (gate == null || gate.Prop.State == "closed")
            return;

        if(!cr.Keywords.Contains(gate.KeywordId))
            cr.Keywords.Add(gate.KeywordId);

        var mygates = _gates.Values.Where(a => cr.Keywords.Contains(a.KeywordId) || _freeRoaming || cr.Keywords.Contains(10142));

        var p = new MabiPacket(Op.MoonGateMap, cr.Id);
        p.PutInt(2);
        p.PutString(gate.Ident);
        p.PutByte((byte)mygates.Count());
        foreach (var g in mygates)
        {
            p.PutShort(g.KeywordId);
            p.PutByte(1);
            p.PutInts(g.Region, g.X, g.Y);
        }
        c.Send(p);
    }
Exemplo n.º 8
0
    public override bool Check(WorldClient c, MabiPC cr, MabiProp prop)
    {
        // Have alchemist clothes, shoes, a Cylinder, and Beginner Alchemist title equipped ?

        if(cr.Title != 26)
            return false;

        // Shoes
        var item = cr.Inventory.GetItemAt(Pocket.Shoe, 0, 0);
        if(item == null || (item.Info.Class != 17138))
            return false;

        // Clothes
        item = cr.Inventory.GetItemAt(Pocket.Armor, 0, 0);
        if(item == null || (item.Info.Class != 15351))
            return false;

        // Cylinder
        if(cr.RightHand != null)
        {
            if(cr.RightHand.Info.Class == 40258) return true;
            if(cr.RightHand.Info.Class == 40270) return true;
            if(cr.RightHand.Info.Class == 40284) return true;
            if(cr.RightHand.Info.Class == 40285) return true;
            if(cr.RightHand.Info.Class == 40286) return true;
            if(cr.RightHand.Info.Class == 40287) return true;
            if(cr.RightHand.Info.Class == 40296) return true;
        }

        return false;
    }
Exemplo n.º 9
0
 public abstract bool Check(WorldClient c, MabiPC cr, MabiProp prop);
Exemplo n.º 10
0
 public override bool Check(WorldClient c, MabiPC cr, MabiProp prop)
 {
     return (cr.LeftHand != null && cr.LeftHand.Info.Class == 1028); // Tracy's Secret
 }
Exemplo n.º 11
0
 public override bool Check(WorldClient c, MabiPC cr, MabiProp prop)
 {
     return (cr.Level >= (cr.Age * 4));
 }
Exemplo n.º 12
0
        protected void IcespearProcessing(MabiCreature attacker, MabiSkill skill, List<MabiCreature> targets, MabiProp casterProp, int sleep, int stack)
        {
            float dmg = (stack == 5 ? 6.5f : stack);
            for (int i = stack; i >= 0; i--)
            {
                foreach (var target in targets)
                {
                    target.StopMove();
                    target.Stun = (ushort)sleep;
                    WorldManager.Instance.Broadcast(new MabiPacket(Op.Effect, target.Id).PutInt(Effect.IcespearFreeze).PutByte(1).PutInt(13000), SendTargets.Range, attacker);
                }
                System.Threading.Thread.Sleep(sleep);
                var newTargets = new List<MabiCreature>();
                foreach (var target in targets)
                {
                    this.Explode(attacker, target, skill, casterProp, dmg);
                    var tmpTargets = new List<MabiCreature>();
                    GetIceSpearExplosionChain(attacker, target, tmpTargets, 16, (uint)skill.RankInfo.Var4);
                    if (tmpTargets.Contains(target))
                        tmpTargets.Remove(target);

                    newTargets.AddRange(tmpTargets);
                }
                targets = newTargets.Distinct().Where(c => !c.IsDead).Take(16).ToList();
            }

            WorldManager.Instance.RemoveProp(casterProp);
        }
Exemplo n.º 13
0
        public void RemoveProp(MabiProp prop)
        {
            lock (_props)
                _props.Remove(prop);

            var disappears = new MabiPacket(Op.PropDisappears, Id.Broadcast);
            disappears.PutLong(prop.Id);
            this.Broadcast(disappears, SendTargets.Region, prop);

            EventManager.EntityEvents.OnEntityLeavesRegion(prop);

            prop.Dispose();
        }
Exemplo n.º 14
0
 private static void AddPropUpdateInfo(this MabiPacket packet, MabiProp prop)
 {
     // Client side props (A0 range, instead of A1; second case)
     // look a bit different.
     if (prop.Id >= Aura.Shared.Const.Id.Props)
     {
         packet.PutString(prop.State);
         packet.PutLong(DateTime.Now);
         packet.PutByte(true);
         packet.PutString(prop.ExtraData);
         packet.PutFloat(prop.Info.Direction);
         packet.PutShort(0);
     }
     else
     {
         packet.PutString(prop.State);
         packet.PutLong(DateTime.Now);
         packet.PutByte(false);
         packet.PutFloat(prop.Info.Direction);
         packet.PutShort(0);
     }
 }
Exemplo n.º 15
0
 private void SetBreaker(MabiProp prop, ulong characterId, string characterName)
 {
     prop.State = "state3";
     prop.ExtraData = string.Format("<xml breaker_id=\"{0}\" breaker_name=\"{1}\"/>", characterId, characterName);
     _hits = _required;
 }
Exemplo n.º 16
0
        public override SkillResults UseCombat(MabiCreature attacker, ulong targetId, MabiSkill skill)
        {
            var itarget = WorldManager.Instance.GetCreatureById(targetId);
            if (itarget == null)
                return SkillResults.InvalidTarget;

            if (!WorldManager.InRange(attacker, itarget, 2000))
                return SkillResults.OutOfRange;

            var targets = this.GetIceSpearLOSChain(attacker, itarget, (uint)skill.RankInfo.Var5);

            foreach (var target in targets)
            {
                target.StopMove();
                WorldManager.Instance.Broadcast(new MabiPacket(Op.Effect, target.Id).PutInt(Effect.IcespearFreeze).PutByte(1).PutInt(13000), SendTargets.Range, target);
            }

            var aPos = attacker.GetPosition();
            var casterProp = new MabiProp(280, attacker.Region, aPos.X, aPos.Y, 0); // 3
            WorldManager.Instance.AddProp(casterProp);

            WorldManager.Instance.Broadcast(new MabiPacket(Op.Effect, attacker.Id).PutInt(Effect.UseMagic).PutString("icespear").PutByte(1).PutLong(targetId).PutShort((ushort)skill.Id), SendTargets.Range, attacker);

            var charges = attacker.ActiveSkillStacks;

            Send.SkillUse(attacker.Client, attacker, skill.Id, targetId);

            SkillHelper.ClearStack(attacker, skill);

            // End the spear
            WorldManager.Instance.Broadcast(new MabiPacket(Op.Effect, attacker.Id).PutInt(Effect.StackUpdate).PutString("icespear").PutBytes(0, 0), SendTargets.Range, attacker);

            var sAction = new AttackerAction(CombatActionType.SpecialHit, attacker, skill.Id, targetId);
            sAction.Options = AttackerOptions.Result;

            var cap = new CombatActionPack(attacker, skill.Id);
            cap.Add(sAction);

            foreach (var target in targets)
            {
                var tAction = new TargetAction(CombatActionType.None, target, attacker, skill.Id);
                cap.Add(tAction);
            }

            WorldManager.Instance.HandleCombatActionPack(cap);

            SkillHelper.GiveSkillExp(attacker, skill, 20);

            System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(() =>
            {
                this.IcespearProcessing(attacker, skill, targets, casterProp, 3500, charges);
            }));
            t.Start();

            return SkillResults.Okay;
        }
Exemplo n.º 17
0
        public override SkillResults Prepare(MabiCreature creature, MabiSkill skill, MabiPacket packet, uint castTime)
        {
            var rnd = RandomProvider.Get();

            // Check for instrument
            if (creature.RightHand == null || creature.RightHand.Type != ItemType.Instrument)
                return SkillResults.Failure;

            // Spawn chair for Cello
            if (creature.RightHand.DataInfo.Instrument == InstrumentType.Cello)
            {
                var pos = creature.GetPosition();

                // Chair prop
                var prop = new MabiProp((!creature.IsGiant ? CelloChair : GiantCelloChair), creature.Region, pos.X, pos.Y, MabiMath.DirToRad(creature.Direction));
                prop.State = "stand";
                WorldManager.Instance.AddProp(prop);

                // Move char
                Send.AssignChair(creature, prop.Id, 1);

                // Update chair
                prop.ExtraData = string.Format("<xml OWNER='{0}' SITCHAR='{0}'/>", creature.Id);
                Send.PropUpdate(prop);

                creature.Temp.SittingProp = prop;
            }

            // Score scrolls go into the magazine pocket and need a SCORE tag.
            // XXX: Is it possbile to play random with a low durability scroll?
            bool hasScroll = (creature.Magazine != null && creature.Magazine.Tags.Has("SCORE") && creature.Magazine.OptionInfo.Durability >= DurabilityUse);

            // Random score if no usable scroll was found.
            uint rndScore = (!hasScroll ? (uint)rnd.Next(RandomScoreMin, RandomScoreMax + 1) : 0);

            // Quality seems to go from 0 (worst) to 3 (best).
            // Should be generated based on skills + random.
            var quality = (PlayingQuality)rnd.Next((int)PlayingQuality.VeryBad, (int)PlayingQuality.VeryGood + 1);

            // Up quality by chance, based on Musical Knowledge
            var knowledge = creature.Skills.Get(SkillConst.MusicalKnowledge);
            if (knowledge != null && rnd.Next(0, 100) < knowledge.RankInfo.Var2)
                quality++;

            if (quality > PlayingQuality.VeryGood)
                quality = PlayingQuality.VeryGood;

            // Save quality before checking perfect play option,
            // we want proper skill training.
            creature.Temp.PlayingInstrumentQuality = quality;

            if (WorldConf.PerfectPlay)
            {
                quality = PlayingQuality.VeryGood;
                Send.ServerMessage(creature.Client, creature, Localization.Get("skills.perfect_play")); // Regardless of the result, perfect play will let your performance sound perfect.
            }

            // Reduce scroll's durability.
            if (hasScroll)
            {
                creature.Magazine.ReduceDurability(DurabilityUse);
                creature.Client.Send(
                    new MabiPacket(Op.ItemDurabilityUpdate, creature.Id)
                    .PutLong(creature.Magazine.Id)
                    .PutInt(creature.Magazine.OptionInfo.Durability)
                );
            }

            // Music effect
            {
                var effect = hasScroll
                    ? PacketCreator.PlayEffect(creature, creature.RightHand.DataInfo.Instrument, quality, creature.Magazine.Tags["SCORE"])
                    : PacketCreator.PlayEffect(creature, creature.RightHand.DataInfo.Instrument, quality, rndScore);
                WorldManager.Instance.Broadcast(effect, SendTargets.Range, creature);
            }

            // Use skill
            {
                var use = new MabiPacket(Op.SkillUse, creature.Id);
                use.PutShort(skill.Info.Id);
                use.PutLong(0);
                use.PutByte(hasScroll);
                if (!hasScroll)
                    use.PutInt(rndScore);
                else
                    use.PutString(creature.Magazine.Tags["SCORE"]);
                use.PutByte((byte)creature.RightHand.DataInfo.Instrument);
                use.PutByte(1);
                use.PutByte(0);
                creature.Client.Send(use);

                creature.ActiveSkillId = skill.Id;
            }

            // Change motion for Battle Mandolin (no idea if this official, but I like it =P) [exec]
            //if (creature.RightHand.Info.Class == 40367)
            //    WorldManager.Instance.CreatureUseMotion(creature, 88, 2, true);

            return SkillResults.Okay;
        }
Exemplo n.º 18
0
        private static void HitWithThunderbolt(MabiCreature attacker, MabiSkill skill, List<MabiCreature> targets, MabiProp cloud, float dmgModifier = 1)
        {
            var undead = targets.FirstOrDefault(c => !c.IsDead);

            if (undead == null)
                return;

            var sAction = new AttackerAction(CombatActionType.RangeHit, attacker, skill.Id, undead.Id);
            sAction.PropId = cloud.Id;
            sAction.Options = AttackerOptions.KnockBackHit1 | AttackerOptions.UseEffect;

            var cap = new CombatActionPack(attacker, skill.Id);
            cap.Add(sAction);

            var rnd = RandomProvider.Get();

            foreach (var target in targets)
            {
                if (target.IsDead)
                    continue;

                var tAction = new TargetAction(CombatActionType.TakeHit, target, attacker, skill.Id);
                tAction.Options |= TargetOptions.Result;

                var damage = attacker.GetMagicDamage(attacker.RightHand, rnd.Next((int)skill.RankInfo.Var1, (int)skill.RankInfo.Var2 + 1)) * dmgModifier;

                if (CombatHelper.TryAddCritical(target, ref damage, attacker.CriticalChanceAgainst(target)))
                    tAction.Options |= TargetOptions.Critical;

                target.TakeDamage(tAction.Damage = damage);

                // Knock down if dead
                if (target.IsDead)
                {
                    tAction.OldPosition = CombatHelper.KnockBack(target, attacker);
                    tAction.Options |= TargetOptions.FinishingKnockDown;
                }
                else
                {
                    if (target.KnockBack >= CombatHelper.LimitKnockBack)
                    {
                        tAction.Options |= TargetOptions.KnockDown;
                    }
                    else
                    {
                        target.KnockBack += KnockBack;
                        if (target.KnockBack >= CombatHelper.LimitKnockBack)
                        {
                            tAction.OldPosition = CombatHelper.KnockBack(target, attacker);
                            tAction.Options |= TargetOptions.KnockBack;
                        }
                    }

                    target.Stun = tAction.StunTime = 2000;

                    CombatHelper.SetAggro(attacker, target);
                }

                WorldManager.Instance.Broadcast(new MabiPacket(Op.Effect, target.Id).PutInt(Effect.Thunderbolt).PutByte(0), SendTargets.Range, target);
                cap.Add(tAction);
            }

            WorldManager.Instance.HandleCombatActionPack(cap);
        }
Exemplo n.º 19
0
        public override SkillResults UseCombat(MabiCreature attacker, ulong targetId, MabiSkill skill)
        {
            var itarget = WorldManager.Instance.GetCreatureById(targetId);
            if (itarget == null)
                return SkillResults.InvalidTarget;

            if (!WorldManager.InRange(attacker, itarget, 2000))
                return SkillResults.OutOfRange;

            attacker.StopMove();

            WorldManager.Instance.Broadcast(new MabiPacket(Op.Effect, attacker.Id).PutInt(Effect.UseMagic).PutString("thunder").PutByte(0).PutLong(targetId).PutShort((ushort)skill.Id), SendTargets.Range, attacker);

            var charges = attacker.ActiveSkillStacks;

            List<MabiCreature> targets = new List<MabiCreature>() { itarget };
            this.GetThunderChain(attacker, itarget, targets, ((byte)skill.Rank >= (byte)SkillRank.R1 ? 4 : 1) + (charges - 1) * 2);

            var pos = itarget.GetPosition();
            var cloud = new MabiProp(280, itarget.Region, pos.X, pos.Y, 0);
            WorldManager.Instance.AddProp(cloud);

            var lbPacket = new MabiPacket(Op.Effect, Id.Broadcast).PutInt(Effect.Lightningbolt).PutLong(attacker.Id).PutInt((uint)targets.Count);

            foreach (var target in targets)
            {
                lbPacket.PutLong(target.Id);
            }

            WorldManager.Instance.Broadcast(lbPacket, SendTargets.Range, attacker);

            Send.SkillUse(attacker.Client, attacker, skill.Id, UseStun, 1);

            SkillHelper.ClearStack(attacker, skill);

            // End the lightning balls
            WorldManager.Instance.Broadcast(new MabiPacket(Op.Effect, attacker.Id).PutInt(Effect.StackUpdate).PutString("lightningbolt").PutBytes(0, 0), SendTargets.Range, attacker);

            var sAction = new AttackerAction(CombatActionType.RangeHit, attacker, skill.Id, targetId);
            sAction.Options |= AttackerOptions.Result;

            attacker.Stun = sAction.StunTime = UseStun;

            var cap = new CombatActionPack(attacker, skill.Id);
            cap.Add(sAction);

            var rnd = RandomProvider.Get();

            foreach (var target in targets)
            {
                var tAction = new TargetAction(CombatActionType.TakeHit, target, attacker, skill.Id);
                tAction.Options |= TargetOptions.Result;

                cap.Add(tAction);

                var damage = attacker.GetMagicDamage(attacker.RightHand, rnd.Next((int)skill.RankInfo.Var4, (int)skill.RankInfo.Var5 + 1));

                if (CombatHelper.TryAddCritical(target, ref damage, attacker.CriticalChanceAgainst(target)))
                    tAction.Options |= TargetOptions.Critical;

                target.TakeDamage(tAction.Damage = damage);

                // Knock down if dead
                if (target.IsDead)
                {
                    tAction.OldPosition = CombatHelper.KnockBack(target, attacker);
                    tAction.Options |= TargetOptions.FinishingKnockDown;
                }
                else
                {
                    if (target.KnockBack >= CombatHelper.LimitKnockBack)
                    {
                        tAction.Options |= TargetOptions.KnockDown;
                    }
                    else
                    {
                        target.KnockBack += KnockBack;
                        if (target.KnockBack >= CombatHelper.LimitKnockBack)
                        {
                            tAction.OldPosition = CombatHelper.KnockBack(target, attacker);
                            tAction.Options |= TargetOptions.KnockBack;
                        }
                    }

                    target.Stun = tAction.StunTime = (ushort)skill.RankInfo.Var3;

                    CombatHelper.SetAggro(attacker, target);
                }
            }

            WorldManager.Instance.HandleCombatActionPack(cap);

            SkillHelper.GiveSkillExp(attacker, skill, 20);

            System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(() =>
                {
                    this.ThunderProcessing(attacker, skill, targets, cloud, DateTime.Now.AddMilliseconds(skill.RankInfo.Var3), charges);
                }));
            t.Start();

            return SkillResults.Okay;
        }
Exemplo n.º 20
0
        public void ThunderProcessing(MabiCreature attacker, MabiSkill skill, List<MabiCreature> targets, MabiProp cloud, DateTime stunEnd, int stack)
        {
            var lbPacket = new MabiPacket(Op.Effect, Id.Broadcast).PutInt(Effect.Lightningbolt).PutLong(attacker.Id).PutInt((uint)targets.Count);

            foreach (var target in targets)
            {
                lbPacket.PutLong(target.Id);
            }

            while (DateTime.Now < stunEnd)
            {
                System.Threading.Thread.Sleep(500);
                WorldManager.Instance.Broadcast(lbPacket, SendTargets.Range, attacker);
            }

            for (int i = 1; i < stack; i++)
            {
                HitWithThunderbolt(attacker, skill, targets, cloud);
                System.Threading.Thread.Sleep(500);
            }

            HitWithThunderbolt(attacker, skill, targets, cloud, (stack == 5 ? 2 : 1.5f));

            WorldManager.Instance.RemoveProp(cloud);
        }
Exemplo n.º 21
0
    public void OnHit(WorldClient c, MabiPC cr, MabiProp pr)
    {
        lock(_ident)
        {
            if(_hits > _required)
                return;

            if(_locked)
            {
                Send.Notice(c, "This seal stone cannot be broken yet.");
                return;
            }

            // You can only become breaker once officially.
            if(IsBreaker(cr) && !AllowMultiple)
            {
                Send.Notice(c, "Unable to break the Seal.\nYou already hold the title of a Seal Breaker.");
                return;
            }

            // Fulfilling the requirements?
            if(!Check(c, cr, pr))
            {
                Send.Notice(c, _help);
                return;
            }

            _hits++;

            bool update = false;

            // Done
            if(_hits == _required)
            {
                SetBreaker(pr, cr.Id, cr.Name);

                Global.Vars.Perm["SealStoneId" + _ident] = cr.Id;
                Global.Vars.Perm["SealStoneName" + _ident] = cr.Name;

                OnBreak(cr);

                Send.PropUpdate(pr);
                Send.RegionNotice(cr.Region, "{0} successfully broke {1} apart.", cr.Name, _name);
            }
            // Cracks after half.
            else if(_hits == Math.Floor(_required / 2f))
            {
                pr.State = "state2";

                Send.PropUpdate(pr);
                Send.RegionNotice(cr.Region, "{0} has started breaking {1} apart.", cr.Name, _name);
            }
        }
    }
Exemplo n.º 22
0
        /// <summary>
        /// Broadcasts prop update in its region.
        /// </summary>
        /// <param name="prop"></param>
        public static void PropUpdate(MabiProp prop)
        {
            var packet = new MabiPacket(Op.PropUpdate, prop.Id);
            packet.AddPropUpdateInfo(prop);

            WorldManager.Instance.BroadcastRegion(packet, prop.Region);
        }
Exemplo n.º 23
0
    public override void OnLoad()
    {
        Init();

        var stone = new MabiProp(_ident, "", "", 40000, _region, _x, _y, _direction);
        stone.State = "state1";

        if(Global.Vars.Perm["SealStoneId" + _ident] != null)
        {
            var id = (ulong)Global.Vars.Perm["SealStoneId" + _ident];
            var name = (string)Global.Vars.Perm["SealStoneName" + _ident];
            SetBreaker(stone, id, name);
        }

        SpawnProp(stone, OnHit);
    }
Exemplo n.º 24
0
 public override bool Check(WorldClient c, MabiPC cr, MabiProp prop)
 {
     // Must have rank D Playing Instrument, Composing, and Musical Knowledge
     return (
         (cr.Skills.Has(SkillConst.PlayingInstrument) && cr.Skills.Get(SkillConst.PlayingInstrument).Rank >= SkillRank.RD) &&
         (cr.Skills.Has(SkillConst.Composing) && cr.Skills.Get(SkillConst.Composing).Rank >= SkillRank.RD) &&
         (cr.Skills.Has(SkillConst.MusicalKnowledge) && cr.Skills.Get(SkillConst.MusicalKnowledge).Rank >= SkillRank.RD)
     );
 }
Exemplo n.º 25
0
 public override bool Check(WorldClient c, MabiPC cr, MabiProp prop)
 {
     return (cr.Str >= 35);
 }
Exemplo n.º 26
0
        protected void Explode(MabiCreature attacker, MabiCreature target, MabiSkill skill, MabiProp casterProp, float dmgModifier = 1f)
        {
            WorldManager.Instance.Broadcast(new MabiPacket(Op.Effect, target.Id).PutInt(Effect.IcespearFreeze).PutByte(1).PutInt(0), SendTargets.Range, target); // Cancel freeze

            var tPos = target.GetPosition();
            var bombProp = new MabiProp(280, target.Region, tPos.X, tPos.Y, 0); //4
            WorldManager.Instance.AddProp(bombProp);

            WorldManager.Instance.Broadcast(new MabiPacket(Op.Effect, bombProp.Id).PutInts(Effect.IcespearBoom, target.Region, tPos.X, tPos.Y), SendTargets.Range, bombProp);

            WorldManager.Instance.Broadcast(new MabiPacket(Op.Effect, target.Id).PutInt(Effect.Thunderbolt).PutByte(0), SendTargets.Range, target);

            var sAction = new AttackerAction(CombatActionType.SpecialHit, attacker, skill.Id, SkillHelper.GetAreaTargetID(target.Region, tPos.X, tPos.Y));
            sAction.PropId = casterProp.Id;
            sAction.Options = AttackerOptions.KnockBackHit1 | AttackerOptions.UseEffect;

            var tAction = new TargetAction(CombatActionType.TakeHit, target, attacker, skill.Id);
            tAction.Options = TargetOptions.Result;
            tAction.StunTime = target.Stun = 2000;

            var rnd = RandomProvider.Get();

            var damage = attacker.GetMagicDamage(attacker.RightHand, rnd.Next((int)skill.RankInfo.Var1, (int)skill.RankInfo.Var2 + 1)) * dmgModifier;

            if (CombatHelper.TryAddCritical(target, ref damage, attacker.CriticalChanceAgainst(target)))
                tAction.Options |= TargetOptions.Critical;

            target.TakeDamage(tAction.Damage = damage);

            // Knock down if dead
            tAction.OldPosition = CombatHelper.KnockBack(target, bombProp);
            if (target.IsDead)
            {
                tAction.Options |= TargetOptions.FinishingKnockDown;
            }
            else
            {
                tAction.Options |= TargetOptions.KnockDown;
                CombatHelper.SetAggro(attacker, target);
            }

            var cap = new CombatActionPack(attacker, skill.Id);
            cap.Add(sAction, tAction);

            WorldManager.Instance.HandleCombatActionPack(cap);

            sAction = new AttackerAction(CombatActionType.SpecialHit, attacker, skill.Id, SkillHelper.GetAreaTargetID(target.Region, tPos.X, tPos.Y));
            sAction.PropId = bombProp.Id;
            sAction.Options = AttackerOptions.UseEffect;

            cap = new CombatActionPack(attacker, skill.Id);
            cap.Add(sAction);

            WorldManager.Instance.HandleCombatActionPack(cap);

            WorldManager.Instance.RemoveProp(bombProp);
        }
Exemplo n.º 27
0
 public MabiPropBehavior(MabiProp prop, MabiPropFunc func = null)
 {
     this.Prop = prop;
     this.Func = func;
 }
Exemplo n.º 28
0
    public override bool Check(WorldClient c, MabiPC cr, MabiProp prop)
    {
        // Number Total Skill Ranks over 20
        int rank = 0;
        foreach(var skill in cr.Skills.List.Values)
        {
            if((rank += skill.Info.Rank) >= 20)
                return true;
        }

        return false;
    }
Exemplo n.º 29
0
        private CommandResult Command_prop(WorldClient client, MabiCreature creature, string[] args, string msg)
        {
            if (args.Length < 2)
                return CommandResult.WrongParameter;

            uint propClass = 0;
            if (!uint.TryParse(args[1], out propClass))
                return CommandResult.Fail;

            var pos = creature.GetPosition();
            var area = MabiData.RegionInfoDb.GetAreaId(creature.Region, pos.X, pos.Y);

            var prop = new MabiProp(propClass, creature.Region, pos.X, pos.Y, creature.Direction);
            WorldManager.Instance.AddProp(prop);

            return CommandResult.Okay;
        }
Exemplo n.º 30
0
 public override bool Check(WorldClient c, MabiPC cr, MabiProp prop)
 {
     return (cr.Titles.Count >= 18);
 }