/// <summary> /// Kills an entity. /// </summary> /// <param name="attacker">The attacker.</param> /// <param name="attacked">The attacked.</param> public static void Kill(Entities.IEntity attacker, Entities.IEntity attacked, uint damage = 0) { attacked.HP = 0; attacked.Alive = false; if (attacked is Entities.Monster) { (attacked as Entities.Monster).Kill(attacker, damage); if (attacker is Entities.GameClient) { if ((attacker as Entities.GameClient).Battle != null) { (attacker as Entities.GameClient).Battle.KillMob((attacker as Entities.GameClient), attacked.EntityUID); } } } using (var killpacket = new Packets.InteractionPacket()) { killpacket.Action = Enums.InteractAction.Kill; killpacket.TargetUID = attacked.EntityUID; killpacket.X = attacked.X; killpacket.Y = attacked.Y; killpacket.Data = 1; if (attacker != null) { killpacket.EntityUID = attacker.EntityUID; attacker.Screen.UpdateScreen(killpacket); if (attacker is Entities.GameClient) { (attacker as Entities.GameClient).Send(killpacket); } } else { killpacket.EntityUID = 0; attacked.Screen.UpdateScreen(killpacket); if (attacked is Entities.GameClient) { (attacked as Entities.GameClient).Send(killpacket); } } } if (attacked is Entities.GameClient) { Entities.GameClient attackedclient = attacked as Entities.GameClient; attackedclient.RemoveFlag1(Enums.Effect1.Fly); attackedclient.RemoveFlag1(Enums.Effect1.Invisible); if (attacker != null) { if (attacked.EntityUID != attacker.EntityUID) { if (attacker is Entities.GameClient) { if ((attacker as Entities.GameClient).Battle != null) { if (!(attacker as Entities.GameClient).Battle.HandleDeath((attacker as Entities.GameClient), attackedclient)) { return; } } else if (attacked.Map.GotKillCons()) { Entities.GameClient attackerclient = attacker as Entities.GameClient; if (attackedclient.Guild != null && attackerclient.Guild != null) { if (attackerclient.Guild.IsEnemy(attackedclient.Guild.Name)) { attackerclient.PKPoints += 3; } else { attackerclient.PKPoints += 10; } } else { attackerclient.PKPoints += 10; } } } } } attackedclient.AttackPacket = null; attackedclient.ReviveTime = DateTime.Now.AddSeconds(20); attackedclient.AddStatusEffect1(Enums.Effect1.Dead); attackedclient.AddStatusEffect1(Enums.Effect1.Ghost); attackedclient.RemoveFlag1(Enums.Effect1.BlueName); attackedclient.Stamina = 0; attackedclient.Transformation = Calculations.BasicCalculations.GetGhostTransform(attackedclient.Model); } if (attacked is Entities.BossCreature) { Entities.BossCreature creature = attacked as Entities.BossCreature; creature.Abort(); } else if (attacked is Entities.BossMonster) { Entities.BossMonster boss = attacked as Entities.BossMonster; boss.AbortBoss(false); if (attacker is Entities.GameClient) { boss.ON_DEATH(attacker as Entities.GameClient); } } }
public void Use(Entities.BossMonster boss, Entities.GameClient[] Targets) { if (Targets.Length == 0 && !SpreadSkill || MaxTargets == 0 && !SpreadSkill) { return; } if (DateTime.Now < CoolDownTime) { return; } CoolDownTime = DateTime.Now.AddSeconds(CoolDown); if (MapSkill != null) { MapSkill.ExecuteStart(boss.X, boss.Y); } AreaSkill area = new AreaSkill(); area.boss = boss; area.skill = this; #region Shake, Dark, Zoom if (Shake || Dark || Zoom) { using (var effect = new Packets.MapEffectPacket()) { effect.Shake = Shake; effect.Darkness = Dark; effect.Zoom = Zoom; effect.AppendFlags(); foreach (Entities.GameClient target in Targets) { effect.X = target.X; effect.Y = target.Y; target.Send(effect); } } } #endregion if (MaxTargets == 1) { Array.Resize(ref Targets, 1); } else if (MaxTargets > 0 && Targets.Length > MaxTargets) { Array.Resize(ref Targets, MaxTargets); } #region Explode // TODO: Explosion effect .. if (Explode) { if (PlayerExplode) { using (var str = new Packets.StringPacket(new Packets.StringPacker(MapEffect))) { str.Action = Enums.StringAction.MapEffect; foreach (Entities.GameClient target in Targets) { str.PositionX = target.X; str.PositionY = target.Y; target.SendToScreen(str, true, false); } } } else if (BossExplode) { using (var str = new Packets.StringPacket(new Packets.StringPacker(MapEffect))) { str.Action = Enums.StringAction.MapEffect; str.PositionX = boss.X; str.PositionY = boss.Y; foreach (Entities.GameClient target in Targets) { target.Send(str); } } } else { using (var str = new Packets.StringPacket(new Packets.StringPacker(MapEffect))) { str.Action = Enums.StringAction.MapEffect; str.PositionX = ExplodePos[0]; str.PositionY = ExplodePos[1]; foreach (Entities.GameClient target in Targets) { target.Send(str); } } } } #endregion #region Creatures if (SummonCreatures) { int SpawnSize = (FixCreatureSize ? Targets.Length : (Targets.Length * 2)); if (MaxCreatures != -1) { if (SpawnSize > MaxCreatures) { SpawnSize = MaxCreatures; } } int count = 0; for (int i = 0; i < SpawnSize; i++) { Entities.BossCreature creature = (Entities.BossCreature)Creature.Copy(); if (!FixTargets) { Maps.MapPoint Location = boss.Map.CreateAvailableLocation <Entities.BossCreature>(boss.X, boss.Y, 9); creature.SetData(boss, null); creature.Teleport(Location); } else { try { Entities.GameClient Target = Targets[count]; if (!Target.Alive) { continue; } creature.SetData(boss, Target); Maps.MapPoint Location = boss.Map.CreateAvailableLocation <Entities.BossCreature>(Target.X, Target.Y, 9); creature.Teleport(Location); Entities.BossCreature creature2 = (Entities.BossCreature)Creature.Copy(); creature2.SetData(boss, Target); Location = boss.Map.CreateAvailableLocation <Entities.BossCreature>(Target.X, Target.Y, 9); creature2.Teleport(Location); i++; count++; } catch { } } } } #endregion #region MapEffect if (!string.IsNullOrWhiteSpace(MapEffect)) { using (var str = new Packets.StringPacket(new Packets.StringPacker(MapEffect))) { str.Action = Enums.StringAction.MapEffect; str.PositionX = boss.X; str.PositionY = boss.Y; foreach (Entities.GameClient target in Targets) { if (ShowEffectAtPlayers) { str.PositionX = target.X; str.PositionY = target.Y; } target.SendToScreen(str, true, false); } } } #endregion if (!SpreadSkill) { #region SkillAnimation + Power if (RealSkill != -1) { var usespell = new Packets.UseSpellPacket(); usespell.EntityUID = boss.EntityUID; usespell.SpellID = (ushort)RealSkill; usespell.SpellX = boss.X; usespell.SpellY = boss.Y; usespell.SpellLevel = RealSkilllevel; foreach (Entities.GameClient target in Targets) { if (!target.Alive) { continue; } if (PercentTageEffect != -1) { int damage = ((target.HP / 100) * PercentTageEffect); if (damage <= 0) { damage = 1; } usespell.AddTarget(target.EntityUID, (uint)damage); target.HP -= damage; if (target.HP <= 0) { Packets.Interaction.Battle.Combat.Kill(boss, target, (uint)damage); } } else if (DamageEffect > 0) { int damage = ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next(DamageEffect / 2, DamageEffect); usespell.AddTarget(target.EntityUID, (uint)damage); target.HP -= damage; if (target.HP <= 0) { Packets.Interaction.Battle.Combat.Kill(boss, target, (uint)damage); } } else { usespell.AddTarget(target.EntityUID, 0); } } boss.Screen.UpdateScreen(usespell); } else { foreach (Entities.GameClient target in Targets) { if (!target.Alive) { continue; } using (var interact = new Packets.InteractionPacket()) { interact.Action = Enums.InteractAction.Attack; interact.EntityUID = boss.EntityUID; interact.TargetUID = target.EntityUID; interact.UnPacked = true; interact.X = target.X; interact.Y = target.Y; if (PercentTageEffect != -1) { int damage = (target.HP / PercentTageEffect); interact.Data = (uint)damage; target.HP -= damage; if (target.HP <= 0) { Packets.Interaction.Battle.Combat.Kill(boss, target, (uint)damage); } } else if (DamageEffect > 0) { int damage = ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next(DamageEffect / 2, DamageEffect); interact.Data = (uint)damage; target.HP -= damage; if (target.HP <= 0) { Packets.Interaction.Battle.Combat.Kill(boss, target, (uint)damage); } } else { interact.Data = 0; } boss.Screen.UpdateScreen(interact); } } } #endregion #region Freeze if (Freeze) { foreach (Entities.GameClient target in Targets) { if (!target.Alive) { continue; } target.AddStatusEffect1(Enums.Effect1.IceBlock, FreezeTime); } } #endregion #region Paralyze if (Paralyzed) { foreach (Entities.GameClient target in Targets) { if (!target.Alive) { continue; } target.ParalyzeClient(ParalyzeTime); } } #endregion } #region SpreadEffect if (!string.IsNullOrWhiteSpace(SpreadEffect)) { for (int i = 0; i < EffectPos.Length; i++) { using (var str = new Packets.StringPacket(new Packets.StringPacker(SpreadEffect))) { str.Action = Enums.StringAction.MapEffect; str.PositionX = EffectPos[i][0]; str.PositionY = EffectPos[i][1]; foreach (Entities.GameClient target in Targets) { target.Send(str); } } } } #endregion #region SpreadSkill if (SpreadSkill) { for (int i = 0; i < SkillPos.Length; i++) { Core.PortalPoint p = new Core.PortalPoint(boss.Map.MapID, SkillPos[i][0], SkillPos[i][1]); AreaSkills.TryAdd(p, area); uint TaskID = 0; TaskID = ProjectX_V3_Lib.Threading.DelayedTask.StartDelayedTask(() => { Core.PortalPoint p2 = new Core.PortalPoint(boss.Map.MapID, SkillPos[i][0], SkillPos[i][1]); AreaSkill rArea; AreaSkills.TryRemove(p2, out rArea); }, SkillShowTime, 0); } } #endregion }
public void RemoveBoss(Entities.BossMonster mob) { Entities.BossMonster rBoss; SpawnedBosses.TryRemove(mob.EntityUID, out rBoss); }
public void Use2(Entities.BossMonster boss, Entities.GameClient target) { if (!target.Alive) { return; } #region SkillAnimation + Power if (RealSkill != -1) { var usespell = new Packets.UseSpellPacket(); usespell.EntityUID = boss.EntityUID; usespell.SpellID = (ushort)RealSkill; usespell.SpellX = boss.X; usespell.SpellY = boss.Y; usespell.SpellLevel = RealSkilllevel; if (PercentTageEffect != -1) { int damage = (target.HP / PercentTageEffect); usespell.AddTarget(target.EntityUID, (uint)damage); target.HP -= damage; if (target.HP <= 0) { Packets.Interaction.Battle.Combat.Kill(boss, target, (uint)damage); } } else if (DamageEffect > 0) { int damage = ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next(DamageEffect / 2, DamageEffect); usespell.AddTarget(target.EntityUID, (uint)damage); target.HP -= damage; if (target.HP <= 0) { Packets.Interaction.Battle.Combat.Kill(boss, target, (uint)damage); } } else { usespell.AddTarget(target.EntityUID, 0); } boss.Screen.UpdateScreen(usespell); } else { using (var interact = new Packets.InteractionPacket()) { interact.Action = Enums.InteractAction.Attack; interact.EntityUID = boss.EntityUID; interact.TargetUID = target.EntityUID; interact.UnPacked = true; interact.X = target.X; interact.Y = target.Y; if (PercentTageEffect != -1) { int damage = (target.HP / PercentTageEffect); interact.Data = (uint)damage; target.HP -= damage; if (target.HP <= 0) { Packets.Interaction.Battle.Combat.Kill(boss, target, (uint)damage); } } else if (DamageEffect > 0) { int damage = ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next(DamageEffect / 2, DamageEffect); interact.Data = (uint)damage; target.HP -= damage; if (target.HP <= 0) { Packets.Interaction.Battle.Combat.Kill(boss, target, (uint)damage); } } else { interact.Data = 0; } boss.Screen.UpdateScreen(interact); } } #endregion #region Freeze if (Freeze) { target.AddStatusEffect1(Enums.Effect1.IceBlock, FreezeTime); } #endregion #region Paralyze if (Paralyzed) { target.ParalyzeClient(ParalyzeTime); } #endregion }