private void UpdateArea(MapArea area, DynamicUpdateState gameTime) { foreach (var entity in area.Enumerate()) { entity.Update(gameTime); } }
/// <summary> /// Perform AI operations... /// </summary> /// <param name="gameTime"></param> public override void Update(DynamicUpdateState gameTime) { lock (_syncRoot) { if (gameTime.ElapsedTime.TotalSeconds < 2) { return; } if (gameTime.ElapsedTime.TotalSeconds > 100) { return; } Movement.Update(gameTime); Focus.Update(gameTime); if (GeneralAI == null) { return; } GeneralAI.AISelect(); GeneralAI.DoAction(); } }
// update dynamic entities private void UpdateDynamic(object o) { if (Monitor.TryEnter(_areaManagerSyncRoot)) { try { var state = new DynamicUpdateState { ElapsedTime = _lastUpdate == new UtopiaTime() ? UtopiaTimeSpan.Zero : _server.Clock.Now - _lastUpdate, CurrentTime = _server.Clock.Now }; state.RealTime = _server.Clock.GameToReal(state.ElapsedTime); _lastUpdate = _server.Clock.Now; Update(state); } finally { Monitor.Exit(_areaManagerSyncRoot); } } else { logger.Warn("Warning! Server is overloaded. Try to decrease dynamic entities count"); } }
public void Update(DynamicUpdateState gameTime) { var elapsedS = (float)gameTime.RealTime.TotalSeconds; Vector3D newPos; VerletSimulator.Simulate(elapsedS, out newPos); Npc.DynamicEntity.Position = newPos; VerletSimulator.CurPosition = Npc.DynamicEntity.Position; if (IsMoving) { if (Vector3D.DistanceSquared(_pathTargetPoint, Npc.DynamicEntity.Position) < 0.1d) { FollowNextPoint(); } _moveDirection = _pathTargetPoint - Npc.DynamicEntity.Position; _jump = _moveDirection.Y > 0; _moveDirection.Y = 0; //if (Vector3D.DistanceSquared(VerletSimulator.PrevPosition, VerletSimulator.CurPosition) < 0.01f) //{ // if (Math.Abs(_moveDirection.X) < Math.Abs(_moveDirection.Z)) // _moveDirection.Z = 0.1f * Math.Sign(_moveDirection.Z); // else // _moveDirection.X = 0.1f * Math.Sign(_moveDirection.X); //} _moveDirection.Normalize(); VerletSimulator.Impulses.Add(new Impulse(elapsedS) { ForceApplied = _moveDirection.AsVector3() * Npc.DynamicEntity.MoveSpeed * (_runAway ? 2f : 1f) }); if (_jump && VerletSimulator.OnGround) { VerletSimulator.Impulses.Add(new Impulse(elapsedS) { ForceApplied = Vector3.UnitY * 22 }); } } if (_leader != null && Vector3D.Distance(_leader.Position, Npc.DynamicEntity.Position) > FollowStayDistance) { if (IsMoving && Vector3D.Distance(new Vector3D(_path.Goal) + CubeCenter, _leader.Position) < FollowStayDistance) { return; } MoveTo(_leader.Position.ToCubePosition()); } }
public void Update(DynamicUpdateState gameTime) { { if (Target != null) { var lookDirection = Target.Position - Npc.DynamicEntity.Position; lookDirection.Normalize(); Npc.DynamicEntity.HeadRotation = Quaternion.RotationMatrix(Matrix.LookAtLH(Npc.DynamicEntity.Position.AsVector3(), Npc.DynamicEntity.Position.AsVector3() + lookDirection.AsVector3(), Vector3D.Up.AsVector3())); } } }
public void Update(DynamicUpdateState gameTime) { OnBeforeUpdate(); //foreach (var mapArea in _areas) //{ // UpdateArea(mapArea.Value, gameTime); //} Parallel.ForEach(_areas, a => UpdateArea(a.Value, gameTime)); OnAfterUpdate(); }
/// <summary> /// Perform dynamic update (AI logic) /// </summary> public virtual void Update(DynamicUpdateState gameTime) { }