ГлавнаяБлогКарты Warcraft 3Гайды для первой ДотыГайды для Доты 2 [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Зарегистрированные пользователи не видят всплывающей рекламы
Страница 1 из 11
Модератор форума: Goodie 
Форум » Картостроение в Warcraft 3 » Статьи » Как сохранить героя в онлайн РПГ (WarCraft III)
Как сохранить героя в онлайн РПГ
Дата: Среда, 29.06.2011, 13:06 | Сообщение # 1
Генералиссимус
Заблокированные
Сообщений: 2263
Награды: 8
Репутация: 85
Как сохранить героя в онлайн РПГ

О статье

В первую очередь, замечу, что статья написана для тех, кто хорошо знает 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, где как раз обсуждалась система сохранения/загрузки героев в онлайн РПГ.
Меня очень рассмешила их самоуверенность в том, что они придумали что-то новое, один признавал, что это придумал другой раньше, а под конец статьи приписал себе авторские права на метод шифрования Виженера :))))

Творческие люди, даже если вы сами до чего-то додумались, стоит подумать, а не придумал ли кто-то это раньше вас, если нет... вот тогда, бегите в патент бюро и только когда получите патент орите о том, какой вы гений.

И чуть не забыл:
Если у вас в рпг есть квесты, то переменные по квестам тоже надо забивать в код сохранения.

В итоге мы получим очень длинную строку чисел.

Для сокращения полученной строки можно перевести число в другую систему исчисления, для этого есть масса наработок, но к сожалению не на этом сайте.
 
Форум » Картостроение в Warcraft 3 » Статьи » Как сохранить героя в онлайн РПГ (WarCraft III)
Страница 1 из 11
Поиск: