| Дата: Среда, 29.06.2011, 13:06 | Сообщение # 1 |
Генералиссимус
Сообщений: 2438
|
Как сохранить героя в онлайн РПГ
О статье
В первую очередь, замечу, что статья написана для тех, кто хорошо знает GUI (Триггеры). Прекрасно понимает, что такое переменные и массивы, для чего они, что такое циклы.
В данной статье я выскажу своё мнение и отношение к сейвам в онлайн, объясню принцип загрузки/сохранения героя в рпг-онлайн, о том, как это делается в сингле и разумеется просмею всех кто писал на эту тему, особенно знаменитый сайт на букву Х..
Моё мнение
В основе действий всегда лежит причина, обычно это желание. Очень непонятным остается желание сохранить героя онлайн-рпг карты. Точнее сказать, я понимаю, что прикольно там загрузить своего раскаченного персонажа и бегать им всех убивать О_о, но другим разве от этого "прикольно"? К тому же, если карта полна квестов например... то код сейва будет крайне длинным. Проще нажать "сохранить" и потом догрузить карту.
К тому же, если сделать код сейва не запротекченным, то его начнут использовать, как читы
Ну да ладно, это всё не мои проблемы.
Основной принцип сохранялок в онлайн РПГ
Суть сохранения заключается в том, что мы сохраняем все переменные измененные этим героем. Например: уровень героя, предметы героя, изученные скилы, пройденные квесты и т.д.
В сингл рпг это возможно сделать через кэш функции, там всё просто: создаем кэш сохраняем переменные, сохраняем кэш.
В онлайн РПГ это не сработает =\
И что тогда делать? Основной элемент взаимодействия игрока с вариком, через который можно передать информацию - строка чата. И что? Нафиг нам строка чата, мы в ней будем сохранять героя?? Конечно нет. Сохранять героя мы будем в голове или на листке бумаги.
Я подойду к делу максимально просто и понятно:
Суть в том, что мы не будем ничего сохранять, мы будем создавать героя по данным из строки чата. Например, ввел игрок строку "Хочу героя 100 уровень уровень скилов 10, золота мильйон" и скрипт бац и выдал ему такого героя.
Конечно же многие начнут использовать это как чит, а значит надо это как-то завуалировать. Для начала определимся, как будет выглядеть наша строка (для объяснения каждое отдельное свойство я взял в квадратные скобки): -Load[01][10][30][25][34][05][05][06][07][500][0][200][01][01][02][03][04][05][06] Для компьютера это будет выглядеть так: -Load[Тип героя][уровень][Сила][ловкость][интелект][лвл первого скила][лвл второго скила][лвл третьего скила][четвертого][золото/2][остаток деления золота на 2][древесина/2][остаток деления древесины на 2][Предмет в слоте 1][Предмет в слоте 2][Предмет в слоте 3] [Предмет в слоте 4] [Предмет в слоте 5] [Предмет в слоте 6] Игрок видит это так: -Load011030253405050607500020001010203040506
Согласитесь, что игрок, не знающий ключа вряд ли сможет что-то понять, но напортачить сможет не мало
Сначала разберемся, почему у меня тип героя и предмета обозначены всего лишь 1им числом, а не словом и уж тем более не многозначным числом.
Создаем триггер "ini cod", в котором будет примерно такой код:
set udg_HeroType[1] = тут тип одного из героев рпг set udg_HeroType[2] = тут тип одного из героев рпг set udg_HeroType[3] = тут тип одного из героев рпг
Я записал в переменные типы 3ёх героев, что есть в моей карте. Обратите внимание, что записывал я через массив. Теперь при расшифровки кода мне будет достаточно узнать число от 1 до 3, что бы понять о каком герои идет речь. Далее я сделал ещё одно черное дело: set udg_ItemType[1] = Предмет, который можно получить в вашей карте set udg_ItemType[2] = Предмет, который можно получить в вашей карте set udg_ItemType[3] = Предмет, который можно получить в вашей карте set udg_ItemType[4] = Предмет, который можно получить в вашей карте set udg_ItemType[5] = Предмет, который можно получить в вашей карте ... set udg_ItemType[N] = Последний предмет, который можно получить в вашей карте
Теперь, я записал в переменные все типы предметов. Зачем я это сделал вы уже поняли, если нет, читайте ещё раз про героев.
В итоге любой тип, любое длинное значение можно свести к 1-2(в крайнем случае к 3) цифрам путем создания переменных типа масив и манипулируя их индексами.
И так, что мы имеем? Мы имеем переведенные значения в цифры и ключ для расшифровки этих цифр. Теперь мы можем создать триггер который будет при вводе игроком команды "Save" Шифровать данные об игроке и герое и высвечивать полученный код на экран. Затем мы создадим триггер который при вводе в чат кода, будет переделывать героя.
Возможно, кто-то удивился почему, например уровень скила записан вот так: [05]
Дело в том, что для обработки данных из строки мы будем брать substring и эти 2 символа при преобразовании в число будут иметь значение 5, но в строке 0 занимает, то место, на котором могла быть единица (если уровень скила может быть 10+).
Например: -Load[1][01][05], где ключ: тип героя(с условием, что героев меньше 10), уровень магии 1, уровень магии 2. Если в коде пропишем: set A = ((Entered chat string), 6, 1); То тип героя получим верный = 1 set A = ((Entered chat string), 7, 2); То уровень первой магиип получим верный = 1 set A = ((Entered chat string), 9, 2); То уровень второй магиип получим верный = 5
-Load[1][1][5], где ключ: тип героя(с условием, что героев меньше 10), уровень магии 1, уровень магии 2. set A = ((Entered chat string), 6, 1); То тип героя получим верный = 1 set A = ((Entered chat string), 7, 2); То уровень первой магиип получим равный = 15 (что не верно, но компьютер это проглотит, если есть такой уровень. set A = ((Entered chat string), 9, 2); То уровень второй магиип получим равный = 0 (т.к. цифр по этим индексам вообще нет)
Безопасность
Существует несколько видов обеспечения безопасности т.е. защиты от читеров. Их я описывать не стану, есть другие статьи, где об этом хорошо написано, в том числе не обязательно относящиеся к WarCraft.
Хочу лишь заметить, что для защиты от случайных ошибок достаточно ввести проверку контрольной суммы т.е. добавить в конце кода параметр, который будет равен сумме всех цифр из строки кода. И перед выполнением загрузки сверять сумму всех цифр строки (кроме последнего параметра контрольной суммы) с контрольной суммой. Такой метод известен достаточно давно и хорошо защетит от случайных опечаток.
разумеется просмею всех кто писал на эту тему, особенно знаменитый сайт на букву Х..
Сегодня один из гостей дал ссылку на скопированную у нас статью и нашёл я там же ссыль на статью с сайта N, где как раз обсуждалась система сохранения/загрузки героев в онлайн РПГ. Меня очень рассмешила их самоуверенность в том, что они придумали что-то новое, один признавал, что это придумал другой раньше, а под конец статьи приписал себе авторские права на метод шифрования Виженера :))))
Творческие люди, даже если вы сами до чего-то додумались, стоит подумать, а не придумал ли кто-то это раньше вас, если нет... вот тогда, бегите в патент бюро и только когда получите патент орите о том, какой вы гений.
И чуть не забыл: Если у вас в рпг есть квесты, то переменные по квестам тоже надо забивать в код сохранения.
В итоге мы получим очень длинную строку чисел.
Для сокращения полученной строки можно перевести число в другую систему исчисления, для этого есть масса наработок, но к сожалению не на этом сайте.
|
|
|
|