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
Сообщения
551
Худшее бесполезное нововведение. Дайте нам полные массивы, с другими видами и приколами...
 

Mee8YT

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

maxim34a

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

Mee8YT

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

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

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

maxim34a

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

Apotheoses

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

maxim34a

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


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

Mee8YT

Эксперт
Регистрация
3 Май 2023
Сообщения
351
Либо же в чем проблема текущих массивов?
Каждый элемент это уже объект
Джаве проще работать с 1 переменной, со структурированной коллекцией, которая оптимизирована под хранение большого кол-ва элементов, а не эти массивы, которые заточены под перебирание элементов
Кого-кого? Какие блоки
ты был ваще в коде мла?
заходишь в /dev, у тебя блоки кода..
так вот, на массивы выделили отдельный блок, есть действие игрока, есть действие переменной, вот и тут массивы

он не сможет перенести блоки массива на установку переменной, по этому придётся лепить новые блоки, оставив старые массивы
Ну так ему за это платят же. Если не платят - сорян.
это тут причём, он новичок так-то, пару месяцев назад сделал своё первое действие "удалить строку описания предмету", сейчас думает над более серьёзными вещами, по типу переписи массивов

трудненькая задачка, но я думаю у него уже +- есть комбинация/стратегия
 

maxim34a

Эксперт
Регистрация
10 Июн 2023
Сообщения
551
ты был ваще в коде мла?
заходишь в /dev, у тебя блоки кода..
так вот, на массивы выделили отдельный блок, есть действие игрока, есть действие переменной, вот и тут массивы
нет не был, я же пол дюжины написанных мною гайдов из воздуха взял
Каждый элемент это уже объект
Джаве проще работать с 1 переменной, со структурированной коллекцией, которая оптимизирована под хранение большого кол-ва элементов, а не эти массивы, которые заточены под перебирание элементов
уже переменная Object? как блять массивы реализованы объясни? что это? Object[]? не коллекциями? в чем не права моя реализация?
это тут причём, он новичок так-то, пару месяцев назад сделал своё первое действие "удалить строку описания предмету"
новичок
стал кодером на мл
за ПАРУ МЕСЯЦЕВ сделал "УДАЛИТЬ СТРОКУ ОПИСАНИЯ ПРЕДМЕТУ"
я правильно понимаю? не в обиду апофеозесу, конечно же
 

Mee8YT

Эксперт
Регистрация
3 Май 2023
Сообщения
351
уже переменная Object? как блять массивы реализованы объясни? что это? Object[]? не коллекциями? в чем не права моя реализация?
они сделаны НЕ КОЛЛЕКЦИЯМИ
каждый элемент это ПЕРЕМЕННАЯ
массив из элементов [1,2,3] это 3 переменной:
имя_массиваඞ0
имя_массиваඞ1
имя_массиваඞ2

в этих элементах значения 0-2 по индексам соответственно

а уже каждый элемент это Object, стандартная переменная
я правильно понимаю? не в обиду апофеозесу, конечно же
нет
читай внимательнее
я пишу "он от уровня кода УДАЛИТЬ СТРОКУ дошёл до переписи массивов в списки, это сложная задача"
 

maxim34a

Эксперт
Регистрация
10 Июн 2023
Сообщения
551
они сделаны НЕ КОЛЛЕКЦИЯМИ
каждый элемент это ПЕРЕМЕННАЯ
массив из элементов [1,2,3] это 3 переменной:
имя_массиваඞ0
имя_массиваඞ1
имя_массиваඞ2

в этих элементах значения 0-2 по индексам соответственно

а уже каждый элемент это Object, стандартная переменная
ну я в целом так и подумал, да, уебищная реализация. такой вариант: ставишь блок создать массив, затем выбираешь из 3 типов: List, Set, Map(с объяснениями в чем суть каждого), затем(МБ, тут вот хз, мб это сделать кнопкой дальше) выбор там сортед массив ещё там типы, tree и тд. создается коллекция которая хранит Object, и для того чтобы в массив ложить мб спец предмет в "Переменных". топорная реализация, да, но мб тогда придётся менять и полностью все переменные... И поч изначально не сделали одну переменную - Object?
нет
читай внимательнее
я пишу "он от уровня кода УДАЛИТЬ СТРОКУ дошёл до переписи массивов в списки, это сложная задача"
понял не так прочитал. ну удачи апофеозесу
Сообщение объединено:

а и маты разрешены или нет? хотя мне похуй
 

Mee8YT

Эксперт
Регистрация
3 Май 2023
Сообщения
351
И поч изначально не сделали одну переменную - Object?
там в обжект всё переводится в момент обработки, а так в сундуке всё предметом хранится, потом считывается
наверно
Сообщение объединено:

а и маты разрешены или нет? хотя мне похуй
вообще нет, но тебе же пофик xd
 

maxim34a

Эксперт
Регистрация
10 Июн 2023
Сообщения
551
там в обжект всё переводится в момент обработки, а так в сундуке всё предметом хранится, потом считывается
наверно
ну даж если считывается, переменные же все равно создаются. ну в общем апофеозесу надо ФИКСИТЬ
так как у тебя дела
 

Mee8YT

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

angelyard

Участник
Регистрация
4 Июн 2023
Сообщения
8
Дайте нам полные массивы, с другими видами и приколами...
Нормальные массивы сделать явно сложнее, нежели чем добавить одну простую функцию, которую игроки просили добавить годами.
Дело времени. Смысла от твоего сообщения нет, ибо на скорость выхода обновления оно не повлияет. Учитывай, что их делает всего-лишь один человек, который еще несколько месяцев назад джаву не знал
 

Mee8YT

Эксперт
Регистрация
3 Май 2023
Сообщения
351
up
пр ставьте лайки
 
Сверху