Логотип игрового форума RF-Cheats.ru    
Новости онлайн игр Гарант RF-Cheats.ru Чёрный рынок Реклама и привилегии Разработка читов Арбитраж

Регистрация Бан-лист Сообщество ПОПУЛЯРНОЕ
Вернуться   RF-Cheats.ru - форум читеров и ботоводов > > > >

Статьи о Rising Force

: Статьи описывающие те или иные особенности, фишки игры RFO.
Читы и обход фроста для RF Online без хайдаБоты и читы для Perfect World бесплатно без хайдаМоды и читы для World of Tanks (WoT) бесплатно без хайдаМоды и читы для Armored Warfare бесплатно без хайдаБоты и читы для DOTA 2 бесплатно без хайдаБоты и читы для Black Desert Online бесплатно без хайдаЧиты на ArcheAge бесплатно без хайдаЧиты для Warface бесплатно без хайдаВзлом ВКонтакте и ОдноклассниковСписок разделов со всеми играмиЧиты для онлайн игр






Ответ
 
Сделать тему важной Опции темы
Старый 12.01.2008, 01:27   #1
saaleb
Гость
Аватар для saaleb
Сообщений: n/a
Благодарностей:
0 всего

Исследование алгоритма заточки предметов


Итак, благодаря одному из участников форума(а конкретнее Airsimer, за что ему большое спасибо) мне в руки попались исходники сервера RF Online Giga3. Скажу сразу - версия старая, серверов на ее основе сейчас практически нет и современная ситуация может сильно отличаться от описанной. Тем более, исходники неполные и в рабочий сервер скомпилировать их мне не удалось.

Но зато появилась возможность посмотреть и выяснить давно мучавший меня вопрос, а именно - алгоритм работы Великого Корейского Рандома, вокруг которого ходило много мифов и легенд и сломано немало копий в спорах. И хотя версия устарела, не думаю, что принцип работы Giga3 будет сильно отличаться от современных версий.

Хочу сразу разочаровать любителей рецептов типа "убить флема в новолуние, забрать лут и выкинуть перед Героем помахав рукой - 100% точка!" - таких алгоритмов в исходниках мне обнаружить не удалось. Конечно, тут могут возразить - "а как же точатся на +7, я сам видел!". Точатся. Но не обычным способом, а с помощью одного финта, о котором я расскажу ниже.

Итак, главный вывод, который я вынес из просмотра исходников - Корейский Рандом существует! :)
Именно так - основная функция, с помощью которой оценивается успешная заточка и последствия неуспешной - стандартная функция С rand(). Вообще по стандарту эта функция возвращает случайное число типа float в промежутке от 0 до 1. Единственное, что влияет на ее значение - так называемое начальное значение, задаваемое функцией srand(). Так вот, начальное значение этой функции является текущее время, вернее, его преобразованное числовое значение

PHP код:
srand((unsigned)time(NULL)); 
Но это знание ничего нам не дает, кроме того, что рецепты типа "точись в полночь!" не так уж и необоснованы.

Идем дальше.

За заточку предмета отвечает функция pc_UpgradeItem, находящаяся в файле player.cpp. Рассмотрим ее подробнее.

С самого начала идут многочисленные проверки на соответствие предметов, слотов, таликов, камней и прочей. Кстати, все несоотвествия логируются по умолчанию, так что пакетчики - будьте осторожны!

Дальше начинается самое интересное.

