Cray_kit 0 Опубликовано: 2 сентября привет всем жителям форума! я спустя пару дней решил поделиться с вами программу. его писал я со своим товарищем из Discord примечание: всё делали новички-дураки которые переписывали код по несколько раз что может делать эта программа? данная программа работает на всех версия компьютеров и сам функционал прост, подключаем датчик движение, редстоун контролер и любой механизм на красном пыльце скринов не будет, так как я не понял как их нормально загрузить. Цитата pastebin get Tbe79shc opendoor для тех кто хочет изучить код или проверить на ошибки, держите ссылочку на программу Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Oleshe 36 Опубликовано: 3 сентября Предлагаю такой вариант программы: local users = {} local userDataFile = '/userdataOpenDoors.txt' local configFile = '/configOpenDoors.cfg' local event = require('event') local setOutput = require('component').redstone.setOutput local handle = io.open(configFile,'r') local config = require('serialization').unserialize(handle:read(16000)) or {sleepTime = 1}-- Загружаем конфиг handle:close() local handle = io.open(userDataFile,'r') while true do -- Загружаем пользователей local name = handle:read() if not name then break else users[name] = true end end handle:close() local listener = event.listen("motion", function(_, _, _, _, _, username) -- Слушаем в потоке движение if users[username] then setOutput(1,1) event.timer(config.sleepTime, function() setOutput(1,0) end) -- Откладываем выполнение кода в поток end end) while true do local input = io.read() -- Слушаем пользователя if input == 'exit' then event.cancel(listener) return true end end Здесь мы загружаем конфиг и базу пользователей из файла, что исключает потребность каждый раз заново прописывать их. Так же здесь используется event.listen, который не будет блокировать io.read, как и event.timer. Каждый таймер считается отдельно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Cray_kit Автор темы 0 Опубликовано: 3 сентября @Oleshe проблема в 8 строке, из-за моей тупости и неопытности, я боюсь тронуть строку может твоя ошибка или я протупил жёстко Скрытый текст Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Oleshe 36 Опубликовано: 4 сентября (изменено) Кхм. Я сказал, что оно черпает конфиг и дата базу пользователей из файла? Вы создали эти файлы? Пропишите к ним путь, он в переменных в первых же строках кода. Дата база пользователей- один ник, одна строка. На каждую строку свой ник, суть ясна. Username Username2 Thrid_User_Name Конфиг- таблица. Сейчас это: {sleepTime = 1} Изменено 4 сентября пользователем Oleshe Уточнение по содержанию файлов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Cray_kit Автор темы 0 Опубликовано: 4 сентября 5 часов назад, Oleshe сказал: Кхм. Я сказал, что оно черпает конфиг и дата базу пользователей из файла? Вы создали эти файлы? Пропишите к ним путь, он в переменных в первых же строках кода. Дата база пользователей- один ник, одна строка. На каждую строку свой ник, суть ясна. получается что информацию про пользователей берётся из файлов игры, а не из виртуального железа. Что в моём случае идёт чутка в разрез идеи OpenDoor, чья цель создание защиты безопасности или же таких-же дверей с замками из Rust. но если смотреть так, то твой код хоть и выглядит для меня сложным и немного непонятен, но так же открыла мне глаза. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Oleshe 36 Опубликовано: 5 сентября (изменено) Да, оставив мою конструкцию с event.listen можно использовать вашу изначальную программу, с мизерными корректировками. Оптимизация, применённая мною: вместо перебора каждого пользователя в списке и сравнения его с тем, что дало событие, лучше сделать "Есть ли имя игрока в списке разрешённых? Да- event.timer, который откладывает выполнение кода, отключит только что включённый редстоун." Редактируя ваш код ранее, можно прийти к такому решению: Скрытый текст local users = {} local userDataFile = '/userdataOpenDoors.txt' local configFile = '/configOpenDoors.cfg' local event = require('event') local setOutput = require('component').redstone.setOutput local handle = io.open(configFile,'r') local config = require('serialization').unserialize(handle:read(math.huge)) or {sleepTime = 1}-- Загружаем конфиг handle:close() local handle = io.open(userDataFile,'r') while true do -- Загружаем пользователей local name = handle:read() if not name then break else users[name] = true end end handle:close() local listener = event.listen("motion", function(_, _, _, _, _, username) -- Слушаем в потоке движение if users[username] then setOutput(1,15) event.timer(config.sleepTime, function() setOutput(1,0) end) -- Откладываем выполнение кода в поток end end) print("Введите ники игрока(ов) для доступа к двери или exit - для выхода") while true do local inp = io.read() if inp == "exit" then event.cancel(listener) os.exit() elseif inp == "config" then print("Для изменения параметра напишите его название. Чтобы выйти из конфига впишите exit.") print("sleepTime - Задержка сигнала: " .. config.sleepTime) while true do inp = io.read() if inp == "exit" then break elseif string.sub(inp, 1, 9) == "sleepTime" then -- Если начало вырожения значение одной из переменных в конфиге local num = tonumber(string.sub(inp, 10, #inp)) -- Вырезаем и трансформируем её в цифру if num == nil then print("Введено не число!") elseif num <= 0 then print("Введено число меньше нуля!") else config.sleepTime = num local handle = io.open(configFile,'w') handle:write(require('serialization').serialize(config)) -- Сохраняем конфиг handle:close() print("Значение " .. num .. " сохранено.") end else print('Неизветный параметр!') end end else users[inp] = true print('Добавлен пользователь ' .. inp .. '!') end end Не уверен, стоит ли оставлять то, что любой неверный ввод с клавиатуры превратиться в нового пользователя. Теперь переменные в конфиг ставить: "sleepTime n", на пример: "sleepTime 12.5". Они так же сохраняются в файл. Сохранять пользователей я не стал, ибо их удалить нельзя из программы напрямую, что может создать геморрой. Тем не менее из старта программы они всё еще зачисляются, что означает, что вы можете не прописывать там себя и ваших союзников каждый раз. Сильно откланяться от вашей программы не стану, поэтому далее, как поступать, смотрите сами Изменено 5 сентября пользователем Oleshe Поправил код, что бы он не ссылался, на пример, на несуществующую команду 'start' Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах