Example #1
0
 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);
             }
         }
     }
 }
Example #2
0
        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);
        }
Example #3
0
        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);
            }
        }
Example #4
0
        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);
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #8
0
        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();
        }