示例#1
0
        public override void Execute(Snapshot snapshot)
        {
            string message = $"Расстановка объектов по местам. Кол-во сущностей в контексте {withHpGroup.count}| " +
                             $"Кол-во сущностей в снимке {snapshot.transforms.Count}";
            // log.Debug(message);
            HashSet <ushort> needHandle = new HashSet <ushort>(snapshot.transforms.Keys);

            foreach (var withHp in withHpGroup)
            {
                var isActive = snapshot.transforms.ContainsKey(withHp.id.value);
                if (!isActive)
                {
                    //выключить если этот объект тогда не существовал
                    withHp.transform.value.gameObject.SetActive(false);
                }
                else
                {
                    needHandle.Remove(withHp.id.value);
                    //передвинуть если этот объект был
                    withHp.transform.value.gameObject.SetActive(true);
                    ViewTransformCompressed viewTransform = snapshot.transforms[withHp.id.value];
                    withHp.transform.value.Change(viewTransform);
                }
            }

            if (needHandle.Count != 0)
            {
                log.Info($"Не обработано {needHandle.Count} объектов из снимка");
            }
        }
        public bool IsSame(ViewTransformCompressed viewTransform1, ViewTransformCompressed viewTransform2)
        {
            // bool sameAngle = Math.Abs(viewTransform1.Angle - viewTransform2.Angle) < 1;
            bool sameAngle    = true;
            bool sameX        = Math.Abs(viewTransform1.X - viewTransform2.X) < 1;
            bool sameZ        = Math.Abs(viewTransform1.Z - viewTransform2.Z) < 1;
            bool sameViewType = viewTransform1.viewTypeEnum == viewTransform2.viewTypeEnum;

            if (!sameAngle)
            {
                log.Debug($"!sameAngle = {viewTransform1.Angle} {viewTransform2.Angle}");
            }

            if (!sameX)
            {
                log.Debug($"!sameX = {viewTransform1.X} {viewTransform2.X}");
            }

            if (!sameZ)
            {
                log.Debug($"!sameZ = {viewTransform1.Z} {viewTransform2.Z}");
            }

            if (!sameViewType)
            {
                log.Debug($"!sameViewType = {viewTransform1.viewTypeEnum} {viewTransform2.viewTypeEnum}");
            }

            return(sameAngle && sameX && sameZ && sameViewType);
        }
        private void AddNewObject(ushort id, ViewTransformCompressed viewTransform)
        {
            ServerGameEntity gameEntity = gameContext.CreateEntity();

            gameEntity.AddId(id);
            gameEntity.AddViewType(viewTransform.viewTypeEnum);
            Quaternion quaternion = Quaternion.AngleAxis(viewTransform.Angle, Vector3.up);

            gameEntity.AddSpawnTransform(viewTransform.GetPosition(), quaternion);
        }
        public void Execute()
        {
            HashSet <ushort> ids = new HashSet <ushort>(withTransformGroup
                                                        .GetEntities()
                                                        .Select(item => item.id.value));

            float    matchTime = matchTimeStorage.GetMatchTime();
            Snapshot snapshot;

            try
            {
                snapshot = snapshotManager.CreateInterpolatedSnapshot(matchTime);
            }
            catch (Exception e)
            {
                log.Error(e.FullMessage());
                return;
            }

            if (snapshot == null)
            {
                throw new NullReferenceException($"snapshot is null");
            }

            foreach (var pair in snapshot.transforms)
            {
                ushort entityId = pair.Key;
                ViewTransformCompressed viewTransform = pair.Value;
                ServerGameEntity        gameEntity    = gameContext.GetEntityWithId(entityId);
                if (gameEntity == null)
                {
                    AddNewObject(entityId, viewTransform);
                }
                else
                {
                    UpdateTransform(gameEntity, viewTransform);
                    ids.Remove(gameEntity.id.value);
                }
            }

            foreach (ushort id in ids)
            {
                // log.Debug($"Удаление объекта id = {id}");
                ServerGameEntity gameEntity = gameContext.GetEntityWithId(id);
                gameEntity.isDestroyed = true;
            }
        }
示例#5
0
        /// <param name="t">Параметр прогресса между p1 и p2. Принимает значение в диапазоне от 0 до 1</param>
        /// <param name="p0"></param>
        /// <param name="p1"></param>
        /// <param name="p2"></param>
        /// <param name="p3"></param>
        /// <returns></returns>
        public static Snapshot Interpolate(float t, Snapshot p0, Snapshot p1, Snapshot p2, Snapshot p3)
        {
            if (t < 0 || 1 < t)
            {
                throw new ArgumentOutOfRangeException($"t was {t}");
            }

            Snapshot result = new Snapshot();

            foreach (ushort entityId in p2.transforms.Keys)
            {
                bool v0Exists = p0.transforms.TryGetValue(entityId, out var v0);
                bool v1Exists = p1.transforms.TryGetValue(entityId, out var v1);
                //always true
                bool v2Exists = p2.transforms.TryGetValue(entityId, out var v2);
                bool v3Exists = p3.transforms.TryGetValue(entityId, out var v3);

                ViewTransformCompressed interpolated;
                //Сколько точек есть для интерполяции?
                if (v0Exists && v1Exists && v2Exists && v3Exists)
                {
                    //интерполяция между черытьмя точками
                    Vector3 position = CatmullRomSpline
                                       .GetCatmullRomPosition(t, v0.GetPosition(), v1.GetPosition(),
                                                              v2.GetPosition(), v3.GetPosition());
                    float angle = Mathf.LerpAngle(v1.Angle, v2.Angle, t);
                    interpolated = new ViewTransformCompressed(position.x, position.z, angle, v2.viewTypeEnum);
                }
                else if (v1Exists && v2Exists)
                {
                    //интерполяция между двумя точками
                    Vector3 position = v1.GetPosition() * (1 - t) + v2.GetPosition() * t;
                    float   angle    = Mathf.LerpAngle(v1.Angle, v2.Angle, t);
                    interpolated = new ViewTransformCompressed(position.x, position.z, angle, v2.viewTypeEnum);
                }
                else
                {
                    //сущность была создана на этом кадре. интерполяция невозможна
                    interpolated = v2;
                }

                result.transforms.Add(entityId, interpolated);
            }

            return(result);
        }
示例#6
0
        public Snapshot Create()
        {
            Dictionary <ushort, ViewTransformCompressed> dictionary = new Dictionary <ushort, ViewTransformCompressed>();

            foreach (var entity in warshipsGroup)
            {
                ushort       id            = entity.id.value;
                Transform    transform     = entity.transform.value;
                float        angle         = entity.transform.value.rotation.eulerAngles.y;
                ViewTypeEnum viewTypeEnum  = entity.viewType.value;
                Vector3      position      = transform.position;
                var          viewTransform = new ViewTransformCompressed(position.x, position.z, angle, viewTypeEnum);
                dictionary.Add(id, viewTransform);
            }

            return(new Snapshot(dictionary));
        }
        private void UpdateTransform(ServerGameEntity entity, ViewTransformCompressed viewTransform)
        {
            ushort playerId = PlayerIdStorage.PlayerEntityId;

            if (entity.id.value == playerId)
            {
                return;
            }

            Vector3 vector = viewTransform.GetPosition();

            entity.transform.value.position = vector;
            entity.transform.value.rotation = Quaternion.AngleAxis(viewTransform.Angle, Vector3.up);
            ViewTypeEnum oldViewType = entity.viewType.value;

            if (oldViewType != viewTransform.viewTypeEnum)
            {
                string mes = $"Смена типа сущности. Было {oldViewType.ToString()} стало {viewTransform.viewTypeEnum}";
                log.Debug(mes);
                entity.ReplaceViewType(viewTransform.viewTypeEnum);
            }
        }
 public static void Change(this Transform transform, ViewTransformCompressed viewTransform)
 {
     transform.position = new Vector3(viewTransform.X, 0, viewTransform.Z);
     transform.rotation = Quaternion.AngleAxis(viewTransform.Angle, Vector3.up);
 }