コード例 #1
0
        public static BlipEntity Create(Vector3 position, int dimension, uint range)
        {
            var entity = new BlipEntity(position, dimension, range);

            AltEntitySync.AddEntity(entity);
            return(entity);
        }
コード例 #2
0
        /// <summary>
        /// Create a new dynamic marker
        /// </summary>
        /// <param name="markerType">The type of marker to spawn.</param>
        /// <param name="position">The position at which the marker should spawn at.</param>
        /// <param name="scale">The scale of the marker.</param>
        /// <param name="rotation">The rotation of the marker.</param>
        /// <param name="direction">The direction of the marker.</param>
        /// <param name="color">The color of the marker.</param>
        /// <param name="bobUpDown">Whether the marker should bob up and down.</param>
        /// <param name="faceCamera">Whether the marker should face the entity's camera.</param>
        /// <param name="rotate">Whether the marker should rotate on the Y axis only.</param>
        /// <param name="textureDict">An optional texture dictionary to apply to the marker.</param>
        /// <param name="textureName">An optional texture name to apply to the marker.</param>
        /// <param name="drawOnEnter">Whether it should draw the marker onto an entity that intersects with it.</param>
        /// <param name="dimension">The dimension of the marker</param>
        /// <param name="streamRange">Stream distance of the marker, default is 100.</param>
        /// <returns></returns>
        public static Marker Create(
            MarkerTypes markerType, Vector3 position, Vector3 scale, Vector3?rotation = null, Vector3?direction = null, Rgba?color = null, int dimension = 0,
            bool?bobUpDown   = false, bool?faceCamera  = false, bool?rotate = false, string textureDict = null, string textureName = null,
            bool?drawOnEnter = false, uint streamRange = 100
            )
        {
            Marker marker = new Marker(position, dimension, streamRange, 0)
            {
                Rotation    = rotation ?? new Vector3(0),
                MarkerType  = markerType,
                Direction   = direction ?? new Vector3(0),
                Scale       = scale,
                Color       = color ?? null,
                BobUpDown   = bobUpDown ?? null,
                FaceCamera  = faceCamera ?? null,
                Rotate      = rotate ?? null,
                TextureDict = textureDict ?? null,
                TextureName = textureName ?? null,
                DrawOnEnter = drawOnEnter ?? null
            };

            Marker.MarkerList.Add(marker);
            AltEntitySync.AddEntity(marker);
            return(marker);
        }
コード例 #3
0
        public void UpdatePositionTest()
        {
            var readAsyncCreate = mockNetworkLayer.CreateEventChannel.Reader.ReadAsync();
            var entity          = new Entity(1, Vector3.Zero, 0, 2);

            AltEntitySync.AddEntity(entity);
            var createTask = readAsyncCreate.AsTask();

            createTask.Wait();
            var createResult = createTask.Result;

            Assert.AreSame(createResult.Entity, entity);

            var readAsyncPositionUpdate = mockNetworkLayer.PositionUpdateEventChannel.Reader.ReadAsync();
            var newPosition             = new Vector3(1, 1, 1);

            entity.Position = newPosition;
            var positionUpdateTask = readAsyncPositionUpdate.AsTask();

            positionUpdateTask.Wait();
            var positionUpdateResult = positionUpdateTask.Result;

            Assert.AreSame(positionUpdateResult.Entity, entity);
            Assert.AreEqual(newPosition, positionUpdateResult.Position);

            var readAsyncRemove = mockNetworkLayer.RemoveEventChannel.Reader.ReadAsync();

            AltEntitySync.RemoveEntity(entity);
            var removeTask = readAsyncRemove.AsTask();

            removeTask.Wait();
            var removeResult = removeTask.Result;

            Assert.AreSame(removeResult.Entity, entity);
        }
コード例 #4
0
        public void UpdatePositionCleanupTest()
        {
            var readAsyncCreate = mockNetworkLayer.CreateEventChannel.Reader.ReadAsync();
            var entity          = new Entity(1, Vector3.Zero, 0, 2);

            AltEntitySync.AddEntity(entity);
            var createTask = readAsyncCreate.AsTask();

            createTask.Wait();
            var createResult = createTask.Result;

            Assert.AreSame(createResult.Entity, entity);

            var newPosition = new Vector3(1, 1, 1);

            entity.Position = newPosition;

            for (var i = 0; i < 100; ++i)
            {
                entity.Position = new Vector3(i, i, i);
                Thread.Sleep(50);
            }

            var readAsyncRemove = mockNetworkLayer.RemoveEventChannel.Reader;

            AltEntitySync.RemoveEntity(entity);
            readAsyncRemove.ReadAsync().AsTask().Wait();
            readAsyncRemove.ReadAsync().AsTask().Wait();
            readAsyncRemove.ReadAsync().AsTask().Wait();
            Assert.AreEqual(0, grid.GetEntityCount());
        }
コード例 #5
0
        public void AddTest()
        {
            var entity = new Entity(1, Vector3.One, 0, 1);

            AltEntitySync.AddEntity(entity);
            AltEntitySync.RemoveEntity(entity);
        }
コード例 #6
0
        public void RemoveClientTest()
        {
            var readAsyncCreate = mockNetworkLayer.CreateEventChannel.Reader.ReadAsync();
            var data            = new Dictionary <string, object>();

            data["bla"] = 1337;
            var entity = new Entity(1, new Vector3(1000, 1000, 1000), 0, 2, data);

            AltEntitySync.AddEntity(entity);
            var dummy      = mockNetworkLayer.AddDummyClient();
            var createTask = readAsyncCreate.AsTask();

            createTask.Wait();
            var createResult = createTask.Result;

            Assert.AreSame(createResult.Entity, entity);
            Assert.AreEqual(1, entity.GetClients().Count);
            Assert.AreEqual(1, entity.DataSnapshot.GetLastClients().Count);
            Assert.AreEqual(1, dummy.GetEntities(0).Count);

            mockNetworkLayer.RemoveDummyClient();

            Thread.Sleep(300);

            Assert.AreEqual(0, entity.DataSnapshot.GetLastClients().Count);
            Assert.AreEqual(0, entity.GetClients().Count);
            Assert.AreEqual(1, dummy.GetEntities(0).Count);

            AltEntitySync.RemoveEntity(entity);
        }
コード例 #7
0
        public void UpdateRangeTest()
        {
            var readAsyncCreate = mockNetworkLayer.CreateEventChannel.Reader.ReadAsync();
            var entity          = new Entity(1, Vector3.One, 0, 2);

            AltEntitySync.AddEntity(entity);
            var createTask = readAsyncCreate.AsTask();

            createTask.Wait();
            var createResult = createTask.Result;

            Assert.AreSame(createResult.Entity, entity);

            var readAsyncRemove = mockNetworkLayer.RemoveEventChannel.Reader.ReadAsync();

            entity.Range = 1;
            var removeTask = readAsyncRemove.AsTask();

            removeTask.Wait();
            var removeResult = removeTask.Result;

            Assert.AreSame(removeResult.Entity, entity);

            AltEntitySync.RemoveEntity(entity);
            Thread.Sleep(500);
            Assert.AreEqual(0, grid.GetEntityCount());
        }
コード例 #8
0
        public void RemoveTest()
        {
            var readAsyncCreate = mockNetworkLayer.CreateEventChannel.Reader.ReadAsync();
            var data            = new Dictionary <string, object>();

            data["bla"] = 1337;
            var entity = new Entity(1, Vector3.Zero, 0, 2, data);

            AltEntitySync.AddEntity(entity);
            var createTask = readAsyncCreate.AsTask();

            createTask.Wait();
            var createResult = createTask.Result;

            Assert.AreSame(createResult.Entity, entity);

            var readAsyncRemove     = mockNetworkLayer.RemoveEventChannel.Reader.ReadAsync();
            var readAsyncClearCache = mockNetworkLayer.ClearCacheEventChannel.Reader.ReadAsync();

            AltEntitySync.RemoveEntity(entity);

            var removeTask = readAsyncRemove.AsTask();

            removeTask.Wait();
            var removeResult = removeTask.Result;

            Assert.AreSame(removeResult.Entity, entity);

            var clearCacheTask = readAsyncClearCache.AsTask();

            clearCacheTask.Wait();
            var clearCacheResult = clearCacheTask.Result;

            Assert.AreSame(clearCacheResult.Entity, entity);
        }
コード例 #9
0
        public async Task <bool> Initialize()
        {
            if (_initialized)
            {
                return(false);
            }

            _initialized = true;

            AltEntitySync.AddEntity(Fire);

            Alt.EmitAllClients("FireFighters:Fire:NewStarted", Fire.Id);

            await Task.Delay(Fire.FlameSpawnDelay);

            Alt.EmitAllClients("FireFighters:Fire:FlamesSpawning", Fire.Id);

            var flameBuilder = new FlameBuilder()
                               .SetPosition(Fire.Position)
                               .SetLevel(10);

            if (Fire.IsGasFire)
            {
                flameBuilder.GasFire();
            }

            Fire.MainFlame = flameBuilder.InitializeFlame();

            OnTick(); // no await!

            return(_initialized);
        }
コード例 #10
0
        public T Create(T entity)
        {
            ManagedEntities.Add(entity);
            AltEntitySync.AddEntity(entity);

            Logger.LogDebug($"[EntitySync] Created entity with id {entity.Id}");

            return(entity);
        }
コード例 #11
0
 public static void Entities()
 {
     for (var i = 0; i < 5000; i++)
     {
         var entity = new Entity(1, GetRandomVector3(), 0, 2);
         AltEntitySync.AddEntity(entity);
     }
     Thread.Sleep(20000);
 }
コード例 #12
0
        public void PositionOverrideTest()
        {
            var readAsyncCreate = mockNetworkLayer.CreateEventChannel.Reader.ReadAsync();
            var entity          = new Entity(1, Vector3.One, 0, 2);

            AltEntitySync.AddEntity(entity);
            var createTask = readAsyncCreate.AsTask();

            createTask.Wait();
            var createResult = createTask.Result;

            Assert.AreSame(createResult.Entity, entity);

            var readAsyncRemove = mockNetworkLayer.RemoveEventChannel.Reader.ReadAsync();

            if (mockNetworkLayer.ClientRepository.TryGet("a", out var client))
            {
                client.SetPositionOverride(new Vector3(10, 10, 10));
            }

            var removeTask = readAsyncRemove.AsTask();

            removeTask.Wait();
            var removeResult = removeTask.Result;

            Assert.AreSame(removeResult.Entity, entity);


            if (mockNetworkLayer.ClientRepository.TryGet("a", out client))
            {
                client.ResetPositionOverride();
            }

            readAsyncCreate = mockNetworkLayer.CreateEventChannel.Reader.ReadAsync();
            createTask      = readAsyncCreate.AsTask();
            createTask.Wait();
            createResult = createTask.Result;

            Assert.AreSame(createResult.Entity, entity);

            readAsyncRemove = mockNetworkLayer.RemoveEventChannel.Reader.ReadAsync();

            if (mockNetworkLayer.ClientRepository.TryGet("a", out client))
            {
                client.SetPositionOverride(new Vector3(100, 100, 100));
            }

            removeTask = readAsyncRemove.AsTask();
            removeTask.Wait();
            removeResult = removeTask.Result;
            Assert.AreSame(removeResult.Entity, entity);
        }
コード例 #13
0
        /// <summary>
        /// Create a new HelpText.
        /// </summary>
        /// <param name="text">The text to be displayed.</param>
        /// <returns>The newly created dynamic textlabel.</returns>
        public static HelpText Create(
            string text, Vector3 position, int dimension = 0, uint streamRange = 5
            )
        {
            HelpText helper = new HelpText(position, dimension, streamRange, 3)
            {
                Text = text,
            };

            HelpText.HelpTextList.Add(helper);
            AltEntitySync.AddEntity(helper);
            return(helper);
        }
コード例 #14
0
        public void RemoveTestWithoutInitialData()
        {
            var readAsyncCreate = mockNetworkLayer.CreateEventChannel.Reader.ReadAsync();
            var entity          = new Entity(1, Vector3.Zero, 0, 2);

            AltEntitySync.AddEntity(entity);
            var createTask = readAsyncCreate.AsTask();

            createTask.Wait();
            var createResult = createTask.Result;

            Assert.AreSame(createResult.Entity, entity);

            var readAsyncDataUpdate = mockNetworkLayer.DataChangeEventChannel.Reader.ReadAsync();

            entity.SetData("bla", 1337);

            var updateDataTask = readAsyncDataUpdate.AsTask();

            updateDataTask.Wait();
            var updateDataResult = updateDataTask.Result;

            using (var enumerator = updateDataResult.Data.GetEnumerator())
            {
                Assert.AreEqual(true, enumerator.MoveNext());
                Assert.AreEqual("bla", enumerator.Current.Key);
                Assert.AreEqual(1337, enumerator.Current.Value);
                Assert.AreEqual(false, enumerator.MoveNext());
            }

            Assert.AreSame(updateDataResult.Entity, entity);

            var readAsyncRemove     = mockNetworkLayer.RemoveEventChannel.Reader.ReadAsync();
            var readAsyncClearCache = mockNetworkLayer.ClearCacheEventChannel.Reader.ReadAsync();

            AltEntitySync.RemoveEntity(entity);

            var removeTask = readAsyncRemove.AsTask();

            removeTask.Wait();
            var removeResult = removeTask.Result;

            Assert.AreSame(removeResult.Entity, entity);

            var clearCacheTask = readAsyncClearCache.AsTask();

            clearCacheTask.Wait();
            var clearCacheResult = clearCacheTask.Result;

            Assert.AreSame(clearCacheResult.Entity, entity);
        }
コード例 #15
0
        /// <summary>
        /// Create Dynamic Blip.
        /// </summary>
        /// <param name="name"></param>
        /// <param name="color"></param>
        /// <param name="scale"></param>
        /// <param name="shortRange"></param>
        /// <param name="spriteId"></param>
        /// <param name="position"></param>
        /// <param name="dimension"></param>
        /// <param name="range"></param>
        /// <returns></returns>
        public static Blip CreateDynamicBlip(string name, int color, float scale, bool shortRange, int spriteId, Vector3 position, int dimension, uint range = 200)
        {
            Blip blip = new Blip(position, dimension, range, 5)
            {
                Color        = color,
                Scale        = scale,
                ShortRange   = shortRange,
                Sprite       = spriteId,
                Name         = name,
                IsStaticBlip = false,
            };

            AltEntitySync.AddEntity(blip);
            BlipList.Add(blip.Id, blip);
            return(blip);
        }
コード例 #16
0
        /// <summary>
        /// Create a new HelpText.
        /// </summary>
        /// <param name="text">The text to be displayed.</param>
        /// <returns>The newly created dynamic textlabel.</returns>
        public static HelpText Create(
            string text, Vector3 position, int dimension = 0, uint streamRange = 5
            )
        {
            HelpText helper = new HelpText(position, dimension, streamRange, 4)
            {
                Text = text,
            };

            mGlobal.API.RunSameThread(() =>
            {
                HelpText.HelpTextList.Add(helper);
                AltEntitySync.AddEntity(helper);
            });
            return(helper);
        }
コード例 #17
0
        public void DataTest()
        {
            var readAsyncCreate = mockNetworkLayer.CreateEventChannel.Reader.ReadAsync();
            var data            = new Dictionary <string, object>();

            data["bla"] = 1337;
            var entity = new Entity(1, Vector3.Zero, 0, 2, data);

            AltEntitySync.AddEntity(entity);
            var createTask = readAsyncCreate.AsTask();

            createTask.Wait();
            var createResult = createTask.Result;

            Assert.AreSame(entity, createResult.Entity);
            Assert.AreEqual(new string[] { "bla" }, createResult.Data.Keys);
            Assert.AreEqual(new object[] { 1337 }, createResult.Data.Values);

            var readAsyncDataUpdate = mockNetworkLayer.DataChangeEventChannel.Reader.ReadAsync();

            entity.SetData("bla", 1338);

            var updateDataTask = readAsyncDataUpdate.AsTask();

            updateDataTask.Wait();
            var updateDataResult = updateDataTask.Result;

            using (var enumerator = updateDataResult.Data.GetEnumerator())
            {
                Assert.AreEqual(true, enumerator.MoveNext());
                Assert.AreEqual("bla", enumerator.Current.Key);
                Assert.AreEqual(1338, enumerator.Current.Value);
                Assert.AreEqual(false, enumerator.MoveNext());
            }

            Assert.AreSame(updateDataResult.Entity, entity);

            var readAsyncRemove = mockNetworkLayer.RemoveEventChannel.Reader.ReadAsync();

            AltEntitySync.RemoveEntity(entity);
            var removeTask = readAsyncRemove.AsTask();

            removeTask.Wait();
            var removeResult = removeTask.Result;

            Assert.AreSame(removeResult.Entity, entity);
        }
コード例 #18
0
        public void PositionOverrideTest()
        {
            var readAsyncCreate = mockNetworkLayer.CreateEventChannel.Reader.ReadAsync();
            var entity          = new Entity(1, Vector3.One, 0, 2);

            AltEntitySync.AddEntity(entity);
            // Two clients in range
            var createTask = readAsyncCreate.AsTask();

            createTask.Wait();
            readAsyncCreate = mockNetworkLayer.CreateEventChannel.Reader.ReadAsync();
            createTask      = readAsyncCreate.AsTask();
            createTask.Wait();
            var createResult = createTask.Result;

            Assert.AreSame(createResult.Entity, entity);

            var readAsyncRemove = mockNetworkLayer.RemoveEventChannel.Reader.ReadAsync();

            mockNetworkLayer.a.SetPositionOverride(new Vector3(10, 10, 10));

            var removeTask = readAsyncRemove.AsTask();

            removeTask.Wait();
            var removeResult = removeTask.Result;

            Assert.AreSame(removeResult.Entity, entity);

            mockNetworkLayer.a.ResetPositionOverride();

            readAsyncCreate = mockNetworkLayer.CreateEventChannel.Reader.ReadAsync();
            createTask      = readAsyncCreate.AsTask();
            createTask.Wait();
            createResult = createTask.Result;

            Assert.AreSame(createResult.Entity, entity);

            readAsyncRemove = mockNetworkLayer.RemoveEventChannel.Reader.ReadAsync();

            mockNetworkLayer.a.SetPositionOverride(new Vector3(100, 100, 100));

            removeTask = readAsyncRemove.AsTask();
            removeTask.Wait();
            removeResult = removeTask.Result;
            Assert.AreSame(removeResult.Entity, entity);
        }
