BORDIR 62 Опубликовано 10 июля, 2013 (изменено) 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 условия, то все работает стабильно. Что-то зажевывается. Помогите, пожалуйста, найти проблему. Если необходимо, могу предоставить полные классы. Всем добра Изменено 10 июля, 2013 пользователем BORDIR Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 10 июля, 2013 (изменено) . Изменено 10 июля, 2013 пользователем BORDIR Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
jman4ik 103 Опубликовано 10 июля, 2013 Зачем 4 раза NO_RATE_ATT? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 10 июля, 2013 Зачем 4 раза NO_RATE_ATT? Там разные виды атов, так Кекес дописал, лень было просто исправлять. Думал, что разобрался, но не уверен. Сейчас может быть восстановлю текст первого сообщения. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
jman4ik 103 Опубликовано 10 июля, 2013 Мб ошибка в инд дропе вещей Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 10 июля, 2013 Обновил первый пост, моя идея оказалась неудачной, проблема осталась. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 10 июля, 2013 (изменено) Мб ошибка в инд дропе вещей Проверял айди уже, там все в порядке. Возникает ощущение, что данный код проходит только несколько раз, а не через все предметы (не знаю почему) и последнее состояние нерейтовости сохраняется для оставшихся предметов. При пяти условиях, например, у некоторых мобов весь дроп нерейтованный, а у остальных все ок. Изменено 10 июля, 2013 пользователем BORDIR Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 10 июля, 2013 (изменено) Либо я вообще неправильно понимаю, что выполняется в данной части кода. Изменено 10 июля, 2013 пользователем BORDIR Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
byldas 22 Опубликовано 10 июля, 2013 что у вас в дропе? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 10 июля, 2013 что у вас в дропе? Мобы с ЛОА. Как я уже писал, некоторые обрабатываются нормально, остальные криво. При меньшем количестве условий нерейтовости, обрабатываются все (? не уверен). Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 10 июля, 2013 Где-то идет утечка. Могу скинуть скрины с различными вариантами рейтовости. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 10 июля, 2013 Код в теме с ошибкой выложил : 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); } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 10 июля, 2013 (изменено) Ах да, забыл написать, что происходит при нерейтовости: 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; } Может быть и в этом ошибка. В общем постарался расписать проблему по максимуму. Изменено 10 июля, 2013 пользователем BORDIR Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
byldas 22 Опубликовано 10 июля, 2013 (изменено) Если вещи попадают в условие выше и соответственно установлен в конфиге параметр true - срабатывает формула rate = playerRate * mod; если нет и вещь проходит дальше, то rate = baseRate * playerRate * mod; Что у вас в дропе, скрины я просил. Изменено 10 июля, 2013 пользователем byldas Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 10 июля, 2013 Если вещи попадают в условие выше и соответственно установлен в конфиге параметр true - срабатывает формула rate = playerRate * mod; если нет и вещь проходит дальше, то rate = baseRate * playerRate * mod; Что у вас в дропе, скрины я просил. Да, это я понимаю, так как сам дописывал На овере немного по-другому в оригинале. Но там вообще нерейтовка на данном моменте не реализована. Сейчас сделаю скрины, а также продемонстрирую проблему. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Naik 419 Опубликовано 10 июля, 2013 А как ты думаешь дебаг дураки придумали? Из всего что я увидел в теме, так только попытки тыкать пальцем в небо, а не поиск косяка. А теперь главный косяк=) А косяк у тебя в использовании _notRate. Ты же её для всего класса юзаеш, а не для каждого итема. Так вот какое значение последний итем оставит, так и будет дроп у тебя. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 10 июля, 2013 А как ты думаешь дебаг дураки придумали? Из всего что я увидел в теме, так только попытки тыкать пальцем в небо, а не поиск косяка. А теперь главный косяк=) А косяк у тебя в использовании _notRate. Ты же её для всего класса юзаеш, а не для каждого итема. Так вот какое значение последний итем оставит, так и будет дроп у тебя. Тоже так подумал, даже тему закрыл. Но isAdena же как-то не перекрывает всё еще в самом начале, верно? А также при некоторых условиях все работает. Поэтому все же решил, что решение возможно найти. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Naik 419 Опубликовано 10 июля, 2013 Скинь весь файлик, попробую намудрить че нить. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
byldas 22 Опубликовано 10 июля, 2013 А зачем вы в этот клас лезете? У вас есть 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; } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 10 июля, 2013 А как ты думаешь дебаг дураки придумали? Из всего что я увидел в теме, так только попытки тыкать пальцем в небо, а не поиск косяка. А теперь главный косяк=) А косяк у тебя в использовании _notRate. Ты же её для всего класса юзаеш, а не для каждого итема. Так вот какое значение последний итем оставит, так и будет дроп у тебя. Вы правы. Разобрался, почему в некоторых случаях все работало, а в остальных нет. Методом тыка) Распространяется на всю группу, поэтому и возникало ощущение, что иногда все работает ок. Когда предметы в разных группах. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 10 июля, 2013 А зачем вы в этот клас лезете? У вас есть 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%, разве это верно? Вот и пытаюсь колдовать) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Naik 419 Опубликовано 10 июля, 2013 RewardData выполняется уже после подсчета шанса предмета * на рейты. Поэтому теряется начальный шанс предмета. То есть на овере нерейтовость реализована через ограничение количества выпадаемых предметов, а не через х1 шанс. Могу привести практический пример: При любом х дропе, эпики падают 100%, разве это верно? Вот и пытаюсь колдовать) Эпики и должны падать 100% (Кроме АК), а вот их количество не должно влиять от рейтов, то есть только 1 штука выпадет. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 10 июля, 2013 Эпики и должны падать 100% (Кроме АК), а вот их количество не должно влиять от рейтов, то есть только 1 штука выпадет. Ну вот АК я и хочу спасти) Да и не только для этого нужно. Вы натолкнули меня на правильный путь, пока сам попробую поколдовать еще Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 10 июля, 2013 В общем пока что ничего не получилось, а сижу над этим уже давно... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
iskiz 0 Опубликовано 10 октября, 2013 Тоже интересует этот вопрос. Хочется решить его. Прописывать в ревард листы(NOT_RATED_NOT_GR...) по отдельности не очень интересно. Кто-то уже решил проблему эту? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты