コード例 #1
0
        public void LiveWhenOwnerGoAwayEntity_GetHandOver_WhenAllOwnerRemoved_Entity()
        {
            // Arrange

            var           s  = TestZoneBuilder.Build();
            IServerEntity so = null;

            s.ServerZone.RunAction(z => so = z.Spawn(typeof(ISpaceShip), 1, EntityFlags.LiveWhenOwnerGoAway));

            // Act

            s.RemoveClient(1);
            s.RemoveClient(2);
            s.AddClient();

            // Assert

            var s2 = s.ServerZone.GetEntity(so.Id);

            Assert.NotNull(s2);
            Assert.Equal(3, s2.OwnerId);

            var c2 = s.ClientZones[0].GetEntity(so.Id);

            Assert.NotNull(c2);
            Assert.Equal(3, c2.OwnerId);
        }
コード例 #2
0
            public void Gather(IServerEntity entity)
            {
                var e = (SpaceShipServerBase)entity;

                Data     = e.Data;
                Snapshot = e.OnSnapshot();
            }
コード例 #3
0
ファイル: EntityTimerTest.cs プロジェクト: qipa/EntityNetwork
        private void ServerEntity_SetTimerRepeatedly()
        {
            // Arrange

            var           s = TestZoneBuilder.Build();
            IServerEntity o = null;

            s.ServerZone.RunAction(z => { o = z.Spawn(typeof(IBullet), 0); });

            // Act & Assert

            var callCount = 0;

            o.SetTimerRepeatedly(1, TimeSpan.FromSeconds(1), (e, t) =>
            {
                Assert.Equal(e, o);
                Assert.Equal(1, t);
                callCount += 1;
            });

            s.UpdateTime(TimeSpan.FromSeconds(1));
            Assert.Equal(1, callCount);

            s.UpdateTime(TimeSpan.FromSeconds(1));
            Assert.Equal(2, callCount);
        }
コード例 #4
0
ファイル: EntityTimerTest.cs プロジェクト: qipa/EntityNetwork
        private void ServerEntity_RemoveTimerAll()
        {
            // Arrange

            var           s = TestZoneBuilder.Build();
            IServerEntity o = null;

            s.ServerZone.RunAction(z => { o = z.Spawn(typeof(IBullet), 0); });

            // Act & Assert

            var called1 = false;
            var called2 = false;

            o.SetTimerOnce(1, TimeSpan.FromSeconds(1), (e, t) =>
            {
                called1 = true;
            });
            o.SetTimerOnce(2, TimeSpan.FromSeconds(1), (e, t) =>
            {
                called2 = true;
            });

            o.RemoveTimerAll();
            s.UpdateTime(TimeSpan.FromSeconds(1));

            Assert.False(called1);
            Assert.False(called2);
        }
コード例 #5
0
        public void ChangeOwnership()
        {
            // Arrange

            var           s  = TestZoneBuilder.Build();
            IServerEntity so = null;

            s.ServerZone.RunAction(z => so = z.Spawn(typeof(ISpaceShip), 1));

            // Act

            s.ServerZone.RunAction(z => z.SetEntityOwnership(so.Id, 2));

            // Assert

            var s2 = s.ServerZone.GetEntity(so.Id);

            Assert.NotNull(s2);
            Assert.Equal(2, s2.OwnerId);

            var c2 = s.ClientZones[0].GetEntity(so.Id);

            Assert.NotNull(c2);
            Assert.Equal(2, c2.OwnerId);
        }
コード例 #6
0
            public void Gather(IServerEntity entity)
            {
                var e = (SpaceShipServerBase)entity;

                if (e.Data.Changed)
                {
                    DataTracker = (TrackablePocoTracker <ISpaceShipData>)e.Data.Tracker;
                }
            }
コード例 #7
0
 /// <summary>
 /// Constructs a game entity
 /// </summary>
 /// <param name="serverEntity"></param>
 public AGameEntity(IServerEntity serverEntity)
 {
     if (serverEntity == null)
     {
         throw new ArgumentNullException(nameof(serverEntity));
     }
     if (!serverEntity.IsValid)
     {
         throw new ArgumentException("Server entity is not valid.", nameof(serverEntity));
     }
     ServerEntity = serverEntity;
 }
