// Methods public static ArrayList GetLine(int x1, int y1, int x2, int y2) { int num = 0; Point3D pointd = null; Point point = null; int num2 = 0; int num3 = 0; double d = 0; double a = 0; double num6 = 0; double num7 = 0; double num8 = 0; double num9 = 0; double num10 = 0; double num11 = 0; UInt32 num12 = 0; UInt32 num13 = 0; ArrayList list = new ArrayList(); Point3D pointd2 = new Point3D(Convert.ToDouble(x1), Convert.ToDouble(y1), 0); Point3D pointd3 = new Point3D(Convert.ToDouble(x2), Convert.ToDouble(y2), 0); pointd = new Point3D((pointd2.X + 0.5), (pointd2.Y + 0.5), pointd2.Z); Point3D pointd4 = new Point3D((pointd3.X + 0.5), (pointd3.Y + 0.5), pointd3.Z); double num14 = 0; double num15 = 0; double num16 = 0; ArrayList list2 = new ArrayList(); ArrayList list3 = new ArrayList(); UInt32 num17 = 0; if ((Math.Abs(Convert.ToDouble((pointd.X - pointd4.X))) == Math.Abs(Convert.ToDouble((pointd.Y - pointd4.Y))))) { num16 = Math.Abs(Convert.ToDouble((pointd.X - pointd4.X))); num14 = (pointd4.X > pointd.X) ? Convert.ToDouble(1) : Convert.ToDouble(-1); num15 = (pointd4.Y > pointd.Y) ? Convert.ToDouble(1) : Convert.ToDouble(-1); double num1 = (num16 == 0) ? 0 : ((pointd3.Z - pointd2.Z) / num16); num17 = 1; } else if ((Math.Abs(Convert.ToDouble((pointd.X - pointd4.X))) > Math.Abs(Convert.ToDouble((pointd.Y - pointd4.Y))))) { num16 = Math.Abs(Convert.ToDouble((pointd.X - pointd4.X))); num14 = (pointd4.X > pointd.X) ? Convert.ToDouble(1) : Convert.ToDouble(-1); num15 = (pointd4.Y > pointd.Y) ? (Math.Abs(Convert.ToDouble((pointd.Y - pointd4.Y))) == 0) ? 0 : (Math.Abs(Convert.ToDouble((pointd.Y - pointd4.Y))) / num16) : (-Math.Abs(Convert.ToDouble((pointd.Y - pointd4.Y))) / num16); num15 = (num15 * 100); num15 = (Math.Ceiling(num15) / 100); double num18 = (num16 == 0) ? 0 : ((pointd3.Z - pointd2.Z) / num16); num17 = 2; } else { num16 = Math.Abs(Convert.ToDouble((pointd.Y - pointd4.Y))); num14 = (pointd4.X > pointd.X) ? (Math.Abs(Convert.ToDouble((pointd.X - pointd4.X))) == 0) ? 0 : (Math.Abs(Convert.ToDouble((pointd.X - pointd4.X))) / num16) : (-Math.Abs(Convert.ToDouble((pointd.X - pointd4.X))) / num16); num14 = (num14 * 100); num14 = (Math.Ceiling(num14) / 100); num15 = (pointd4.Y > pointd.Y) ? Convert.ToDouble(1) : Convert.ToDouble(-1); double num19 = (num16 == 0) ? 0 : ((pointd3.Z - pointd2.Z) / num16); num17 = 3; } for (num = 0; num <= num16 - 1; num++) { num2 = Convert.ToInt32(Math.Round(Math.Floor(Convert.ToDouble((3 + (num16 / 2)))))); num3 = Convert.ToInt32(Math.Round(Math.Floor(Convert.ToDouble((97 - (num16 / 2)))))); switch (num17) { case 2: d = (Math.Ceiling(Convert.ToDouble(((pointd.Y * 100) + (num15 * 50)))) / 100); a = (Math.Floor(Convert.ToDouble(((pointd.Y * 100) + (num15 * 150)))) / 100); num6 = (Math.Floor(Math.Abs(Convert.ToDouble(((Math.Floor(d) * 100) - (d * 100))))) / 100); num7 = (Math.Ceiling(Math.Abs(Convert.ToDouble(((Math.Ceiling(a) * 100) - (a * 100))))) / 100); if ((Math.Floor(d) == Math.Floor(a))) { list3 = Dofus1Line.smethod_0(new object[] { Math.Floor(Convert.ToDouble((pointd.Y + num15))) }); if (d == (double)list3[0] && a < (double)list3[0]) { list3 = Dofus1Line.smethod_0(new object[] { Math.Ceiling(Convert.ToDouble((pointd.Y + num15))) }); } else if (d == (double)list3[0] && a > (double)list3[0]) { list3 = Dofus1Line.smethod_0(new object[] { Math.Floor(Convert.ToDouble((pointd.Y + num15))) }); } else if (a == (double)list3[0] && d < (double)list3[0]) { list3 = Dofus1Line.smethod_0(new object[] { Math.Ceiling(Convert.ToDouble((pointd.Y + num15))) }); } else if (a == (double)list3[0] && d > (double)list3[0]) { list3 = Dofus1Line.smethod_0(new object[] { Math.Floor(Convert.ToDouble((pointd.Y + num15))) }); } } else if ((Math.Ceiling(d) == Math.Ceiling(a))) { list3 = Dofus1Line.smethod_0(new object[] { Math.Ceiling(Convert.ToDouble((pointd.Y + num15))) }); if (d == (double)list3[0] && a < (double)list3[0]) { list3 = Dofus1Line.smethod_0(new object[] { Math.Floor(Convert.ToDouble((pointd.Y + num15))) }); } else if (d == (double)list3[0] && a > (double)list3[0]) { list3 = Dofus1Line.smethod_0(new object[] { Math.Ceiling(Convert.ToDouble((pointd.Y + num15))) }); } else if (a == (double)list3[0] && d < (double)list3[0]) { list3 = Dofus1Line.smethod_0(new object[] { Math.Floor(Convert.ToDouble((pointd.Y + num15))) }); } else if (a == (double)list3[0] && d > (double)list3[0]) { list3 = Dofus1Line.smethod_0(new object[] { Math.Ceiling(Convert.ToDouble((pointd.Y + num15))) }); } } else if ((Math.Floor(Convert.ToDouble((num6 * 100))) <= num2)) { ArrayList list4 = new ArrayList(); list4.Add(Math.Floor(a)); list3 = list4; } else if ((Math.Floor(Convert.ToDouble((num7 * 100))) >= num3)) { ArrayList list5 = new ArrayList(); list5.Add(Math.Floor(d)); list3 = list5; } else { ArrayList list6 = new ArrayList(); list6.Add(Math.Floor(d)); list6.Add(Math.Floor(a)); list3 = list6; } break; // TODO: might not be correct. Was : Exit Select case 3: num8 = (Math.Ceiling(Convert.ToDouble(((pointd.X * 100) + (num14 * 50)))) / 100); num9 = (Math.Floor(Convert.ToDouble(((pointd.X * 100) + (num14 * 150)))) / 100); num10 = (Math.Floor(Math.Abs(Convert.ToDouble(((Math.Floor(num8) * 100) - (num8 * 100))))) / 100); num11 = (Math.Ceiling(Math.Abs(Convert.ToDouble(((Math.Ceiling(num9) * 100) - (num9 * 100))))) / 100); if (Math.Floor(num8) == Math.Floor(num9)) { list2 = Dofus1Line.smethod_0(new object[] { Math.Floor(Convert.ToDouble(pointd.X + num14)) }); if (num8 == (double)list2[0] && num9 < (double)list2[0]) { list2 = Dofus1Line.smethod_0(new object[] { Math.Ceiling(Convert.ToDouble(pointd.X + num14)) }); } else if (num8 == (double)list2[0] && num9 > (double)list2[0]) { list2 = Dofus1Line.smethod_0(new object[] { Math.Floor(Convert.ToDouble(pointd.X + num14)) }); } else if (num9 == (double)list2[0] && num8 < (double)list2[0]) { list2 = Dofus1Line.smethod_0(new object[] { Math.Ceiling(Convert.ToDouble(pointd.X + num14)) }); } else if (num9 == (double)list2[0] && num8 > (double)list2[0]) { list2 = Dofus1Line.smethod_0(new object[] { Math.Floor(Convert.ToDouble(pointd.X + num14)) }); } } else if (Math.Ceiling(num8) == Math.Ceiling(num9)) { list2 = Dofus1Line.smethod_0(new object[] { Math.Ceiling(Convert.ToDouble(pointd.X + num14)) }); if (num8 == (double)list2[0] && num9 < (double)list2[0]) { list2 = Dofus1Line.smethod_0(new object[] { Math.Floor(Convert.ToDouble(pointd.X + num14)) }); } else if (num8 == (double)list2[0] && num9 > (double)list2[0]) { list2 = Dofus1Line.smethod_0(new object[] { Math.Ceiling(Convert.ToDouble(pointd.X + num14)) }); } else if (num9 == (double)list2[0] && num8 < (double)list2[0]) { list2 = Dofus1Line.smethod_0(new object[] { Math.Floor(Convert.ToDouble(pointd.X + num14)) }); } else if (num9 == (double)list2[0] && num8 > (double)list2[0]) { list2 = Dofus1Line.smethod_0(new object[] { Math.Ceiling(Convert.ToDouble(pointd.X + num14)) }); } } else if ((Math.Floor(Convert.ToDouble((num10 * 100))) <= num2)) { list2 = Dofus1Line.smethod_0(new object[] { num9 }); } else if ((Math.Floor(Convert.ToDouble((num11 * 100))) >= num3)) { list2 = Dofus1Line.smethod_0(new object[] { num8 }); } else { list2 = Dofus1Line.smethod_0(new object[] { num8, num9 }); } break; // TODO: might not be correct. Was : Exit Select } if ((list3.Count > 0)) { num12 = 0; while ((num12 < list3.Count)) { point = new Point(Math.Floor(Convert.ToDouble((pointd.X + num14))), Convert.ToDouble(list3[Convert.ToInt32(num12)])); list.Add(point); num12 = (num12 + 1); } } else if ((list2.Count > 0)) { num13 = 0; while ((num13 < list2.Count)) { point = new Point(Convert.ToDouble(list2[Convert.ToInt32(num13)]), Math.Floor(Convert.ToDouble((pointd.Y + num15)))); list.Add(point); num13 = (num13 + 1); } } else if ((num17 == 1)) { point = new Point(Math.Floor(Convert.ToDouble((pointd.X + num14))), Math.Floor(Convert.ToDouble((pointd.Y + num15)))); list.Add(point); } pointd.X = (((pointd.X * 100) + (num14 * 100)) / 100); pointd.Y = (((pointd.Y * 100) + (num15 * 100)) / 100); } return(list); }
public static SpellInabilityReason CanLaunchSpell(List <int> takenCellIds, int spellId, int characterCellId, int cellId) { var spellData = SpellRepository.Instance.GetSpellById(spellId); var spellLevelsData = SpellLevelRepository.Instance.GetSpellLevelById((int)spellData.SpellLevels[0]); bool isFreeCell = false; if (spellLevelsData == null) { return(SpellInabilityReason.Unknown); } MapPoint characterPoint = new MapPoint(characterCellId); MapPoint targetPoint = new MapPoint(cellId); int distanceToTarget = characterPoint.DistanceToCell(targetPoint); int minRange = (spellId != 0) ? (int)spellLevelsData.MinRange : 0; //weaponData.minRange; if ((spellId != 0 && (bool)spellLevelsData.CastInDiagonal)) // || (weaponData != null && weaponData.castInDiagonal)) { minRange = (minRange * 2); } if (minRange < 0) { minRange = 0; } int maxRange = (spellId != 0) ? (int)((int)spellLevelsData.Range + ((bool)spellLevelsData.RangeCanBeBoosted ? /* Account.CharacterStats.range.objectsAndMountBonus */ 0 : 0)) : (int)spellLevelsData.Range; if ((spellId != 0 && (bool)spellLevelsData.CastInDiagonal))// || (weaponData != null && weaponData.castInDiagonal)) { maxRange = (maxRange * 2); } if (maxRange < 0) { maxRange = 0; } if (distanceToTarget < minRange && distanceToTarget > 0) { return(SpellInabilityReason.MinRange); } if (distanceToTarget > maxRange) { return(SpellInabilityReason.MaxRange); } if (((spellId != 0 && (bool)spellLevelsData.CastInLine)) &&// || (weaponData != null && weaponData.castInDiagonal)) && characterPoint.X != targetPoint.X && characterPoint.Y != targetPoint.Y) { return(SpellInabilityReason.NotInLine); } if ((spellId != 0 && (bool)spellLevelsData.CastInDiagonal))// || (weaponData != null && weaponData.castInDiagonal)) { ArrayList list = Dofus1Line.GetLine(characterPoint.X, characterPoint.Y, targetPoint.X, targetPoint.Y); int i = 0; while (i < list.Count - 1) { Dofus1Line.Point actualPoint = (Dofus1Line.Point)list[i]; Dofus1Line.Point nextPoint = (Dofus1Line.Point)list[i + 1]; i += 1; if (actualPoint.X == nextPoint.X + 1 && actualPoint.Y == nextPoint.Y + 1) { continue; } else if (actualPoint.X == nextPoint.X - 1 && actualPoint.Y == nextPoint.Y - 1) { continue; } else if (actualPoint.X == nextPoint.X + 1 && actualPoint.Y == nextPoint.Y - 1) { continue; } else if (actualPoint.X == nextPoint.X - 1 && actualPoint.Y == nextPoint.Y + 1) { continue; } return(SpellInabilityReason.NotInDiagonal); } } if (((spellId != 0 && (bool)spellLevelsData.CastTestLos && distanceToTarget > 1)))// || (weaponData != null && weaponData.castTestLos)) && distanceToTarget > 1) { ArrayList list = Dofus1Line.GetLine(characterPoint.X, characterPoint.Y, targetPoint.X, targetPoint.Y); int i = 0; while (i < list.Count - 1) { Dofus1Line.Point point3 = (Dofus1Line.Point)list[i]; MapPoint point4 = new MapPoint((int)Math.Round(Math.Floor(point3.X)), (int)Math.Round(Math.Floor(point3.Y))); isFreeCell = takenCellIds.Find(x => x == point4.CellId) == 0 ? true : false; if (!(isFreeCell)) { return(SpellInabilityReason.LineOfSight); } i += 1; } } isFreeCell = takenCellIds.Find(x => x == cellId) == 0 ? true : false; if (isFreeCell) { if ((bool)spellLevelsData.NeedTakenCell) { return(SpellInabilityReason.NeedTakenCell); } } else if ((bool)spellLevelsData.NeedTakenCell) { return(SpellInabilityReason.NeedFreeCell); } return(SpellInabilityReason.None); }