| 213 | } |
| 214 | |
| 215 | static Vector3 GetFishStartPosition(const ItemInfo& item) |
| 216 | { |
| 217 | constexpr auto BUFFER = BLOCK(0.1f); |
| 218 | constexpr auto SPHEROID_SEMI_MAJOR_AXIS = Vector3(BLOCK(2), BLOCK(1), BLOCK(5)); |
| 219 | |
| 220 | auto pos = Random::GeneratePointInSpheroid(item.StartPose.Position.ToVector3(), EulerAngles::Identity, SPHEROID_SEMI_MAJOR_AXIS); |
| 221 | |
| 222 | // Get point collision. |
| 223 | auto pointColl = GetPointCollision(pos, item.RoomNumber); |
| 224 | |
| 225 | // 1) Test for water room. |
| 226 | if (!TestEnvironment(ENV_FLAG_WATER, pointColl.GetRoomNumber())) |
| 227 | return Vector3::Zero; |
| 228 | |
| 229 | // 2) Assess point collision. |
| 230 | if (pos.y >= (pointColl.GetFloorHeight() - BUFFER) || |
| 231 | pos.y <= (pointColl.GetWaterTopHeight() + BUFFER) || |
| 232 | pointColl.GetSector().IsWall(item.Pose.Position.x + BUFFER, item.Pose.Position.z + BUFFER) || |
| 233 | pointColl.GetSector().IsWall(item.Pose.Position.x - BUFFER, item.Pose.Position.z - BUFFER)) |
| 234 | { |
| 235 | return Vector3::Zero; |
| 236 | } |
| 237 | |
| 238 | return pos; |
| 239 | } |
| 240 | |
| 241 | void UpdateFishSwarm() |
| 242 | { |
no test coverage detected