1. Устанавливается рейт на основании использованных камней. Рейты каждого камня берутся из базы и суммируются. Рейт без камня - 0,125.
PHP код:
for(int i 0upgrade_jewel_numi++)
{
if(!
pJewelFld***91;i***93;)
   
fRate += 0.125;
else
   
fRate += pJewelFld***91;i***93;;

2. Далее вычисляется рейт вещи в зависимости от ее уровня

PHP код:
BYTE GetItemUpgedLv(DWORD dwLvBit)
{
    
BYTE byLv 0;
    for(
int g 0MAX_ITEM_LVg++)
    {
        
BYTE byTemp = (BYTE)((dwLvBit>>(g*4))&0x0000000F);
        if(
byTemp == __NO_TALIK)
            break;
        
byLv++;
    }
    return 
byLv;

конструкция не совсем ясна, но насколько я понял, вычисляемый левел - количество УЖЕ вставленных таликов - каждый бит переменной dwLvBit соответствует вставленному талику. Левелов всего 7, что вполне естественно. Похоже, от типа вставленных таликов зависимости нет.
Небольшое дополнение - рейт вещи вычисляется на основании вставленных таликов + учитывается вставляемый талик. Т.е. при расчете вещь считается уже проталеной, поэтому далее в конструкциях switch - case есть число 7.

3. Вычисляется общий, базовый рейт
PHP код:
dwTotalRate s_dwItemUpgSucRate***91;byLv***93;*fRate/upgrade_jewel_num)*1000
значение s_dwItemUpgSucRate зависит от левела и является массивом
s_dwItemUpgSucRate[] = {100, 75, 50, 25, 10, 5, 1};

4. Берется рандом.

PHP код:
DWORD dwR1 rand();
DWORD dwRand = (dwR1<<16)+rand(); 
5. Первая проверка - талик вставится или сгорит

dwTotalRate <= dwRand%100000

сравнивается базовый рейт и рандом.

6. если первая проверка прошла(базовый рейт меньше либо равен рандому) идет проверка - сгорят ли уже вставленные талики
PHP код:
switch(byLv)
            {
            case 
5:
                if(
125 > ::rand()%1000)
                    
bTalikBreak true;
                break;
            case 
6:
                if(
250 > ::rand()%1000)
                    
bTalikBreak true;
                break;
            case 
7:
                if(
500 > ::rand()%1000)
                    
bTalikBreak true;
                break;
            } 
это зависит от рейта вещи, т.е. уже вставленных таликов и.... заново вычиляемого рандома.

7. Если талики не сгорают, то вычисляется поломка вещи

PHP код:
bool bItemBreak false;
switch(
byLv)
{
    case 
5:
        if(
125 > ::rand()%1000)
        
bItemBreak true;
        break;
    case 
6:
        if(
250 > ::rand()%1000)
        
bItemBreak true;
        break;
    case 
7:
        if(
500 > ::rand()%1000)
        
bItemBreak true;
            break; 
Опять же, зависит от рейта вещи и заново вычисляемого рандома.

После этого выполняются необходимые действия - уничтожение вещи, таликов или помещение в слот успешно модифицированного оружия.

Ниже расположена ссылка на исходный код программы, которая реализует описанный алгоритм. Можете сами попробовать ее скомпилировать и поэкспериментировать с различными комбинациями - вставленными таликами и камнями.

Да, насчет точки +7. В исходнике имеется следующая конструкция:

if(m_bCheat_100SuccMake)
dwTotalRate = 0xFFFFFFFF;

эта переменная при установке ее в значение true дает 100% шанс создания и модификации предмета.
переменная является параметром чара и устанавливается владельцем базы. возможно, GM имеют такой флаг и без проблем делают пухи +7. Обычным методом заточить на +7 очень маловероятно.


Любые дополнения и исправления к статье приветствуются. Все вопросы в ПМ либо тут.

Модераторам - если я ошибся с разделом, просьба переместить сообщение в необходимый раздел.

Последний раз редактировалось saaleb; 12.01.2008 в 13:23. Причина: Дополнение
 
Ответить с цитированием
Сказали спасибо:
proteinof (31.01.2018), Недоступно (19.01.2011), константин1986 (24.12.2010), elvis290 (21.08.2010), NewWarrior (23.07.2010), vovikkk (02.09.2009), SpRee (23.08.2009), Lone (06.07.2009), Staya (20.06.2009), SalomandraNeo (24.04.2009), Tooy (29.03.2009), Venom_666 (31.01.2009), Helper (03.12.2008), ShiDLeR (02.10.2008), Недоступно (02.10.2008), Недоступно (28.09.2008)


Старый 12.01.2008, 16:36   #2
Gun
Гость
Аватар для Gun
Сообщений: n/a
Благодарностей:
0 всего

А что если создать прогу на этом алгоритме?
На сколько я понял зависимость тут от id предмета и от времени!Типа каждый предмет имеет свой начальный шанс заточки-об этом как упомянул ГМ!
Так вот создать прогу и узнать id вещей,после чего проверять точится в это время и этот предмет или нет.
Идейка кончено бредовая но тем не менее!



Кстати посмотрел алгоритм там много понятных вещей,но вот значения 125,250,500 которые типа в кейсах 5,6,7 этого чего то не оч понимаю,эт типа заточка на +5,+6,+7?)

Цитата:
if(125 > ::rand()%1000)
bItemBreak = true;
break;
А это на сколько я понял,если правда знать что такое 125 то впринципе моно понять что если что то меньше 125 то типа вставится в пративном случает горит, а в скобках у rand вроде должно ещё стоять значение)Кончено я бредятину мож пишу но в принципе рандома не существует)А существуют только неизвестные параметры вещей,если их узнать то моно обойти велики рандом!

Последний раз редактировалось Gun; 12.01.2008 в 16:45.
 
Ответить с цитированием
Старый 12.01.2008, 17:04   #3
LastDream
Гость
Аватар для LastDream
Сообщений: n/a
Благодарностей:
0 всего

Сомневаюсь по поводу проги. Так если алгоритм будет учитывать время с точностью до секунды,то ничего не выйдет. А вот если время берется с точностью до минуты,то можно написать прогу. Другой вопрос в том,что из-за рандома она,скорее всего, не будет выдавать верного значения.
 
Ответить с цитированием
Старый 12.01.2008, 17:31   #4
Gun
Гость
Аватар для Gun
Сообщений: n/a
Благодарностей:
0 всего

Время не обезательно до секунды хотя можно сделать и это!А по поводу получится или нет,я сказать немогу!Хотя по сути можно сделать некий файл который мог бы проверять получится заточка или нет,если есть зависимость от времени то можно ег овыставить а в общем все значения ест ьесли есть сервер да и алгоритм более менее понятен!Так судя по алгоритму всё таки рандома нету!Ведь получается в сам сервер вшит этот алгоритм значит моно создать мини прогу,которая будет работать по одной из функций сервера в данном случае по заточке!Ну эт опять же рассуждения!


Цитата:
Другой вопрос в том,что из-за рандома она,скорее всего, не будет выдавать верного значения.
Ты имееш ввиду что всё таки будет всё время выдавать разные показания?Так если есть зависимость то в большенстве случаев он будет показывать одно и тоже!Зависимость судя по всему от времени и от камня ну или rate,так если она верна то будет один ответ!Либо получилось либо нет!Только вот вопрос кто сможет аткое чудо написать!Я знаком с программирование но не на столько глубако!



Пусть Dark попробует)
Если он сделает прогу то сможет за деньги её распространять!Скажем прилипить ещё пароли к каждой версии!И продавать!)

Последний раз редактировалось Gun; 12.01.2008 в 17:36.
 
Ответить с цитированием
Сказали спасибо:
Недоступно (28.08.2008)
Старый 12.01.2008, 18:04   #5
LastDream
Гость
Аватар для LastDream
Сообщений: n/a
Благодарностей:
0 всего

Цитата:
Сообщение от Gun Посмотреть сообщение
Ты имееш ввиду что всё таки будет всё время выдавать разные показания?
Именно это я и подразумевал. А вообще,все это теории. Надо проверять на практике)
 
Ответить с цитированием
Сказали спасибо:
Недоступно (28.08.2008)
Старый 12.01.2008, 18:17   #6
saaleb
Гость
Аватар для saaleb
Сообщений: n/a
Благодарностей:
0 всего

Цитата:
Сообщение от Gun Посмотреть сообщение
А что если создать прогу на этом алгоритме?
На сколько я понял зависимость тут от id предмета и от времени!Типа каждый предмет имеет свой начальный шанс заточки-об этом как упомянул ГМ!
Так вот создать прогу и узнать id вещей,после чего проверять точится в это время и этот предмет или нет.
Идейка кончено бредовая но тем не менее!



Кстати посмотрел алгоритм там много понятных вещей,но вот значения 125,250,500 которые типа в кейсах 5,6,7 этого чего то не оч понимаю,эт типа заточка на +5,+6,+7?)



А это на сколько я понял,если правда знать что такое 125 то впринципе моно понять что если что то меньше 125 то типа вставится в пративном случает горит, а в скобках у rand вроде должно ещё стоять значение)Кончено я бредятину мож пишу но в принципе рандома не существует)А существуют только неизвестные параметры вещей,если их узнать то моно обойти велики рандом!

Дело в том, что рандом зависит от времени лишь косвенно. И алгоритм вычисления случайного значение недетерминистичный, т.е. в одинаковое время рандом будет иметь разное значение. Написать прогу, угадывающую время высокого шанса заточки нереально.

Насколько я понял, В кейсах указано именно заточенность, причем еще не вставленный талик считается. Т.е. вещь заточена на +1, а вероятность вставки в нее расчитывается как для вещи +2. Хотя не совсем понятно, почему только с +4 заточки идет вычисление сгорания таликов и ломки вещи - у меня ломалась и на +2 -> +3.

Добавлено через 10 минут
Цитата:
Сообщение от Gun Посмотреть сообщение
Время не обезательно до секунды хотя можно сделать и это!А по поводу получится или нет,я сказать немогу!Хотя по сути можно сделать некий файл который мог бы проверять получится заточка или нет,если есть зависимость от времени то можно ег овыставить а в общем все значения ест ьесли есть сервер да и алгоритм более менее понятен!Так судя по алгоритму всё таки рандома нету!Ведь получается в сам сервер вшит этот алгоритм значит моно создать мини прогу,которая будет работать по одной из функций сервера в данном случае по заточке!Ну эт опять же рассуждения!



Ты имееш ввиду что всё таки будет всё время выдавать разные показания?Так если есть зависимость то в большенстве случаев он будет показывать одно и тоже!Зависимость судя по всему от времени и от камня ну или rate,так если она верна то будет один ответ!Либо получилось либо нет!Только вот вопрос кто сможет аткое чудо написать!Я знаком с программирование но не на столько глубако!



Пусть Dark попробует)
Если он сделает прогу то сможет за деньги её распространять!Скажем прилипить ещё пароли к каждой версии!И продавать!)

Да, рандом все время выдает разные значения(по идее). Попробуйте скомпилить маленькую программку в приложении и посмотрите - будут ли там одинаковые значение. Сделать прогу, угадывающую рандом НЕРЕАЛЬНО!

вот маленький пример:
PHP код:
srand((unsigned)time(NULL)); //инициализируем рандомайзер
cout << "time: " << (unsigned)time(NULL) << endl//время выдается функций в таком формате
for (int i=0i<20i++) cout << << "rand: " << rand()%1000 << endl;  //цикл выдающий значение рандома 

и ее вывод

time: 1200150852
0rand: 36
1rand: 870
2rand: 947
3rand: 485
4rand: 469
5rand: 808
6rand: 463
7rand: 683
8rand: 441
9rand: 303
10rand: 14
11rand: 76
12rand: 512
13rand: 481
14rand: 938
15rand: 427
16rand: 443
17rand: 822
18rand: 686
19rand: 174

есть одинаковые значения?

Последний раз редактировалось saaleb; 12.01.2008 в 18:27. Причина: Добавлено сообщение
 
Ответить с цитированием
Старый 12.01.2008, 18:41   #7
LastDream
Гость
Аватар для LastDream
Сообщений: n/a
Благодарностей:
0 всего

Естественно нет и быть не может)
 
Ответить с цитированием
Старый 12.01.2008, 18:52   #8
dimitry4
Гость
Аватар для dimitry4
Сообщений: n/a
Благодарностей:
0 всего

Ну рандом естественно угодать нельзя, но примерные шансы на заточку узнать можно. Тоесть хорошо было-бы если скажем в прогу ты вводишь параметры (что, чем и когда) а она выдает тебе: шанс заточки равен 0.000001
 
Ответить с цитированием
Старый 12.01.2008, 19:24   #9
LastDream
Гость
Аватар для LastDream
Сообщений: n/a
Благодарностей:
0 всего

Да не будет такого. Цифры вообще разные получаться скорее всего!
 
Ответить с цитированием
Старый 12.01.2008, 19:49   #10
saaleb
Гость
Аватар для saaleb
Сообщений: n/a
Благодарностей:
0 всего

Цитата:
Сообщение от dimitry4 Посмотреть сообщение
Ну рандом естественно угодать нельзя, но примерные шансы на заточку узнать можно. Тоесть хорошо было-бы если скажем в прогу ты вводишь параметры (что, чем и когда) а она выдает тебе: шанс заточки равен 0.000001
Можно. Указывать: количество и тип камней, количество вставленных таликов. Это единственные параметры, которые нужны. Хотя, возможно в современных серверах другой алгоритм
 
Ответить с цитированием
Ответ



Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Мир танков | Проект "Армата" | ArcheAge | Black Desert | РФ Онлайн | Айон | Майнкрафт | Браузерные игры
Элдер скролс | Р2 Онлайн | Реквием Онлайн | ПУБГ | Роял Квест | ГТА Санадреас | Контра | Дота 2
Мир кораблей | Лост Арк | Arma2 DayZ mod | The War Z | Карос: Начало | Tera Online
Читы для всех Онлайн-игр