Example #1
0
        public void AddEntity(ServerDynamicEntity entity)
        {
            // maybe we need to generate new unique entity id
            if (entity.DynamicEntity.DynamicId == 0)
            {
                entity.DynamicEntity.DynamicId = DynamicIdHelper.GetNextUniqueId();
            }

            lock (_dynamicEntities)
            {
                if (_dynamicEntities.ContainsKey(entity.DynamicEntity.DynamicId))
                {
                    throw new InvalidOperationException("Such entity is already in manager");
                }

                _dynamicEntities.Add(entity.DynamicEntity.DynamicId, entity);
            }

            MapArea entityArea = null;

            // listen all 9 areas and add at center area
            for (int x = -1; x < 2; x++)
            {
                for (int z = -1; z < 2; z++)
                {
                    var area = GetArea(new Vector3D(entity.DynamicEntity.Position.X + x * MapArea.AreaSize.X, 0,
                                                    entity.DynamicEntity.Position.Z + z * MapArea.AreaSize.Y));
                    entity.AddArea(area);
                    if (x == 0 && z == 0)
                    {
                        area.AddEntity(entity);
                        entityArea = area;
                    }
                    area.OnEntityInViewRange(entity);
                }
            }
            entity.CurrentArea = entityArea;

            OnEntityAdded(new AreaEntityEventArgs {
                Entity = entity
            });
        }
Example #2
0
        public void RemoveEntity(ServerDynamicEntity entity)
        {
            bool removed;

            lock (_dynamicEntities)
            {
                removed = _dynamicEntities.Remove(entity.DynamicEntity.DynamicId);
            }

            if (!removed)
            {
                return;
            }

            // remove entity from areas
            for (int x = -1; x < 2; x++)
            {
                for (int z = -1; z < 2; z++)
                {
                    var area = GetArea(new Vector3D(entity.DynamicEntity.Position.X + x * MapArea.AreaSize.X, 0,
                                                    entity.DynamicEntity.Position.Z + z * MapArea.AreaSize.Y));
                    if (x == 0 && z == 0)
                    {
                        area.RemoveEntity((int)entity.DynamicEntity.DynamicId);
                    }

                    area.OnEntityOutOfViewRange(entity);

                    entity.RemoveArea(area);
                }
            }

            OnEntityRemoved(new AreaEntityEventArgs {
                Entity = entity
            });
        }
Example #3
0
 public bool TryFind(uint entityId, out ServerDynamicEntity entity)
 {
     return(_dynamicEntities.TryGetValue(entityId, out entity));
 }