public static bool CanAttack
#region Clone Section if (attacker.MyClones != null) { if (attacker.MyClones.ContainsKey(attacked.UID)) { // attacker.Owner.Send(new Message("u Can't Kill Your Shadow Clone", System.Drawing.Color.Red, Message.TopLeft)); return false; } } #endregion
#region ShadowClone case 12090: { if (attacker.Owner.Map.ID == 6565 || attacker.Owner.Map.ID == 5555 || attacker.Owner.Map.ID == 2014) { Kernel.SendWorldMessage(new Message("Mr: " + attacker.Name + " You Can`t Use ThisSpell Here !!!", System.Drawing.Color.Red, Message.Talk), Program.Values); return; } attacker.AttackPacket = null; if (attacker.MyClones.Count > 0) { var clones = attacker.MyClones.Values.ToArray(); for (int i = 0; i < clones.Length; i++) { var item = clones[i]; if (item == null) continue; Data data = new Data(true); data.UID = item.UID; attacker.Stamina -= spell.UseStamina; data.ID = Network.GamePackets.Data.RemoveEntity; attacker.Owner.SendScreen(data); attacker.MyClones[item.UID] = null; } attacker.MyClones.Clear(); } else { if (CanUseSpell(spell, attacker.Owner)) { PrepareSpell(spell, attacker.Owner); SpellUse spellUse = new SpellUse(true); spellUse.Attacker = attacker.UID; spellUse.SpellID = spell.ID; spellUse.SpellLevel = spell.Level; spellUse.X = X; spellUse.Y = Y; attacker.AddClone(3); if (spell.Level >= 4) attacker.AddClone(10003); foreach (var item in attacker.MyClones.Values) spellUse.AddTarget(item, 0, attack); attacker.Owner.SendScreen(spellUse, true); } } break; } #endregion
private void ShutDown()
if (Entity.MyClones.Count > 0) { foreach (var item in Entity.MyClones.Values) { Data data = new Data(true); data.UID = item.UID; data.ID = Network.GamePackets.Data.RemoveEntity; item.MonsterInfo.SendScreen(data); } Entity.MyClones.Clear(); }
public void AddClone(ushort cloneid) { #region SpawnPacket(10014) var Entity = new Entity(EntityFlag.Entity, true); Entity.MonsterInfo = new MonsterInformation(); MonsterInformation.MonsterInformations.TryGetValue(9003, out Entity.MonsterInfo); Entity.Owner = Owner; Entity.MonsterInfo.Owner = Entity; Entity.IsClone = true; Entity._Name = "ShadowClone"; Entity.clan = Name; Entity.SpawnPacket = new byte[8 + _Names + _Name.Length + 36]; Array.Copy(SpawnPacket, Entity.SpawnPacket, Entity.SpawnPacket.Length); WriteStringList(new List<string>() { "ShadowClone", "", "", Name, "" }, _Names, Entity.SpawnPacket); Entity.Mesh = Mesh; Entity.Hitpoints = 1; Entity.UID = Owner.Map.CloneCounter.Next; Entity.GuildID = Entity.GuildRank = Entity.Action = 0; Entity.CountryID = Enums.CountryID.Default; Entity.StatusFlag = Entity.StatusFlag2 = Entity.StatusFlag3 = Entity.StatusFlag4 = 0; Writer.Write((uint)0, Game.ConquerStructures.Equipment.Steed, Entity.SpawnPacket); Writer.Write((uint)0, Game.ConquerStructures.Equipment.SteedPlus, Entity.SpawnPacket); Writer.Write((uint)0, Game.ConquerStructures.Equipment.SteedColor, Entity.SpawnPacket); Writer.Write((uint)0, Game.ConquerStructures.Equipment.MountArmor, Entity.SpawnPacket); Writer.Write((uint)0, Game.ConquerStructures.Equipment.Wing, Entity.SpawnPacket); Writer.Write((uint)0, Game.ConquerStructures.Equipment.WingPlus, Entity.SpawnPacket); Entity.FlowerRank = 0; Entity.NobilityRank = ConquerStructures.NobilityRank.Serf; Entity.Class = Entity.FirstRebornClass = Entity.SecondRebornClass = Entity.JiangTalent = Entity.SubClassesActive = Entity.Reborn = Entity.Level = Entity.ServerID = 0; Writer.Write((byte)2, 271, Entity.SpawnPacket); Writer.Write(cloneid, 272, Entity.SpawnPacket); Entity.OwnerUID = UID; Entity.JiangActive = false; Writer.Write((uint)0, 178, Entity.SpawnPacket); Writer.Write((uint)0, 182, Entity.SpawnPacket); Writer.Write((uint)0, 186, Entity.SpawnPacket); Writer.Write((uint)0, _UnionExploits, Entity.SpawnPacket); Writer.Write((uint)0, _UnionID, Entity.SpawnPacket); Writer.Write((uint)0, _UnionRank, Entity.SpawnPacket); Writer.Write((uint)0, _UnionType, Entity.SpawnPacket); Writer.Write((uint)0, _MyTitle, Entity.SpawnPacket); Writer.Write((uint)0, _MyTitleScore, Entity.SpawnPacket); Writer.Write((uint)0, _MyWing, Entity.SpawnPacket); Entity.MinAttack = MinAttack; Entity.MaxAttack = Entity.MagicAttack = Math.Max(MinAttack, MaxAttack); Entity.Appearance = Appearance; Entity.MapID = Owner.Map.ID; Entity.SendUpdates = true; #endregion SpawnPacket(10014) #region Pet(2035) MsgPetInfo pet = new MsgPetInfo(); pet.UID = Entity.UID; pet.PetID = cloneid; pet.PetType = 2; pet.Mesh = Mesh; pet.AttackRange = (byte)AttackRange; pet.X = X; pet.Y = Y; pet.Name = "ShadowClone"; Owner.Send(pet); #endregion Pet(2035) MyClones.Add(Entity.UID, Entity); Owner.SendScreen(Entity.SpawnPacket, true); Owner.SendScreenSpawn(Entity, true); #region Data(10010) Data data = new Data(true); data.UID = Entity.UID; data.Facing = Entity.Facing; data.ID = Data.AddEntity; data.wParam1 = Entity.X; data.wParam2 = Entity.Y; Owner.Send(data); #endregion Data(10010) }
public void Die(
if (MyClones.Count > 0) { foreach (var item in MyClones.Values) { Data data = new Data(true); data.UID = item.UID; data.ID = Network.GamePackets.Data.RemoveEntity; item.MonsterInfo.SendScreen(data); } MyClones.Clear(); }
if (Companion)
if (Owner.Entity.MyClones.ContainsKey(UID)) { Owner.Entity.MyClones.Remove(UID); return; }
foreach (GameState pClient in Kernel.GamePool.Values)
if (pClient.Entity.MyClones.Count > 0) { foreach (var clone in pClient.Entity.MyClones.Values) { if (clone == null) continue; if (Kernel.GetDistance(clone.X, clone.Y, Owner.Entity.X, Owner.Entity.Y) <= 18 && !Contains(clone.UID)) { if (!clone.Dead) clone.SendSpawn(Owner); } } }
case 2812:
#region Clone Attack case 2812: { var attackd = BitConverter.ReadUint(packet, 4); var clonecount = packet[8]; for (int i = 0; i < clonecount; i++) { var attackr = BitConverter.ReadUint(packet, 9 + (i * 4)); if (client.Entity.MyClones.Count < clonecount) return; var attack = client.Entity.AttackPacket; if (attack == null) attack = new GamePackets.Attack(true); attack.Attacker = attackr; attack.Attacked = attackd; if (client.Entity.MyClones.Count == 0) return; if (attackd == client.Entity.UID || client.Entity.MyClones.ContainsKey(attackd)) return; KhaledMohamed.Database.SpellInformation MySpell = null; try { MySpell = Database.SpellTable.GetSpell(client.Spells[12090].ID, client.Spells[12090].Level); } catch { MySpell = Database.SpellTable.GetSpell(12090, 4); } Entity Clone = null; if (client.Entity.MyClones.TryGetValue(attackr, out Clone)) { Entity attacked = null; SobNpcSpawn attackedsob = null; if (client.Screen.TryGetValue(attackd, out attacked)) { uint damage = 0; var spell = Database.SpellTable.GetSpell(attack.MagicType, (byte)attack.MagicLevel); if (spell == null) spell = Database.SpellTable.GetSpell(12080, 0); if (attack.AttackType == GamePackets.Attack.Melee) { if (Game.Attacking.Handle.CanAttack(client.Entity, attacked, spell, true)) { damage = Game.Attacking.Calculate.Melee(client.Entity, attacked, spell, ref attack); double power = (0.5); damage = (uint)((double)damage * power / 8); Game.Attacking.Handle.ReceiveAttack(Clone, attacked, attack, ref damage, spell); attack.Damage = damage; client.SendScreen(attack); } } else { if (Game.Attacking.Handle.CanAttack(client.Entity, attacked, spell, false)) { damage = Game.Attacking.Calculate.Magic(client.Entity, attacked, spell, ref attack); double power = (0.5); damage = (uint)((double)damage * power / 8); Game.Attacking.Handle.ReceiveAttack(Clone, attacked, attack, ref damage, spell); attack.Damage = damage; client.SendScreen(attack); } } SpellUse suse = new SpellUse(true); suse.Attacker = Clone.UID; suse.SpellID = spell.ID; suse.SpellLevel = spell.Level; suse.X = attacked.X; suse.Y = attacked.Y; suse.Effect1 = attack.Effect1; suse.AddTarget(attacked, damage, attack); client.SendScreen(suse, true); if (client.Account.State == KhaledMohamed.Database.AccountTable.AccountState.ProjectManager) client.Send(new Message("Clone Attack With Skill: " + spell.Name, System.Drawing.Color.CadetBlue, Message.Talk)); } else if (client.Screen.TryGetSob(attackd, out attackedsob)) { uint damage = 0; var spell = Database.SpellTable.GetSpell(attack.MagicType, (byte)attack.MagicLevel); if (spell == null) spell = Database.SpellTable.GetSpell(12080, 0); if (attack.AttackType == GamePackets.Attack.Melee) { if (Game.Attacking.Handle.CanAttack(client.Entity, attackedsob, null)) { damage = Game.Attacking.Calculate.Melee(client.Entity, attackedsob, ref attack); double power = ((MySpell.Power / 100.0) / 100.0); damage = (uint)((double)damage * power); Game.Attacking.Handle.ReceiveAttack(Clone, attackedsob, attack, damage, null); attack.Damage = damage; client.SendScreen(attack); } } else { if (Game.Attacking.Handle.CanAttack(client.Entity, attackedsob, spell)) { damage = Game.Attacking.Calculate.Magic(client.Entity, attackedsob, spell, ref attack); double power = ((MySpell.Power / 100.0) / 100.0); damage = (uint)((double)damage * power); Game.Attacking.Handle.ReceiveAttack(Clone, attackedsob, attack, damage, spell); attack.Damage = damage; client.SendScreen(attack); } } SpellUse suse = new SpellUse(true); suse.Attacker = Clone.UID; suse.SpellID = spell.ID; suse.SpellLevel = spell.Level; suse.X = attackedsob.X; suse.Y = attackedsob.Y; suse.Effect1 = attack.Effect1; suse.AddTarget(attackedsob, damage, attack); client.SendScreen(suse, true); if (client.Account.State == KhaledMohamed.Database.AccountTable.AccountState.ProjectManager) client.Send(new Message("Clone Attack With Skill: " + spell.Name, System.Drawing.Color.CadetBlue, Message.Talk)); } } } break; } #endregion
if (!client.Entity.HasMagicDefender)
if (client.Entity.MyClones.Count > 0) { foreach (var clone in client.Entity.MyClones.Values) { clone.X = client.Entity.X; clone.Y = client.Entity.Y; } }