Сообщений: 77
Тем: 10
Зарегистрирован: Feb 2014
Репутация:
231
Хочу написать такую функцию как сброс очков на олимпиаде у игроков. Допустим нубас слил все очки, и не может ходить на олимпиаду, но за волшебные колы ему выдадут 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 "Все ок, гуляй";
}
Но люцера вторая ругается на следующие ошибки:
Наверное проблема в том, что методы которые мне нужны, объявлены как protected.
Как быть?
Сообщений: 2,303
Тем: 24
Зарегистрирован: Sep 2010
Репутация:
5,617
Смотря какая сборка
в l2j это выглядело примерно следующим образом
[SRC="java"]
Stats stats = Olympiad.getInstance().getNobleStats(pcInstance);
stats.set("olympiad_points", stats.getInteger("olympiad_points") + 100500);
[/SRC]
Сообщений: 77
Тем: 10
Зарегистрирован: Feb 2014
Репутация:
231
05-01-2014, 09:09 PM
(Сообщение последний раз редактировалось: 05-01-2014, 09:13 PM Walker.)
Тут я еще подумал создать класс наследник, и при помощи класса наследника пользоваться этими методами, но при обьявление класса olympiad, какой-то засранец добавил слова final, походу никак заполучить доступ не получится? Либо я ошибаюсь?
Добавлено через 3 минуты
ANZO Написал:Смотря какая сборка
в l2j это выглядело примерно следующим образом
[SRC="java"]
Stats stats = Olympiad.getInstance().getNobleStats(pcInstance);
stats.set("olympiad_points", stats.getInteger("olympiad_points") + 100500);
[/SRC] Вот тут-же попробовал:
Сборка Lucera
Сообщений: 901
Тем: 78
Зарегистрирован: Dec 2012
Репутация:
9,514
В свое время на ребеллионе делал чтото такое
Код: 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;
}
Сообщений: 77
Тем: 10
Зарегистрирован: Feb 2014
Репутация:
231
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;
}
Я Вас понимаю, просто у меня по моему ошибка из-за недостаточного уровня знаний ООП. Думаю может быть как-то можно выкрутиться.
Сообщений: 2,303
Тем: 24
Зарегистрирован: Sep 2010
Репутация:
5,617
Walker Написал:Тут я еще подумал создать класс наследник, и при помощи класса наследника пользоваться этими методами, но при обьявление класса olympiad, какой-то засранец добавил слова final, походу никак заполучить доступ не получится? Либо я ошибаюсь?
Добавлено через 3 минуты
Вот тут-же попробовал:
Сборка Lucera
Я в глаза не видел ни одной сборки, кроме как своей. Так что тут не подскажу.
Сообщений: 1,065
Тем: 20
Зарегистрирован: Mar 2010
Репутация:
3,855
Walker Написал:Наверное проблема в том, что методы которые мне нужны, объявлены как protected.
Как быть? объяви их public да и все, в чем проблема то?
в твоем случае это по идее ни к чему плохому не приведет.
или у тебя ядро без исходников?
Сообщений: 77
Тем: 10
Зарегистрирован: Feb 2014
Репутация:
231
Gaikotsu Написал:объяви их public да и все, в чем проблема то?
в твоем случае это по идее ни к чему плохому не приведет.
или у тебя ядро без исходников? Ядро без исходников, Lucera2. А исходы я смотрю в люцере первой, которую зашарил Николай.
Сообщений: 4,694
Тем: 85
Зарегистрирован: Mar 2009
Репутация:
23,364
Walker Написал:Я Вас понимаю, просто у меня по моему ошибка из-за недостаточного уровня знаний ООП. Думаю может быть как-то можно выкрутиться.
Данные о нублах хранятся в приватной карте, методы доступа к ней объявлены protected. В таком случае только reflection.
Fortuna - non penis, in manus non recipe.
Сообщений: 4,694
Тем: 85
Зарегистрирован: Mar 2009
Репутация:
23,364
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.
|