public static void Init() { string[] filePaths = Directory.GetFiles(@"map"); foreach (var file in filePaths) { var mapn = file.Substring(file.IndexOf(Path.DirectorySeparatorChar) + 1, file.Count() - (file.IndexOf(Path.DirectorySeparatorChar) + 1)); if (mapsizes.ContainsKey(mapn)) { var tl = new TiledMap(mapn, mapsizes[mapn].X, mapsizes[mapn].Y); var input = File.ReadAllBytes(file); int cnt = mapsizes[mapn].X * mapsizes[mapn].Y; int itr = 0, res2 = 0, res1 = 0; byte[] temp = new byte[4]; while (itr != cnt) { Array.Copy(input, offset + (itr * 4), temp, 0, 4); if (itr % mapsizes[mapn].X == 0 && itr != 0) { res2++; res1 = 0; } if (temp[0] == 3 || temp[0] == 5 || (temp[0] == 2 && temp[2] == 3)) { var tempp = new MyPathNode(res1, res2); tempp.IsWall = true; tl.tiles[res1++, res2] = tempp; //0 } else { var temp2 = new MyPathNode(res1, res2); tl.tiles[res1++, res2] = temp2; //1 } itr++; } loadedmaps.Add(mapn, tl); } } }
public static void Init() { string[] filePaths = Directory.GetFiles(@"map"); foreach (var file in filePaths) { var mapn = file.Substring(file.IndexOf(Path.DirectorySeparatorChar) + 1, file.Count() - (file.IndexOf(Path.DirectorySeparatorChar) + 1)); if (mapsizes.ContainsKey(mapn)) { var tl = new TiledMap(mapn, mapsizes[mapn].X, mapsizes[mapn].Y); var input = File.ReadAllBytes(file); int cnt = mapsizes[mapn].X * mapsizes[mapn].Y; int itr = 0, res2 = 0, res1 = 0; byte[] temp = new byte[4]; while (itr != cnt) { Array.Copy(input, offset + (itr * 4), temp, 0, 4); if (itr % mapsizes[mapn].X == 0 && itr != 0) { res2++; res1 = 0; } if (temp[0] == 3 || temp[0] == 5 || (temp[0] == 2 && temp[2] == 3)) { var tempp = new MyPathNode(res1, res2); tempp.IsWall = true; tl.tiles[res1++,res2] = tempp; //0 } else { var temp2 = new MyPathNode(res1, res2); tl.tiles[res1++,res2] = temp2; //1 } itr++; } loadedmaps.Add(mapn, tl); } } }
public MyPathNode AIStep(TiledMap map, Player target) { var mobs = World.NewMonsters.Where(xe => xe.Value != this && xe.Value.Alive && xe.Value.m_Map == target.Map); foreach (var mob in mobs) map.tiles[mob.Value.m_Loc.X, mob.Value.m_Loc.Y].IsWall = true; aStar = new MySolver<MyPathNode, Object>(map.tiles); path = aStar.SearchOnce(new Point(m_Loc.X, m_Loc.Y), new Point(target.X, target.Y), null); foreach (var mob in mobs) map.tiles[mob.Value.m_Loc.X, mob.Value.m_Loc.Y].IsWall = false; MyPathNode p = new MyPathNode(m_Loc.X, m_Loc.Y); if (path != null) { p.X = path.X; p.Y = path.Y; } path = null; aStar.Dispose(); aStar = null; return p; }
public void HandleCast(int header, script.spells.Spell castspell, Player player, int target = 0, short castx = 0, short casty = 0) { if (castspell is VIEW) { var castonView = World.NewMonsters.Where(xe => xe.Value.m_Serial == target && xe.Value.m_Map != null && xe.Value.m_Map == player.m_Map).FirstOrDefault(); if (castonView.Value != null) { string info = string.Format("<몬스터정보>" + " "); string info2 = string.Format("이름:{0}", castonView.Value.Name + " "); string info3 = string.Format("체력:{0}/{1}", castonView.Value.HPCur, castonView.Value.HP + " "); string info4 = string.Format("파괴:{0}", castonView.Value.Dam + " "); string info5 = string.Format("적중:{0}", castonView.Value.Hit + " "); string info7 = string.Format("방어:{0}", castonView.Value.AC + " "); string info6 = string.Format("경험치:{0}", castonView.Value.XP + " "); client.SendPacket(new UpdateChatBox(0xff, 10, 0, (short)info.Count(), info).Compile()); client.SendPacket(new UpdateChatBox(0xff, 0xff, 1, (short)info2.Count(), info2).Compile()); client.SendPacket(new UpdateChatBox(0xff, 0xff, 1, (short)info3.Count(), info3).Compile()); client.SendPacket(new UpdateChatBox(0xff, 0xff, 1, (short)info4.Count(), info4).Compile()); client.SendPacket(new UpdateChatBox(0xff, 0xff, 1, (short)info5.Count(), info5).Compile()); client.SendPacket(new UpdateChatBox(0xff, 0xff, 1, (short)info7.Count(), info7).Compile()); client.SendPacket(new UpdateChatBox(0xff, 0xff, 1, (short)info6.Count(), info6).Compile()); return; } else { var tele = PlayerHandler.getSingleton().add.Where(xe => xe.Value != null && xe.Value != player && xe.Value.loggedIn && World.Dist2d(xe.Value.m_Loc.X, xe.Value.m_Loc.Y, player.m_Loc.X, player.m_Loc.Y) <= castspell.Range && xe.Value.Serial == (Serial)target && xe.Value.m_Map != null && xe.Value.m_Map == player.m_Map).FirstOrDefault(); if (tele.Value != null) { string info = string.Format("<유저정보>" + " "); string info2 = string.Format("이름:{0}", tele.Value.Name + " "); string info3 = string.Format("생명:{0}, 마나:{1}", tele.Value.HP, tele.Value.MP + " "); string info4 = string.Format("방어:{0} 적중:{1}", tele.Value.AC, tele.Value.Hit + " "); string info5 = string.Format("힘: {0} 지력: {1} 숙련: {2} 생명: {3}", tele.Value.m_Str, tele.Value.m_Men, tele.Value.m_Dex, tele.Value.m_Vit + " "); string info6 = string.Format("레벨: {0}", tele.Value.Level + " "); client.SendPacket(new UpdateChatBox(0xff, 10, 0, (short)info.Count(), info).Compile()); client.SendPacket(new UpdateChatBox(0xff, 0xff, 1, (short)info2.Count(), info2).Compile()); client.SendPacket(new UpdateChatBox(0xff, 0xff, 1, (short)info3.Count(), info3).Compile()); client.SendPacket(new UpdateChatBox(0xff, 0xff, 1, (short)info4.Count(), info4).Compile()); client.SendPacket(new UpdateChatBox(0xff, 0xff, 1, (short)info5.Count(), info5).Compile()); client.SendPacket(new UpdateChatBox(0xff, 0xff, 1, (short)info6.Count(), info6).Compile()); tele.Value.Loc = new Point2D(player.Loc.X, player.Loc.Y); tele.Value.Map = player.Map; return; } return; } } if (castspell is Teleport) { var teleportdist = ((castspell.Level / 2) * 2); if (teleportdist <= 3) { teleportdist = 4; } if (teleportdist > 12) { teleportdist = 12; } if (World.Dist2d(castx, casty, player.X, player.Y) <= teleportdist && player.MPCur > castspell.RealManaCost(player)) { World.SendToAll(new QueDele(player.Map, new CurveMagic(player.Serial, 1, 1, castspell.Seq).Compile())); var nmap = LKCamelot.model.Map.FullMaps.Where(xe => xe.Key == player.Map).FirstOrDefault().Value; TiledMap curmap = null; try { curmap = LKCamelot.model.Map.loadedmaps[nmap]; } catch { Console.WriteLine(string.Format("Failed to nmap at {0}", nmap)); } LKCamelot.model.MyPathNode randomtile; try { randomtile = curmap.tiles[castx, casty]; } catch { return; } if (randomtile.IsWall) { return; } player.MPCur -= castspell.RealManaCost(player); castspell.CheckLevelUp(player); player.Loc = new Point2D(castx, casty); World.SendToAll(new QueDele(player.Map, new MoveSpriteTele(player.Serial, player.Face, player.X, player.Y).Compile())); int mobile = Serial.NewMobile; World.SendToAll(new QueDele(player.Map, new CreateMagicEffect(mobile, 1, (short)player.X, (short)player.Y, new byte[] { 4, 0, 0, 0, 0, 0, 0, 0, 0, 116 }, 0).Compile())); var tmp = new QueDele(LKCamelot.Server.tickcount.ElapsedMilliseconds + 2000, player.m_Map, new DeleteObject(mobile).Compile()); tmp.tempser = mobile; World.TickQue.Add(tmp); return; } } else if (castspell is Trace && player.tempLocate != null && player.tempLocateMap != null) { player.Loc = player.tempLocate; player.Map = player.tempLocateMap; if (tempMusic != 2) { client.SendPacket(new PlayMusic(tempMusic).Compile()); } return; } else if (castspell is ComeBack) { player.tempLocate = new Point2D(player.X, player.Y); player.tempLocateMap = player.Map; player.Loc = new Point2D(98, 100); player.Map = "Village1"; if (player.musicNumber != 2) { tempMusic = player.musicNumber; } client.SendPacket(new PlayMusic(1001).Compile()); return; } else if (castspell is RECALL) { var tele = PlayerHandler.getSingleton().add.Where(xe => xe.Value != null && xe.Value != player && xe.Value.loggedIn && World.Dist2d(xe.Value.m_Loc.X, xe.Value.m_Loc.Y, player.m_Loc.X, player.m_Loc.Y) <= castspell.Range && xe.Value.Serial == (Serial)target && xe.Value.m_Map != null && xe.Value.m_Map == player.m_Map).FirstOrDefault(); if (tele.Value != null) { tele.Value.Loc = new Point2D(player.Loc.X, player.Loc.Y); tele.Value.Map = player.Map; return; } else { return; } } else if (castspell is Pickup) { var item1 = World.NewItems.Where(xe => xe.Value.m_Map != null && xe.Value.m_Map == player.Map && /*&& xe.Value.Loc.X != player.X && xe.Value.Loc.Y != player.Y*/ xe.Value.m_Serial == target) .FirstOrDefault(); if (item1.Value != null) { World.SendToAll(new QueDele(player.Map, new CurveMagic(player.Serial, 1, 1, castspell.Seq).Compile())); item1.Value.PickUp(player); string text = item1.Value.Name + " 을{를} 획득하였습니다"; World.SendToAllRange(new QueDele(player.Map, new BubbleChat(player.Serial, text).Compile()), player, 10); return; } else { return; } } else if (castspell is PlusHeal) { var tele2 = PlayerHandler.getSingleton().add.Where(xe => xe.Value != null && xe.Value != player && xe.Value.loggedIn && World.Dist2d(xe.Value.m_Loc.X, xe.Value.m_Loc.Y, player.m_Loc.X, player.m_Loc.Y) <= castspell.Range && xe.Value.Serial == (Serial)target && xe.Value.m_Map != null && xe.Value.m_Map == player.m_Map).FirstOrDefault(); if (tele2.Value != null) { int mobile = Serial.NewMobile; World.SendToAll(new QueDele(tele2.Value.Map, new CreateMagicEffect(mobile, 1, (short)tele2.Value.X, (short)tele2.Value.Y, new byte[] { 4, 0, 0, 0, 0, 0, 0, 0, 0, 2 }, 0).Compile())); var tmp = new QueDele(LKCamelot.Server.tickcount.ElapsedMilliseconds + 2000, tele2.Value.m_Map, new DeleteObject(mobile).Compile()); tmp.tempser = mobile; World.TickQue.Add(tmp); tele2.Value.HPCur = tele2.Value.HP; World.SendToAll(new QueDele(player.Map, new CurveMagic(player.Serial, 1, 1, castspell.Seq).Compile())); return; } else { return; } } else if (castspell is Transparency) { if (player.Transparancy != 0) { player.Transparancy = 0; World.SendToAll(new QueDele(player.Map, new SetObjectEffectsPlayer(player).Compile())); } else { player.Transparancy = (Byte)(castspell.Level * 20); World.SendToAll(new QueDele(player.Map, new SetObjectEffectsPlayer(player).Compile())); } return; } else if (castspell is SharpEye) { var playcaston12 = PlayerHandler.getSingleton().add.Where(xe => xe.Value != null && xe.Value.loggedIn && World.Dist2d(xe.Value.m_Loc.X, xe.Value.m_Loc.Y, player.m_Loc.X, player.m_Loc.Y) <= 15 && xe.Value.m_Map != null && xe.Value.m_Map == player.m_Map).ToList(); if (playcaston12 != null) { foreach (var mm in playcaston12) { if (mm.Value.Name != player.Name) { mm.Value.Transparancy = 0; World.SendToAll(new QueDele(mm.Value.Map, new SetObjectEffectsPlayer(mm.Value).Compile())); } } } // return; } if (castspell is StoneCurse) { var castonView = World.NewMonsters.Where(xe => xe.Value.m_Serial == target && xe.Value.m_Map != null && xe.Value.m_Map == player.m_Map).FirstOrDefault(); if (castonView.Value != null) { return; } else { var tele = PlayerHandler.getSingleton().add.Where(xe => xe.Value != null && xe.Value != player && xe.Value.loggedIn && World.Dist2d(xe.Value.m_Loc.X, xe.Value.m_Loc.Y, player.m_Loc.X, player.m_Loc.Y) <= castspell.Range && xe.Value.Serial == (Serial)target && xe.Value.m_Map != null && xe.Value.m_Map == player.m_Map).FirstOrDefault(); if (tele.Value != null) { tele.Value.Walkbuff_time = 1000; } return; } } if (castspell is Freezing) { var castonView = World.NewMonsters.Where(xe => xe.Value.m_Serial == target && xe.Value.m_Map != null && xe.Value.m_Map == player.m_Map).FirstOrDefault(); if (castonView.Value != null) { return; } else { var tele = PlayerHandler.getSingleton().add.Where(xe => xe.Value != null && xe.Value != player && xe.Value.loggedIn && World.Dist2d(xe.Value.m_Loc.X, xe.Value.m_Loc.Y, player.m_Loc.X, player.m_Loc.Y) <= castspell.Range && xe.Value.Serial == (Serial)target && xe.Value.m_Map != null && xe.Value.m_Map == player.m_Map).FirstOrDefault(); if (tele.Value != null) { int mobile = Serial.NewMobile; World.SendToAll(new QueDele(tele.Value.Map, new CreateMagicEffect(mobile, 1, (short)tele.Value.X, (short)tele.Value.Y, new byte[] { 4, 0, 0, 0, 0, 0, 0, 0, 0, 62 }, 0).Compile())); var tmp = new QueDele(LKCamelot.Server.tickcount.ElapsedMilliseconds + 10000, tele.Value.m_Map, new DeleteObject(mobile).Compile()); tmp.tempser = mobile; World.TickQue.Add(tmp); } return; } } if (castspell is Butterfly) { var tele = PlayerHandler.getSingleton().add.Where(xe => xe.Value != null && xe.Value != player && xe.Value.loggedIn && World.Dist2d(xe.Value.m_Loc.X, xe.Value.m_Loc.Y, player.m_Loc.X, player.m_Loc.Y) <= castspell.Range && xe.Value.Serial == (Serial)target && xe.Value.m_Map != null && xe.Value.m_Map == player.m_Map).FirstOrDefault(); if (tele.Value != null) { tele.Value.BHitbuff_time = 500; tele.Value.BHitbuff = 500; tele.Value.client.SendPacket(new UpdateCharStats(tele.Value).Compile()); int mobile = Serial.NewMobile; World.SendToAll(new QueDele(tele.Value.Map, new CreateMagicEffect(mobile, 1, (short)tele.Value.X, (short)tele.Value.Y, new byte[] { 4, 0, 0, 0, 0, 0, 0, 0, 0, 50 }, 0).Compile())); var tmp = new QueDele(LKCamelot.Server.tickcount.ElapsedMilliseconds + 2000, tele.Value.m_Map, new DeleteObject(mobile).Compile()); tmp.tempser = mobile; World.TickQue.Add(tmp); World.SendToAll(new QueDele(tele.Value.Map, new CurveMagic(tele.Value.Serial, 1, 1, castspell.Seq).Compile())); return; } else { if (player.Hit < 100) { player.BHitbuff_time = 500; player.BHitbuff = 30; player.client.SendPacket(new UpdateCharStats(player).Compile()); int mobile = Serial.NewMobile; World.SendToAll(new QueDele(player.Map, new CreateMagicEffect(mobile, 1, (short)player.X, (short)player.Y, new byte[] { 4, 0, 0, 0, 0, 0, 0, 0, 0, 50 }, 0).Compile())); var tmp = new QueDele(LKCamelot.Server.tickcount.ElapsedMilliseconds + 2000, player.m_Map, new DeleteObject(mobile).Compile()); tmp.tempser = mobile; World.TickQue.Add(tmp); World.SendToAll(new QueDele(player.Map, new CurveMagic(player.Serial, 1, 1, castspell.Seq).Compile())); return; } if (player.Hit > 100) { player.BHitbuff_time = 500; player.BHitbuff = (player.Hit / 100) * 30; player.client.SendPacket(new UpdateCharStats(player).Compile()); int mobile = Serial.NewMobile; World.SendToAll(new QueDele(player.Map, new CreateMagicEffect(mobile, 1, (short)player.X, (short)player.Y, new byte[] { 4, 0, 0, 0, 0, 0, 0, 0, 0, 50 }, 0).Compile())); var tmp = new QueDele(LKCamelot.Server.tickcount.ElapsedMilliseconds + 2000, player.m_Map, new DeleteObject(mobile).Compile()); tmp.tempser = mobile; World.TickQue.Add(tmp); World.SendToAll(new QueDele(player.Map, new CurveMagic(player.Serial, 1, 1, castspell.Seq).Compile())); return; } } } if (castspell is FireWall) { var castonView = World.NewMonsters.Where(xe => xe.Value.m_Serial == target && xe.Value.m_Map != null && xe.Value.m_Map == player.m_Map).FirstOrDefault(); if (castonView.Value != null) { return; } else { var tele = PlayerHandler.getSingleton().add.Where(xe => xe.Value != null && xe.Value != player && xe.Value.loggedIn && World.Dist2d(xe.Value.m_Loc.X, xe.Value.m_Loc.Y, player.m_Loc.X, player.m_Loc.Y) <= castspell.Range && xe.Value.Serial == (Serial)target && xe.Value.m_Map != null && xe.Value.m_Map == player.m_Map).FirstOrDefault(); if (tele.Value != null) { int mobile = Serial.NewMobile; World.SendToAll(new QueDele(tele.Value.Map, new CreateMagicEffect(mobile, 1, (short)tele.Value.X, (short)tele.Value.Y, new byte[] { 4, 7, 7, 7, 7, 7, 7, 7, 7, 62 }, 0).Compile())); var tmp = new QueDele(LKCamelot.Server.tickcount.ElapsedMilliseconds + 10000, tele.Value.m_Map, new DeleteObject(mobile).Compile()); tmp.tempser = mobile; World.TickQue.Add(tmp); } //return; } } var caston = World.NewMonsters.Where(xe => xe.Value.m_Serial == target && World.Dist2d(xe.Value.m_Loc.X, xe.Value.m_Loc.Y, player.X, player.Y) <= castspell.Range && xe.Value.Alive && xe.Value.m_Map != null && xe.Value.m_Map == player.m_Map ).Select(xe => xe.Value); var playcaston = PlayerHandler.getSingleton().add.Where(xe => xe.Value != null && xe.Value != player && xe.Value.loggedIn && World.Dist2d(xe.Value.m_Loc.X, xe.Value.m_Loc.Y, player.m_Loc.X, player.m_Loc.Y) <= castspell.Range && xe.Value.Serial == (Serial)target && xe.Value.m_Map != null && xe.Value.m_Map == player.m_Map).FirstOrDefault(); if (castspell.mType == LKCamelot.library.MagicType.Casted || castspell.mType == LKCamelot.library.MagicType.Target) { caston = World.NewMonsters.Where(xe => xe.Value.m_Map != null && xe.Value.m_Map == player.Map && World.Dist2d(xe.Value.m_Loc.X, xe.Value.m_Loc.Y, player.X, player.Y) <= castspell.Range && xe.Value.Alive) .Select(xe => xe.Value); } if (playcaston.Key != null && !(player.Map == "Village1" || player.Map == "Rest" || player.Map == "Arnold" || player.Map == "Loen" || player.TakeDam == false) ) { if (castspell is ISingle) { if (player.MPCur < castspell.RealManaCost(player)) { return; } player.MPCur -= castspell.RealManaCost(player); castspell.CheckLevelUp(player); CreateMagicEffect(playcaston.Value.Loc, playcaston.Value.Map, (byte)castspell.Seq.OnImpactSprite, 1500); TakeDamage(player, playcaston.Value, castspell); return; } if (castspell.Name == "DEMON DEATH") { if (player.HPCur < (int)(player.HP * 0.50)) { return; } var miyamo = player.Equipped.Where(xe => xe.GetType() == typeof(script.item.MiyamotosStick)).FirstOrDefault(); var recast = castspell.RecastTime; //if (miyamo != null) { recast -= 1000; recast -= (player.m_Men / 3000) * 300; } if (LKCamelot.Server.tickcount.ElapsedMilliseconds - recast > castspell.Cooldown) { castspell.Cooldown = LKCamelot.Server.tickcount.ElapsedMilliseconds; } else { return; } player.HPCur -= (int)(player.HPCur * 0.5); castspell.CheckLevelUp(player); //System.IO.Stream soundStream0 = (Properties.Resources._33); //new System.Media.SoundPlayer(soundStream0).Play(); int mobile = Serial.NewMobile; World.SendToAll(new QueDele(player.Map, new CreateMagicEffect(mobile, 1, (short)playcaston.Value.m_Loc.X, (short)playcaston.Value.m_Loc.Y, new byte[] { 4, 0, 0, 0, 0, 0, 0, 0, 0, (byte)castspell.Seq.OnImpactSprite }, 0).Compile())); var tmp = new QueDele(LKCamelot.Server.tickcount.ElapsedMilliseconds + 2000, player.m_Map, new DeleteObject(mobile).Compile()); tmp.tempser = mobile; World.TickQue.Add(tmp); TakeDamage(player, playcaston.Value, castspell); return; } if (player.MPCur < castspell.RealManaCost(player)) { return; } player.MPCur -= castspell.RealManaCost(player); castspell.CheckLevelUp(player); TakeDamage(player, playcaston.Value, castspell); World.SendToAll(new QueDele(player.Map, new CurveMagic(player.Serial, castx, casty, castspell.Seq).Compile())); } switch (castspell.mType) { case (LKCamelot.library.MagicType.Target2): foreach (var targete in caston) { if (castspell is ISingle) { if (player.MPCur < castspell.RealManaCost(player)) { return; } player.MPCur -= castspell.RealManaCost(player); castspell.CheckLevelUp(player); CreateMagicEffect(targete.m_Loc, targete.m_Map, (byte)castspell.Seq.OnImpactSprite, 1500); targete.TakeDamage(player, castspell); return; } if (castspell.Name == "DEMON DEATH") { if (player.HPCur < (int)(player.HP * 0.50)) { return; } var miyamo = player.Equipped.Where(xe => xe.GetType() == typeof(script.item.MiyamotosStick)).FirstOrDefault(); var recast = castspell.RecastTime; if (miyamo != null) { recast -= 1000; recast -= miyamo.Stage * 300; } if (LKCamelot.Server.tickcount.ElapsedMilliseconds - recast > castspell.Cooldown) { castspell.Cooldown = LKCamelot.Server.tickcount.ElapsedMilliseconds; } else { return; } player.HPCur -= (int)(player.HPCur * 0.5); castspell.CheckLevelUp(player); int mobile = Serial.NewMobile; World.SendToAll(new QueDele(player.Map, new CreateMagicEffect(mobile, 1, (short)targete.m_Loc.X, (short)targete.m_Loc.Y, new byte[] { 4, 0, 0, 0, 0, 0, 0, 0, 0, (byte)castspell.Seq.OnImpactSprite }, 0).Compile())); var tmp = new QueDele(LKCamelot.Server.tickcount.ElapsedMilliseconds + 2000, player.m_Map, new DeleteObject(mobile).Compile()); tmp.tempser = mobile; World.TickQue.Add(tmp); targete.TakeDamage(player, castspell); return; } if (player.MPCur < castspell.RealManaCost(player)) { return; } player.MPCur -= castspell.RealManaCost(player); castspell.CheckLevelUp(player); targete.TakeDamage(player, castspell); World.SendToAll(new QueDele(player.Map, new CurveMagic(player.Serial, castx, casty, castspell.Seq).Compile())); } break; case (LKCamelot.library.MagicType.Casted): if (player.MPCur < castspell.RealManaCost(player)) { return; } player.MPCur -= castspell.RealManaCost(player); if (castspell.Cast(player)) { return; } foreach (var targete in caston) { targete.TakeDamage(player, castspell); } World.SendToAll(new QueDele(player.Map, new CurveMagic(player.Serial, 1, 1, castspell.Seq).Compile())); break; case (LKCamelot.library.MagicType.Target): if (player.MPCur < castspell.RealManaCost(player)) { return; } player.MPCur -= castspell.RealManaCost(player); if (castspell.Cast(player)) { return; } World.SendToAll(new QueDele(player.Map, new CurveMagic(player.Serial, 1, 1, castspell.Seq).Compile())); foreach (var targetee in caston) { int mobile = Serial.NewMobile; World.SendToAll(new QueDele(player.Map, new CreateMagicEffect(mobile, 1, (short)targetee.m_Loc.X, (short)targetee.m_Loc.Y, new byte[] { 4, 0, 0, 0, 0, 0, 0, 0, 0, (byte)castspell.Seq.OnImpactSprite }, 0).Compile())); // World.SendToAll(new QueDele(player.Map, new SetObjectEffectsMonsterSpell(targetee, castspell.Seq.OnImpactSprite).Compile())); targetee.TakeDamage(player, castspell); var tmp = new QueDele(LKCamelot.Server.tickcount.ElapsedMilliseconds + 1000, player.m_Map, new DeleteObject(mobile).Compile()); tmp.tempser = mobile; World.TickQue.Add(tmp); } break; } }
public void HandleCast(int header, script.spells.Spell castspell, Player player, int target = 0, short castx = 0, short casty = 0) { if (castspell is Teleport) { var teleportdist = ((castspell.Level / 2) * 2); if (teleportdist <= 3) { teleportdist = 4; } if (teleportdist > 12) { teleportdist = 12; } if (World.Dist2d(castx, casty, player.X, player.Y) <= teleportdist && player.MPCur > castspell.RealManaCost(player)) { var nmap = LKCamelot.model.Map.FullMaps.Where(xe => xe.Key == player.Map).FirstOrDefault().Value; TiledMap curmap = null; try { curmap = LKCamelot.model.Map.loadedmaps[nmap]; } catch { Console.WriteLine(string.Format("Failed to nmap at {0}", nmap)); } LKCamelot.model.MyPathNode randomtile; try { randomtile = curmap.tiles[castx, casty]; } catch { return; } if (randomtile.IsWall) { return; } player.MPCur -= castspell.RealManaCost(player); castspell.CheckLevelUp(player); player.Loc = new Point2D(castx, casty); World.SendToAll(new QueDele(player.Map, new MoveSpriteTele(player.Serial, player.Face, player.X, player.Y).Compile())); return; } } if (castspell is Trace) { if (player.MPCur > castspell.RealManaCost(player)) { player.MPCur -= castspell.RealManaCost(player); castspell.CheckLevelUp(player); try { var traceto = script.map.Portal.Portals.Where(xe => xe.Map == player.Map).Select(xe => xe).ToList(); if (traceto.Count > 1) { var temp = new Point2D(traceto[0].Locs[0].X, traceto[0].Locs[0].Y + 2); player.Loc = temp; } } catch { return; } World.SendToAll(new QueDele(player.Map, new MoveSpriteTele(player.Serial, player.Face, player.X, player.Y).Compile())); return; } } if (castspell is ComeBack) { return; } var caston = World.NewMonsters.Where(xe => xe.Value.m_Serial == target && World.Dist2d(xe.Value.m_Loc.X, xe.Value.m_Loc.Y, player.X, player.Y) <= castspell.Range && xe.Value.Alive && xe.Value.m_Map != null && xe.Value.m_Map == player.m_Map ).Select(xe => xe.Value); var playcaston = PlayerHandler.getSingleton().add.Where(xe => xe.Value != null && xe.Value != player && xe.Value.loggedIn && World.Dist2d(xe.Value.m_Loc.X, xe.Value.m_Loc.Y, player.m_Loc.X, player.m_Loc.Y) <= castspell.Range && xe.Value.Serial == (Serial)target && xe.Value.m_Map != null && xe.Value.m_Map == player.m_Map).FirstOrDefault(); if (castspell.mType == LKCamelot.library.MagicType.Casted || castspell.mType == LKCamelot.library.MagicType.Target) { caston = World.NewMonsters.Where(xe => xe.Value.m_Map != null && xe.Value.m_Map == player.Map && World.Dist2d(xe.Value.m_Loc.X, xe.Value.m_Loc.Y, player.X, player.Y) <= castspell.Range && xe.Value.Alive) .Select(xe => xe.Value); } if (playcaston.Key != null && !(player.Map == "Village1" || player.Map == "Rest" || player.Map == "Arnold" || player.Map == "Loen") ) { if (castspell is ISingle) { if (player.MPCur < castspell.RealManaCost(player)) { return; } player.MPCur -= castspell.RealManaCost(player); castspell.CheckLevelUp(player); CreateMagicEffect(playcaston.Value.Loc, playcaston.Value.Map, (byte)castspell.Seq.OnImpactSprite, 1500); TakeDamage(player, playcaston.Value, castspell); return; } if (castspell.Name == "DEMON DEATH") { if (player.HPCur < (int)(player.HP * 0.70)) { return; } var miyamo = player.Equipped.Where(xe => xe.GetType() == typeof(script.item.MiyamotosStick)).FirstOrDefault(); var recast = castspell.RecastTime; if (miyamo != null) { recast -= 1000; recast -= miyamo.Stage * 300; } if (LKCamelot.Server.tickcount.ElapsedMilliseconds - recast > castspell.Cooldown) { castspell.Cooldown = LKCamelot.Server.tickcount.ElapsedMilliseconds; } else { return; } player.HPCur -= castspell.RealManaCost(player); castspell.CheckLevelUp(player); int mobile = Serial.NewMobile; World.SendToAll(new QueDele(player.Map, new CreateMagicEffect(mobile, 1, (short)playcaston.Value.m_Loc.X, (short)playcaston.Value.m_Loc.Y, new byte[] { 4, 0, 0, 0, 0, 0, 0, 0, 0, (byte)castspell.Seq.OnImpactSprite }, 0).Compile())); var tmp = new QueDele(LKCamelot.Server.tickcount.ElapsedMilliseconds + 2000, player.m_Map, new DeleteObject(mobile).Compile()); tmp.tempser = mobile; World.TickQue.Add(tmp); TakeDamage(player, playcaston.Value, castspell); return; } if (player.MPCur < castspell.RealManaCost(player)) { return; } player.MPCur -= castspell.RealManaCost(player); castspell.CheckLevelUp(player); TakeDamage(player, playcaston.Value, castspell); World.SendToAll(new QueDele(player.Map, new CurveMagic(player.Serial, castx, casty, castspell.Seq).Compile())); } switch (castspell.mType) { case (LKCamelot.library.MagicType.Target2): foreach (var targete in caston) { if (castspell is ISingle) { if (player.MPCur < castspell.RealManaCost(player)) { return; } player.MPCur -= castspell.RealManaCost(player); castspell.CheckLevelUp(player); CreateMagicEffect(targete.m_Loc, targete.m_Map, (byte)castspell.Seq.OnImpactSprite, 1500); targete.TakeDamage(player, castspell); return; } if (castspell.Name == "DEMON DEATH") { if (player.HPCur < (int)(player.HP * 0.70)) { return; } var miyamo = player.Equipped.Where(xe => xe.GetType() == typeof(script.item.MiyamotosStick)).FirstOrDefault(); var recast = castspell.RecastTime; if (miyamo != null) { recast -= 1000; recast -= miyamo.Stage * 300; } if (LKCamelot.Server.tickcount.ElapsedMilliseconds - recast > castspell.Cooldown) { castspell.Cooldown = LKCamelot.Server.tickcount.ElapsedMilliseconds; } else { return; } player.HPCur -= castspell.RealManaCost(player); castspell.CheckLevelUp(player); int mobile = Serial.NewMobile; World.SendToAll(new QueDele(player.Map, new CreateMagicEffect(mobile, 1, (short)targete.m_Loc.X, (short)targete.m_Loc.Y, new byte[] { 4, 0, 0, 0, 0, 0, 0, 0, 0, (byte)castspell.Seq.OnImpactSprite }, 0).Compile())); var tmp = new QueDele(LKCamelot.Server.tickcount.ElapsedMilliseconds + 2000, player.m_Map, new DeleteObject(mobile).Compile()); tmp.tempser = mobile; World.TickQue.Add(tmp); targete.TakeDamage(player, castspell); return; } if (player.MPCur < castspell.RealManaCost(player)) { return; } player.MPCur -= castspell.RealManaCost(player); castspell.CheckLevelUp(player); targete.TakeDamage(player, castspell); World.SendToAll(new QueDele(player.Map, new CurveMagic(player.Serial, castx, casty, castspell.Seq).Compile())); } break; case (LKCamelot.library.MagicType.Casted): if (player.MPCur < castspell.RealManaCost(player)) { return; } player.MPCur -= castspell.RealManaCost(player); if (castspell.Cast(player)) { return; } foreach (var targete in caston) { targete.TakeDamage(player, castspell); } World.SendToAll(new QueDele(player.Map, new CurveMagic(player.Serial, 1, 1, castspell.Seq).Compile())); break; case (LKCamelot.library.MagicType.Target): if (player.MPCur < castspell.RealManaCost(player)) { return; } player.MPCur -= castspell.RealManaCost(player); if (castspell.Cast(player)) { return; } World.SendToAll(new QueDele(player.Map, new CurveMagic(player.Serial, 1, 1, castspell.Seq).Compile())); foreach (var targetee in caston) { int mobile = Serial.NewMobile; World.SendToAll(new QueDele(player.Map, new CreateMagicEffect(mobile, 1, (short)targetee.m_Loc.X, (short)targetee.m_Loc.Y, new byte[] { 4, 0, 0, 0, 0, 0, 0, 0, 0, (byte)castspell.Seq.OnImpactSprite }, 0).Compile())); // World.SendToAll(new QueDele(player.Map, new SetObjectEffectsMonsterSpell(targetee, castspell.Seq.OnImpactSprite).Compile())); targetee.TakeDamage(player, castspell); var tmp = new QueDele(LKCamelot.Server.tickcount.ElapsedMilliseconds + 1000, player.m_Map, new DeleteObject(mobile).Compile()); tmp.tempser = mobile; World.TickQue.Add(tmp); } break; } }