UNIX, как использовать, как не допустить баги

Mee8YT

Эксперт
Регистрация
3 Май 2023
Сообщения
351

UNIX время - время, представленное в виде миллисекунд.


На Майнленде его можно использовать по разному, в основном для отмечания промежутков времени.
Представим, что у нас есть цикл, который каждую секунду прибавляет в переменную time 1 секунду
через минуту у нас уже будет 60 секунд

Представим ситуацию, у нас есть команда @bonus, которая даёт бонус раз в 60 секунд. Чтобы отметить временную точку, на которой будет возможным взять бонус нам нужно к текущему времени прибавить 60 секунд, тогда текущему времени нужно ещё 60 секунд, чтобы игрок взял бонус.

К примеру ранее игровое время было 60, значит при отметке 120 секунд нам станет доступной эта команда, и в этой переменной у нас будет 120.
Как проверить, что игрок может взять бонус? Легко, достаточно сравнить, больше ли текущее время относительно временной точки.
Если больше - значит временная точка уже в прошлом, её КД давно истёк
В ином случае текущее время ещё не догнало временную точку, и мы можем вывести оставшееся время, которое нужно подождать, прежде чем взять бонус.

Чтобы получить оставшееся время у временной точки относительно текущего времени нужно от него отнять текущее время.

Примерный код:
[
Форматирование (BB-код):
Событие игрока - Вход
    Присв переменную - Прибавить += (%player%_bonus_time += 0 ) // создаём переменную с временной точкой
    Запустить цикл ('time')

Цикл ('time', 20)
    Выбрать объект - Случайный игрок
    Присв переменную - Прибавить += (time += 1)

Событие игрока - Отправил сообщение
    Если игрок - Сообщение равно (@bonus, $игнорировать)
        Если переменная - Сравнить число обле версия (time >= %player%_bonus_time): // Проверяем, доступен ли игроку бонус
            Присв переменную - Установить + (%player%_bonus_time = time + 60) // Создаём новую временную точку
            Действие игрока - Отправить сообщение ("Бонус получен")
        Иначе:
            Присв переменную - Установить - (%player%_bonus_time_remained = %player%_bonus_time - time)
            Действие игрока - Отправить сообщение ('Осталось ', %player%_bonus_time_remained, 'сек.')

Однако у такого цикла есть минус - он работает только пока в игре есть кто-то

На помощь приходит UNIX, который вшит в Java, и позволяет в любую миллисекунду получить мировое время, которое идёт начиная с 1970 года
Майнленд позволяет с ним работать. Однако вас могло напугать 1) слишком большое число 2) непонятные 'E' символы

Разберём первое:
Счёт идёт с 1970 года, следовательно в нём как минимум 54 года. В каждом году 12 месяцев, в месяце +-30 дней, в каждом дне 24 часа, в часу 60 минут, в минуте 60 секунд, в секунде 1000 миллисекунд.
Вот и выходит, что UNIX время выходит на триллионы.

Теперь второе
Точно не знаю, майнленд-ли подкручивает числа Е, или джава, но в любом случае если парсить любое большое число, то они появятся.
По факту, число '1.0E12' это '1.0 * 10^12', с таким свойством можно работать, чтобы текст с юниксом перевести в число.

Вернёмся к проблеме с циклами, или к решению проблемы. Если мы вместо цикла будем использовать UNIX, то будет 2 небольшие проблемы в плане удобства: 1) трудно текстовый вариант вернуть в число 2) нужно постоянно его получать 3) он показывает значения в 1000 раз больше, чем наш цикл

Составим инструкцию для нашей ежедневной награды, чтобы адаптировать под юникс: 1) надо миллисекунды для игрока показывать как секунды 2) нужно его получать в самом коде бонуса

Код:
[
Форматирование (BB-код):
Событие игрока - Вход
    Присв переменную - Прибавить += (%player%_bonus_time += 0 ) // создаём переменную с временной точкой

Событие игрока - Отправил сообщение
    Если игрок - Сообщение равно (@bonus, $игнорировать)
        Присв переменную - Получить время UNIX (%player%_unix)
        Если переменная - Сравнить число обле версия (%player%_unix >= %player%_bonus_time): // Проверяем, доступен ли игроку бонус
            Присв переменную - Установить + (%player%_bonus_time = %player%_unix + 60000) // Создаём новую временную точку
            Действие игрока - Отправить сообщение ("Бонус получен")
        Иначе:
            Присв переменную - Установить - (%player%_bonus_time_remained = %player%_bonus_time - time)
            Присв переменную - Разделить (%player%_bonus_time_remained = %player%_bonus_time_remained / 1000)
            Присв переменную - Округлить (%player%_bonus_time_remained = %player%_bonus_time_remained $к_меньшему)
            Действие игрока - Отправить сообщение ('Осталось ', %player%_bonus_time_remained, 'сек.')

В чём отличия от прошлого кода:
1) Получаем UNIX, а не используем постоянную переменную
2) Вместо "прибавить 60" мы использовали "прибавить 60000", т.к. в представлении UNIX 60 секунд надо записать в виде миллисекунд, то есть 60*1000=60000
3) В сообщении об оставшемся времени мы написали дополнительно разделили на 1000 и округлили к меньшему, потому что у нас есть лишние миллисекунды

Как превратить текст в число​

Небольшая микротема, относящаяся к UNIX. Дело в том, что UNIX, как и любое большое число просто так не парсится из текста.
К таким случаям предлагаю сделать функцию, которая принимает текст, и возвращает число.

Для этого нужно свойство больших чисел, описанное выше

Код:
Форматирование (BB-код):
// Функция будет иметь входную переменную: %player%_parseBigInt.input
// На выходе функция вернёт результат в %player%_parseBigInt.output


Любой обработчик - Любое событие:
    // ...
    Присв переменную - Присв переменную равно (%player%_parseBigInt.input = '1.0E7')
    Вызвать

Функция (parseBigInt) :
    Присв переменную - Установить равно (%player%_parseBigInt.output = %player%_parseBigInt.input)
    Если переменная - Текст содержит (%player%_parseBigInt.input .содержит 'E'):
        Присв переменную - Разделить текст на элементы (%player%_parseBigInt.array .разделить %player%_parseBigInt.input .на 'E')
        Массивы - Получить элемент (.из %player%_parseBigInt.array .индекс 1 .в %player%_parseBigInt.calc.number)
        Массивы - Получить элемент (.из %player%_parseBigInt.array .индекс 2 .в %player%_parseBigInt.calc.degree)
        Присв переменную - Парсить число (.в %player%_parseBigInt.calc.number .парсить %player%_parseBigInt.calc.number)
        Присв переменную - Парсить число (.в %player%_parseBigInt.calc.degree .парсить %player%_parseBigInt.calc.degree)
        Присв переменную - Возвести в степень (.в %player%_parseBigInt.calc.multiplier .число 10 .степень %player%_parseBigInt.calc.degree)
        Присв переменную - Умножить (.в %player%_parseBigInt.output .числа %player%_parseBigInt.calc.multiplier * %player%_parseBigInt.calc.number)
    Иначе:
        Действие игрока - Отправить сообщение ("Это не большое число")
 

maxim34a

Эксперт
Регистрация
10 Июн 2023
Сообщения
552
Худшее бесполезное нововведение. Дайте нам полные массивы, с другими видами и приколами...
 

Mee8YT

Эксперт
Регистрация
3 Май 2023
Сообщения
351
Быстро отвечаешь.
Какие еще списки? Я прошу Map и его подвиды, Set и его подвиды, stream()...
боже, какой stream()
даже на брате старше нету их
закатай губу, ливни с этого места
 

maxim34a

Эксперт
Регистрация
10 Июн 2023
Сообщения
552
боже, какой stream()
даже на брате старше нету их
ну так надо быть лучше БРАТЬЕВ
закатай губу, ливни с этого места
забанят - ливну на n срок
Суть от мап, если массивы не переписаны в списки?
Так перепиши и сделай нормальные массивы. Все игроки будут рады, а от времени применений слишком мало.
 

Mee8YT

Эксперт
Регистрация
3 Май 2023
Сообщения
351
Так перепиши и сделай нормальные массивы
это ведь так легко, сделать из парашной системы, где переменная == элемент
у них чуть чуть архитектура интересная

так-же полностью все блоки массивов не получится мигрировать, придётся оставлять старые, и уже строить на новом коде
Сообщение объединено:

забанят - ливну на n срок
зачем оставлять грязь, ливни без грязи, вонять не будет
 

maxim34a

Эксперт
Регистрация
10 Июн 2023
Сообщения
552
зачем оставлять грязь, ливни без грязи, вонять не будет
это ведь так легко, сделать из парашной системы, где переменная == элемент
у них чуть чуть архитектура интересная
Ну так ему за это платят же. Если не платят - сорян.
так-же полностью все блоки массивов не получится мигрировать, придётся оставлять старые, и уже строить на новом коде
Кого-кого? Какие блоки? Объясни Java кодом как реализованы массивы.
 

Apotheoses

Эксперт
Регистрация
19 Июн 2023
Сообщения
61
Объясни Java кодом как реализованы массивы.
Каким образом он должен узнать как в коде реализованы массивы? Он только приблизительно понимает
Ну так ему за это платят же. Если не платят - сорян.
Тут стоит вопрос в том, как сделать это адекватно, а не в деньгах
 

maxim34a

Эксперт
Регистрация
10 Июн 2023
Сообщения
552
Каким образом он должен узнать как в коде реализованы массивы? Он только приблизительно понимает
Хорошо, объясни мне. Каждый элемент массива - переменная? Пон.
Тут стоит вопрос в том, как сделать это адекватно, а не в деньгах
А если добавить новый тип переменных, которые типа переменные, но не переменные? Просто берешь предмет, ставишь ему значение(через чат), ложишь в сундук и плагин просто считывает названия предметов в сундуке и ложишь их в массив через .add(название предмета) в цикле.
Либо же в чем проблема текущих массивов?


Ставишь предмету просто имя, без создания настоящей переменной.
 
Последнее редактирование:
Сверху