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(); } }
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; } }