public HashSet <IntVec3> MakeProjectileLine(Vector3 start, Vector3 end, Map map) { var resultingLine = new ShootLine(start.ToIntVec3(), end.ToIntVec3()); var points = resultingLine.Points(); HashSet <IntVec3> positions = new HashSet <IntVec3>(); var currentPos = CurPosition; currentPos.y = 0; var startingPosition = StartingPosition; startingPosition.y = 0; var destination = new Vector3(currentPos.x, currentPos.y, currentPos.z); Vector3 pos = (startingPosition + currentPos) / 2f; pos.y = 10; pos += Quaternion.Euler(0, (startingPosition - currentPos).AngleFlat(), 0) * this.def.startingPositionOffset; var distance = Vector3.Distance(startingPosition, currentPos) * this.def.totalSizeScale; var distanceToTarget = Vector3.Distance(startingPosition, currentPos); var widthFactor = distance / distanceToTarget; var width = distance * this.def.widthScaleFactor * widthFactor; var height = distance * this.def.heightScaleFactor; var centerOfLine = pos.ToIntVec3(); var startPosition = StartingPosition.ToIntVec3(); var endPosition = this.CurPosition.ToIntVec3(); if (points.Any()) { foreach (var cell in GenRadial.RadialCellsAround(start.ToIntVec3(), height, true)) { if (centerOfLine.DistanceToSquared(endPosition) >= cell.DistanceToSquared(endPosition) && startPosition.DistanceTo(cell) > def.minDistanceToAffect) { var nearestCell = points.MinBy(x => x.DistanceToSquared(cell)); if ((width / height) * 2.5f > nearestCell.DistanceToSquared(cell)) { positions.Add(cell); } } } foreach (var cell in points) { var startCellDistance = startPosition.DistanceTo(cell); if (startCellDistance > def.minDistanceToAffect && startCellDistance <= startPosition.DistanceTo(endPosition)) { positions.Add(cell); } } } return(positions); }
public static bool IsVoidsEverywhereInShootingLineInBackWard(ShootLine resultingLine, Map map, Thing caster, Thing target) { var points = resultingLine.Points().ToList(); if (points.Count > 2) { for (int i = points.Count - 1; i >= 0; i--) { if (IntVec3Utility.DistanceTo(target.Position, points[i]) >= 2) { if (i < points.Count - 1 && points[i].GetTerrain(map) != ZLevelsDefOf.ZL_OutsideTerrain) { //ZLogger.Message("6: " + caster + " - " + " - " + i + " - " + points.Count + " - " + points[i] + " - " + points[i].GetTerrain(map) + " - " + map, true); return(false); } else if (i == points.Count - 1 && points[i].GetCover(map)?.def?.Fillage == FillCategory.Full) { ZLogger.Message("7: " + caster + " - " + i + " - " + points.Count + " - " + points[i] + " - " + points[i].GetCover(map) + " - " + map, true); return(false); } } } if (resultingLine.dest.GetCover(map)?.def?.Fillage == FillCategory.Full) { ZLogger.Message("8: " + caster + " - " + resultingLine.dest + " - " + resultingLine.dest.GetCover(map) + " - " + map, true); return(false); } } else { for (int i = points.Count - 1; i >= 0; i--) { if (points[i] != resultingLine.Dest) { if (points[i].GetTerrain(map) != ZLevelsDefOf.ZL_OutsideTerrain) { ZLogger.Message("9: " + caster + " - " + i + " - " + points.Count + " - " + points[i] + " - " + points[i].GetTerrain(map) + " - " + map, true); return(false); } } } if (resultingLine.dest.GetCover(map)?.def?.Fillage == FillCategory.Full) { ZLogger.Message("10: " + caster + " - " + resultingLine.dest + " - " + resultingLine.dest.GetCover(map) + " - " + map, true); return(false); } } return(true); }
public static bool IsVoidsEverywhereInShootingLine(ShootLine resultingLine, Map map, Thing caster, Thing target) { var points = resultingLine.Points().ToList(); if (points.Count > 2) { for (int i = 0; i < points.Count; i++) { if (IntVec3Utility.DistanceTo(caster.Position, points[i]) >= 2) { if (points[i].GetTerrain(map) != ZLevelsDefOf.ZL_OutsideTerrain) { ZLogger.Message("1: " + caster + " - " + i + " - " + points[i] + " - " + points[i].GetTerrain(map) + " - " + map, true); return(false); } } } if (resultingLine.dest.GetCover(map)?.def?.Fillage == FillCategory.Full) { ZLogger.Message("3: " + caster + " - " + resultingLine.dest + " - " + resultingLine.dest.GetCover(map) + " - " + map, true); return(false); } } else { for (int i = 0; i < points.Count; i++) { if (points[i] != resultingLine.Source) { if (points[i].GetTerrain(map) != ZLevelsDefOf.ZL_OutsideTerrain) { ZLogger.Message("4: " + caster + " - " + i + " - " + points[i] + " - " + points[i].GetTerrain(map) + " - " + map, true); return(false); } } } if (resultingLine.dest.GetCover(map)?.def?.Fillage == FillCategory.Full) { ZLogger.Message("5: " + caster + " - " + resultingLine.dest + " - " + resultingLine.dest.GetCover(map) + " - " + map, true); return(false); } } return(true); }