Перейти к публикации

В ближайшее время постараюсь разобраться с картой сервера/ЛК/бб кодами

Внимание, с 14 февраля до 20 февраля могут проходить работы на сервере, где также находится лаунчсервер. В связи с этим авторизация в лаунчере может не работать

Вопрос

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

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


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

52 ответа на этот вопрос

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

  • 0

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

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 

 

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


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

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

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


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

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

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

local invoke = com.invoke

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

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
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

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
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) выбивает ошибку

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


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

Блок:

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

 

  • Like 1
  • Thanks 1

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


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

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

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
кривой код
  • Thanks 1

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
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

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

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
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

 

 

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


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

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

 

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

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


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

Всем спасибо огромное!

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


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

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

А то только что запустил, а сигнал только на юг подается

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


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

Почитай вначале кто-то писал как передать сигнал во все стороны. А вообще можно пустить цикл перебором от 0 до 5 где переменой будет сторона выхода сигнала. Хотя я такое не советую делать, переключение редстоуна занимает около 1 секунды 

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


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

Почитай вначале

изменил я на эту часть,

com.invoke(address, "setOutput", {
    [sides.front] = 15,
    [sides.back] = 15,
    [sides.left] = 15,
    [sides.right] = 15,
    [sides.top] = 15,
    [sides.bottom] = 15
  })

и

com.invoke(address, "setOutput", {
    [sides.front] = 0,
    [sides.back] = 0,
    [sides.left] = 0,
    [sides.right] = 0,
    [sides.top] = 0,
    [sides.bottom] = 0
  })

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

image.png.a18153c9767a4b21055fd3e53bf0d9e1.png

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

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


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

здесь один датчик и одна сторона , может кому пригодится

local event = require('event')
local com = require('component')
local sensor = com.motion_sensor
local rs = com.redstone
local sides = require('sides')

local side = "top"  --"left","right","front","back","bottom","top".
local monsterlist = {"Spider","Zombie", "Creeper","Skeleton","Enderman","Sheep","Cow","Chicken"}

local function redset(side, value)
  rs.setOutput(sides[side], value)
end
redset(side, 0)

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

while true do
  local _,_,_,_,_,name = event.pull('motion')
  print("замечен: "..name)
  if isMonster(name) then
    print("вход запрещен")
    os.sleep(3)
  else
    print("дверь открыта")
    redset(side, 15)
    os.sleep(3)
    redset(side, 0)
  end
end

 

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


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

изменил я на эту часть,

и

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

 

Возможно это только в последних версиях добавили. Или оно для блоков не работает.

Значит придется по отдельности на каждую сторону сетить.

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


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

Значит придется по отдельности на каждую сторону сетить.

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

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


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

ну так подай сигнал на две стороны,  две строки,  также и выключить значение с 15 на 0

redstone.setOutput(sides.left, 15)  --с права
redstone.setOutput(sides.right, 15) --с лева

--"left","right","front","back","bottom","top".

 

  • Thanks 1

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


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

Можно как-то моблист переделать в плеер-лист?Т.е. перебор ников по строкам,и если ник совпадает,выводить редстоун сигнал,не?

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


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

Можно как-то моблист переделать в плеер-лист?Т.е. перебор ников по строкам,и если ник совпадает,выводить редстоун сигнал,не?

 

Да там вроде и переделывать ничего не надо.

Для мобов сенсор выводит название моба, а для игроков - ник. Просто в кучу, вместе с мобами добавляй всех и все.

 

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


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

Не,не робит,вписал вместе с мобами ник,не прокатило

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


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

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

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×