Exemplo n.º 1
0
    public void HandlePathFindingInput(Vector3 blockCenter, int3 block)
    {
        if (!didStartPathFinding)
        {
            didStartPathFinding = true;
            Vector3 pos = Utils.CentrifyPosition(new Vector3(transform.position.x, transform.position.y + 0.5f, transform.position.z));
            currentPathFinding = new PathFinding(pos, blockCenter);
            if (isOnManualPathFinding)
            {
                var moves = currentPathFinding.OpenPossibleNewMoves(pos);
                RemoveFromBlocksUIIfExists(moves);
                foreach (var node in moves)
                {
                    var bUI = BlockUI.Create(Utils.WorldBlockPosForCenter(node.pos), int3.zero, String.Format("{0}\n{1}\n{2}", node.startValue, node.value, node.endValue));
                    blocksUI.Add(bUI);
                }
                var sbUI = BlockUI.Create(Utils.WorldBlockPosForCenter(pos), int3.zero, "Start");
                sbUI.ToggleSelection();
                blocksUI.Add(sbUI);
                var fbUI = BlockUI.Create(Utils.WorldBlockPosForCenter(blockCenter), int3.zero, "Finish");
                fbUI.ToggleSelection();
                blocksUI.Add(fbUI);
            }
            else
            {
                StartCoroutine(currentPathFinding.BuildPathToTarget(() =>
                {
                    if (currentPathFinding.isClosed)
                    {
                        foreach (var bbbUI in blocksUI)
                        {
                            GameObject.Destroy(bbbUI.gameObject);
                        }
                        foreach (var node in currentPathFinding.pathNodes)
                        {
                            var bbUI = BlockUI.Create(Utils.WorldBlockPosForCenter(node.pos), int3.zero, String.Format("{0}\n{1}\n{2}", node.startValue, node.value, node.endValue));
                            blocksUI.Add(bbUI);
                        }
                        var sbUI = BlockUI.Create(Utils.WorldBlockPosForCenter(currentPathFinding.startPos), int3.zero, "Start");
                        sbUI.ToggleSelection();
                        blocksUI.Add(sbUI);
                        var fbUI = BlockUI.Create(Utils.WorldBlockPosForCenter(currentPathFinding.endPos), int3.zero, "Finish");
                        fbUI.ToggleSelection();
                        blocksUI.Add(fbUI);
                    }
                    else
                    {
                        var poppedBottom = currentBlockDestroying.PopBottomBlock();
                        selectionController.Deselect();
                        aiState.mode = AIStateMode.Idle;
                        currentBlockDestroying.UpdateDestroyBlockQueueUI();
                    }
                }));
            }
        }
        else if (blocksUI.Find(b => b.pos.Equals(blockCenter)) != null)
        {
            var n   = currentPathFinding.SuggestNextNode();
            var bUI = blocksUI.Find(b => b.pos.Equals(n.pos));
            bUI.ToggleSelection();
            var moves = currentPathFinding.OpenPossibleNewMoves(bUI.pos, n);

            RemoveFromBlocksUIIfExists(moves);
            foreach (var node in moves)
            {
                var bbUI = BlockUI.Create(Utils.WorldBlockPosForCenter(node.pos), int3.zero, String.Format("{0}\n{1}\n{2}", node.startValue, node.value, node.endValue));
                blocksUI.Add(bbUI);
            }
            if (currentPathFinding.CheckIfEnd(n))
            {
                foreach (var bbbUI in blocksUI)
                {
                    GameObject.Destroy(bbbUI.gameObject);
                }
                foreach (var node in currentPathFinding.pathNodes)
                {
                    var bbUI = BlockUI.Create(Utils.WorldBlockPosForCenter(node.pos), int3.zero, String.Format("{0}\n{1}\n{2}", node.startValue, node.value, node.endValue));
                    blocksUI.Add(bbUI);
                }
                var sbUI = BlockUI.Create(Utils.WorldBlockPosForCenter(currentPathFinding.startPos), int3.zero, "Start");
                sbUI.ToggleSelection();
                blocksUI.Add(sbUI);
                var fbUI = BlockUI.Create(Utils.WorldBlockPosForCenter(currentPathFinding.endPos), int3.zero, "Finish");
                fbUI.ToggleSelection();
                blocksUI.Add(fbUI);
            }
        }
        else
        {
            didStartPathFinding = false;
            foreach (var bUI in blocksUI)
            {
                GameObject.Destroy(bUI.gameObject);
            }
            blocksUI = new List <BlockUI>();
        }
    }
