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

Активация редстоуна

Вопрос

Всем привет. Такой вопрос: можно ли как-то сделать, чтобы комп активировал редстоун при приближении игрока к предмету. Допустим есть дверь напечатанная на принтере, радар и комп, и в момент приближения игрока радар посылал сигнал в комп и комп активировал ред, тем самым открывая дверь? Дверь отпечатана так, что при клике по ней или подаче сигнала, она меняет положение

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


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

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

в общем я косяк и просто не подключал нормально ред. прога работает, но не выключается ред.

local event = require('event')
local com = require('component')
local sensor = com.motion_sensor
local sides = require('sides')
local redstone = com.redstone
 
while true do
    local _, address, x, y, z, name = event.pull('motion')
    print(name)
    redstone.setOutput(sides.front, 15)
end

 

 

P.S. попробовал SpiderEye, тоже работает(да-да, я не там ред пускал), но там ред включается и выключается будто кто-то быстро дергает рычаг туда-сюда и задержка срабатывания 0.5-1 сек

Изменено пользователем Alexhotice

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


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

всё верно здесь нет команды выключить сигнал, только включить

redstone.setOutput(sides.front, 15)

уровень 15

чтобы выключить поменяй на 0

redstone.setOutput(sides.front, 0)

и добавь задержку в секундах

os.sleep(3)

итого получим

local event = require('event')
local com = require('component')
local sensor = com.motion_sensor
local sides = require('sides')
local redstone = com.redstone
 
while true do
    local _, address, x, y, z, name = event.pull('motion')
    print(name)
    redstone.setOutput(sides.front, 15)
    os.sleep(3)
    redstone.setOutput(sides.front, 0)
end

 

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


Ссылка на сообщение
Поделиться на других сайтах
8 минут назад, serafim сказал:

local event = require('event') local com = require('component') local sensor = com.motion_sensor local sides = require('sides') local redstone = com.redstone while true do local _, address, x, y, z, name = event.pull('motion') print(name) redstone.setOutput(sides.front, 15) os.sleep(3) redstone.setOutput(sides.front, 0) end

спасибо

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


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

Еще один вопрос, как можно подать редсигнал нескольким соседним блокам(выше/ниже), если rednet запрещен?

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


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

Еще один вопрос, как можно подать редсигнал нескольким соседним блокам(выше/ниже), если rednet запрещен?

реднет, как я помню является сеть в компьютеркрафте

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


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

что за rednet  ?

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

 

Изменено пользователем serafim

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


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

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

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


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

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

 

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

посмотри SpiderEye Terminal: pastebin.com/bTc7tJKv в качестве примера

 

--список мобов
14  monsterlist = {"Spider", "Zombie", "Creeper", "Skeleton", "Enderman", "Sheep", "Cow", "Chicken"}

--перебор списка по строкам
311  for i=1, #monsterlist do
       if name == monsterlist[i] then 
         return true 
       end
     end

 

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


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

Для удобной прокладки редстоуна придется повозиться с ванильной пылью.

 

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

 

Ещё можно поставить не один красный контроллер, а несколько. Только тогда нужно будет устанавливать сигнал не только "главному" компоненту redstone, но и остальным.

Например так:

local sides = require('sides')
local com = require('component')

-- получаем список всех компонентов 'redstone'
local redstone = component.list('redstone')

-- когда нужно - изменяем на них на всех уровень сигнала
for address, _ in pairs(redstone) do
  com.invoke(address, "setOutput", sides.front, 15)
end

Или что-нибудь в таком духе.

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


Ссылка на сообщение
Поделиться на других сайтах
3 минуты назад, serafim сказал:

посмотри SpiderEye Terminal

да, спасибо, я там и посмотрел этот кусок кода

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


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

код получился у меня такой

local event = require('event')
local com = require('component')
local sensor = com.motion_sensor
local sides = require('sides')
local redstone = com.redstone
 
monsterlist = {"Spider", "Zombie", "Creeper", "Skeleton", "Enderman", "Sheep", "Cow", "Chicken"}
if not monsters then
  for i=1, #monsterlist do
    if name == monsterlist[i] then return true end
  end
end
 
while true do
    local _, address, x, y, z, name = event.pull('motion')
    print(name)
        for address, _ in pairs(redstone) do
            com.invoke(address, "setOutput", sides.front, 15)
        end
    os.sleep(4)
    redstone.setOutput(sides.front, 0)
end

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

image.png.80c30114648928f0cf8be51f37cc16f2.png 

 

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


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

ругается на несуществующий компонент invoke , да и проверку на мобов нужно после срабатывания датчика делать, то есть после event.pull('motion') 

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


Ссылка на сообщение
Поделиться на других сайтах
11 минут назад, serafim сказал:

ругается на несуществующий компонент invoke

тогда вначале вставить 

local invoke = com.invoke

или invoke заменить на red?

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


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

или invoke заменить на red?

Смысла нет. Оставляй так. Поясню часть ошибок которые я увидел в коде.

  • Для начала, зачем ты объявляешь redstone local redstone = com.redstone если у тебя судя по всему там используется целая связка контроллеров красного камня? Такое пойдет если используется только 1 контроллер.
  • Далее, for address, _ in pairs(redstone) do Это что за зверь такой? Смысл мусолить один и тот же контроллер? Если хотел сделать перебор всех контроллеров, то объяви их хотя бы так local red = component.list('redstone') и потом через pairs(red) все адреса перебирай.
  • redstone.setOutput(sides.front, 0) тут судя по всему ошибка или недописка. Подумай сам, если ты включил ВСЕ предположим 5 контроллеров, то потом сколько надо выключить?
Изменено пользователем Asior
computer -> component

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


Ссылка на сообщение
Поделиться на других сайтах
7 минут назад, Asior сказал:

redstone.setOutput(sides.front, 0) тут судя по всему ошибка или недописка. Подумай сам, если ты включил ВСЕ предположим 5 контроллеров, то потом сколько надо выключить?

окей, тут переписываю на com.redstone(address, "setOutput", sides.front, 0)

8 минут назад, Asior сказал:

local red = computer.list('redstone')

объявил, но в строке, где я задаю им мощность, com.redstone(address, "setOutput", sides.front, 15) выбивает ошибку

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


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

Блок:

if not monsters then
  ...
end

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

Это же проверка имени того, на кого "сагрился" датчик.

И проверять надо после того как это имя было получено, внутри цикла.

 

Ты можешь оформить проверку как функцию (и тогда ее можно будет как раз оставить в начале программы):

function isMonster(name)
  for i=1, #monsterlist do
    if name == monsterlist[i] then return true end
  end
  return false
end

Тогда внутри цикла, после срабатывания сенсора, можно будет проверить, монстр это был, или нет:

while true do
    local _, address, x, y, z, name = event.pull('motion')
    if isMonster(name) then
      print("Это был моб...")
    else
      print("Кто-то ломится в дом!")
    end
end

 

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


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

Хз чего там намудрили, тут все крайне просто. 

fmsFJpb.png

 

 

local event = require('event')
local com = require('component')
local sensor = com.motion_sensor
local sides = require('sides')
local red = com.list('redstone')
local monsterlist = {"Spider", "Zombie", "Creeper", "Skeleton", "Enderman", "Sheep", "Cow", "Chicken"}

local function monsterScan(name)
  for i=1, #monsterlist do
    if name == monsterlist then return false end
  end
  return true
end
  
while true do
  local _, address, x, y, z, name = event.pull('motion')
  if monsterScan(name) then
    print(name)
    for address, _ in pairs(red) do
      com.invoke(address, "setOutput", sides.front, 15)
    end
    os.sleep(4)
    for address, _ in pairs(red) do
      com.invoke(address, "setOutput", sides.front, 0)
    end
  end
end

 

Изменено пользователем Asior
кривой код

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


Ссылка на сообщение
Поделиться на других сайтах
7 минут назад, Asior сказал:

local event = require('event') local com = require('component') local sensor = com.motion_sensor local sides = require('sides') local red = com.list('redstone') local monsterlist = {"Spider", "Zombie", "Creeper", "Skeleton", "Enderman", "Sheep", "Cow", "Chicken"} local function monsterScan(name) for i=1, #monsterlist do if name == monsterlist[i] then return false end end return true end while true do local _, address, x, y, z, name = event.pull('motion') if monsterScan(name) then print(name) for address, _ in pairs(red) do com.invoke(address, "setOutput", sides.front, 15) end os.sleep(4) for address, _ in pairs(red) do com.invoke(address, "setOutput", sides.front, 0) end end end

спасибо большое

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


Ссылка на сообщение
Поделиться на других сайтах
13 минут назад, Totoro сказал:

Блок:


if not monsters then
  ...
end

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

Это же проверка имени того, на кого "сагрился" датчик.

И проверять надо после того как это имя было получено, внутри цикла.

 

Ты можешь оформить проверку как функцию (и тогда ее можно будет как раз оставить в начале программы):


function isMonster(name)
  for i=1, #monsterlist do
    if name == monsterlist[i] then return true end
  end
  return false
end

Тогда внутри цикла, после срабатывания сенсора, можно будет проверить, монстр это был, или нет:


while true do
    local _, address, x, y, z, name = event.pull('motion')
    if isMonster(name) then
      print("Это был моб...")
    else
      print("Кто-то ломится в дом!")
    end
end

 

 

тогда как-то будет выглядеть?

local event = require('event')
local com = require('component')
local sensor = com.motion_sensor
local sides = require('sides')
local monsterlist = {"Spider", "Zombie", "Creeper", "Skeleton", "Enderman", "Sheep", "Cow", "Chicken"}

function isMonster(name)
  for i=1, #monsterlist do
    if name == monsterlist[i] then return true end
  end
  return false
end

while true do 
local _, address, x, y, z, name = event.pull('motion') 
  if isMonster(name) then 
  print("Это был моб...") 
    else print("Кто-то ломится в дом!") 
  end 
end

 

 

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


Ссылка на сообщение
Поделиться на других сайтах
9 минут назад, Alexhotice сказал:

тогда как-то будет выглядеть?

 

Да. А @Asior показал как оно будет выглядеть для работы с несколькими redstone контроллерами.

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


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

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

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

Гость
Ответить на вопрос...

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

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

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

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

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


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