Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Движок la2
#91
Gaikotsu Написал:
оффтоп

Вообще не ожидал что этим еще кто-то запаривался
Ответ
#92
Alay Написал:Вообще не ожидал что этим еще кто-то запаривался
Просто я стараюсь руководствоваться принципом "если есть возможность прислать невалидные данные, то игроки этим обязательно воспользуются" и посему стараюсь по возможности проверять и перепроверять все что присылает клиент, ибо по определению "все врут" (с) ^_^
Ответ
#93
Alay Написал:Вообще не ожидал что этим еще кто-то запаривался

У каждого свои ожидания, есть кто не ожидал, что еще кто-то не сделал валидацию входящих данных.
open-team.ru - Freya, HighFive...
Ответ
#94
Но на шарпе так не получиться красиво провернуть через энум. В шарпе энум это константа. в яве - инстанс. (enum может быль лишь базовым типом - int char и тд. Следовательно придется делать структуру и добавлять ее в массив и потом уже опрашивать... и вся эта красота пропадает.
Ответ
#95
Кстати на ПТС те же грабли.
Когда ввели GoD хроники на американских серверах создание персов с неверными параметрами работало и перс был невидимым.
Ответ
#96
flopix Написал:Кстати на ПТС те же грабли.
Когда ввели GoD хроники на американских серверах создание персов с неверными параметрами работало и перс был невидимым.
Вот это поворот...

Добавлено через 18 минут
не знаю как вам, а лично мне работать над таким кодом не очень приятно.
Код:
internal struct HStyle
    {
        private readonly int[] _sex;

        public HStyle(int[] sex)
        {
            _sex = sex;
        }

        public bool IsAllowed(Appearance.BaseSex sex)
        {
            return _sex.Any(t => t == (int)sex);
        }
    }
    internal struct HColor
    {
        private readonly int[] _race;

        public HColor(int[] race)
        {
            _race = race;
        }

        public bool IsAllowed(Appearance.BaseRace race)
        {
            return _race.Any(t => t == (int)race);
        }
    }


        public static bool CheckAppearenceV2(BaseRace baseRace, BaseSex baseSex, int baseClassId, int face, int hairStyle,
            int hairColor)
        {
            if (baseSex < 0 || (int)baseSex > 1 ||
                face < 0 || face > 2 ||
                hairStyle < 0 || hairStyle > 6 ||
                hairColor < 0 || hairColor > 3 ||
                baseRace == BaseRace.Ethria && baseSex == BaseSex.Male)
                return false;
            return IsValidHairStyle(baseSex, hairStyle) && IsValidHairColor(baseRace, hairColor);
        }

        #region Private

        private static readonly HStyle[] HairStyles =
        {
            new HStyle(new []{ (int)BaseSex.Male, (int)BaseSex.Female}) ,
            new HStyle(new []{ (int)BaseSex.Male, (int)BaseSex.Female}) ,
            new HStyle(new []{ (int)BaseSex.Male, (int)BaseSex.Female}) ,
            new HStyle(new []{ (int)BaseSex.Male, (int)BaseSex.Female}) ,
            new HStyle(new []{ (int)BaseSex.Male, (int)BaseSex.Female}) ,
            new HStyle(new []{ (int)BaseSex.Female}),
            new HStyle(new []{ (int)BaseSex.Female})
        };
        private static readonly HColor[] HairColors =
        {
            new HColor(new []{ (int)BaseRace.Human, (int)BaseRace.Elf, (int)BaseRace.DarkElf, (int)BaseRace.Ork, (int)BaseRace.Dwarf, (int)BaseRace.Kamael, (int)BaseRace.Ethria}),
            new HColor(new []{ (int)BaseRace.Human, (int)BaseRace.Elf, (int)BaseRace.DarkElf, (int)BaseRace.Ork, (int)BaseRace.Dwarf, (int)BaseRace.Kamael, (int)BaseRace.Ethria}),
            new HColor(new []{ (int)BaseRace.Human, (int)BaseRace.Elf, (int)BaseRace.DarkElf, (int)BaseRace.Ork, (int)BaseRace.Dwarf, (int)BaseRace.Kamael, (int)BaseRace.Ethria}),
            new HColor(new []{ (int)BaseRace.Human, (int)BaseRace.Elf, (int)BaseRace.DarkElf, (int)BaseRace.Ork, (int)BaseRace.Dwarf})
        };
        private static bool IsValidHairStyle(BaseSex sex, int hairStyle)
        {
            if (hairStyle < 0 || hairStyle > HairStyles.Length) return false;
            return HairStyles[hairStyle].IsAllowed(sex);
        }
        private static bool IsValidHairColor(BaseRace race, int hairColor)
        {
            if (hairColor < 0 || hairColor > HairColors.Length) return false;
            return HairColors[hairColor].IsAllowed(race);
        }
        #endregion

причина по которой я за него не взялся - не мог сообразить что брать за ключ чтобы чекать все сразу в одной сущности а не разбивать на проверки стиля волос цвета к расе и тд. А в итоге получем несколько несвязных зависимостей из за которых все равно придется залезать "в тухлые свичи" та же проверка на мужика к артейке к примеру.
На мой взгяд тут вообще все относительно и мой вариант в плане масштабируемости и поддержке был куда проще. по крайней мере для меня
Ответ
#97
flopix Написал:Кстати на ПТС те же грабли.
Когда ввели GoD хроники на американских серверах создание персов с неверными параметрами работало и перс был невидимым.
на птс граблей хватает, это да.
притом о них все знают, но нцсофт нихрена их не чинит.

чего стоит возможность к примеру тягать любые мелкие файлы (до 8/16кб размером) с сервера, через пакеты. и дырка эта существует еще с самых первых хроник и не знают о ней по моему уже только самые ленивые.
А ведь всех делов то, добавить проверку к примеру на то, что запрашиваемый файл имеет тип htm/html и все - ничего кроме хтмлок вытащить с сервера не удастся.
Ответ
#98
Alay Написал:Вообще не ожидал что этим еще кто-то запаривался

Действительно, зачем проверять входные данные от пользователя?
[Изображение: fa17e0fa70bb.jpg]
Ответ
#99
Camelion Написал:Вы сначала померяйте своё существенное падение производительности, а потом уже говорите: было медленно и херово, переписал по другому стало быстрее, график до:; график после:;.
По факту же - эти ваши проверки забиты на уровне ПТС скриптов, достаточно достать оттуда чиселки, положить в мапу и сравнить с тем что получили от клиента. Вот и будет вам быстрое и простое решение.

Код:
private static void Main()
        {
            var sw = new Stopwatch();
            for (var i = 0; i < 20; i++)
            {
                sw.Restart();
                var result = Appearance.CheckAppearence(Appearance.BaseRace.Ethria, Appearance.BaseSex.Female, 183, 1, 0, 0);
                sw.Stop();
                Console.WriteLine($"Тест моего говнокода. Прогон {i + 1}й занял {sw.ElapsedNanoSeconds()} наносекунд. Результат {result}");
            }
            for (var i = 0; i < 20; i++)
            {
                sw.Restart();
                var result = Appearance.CheckAppearenceV2(Appearance.BaseRace.Ethria, Appearance.BaseSex.Female, 183, 1, 0, 0);
                sw.Stop();
                Console.WriteLine($"Тест красивой обертки. Прогон {i + 1}й занял {sw.ElapsedNanoSeconds()} наносекунд. Результат {result}");
            }
            Console.ReadLine();
        }
[Изображение: Bg-FeBzz9VovXNn1I6mvvPeUTp4Dy_eRcovjL6fg...946f92da74]

На первый прогон не обращать внимание - трансляция Jit'ом.
Понятно что цифры не существенные. но все же. а так как win - не система реального времени - более точные цифры мы не получим
Ответ
Смысл тонкой оптимизации такого кода если он выполняется редко и не крутится в цикле?
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Самописный движок pointvortex 2 1,811 11-29-2012, 09:27 PM
Последний пост: pointvortex

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)