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

OpenDoor - автоматическая дверь

Рекомендуемые сообщения

привет всем жителям форума!

я спустя пару дней решил поделиться с вами программу. его писал я со своим товарищем из Discord

примечание: всё делали новички-дураки которые переписывали код по несколько раз 

 

что может делать эта программа?

 

данная программа работает на всех версия компьютеров

и сам функционал прост, подключаем датчик движение, редстоун контролер и любой механизм на красном пыльце

 

скринов не будет, так как я не понял как их нормально загрузить.

 

Цитата

pastebin get Tbe79shc opendoor

 

для тех кто хочет изучить код или проверить на ошибки, держите ссылочку на программу

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Предлагаю такой вариант программы:

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. Каждый таймер считается отдельно

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Oleshe  проблема в 8 строке, из-за моей тупости и неопытности, я боюсь тронуть строку

 

может твоя ошибка или я протупил жёстко 

Скрытый текст

2024-09-04_07_42.37_edited.png.7a2f1938b4daae40dbadfae997cda5b2.png

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Кхм. Я сказал, что оно черпает конфиг и дата базу пользователей из файла? Вы создали эти файлы? Пропишите к ним путь, он в переменных в первых же строках кода.
Дата база пользователей- один ник, одна строка. На каждую строку свой ник, суть ясна.

Username
Username2
Thrid_User_Name


Конфиг- таблица. Сейчас это:

{sleepTime = 1}

 

Изменено пользователем Oleshe
Уточнение по содержанию файлов

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
5 часов назад, Oleshe сказал:

Кхм. Я сказал, что оно черпает конфиг и дата базу пользователей из файла? Вы создали эти файлы? Пропишите к ним путь, он в переменных в первых же строках кода.
Дата база пользователей- один ник, одна строка. На каждую строку свой ник, суть ясна.

получается что информацию про пользователей берётся из файлов игры, а не из виртуального железа. Что в моём случае идёт чутка в разрез идеи OpenDoor, чья цель создание защиты безопасности или же таких-же дверей с замками из Rust.

 

но если смотреть так, то твой код хоть и выглядит для меня сложным и немного непонятен, но так же открыла мне глаза.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да, оставив мою конструкцию с 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". Они так же сохраняются в файл. Сохранять пользователей я не стал, ибо их удалить нельзя из программы напрямую, что может создать геморрой. Тем не менее из старта программы они всё еще зачисляются, что означает, что вы можете не прописывать там себя и ваших союзников каждый раз. Сильно откланяться от вашей программы не стану, поэтому далее, как поступать, смотрите сами

Изменено пользователем Oleshe
Поправил код, что бы он не ссылался, на пример, на несуществующую команду 'start'

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...