Перейти к содержанию
Авторизация  
gawric

как получить кол-во убитых?

Рекомендуемые сообщения

Здравствуйте.

Как в ядре получить число убитых?

пытаюсь activeChar.kills получаю пустой массив.

и как узнать сколько времени находился в онлайн игрок

пытаюсь

activerChat.getOnlineTIme получаю какую-то ерунду 20620mc хотя я в игре был 1 час + счетчик не обновляется, только после релога

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте.

Как в ядре получить число убитых?

пытаюсь activeChar.kills получаю пустой массив.

и как узнать сколько времени находился в онлайн игрок

пытаюсь

activerChat.getOnlineTIme получаю какую-то ерунду 20620mc хотя я в игре был 1 час + счетчик не обновляется, только после релога

Здравствуйте, какие у вас хроники, и основа исходников.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это вы про это?

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;
}
Изменено пользователем Katsu

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

public long getOnlineTime()
{
return _onlineTime;

да вот этот.

Почему-то  работает корректно

Изменено пользователем gawric

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

public long getOnlineTime()

{

return _onlineTime;

да вот этот

я вам готовый запрос дал под вывод онлайна. только он под оверов, адаптируете сами)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что мешает вам, сделать по этому принципу и вывести то что вы хотите?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что мешает вам, сделать по этому принципу и вывести то что вы хотите?

то что getOnlineTime на сколько я вижу, после 1 часа в сети выдает в чате 20620мс что равняется 0.3 минуты.

а то что вы скинули это все лишь арифметическая формула преобразования long в дни-часы. Я хотел узнать где происходит реализация getOnlineTime и ActiveChar.kill

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

то что getOnlineTime на сколько я вижу, после 1 часа в сети выдает в чате 20620мс что равняется 0.3 минуты.

а то что вы скинули это все лишь арифметическая формула преобразования long в дни-часы. Я хотел узнать где происходит реализация getOnlineTime и ActiveChar.kill

Таймеры смотрите, для начала.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

За вас бесплатно делать не кто не будет, так что я дал вам подсказку, если что пишите по контактам: 24.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а я разве говорил, что за меня нужно что-то делать? в любом случаи спс нашел то что искал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а я разве говорил, что за меня нужно что-то делать? в любом случаи спс нашел то что искал.

ну вот)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скорей всего в базе данных 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Скорей всего в базе данных 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();

я уже вырезал из стандартных часов. Но все равно спасибо запишу на всякий.

С мобами конечно вышла промашка, хотел сделать считалку убитых - что-бы к ней прекрутить капачу, грузит заметно. Если после каждого убийства делать запись в бд. 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

 

Скорей всего в базе данных 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сделал через HashMap.

Но возник вопрос синхронизации- если одновременно в него будут записывать он не заблокируется?

Изменено пользователем gawric

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сделал через 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);
    }
}
Изменено пользователем Mangol
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Если одновременно то можно получить ошибку.

 

Чтобы этого не получить:

 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<>

что-то подобное сегодня думал уже сделать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...