コード例 #19
0
        public void MultiAddTest()
        {
            mockNetworkLayer.ClientRepository.Remove(mockNetworkLayer.b);
            mockNetworkLayer.ClientRepository.Remove(mockNetworkLayer.c);

            var readAsyncCreate = mockNetworkLayer.CreateEventChannel.Reader.ReadAsync();
            var entityA         = new Entity(1, Vector3.Zero, 0, 2);

            AltEntitySync.AddEntity(entityA);
            var createTask = readAsyncCreate.AsTask();

            createTask.Wait();
            var createResult = createTask.Result;

            Assert.AreSame(createResult.Entity, entityA);

            readAsyncCreate = mockNetworkLayer.CreateEventChannel.Reader.ReadAsync();
            var entityB = new Entity(1, Vector3.Zero, 0, 2);

            AltEntitySync.AddEntity(entityB);
            createTask = readAsyncCreate.AsTask();
            createTask.Wait();
            createResult = createTask.Result;
            Assert.AreSame(createResult.Entity, entityB);


            var readAsyncRemove = mockNetworkLayer.RemoveEventChannel.Reader.ReadAsync();

            AltEntitySync.RemoveEntity(entityA);
            var removeTask = readAsyncRemove.AsTask();

            removeTask.Wait();
            var removeResult = removeTask.Result;

            Assert.AreSame(removeResult.Entity, entityA);

            readAsyncRemove = mockNetworkLayer.RemoveEventChannel.Reader.ReadAsync();
            AltEntitySync.RemoveEntity(entityB);
            removeTask = readAsyncRemove.AsTask();
            removeTask.Wait();
            removeResult = removeTask.Result;
            Assert.AreSame(removeResult.Entity, entityB);

            mockNetworkLayer.ClientRepository.Add(mockNetworkLayer.b);
            mockNetworkLayer.ClientRepository.Add(mockNetworkLayer.c);
        }
コード例 #20
0
        public void NetOwnerTest3()
        {
            var readerCreate         = mockNetworkLayer.CreateEventChannel.Reader;
            var readerNetOwnerChange = mockNetworkLayer.NetOwnerChangeEventChannel.Reader;
            var readAsyncCreate      = readerCreate.ReadAsync();
            var entity2 = new Entity(0, Vector3.Zero, 0, 2);

            AltEntitySync.AddEntity(entity2);
            var createTask = readAsyncCreate.AsTask();

            createTask.Wait();
            var readAsyncNetOwnerChange = readerNetOwnerChange.ReadAsync();
            var netOwnerChangeTask      = readAsyncNetOwnerChange.AsTask();

            netOwnerChangeTask.Wait();
            Assert.AreEqual(mockNetworkLayer.a, netOwnerChangeTask.Result.Item1);
            Assert.True(netOwnerChangeTask.Result.Item2.State);
            Assert.AreEqual(entity2, netOwnerChangeTask.Result.Item2.Entity);
            var client = new Client(1, "d");

            client.Position = new Vector3(0, 0, 1);
            mockNetworkLayer.ClientRepository.Add(client);
            entity2.Position = new Vector3(0, 0, 1);
            Thread.Sleep(1000);
            mockNetworkLayer.ClientRepository.Remove(client);
            Assert.False(mockNetworkLayer.NetOwnerChangeEventChannel.Reader.TryRead(out _));
            client           = new Client(1, "d");
            entity2.Position = new Vector3(0, 0, 2);
            client.Position  = new Vector3(0, 0, 2);
            mockNetworkLayer.ClientRepository.Add(client);
            Thread.Sleep(1000);
            mockNetworkLayer.ClientRepository.Remove(client);
            Assert.True(mockNetworkLayer.NetOwnerChangeEventChannel.Reader.TryRead(out var changeEvent));
            Assert.AreEqual(mockNetworkLayer.a, changeEvent.Item1);
            Assert.False(changeEvent.Item2.State);
            Assert.AreEqual(entity2, changeEvent.Item2.Entity);
            Assert.True(mockNetworkLayer.NetOwnerChangeEventChannel.Reader.TryRead(out changeEvent));
            Assert.AreEqual(client, changeEvent.Item1);
            Assert.True(changeEvent.Item2.State);
            Assert.AreEqual(entity2, changeEvent.Item2.Entity);
        }
コード例 #21
0
        public Flame InitializeFlame()
        {
            if (_position == Vector3.Zero) // multithreading issue: race-condition
            {
                var ex = new InvalidOperationException("Flame needs a position");
                Alt.Log("Exception on FlameBuilder: " + ex.Message);
                throw ex;
            }

            var     nearestDistance = float.MaxValue;
            IPlayer nearestPlayer   = null;

            foreach (var player in Alt.GetAllPlayers())
            {
                var distance = player.Position.Distance(_position);

                if (distance < nearestDistance)
                {
                    nearestDistance = distance;
                    nearestPlayer   = player;
                }
            }

            if (nearestPlayer == null)
            {
                var ex = new InvalidOperationException("Flame could not be created, because no nearest player found");
                Alt.Log("Exception on FlameBuilder: " + ex.Message);
                throw ex;
            }

            var flame = new Flame(_position, _isGasFire)
            {
                Level = _level
            };

            AltEntitySync.AddEntity(flame);

            nearestPlayer.Emit("FireFighters:Flame:DeterminePositionGround", flame.Id, flame.Position);

            return(flame);
        }
コード例 #22
0
        public void NetOwnerTest2()
        {
            var readerCreate         = mockNetworkLayer.CreateEventChannel.Reader;
            var readerNetOwnerChange = mockNetworkLayer.NetOwnerChangeEventChannel.Reader;
            var readAsyncCreate      = readerCreate.ReadAsync();
            var entity2 = new Entity(0, Vector3.Zero, 0, 4);

            AltEntitySync.AddEntity(entity2);
            var createTask = readAsyncCreate.AsTask();

            createTask.Wait();
            Assert.True(readerCreate.TryRead(out var clientCCreateEvent));
            var readAsyncNetOwnerChange = readerNetOwnerChange.ReadAsync();
            var netOwnerChangeTask      = readAsyncNetOwnerChange.AsTask();

            netOwnerChangeTask.Wait();
            Assert.AreEqual(mockNetworkLayer.a, netOwnerChangeTask.Result.Item1);
            Assert.True(netOwnerChangeTask.Result.Item2.State);
            Assert.AreEqual(entity2, netOwnerChangeTask.Result.Item2.Entity);
            entity2.Position = new Vector3(1, 1, 0);
        }
コード例 #23
0
        public void AddRepositoryTest()
        {
            var entity2 = new Entity(0, Vector3.Zero, 0, 2);

            AltEntitySync.AddEntity(entity2);
            if (AltEntitySync.TryGetEntity(entity2.Id, 0, out var foundEntity2))
            {
                Assert.AreSame(entity2, foundEntity2);
            }
            var entity = new Entity(1, Vector3.Zero, 0, 2);

            AltEntitySync.AddEntity(entity);
            if (AltEntitySync.TryGetEntity(entity.Id, 1, out var foundEntity))
            {
                Assert.AreSame(entity, foundEntity);
            }
            AltEntitySync.RemoveEntity(entity2);
            Assert.False(AltEntitySync.TryGetEntity(entity2.Id, 0, out _));
            AltEntitySync.RemoveEntity(entity);
            Assert.False(AltEntitySync.TryGetEntity(entity.Id, 1, out _));
        }
コード例 #24
0
        /// <summary>
        /// Create a new dynamic object.
        /// </summary>
        /// <param name="model">The object model name.</param>
        /// <param name="position">The position to spawn the object at.</param>
        /// <param name="rotation">The rotation to spawn the object at(degrees).</param>
        /// <param name="dimension">The dimension to spawn the object in.</param>
        /// <param name="isDynamic">(Optional): Set object dynamic or not.</param>
        /// <param name="frozen">(Optional): Set object frozen.</param>
        /// <param name="lodDistance">(Optional): Set LOD distance.</param>
        /// <param name="lightColor">(Optional): set light color.</param>
        /// <param name="onFire">(Optional): set object on fire(DOESN'T WORK PROPERLY YET!)</param>
        /// <param name="textureVariation">(Optional): Set object texture variation.</param>
        /// <param name="visible">(Optional): Set object visibility.</param>
        /// <param name="streamRange">(Optional): The range that a player has to be in before the object spawns, default value is 400.</param>
        /// <returns>The newly created dynamic object.</returns>
        public static DynamicObject CreateDynamicObject(
            string model, Vector3 position, Vector3 rotation, int dimension = 0, bool?isDynamic = null, bool?frozen = null, uint?lodDistance = null,
            Rgb lightColor = null, bool?onFire = null, TextureVariation?textureVariation = null, bool?visible = null, uint streamRange = 400
            )
        {
            DynamicObject obj = new DynamicObject(position, dimension, streamRange, "object")
            {
                Rotation         = rotation,
                Model            = model,
                Dynamic          = isDynamic ?? null,
                Frozen           = frozen ?? null,
                LodDistance      = lodDistance ?? null,
                LightColor       = lightColor ?? null,
                OnFire           = onFire ?? null,
                TextureVariation = textureVariation ?? null,
                Visible          = visible ?? null
            };

            AltEntitySync.AddEntity(obj);
            return(obj);
        }
コード例 #25
0
        public void AddTest()
        {
            var readAsyncCreate = mockNetworkLayer.CreateEventChannel.Reader.ReadAsync();
            var entity          = new Entity(1, Vector3.Zero, 0, 2);

            AltEntitySync.AddEntity(entity);
            var createTask = readAsyncCreate.AsTask();

            createTask.Wait();
            var createResult = createTask.Result;

            Assert.AreSame(createResult.Entity, entity);
            var readAsyncRemove = mockNetworkLayer.RemoveEventChannel.Reader.ReadAsync();

            AltEntitySync.RemoveEntity(entity);
            var removeTask = readAsyncRemove.AsTask();

            removeTask.Wait();
            var removeResult = removeTask.Result;

            Assert.AreSame(removeResult.Entity, entity);
        }
コード例 #26
0
        /// <summary>
        /// Create a new dynamic object.
        /// </summary>
        /// <param name="model">The object model hash.</param>
        /// <param name="position">The position to spawn the object at.</param>
        /// <param name="rotation">The rotation to spawn the object at(degrees).</param>
        /// <param name="dimension">The dimension to spawn the object in.</param>
        /// <param name="isDynamic">(Optional): Set object dynamic or not.</param>
        /// <param name="frozen">(Optional): Set object frozen.</param>
        /// <param name="lodDistance">(Optional): Set LOD distance.</param>
        /// <param name="lightColor">(Optional): set light color.</param>
        /// <param name="onFire">(Optional): set object on fire(DOESN'T WORK PROPERLY YET!)</param>
        /// <param name="textureVariation">(Optional): Set object texture variation.</param>
        /// <param name="visible">(Optional): Set object visibility.</param>
        /// <param name="type">(Optional): Type of object, only use this if you want to separate certain object types on a custom client-side based object streamer.</param>
        /// <param name="streamRange">(Optional): The range that a player has to be in before the object spawns, default value is 400.</param>
        /// <returns>The newly created dynamic object</returns>
        public static DynamicObject CreateDynamicObject(
            uint model, Vector3 position, Vector3 rotation, int dimension = 0, bool?isDynamic = null, bool?frozen = null, uint?lodDistance = null,
            Rgb lightColor = null, bool?onFire = null, TextureVariation?textureVariation = null, bool?visible = null, uint streamRange = 400
            )
        {
            DynamicObject obj = new DynamicObject(position, dimension, streamRange)
            {
                Rotation         = rotation,
                Model            = model,
                Dynamic          = isDynamic,
                Frozen           = frozen,
                LodDistance      = lodDistance,
                LightColor       = lightColor,
                OnFire           = onFire,
                TextureVariation = textureVariation,
                Visible          = visible
            };

            Alt.Log($"Tworze obiekt {obj.ToString()}");

            AltEntitySync.AddEntity(obj);
            return(obj);
        }
コード例 #27
0
        /// <summary>
        /// Create a new dynamic object.
        /// </summary>
        /// <param name="model">The object model name.</param>
        /// <param name="position">The position to spawn the object at.</param>
        /// <param name="rotation">The rotation to spawn the object at(degrees).</param>
        /// <param name="dimension">The dimension to spawn the object in.</param>
        /// <param name="isDynamic">(Optional): Set object dynamic or not.</param>
        /// <param name="frozen">(Optional): Set object frozen.</param>
        /// <param name="lodDistance">(Optional): Set LOD distance.</param>
        /// <param name="lightColor">(Optional): set light color.</param>
        /// <param name="onFire">(Optional): set object on fire(DOESN'T WORK PROPERLY YET!)</param>
        /// <param name="textureVariation">(Optional): Set object texture variation.</param>
        /// <param name="visible">(Optional): Set object visibility.</param>
        /// <param name="streamRange">(Optional): The range that a player has to be in before the object spawns, default value is 400.</param>
        /// <returns>The newly created dynamic object.</returns>
        public static Prop Create(
            string model, Vector3 position, Vector3 rotation, int dimension = 0, bool?isDynamic = null, bool?placeObjectOnGroundProperly = false, bool?frozen = null, uint?lodDistance = null,
            Rgb lightColor = null, bool?onFire = null, TextureVariation?textureVariation = null, bool?visible = null, uint streamRange = 520
            )
        {
            Prop obj = new Prop(position, dimension, streamRange, 2)
            {
                Rotation         = rotation,
                Model            = model,
                Dynamic          = isDynamic ?? null,
                Freeze           = frozen ?? null,
                LodDistance      = lodDistance ?? null,
                LightColor       = lightColor ?? null,
                OnFire           = onFire ?? null,
                TextureVariation = textureVariation ?? null,
                Visible          = visible ?? null,
                PositionInitial  = position,
            };

            Prop.PropList.Add(obj);
            AltEntitySync.AddEntity(obj);
            return(obj);
        }
コード例 #28
0
 public void Add(Marker marker)
 {
     Markers.Add(marker);
     AltEntitySync.AddEntity(marker);
 }
コード例 #29
0
 public void Add(TextLabel textLabel)
 {
     TextLabels.Add(textLabel);
     AltEntitySync.AddEntity(textLabel);
 }
コード例 #30
0
        public void NetOwnerTest()
        {
            var readerCreate         = mockNetworkLayer.CreateEventChannel.Reader;
            var readerNetOwnerChange = mockNetworkLayer.NetOwnerChangeEventChannel.Reader;
            var readAsyncCreate      = readerCreate.ReadAsync();
            var entity2 = new Entity(0, Vector3.Zero, 0, 2, 0);

            AltEntitySync.AddEntity(entity2);
            var createTask = readAsyncCreate.AsTask();

            createTask.Wait();
            Assert.True(readerCreate.TryRead(out var clientCCreateEvent));
            var readAsyncNetOwnerChange = readerNetOwnerChange.ReadAsync();
            var netOwnerChangeTask      = readAsyncNetOwnerChange.AsTask();

            netOwnerChangeTask.Wait();
            Assert.AreEqual(mockNetworkLayer.a, netOwnerChangeTask.Result.Item1);
            Assert.True(netOwnerChangeTask.Result.Item2.State);
            Assert.AreEqual(entity2, netOwnerChangeTask.Result.Item2.Entity);
            readAsyncNetOwnerChange = readerNetOwnerChange.ReadAsync();
            netOwnerChangeTask      = readAsyncNetOwnerChange.AsTask();
            entity2.Position        = new Vector3(1, 1, 1);
            netOwnerChangeTask.Wait();
            Assert.AreEqual(mockNetworkLayer.a, netOwnerChangeTask.Result.Item1);
            Assert.False(netOwnerChangeTask.Result.Item2.State);
            Assert.AreEqual(entity2, netOwnerChangeTask.Result.Item2.Entity);
            readAsyncNetOwnerChange = readerNetOwnerChange.ReadAsync();
            netOwnerChangeTask      = readAsyncNetOwnerChange.AsTask();
            netOwnerChangeTask.Wait();
            Assert.AreEqual(mockNetworkLayer.c, netOwnerChangeTask.Result.Item1);
            Assert.True(netOwnerChangeTask.Result.Item2.State);
            Assert.AreEqual(entity2, netOwnerChangeTask.Result.Item2.Entity);
            readAsyncNetOwnerChange = readerNetOwnerChange.ReadAsync();
            netOwnerChangeTask      = readAsyncNetOwnerChange.AsTask();
            entity2.Position        = new Vector3(0, 0, 0);
            netOwnerChangeTask.Wait();
            Assert.AreEqual(mockNetworkLayer.c, netOwnerChangeTask.Result.Item1);
            Assert.False(netOwnerChangeTask.Result.Item2.State);
            Assert.AreEqual(entity2, netOwnerChangeTask.Result.Item2.Entity);
            readAsyncNetOwnerChange = readerNetOwnerChange.ReadAsync();
            netOwnerChangeTask      = readAsyncNetOwnerChange.AsTask();
            netOwnerChangeTask.Wait();
            Assert.AreEqual(mockNetworkLayer.a, netOwnerChangeTask.Result.Item1);
            Assert.True(netOwnerChangeTask.Result.Item2.State);
            Assert.AreEqual(entity2, netOwnerChangeTask.Result.Item2.Entity);
            readAsyncNetOwnerChange = readerNetOwnerChange.ReadAsync();
            netOwnerChangeTask      = readAsyncNetOwnerChange.AsTask();
            mockNetworkLayer.ClientRepository.Remove(mockNetworkLayer.a);
            netOwnerChangeTask.Wait();
            Assert.AreEqual(mockNetworkLayer.c, netOwnerChangeTask.Result.Item1);
            Assert.True(netOwnerChangeTask.Result.Item2.State);
            Assert.AreEqual(entity2, netOwnerChangeTask.Result.Item2.Entity);
            readAsyncNetOwnerChange = readerNetOwnerChange.ReadAsync();
            netOwnerChangeTask      = readAsyncNetOwnerChange.AsTask();
            mockNetworkLayer.ClientRepository.Add(mockNetworkLayer.a);
            netOwnerChangeTask.Wait();
            Assert.AreEqual(mockNetworkLayer.c, netOwnerChangeTask.Result.Item1);
            Assert.False(netOwnerChangeTask.Result.Item2.State);
            Assert.AreEqual(entity2, netOwnerChangeTask.Result.Item2.Entity);
            readAsyncNetOwnerChange = readerNetOwnerChange.ReadAsync();
            netOwnerChangeTask      = readAsyncNetOwnerChange.AsTask();
            netOwnerChangeTask.Wait();
            Assert.AreEqual(mockNetworkLayer.a, netOwnerChangeTask.Result.Item1);
            Assert.True(netOwnerChangeTask.Result.Item2.State);
            Assert.AreEqual(entity2, netOwnerChangeTask.Result.Item2.Entity);
            //TODO: add tests for changing client position, even when that won't have impact with the current computation state
            //TODO: but it makes the test more future proofed
        }