gawric 49 Опубликовано 20 декабря, 2015 Здравствуйте. Как в ядре получить число убитых? пытаюсь activeChar.kills получаю пустой массив. и как узнать сколько времени находился в онлайн игрок пытаюсь activerChat.getOnlineTIme получаю какую-то ерунду 20620mc хотя я в игре был 1 час + счетчик не обновляется, только после релога Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Katsu 8 Опубликовано 20 декабря, 2015 Здравствуйте. Как в ядре получить число убитых? пытаюсь activeChar.kills получаю пустой массив. и как узнать сколько времени находился в онлайн игрок пытаюсь activerChat.getOnlineTIme получаю какую-то ерунду 20620mc хотя я в игре был 1 час + счетчик не обновляется, только после релога Здравствуйте, какие у вас хроники, и основа исходников. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
gawric 49 Опубликовано 20 декабря, 2015 intelude l2jfrozen Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Katsu 8 Опубликовано 20 декабря, 2015 (изменено) это вы про это? public CustomMessage getOnlineTime(Player player) { int total = (int) player.getOnlineTime(); int days = total / (1000 * 60 * 60 * 24) % 7; int hours = total / (1000 * 60 * 60) % 24; int minute = total / (1000 * 60) % 60; if(days >= 1) return new CustomMessage("l2da.gameserver.model.Player.getOnlineTime.day", player).addNumber(days).addNumber(hours).addNumber(minute); else return new CustomMessage("l2da.gameserver.model.Player.getOnlineTime.hour", player).addNumber(hours).addNumber(minute); } public long getOnlineTime() { return _onlineTime; } Изменено 20 декабря, 2015 пользователем Katsu Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
gawric 49 Опубликовано 20 декабря, 2015 (изменено) public long getOnlineTime(){return _onlineTime;} да вот этот. Почему-то работает корректно Изменено 20 декабря, 2015 пользователем gawric Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Katsu 8 Опубликовано 20 декабря, 2015 public long getOnlineTime() { return _onlineTime; } да вот этот я вам готовый запрос дал под вывод онлайна. только он под оверов, адаптируете сами) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Katsu 8 Опубликовано 20 декабря, 2015 если помог +) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Katsu 8 Опубликовано 20 декабря, 2015 Что мешает вам, сделать по этому принципу и вывести то что вы хотите? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
gawric 49 Опубликовано 20 декабря, 2015 Что мешает вам, сделать по этому принципу и вывести то что вы хотите? то что getOnlineTime на сколько я вижу, после 1 часа в сети выдает в чате 20620мс что равняется 0.3 минуты. а то что вы скинули это все лишь арифметическая формула преобразования long в дни-часы. Я хотел узнать где происходит реализация getOnlineTime и ActiveChar.kill Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Katsu 8 Опубликовано 20 декабря, 2015 то что getOnlineTime на сколько я вижу, после 1 часа в сети выдает в чате 20620мс что равняется 0.3 минуты. а то что вы скинули это все лишь арифметическая формула преобразования long в дни-часы. Я хотел узнать где происходит реализация getOnlineTime и ActiveChar.kill Таймеры смотрите, для начала. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Katsu 8 Опубликовано 20 декабря, 2015 За вас бесплатно делать не кто не будет, так что я дал вам подсказку, если что пишите по контактам: Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
gawric 49 Опубликовано 20 декабря, 2015 а я разве говорил, что за меня нужно что-то делать? в любом случаи спс нашел то что искал. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Katsu 8 Опубликовано 20 декабря, 2015 а я разве говорил, что за меня нужно что-то делать? в любом случаи спс нашел то что искал. ну вот) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mangol 101 Опубликовано 20 декабря, 2015 (изменено) Скорей всего в базе данных sql что-то в стиле графы onlinetime, сколько пвп убийств тоже что-то в стиле графы pvpkills. Желательно грузить раз в час в кэш чтобы много раз не обращаться к базе. Как вернуть время в игре? Вот метод. Работает на J8. final Instant instant = Instant.ofEpochSecond(86068/** getOnlineTime()*/); final ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()); final int day = zonedDateTime.getDayOfYear(); final int hour = zonedDateTime.getHour(); final int minute = zonedDateTime.getMinute(); final int sec = zonedDateTime.getSecond(); Изменено 20 декабря, 2015 пользователем Mangol Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
gawric 49 Опубликовано 20 декабря, 2015 Скорей всего в базе данных sql что-то в стиле графы onlinetime, сколько пвп убийств тоже что-то в стиле графы pvpkills. Желательно грузить раз в час в кэш чтобы много раз не обращаться к базе. Как вернуть время в игре? Вот метод. Работает на J8. final Instant instant = Instant.ofEpochSecond(86068/** getOnlineTime()*/); final ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()); final int day = zonedDateTime.getDayOfYear(); final int hour = zonedDateTime.getHour(); final int minute = zonedDateTime.getMinute(); final int sec = zonedDateTime.getSecond(); я уже вырезал из стандартных часов. Но все равно спасибо запишу на всякий. С мобами конечно вышла промашка, хотел сделать считалку убитых - что-бы к ней прекрутить капачу, грузит заметно. Если после каждого убийства делать запись в бд. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mangol 101 Опубликовано 20 декабря, 2015 Скорей всего в базе данных sql что-то в стиле графы onlinetime, сколько пвп убийств тоже что-то в стиле графы pvpkills. Желательно грузить раз в час в кэш чтобы много раз не обращаться к базе. Как вернуть время в игре? Вот метод. Работает на J8. final Instant instant = Instant.ofEpochSecond(86068/** getOnlineTime()*/); final ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()); final int day = zonedDateTime.getDayOfYear(); final int hour = zonedDateTime.getHour(); final int minute = zonedDateTime.getMinute(); final int sec = zonedDateTime.getSecond(); я уже вырезал из стандартных часов. Но все равно спасибо запишу на всякий. С мобами конечно вышла промашка, хотел сделать считалку убитых - что-бы к ней прекрутить капачу, грузит заметно. Если после каждого убийства делать запись в бд. Зачем каждое убийство записывать сразу в дб ? 1 -ый выход. Создать кэш на объекте игрока и записывать туда каждое убийство и по триду к примеру в час, либо при выходе чара записывать в базу. 2-ой выход. Создать кэш многопоточный и записывать туда всех игроков которые убили моба, и через час опять же записывать все в базу. 24 часа == 24 раза запишет в базу. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gaikotsu 620 Опубликовано 20 декабря, 2015 (изменено) С мобами конечно вышла промашка, хотел сделать считалку убитых - что-бы к ней прекрутить капачу, грузит заметно. Если после каждого убийства делать запись в бд.нда... каждое изменение счетчика у каждого игрока писать в базу - это абзац. вобще можно обойтись и без хранения этих данных в бд. заводим общий хэшмап: ключи - ид игроков, значения - количество убитых этим игроком мобов. ну и в обработке смерти мобов получаем старое значение из мапы, инкрементим и заносим обратно. так же при достижении определенных значений счетчика вызываем проверку на бота. ну и уже опционально, если сильно так надо - писать значение этого счетчика в переменные перса в бд при выходе из игры, ну и восстанавливать обратно при входе в игру. Изменено 20 декабря, 2015 пользователем Gaikotsu Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
gawric 49 Опубликовано 21 декабря, 2015 (изменено) сделал через HashMap. Но возник вопрос синхронизации- если одновременно в него будут записывать он не заблокируется? Изменено 21 декабря, 2015 пользователем gawric Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mangol 101 Опубликовано 21 декабря, 2015 (изменено) сделал через HashMap. Но возник вопрос синхронизации- если одновременно в него будут записывать он не заблокируется? Если одновременно то можно получить ошибку. Чтобы этого не получить: ConcurrentHashMap используй для таких целей. Либо блокируй пока не запишет. Но лучше возьми сразу то что я описал выше. + не забывай что Мапки держат только 1 уникальный индефикатор, если туда всунуть опять такой же оно перезапишет значение. Можно сделать таким образом. private final Map<Integer,Integer> kills = new ConcurrentHashMap<>(); public void addKillMob(final int objId, final int count) { if(kills.containsKey(objId)) { int kill = kills.get(objId); kill += count; kills.replace(objId, kill); } else { kills.put(objId, count); } } Изменено 21 декабря, 2015 пользователем Mangol 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
gawric 49 Опубликовано 21 декабря, 2015 Если одновременно то можно получить ошибку. Чтобы этого не получить: ConcurrentHashMap используй для таких целей. Либо блокируй пока не запишет. Но лучше возьми сразу то что я описал выше. + не забывай что Мапки держат только 1 уникальный индефикатор, если туда всунуть опять такой же оно перезапишет значение. Можно сделать таким образом. private final Map<Integer,Integer> kills = new ConcurrentHashMap<>(); public void addKillMob(final int objId, final int count) { if(kills.containsKey(objId)) { int kill = kills.get(objId); kill += count; kills.replace(objId, kill); } else { kills.put(objId, count); } } спс сделал ConcurrentHashMap<> что-то подобное сегодня думал уже сделать. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты