Esempio n. 1
0
        private bool TickCore(long elapsedTicks, RealmTime time)
        {
            Position pos = GetPosition(elapsedTicks);

            Move(pos.X, pos.Y);

            if (pos.X < 0 || pos.X > Owner.Map.Width)
            {
                Destroy(true);
                return(false);
            }
            if (pos.Y < 0 || pos.Y > Owner.Map.Height)
            {
                Destroy(true);
                return(false);
            }
            if (Owner.Map[(int)pos.X, (int)pos.Y].TileId == 0xff)
            {
                Destroy(true);
                return(false);
            }
            bool penetrateObsta = Descriptor.PassesCover;
            bool penetrateEnemy = Descriptor.MultiHit;

            ushort objId = Owner.Map[(int)pos.X, (int)pos.Y].ObjType;

            if (objId != 0 &&
                Manager.GameData.ObjectDescs[objId].OccupySquare &&
                !penetrateObsta)
            {
                Destroy(true);
                return(false);
            }
            double nearestRadius = double.MaxValue;
            Entity entity        = null;

            foreach (var i in collisionMap.HitTest(pos.X, pos.Y, 2))
            {
                if (i == ProjectileOwner.Self)
                {
                    continue;
                }
                if (i is Container)
                {
                    continue;
                }
                if (hitted.Contains(i))
                {
                    continue;
                }
                double xSide = (i.X - pos.X) * (i.X - pos.X);
                double ySide = (i.Y - pos.Y) * (i.Y - pos.Y);
                if (xSide <= 0.5f * 0.5f && ySide <= 0.5f * 0.5f && xSide + ySide <= nearestRadius)
                {
                    nearestRadius = xSide + ySide;
                    entity        = i;
                }
            }
            return(true);
        }
Esempio n. 2
0
        private void CheckEntity(RealmTime time, long elapsed)
        {
            var x = GetPosition(elapsed).X;
            var y = GetPosition(elapsed).Y;

            if (ProjectileOwner is Enemy)
            {
                collision = Owner.PlayersCollision;

                foreach (var i in collision.HitTest(x, y))
                {
                    if (x == i.X || y == i.Y)
                    {
                        Log.Warn("Tick!");
                    }
                }
            }
        }
Esempio n. 3
0
        private bool TickCore(long elapsedTicks, RealmTime time)
        {
            Position pos = GetPosition(elapsedTicks);

            Move(pos.X, pos.Y);

            if (pos.X < 0 || pos.X > Owner.Map.Width)
            {
                Destroy(true);
                return(false);
            }
            else if (pos.Y < 0 || pos.Y > Owner.Map.Height)
            {
                Destroy(true);
                return(false);
            }
            else if (Owner.Map[(int)pos.X, (int)pos.Y].TileId == 0xff)
            {
                Destroy(true);
                return(false);
            }
            else
            {
                bool penetrateObsta = Descriptor.PassesCover;
                bool penetrateEnemy = Descriptor.MultiHit;

                var objId = Owner.Map[(int)pos.X, (int)pos.Y].ObjType;
                if (objId != 0 &&
                    Manager.GameData.ObjectDescs[objId].OccupySquare &&
                    !penetrateObsta)
                {
                    Destroy(true);
                    return(false);
                }

                double nearestRadius = double.MaxValue;
                Entity entity        = null;
                foreach (var i in collisionMap.HitTest(pos.X, pos.Y, 2))
                {
                    if (i == ProjectileOwner.Self)
                    {
                        continue;
                    }
                    if (i is Container)
                    {
                        continue;
                    }
                    if (hitted.Contains(i))
                    {
                        continue;
                    }
                    double xSide = (i.X - pos.X) * (i.X - pos.X);
                    double ySide = (i.Y - pos.Y) * (i.Y - pos.Y);
                    if (xSide <= 0.5 * 0.5 && ySide <= 0.5 * 0.5 && xSide + ySide <= nearestRadius)
                    {
                        nearestRadius = xSide + ySide;
                        entity        = i;
                    }
                }
                if (entity != null && entity.HitByProjectile(this, time))
                {
                    if ((entity is Enemy && penetrateEnemy) ||
                        (entity is StaticObject && (entity as StaticObject).Static && !(entity is Wall) && penetrateObsta))
                    {
                        hitted.Add(entity);
                    }
                    else
                    {
                        Destroy(true);
                        return(false);
                    }
                    ProjectileOwner.Self.ProjectileHit(this, entity);
                }
            }
            return(true);
        }