134 if (!startPos || startPos ==
vector.Zero)
135 startPos = centerPos;
138 float startPosY = startPos[1];
141 vector shooterPos = shooter.GetOrigin();
150 vector minEdgePos, maxEdgePos;
151 float minEdgeDist, maxEdgeDist;
152 GetEdgePositions(startPos, rightDir, minEdgePos, maxEdgePos, minEdgeDist, maxEdgeDist);
154 vector sideDir = rightDir;
156 float maxDist = maxEdgeDist;
157 float minEdgeDistAbs =
Math.AbsFloat(minEdgeDist);
158 float maxDistToEdge =
Math.Max(maxEdgeDist, minEdgeDistAbs);
159 float lineLength = minEdgeDistAbs + maxEdgeDist;
162 float distToCenter =
vector.Distance(shooterPos, centerPos);
167 if (lastLineDir !=
vector.Zero)
169 float dot =
vector.DotXZ(lastLineDir, sideDir);
173 if (
Math.AbsFloat(dot) > 0.9 && dot < 0)
175 sideDir = rightDir * -1;
176 maxDist = minEdgeDistAbs;
184 startPos = minEdgePos;
185 vector maxEndPos = maxEdgePos;
188 if (minEdgeDistAbs >
Math.AbsFloat(maxEdgeDist))
190 startPos = maxEdgePos;
191 maxEndPos = minEdgePos;
195 sideDir =
vector.Direction(startPos, maxEndPos).Normalized();
196 maxDist =
vector.DistanceXZ(startPos, maxEndPos);
204 sideDir = rightDir * -1;
205 maxDist = minEdgeDistAbs;
212 float startPosMinY, startPosMaxY;
216 startPos[1] =
Math.Max(
Math.Min(startPosY, startPosMaxY), startPosMinY);
220 float endPosDistRandMax =
Math.Max(minPossibleDist,
Math.Min(maxPossibleDist, maxDist));
222 if (minPossibleDist == endPosDistRandMax)
223 endPosDist = minPossibleDist;
225 endPosDist =
Math.RandomFloatInclusive(minPossibleDist, endPosDistRandMax);
228 vector endPos = startPos + (sideDir * endPosDist);
231 float endPosMinY, endPosMaxY;
235 float endPosY =
Math.Max(
Math.Min(endPos[1], endPosMaxY), endPosMinY);
238 float endPosYTopRange = endPosMaxY - endPosY;
239 float endPosYBottomRange = endPosY - endPosMinY;
243 float endPosYRange = endPosYTopRange;
250 if (minYDiff >
Math.Max(endPosYTopRange, endPosYBottomRange))
253 if (endPosYBottomRange > endPosYTopRange / 2)
256 minYDiff = endPosYBottomRange;
264 if (minYDiff > endPosYTopRange)
265 minYDiff = endPosYTopRange;
268 endPosYRange = minYDiff;
273 if (endPosYBottomRange > minYDiff &&
274 (endPosYTopRange < minYDiff ||
Math.RandomFloat01() < (endPosYBottomRange / (endPosYBottomRange + endPosYTopRange))))
277 endPosYRange = endPosYBottomRange;
282 float endYRange =
Math.Max(maxYDiff,
Math.Min(endPosYRange - minYDiff, maxYDiff - minYDiff));
284 endPos[1] = endPosY + (
Math.RandomFloatInclusive(minYDiff, endYRange) * endPosYDir);