Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Java сэнсэй помоги мне
#1
Хочу написать такую функцию как сброс очков на олимпиаде у игроков. Допустим нубас слил все очки, и не может ходить на олимпиаду, но за волшебные колы ему выдадут 18 очков олимпиады.
В классе Olympiad, есть два метода:
Код:
    protected static StatsSet getNobleStats(int playerId)
    {
        return _nobles.get(playerId);
    }

    protected static synchronized void updateNobleStats(int playerId, StatsSet stats)
    {
        _nobles.remove(playerId);
        _nobles.put(playerId, stats);
    }
При помощи которых я могу получить статистику персонажа, изменить ее и обновить. Вроде все отлично, что я делаю:
Создаю вверху где-то обьект класса Olympiad:
Код:
Olympiad fOly = new Olympiad();
Ну и потом при передачи параметров с донат шопа выполняю следующие инструкции:
Код:
        else if(args[0].equals("noblese123")) {  
            if(!player.isNoble())
                return "Вы не нублесс";
            StatsSet noble_char = fOly.getNobleStats(player.getObjectId());
            noble_char.set(POINTS, 500);
            fOly.updateNobleStats(player.getObjectId(),noble_char);            
            return "Все ок, гуляй";
        }
Но люцера вторая ругается на следующие ошибки:
[Изображение: Myy9DDAe.png]

Наверное проблема в том, что методы которые мне нужны, объявлены как protected.

Как быть?
#2
Смотря какая сборка
в l2j это выглядело примерно следующим образом

[SRC="java"]
Stats stats = Olympiad.getInstance().getNobleStats(pcInstance);
stats.set("olympiad_points", stats.getInteger("olympiad_points") + 100500);
[/SRC]
#3
Тут я еще подумал создать класс наследник, и при помощи класса наследника пользоваться этими методами, но при обьявление класса olympiad, какой-то засранец добавил слова final, походу никак заполучить доступ не получится? Либо я ошибаюсь?

Добавлено через 3 минуты
ANZO Написал:Смотря какая сборка
в l2j это выглядело примерно следующим образом

[SRC="java"]
Stats stats = Olympiad.getInstance().getNobleStats(pcInstance);
stats.set("olympiad_points", stats.getInteger("olympiad_points") + 100500);
[/SRC]
Вот тут-же попробовал:
[Изображение: Myy9DDAj.png]

Сборка Lucera
#4
В свое время на ребеллионе делал чтото такое

Код:
else if (bypass.startsWith("_bbsolympiadpoints"))
        {
            int curPoints = Olympiad.getNoblePoints(player.getObjectId());
            if(curPoints <= 5) {
                player.sendMessage(player.isLangRus() ? "Вы успешно восстанавили очки олимпиады. Приятной игры!" : "You have succesfully restored your olly points. Good luck!");
                Olympiad.manualSetNoblePoints(player.getObjectId(), curPoints + 50);
            }

            else player.sendMessage(player.isLangRus() ? "У вас есть 5 или более очков оли и вы можете ходить на олимпиаду. Вам не нужно восстановление очков." : "You have 5 or more olly points so you can go to olympiad. No restoration needed.!");
            return;
        }
#5
Temptation Написал:В свое время на ребеллионе делал чтото такое

Код:
else if (bypass.startsWith("_bbsolympiadpoints"))
        {
            int curPoints = Olympiad.getNoblePoints(player.getObjectId());
            if(curPoints <= 5) {
                player.sendMessage(player.isLangRus() ? "Вы успешно восстанавили очки олимпиады. Приятной игры!" : "You have succesfully restored your olly points. Good luck!");
                Olympiad.manualSetNoblePoints(player.getObjectId(), curPoints + 50);
            }

            else player.sendMessage(player.isLangRus() ? "У вас есть 5 или более очков оли и вы можете ходить на олимпиаду. Вам не нужно восстановление очков." : "You have 5 or more olly points so you can go to olympiad. No restoration needed.!");
            return;
        }
Я Вас понимаю, просто у меня по моему ошибка из-за недостаточного уровня знаний ООП. Думаю может быть как-то можно выкрутиться.
#6
Walker Написал:Тут я еще подумал создать класс наследник, и при помощи класса наследника пользоваться этими методами, но при обьявление класса olympiad, какой-то засранец добавил слова final, походу никак заполучить доступ не получится? Либо я ошибаюсь?

Добавлено через 3 минуты

Вот тут-же попробовал:
[Изображение: Myy9DDAj.png]

Сборка Lucera

Я в глаза не видел ни одной сборки, кроме как своей. Так что тут не подскажу.
#7
Walker Написал:Наверное проблема в том, что методы которые мне нужны, объявлены как protected.

Как быть?
объяви их public да и все, в чем проблема то?
в твоем случае это по идее ни к чему плохому не приведет.

или у тебя ядро без исходников?
#8
Gaikotsu Написал:объяви их public да и все, в чем проблема то?
в твоем случае это по идее ни к чему плохому не приведет.

или у тебя ядро без исходников?
Ядро без исходников, Lucera2. А исходы я смотрю в люцере первой, которую зашарил Николай.
#9
Walker Написал:Я Вас понимаю, просто у меня по моему ошибка из-за недостаточного уровня знаний ООП. Думаю может быть как-то можно выкрутиться.

Данные о нублах хранятся в приватной карте, методы доступа к ней объявлены protected. В таком случае только reflection.
Fortuna - non penis, in manus non recipe.
#10
IOException Написал:У вас метод объявлен как static. Создавать объект Olympiad не нужно. Но поскольку он proteted - то да, можно сделать при помощи reflection, как Ashe подметил. Примерно:

[SRC="java"]
//ид игрока которому хотите изменить очки
int player_obj_id = 121212;
try {
Class<?> clazz = Class.forName("ru.lucera.model.olympiad.Olympiad"); //путь до класса Olympiad, вставьте свой
Method meth = clazz.getMethod("getNobleStats", int.class);
meth.setAccessible(true);
StatsSet stats = (StatsSet) meth.invoke(null, player_obj_id);

//Вот вы получили ваш статс-сет игрока, дальше просто изменяйте нужные вам параметры
// они хранятся там под определенными неймами
// например: stats.set("POINTS", 10);
} catch (Exception e) {
e.printStackTrace();
}
[/SRC]

Либо вы так же через reflection можете получить саму карту и оперировать с ней.

Почти, но всё же так:

[SRC="java"]try {
Class<?> clazz = Class.forName("ru.catssoftware.gameserver.model.olympiad.Olympiad");

Method method1 = clazz.getDeclaredMethod("getNobleStats", int.class);
Method method2 = clazz.getDeclaredMethod("updateNobleStats", int.class, StatsSet.class);

method1.setAccessible(true);
method2.setAccessible(true);

StatsSet noble_char = (StatsSet) method1.invoke(clazz, player.getObjectId());
noble_char.set("olympiad_points", 500);
method2.invoke(clazz, player.getObjectId(), noble_char);

} catch (IllegalAccessException e){
e.printStackTrace();
} catch (InvocationTargetException e){
e.printStackTrace();
} catch (NoSuchMethodException e){
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}[/SRC]
Fortuna - non penis, in manus non recipe.


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Lineage2 java Chronicle3 сборка AlexBayev 0 295 07-20-2024, 05:23 PM
Последний пост: AlexBayev
  Порекомендуйте хорошую Java сборку L2 GF (PTS не потяну ибо навыков 0 ) Force 0 856 10-28-2023, 12:02 PM
Последний пост: Force
  Java dev hired! Krasib 0 1,116 08-15-2022, 10:00 AM
Последний пост: Krasib
  SVN ссылки Java серверов. PROGRAMMATOR 284 234,957 11-19-2020, 08:50 PM
Последний пост: AbsolutePower
  Java координаты, различия PTS и Java, какие сборки хороши (iL) varted 5 2,508 09-12-2018, 08:29 AM
Последний пост: varted
  l2 c4 java estorq 0 1,332 08-17-2018, 10:07 PM
Последний пост: estorq
  Топовая Java сборка под х3 и х1200 NovaPlanet 32 8,429 11-22-2016, 11:38 AM
Последний пост: 6bit
  Java в Class virusoflove 1 1,752 10-17-2016, 09:04 AM
Последний пост: Rolfer
  Помогите поставить Java сервер la2 c3! Winst 0 1,187 10-16-2016, 12:34 PM
Последний пост: Winst
  Ищу стабильную сборка java сервера HF introzorn 12 6,189 10-14-2016, 09:34 PM
Последний пост: Mangol

Перейти к форуму:


Пользователи, просматривающие эту тему: 5 Гость(ей)