Перейти к содержанию
Авторизация  
BORDIR

Reward Overworld

Рекомендуемые сообщения

UPD Извиняюсь, не разобрался.

 

Всем привет. Уже удалял это сообщение, когда пришла идея в голову, но она оказалась неверной. Поэтому восстанавливаю тему.

 

Буду рад всем, кто откликнется и решит попробовать помочь разобраться.

 

Итак: Последние пару дней работаю над стандартной оверворлдовской системой расчета дропа (High Five) и хочу немного ее изменить, а также разобраться, как работает.

 

Почти все понимаю, где и что происходит, кроме одного(RewardGroup.java):

 

public void addData(RewardData item)
{
 if(item.getItem().isAdena())
  _isAdena = true;
 _chanceSum += item.getChance();
 item.setChanceInGroup(_chanceSum);
 _items.add(item);
}

 

Думал, что это и есть фактически самое начало. Добавляются данные в некоторый список итемов.

 

Так вот, для некоторых целей решил изменить данный код (Проверка на нерейтовость еще до выявления рейта из конфига):

 

public void addData(RewardData item)
{
 _notRate = false;
 if(item.getItem().isAdena())
  _isAdena = true;
 if((Config.NO_RATE_EQUIPMENT && item.getItem().isEquipment()) // отключаемая рейтовка эквипа
   || (Config.NO_RATE_KEY_MATERIAL && item.getItem().isKeyMatherial()) // отключаемая рейтовка ключевых материалов
   || (Config.NO_RATE_RECIPES && item.getItem().isRecipe()) // отключаемая рейтовка рецептов
   || ArrayUtils.contains(Config.NO_RATE_ITEMS, item.getItemId)) // индивидаульная отключаемая рейтовка для списка предметов
   || (Config.NO_RATE_HERBS && item.getItem().isHerb()) // отключаемая рейтовка хербов
   || (Config.NO_RATE_ENCHANT_SCROLL && item.getItem().isEnchantScroll())
   || (Config.NO_RATE_ATT && item.getItem().isAttributeCrystal())
   || (Config.NO_RATE_ATT && item.getItem().isAttributeJewel())
   || (Config.NO_RATE_ATT && item.getItem().isAttributeStone())
   || (Config.NO_RATE_ATT && item.getItem().isAttributeEnergy())
   || (Config.NO_RATE_LIFE_STONE && item.getItem().isLifeStone())
   || (Config.NO_RATE_CODEX_BOOK && item.getItem().isCodexBook())
   || (Config.NO_RATE_FORGOTTEN_SCROLL && item.getItem().isForgottenScroll()))
  _notRate = true; 
 _chanceSum += item.getChance();
 item.setChanceInGroup(_chanceSum);
 _items.add(item);
}

 

После данных изменений перестают рейтоваться все вещи. Но, если же оставить 3-4 условия, то все работает стабильно. Что-то зажевывается. Помогите, пожалуйста, найти проблему.

 

Если необходимо, могу предоставить полные классы.

 

Всем добра :)

Изменено пользователем BORDIR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

.

Изменено пользователем BORDIR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем 4 раза NO_RATE_ATT?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем 4 раза NO_RATE_ATT?

 

Там разные виды атов, так Кекес дописал, лень было просто исправлять.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мб ошибка в инд дропе вещей

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обновил первый пост, моя идея оказалась неудачной, проблема осталась.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мб ошибка в инд дропе вещей

 

Проверял айди уже, там все в порядке. Возникает ощущение, что данный код проходит только несколько раз, а не через все предметы (не знаю почему) и последнее состояние нерейтовости сохраняется для оставшихся предметов.

 

При пяти условиях, например, у некоторых мобов весь дроп нерейтованный, а у остальных все ок.

Изменено пользователем BORDIR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Либо я вообще неправильно понимаю, что выполняется в данной части кода.

Изменено пользователем BORDIR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что у вас в дропе?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что у вас в дропе?

 

Мобы с ЛОА. Как я уже писал, некоторые обрабатываются нормально, остальные криво. При меньшем количестве условий нерейтовости, обрабатываются все (? не уверен).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где-то идет утечка. Могу скинуть скрины с различными вариантами рейтовости.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Код в теме с ошибкой выложил :

 

public void addData(RewardData item)
{
 _notRate = false;
 if(item.getItem().isAdena())
  _isAdena = true;
 if((Config.NO_RATE_EQUIPMENT && item.getItem().isEquipment()) // отключаемая рейтовка эквипа
    || (Config.NO_RATE_KEY_MATERIAL && item.getItem().isKeyMatherial()) // отключаемая рейтовка ключевых материалов
    || (Config.NO_RATE_RECIPES && item.getItem().isRecipe()) // отключаемая рейтовка рецептов
    || ArrayUtils.contains(Config.NO_RATE_ITEMS, item.getItemId) // индивидаульная отключаемая рейтовка для списка предметов
    || (Config.NO_RATE_HERBS && item.getItem().isHerb()) // отключаемая рейтовка хербов
    || (Config.NO_RATE_ENCHANT_SCROLL && item.getItem().isEnchantScroll())
    || (Config.NO_RATE_ATT && item.getItem().isAttributeCrystal())
    || (Config.NO_RATE_ATT && item.getItem().isAttributeJewel())
    || (Config.NO_RATE_ATT && item.getItem().isAttributeStone())
    || (Config.NO_RATE_ATT && item.getItem().isAttributeEnergy())
    || (Config.NO_RATE_LIFE_STONE && item.getItem().isLifeStone())
    || (Config.NO_RATE_CODEX_BOOK && item.getItem().isCodexBook())
    || (Config.NO_RATE_FORGOTTEN_SCROLL && item.getItem().isForgottenScroll()))
  _notRate = true;
 _chanceSum += item.getChance();
 item.setChanceInGroup(_chanceSum);
 _items.add(item);
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ах да, забыл написать, что происходит при нерейтовости:

 

public List<RewardItem> rollItems(double mod, double baseRate, double playerRate)
{
if(mod <= 0)
return Collections.emptyList();
double rate;
if(_notRate)
rate = playerRate * mod;
else
rate = baseRate * playerRate * mod;
double mult = Math.ceil(rate);
List<RewardItem> ret = new ArrayList<RewardItem>((int) (mult * _items.size()));
for(long n = 0; n < mult; n++)
if(Rnd.get(1, RewardList.MAX_CHANCE) <= _chance * Math.min(rate - n, 1.0))
rollFinal(_items, ret, 1., Math.max(_chanceSum, RewardList.MAX_CHANCE));
return ret;
}

 

Может быть и в этом ошибка. В общем постарался расписать проблему по максимуму.

Изменено пользователем BORDIR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если вещи попадают в условие выше и соответственно установлен в конфиге параметр true - срабатывает формула

 

rate = playerRate * mod;

 

 

если нет и вещь проходит дальше, то

 

rate = baseRate * playerRate * mod;

 

Что у вас в дропе, скрины я просил.

Изменено пользователем byldas

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если вещи попадают в условие выше и соответственно установлен в конфиге параметр true - срабатывает формула

 

rate = playerRate * mod;

 

 

если нет и вещь проходит дальше, то

 

rate = baseRate * playerRate * mod;

 

Что у вас в дропе, скрины я просил.

 

Да, это я понимаю, так как сам дописывал :) На овере немного по-другому в оригинале. Но там вообще нерейтовка на данном моменте не реализована.

 

Сейчас сделаю скрины, а также продемонстрирую проблему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как ты думаешь дебаг дураки придумали? Из всего что я увидел в теме, так только попытки тыкать пальцем в небо, а не поиск косяка.

 

А теперь главный косяк=) А косяк у тебя в использовании _notRate. Ты же её для всего класса юзаеш, а не для каждого итема. Так вот какое значение последний итем оставит, так и будет дроп у тебя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как ты думаешь дебаг дураки придумали? Из всего что я увидел в теме, так только попытки тыкать пальцем в небо, а не поиск косяка.

 

А теперь главный косяк=) А косяк у тебя в использовании _notRate. Ты же её для всего класса юзаеш, а не для каждого итема. Так вот какое значение последний итем оставит, так и будет дроп у тебя.

 

Тоже так подумал, даже тему закрыл. Но isAdena же как-то не перекрывает всё еще в самом начале, верно?

 

А также при некоторых условиях все работает. Поэтому все же решил, что решение возможно найти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скинь весь файлик, попробую намудрить че нить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А зачем вы в этот клас лезете?

 

У вас есть RewardData

в нем и колдуйте

 

