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); }
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; }
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); } }
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); }
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; }
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; }
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); }
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; }
public abstract bool Check(WorldClient c, MabiPC cr, MabiProp prop);
public override bool Check(WorldClient c, MabiPC cr, MabiProp prop) { return (cr.LeftHand != null && cr.LeftHand.Info.Class == 1028); // Tracy's Secret }
public override bool Check(WorldClient c, MabiPC cr, MabiProp prop) { return (cr.Level >= (cr.Age * 4)); }
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); }
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(); }
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); } }
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; }
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; }
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; }
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); }
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; }
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); }
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); } } }
/// <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); }
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); }
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) ); }
public override bool Check(WorldClient c, MabiPC cr, MabiProp prop) { return (cr.Str >= 35); }
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); }
public MabiPropBehavior(MabiProp prop, MabiPropFunc func = null) { this.Prop = prop; this.Func = func; }
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; }
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; }
public override bool Check(WorldClient c, MabiPC cr, MabiProp prop) { return (cr.Titles.Count >= 18); }