public virtual void SetAction() { if (ActionFeed.Count == 0) { if (CMain.Random.Next(2) == 0 && Frames.Count > 1) { CurrentAction = MirAction.Harvest; } else { CurrentAction = MirAction.Standing; } Frames.TryGetValue(CurrentAction, out Frame); FrameIndex = 0; EffectFrameIndex = 0; if (MapLocation != CurrentLocation) { GameScene.Scene.MapControl.RemoveObject(this); MapLocation = CurrentLocation; GameScene.Scene.MapControl.AddObject(this); } if (Frame == null) { return; } FrameInterval = Frame.Interval; EffectFrameInterval = Frame.EffectInterval; } else { QueuedAction action = ActionFeed[0]; ActionFeed.RemoveAt(0); CurrentAction = action.Action; CurrentLocation = action.Location; //if(CanChangeDir) // Direction = action.Direction; FrameIndex = 0; EffectFrameIndex = 0; if (Frame == null) { return; } FrameInterval = Frame.Interval; EffectFrameInterval = Frame.EffectInterval; } NextMotion = CMain.Time + FrameInterval; NextMotion2 = CMain.Time + EffectFrameInterval; GameScene.Scene.MapControl.TextureValid = false; }
public override void SetAction() { if (QueuedAction != null) { if ((ActionFeed.Count == 0) || (ActionFeed.Count == 1 && NextAction.Action == MirAction.Stance)) { ActionFeed.Clear(); ActionFeed.Add(QueuedAction); QueuedAction = null; } } base.SetAction(); }
public virtual void ProcessFrames() { bool clear = CMain.Time >= NextMotion; ProcFrames(); if (clear) { QueuedAction = null; } if ((CurrentAction == MirAction.Standing) && (QueuedAction != null || NextAction != null)) { SetAction(); } }
public override void ProcessFrames() { bool clear = CMain.Time >= NextMotion; base.ProcessFrames(); if (clear) { QueuedAction = null; } if ((CurrentAction == MirAction.Standing || CurrentAction == MirAction.MountStanding || CurrentAction == MirAction.Stance || CurrentAction == MirAction.Stance2 || CurrentAction == MirAction.DashFail) && (QueuedAction != null || NextAction != null)) { SetAction(); } }
public virtual void SetAction() { if (NextAction != null && !GameScene.CanMove) { switch (NextAction.Action) { case MirAction.Walking: case MirAction.Running: case MirAction.MountWalking: case MirAction.MountRunning: case MirAction.Pushed: case MirAction.DashL: case MirAction.DashR: case MirAction.Sneek: case MirAction.Jump: case MirAction.DashAttack: return; } } if (User == this && CMain.Time < MapControl.NextAction)// && CanSetAction) { //NextMagic = null; return; } if (ActionFeed.Any()) if (User.RidingMount) switch (ActionFeed.First().Action) { case MirAction.Spell: //case MirAction.Attack1: case MirAction.Attack2: case MirAction.Attack3: case MirAction.Attack4: case MirAction.AttackRange1: case MirAction.AttackRange2: case MirAction.Mine: case MirAction.Harvest: ActionFeed.RemoveAt(0); return; } if (ActionFeed.Count == 0) { CurrentAction = MirAction.Standing; CurrentAction = CMain.Time > BlizzardStopTime ? CurrentAction : MirAction.Stance2; //CurrentAction = CMain.Time > SlashingBurstTime ? CurrentAction : MirAction.Lunge; if (RidingMount) { switch (CurrentAction) { case MirAction.Standing: CurrentAction = MirAction.MountStanding; break; case MirAction.Walking: CurrentAction = MirAction.MountWalking; break; case MirAction.Running: CurrentAction = MirAction.MountRunning; break; case MirAction.Struck: CurrentAction = MirAction.MountStruck; break; case MirAction.Attack1: CurrentAction = MirAction.MountAttack; break; } } if (CurrentAction == MirAction.Standing) { if (Class == MirClass.Archer && HasClassWeapon) CurrentAction = MirAction.Standing; else CurrentAction = CMain.Time > StanceTime ? MirAction.Standing : MirAction.Stance; if (Concentrating && ConcentrateInterrupted) Network.Enqueue(new C.SetConcentration { ObjectID = User.ObjectID, Enabled = Concentrating, Interrupted = false }); } if (Fishing) CurrentAction = MirAction.FishingWait; Frames.Frames.TryGetValue(CurrentAction, out Frame); FrameIndex = 0; EffectFrameIndex = 0; if (MapLocation != CurrentLocation) { GameScene.Scene.MapControl.RemoveObject(this); MapLocation = CurrentLocation; GameScene.Scene.MapControl.AddObject(this); } if (Frame == null) return; FrameInterval = Frame.Interval; EffectFrameInterval = Frame.EffectInterval; SetLibraries(); } else { QueuedAction action = ActionFeed[0]; ActionFeed.RemoveAt(0); CurrentAction = action.Action; if (RidingMount) { switch (CurrentAction) { case MirAction.Standing: CurrentAction = MirAction.MountStanding; break; case MirAction.Walking: CurrentAction = MirAction.MountWalking; break; case MirAction.Running: CurrentAction = MirAction.MountRunning; break; case MirAction.Struck: CurrentAction = MirAction.MountStruck; break; case MirAction.Attack1: CurrentAction = MirAction.MountAttack; break; } } CurrentLocation = action.Location; MirDirection olddirection = Direction; Direction = action.Direction; Point temp; switch (CurrentAction) { case MirAction.Walking: case MirAction.Running: case MirAction.MountWalking: case MirAction.MountRunning: case MirAction.Pushed: case MirAction.DashL: case MirAction.DashR: case MirAction.Sneek: var steps = 0; if (CurrentAction == MirAction.MountRunning) steps = 3; else if (CurrentAction == MirAction.Running) steps = (Sprint && !Sneaking ? 3 : 2); else steps = 1; temp = Functions.PointMove(CurrentLocation, Direction, CurrentAction == MirAction.Pushed ? 0 : -steps); break; case MirAction.Jump: case MirAction.DashAttack: temp = Functions.PointMove(CurrentLocation, Direction, JumpDistance); break; default: temp = CurrentLocation; break; } temp = new Point(action.Location.X, temp.Y > CurrentLocation.Y ? temp.Y : CurrentLocation.Y); if (MapLocation != temp) { GameScene.Scene.MapControl.RemoveObject(this); MapLocation = temp; GameScene.Scene.MapControl.AddObject(this); } bool ArcherLayTrap = false; switch (CurrentAction) { case MirAction.Pushed: if (this == User) MapControl.InputDelay = CMain.Time + 500; Frames.Frames.TryGetValue(MirAction.Walking, out Frame); break; case MirAction.DashL: case MirAction.DashR: Frames.Frames.TryGetValue(MirAction.Running, out Frame); break; case MirAction.DashAttack: Frames.Frames.TryGetValue(MirAction.DashAttack, out Frame); break; case MirAction.DashFail: Frames.Frames.TryGetValue(RidingMount ? MirAction.MountStanding : MirAction.Standing, out Frame); //Frames.Frames.TryGetValue(MirAction.Standing, out Frame); //CanSetAction = false; break; case MirAction.Jump: Frames.Frames.TryGetValue(MirAction.Jump, out Frame); break; case MirAction.Attack1: switch (Class) { case MirClass.Archer: Frames.Frames.TryGetValue(CurrentAction, out Frame); break; case MirClass.Assassin: if(GameScene.DoubleSlash) Frames.Frames.TryGetValue(MirAction.Attack1, out Frame); else if (CMain.Shift) Frames.Frames.TryGetValue(CMain.Random.Next(100) >= 20 ? (CMain.Random.Next(100) > 40 ? MirAction.Attack1 : MirAction.Attack4) : (CMain.Random.Next(100) > 10 ? MirAction.Attack2 : MirAction.Attack3), out Frame); else Frames.Frames.TryGetValue(CMain.Random.Next(100) >= 40 ? MirAction.Attack1 : MirAction.Attack4, out Frame); break; default: if (CMain.Shift) Frames.Frames.TryGetValue(CMain.Random.Next(100) >= 20 ? MirAction.Attack1 : MirAction.Attack3, out Frame); else Frames.Frames.TryGetValue(CurrentAction, out Frame); break; } break; case MirAction.Attack4: Spell = (Spell)action.Params[0]; Frames.Frames.TryGetValue(Spell == Spell.TwinDrakeBlade || Spell == Spell.FlamingSword ? MirAction.Attack1 : CurrentAction, out Frame); break; case MirAction.Spell: Spell = (Spell)action.Params[0]; switch (Spell) { case Spell.ShoulderDash: Frames.Frames.TryGetValue(MirAction.Running, out Frame); CurrentAction = MirAction.DashL; Direction = olddirection; CurrentLocation = Functions.PointMove(CurrentLocation, Direction, 1); if (this == User) { MapControl.NextAction = CMain.Time + 2500; GameScene.SpellTime = CMain.Time + 2500; //Spell Delay Network.Enqueue(new C.Magic { Spell = Spell, Direction = Direction, }); } break; case Spell.BladeAvalanche: Frames.Frames.TryGetValue(MirAction.Attack3, out Frame); if (this == User) { MapControl.NextAction = CMain.Time + 2500; GameScene.SpellTime = CMain.Time + 1500; //Spell Delay } break; case Spell.SlashingBurst: Frames.Frames.TryGetValue(MirAction.Attack1, out Frame); if (this == User) { MapControl.NextAction = CMain.Time + 2000; // 80% GameScene.SpellTime = CMain.Time + 1500; //Spell Delay } break; case Spell.CounterAttack: Frames.Frames.TryGetValue(MirAction.Attack1, out Frame); if (this == User) { GameScene.AttackTime = CMain.Time + User.AttackSpeed; MapControl.NextAction = CMain.Time + 100; // 80% GameScene.SpellTime = CMain.Time + 100; //Spell Delay } break; case Spell.PoisonSword: Frames.Frames.TryGetValue(MirAction.Attack1, out Frame); if (this == User) { MapControl.NextAction = CMain.Time + 2000; // 80% GameScene.SpellTime = CMain.Time + 1500; //Spell Delay } break; case Spell.HeavenlySword: Frames.Frames.TryGetValue(MirAction.Attack2, out Frame); if (this == User) { MapControl.NextAction = CMain.Time + 1200; GameScene.SpellTime = CMain.Time + 1200; //Spell Delay } break; case Spell.CrescentSlash: Frames.Frames.TryGetValue(MirAction.Attack3, out Frame); if (this == User) { MapControl.NextAction = CMain.Time + 2500; GameScene.SpellTime = CMain.Time + 1500; //Spell Delay } break; case Spell.FlashDash: { int sLevel = (byte)action.Params[3]; GetFlashDashDistance(sLevel); if (JumpDistance != 0) { Frames.Frames.TryGetValue(MirAction.DashAttack, out Frame); CurrentAction = MirAction.DashAttack; CurrentLocation = Functions.PointMove(CurrentLocation, Direction, JumpDistance); } else { Frames.Frames.TryGetValue(CMain.Random.Next(100) >= 40 ? MirAction.Attack1 : MirAction.Attack4, out Frame); } if (this == User) { MapControl.NextAction = CMain.Time; GameScene.SpellTime = CMain.Time + 250; //Spell Delay if (JumpDistance != 0) Network.Enqueue(new C.Magic { Spell = Spell, Direction = Direction }); } } break; case Spell.StraightShot: Frames.Frames.TryGetValue(MirAction.AttackRange2, out Frame); CurrentAction = MirAction.AttackRange2; if (this == User) { MapControl.NextAction = CMain.Time + 1000; GameScene.SpellTime = CMain.Time + 1500; //Spell Delay } break; case Spell.DoubleShot: Frames.Frames.TryGetValue(MirAction.AttackRange2, out Frame); CurrentAction = MirAction.AttackRange2; if (this == User) { MapControl.NextAction = CMain.Time + 1000; GameScene.SpellTime = CMain.Time + 500; //Spell Delay } break; case Spell.ExplosiveTrap: Frames.Frames.TryGetValue(MirAction.Harvest, out Frame); CurrentAction = MirAction.Harvest; ArcherLayTrap = true; if (this == User) { uint targetID = (uint)action.Params[1]; Point location = (Point)action.Params[2]; Network.Enqueue(new C.Magic { Spell = Spell, Direction = Direction, TargetID = targetID, Location = location }); MapControl.NextAction = CMain.Time + 1000; GameScene.SpellTime = CMain.Time + 1500; //Spell Delay } break; case Spell.DelayedExplosion: Frames.Frames.TryGetValue(MirAction.AttackRange2, out Frame); CurrentAction = MirAction.AttackRange2; if (this == User) { MapControl.NextAction = CMain.Time + 1000; GameScene.SpellTime = CMain.Time + 1500; //Spell Delay } break; case Spell.BackStep: { int sLevel = (byte)action.Params[3]; GetBackStepDistance(sLevel); Frames.Frames.TryGetValue(MirAction.Jump, out Frame); CurrentAction = MirAction.Jump; CurrentLocation = Functions.PointMove(CurrentLocation, Functions.ReverseDirection(Direction), JumpDistance); if (this == User) { MapControl.NextAction = CMain.Time + 800; GameScene.SpellTime = CMain.Time + 2500; //Spell Delay Network.Enqueue(new C.Magic { Spell = Spell, Direction = Direction }); } break; } case Spell.ElementalShot: if (HasElements && !ElementCasted) { Frames.Frames.TryGetValue(MirAction.AttackRange2, out Frame); CurrentAction = MirAction.AttackRange2; if (this == User) { MapControl.NextAction = CMain.Time + 1000; GameScene.SpellTime = CMain.Time + 1500; //Spell Delay } } else Frames.Frames.TryGetValue(CurrentAction, out Frame); if (ElementCasted) ElementCasted = false; break; case Spell.BindingShot: case Spell.VampireShot: case Spell.PoisonShot: case Spell.CrippleShot: case Spell.NapalmShot: case Spell.SummonVampire: case Spell.SummonToad: case Spell.SummonSnakes: Frames.Frames.TryGetValue(MirAction.AttackRange2, out Frame); CurrentAction = MirAction.AttackRange2; if (this == User) { MapControl.NextAction = CMain.Time + 1000; GameScene.SpellTime = CMain.Time + 1000; //Spell Delay } break; default: Frames.Frames.TryGetValue(CurrentAction, out Frame); break; } break; default: Frames.Frames.TryGetValue(CurrentAction, out Frame); break; } //ArcherTest - Need to check for bow weapon only if (Class == MirClass.Archer && HasClassWeapon) { switch (CurrentAction) { case MirAction.Walking: Frames.Frames.TryGetValue(MirAction.WalkingBow, out Frame); break; case MirAction.Running: Frames.Frames.TryGetValue(MirAction.RunningBow, out Frame); break; } } //Assassin sneekyness if (Class == MirClass.Assassin && Sneaking && (CurrentAction == MirAction.Walking || CurrentAction == MirAction.Running)) { Frames.Frames.TryGetValue(MirAction.Sneek, out Frame); } SetLibraries(); FrameIndex = 0; EffectFrameIndex = 0; Spell = Spell.None; SpellLevel = 0; //NextMagic = null; ClientMagic magic; if (Frame == null) return; FrameInterval = Frame.Interval; EffectFrameInterval = Frame.EffectInterval; if (this == User) { switch (CurrentAction) { case MirAction.DashFail: //CanSetAction = false; break; case MirAction.Standing: case MirAction.MountStanding: Network.Enqueue(new C.Turn { Direction = Direction }); MapControl.NextAction = CMain.Time + 2500; GameScene.CanRun = false; break; case MirAction.Walking: case MirAction.MountWalking: case MirAction.Sneek: Network.Enqueue(new C.Walk { Direction = Direction }); GameScene.Scene.MapControl.FloorValid = false; GameScene.CanRun = true; MapControl.NextAction = CMain.Time + 2500; break; case MirAction.Running: case MirAction.MountRunning: Network.Enqueue(new C.Run { Direction = Direction }); GameScene.Scene.MapControl.FloorValid = false; MapControl.NextAction = CMain.Time + (Sprint ? 1000 : 2500); break; case MirAction.Pushed: GameScene.Scene.MapControl.FloorValid = false; MapControl.InputDelay = CMain.Time + 500; break; case MirAction.DashL: case MirAction.DashR: case MirAction.Jump: case MirAction.DashAttack: GameScene.Scene.MapControl.FloorValid = false; //CanSetAction = false; break; case MirAction.Mine: Network.Enqueue(new C.Attack { Direction = Direction, Spell = Spell.None }); GameScene.AttackTime = CMain.Time + (1400 - Math.Min(370, (User.Level * 14))); MapControl.NextAction = CMain.Time + 2500; break; case MirAction.Attack1: case MirAction.MountAttack: if (!RidingMount) { if (GameScene.Slaying && TargetObject != null) Spell = Spell.Slaying; if (GameScene.Thrusting && GameScene.Scene.MapControl.HasTarget(Functions.PointMove(CurrentLocation, Direction, 2))) Spell = Spell.Thrusting; if (GameScene.HalfMoon) { if (TargetObject != null || GameScene.Scene.MapControl.CanHalfMoon(CurrentLocation, Direction)) { magic = User.GetMagic(Spell.HalfMoon); if (magic != null && magic.BaseCost + magic.LevelCost * magic.Level <= User.MP) Spell = Spell.HalfMoon; } } if (GameScene.CrossHalfMoon) { if (TargetObject != null || GameScene.Scene.MapControl.CanCrossHalfMoon(CurrentLocation)) { magic = User.GetMagic(Spell.CrossHalfMoon); if (magic != null && magic.BaseCost + magic.LevelCost * magic.Level <= User.MP) Spell = Spell.CrossHalfMoon; } } if (GameScene.DoubleSlash) { magic = User.GetMagic(Spell.DoubleSlash); if (magic != null && magic.BaseCost + magic.LevelCost * magic.Level <= User.MP) Spell = Spell.DoubleSlash; } if (GameScene.TwinDrakeBlade && TargetObject != null) { magic = User.GetMagic(Spell.TwinDrakeBlade); if (magic != null && magic.BaseCost + magic.LevelCost * magic.Level <= User.MP) Spell = Spell.TwinDrakeBlade; } if (GameScene.FlamingSword) { if (TargetObject != null) { magic = User.GetMagic(Spell.FlamingSword); if (magic != null) Spell = Spell.FlamingSword; } } } Network.Enqueue(new C.Attack { Direction = Direction, Spell = Spell }); if (Spell == Spell.Slaying) GameScene.Slaying = false; if (Spell == Spell.TwinDrakeBlade) GameScene.TwinDrakeBlade = false; if (Spell == Spell.FlamingSword) GameScene.FlamingSword = false; magic = User.GetMagic(Spell); if (magic != null) SpellLevel = magic.Level; GameScene.AttackTime = CMain.Time + User.AttackSpeed; MapControl.NextAction = CMain.Time + 2500; break; case MirAction.Attack2: //Network.Enqueue(new C.Attack2 { Direction = Direction }); break; case MirAction.Attack3: //Network.Enqueue(new C.Attack3 { Direction = Direction }); break; //case MirAction.Attack4: // GameScene.AttackTime = CMain.Time;// + User.AttackSpeed; // MapControl.NextAction = CMain.Time; // break; case MirAction.AttackRange1: //ArcherTest GameScene.AttackTime = CMain.Time + User.AttackSpeed + 200; uint targetID = (uint)action.Params[0]; Point location = (Point)action.Params[1]; Network.Enqueue(new C.RangeAttack { Direction = Direction, Location = CurrentLocation, TargetID = targetID, TargetLocation = location }); break; case MirAction.AttackRange2: case MirAction.Spell: Spell = (Spell)action.Params[0]; targetID = (uint)action.Params[1]; location = (Point)action.Params[2]; //magic = User.GetMagic(Spell); //magic.LastCast = CMain.Time; Network.Enqueue(new C.Magic { Spell = Spell, Direction = Direction, TargetID = targetID, Location = location }); if (Spell == Spell.FlashDash) { GameScene.SpellTime = CMain.Time + 250; MapControl.NextAction = CMain.Time; } else { GameScene.SpellTime = Spell == Spell.FlameField ? CMain.Time + 2500 : CMain.Time + 1800; MapControl.NextAction = CMain.Time + 2500; } break; case MirAction.Harvest: if (ArcherLayTrap) { ArcherLayTrap = false; SoundManager.PlaySound(20000 + 124 * 10); } else { Network.Enqueue(new C.Harvest { Direction = Direction }); MapControl.NextAction = CMain.Time + 2500; } break; } } switch (CurrentAction) { case MirAction.Pushed: FrameIndex = Frame.Count - 1; EffectFrameIndex = Frame.EffectCount - 1; GameScene.Scene.Redraw(); break; case MirAction.DashL: case MirAction.Jump: FrameIndex = 0; EffectFrameIndex = 0; GameScene.Scene.Redraw(); break; case MirAction.DashR: FrameIndex = 3; EffectFrameIndex = 3; GameScene.Scene.Redraw(); break; case MirAction.Walking: case MirAction.Running: case MirAction.MountWalking: case MirAction.MountRunning: case MirAction.Sneek: GameScene.Scene.Redraw(); break; case MirAction.DashAttack: //FrameIndex = 0; //EffectFrameIndex = 0; GameScene.Scene.Redraw(); if (IsDashAttack()) { action = new QueuedAction { Action = MirAction.Attack4, Direction = Direction, Location = CurrentLocation, Params = new List<object>() }; action.Params.Add(Spell.FlashDash); ActionFeed.Insert(0, action); } break; case MirAction.Attack1: if (this != User) { Spell = (Spell)action.Params[0]; SpellLevel = (byte)action.Params[1]; } switch (Spell) { case Spell.Slaying: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + (Gender == MirGender.Male ? 0 : 1)); break; case Spell.DoubleSlash: FrameInterval = (FrameInterval * 7 / 10); //50% Faster Animation EffectFrameInterval = (EffectFrameInterval * 7 / 10); action = new QueuedAction { Action = MirAction.Attack4, Direction = Direction, Location = CurrentLocation, Params = new List<object>() }; action.Params.Add(Spell); ActionFeed.Insert(0, action); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; case Spell.Thrusting: SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; case Spell.HalfMoon: SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; case Spell.TwinDrakeBlade: //FrameInterval = FrameInterval * 9 / 10; //70% Faster Animation //EffectFrameInterval = EffectFrameInterval * 9 / 10; //action = new QueuedAction { Action = MirAction.Attack4, Direction = Direction, Location = CurrentLocation, Params = new List<object>() }; //action.Params.Add(Spell); //ActionFeed.Insert(0, action); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; case Spell.CrossHalfMoon: SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; case Spell.FlamingSword: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); break; } break; case MirAction.Attack4: Spell = (Spell)action.Params[0]; switch (Spell) { case Spell.DoubleSlash: FrameInterval = FrameInterval * 7 / 10; //50% Animation Speed EffectFrameInterval = EffectFrameInterval * 7 / 10; SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); break; case Spell.TwinDrakeBlade: FrameInterval = FrameInterval * 9 / 10; //80% Animation Speed EffectFrameInterval = EffectFrameInterval * 9 / 10; break; case Spell.FlashDash: int attackDelay = (User.AttackSpeed - 120) <= 300 ? 300 : (User.AttackSpeed - 120); float attackRate = (float)(attackDelay / 300F * 10F); FrameInterval = FrameInterval * (int)attackRate / 20; EffectFrameInterval = EffectFrameInterval * (int)attackRate / 20; break; } break; case MirAction.Struck: case MirAction.MountStruck: uint attackerID = (uint)action.Params[0]; StruckWeapon = -2; for (int i = 0; i < MapControl.Objects.Count; i++) { MapObject ob = MapControl.Objects[i]; if (ob.ObjectID != attackerID) continue; if (ob.Race != ObjectType.Player) break; PlayerObject player = ((PlayerObject)ob); StruckWeapon = player.Weapon; if (player.Class != MirClass.Assassin || StruckWeapon == -1) break; StruckWeapon = 1; break; } PlayStruckSound(); PlayFlinchSound(); break; case MirAction.AttackRange1: //ArcherTest - Assign Target for other users if (this != User) { TargetID = (uint)action.Params[0]; TargetPoint = (Point)action.Params[1]; Spell = (Spell)action.Params[2]; } break; case MirAction.AttackRange2: case MirAction.Spell: if (this != User) { Spell = (Spell)action.Params[0]; TargetID = (uint)action.Params[1]; TargetPoint = (Point)action.Params[2]; Cast = (bool)action.Params[3]; SpellLevel = (byte)action.Params[4]; } switch (Spell) { #region FireBall case Spell.FireBall: Effects.Add(new Effect(Libraries.Magic, 0, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Healing case Spell.Healing: Effects.Add(new Effect(Libraries.Magic, 200, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Repulsion case Spell.Repulsion: Effects.Add(new Effect(Libraries.Magic, 900, 6, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region ElectricShock case Spell.ElectricShock: Effects.Add(new Effect(Libraries.Magic, 1560, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Poisoning case Spell.Poisoning: Effects.Add(new Effect(Libraries.Magic, 600, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region GreatFireBall case Spell.GreatFireBall: Effects.Add(new Effect(Libraries.Magic, 400, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region HellFire case Spell.HellFire: Effects.Add(new Effect(Libraries.Magic, 920, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region ThunderBolt case Spell.ThunderBolt: Effects.Add(new Effect(Libraries.Magic2, 20, 3, 300, this)); break; #endregion #region SoulFireBall case Spell.SoulFireBall: SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region SummonSkeleton case Spell.SummonSkeleton: Effects.Add(new Effect(Libraries.Magic, 1500, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Teleport case Spell.Teleport: Effects.Add(new Effect(Libraries.Magic, 1590, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Blink case Spell.Blink: Effects.Add(new Effect(Libraries.Magic, 1590, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Hiding case Spell.Hiding: Effects.Add(new Effect(Libraries.Magic, 1520, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Haste case Spell.Haste: Effects.Add(new Effect(Libraries.Magic2, 2140 + (int)Direction * 10, 6, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Fury case Spell.Fury: Effects.Add(new Effect(Libraries.Magic3, 200, 8, 8 * FrameInterval, this)); Effects.Add(new Effect(Libraries.Magic3, 187, 10, 10 * FrameInterval, this)); //i don't know sound SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region FireBang case Spell.FireBang: Effects.Add(new Effect(Libraries.Magic, 1650, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region FireWall case Spell.FireWall: Effects.Add(new Effect(Libraries.Magic, 1620, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region TrapHexagon case Spell.TrapHexagon: Effects.Add(new Effect(Libraries.Magic, 1380, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region EnergyRepulsor case Spell.EnergyRepulsor: Effects.Add(new Effect(Libraries.Magic2, 190, 6, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region FireBurst case Spell.FireBurst: Effects.Add(new Effect(Libraries.Magic2, 2320, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region FlameDisruptor case Spell.FlameDisruptor: Effects.Add(new Effect(Libraries.Magic2, 130, 6, Frame.Count * FrameInterval, this)); break; #endregion #region SummonShinsu case Spell.SummonShinsu: Effects.Add(new Effect(Libraries.Magic2, 0, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region UltimateEnchancer case Spell.UltimateEnhancer: Effects.Add(new Effect(Libraries.Magic2, 160, 15, 1000, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region FrostCrunch case Spell.FrostCrunch: Effects.Add(new Effect(Libraries.Magic2, 400, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Purification case Spell.Purification: Effects.Add(new Effect(Libraries.Magic2, 600, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region FlameField case Spell.FlameField: MapControl.Effects.Add(new Effect(Libraries.Magic2, 910, 23, 1800, CurrentLocation)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Trap case Spell.Trap: Effects.Add(new Effect(Libraries.Magic2, 2340, 11, 11 * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region MoonLight case Spell.MoonLight: Effects.Add(new Effect(Libraries.Magic2, 2380, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region SwiftFeet case Spell.SwiftFeet: Effects.Add(new Effect(Libraries.Magic2, 2440, 16, 16 * EffectFrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region LightBody case Spell.LightBody: Effects.Add(new Effect(Libraries.Magic2, 2470, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region PoisonSword case Spell.PoisonSword: Effects.Add(new Effect(Libraries.Magic2, 2490 + ((int)Direction * 10), 10, Frame.Count * FrameInterval + 500, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region DarkBody case Spell.DarkBody: Effects.Add(new Effect(Libraries.Magic2, 2580, 10, 10 * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region ThunderStorm case Spell.ThunderStorm: MapControl.Effects.Add(new Effect(Libraries.Magic, 1680, 10, Frame.Count * FrameInterval, CurrentLocation)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region MassHealing case Spell.MassHealing: Effects.Add(new Effect(Libraries.Magic, 1790, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region IceStorm case Spell.IceStorm: Effects.Add(new Effect(Libraries.Magic, 3840, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region MagicShield case Spell.MagicShield: Effects.Add(new Effect(Libraries.Magic, 3880, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region TurnUndead case Spell.TurnUndead: Effects.Add(new Effect(Libraries.Magic, 3920, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region MagicBooster case Spell.MagicBooster: Effects.Add(new Effect(Libraries.Magic3, 80, 9, 9 * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region PetEnhancer case Spell.PetEnhancer: Effects.Add(new Effect(Libraries.Magic3, 200, 8, 8 * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Revelation case Spell.Revelation: Effects.Add(new Effect(Libraries.Magic, 3960, 20, 1200, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region ProtectionField case Spell.ProtectionField: Effects.Add(new Effect(Libraries.Magic2, 1520, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Rage case Spell.Rage: Effects.Add(new Effect(Libraries.Magic2, 1510, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Vampirism case Spell.Vampirism: Effects.Add(new Effect(Libraries.Magic2, 1040, 7, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region LionRoar case Spell.LionRoar: Effects.Add(new Effect(Libraries.Magic2, 710, 20, 1200, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 + (Gender == MirGender.Male ? 0 : 1)); break; #endregion #region TwinDrakeBlade case Spell.TwinDrakeBlade: Effects.Add(new Effect(Libraries.Magic2, 210, 6, 500, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Entrapment case Spell.Entrapment: Effects.Add(new Effect(Libraries.Magic2, 990, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region BladeAvalanche case Spell.BladeAvalanche: Effects.Add(new Effect(Libraries.Magic2, 740 + (int)Direction * 20, 15, 15 * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region SlashingBurst case Spell.SlashingBurst: //MapControl.Effects.Add(new Effect(Libraries.Magic2, 1700 + (int)Direction * 10, 9, 9 * FrameInterval, CurrentLocation)); Effects.Add(new Effect(Libraries.Magic2, 1700 + (int)Direction * 10, 9, 9 * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); SlashingBurstTime = CMain.Time + 2000; break; #endregion #region CounterAttack case Spell.CounterAttack: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 5); Effects.Add(new Effect(Libraries.Magic, 3480 + (int)Direction * 10, 10, 10 * FrameInterval, this)); Effects.Add(new Effect(Libraries.Magic3, 140, 2, 2 * FrameInterval, this)); break; #endregion #region CrescentSlash case Spell.CrescentSlash: Effects.Add(new Effect(Libraries.Magic2, 2620 + (int)Direction * 20, 20, 20 * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 + (Gender == MirGender.Male ? 0 : 1)); break; #endregion #region FlashDash case Spell.FlashDash: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + (Gender == MirGender.Male ? 0 : 1)); int attackDelay = (User.AttackSpeed - 120) <= 300 ? 300 : (User.AttackSpeed - 120); float attackRate = (float)(attackDelay / 300F * 10F); FrameInterval = FrameInterval * (int)attackRate / 20; EffectFrameInterval = EffectFrameInterval * (int)attackRate / 20; break; #endregion #region Mirroring case Spell.Mirroring: Effects.Add(new Effect(Libraries.Magic2, 650, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Blizzard case Spell.Blizzard: Effects.Add(new Effect(Libraries.Magic2, 1540, 8, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); BlizzardStopTime = CMain.Time + 3000; break; #endregion #region MeteorStrike case Spell.MeteorStrike: Effects.Add(new Effect(Libraries.Magic2, 1590, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); BlizzardStopTime = CMain.Time + 3000; break; #endregion #region Reincarnation case Spell.Reincarnation: ReincarnationStopTime = CMain.Time + 6000; break; #endregion #region HeavenlySword case Spell.HeavenlySword: Effects.Add(new Effect(Libraries.Magic2, 2230 + ((int)Direction * 10), 8, 800, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region ElementalBarrier case Spell.ElementalBarrier: if (HasElements && !ElementalBarrier) { Effects.Add(new Effect(Libraries.Magic3, 1880, 8, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); } break; #endregion #region PoisonShot case Spell.PoisonShot: Effects.Add(new Effect(Libraries.Magic3, 2300, 8, 1000, this)); break; #endregion #region OneWithNature case Spell.OneWithNature: MapControl.Effects.Add(new Effect(Libraries.Magic3, 2710, 8, 1200, CurrentLocation)); SoundManager.PlaySound(20000 + 139 * 10); break; #endregion } break; case MirAction.Dead: GameScene.Scene.Redraw(); GameScene.Scene.MapControl.SortObject(this); if (MouseObject == this) MouseObject = null; if (TargetObject == this) TargetObject = null; if (MagicObject == this) MagicObject = null; DeadTime = CMain.Time; break; } } GameScene.Scene.MapControl.TextureValid = false; NextMotion = CMain.Time + FrameInterval; NextMotion2 = CMain.Time + EffectFrameInterval; if (ElementalBarrier) { switch (CurrentAction) { case MirAction.Struck: case MirAction.MountStruck: if (ElementalBarrierEffect != null) { ElementalBarrierEffect.Clear(); ElementalBarrierEffect.Remove(); } Effects.Add(ElementalBarrierEffect = new Effect(Libraries.Magic3, 1910, 5, 600, this)); ElementalBarrierEffect.Complete += (o, e) => Effects.Add(ElementalBarrierEffect = new Effect(Libraries.Magic3, 1890, 16, 3200, this) { Repeat = true }); break; default: if (ElementalBarrierEffect == null) Effects.Add(ElementalBarrierEffect = new Effect(Libraries.Magic3, 1890, 16, 3200, this) { Repeat = true }); break; } } if (MagicShield) { switch (CurrentAction) { case MirAction.Struck: case MirAction.MountStruck: if (ShieldEffect != null) { ShieldEffect.Clear(); ShieldEffect.Remove(); } Effects.Add(ShieldEffect = new Effect(Libraries.Magic, 3900, 3, 600, this)); ShieldEffect.Complete += (o, e) => Effects.Add(ShieldEffect = new Effect(Libraries.Magic, 3890, 3, 600, this) { Repeat = true }); break; default: if (ShieldEffect == null) Effects.Add(ShieldEffect = new Effect(Libraries.Magic, 3890, 3, 600, this) { Repeat = true }); break; } } }
public virtual void SetAction() { if (NextAction != null && !GameScene.CanMove) { switch (NextAction.Action) { case MirAction.Walking: case MirAction.Running: case MirAction.Pushed: case MirAction.DashL: case MirAction.DashR: return; } } if (User == this && CMain.Time < MapControl.NextAction)// && CanSetAction) { //NextMagic = null; return; } if (ActionFeed.Count == 0) { CurrentAction = CMain.Time > BlizzardFreezeTime ? MirAction.Standing : MirAction.Stance2; if (CurrentAction == MirAction.Standing) CurrentAction = CMain.Time > StanceTime ? MirAction.Standing : MirAction.Stance; Frames.Frames.TryGetValue(CurrentAction, out Frame); FrameIndex = 0; EffectFrameIndex = 0; if (MapLocation != CurrentLocation) { GameScene.Scene.MapControl.RemoveObject(this); MapLocation = CurrentLocation; GameScene.Scene.MapControl.AddObject(this); } if (Frame == null) return; FrameInterval = Frame.Interval; EffectFrameInterval = Frame.EffectInterval; } else { QueuedAction action = ActionFeed[0]; ActionFeed.RemoveAt(0); CurrentAction = action.Action; CurrentLocation = action.Location; MirDirection olddirection = Direction; Direction = action.Direction; Point temp; switch (CurrentAction) { case MirAction.Walking: case MirAction.Running: case MirAction.Pushed: case MirAction.DashL: case MirAction.DashR: int i = CurrentAction == MirAction.Running ? 2 : 1; temp = Functions.PointMove(CurrentLocation, Direction, CurrentAction == MirAction.Pushed ? 0 : -i); break; default: temp = CurrentLocation; break; } temp = new Point(action.Location.X, temp.Y > CurrentLocation.Y ? temp.Y : CurrentLocation.Y); if (MapLocation != temp) { GameScene.Scene.MapControl.RemoveObject(this); MapLocation = temp; GameScene.Scene.MapControl.AddObject(this); } switch (CurrentAction) { case MirAction.Pushed: if (this == User) MapControl.InputDelay = CMain.Time + 500; Frames.Frames.TryGetValue(MirAction.Walking, out Frame); break; case MirAction.DashL: case MirAction.DashR: Frames.Frames.TryGetValue(MirAction.Running, out Frame); break; case MirAction.DashFail: Frames.Frames.TryGetValue(MirAction.Standing, out Frame); //CanSetAction = false; break; case MirAction.Attack4: Spell = (Spell)action.Params[0]; Frames.Frames.TryGetValue(Spell == Spell.TwinDrakeBlade || Spell == Spell.FlamingSword ? MirAction.Attack1 : CurrentAction, out Frame); break; case MirAction.Spell: Spell = (Spell)action.Params[0]; switch (Spell) { case Spell.ShoulderDash: Frames.Frames.TryGetValue(MirAction.Running, out Frame); CurrentAction = MirAction.DashL; Direction = olddirection; CurrentLocation = Functions.PointMove(CurrentLocation, Direction, 1); if (this == User) { MapControl.NextAction = CMain.Time + 2500; GameScene.SpellTime = CMain.Time + 2500; //Spell Delay Network.Enqueue(new C.Magic { Spell = Spell, Direction = Direction, }); } break; case Spell.BladeAvalanche: Frames.Frames.TryGetValue(MirAction.Attack3, out Frame); if (this == User) { MapControl.NextAction = CMain.Time + 2500; GameScene.SpellTime = CMain.Time + 1500; //Spell Delay } break; default: Frames.Frames.TryGetValue(CurrentAction, out Frame); break; } break; default: Frames.Frames.TryGetValue(CurrentAction, out Frame); break; } FrameIndex = 0; EffectFrameIndex = 0; Spell = Spell.None; SpellLevel = 0; //NextMagic = null; if (Frame == null) return; FrameInterval = Frame.Interval; EffectFrameInterval = Frame.EffectInterval; if (this == User) { switch (CurrentAction) { case MirAction.DashFail: //CanSetAction = false; break; case MirAction.Standing: Network.Enqueue(new C.Turn {Direction = Direction}); MapControl.NextAction = CMain.Time + 2500; break; case MirAction.Walking: Network.Enqueue(new C.Walk {Direction = Direction}); GameScene.Scene.MapControl.FloorValid = false; GameScene.CanRun = true; MapControl.NextAction = CMain.Time + 2500; break; case MirAction.Running: Network.Enqueue(new C.Run {Direction = Direction}); GameScene.Scene.MapControl.FloorValid = false; MapControl.NextAction = CMain.Time + 2500; break; case MirAction.Pushed: GameScene.Scene.MapControl.FloorValid = false; MapControl.InputDelay = CMain.Time + 500; break; case MirAction.DashL: case MirAction.DashR: GameScene.Scene.MapControl.FloorValid = false; //CanSetAction = false; break; case MirAction.Attack1: ClientMagic magic; if (GameScene.Slaying && TargetObject != null) Spell = Spell.Slaying; if (GameScene.Thrusting && GameScene.Scene.MapControl.HasTarget(Functions.PointMove(CurrentLocation, Direction, 2))) Spell = Spell.Thrusting; if (GameScene.HalfMoon) { if (TargetObject != null || GameScene.Scene.MapControl.CanHalfMoon(CurrentLocation, Direction)) { magic = User.GetMagic(Spell.HalfMoon); if (magic != null && magic.BaseCost + magic.LevelCost * magic.Level <= User.MP) Spell = Spell.HalfMoon; } } if (GameScene.CrossHalfMoon) { if (TargetObject != null || GameScene.Scene.MapControl.CanCrossHalfMoon(CurrentLocation)) { magic = User.GetMagic(Spell.CrossHalfMoon); if (magic != null && magic.BaseCost + magic.LevelCost * magic.Level <= User.MP) Spell = Spell.CrossHalfMoon; } } if (GameScene.DoubleSlash) { magic = User.GetMagic(Spell.DoubleSlash); if (magic != null && magic.BaseCost + magic.LevelCost * magic.Level <= User.MP) Spell = Spell.DoubleSlash; } if (GameScene.TwinDrakeBlade) { magic = User.GetMagic(Spell.TwinDrakeBlade); if (magic != null && magic.BaseCost + magic.LevelCost * magic.Level <= User.MP) Spell = Spell.TwinDrakeBlade; } if (GameScene.FlamingSword) { if (TargetObject != null) { magic = User.GetMagic(Spell.FlamingSword); if (magic != null) Spell = Spell.FlamingSword; } } Network.Enqueue(new C.Attack { Direction = Direction, Spell = Spell }); if (Spell == Spell.Slaying) GameScene.Slaying = false; if (Spell == Spell.TwinDrakeBlade) GameScene.TwinDrakeBlade = false; if (Spell == Spell.FlamingSword) GameScene.FlamingSword = false; magic = User.GetMagic(Spell); if (magic != null) SpellLevel = magic.Level; GameScene.AttackTime = CMain.Time + User.AttackSpeed; MapControl.NextAction = CMain.Time + 2500; break; case MirAction.Attack2: //Network.Enqueue(new C.Attack2 { Direction = Direction }); break; case MirAction.Attack3: //Network.Enqueue(new C.Attack3 { Direction = Direction }); break; case MirAction.Spell: Spell = (Spell) action.Params[0]; uint targetID = (uint) action.Params[1]; Point location = (Point) action.Params[2]; Network.Enqueue(new C.Magic {Spell = Spell, Direction = Direction, TargetID = targetID, Location = location}); GameScene.SpellTime = Spell == Spell.FlameField ? CMain.Time + 2500 : CMain.Time + 1800; MapControl.NextAction = CMain.Time + 2500; break; case MirAction.Harvest: Network.Enqueue(new C.Harvest {Direction = Direction}); MapControl.NextAction = CMain.Time + 2500; break; } } switch (CurrentAction) { case MirAction.Pushed: FrameIndex = Frame.Count - 1; EffectFrameIndex = Frame.EffectCount - 1; GameScene.Scene.Redraw(); break; case MirAction.DashL: FrameIndex = 0; EffectFrameIndex = 0; GameScene.Scene.Redraw(); break; case MirAction.DashR: FrameIndex = 3; EffectFrameIndex = 3; GameScene.Scene.Redraw(); break; case MirAction.Walking: case MirAction.Running: GameScene.Scene.Redraw(); break; case MirAction.Attack1: if (this != User) { Spell = (Spell)action.Params[0]; SpellLevel = (byte)action.Params[1]; } switch (Spell) { case Spell.Slaying: SoundManager.PlaySound(20000 + (ushort) Spell*10 + (Gender == MirGender.Male ? 0 : 1)); break; case Spell.DoubleSlash: FrameInterval = FrameInterval*5/10; //50% Faster Animation EffectFrameInterval = EffectFrameInterval * 5 / 10; action = new QueuedAction {Action = MirAction.Attack4, Direction = Direction, Location = CurrentLocation, Params = new List<object>()}; action.Params.Add(Spell); ActionFeed.Insert(0, action); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; case Spell.Thrusting: SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; case Spell.HalfMoon: SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; case Spell.TwinDrakeBlade: FrameInterval = FrameInterval*7/10; //70% Faster Animation EffectFrameInterval = EffectFrameInterval * 7 / 10; action = new QueuedAction {Action = MirAction.Attack4, Direction = Direction, Location = CurrentLocation, Params = new List<object>()}; action.Params.Add(Spell); ActionFeed.Insert(0, action); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; case Spell.CrossHalfMoon: SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; case Spell.FlamingSword: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); break; } break; case MirAction.Attack4: Spell = (Spell) action.Params[0]; switch (Spell) { case Spell.DoubleSlash: FrameInterval = FrameInterval * 5 / 10; //50% Animation Speed EffectFrameInterval = EffectFrameInterval * 5 / 10; SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); break; case Spell.TwinDrakeBlade: FrameInterval = FrameInterval * 8 / 10; //80% Animation Speed EffectFrameInterval = EffectFrameInterval * 8 / 10; break; } break; case MirAction.Struck: uint attackerID = (uint)action.Params[0]; StruckWeapon = -2; for (int i = 0; i < MapControl.Objects.Count; i++) { MapObject ob = MapControl.Objects[i]; if (ob.ObjectID != attackerID) continue; if (ob.Race != ObjectType.Player) break; PlayerObject player = ((PlayerObject) ob); StruckWeapon = player.Weapon; if (player.Class != MirClass.Assassin || StruckWeapon == -1) break; StruckWeapon = 1; break; } PlayStruckSound(); PlayFlinchSound(); break; case MirAction.Spell: if (this != User) { Spell = (Spell)action.Params[0]; TargetID = (uint)action.Params[1]; TargetPoint = (Point)action.Params[2]; Cast = (bool)action.Params[3]; SpellLevel = (byte)action.Params[4]; } switch (Spell) { #region FireBall case Spell.FireBall: Effects.Add(new Effect(Libraries.Magic, 0, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Healing case Spell.Healing: Effects.Add(new Effect(Libraries.Magic, 200, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Repulsion case Spell.Repulsion: Effects.Add(new Effect(Libraries.Magic, 900, 6, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region ElectricShock case Spell.ElectricShock: Effects.Add(new Effect(Libraries.Magic, 1560, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Poisoning case Spell.Poisoning: Effects.Add(new Effect(Libraries.Magic, 600, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort) Spell*10 ); break; #endregion #region GreatFireBall case Spell.GreatFireBall: Effects.Add(new Effect(Libraries.Magic, 400, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region HellFire case Spell.HellFire: Effects.Add(new Effect(Libraries.Magic, 920, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region ThunderBolt case Spell.ThunderBolt: Effects.Add(new Effect(Libraries.Magic2, 20, 3, 300, this)); break; #endregion #region SoulFireBall case Spell.SoulFireBall: SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region SummonSkeleton case Spell.SummonSkeleton: Effects.Add(new Effect(Libraries.Magic, 1500, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region Teleport case Spell.Teleport: Effects.Add(new Effect(Libraries.Magic, 1590, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Hiding case Spell.Hiding: Effects.Add(new Effect(Libraries.Magic, 1520, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region Haste case Spell.Haste: Effects.Add(new Effect(Libraries.Magic2, 2140 + (int)Direction * 10, 6, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region FireBang case Spell.FireBang: Effects.Add(new Effect(Libraries.Magic, 1650, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region FireWall case Spell.FireWall: Effects.Add(new Effect(Libraries.Magic, 1620, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region TrapHexagon case Spell.TrapHexagon: Effects.Add(new Effect(Libraries.Magic, 1380, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region EnergyRepulsor case Spell.EnergyRepulsor: Effects.Add(new Effect(Libraries.Magic2, 190, 6, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region FireBurst case Spell.FireBurst: Effects.Add(new Effect(Libraries.Magic2, 2320, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region FlameDisruptor case Spell.FlameDisruptor: Effects.Add(new Effect(Libraries.Magic2, 130, 6, Frame.Count * FrameInterval, this)); break; #endregion #region SummonShinsu case Spell.SummonShinsu: Effects.Add(new Effect(Libraries.Magic2, 0, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region UltimateEnchancer case Spell.UltimateEnhancer: Effects.Add(new Effect(Libraries.Magic2, 160, 15, 1000, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region FrostCrunch case Spell.FrostCrunch: Effects.Add(new Effect(Libraries.Magic2, 400, 6, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region Purification case Spell.Purification: Effects.Add(new Effect(Libraries.Magic2, 600, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region FlameField case Spell.FlameField: MapControl.Effects.Add(new Effect(Libraries.Magic2, 910, 20, 1800, CurrentLocation)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region HeavenlySword case Spell.HeavenlySword: Effects.Add(new Effect(Libraries.Magic2, 2230 + ((int)Direction * 10), 8, 800, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Trap case Spell.Trap: Effects.Add(new Effect(Libraries.Magic2, 2230 + ((int)Direction * 10), 6, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region MoonLight case Spell.MoonLight: Effects.Add(new Effect(Libraries.Magic2, 2380, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region SwiftFeet case Spell.SwiftFeet: Effects.Add(new Effect(Libraries.Magic2, 2230, 15, 1000, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region LightBody case Spell.LightBody: Effects.Add(new Effect(Libraries.Magic2, 2470, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region PoisonSword case Spell.PoisonSword: Effects.Add(new Effect(Libraries.Magic2, 2490 + ((int)Direction * 10), 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region ThunderStorm case Spell.ThunderStorm: MapControl.Effects.Add(new Effect(Libraries.Magic, 1680, 10, Frame.Count * FrameInterval, CurrentLocation)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region MassHealing case Spell.MassHealing: Effects.Add(new Effect(Libraries.Magic, 1790, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region IceStorm case Spell.IceStorm: Effects.Add(new Effect(Libraries.Magic, 3840, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region MagicShield case Spell.MagicShield: Effects.Add(new Effect(Libraries.Magic, 3880, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region TurnUndead case Spell.TurnUndead: Effects.Add(new Effect(Libraries.Magic, 3920, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region Revelation case Spell.Revelation: Effects.Add(new Effect(Libraries.Magic, 3960, 20, 1200, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region ProtectionField case Spell.ProtectionField: Effects.Add(new Effect(Libraries.Magic2, 1520, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region Rage case Spell.Rage: Effects.Add(new Effect(Libraries.Magic2, 1510, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region Vampirism case Spell.Vampirism: Effects.Add(new Effect(Libraries.Magic2, 1040, 7, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region LionRoar case Spell.LionRoar: Effects.Add(new Effect(Libraries.Magic2, 710, 20, 1200, this)); SoundManager.PlaySound(20000 + (ushort) Spell*10 + (Gender == MirGender.Male ? 0 : 1)); break; #endregion #region Entrapment case Spell.Entrapment: Effects.Add(new Effect(Libraries.Magic2, 990, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region BladeAvalanche case Spell.BladeAvalanche: Effects.Add(new Effect(Libraries.Magic2, 740 + (int)Direction * 20, 15, 15 * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Mirroring case Spell.Mirroring: Effects.Add(new Effect(Libraries.Magic2, 650, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Blizzard case Spell.Blizzard: Effects.Add(new Effect(Libraries.Magic2, 1540, 8, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region MeteorStrike case Spell.MeteorStrike: Effects.Add(new Effect(Libraries.Magic2, 1590, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion } break; case MirAction.Dead: GameScene.Scene.Redraw(); GameScene.Scene.MapControl.SortObject(this); if (MouseObject == this) MouseObject = null; if (TargetObject == this) TargetObject = null; if (MagicObject == this) MagicObject = null; DeadTime = CMain.Time; break; } } GameScene.Scene.MapControl.TextureValid = false; NextMotion = CMain.Time + FrameInterval; NextMotion2 = CMain.Time + EffectFrameInterval; if (!MagicShield) return; switch (CurrentAction) { case MirAction.Struck: if (ShieldEffect != null) { ShieldEffect.Clear(); ShieldEffect.Remove(); } Effects.Add(ShieldEffect = new Effect(Libraries.Magic, 3900, 3, 600, this)); ShieldEffect.Complete += (o, e) => Effects.Add(ShieldEffect = new Effect(Libraries.Magic, 3890, 3, 600, this) { Repeat = true }); break; default: if (ShieldEffect == null) Effects.Add(ShieldEffect = new Effect(Libraries.Magic, 3890, 3, 600, this) { Repeat = true }); break; } }
private void ObjectRangeAttack(S.ObjectRangeAttack p) { if (p.ObjectID == User.ObjectID) return; for (int i = MapControl.Objects.Count - 1; i >= 0; i--) { MapObject ob = MapControl.Objects[i]; if (ob.ObjectID != p.ObjectID) continue; QueuedAction action = null; if (ob.Race == ObjectType.Player) { switch (p.Type) { default: { action = new QueuedAction { Action = MirAction.AttackRange1, Direction = p.Direction, Location = p.Location, Params = new List<object>() }; break; } } } else { switch (p.Type) { case 1: { action = new QueuedAction { Action = MirAction.AttackRange2, Direction = p.Direction, Location = p.Location, Params = new List<object>() }; break; } default: { action = new QueuedAction { Action = MirAction.AttackRange1, Direction = p.Direction, Location = p.Location, Params = new List<object>() }; break; } } } action.Params.Add(p.TargetID); action.Params.Add(p.Target); action.Params.Add(p.Spell); ob.ActionFeed.Add(action); return; } }
private void ObjectMagic(S.ObjectMagic p) { if (p.SelfBroadcast == false && p.ObjectID == User.ObjectID) return; for (int i = MapControl.Objects.Count - 1; i >= 0; i--) { MapObject ob = MapControl.Objects[i]; if (ob.ObjectID != p.ObjectID) continue; QueuedAction action = new QueuedAction { Action = MirAction.Spell, Direction = p.Direction, Location = p.Location, Params = new List<object>() }; action.Params.Add(p.Spell); action.Params.Add(p.TargetID); action.Params.Add(p.Target); action.Params.Add(p.Cast); action.Params.Add(p.Level); ob.ActionFeed.Add(action); return; } }
private void ObjectStruck(S.ObjectStruck p) { if (p.ObjectID == User.ObjectID) return; for (int i = MapControl.Objects.Count - 1; i >= 0; i--) { MapObject ob = MapControl.Objects[i]; if (ob.ObjectID != p.ObjectID) continue; if (ob.SkipFrames) return; //if (ob.CurrentAction == MirAction.Struck) return; if (ob.ActionFeed.Count > 0 && ob.ActionFeed[ob.ActionFeed.Count - 1].Action == MirAction.Struck) return; if (ob.Race == ObjectType.Player) ((PlayerObject)ob).BlizzardStopTime = 0; QueuedAction action = new QueuedAction { Action = MirAction.Struck, Direction = p.Direction, Location = p.Location, Params = new List<object>() }; action.Params.Add(p.AttackerID); ob.ActionFeed.Add(action); if (ob.Buffs.Any(a => a == BuffType.EnergyShield)) { for (int j = 0; j < ob.Effects.Count; j++) { BuffEffect effect = null; effect = ob.Effects[j] as BuffEffect; if (effect != null && effect.BuffType == BuffType.EnergyShield) { effect.Clear(); effect.Remove(); ob.Effects.Add(effect = new BuffEffect(Libraries.Magic2, 1890, 6, 600, ob, true, BuffType.EnergyShield) { Repeat = false }); SoundManager.PlaySound(20000 + (ushort)Spell.EnergyShield * 10 + 1); effect.Complete += (o, e) => { ob.Effects.Add(new BuffEffect(Libraries.Magic2, 1900, 2, 800, ob, true, BuffType.EnergyShield) { Repeat = true }); }; break; } } } return; } }
private void ObjectStruck(S.ObjectStruck p) { if (p.ObjectID == User.ObjectID) return; for (int i = MapControl.Objects.Count - 1; i >= 0; i--) { MapObject ob = MapControl.Objects[i]; if (ob.ObjectID != p.ObjectID) continue; if (ob.SkipFrames) return; //if (ob.CurrentAction == MirAction.Struck) return; if (ob.ActionFeed.Count > 0 && ob.ActionFeed[ob.ActionFeed.Count - 1].Action == MirAction.Struck) return; if (ob.Race == ObjectType.Player) ((PlayerObject)ob).BlizzardFreezeTime = 0; QueuedAction action = new QueuedAction { Action = MirAction.Struck, Direction = p.Direction, Location = p.Location, Params = new List<object>() }; action.Params.Add(p.AttackerID); ob.ActionFeed.Add(action); return; } }
public override void SetAction() { if (QueuedAction != null ) { if ((ActionFeed.Count == 0) || (ActionFeed.Count == 1 && NextAction.Action == MirAction.Stance)) { ActionFeed.Clear(); ActionFeed.Add(QueuedAction); QueuedAction = null; } } base.SetAction(); }
public override void ProcessFrames() { bool clear = CMain.Time >= NextMotion; base.ProcessFrames(); if (clear) QueuedAction = null; if ((CurrentAction == MirAction.Standing || CurrentAction == MirAction.MountStanding || CurrentAction == MirAction.Stance || CurrentAction == MirAction.Stance2 || CurrentAction == MirAction.DashFail) && (QueuedAction != null || NextAction != null)) SetAction(); }
private void ObjectAttack(S.ObjectAttack p) { if (p.ObjectID == User.ObjectID) return; QueuedAction action = null; for (int i = MapControl.Objects.Count - 1; i >= 0; i--) { MapObject ob = MapControl.Objects[i]; if (ob.ObjectID != p.ObjectID) continue; if (ob.Race == ObjectType.Player) { action = new QueuedAction { Action = MirAction.Attack1, Direction = p.Direction, Location = p.Location, Params = new List<object>() }; //FAR Close up attack } else { switch (p.Type) { default: { action = new QueuedAction { Action = MirAction.Attack1, Direction = p.Direction, Location = p.Location, Params = new List<object>() }; break; } case 1: { action = new QueuedAction { Action = MirAction.Attack2, Direction = p.Direction, Location = p.Location, Params = new List<object>() }; break; } case 2: { action = new QueuedAction { Action = MirAction.Attack3, Direction = p.Direction, Location = p.Location, Params = new List<object>() }; break; } case 3: { action = new QueuedAction { Action = MirAction.Attack4, Direction = p.Direction, Location = p.Location, Params = new List<object>() }; break; } } } action.Params.Add(p.Spell); action.Params.Add(p.Level); ob.ActionFeed.Add(action); return; } }
private void ObjectRangeAttack(S.ObjectRangeAttack p) { if (p.ObjectID == User.ObjectID) return; for (int i = MapControl.Objects.Count - 1; i >= 0; i--) { MapObject ob = MapControl.Objects[i]; if (ob.ObjectID != p.ObjectID) continue; QueuedAction action = new QueuedAction { Action = MirAction.AttackRange, Direction = p.Direction, Location = p.Location, Params = new List<object>() }; action.Params.Add(p.TargetID); ob.ActionFeed.Add(action); return; } }
public virtual void SetAction() { if (QueuedAction != null) { if ((ActionFeed.Count == 0) || (ActionFeed.Count == 1 && NextAction.Action == MirAction.Stance)) { ActionFeed.Clear(); ActionFeed.Add(QueuedAction); QueuedAction = null; } } if (Observer == this && CMain.Time < MapControl.NextAction)// && CanSetAction) { //NextMagic = null; return; } if (ActionFeed.Count == 0) { CurrentAction = MirAction.Standing; Frames.Frames.TryGetValue(CurrentAction, out Frame); FrameIndex = 0; EffectFrameIndex = 0; if (MapLocation != CurrentLocation) { GameScene.Scene.MapControl.RemoveObject(this); MapLocation = CurrentLocation; GameScene.Scene.MapControl.AddObject(this); } if (Frame == null) { return; } FrameInterval = Frame.Interval; EffectFrameInterval = Frame.EffectInterval; SetLibraries(); } else { QueuedAction action = ActionFeed[0]; ActionFeed.RemoveAt(0); CurrentAction = action.Action; CurrentLocation = action.Location; MirDirection olddirection = Direction; Direction = action.Direction; Point temp; switch (CurrentAction) { case MirAction.ObserveMove: var steps = 3; temp = Functions.PointMove(CurrentLocation, Direction, -steps); break; default: temp = CurrentLocation; break; } temp = new Point(action.Location.X, temp.Y > CurrentLocation.Y ? temp.Y : CurrentLocation.Y); if (MapLocation != temp) { GameScene.Scene.MapControl.RemoveObject(this); MapLocation = temp; GameScene.Scene.MapControl.AddObject(this); } Frames.Frames.TryGetValue(CurrentAction, out Frame); SetLibraries(); FrameIndex = 0; EffectFrameIndex = 0; if (Frame == null) { return; } FrameInterval = Frame.Interval; EffectFrameInterval = Frame.EffectInterval; if (this == Observer) { switch (CurrentAction) { case MirAction.ObserveMove: Network.Enqueue(new C.ObserveMove { Direction = Direction }); GameScene.Scene.MapControl.FloorValid = false; MapControl.NextAction = CMain.Time + 1000; break; } } switch (CurrentAction) { case MirAction.ObserveMove: GameScene.Scene.Redraw(); break; } } GameScene.Scene.MapControl.TextureValid = false; NextMotion = CMain.Time + FrameInterval; NextMotion2 = CMain.Time + EffectFrameInterval; }
public void FishingUpdate(S.FishingUpdate p) { if (Fishing != p.Fishing) { MirDirection dir = Functions.DirectionFromPoint(CurrentLocation, p.FishingPoint); if (p.Fishing) { QueuedAction action = new QueuedAction { Action = MirAction.FishingCast, Direction = dir, Location = CurrentLocation }; ActionFeed.Add(action); } else { QueuedAction action = new QueuedAction { Action = MirAction.FishingReel, Direction = dir, Location = CurrentLocation }; ActionFeed.Add(action); if (p.FoundFish) GameScene.Scene.ChatDialog.ReceiveChat("Found fish!!", ChatType.Hint); } Fishing = p.Fishing; SetLibraries(); } if (!HasFishingRod) { GameScene.Scene.FishingDialog.Hide(); } FishingPoint = p.FishingPoint; FoundFish = p.FoundFish; }
public void MountUpdate(S.MountUpdate info) { MountType = info.MountType; RidingMount = info.RidingMount; QueuedAction action = new QueuedAction { Action = MirAction.Standing, Direction = Direction, Location = CurrentLocation }; ActionFeed.Insert(0, action); MountTime = CMain.Time; if (MountType < 0) GameScene.Scene.MountDialog.Hide(); SetLibraries(); SetEffects(); PlayMountSound(); }
private void Struck(S.Struck p) { LogTime = CMain.Time + Globals.LogDelay; NextRunTime = CMain.Time + 2500; User.BlizzardFreezeTime = 0; User.ClearMagic(); //if (User.CurrentAction == MirAction.Struck) return; MirDirection dir = User.Direction; Point location = User.CurrentLocation; for (int i = 0; i < User.ActionFeed.Count; i++) if (User.ActionFeed[i].Action == MirAction.Struck) return; if (User.ActionFeed.Count > 0) { dir = User.ActionFeed[User.ActionFeed.Count - 1].Direction; location = User.ActionFeed[User.ActionFeed.Count - 1].Location; } QueuedAction action = new QueuedAction { Action = MirAction.Struck, Direction = dir, Location = location, Params = new List<object>() }; action.Params.Add(p.AttackerID); User.ActionFeed.Add(action); }
private void Struck(S.Struck p) { LogTime = CMain.Time + Globals.LogDelay; NextRunTime = CMain.Time + 2500; User.BlizzardStopTime = 0; User.ClearMagic(); if (User.ReincarnationStopTime > CMain.Time) Network.Enqueue(new C.CancelReincarnation {}); //if (User.CurrentAction == MirAction.Struck) return; MirDirection dir = User.Direction; Point location = User.CurrentLocation; for (int i = 0; i < User.ActionFeed.Count; i++) if (User.ActionFeed[i].Action == MirAction.Struck) return; if (User.ActionFeed.Count > 0) { dir = User.ActionFeed[User.ActionFeed.Count - 1].Direction; location = User.ActionFeed[User.ActionFeed.Count - 1].Location; } if (User.Buffs.Any(a => a == BuffType.EnergyShield)) { for (int j = 0; j < User.Effects.Count; j++) { BuffEffect effect = null; effect = User.Effects[j] as BuffEffect; if (effect != null && effect.BuffType == BuffType.EnergyShield) { effect.Clear(); effect.Remove(); User.Effects.Add(effect = new BuffEffect(Libraries.Magic2, 1890, 6, 600, User, true, BuffType.EnergyShield) { Repeat = false }); SoundManager.PlaySound(20000 + (ushort)Spell.EnergyShield * 10 + 1); effect.Complete += (o, e) => { User.Effects.Add(new BuffEffect(Libraries.Magic2, 1900, 2, 800, User, true, BuffType.EnergyShield) { Repeat = true }); }; break; } } } QueuedAction action = new QueuedAction { Action = MirAction.Struck, Direction = dir, Location = location, Params = new List<object>() }; action.Params.Add(p.AttackerID); User.ActionFeed.Add(action); }
public virtual void FrameProcess() { if (Frames == null) { return; } switch (CurrentAction) { case MirAction.Standing: if (Main.Timer.ElapsedMilliseconds >= NextMotion) { if (ActionList.Count >= 2) { Frame++; } NextMotion += CurrentFrame.Interval; CanDoAction = true; if (++Frame >= CurrentFrame.Count) { Frame = 0; } } break; case MirAction.Walking: if (Main.CanMove) { if (this == MapObject.User) { if ((User.CurrentBagWeight > User.MaxBagWeight || User.CurrentBodyWeight > User.MaxBodyWeight) && OverWeightRun) { OverWeightRun = false; return; } else { OverWeightRun = true; } if (Frame == 1 || Frame == 4) { PlayStepSound(); } if (Frame == CurrentFrame.Count - 1 && Main.NextMoveTime > Main.Time) { break; } } if (ActionList.Count >= 2) { Frame++; } if (++Frame >= CurrentFrame.Count) { if (FreezeFrame) { Frame--; CanDoAction = true; FreezeFrame = false; } else { DoAction(MirAction.Standing); } } } break; case MirAction.Running: if (Main.CanMove) { if (this == MapObject.User) { if ((User.CurrentBagWeight > User.MaxBagWeight || User.CurrentBodyWeight > User.MaxBodyWeight) && OverWeightRun) { OverWeightRun = false; return; } else { OverWeightRun = true; } if (Frame == 1 || Frame == 4) { PlayStepSound(); } if (Frame == CurrentFrame.Count - 1 && Main.NextMoveTime > Main.Time) { break; } } if (ActionList.Count >= 2) { Frame++; } if (++Frame >= CurrentFrame.Count) { if (FreezeFrame) { Frame--; CanDoAction = true; FreezeFrame = false; } else { DoAction(MirAction.Standing); } } } break; case MirAction.Stance: if (Main.Timer.ElapsedMilliseconds >= NextMotion) { if (ActionList.Count >= 2) { Frame++; } NextMotion += CurrentFrame.Interval; CanDoAction = true; if (++Frame >= CurrentFrame.Count) { DoAction(MirAction.Standing); } } break; case MirAction.Attack1: case MirAction.Attack2: case MirAction.Attack3: if (Main.Timer.ElapsedMilliseconds >= NextMotion) { if (Frame == 1) { PlayAttackSound(); } if (ActionList.Count >= 2) { Frame++; } NextMotion += CurrentFrame.Interval; if (++Frame >= CurrentFrame.Count) { DoAction(MirAction.Stance); CanDoAction = true; } } break; case MirAction.Harvest: if (Main.Timer.ElapsedMilliseconds >= NextMotion) { if (ActionList.Count >= 2) { Frame++; } NextMotion += CurrentFrame.Interval; if (++Frame >= CurrentFrame.Count) { DoAction(MirAction.Standing); CanDoAction = true; } } break; case MirAction.Struck: if (Main.Timer.ElapsedMilliseconds >= NextMotion) { if (Frame == 0) { if (this == MapObject.User) { Main.AllowRun = false; Main.StruckRunTime = Main.Time + 2000; } MapObject Temp = MapLayer.ObjectList.FirstOrDefault(O => O.ObjectID == AttackerID); PlayStruckSound(Temp == null ? -1 : Temp.WeaponShape); } if (Frame == 1) { PlayFlinchSound(); } NextMotion += CurrentFrame.Interval; if (++Frame >= CurrentFrame.Count) { DoAction(MirAction.Stance); CanDoAction = true; } } break; case MirAction.Die: if (this == MapObject.User) { Main.AllowRun = false; } if (Main.Timer.ElapsedMilliseconds >= NextMotion) { if (Frame == 0) { PlayDieSound(); } NextMotion += CurrentFrame.Interval; if (++Frame >= CurrentFrame.Count) { DoAction(MirAction.Dead); } } break; case MirAction.Dead: //no idea break; case MirAction.Skeleton: break; } if (Dead && ActionList.Count > 0) { QueuedAction Q = ActionList.Dequeue(); if (Q.Action == MirAction.Skeleton) { DoAction(Q.Action); } } if (CanDoAction && (ActionList.Count > 0 || Struck)) { if (Struck) { DoAction(MirAction.Struck); Struck = false; } else if ((ActionList.Peek().Action != MirAction.Walking && ActionList.Peek().Action != MirAction.Running) || Main.CanMove) { QueuedAction Q = ActionList.Dequeue(); if (Q.Action == MirAction.Walking || Q.Action == MirAction.Running) { Direction = Functions.DirectionFromPoint(Location, Q.Location); if (Location != Q.Location) { DoAction(Q.Action); Location = Functions.PointMove(Location, Direction, Q.Action == MirAction.Walking ? 1 : 2); } } else { if (Q.Action != MirAction.Die && Q.Action != MirAction.Dead && Q.Action != MirAction.Skeleton) { Direction = Q.Direction; } DoAction(Q.Action); } } } ImageIndex = CurrentFrame.Start + (CurrentFrame.OffSet * (byte)Direction) + Frame + BaseIndex; }