Пример #1
0
        public override void UpdateBeforeSimulation()
        {
            ticks++;
            if (ticks == 5)
            {
                try {
                    loadSettings();
                }
                catch (Exception ex) {
                    MyLog.Default.WriteLine("caught excetion while loading settings: " + ex);
                }
            }

            if (ticks < 6)
            {
                return;
            }

            updateNPCSpawn();
            updateNPCList();
            updateMode(block);
            updateInput();
            checkDeleteMarker();

            switch (selectedMode)
            {
            case NPCMode.patrol:
                updatePatrols(block);
                break;

            case NPCMode.attack:
                attackPointOrder(block);
                break;

            case NPCMode.stand:
                standAtPoint(block);
                NPCBasicMover.drawDebugLine(this.block.WorldMatrix.Translation, localToWorldPos(block, standPoint),
                                            Color.Gold);
                break;

            case NPCMode.follow:
                followPlayer(block);
                break;
            }

            updateTerminalInformation();

            if (ticks % 600 == 0)
            {
                saveSettings();
            }
        }
Пример #2
0
        private void updateMovement()
        {
            bool hasTarget = !CurrentMovementTarget.Equals(Vector3.Zero);


            var grid            = animator.grid;
            var gridWorldMatrix = grid.WorldMatrix;

            var ownPos = grid.WorldMatrix.Translation;
            var down   = grid.Physics.Gravity;

            down.Normalize();
            if (relativeTo != null)
            {
                NPCBasicMover.drawDebugLine(ownPos, CurrentMovementTarget, Color.Gold);
            }

            if (Vector3.Distance(CurrentMovementTarget, ownPos) < 1f)
            {
                hasTarget = false;
            }

            var downRayTarget = ownPos + down * 1.5f;
            var forwardDir    = gridWorldMatrix.Backward;

            List <IHitInfo> hits     = new List <IHitInfo>();
            var             skipCast = true;

            if (MainNPCLoop.ticks % 10 == 0 || cachedSurfaceHit == null)
            {
                //TODO raycasts parallel/async using asyncraycast or parallelfor later
                MyAPIGateway.Physics.CastRay(ownPos - down * 0.3f, downRayTarget, hits);
                skipCast = false;
                flying   = hits.Count == 0;
            }

            if ((hits.Count > 0 || skipCast) && !flying)
            {
                doValidMoment(skipCast, hits, grid, forwardDir, hasTarget, ownPos);
            }
            else
            {
                animator.relativeMoveSpeed = 0f;
            }
        }