Exemplo n.º 2
0
 void Update()
 {
     if (clearAll)
     {
         clearAll = false;
         currentBlockDestroying.ClearQueue();
         aiState.mode = AIStateMode.Idle;
         currentPathFinding.Clear();
         didStartPathFinding = false;
         foreach (var bUI in blocksUI)
         {
             GameObject.Destroy(bUI.gameObject);
         }
         blocksUI = new List <BlockUI>();
     }
     if (!currentBlockDestroying.hasBlocksToDestroy)
     {
         selectionController.Deselect();
     }
     if (currentBlockDestroying.hasBlocksToDestroy && isIdleing)
     {
         int3x3  data          = currentBlockDestroying.nextBlockData.Value;
         int3    block         = currentBlockDestroying.nextBlock.Value;
         int3    blockHealth   = currentBlockDestroying.nextBlockHealth.Value;
         int3    blockWorldPos = currentBlockDestroying.nextBlockWorldPos.Value;
         Vector3 blockCenter   = Utils.CenterOfBlockWithWorldPos(blockWorldPos);
         if (Utils.IsTargetReachable(transform.position, blockCenter))
         {
             // start destroying
             int maxHp = Mathf.RoundToInt(Block.GetMaxHealth(block));
             ModifyBlockHealth(data, 0, new int3(maxHp, maxHp, 0));
             int3 coord = Utils.CoordByPosition(blockCenter);
             selectionController.SelectBlockAt(block, blockWorldPos);
             StartCoroutine(DestroyBlock(() =>
             {
                 int4 chunkPos = Utils.ChunkPosbyPosition(blockCenter);
                 Chunk chunk   = WorldSettings.Chunks[chunkPos];
                 int index     = Utils.to1D(coord);
                 if (chunk.CanDestroyBlockAt(index))
                 {
                     Block b = chunk.DestroyBlockAt(index);
                     foreach (Item i in b.DropItems())
                     {
                         inventory.Add(i);
                     }
                 }
                 ;
             }));
         }
         else
         {
             //move closer
             aiState.mode = AIStateMode.MoveToTarget;
             Vector3?closestPathPos     = null;
             var     availablePathNodes = PathFinding.ClosestPathBlockTowardsPos(blockCenter, transform.position);
             if (availablePathNodes.Count > 0)
             {
                 closestPathPos = availablePathNodes[0].pos;
             }
             if (closestPathPos != null)
             {
                 var pathFinding = new PathFinding(new Vector3(transform.position.x, transform.position.y + 0.5f, transform.position.z), closestPathPos.Value);
                 StartCoroutine(pathFinding.BuildPathToTarget(() =>
                 {
                     if (pathFinding.isClosed)
                     {
                         aiState.mode = AIStateMode.MoveToTarget;
                         playerMovement.ReachToPoint(closestPathPos.Value, pathFinding);
                     }
                     else
                     {
                         var poppedBottom = currentBlockDestroying.PopBottomBlock();
                         selectionController.Deselect();
                         aiState.mode = AIStateMode.Idle;
                         currentBlockDestroying.UpdateDestroyBlockQueueUI();
                     }
                 }));
             }
             else
             {
                 var poppedBottom = currentBlockDestroying.PopBottomBlock();
                 selectionController.Deselect();
                 aiState.mode = AIStateMode.Idle;
                 currentBlockDestroying.UpdateDestroyBlockQueueUI();
             }
         }
     }
     ;
 }