コード例 #8
0
        public void OwnedEntity_AutoDespawn_WhenOwnerRemoved_Entity()
        {
            // Arrange

            var           s  = TestZoneBuilder.Build();
            IServerEntity so = null;

            s.ServerZone.RunAction(z => so = z.Spawn(typeof(ISpaceShip), 1));

            // Act

            s.RemoveClient(1);

            // Assert

            Assert.Null(s.ServerZone.GetEntity(so.Id));
        }
コード例 #9
0
        public void Spawn_SingletonEntity_When_NoExists_Succeed()
        {
            // Arrange

            var s = TestZoneBuilder.Build();

            // Act

            IServerEntity so = null;

            s.ServerZone.RunAction(z => so = z.Spawn(typeof(IEarth), 1));

            // Assert

            Assert.NotNull(so);
            Assert.IsType <ServerEarth>(so);
        }
コード例 #10
0
        public void Client_CallToServer_Called()
        {
            // Arrange

            var           s  = TestZoneBuilder.Build();
            IServerEntity so = null;

            s.ServerZone.RunAction(z => so = z.Spawn(typeof(ISpaceShip), 1));

            // Act

            s.ClientZones[0].RunAction(z => ((ClientSpaceShip)z.GetEntity(so.Id)).Shoot(1, 2));

            // Assert

            Assert.Equal(Tuple.Create(so.Id, "OnShoot(1, 2)"),
                         s.ServerZone.Log(-1));
        }
コード例 #11
0
        public void NonOwner_CanCall_Entity_WhenEntityMethodHasAnyoneCanCallAttribute()
        {
            // Arrange

            var           s  = TestZoneBuilder.Build();
            IServerEntity so = null;

            s.ServerZone.RunAction(z => so = z.Spawn(typeof(IBullet), 1));

            // Act

            s.ClientZones[1].RunAction(z => ((ClientBullet)z.GetEntity(so.Id)).Tag("Silver"));

            // Assert

            Assert.Equal(Tuple.Create(so.Id, "OnTag(Silver)"),
                         s.ServerZone.Log(-1));
        }
コード例 #12
0
        public void NonOwner_CanControl_Entity_WhenEntityHasAnyoneCanControlFlag()
        {
            // Arrange

            var           s  = TestZoneBuilder.Build();
            IServerEntity so = null;

            s.ServerZone.RunAction(z => so = z.Spawn(typeof(ISpaceShip), 1, EntityFlags.AnyoneCanControl));

            // Act

            s.ClientZones[1].RunAction(z => ((ClientSpaceShip)z.GetEntity(so.Id)).Shoot(1, 2));

            // Assert

            Assert.Equal(Tuple.Create(so.Id, "OnShoot(1, 2)"),
                         s.ServerZone.Log(-1));
        }
コード例 #13
0
        public void NonOwner_CannotControl_Entity()
        {
            // Arrange

            var           s  = TestZoneBuilder.Build();
            IServerEntity so = null;

            s.ServerZone.RunAction(z => so = z.Spawn(typeof(ISpaceShip), 1));

            // Act

            s.ClientZones[1].RunAction(z => ((ClientSpaceShip)z.GetEntity(so.Id)).Shoot(1, 2));

            // Assert

            Assert.Equal(Tuple.Create(so.Id, "InvalidOwnershipInvoke"),
                         s.ServerZone.Log(-1));
        }
コード例 #14
0
        public void Spawn_ServerOnlyEntity_WhenAddNewClient_ClientCannotSee()
        {
            // Arrange

            var s = TestZoneBuilder.Build();

            // Act

            IServerEntity so = null;

            s.ServerZone.RunAction(z => so = z.Spawn(typeof(IMonitor), 0));
            var zone = s.AddClient();

            // Assert

            var co = zone.Value.GetEntity(so.Id);

            Assert.Null(co);
        }
コード例 #15
0
        public void AddClient_AddedClientZone_Synced()
        {
            // Arrange

            var           s  = TestZoneBuilder.Build();
            IServerEntity so = null;

            s.ServerZone.RunAction(z => so = z.Spawn(typeof(ISpaceShip), 1, EntityFlags.Normal));

            // Act

            var zone = s.AddClient();

            // Assert

            var co = zone.Value.GetEntity(so.Id);

            Assert.NotNull(co);
            Assert.IsType <ClientSpaceShip>(co);
        }
