Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }