Ejemplo n.º 1
0
    public static RectEdgePosition CalculateRandomXZEdge(this Rect rect, Vector3 offset, RectEdge edge)
    {
        RectEdgePosition edgePosition = rect.CalculateRandomXZEdge(edge);

        edgePosition.Position = edgePosition.Position + offset;
        return(edgePosition);
    }
        public override void Run(RunPayload payload)
        {
            if (!GetObjectReferences())
            {
                return;
            }

            SaveSpawnPositions(lance);
            Main.Logger.Log($"[SpawnLanceAtEdgeOfBoundary] Attemping for '{lance.name}'. Attempt: '{AttemptCount}/{AttemptCountMax}' and Edge Check: '{EdgeCheckCount}/{EdgeCheckMax}'");
            AttemptCount++;

            Init();

            CombatGameState combatState                   = UnityGameInstance.BattleTechGame.Combat;
            MissionControl  EncounterManager              = MissionControl.Instance;
            GameObject      chunkBoundaryRect             = EncounterManager.EncounterLayerGameObject.transform.Find("Chunk_EncounterBoundary").gameObject;
            GameObject      boundary                      = chunkBoundaryRect.transform.Find("EncounterBoundaryRect").gameObject;
            EncounterBoundaryChunkGameLogic chunkBoundary = chunkBoundaryRect.GetComponent <EncounterBoundaryChunkGameLogic>();
            EncounterBoundaryRectGameLogic  boundaryLogic = boundary.GetComponent <EncounterBoundaryRectGameLogic>();
            Rect             boundaryRec                  = chunkBoundary.GetEncounterBoundaryRectBounds();
            Rect             usableBounds                 = boundaryRec.GenerateUsableBoundary();
            RectEdgePosition xzEdge = usableBounds.CalculateRandomXZEdge(boundary.transform.position, edge);

            Vector3 lancePosition    = lance.transform.position.GetClosestHexLerpedPointOnGrid();
            Vector3 newSpawnPosition = new Vector3(xzEdge.Position.x, lancePosition.y, xzEdge.Position.z);

            newSpawnPosition         = GetClosestValidPathFindingHex(lance, newSpawnPosition, $"NewSpawnPosition.{lance.name}", IsLancePlayerLance(lanceKey) ? orientationTarget.transform.position : Vector3.zero, 2);
            lance.transform.position = newSpawnPosition;

            Main.LogDebug($"[SpawnLanceAtEdgeBoundary] Attempting to spawn lance at point on lerped grid '{newSpawnPosition}'");

            if (useOrientationTarget)
            {
                RotateToTarget(lance, orientationTarget);
            }

            if (!useMiniumDistance || IsWithinBoundedDistanceOfTarget(newSpawnPosition, validOrientationTargetPosition, minimumDistance))
            {
                List <GameObject> invalidLanceSpawns = GetInvalidLanceMemberSpawns(lance, validOrientationTargetPosition);

                if (invalidLanceSpawns.Count > 0)
                {
                    if (AttemptCount > AttemptCountMax) // Attempt to spawn on the selected edge. If it's not possible, select another edge
                    {
                        edge = RectExtensions.RectEdge.ANY;
                        if (EdgeCheckCount >= EdgeCheckMax)
                        {
                            HandleFallback(payload, this.lanceKey, this.orientationTargetKey);
                            return;
                        }
                    }

                    if (invalidLanceSpawns.Count <= 2)
                    {
                        Main.Logger.Log($"[SpawnLanceAtEdgeOfBoundary] Fitting invalid lance member spawns");
                        foreach (GameObject invalidSpawn in invalidLanceSpawns)
                        {
                            SpawnLanceMember(invalidSpawn, lance.transform.position);
                        }

                        Main.Logger.Log("[SpawnLanceAtEdgeOfBoundary] Lance spawn complete");
                    }
                    else
                    {
                        CheckAttempts();
                        Run(payload);
                    }
                }
                else
                {
                    CorrectLanceMemberSpawns(lance);
                    Main.Logger.Log("[SpawnLanceAtEdgeOfBoundary] Lance spawn complete");
                }
            }
            else
            {
                CheckAttempts();
                Main.LogDebug("[SpawnLanceAtEdgeOfBoundary] Spawn is too close to the target. Selecting a new spawn.");
                edge = xzEdge.Edge;
                Run(payload);
            }
        }