コード例 #16
0
        public void Client_CallPassThrough_Called()
        {
            // Arrange

            var           s  = TestZoneBuilder.Build();
            IServerEntity so = null;

            s.ServerZone.RunAction(z => so = z.Spawn(typeof(ISpaceShip), 1, EntityFlags.Normal));

            // Act

            s.ClientZones[0].RunAction(z => ((ClientSpaceShip)z.GetEntity(so.Id)).Say("Hello"));

            // Assert

            foreach (var clientZone in s.ClientZones)
            {
                Assert.Equal(Tuple.Create(so.Id, "OnSay(Hello)"),
                             clientZone.Log(-1));
            }
        }
コード例 #17
0
ファイル: EntityDataTest.cs プロジェクト: qipa/EntityNetwork
        public void Change_TrackableData_Synced()
        {
            // Arrange

            var           s  = TestZoneBuilder.Build();
            IServerEntity so = null;

            s.ServerZone.RunAction(z => so = z.Spawn(typeof(ISpaceShip), 1, EntityFlags.Normal));

            // Act

            s.ClientZones[0].RunAction(z => ((ClientSpaceShip)z.GetEntity(so.Id)).Shoot(1, 2));

            // Assert

            foreach (var clientZone in s.ClientZones)
            {
                var clientEntity = (ClientSpaceShip)clientZone.GetEntity(so.Id);
                Assert.Equal(1, clientEntity.Data.Score);
            }
        }
コード例 #18
0
        public void Server_CallToClient_Called()
        {
            // Arrange

            var           s  = TestZoneBuilder.Build();
            IServerEntity so = null;

            s.ServerZone.RunAction(z => so = z.Spawn(typeof(ISpaceShip), 1, EntityFlags.Normal));

            // Act

            s.ServerZone.RunAction(z => ((ServerSpaceShip)so).Hit(1, 2));

            // Assert

            foreach (var clientZone in s.ClientZones)
            {
                Assert.Equal(Tuple.Create(so.Id, "OnHit(1, 2)"),
                             clientZone.Log(-1));
            }
        }
コード例 #19
0
ファイル: EntityDataTest.cs プロジェクト: qipa/EntityNetwork
        public void Spawn_Snapshot_Synced()
        {
            // Arrange

            var           s  = TestZoneBuilder.Build();
            IServerEntity so = null;

            // Act

            s.ServerZone.RunAction(z => so = z.Spawn(typeof(ISpaceShip), 1, EntityFlags.Normal, "Enterprise"));

            // Assert

            foreach (var clientZone in s.ClientZones)
            {
                Assert.Equal(Tuple.Create(so.Id, "OnSnapshot(Enterprise)"),
                             clientZone.Log(-2));
                Assert.Equal(Tuple.Create(so.Id, "Spawn"),
                             clientZone.Log(-1));
            }
        }
コード例 #20
0
        public void Spawn_ServerOnlyEntity_WhenSpawn_ClientCannotSee()
        {
            // Arrange

            var s = TestZoneBuilder.Build();

            // Act

            IServerEntity so = null;

            s.ServerZone.RunAction(z => so = z.Spawn(typeof(IMonitor), 0));
            Assert.NotNull(so);
            Assert.IsType <ServerMonitor>(so);

            // Assert

            foreach (var clientZone in s.ClientZones)
            {
                IClientEntity co = clientZone.GetEntity(so.Id);
                Assert.Null(co);
            }
        }
コード例 #21
0
ファイル: EntityTimerTest.cs プロジェクト: qipa/EntityNetwork
        private void ServerEntity_SetTimerOnce()
        {
            // Arrange

            var           s = TestZoneBuilder.Build();
            IServerEntity o = null;

            s.ServerZone.RunAction(z => { o = z.Spawn(typeof(IBullet), 0); });

            // Act & Assert

            var called = false;

            o.SetTimerOnce(1, TimeSpan.FromSeconds(1), (e, t) =>
            {
                Assert.Equal(e, o);
                Assert.Equal(1, t);
                called = true;
            });
            s.UpdateTime(TimeSpan.FromSeconds(1));
            Assert.True(called);
        }
コード例 #22
0
        public void Spawn_SyncedToClient()
        {
            // Arrange

            var s = TestZoneBuilder.Build();

            // Act

            IServerEntity so = null;

            s.ServerZone.RunAction(z => so = z.Spawn(typeof(IBullet), 1));
            Assert.NotNull(so);
            Assert.IsType <ServerBullet>(so);

            // Assert

            foreach (var clientZone in s.ClientZones)
            {
                IClientEntity co = clientZone.GetEntity(so.Id);
                Assert.NotNull(co);
                Assert.IsType <ClientBullet>(co);
            }
        }
コード例 #23
0
 public void CalculateDelta(BinaryWriter writer, IServerEntity fromOther)
 {
 }
コード例 #24
0
        public void CalculateDelta(BinaryWriter writer, IServerEntity fromOther)
        {
            const float Tolerance = 0.001f;

            var fromPlayer = (PlayerServerEntity)fromOther;

            writer.Write(Math.Abs(this.X - fromPlayer.X) > Tolerance);
            if (Math.Abs(this.X - fromPlayer.X) > Tolerance)
            {
                writer.Write(this.X);
            }

            writer.Write(Math.Abs(this.Y - fromPlayer.Y) > Tolerance);
            if (Math.Abs(this.Y - fromPlayer.Y) > Tolerance)
            {
                writer.Write(this.Y);
            }

            writer.Write(Math.Abs(this.Z - fromPlayer.Z) > Tolerance);
            if (Math.Abs(this.Z - fromPlayer.Z) > Tolerance)
            {
                writer.Write(this.X);
            }

            writer.Write(this.Name != fromPlayer.Name);
            if (this.Name != fromPlayer.Name)
            {
                writer.Write(this.Name);
            }
        }
コード例 #25
0
 protected virtual void OnEntityInvalidOwnershipInvoke(int clientId, IServerEntity entity, IInvokePayload payload)
 {
     Debug.LogWarningFormat("OnEntityInvalidOwnershipInvoke({0}, {1}, {2}, {3})", clientId, entity.Id, entity.OwnerId,
                            payload.GetType().Name);
 }
コード例 #26
0
ファイル: ai_logic.cs プロジェクト: hach-que/Protogame.Docs
 public override void Update(IServerEntity entity, IServerContext serverContext, IUpdateContext updateContext)
 {
 }
コード例 #27
0
 public static void VerifyAgainstServerEntity(this IClientEntity <Guid> clientEntity, IServerEntity serverEntity)
 {
     Assert.That(clientEntity.Id, Is.EqualTo(serverEntity.Id));
     Assert.That(clientEntity.EntityState, Is.EqualTo(serverEntity.EntityState));
     Assert.That(clientEntity.ModifiedAtTicks, Is.EqualTo(serverEntity.ModifiedAt.Ticks));
 }
コード例 #28
0
 public abstract void Update(IServerEntity entity, IServerContext serverContext, IUpdateContext updateContext);
コード例 #29
0
 /// <summary>
 /// Constructs an example game entity
 /// </summary>
 /// <param name="serverEntity">Server entity</param>
 public ExampleGameEntity(IServerEntity serverEntity) : base(serverEntity)
 {
     // ...
 }
コード例 #30
0
 /// <summary>
 /// Creates a new game entity
 /// </summary>
 /// <param name="serverEntity">Game entity type</param>
 /// <returns>Game entity</returns>
 public IGameEntity CreateNewGameEntity(IServerEntity serverEntity) => new DeathmatchGameEntity(serverEntity);
コード例 #31
0
 protected virtual void OnEntityDespawn(IServerEntity entity)
 {
 }
コード例 #32
0
 private void OnInvalidOwnershipInvoke(int clientId, IServerEntity entity, IInvokePayload payload)
 {
     Logs.Add(Tuple.Create(entity.Id, "InvalidOwnershipInvoke"));
 }
コード例 #33
0
 private void OnDespawn(IServerEntity entity)
 {
     Logs.Add(Tuple.Create(entity.Id, "Despawn"));
 }