Изучение скиллов в один клик

Falkland

Выдающийся
Местный
Сообщения
196
Розыгрыши
0
Репутация
207
Реакции
110
Баллы
1 358
Всем привет!
Нужно реализовать изучение сразу максимального возможного лвл скила (в зависимости от лвл персонажа).
Полез в SkillAcquireHolder::getAvaliableList()
Код:
private Collection<SkillLearn> getAvaliableList(Collection<SkillLearn> skillLearns, SkillEntry[] skills, int level) {
        Map<Integer, SkillLearn> skillLearnMap = new TreeMap<Integer, SkillLearn>();
        for(SkillLearn temp : skillLearns) {
            if(temp.getMinLevel() <= level) {
                boolean knownSkill = false;
                for(int j = 0; j < skills.length && !knownSkill; j++) {
                    if(skills[j].getId() == temp.getId()) {
                        knownSkill = true;
                        if(skills[j].getLevel() == temp.getLevel() - 1) {
                            skillLearnMap.put(temp.getId(), temp); 
                        }
                    }
                }
                if(!knownSkill && temp.getLevel() == 1) {
                    skillLearnMap.put(temp.getId(), temp);
                }
            }
        }

        return skillLearnMap.values();
    }
Сначала убрал проверку, с помощью которой мапа заполняется скилами на 1 лвл большими, чем уже выучены. Список стал формироваться из скилов именно нужного лвла (максимально возможного), но такие скилы не учатся, так как пропускаются предыдущие лвла скилов.
Затем убрал мапу, закинул все в список, но стали выводиться отдельно скилы каждого лвла, то есть, например Dash 1 лвл и Dash 2 лвл как два отдельных скила, что и логично.
Подкиньте идей, как решить такую задачу. Ломать проверку на предыдущий лвл скила не вариант (чтобы максимальный учился без выученных предыдущих). Сборка lostworld.
 
Есть реализация под лыжу:
Код:
public final int getCostumLevel(int level)
    {
        if (!Config.ENCHANT_SKILL_CUSTOM)
            return level;

        level += 14;
        if (!isMaxEnchant(level))
            level += 15;

        return level;
    }
Редактируем шанс улучшения:
Код:
final int rate = Config.ENCHANT_SKILL_CUSTOM ? 100 : esd.getRate(player);
            if (Rnd.chance(rate)){
Ну дальше я думаю вы догадаетесь, что делать....
 
Исходники смотреть лень, но примерно подскажу несколько вариантов:
1. Добавлять скиллы напрямую в список скиллов игрока.
2. Создать метод, который будешь юзать вместо стандартного addSkill (или как он там зовется), в котором проверяешь наличие у игрока данного скилла + изученный лвл, ну а потом в зависимости от выполнения условия изучаешь недостающие лвлы скилла перед изучением максимально возможного.
3. Для ленивых (но не рекомендую из-за громоздкости): использовать вместо Map<Integer, SkillLearn> - Map<Integer, Map<Integer, SkillLearn>>, где Integer во внутренней мапе - лвл скилла. Опять же - не рекомендую!
4. Переписать систему скиллов, или по крайней мере систему изучения скиллов.
5. Не совсем понял на счет добавления скиллов через полученный List, они типа у тебя в списке скиллов дублируются, только с разными лвлами? Тогда переписывай нахер этот метод или ищи какой-нибудь производный (ну типа learnSkill, в котором вызывается этот addSkill). Названия методов взял от лампочки.
 
Смотреть как реализована работа админ-команды //give_all_skills и сделать по аналогии требуемый метод выдачи скиллов.
 
  • Мне нравится
Реакции: kick
Назад
Сверху Снизу