private void PhysicsWorker() { while (NetworkWorkerThread.IsAlive) { if (nextPhysicsUpdate < DateTime.Now) { //We need to wait for a login packet to initialize the physics subsystem if (World != null && engine == null) { // 50 ms / update for 20 ticks per second engine = new PhysicsEngine(World.World, Block.PhysicsProvider, 50); engine.AddEntity(this); } nextPhysicsUpdate = DateTime.Now.AddMilliseconds(50); try { engine.Update(); } catch (Exception) { // Sometimes the world hasn't loaded yet, so the Phyics update can't properly read blocks and // throws an exception. } } else { var sleepTime = (nextPhysicsUpdate - DateTime.Now).Milliseconds; if (sleepTime > 0) { Thread.Sleep(sleepTime); } } } }
public void TestAdjacentFall() { // Tests an entity that falls alongside a wall var repository = GetBlockRepository(); var world = new TrueCraft.Core.World.World("default", new FlatlandGenerator()); var physics = new PhysicsEngine(world, repository); var entity = new TestEntity(); entity.Position = new Vector3(0, 10, 0); entity.AccelerationDueToGravity = 1; physics.AddEntity(entity); // Create a wall for (int y = 0; y < 12; y++) { world.SetBlockID(new Coordinates3D(1, y, 0), StoneBlock.BlockID); } // Test physics.Update(TimeSpan.FromSeconds(1)); Assert.AreEqual(9, entity.Position.Y); Assert.IsFalse(entity.CollisionOccured); }
public void SpawnEntity(IEntity entity) { if (entity.Despawned) { return; } entity.SpawnTime = DateTime.UtcNow; entity.EntityManager = this; entity.World = World; entity.EntityId = NextEntityID++; entity.PropertyChanged -= HandlePropertyChanged; entity.PropertyChanged += HandlePropertyChanged; lock (_lock) Entities.Add(entity); foreach (var clientEntity in GetEntitiesInRange(entity, 8)) // Note: 8 is pretty arbitrary here { if (clientEntity != entity && clientEntity is PlayerEntity) { var client = (RemoteClient)GetClientForEntity((PlayerEntity)clientEntity); SendEntityToClient(client, entity); } } if (entity is IPhysicsEntity) { PhysicsEngine.AddEntity(entity as IPhysicsEntity); } }
public void TestExtremeTerrainCollision() { var repository = GetBlockRepository(); var world = new TrueCraft.Core.World.World("default", new FlatlandGenerator()); var physics = new PhysicsEngine(world, repository); var entity = new TestEntity(); entity.Position = new Vector3(0, 4, 0); entity.AccelerationDueToGravity = 10; physics.AddEntity(entity); // Test physics.Update(TimeSpan.FromSeconds(1)); Assert.AreEqual(4, entity.Position.Y); }
public void TestDrag() { var repository = GetBlockRepository(); var world = new TrueCraft.Core.World.World("default", new FlatlandGenerator()); var physics = new PhysicsEngine(world, repository); var entity = new TestEntity(); entity.Position = new Vector3(0, 100, 0); entity.AccelerationDueToGravity = 0; entity.Drag = 0.5f; entity.Velocity = Vector3.Down * 2; physics.AddEntity(entity); // Test physics.Update(TimeSpan.FromSeconds(1)); Assert.AreEqual(99, entity.Position.Y); }
public void TestHorizontalCollision() { var repository = GetBlockRepository(); var world = new TrueCraft.Core.World.World("default", new FlatlandGenerator()); var physics = new PhysicsEngine(world, repository); var entity = new TestEntity(); entity.Position = new Vector3(0, 5, 0); entity.AccelerationDueToGravity = 0; entity.Drag = 0; entity.Velocity = new Vector3(1, 0, 0); physics.AddEntity(entity); world.SetBlockID(new Coordinates3D(1, 5, 0), StoneBlock.BlockID); // Test physics.Update(TimeSpan.FromSeconds(1)); Assert.AreEqual(0, entity.Position.X); }
public void TestCollisionPoint() { var repository = GetBlockRepository(); var world = new TrueCraft.World.World("default", new FlatlandGenerator()); var physics = new PhysicsEngine(world, repository); var entity = new TestEntity(); entity.Position = new Vector3(0, 5, 0); entity.AccelerationDueToGravity = 1; entity.Drag = 0; physics.AddEntity(entity); world.SetBlockId(new Coordinates3D(0, 4, 0), StoneBlock.BlockId); // Test physics.Update(TimeSpan.FromSeconds(1)); Assert.AreEqual(new Vector3(0, 4, 0), entity.CollisionPoint); }
public override void Initialize() { if (Entity != null) { GameObjectInfo info = new GameObjectInfo() { ID = Manager.Owner.ID, ObjectType = Manager.Owner.GetType() }; Entity.Tag = info; Entity.CollisionInformation.Tag = info; } if (Entity != null) { PhysicsEngine.AddEntity(Entity); } base.Initialize(); }