Перейти к содержимому

eu_tomat

Модераторы
  • Публикации

    2 666
  • Зарегистрирован

  • Посещение

  • Победитель дней

    331

Все публикации пользователя eu_tomat

  1. Маловато. Во-первых, возвращается локальное время сервера, зависящее исключительно от предпочтений админа. Во-вторых, каждую секунду дёргать файловую систему ради получения точного времени — тоже сомнительная идея, которая при массовом использовании вряд ли будет одобрена админом. Самый правильный способ, на мой взгляд, как уже предложил @ivan52945, использовать ComputerCraft для отслеживания рестарта сервера. А время корректировать сразу после рестрата и каждые 15 минут, например. Интересно было бы рассмотреть возможность использования каких-либо схем на красной пыли, но единственное, что я смог сразу вспомнить — это сенсор робота-рыбака, сбивающийся при выгрузке чанка. Вряд ли кто-то захочет использовать такую схему в часах. Возможно, кто-то найдёт более удачный способ отслеживания момента перезагрузки чанка без использования ComputerCraft.
  2. Какова ирония! То, что всегда считалось недостатком ComputerCraft, в определённой ситуации стало достоинством.
  3. Надо корректировать после каждого рестарта сервера. Как отследить этот момент, не ясно, поэтому надо корректировать периодически. А вот, как часто надо корректировать, зависит от условий задачи. Слишком частые обращения к сервису чреваты баном по IP, а редкие коррекции лишают такие часы смысла. Заходишь такой после рестарта сервера, а часы отстают на минуту-две. Зачем они тогда вообще нужны? Да и вообще, хороший вопрос, зачем наблюдать реальное время именно в Майнкрафте, когда есть более удобные инструменты. Сделать более-менее правдоподобные часики реально, но админ сервера не будет рад использованным методам.
  4. А зачем нужны драйверы? В настоящих системах, использующих разношерстное оборудование, назначение драйверов понятно. А в OpenOS они зачем нужны? Какое такое разнообразие протоколов приводится к единому стандарту?
  5. Пусть будет. Если проблема сохраняется, то способы ее решения полезно знать не только тому, кто решился задать вопрос.
  6. Глобальные переменные не совсем зло. Они всё-таки необходимы для некоторых целей. Память занимают любые переменные, но локальные работают быстрее. Правда, есть нюансы, о которых где-то рассказывал @ECS: если часто вызывать функцию, внутри которой определена локальная переменная, то вместо ускорения можно получить замедление. Выход из ситуации заключен в создании локальных переменных на уровнях выше часто вызываемых функций. К слову, затраты на доступ к глобальной переменной эквивалентны затратам на доступ к полю локальной таблицы. Главная же особенность глобальных переменных заключена в том, что они доступны любым программам, запущенным в данном окружении. С одной стороны, это ведёт к замусориванию глобального окружения и созданию помех одними запускаемыми программами другим программам, а с другой, глобальне переменные при грамотном использовании дают программам механизм обмена данными через глобальное окружение. И если не стоит именно такая задача, то глобальные переменные создают больше проблем, чем решают их.
  7. Можно помочь с организацией соревнований дронов-пылесосов.
  8. Если рекурсивное создание каталогов не требуется, то зачем нужны лишние действия по разбору пути к файлу на части и последующей их сборке?Есть же filesystem.path(path)
  9. Пояснение: sides.side - обращение к полю с именем side в таблице sides. sides[side] - обращение к полю с именем, содержащейся в переменной side, и находящимся в таблице sides
  10. @@Miroshka, участок кода, начинающийся с elseif, не может быть функцией. И что значит запись 222()?
  11. Пикнуть и выключить, если на то пошло. Но этому способу приходится конкурировать с массой других, в том числе и рекордно компактных.
  12. local, конечно же, не крашит. А вот, require не даст взлететь твоему дрону.
  13. @@lokin135, советы, конечно, полезные, но автор уже больше года не появлялся на форуме.
  14. Так и должно быть. Переназначение io.stdout:write в глобальном окружении перенаправляет весь стандартный вывод в модем. Для перенаправления вывода лишь определенных потоков, следует пересоздать таблицу io.stdout в их окружении, скопировав поля, оставшиеся неизменными. Также должны быть заново созданы родительские таблицы: -- создание таблицы нового окружения, копирование всех полей из старого local env = {} for k,v in pairs(_G) do env[k]=v end -- ссылка на глобальное окружение в новом окружении env._G=env -- подмена таблицы env.io с копированием полей из старой env.io={} for k,v in pairs(_G.io) do env.io[k]=v end -- подмена таблицы env.io.stdout с копированием полей из старой env.io.stdout={} for k,v in pairs(_G.io.stdout) do env.io.stdout[k]=v end -- подмена функции env.io.stdout.write в новой таблице function env.io.stdout:write(...) m.broadcast(512, ...) end
  15. eu_tomat

    OpenComputers 1.7.0

    Проверил на OpenComputers-MC1.7.10-1.7.0.1085-universal.jar Методы getAllStacks и getInventoryName отсутсвуют как для контроллера инвентаря, так и для транспозера.
  16. Чётко! И сборщик мусора зря не напрягается, и результаты вычислений используются повторно.
  17. А можешь скинуть ссылочку на твиттер Рида?
  18. Интересно. Не ожидал такого от Lua. Понятно, что на уровне железа битовый сдвиг реализуется гораздо проще деления, но затраты на интерпретацию Lua должны, как мне казалось, заметно превышать и нивелировать эти аппаратные нюансы.
  19. Не уверен, что я понял вопрос. Это решение обратно преобразованию idx = x + y*80 + z*80*64, оно изначально задумывлось таким образом, чтобы получить однозначное соответствие частных индексов и общего. Попробуем для начала излечь x. Нам известно, что значение x находится в диапазоне [0..79], а idx равен сумме x и еще какого-то числа, кратного 80. Логично, что для получения x достаточно взять остаток от деления idx%80. Далее i получает значение целочисленного деления i//80 Теперь i = y + z*64 Теперь извлекаем y, зная, что значение y находится в диапазоне [0..63], а i равен сумме y и еще какого-то числа, кратного 64. Значение y будет равно остатку от деления i%64, а i получает значение целочисленного деления i//64 Теперь i = z Осталось присвоить z = i, и задача решена.
  20. Предположим, нужен массив [x,y,z] размером 80x64x20 Зная частные индексы и размеры массива нужно получить общий индекс. Выбираем любой из индексов. Пусть это будет x. Изменение x на единицу будет приводить к изменению общего индекса на единицу. x ограничен 80 значениями. Значит, последующие индексы надо будет умножить на 80 Теперь выбираем следующий индекс. Пусть это будет y. Изменение y на единицу будет приводить к изменению общего индекса на 80, как мы поняли выше. y ограничен 64 значениями. Значит, последующие индексы надо будет умножить на 64. И не забываем об умножении на 80. То есть, на 80*64. Теперь остался индекс z. Исходя из предыдущих рассуждений, изменение z на единицу будет приводить к изменению общего индекса на 80*64. z ограничен 20 значениями. Значит, последующие индексы надо будет умножить на 20. И не забываем об умножении на 80*64. То есть, на 80*64*20. Но других индексов после z не наблюдается, поэтому не забиваем себе голову. Итоговая формула: idx = x + y*80 + z*80*64 При выборе другого порядка индексов формула может отличаться. Следует придерживаться выбранной схемы. Для получения частных индексов из общего индекса используется обратная схема: i=idx x=i%80 i=(i-x)/80 y=i%64 i=(i-y)/64 z=iЭту последовательность вычислений можно (и нужно) оптимизировать, избегая лишних присваивний, но она лучше подходит для объяснения алгоритма. Пример > X,Y,Z = 80,64,20 > x,y,z = 37,21,11 > idx = x + y*X + z*X*Y > =idx 58037 > i=idx > x=i%80 i=(i-x)/80 > y=i%64 i=(i-y)/64 > z=i > =x,y,z 37 21 11И надо помнить, что индексы в этой схеме нумеруются от нуля в отичие от принятого в Lua.
  21. Мне кажется, это лишнее. Мобы прекрасно пеленгуются и разбираются роботами на запчасти.
  22. Сидеть в бункере и рулить роботами – скучноватое занятие, как по мне. Управляя, наблюдать за армией роботов – совсем другое дело. Для зрелищности нужна свобода перемещений, но возможности игрока влиять на мир следует сильно ограничить. Года два назад, крепко задумавшись над чем-то похожим, я так и не придумал ничего внятного. Более-менее легко реализуемый вариант был таким: Есть специальные майнерс-миры, привлекающие игроков кратной рудогенерацией, повышенными урожайностью и ростом растений, неограниченным количеством разрешенных реакторов и чем-то ещё. Игрок защищен от агрессивного мира эффектами скорости и регенерации, но скован огромного размера эффектами усталости и слабости. Миры ежесуточно регенерируются. Можно обойтись без эффекта скорости, заспавнив побольше свиней для развития авиации.
  23. Кстати, о законе. За гриферами (как и за вампирами) закрепился негативный смысл, и связано это с тем, что Майнкрафт является песочницей. Там игроки лепят куличики и строят домики. Понятно, что их печалит несанкционированная порча своих творений. Это, конечно, плохо. Но на индустриальном сервере, где всю нудную работу могут выполнить роботы и другие механизмы, утрата становится менее существенной. А при наличии полностью защищенной базы, сохраняющей всё самое ценное, некоторый запас роботов, инструментов и небольшое производство, потеря завода перестаёт быть трагедией, особенно, если учесть, как быстро окупают себя заводы в Майнкрафте. Если на сервере любая постройка может быть собрана и разобрана роботом, ресурсы для построек тоже добыты роботом, то и постройки и ресурсы перестают иметь решающую ценность. И, как говорит @qwertyMAN, ресурсы для грифера тоже вторичны. Первичен же сам процесс. И если процесс завязан на использование роботов, то такой процесс на computercraft.ru должен быть не только не запрещенным, но и поощряемым. Мне кажется, имеет смысл пересмотреть роль грифера на наших серверах. Понятно, что это не относится к PVP и сканированию или убийству игрока с помощью SGSC. Но грифер, льющий воду на мельницу Lua, достоин не наказания, а уважения.
  24. Почему перед публикацией не проверяешь код на работоспособность? В этом фрагменте и if потерялся, и в elsif ошибка, и в кодах zn разнобой. print ("Знак ❶[1],❷[2],➌[3],❻[6],➒[9],Нет знака[-]") zn = io.read() elsif zn == "-" then cb.setName(m.."§7§o]§r§8 [§"..pcol..pref.."§8") elseif zn == "1" then cb.setName(m.."§7§o]§r ❶ §8[§"..pcol..pref.."§8") elseif zn == "2" then cb.setName(m.."§7§o]§r ❷ §8[§"..pcol..pref.."§8") elseif zn == "➌" then cb.setName(m.."§7§o]§r ➌ §8[§"..pcol..pref.."§8") elseif zn == "❻" then cb.setName(m.."§7§o]§r ❻ §8[§"..pcol..pref.."§8") elseif zn == "➒" then cb.setName(m.."§7§o]§r ➒ §8[§"..pcol..pref.."§8") end И вообще, вместо длинной последовательности elseif удобнее использовать таблицу: local sign={["1"]=" ❶ ", ["2"]=" ❷ ", ["3"]=" ➌ ", ["6"]=" ❻ ", ["9"]=" ➒ "} cb.setName(m.."§7§o]§r" .. (sign[zn] or "") .. "§8[§"..pcol..pref.."§8")
×
×
  • Создать...