[1.7.10] TileEntitySpecialRenderer, тики рендера, и как получить из этого секунды?

Версия Minecraft
1.7.10
API
Forge
Если кратко, есть специальный рендер TE, примерно что-то такое:
Java:
public void renderTileEntityAt(TileEntity te, double x, double y, double z, float f) {
    te.timer++;
    if (te.timer >= 120){
        //some render action
        te.timer = 0;
    }
}

Проблема следующая, операция te.timer++ будет выполняться столько раз в секунду, сколько у игрока fps, я бы хотел, чтобы эта операция выполнялась 1 раз в реальную секунду.

Пробовал увеличивать эту переменную через updateEntity в te, каждые 20 тиков, оно то так работает отлично, но есть нюанс, если игрок не смотрит на этот te, то и анимация после if (te.timer >= 120) не выполняется, а сама переменная продолжает увеличиваться, а поскольку таких te в одном месте может быть довольно много, то и после того, как игрок на них посмотрит, они начнут воспроизводить эту анимацию синхронно, что будет выглядить не очень.

Я попробовал уже всё, до чего додумался, но так и не смог придумать адекватный способ увеличивать переменную из рендера, при этом без прямой зависимости от fps игрока, разве что систем тайм не тягал, но мне кажется это уже перебор будет.

Есть у кого-либо идеи, как можно решить этот вопрос?
 
86
3
54
long cachedTime
long timer

  • Берёшь из системы миллисекунды.
  • Прибавляешь к timer'y разницу между полученными миллисекундами и cachedTime.
  • Записываешь миллисекунды в cachedTime для расчёта разницы в следующем кадре.

Когда в timer'е набирается секунда (1000 миллисекунд) - обнуляешь его и делаешь то, что тебе нужно.
 
1,123
75
390
если игрок не смотрит на этот te, то и анимация после if (te.timer >= 120) не выполняется
Оптимизация есть. Зачем рендерить то что находится вне поля зрения игрока?
 
Оптимизация есть. Зачем рендерить то что находится вне поля зрения игрока?
Не не, рендерить ничего не нужно, нужно чтобы только чтение и изменение значений внутри te (Это происходит на клиентской стороне, поэтому у каждого игрока свои значения будут, в целом так и задумано)

  • Берёшь из системы миллисекунды.
  • Прибавляешь к timer'y разницу между полученными миллисекундами и cachedTime.
  • Записываешь миллисекунды в cachedTime для расчёта разницы в следующем кадре.
Видимо придётся так, побаиваюсь этого метода если честно, а если конкретнее, что он нагрузку будет давать нехилую.
Да и плюсом тут есть проблема, опять же, человек отвернулся от te на минуту, повернулся обратно, и тут бац, te получил сразу 60 секунд к таймеру, если только обновлять кэшед тайм силами самого te

Полагал что возможно у forge есть какие-либо методы
 
Последнее редактирование:
1,526
138
281
они начнут воспроизводить эту анимацию синхронно, что будет выглядить не очень.
Если это единственное, то это дело можно легко нивелировать.

Начнём с того, что я не уверен, зачем тебе таймер. Просто выполняй анимацию каждый тик.
Что делать с "синхронностью"?
Пусть рендерер берёт текущую позицию блока, как-то её обрабатывает, а затем смещает анимацию по этой позиции.
В твоём примере можно просто смещать анимацию в начале на n тиков вперёд, если, скажем, позиция по x чётная; а если ещё и по z чётная, то пусть смещает ещё на k тиков.


Хотя, если честно, не совсем понятно, в чём конкретно проблема. Хотелось бы подробностей.
 
Начнём с того, что я не уверен, зачем тебе таймер. Просто выполняй анимацию каждый тик.
Там внутри блока модельки, и они раз в n времени вертят головой влево вправо, типо осматриваясь.
Если они будут это делать по кд - это будет странно)

В целом метод с временем системы уже работает как надо, таймер увеличивается только если блок находится в поле зрения игрока. И вроде как нагрузки от этого особой и нет, фпс как плавало в районе 300-400 так и плавает.
 
Сверху