public RewardData(int itemId)
{
_item = ItemHolder.getInstance().getTemplate(itemId);
if(_item.isArrow() // стрелы не рейтуются
|| (Config.NO_RATE_EQUIPMENT && _item.isEquipment()) // отключаемая рейтовка эквипа
|| (Config.NO_RATE_KEY_MATERIAL && _item.isKeyMatherial()) // отключаемая рейтовка ключевых материалов
|| (Config.NO_RATE_RECIPES && _item.isRecipe()) // отключаемая рейтовка рецептов
|| ArrayUtils.contains(Config.NO_RATE_ITEMS, itemId) // индивидаульная отключаемая рейтовка для списка предметов
|| (Config.NO_RATE_HERBS && _item.isHerb()) // отключаемая рейтовка хербов
|| (Config.NO_RATE_ENCHANT_SCROLL && _item.isEnchantScroll())
|| (Config.NO_RATE_ATT && _item.isAttributeCrystal())
|| (Config.NO_RATE_ATT && _item.isAttributeJewel())
|| (Config.NO_RATE_ATT && _item.isAttributeStone())
|| (Config.NO_RATE_ATT && _item.isAttributeEnergy())
|| (Config.NO_RATE_LIFE_STONE && _item.isLifeStone())
|| (Config.NO_RATE_CODEX_BOOK && _item.isCodexBook())
|| (Config.NO_RATE_FORGOTTEN_SCROLL && _item.isForgottenScroll()))
_notRate = true;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как ты думаешь дебаг дураки придумали? Из всего что я увидел в теме, так только попытки тыкать пальцем в небо, а не поиск косяка.

 

А теперь главный косяк=) А косяк у тебя в использовании _notRate. Ты же её для всего класса юзаеш, а не для каждого итема. Так вот какое значение последний итем оставит, так и будет дроп у тебя.

 

Вы правы. Разобрался, почему в некоторых случаях все работало, а в остальных нет. Методом тыка)

 

Распространяется на всю группу, поэтому и возникало ощущение, что иногда все работает ок. Когда предметы в разных группах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А зачем вы в этот клас лезете?

 

У вас есть RewardData

в нем и колдуйте

 

public RewardData(int itemId)
{
_item = ItemHolder.getInstance().getTemplate(itemId);
if(_item.isArrow() // стрелы не рейтуются
|| (Config.NO_RATE_EQUIPMENT && _item.isEquipment()) // отключаемая рейтовка эквипа
|| (Config.NO_RATE_KEY_MATERIAL && _item.isKeyMatherial()) // отключаемая рейтовка ключевых материалов
|| (Config.NO_RATE_RECIPES && _item.isRecipe()) // отключаемая рейтовка рецептов
|| ArrayUtils.contains(Config.NO_RATE_ITEMS, itemId) // индивидаульная отключаемая рейтовка для списка предметов
|| (Config.NO_RATE_HERBS && _item.isHerb()) // отключаемая рейтовка хербов
|| (Config.NO_RATE_ENCHANT_SCROLL && _item.isEnchantScroll())
|| (Config.NO_RATE_ATT && _item.isAttributeCrystal())
|| (Config.NO_RATE_ATT && _item.isAttributeJewel())
|| (Config.NO_RATE_ATT && _item.isAttributeStone())
|| (Config.NO_RATE_ATT && _item.isAttributeEnergy())
|| (Config.NO_RATE_LIFE_STONE && _item.isLifeStone())
|| (Config.NO_RATE_CODEX_BOOK && _item.isCodexBook())
|| (Config.NO_RATE_FORGOTTEN_SCROLL && _item.isForgottenScroll()))
_notRate = true;
}

 

RewardData выполняется уже после подсчета шанса предмета * на рейты. Поэтому теряется начальный шанс предмета. То есть на овере нерейтовость реализована через ограничение количества выпадаемых предметов, а не через х1 шанс.

 

Могу привести практический пример: При любом х дропе, эпики падают 100%, разве это верно? Вот и пытаюсь колдовать)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

RewardData выполняется уже после подсчета шанса предмета * на рейты. Поэтому теряется начальный шанс предмета. То есть на овере нерейтовость реализована через ограничение количества выпадаемых предметов, а не через х1 шанс.

 

Могу привести практический пример: При любом х дропе, эпики падают 100%, разве это верно? Вот и пытаюсь колдовать)

 

Эпики и должны падать 100% (Кроме АК), а вот их количество не должно влиять от рейтов, то есть только 1 штука выпадет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эпики и должны падать 100% (Кроме АК), а вот их количество не должно влиять от рейтов, то есть только 1 штука выпадет.

 

Ну вот АК я и хочу спасти) Да и не только для этого нужно.

 

Вы натолкнули меня на правильный путь, пока сам попробую поколдовать еще :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем пока что ничего не получилось, а сижу над этим уже давно... :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тоже интересует этот вопрос. Хочется решить его. Прописывать в ревард листы(NOT_RATED_NOT_GR...) по отдельности не очень интересно.

Кто-то уже решил проблему эту?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...