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

Сканер инвентаря на PIM

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

Всем привет!

В этой теме я расскажу о своей простой программе-сканере инвентаря на PIM из OpenPeripheralAddon!

Прежде всего, вам потребуется:

 

PIM+Адаптер(Сколько поддерживает ваш процессор, если делаете систему безопасности в доме,что бы никто в дом с оружием не входил,то лучше ставьте сервер с ComponentBus)

1 PIM стоит очень дёшево(3 обсидиана, 2 красной пыли и 2 бревна)

В чём смысл этого кода?К примеру,вы такой добрый человек как Krutoy, и у вас двери на распашку, мол входи, крипер,зомби, самр и хом, мне всё равно=)

Но вот вас постоянно убивают!Что вы делаете?Ставите 1 такой PIM у двери, под ним адаптер и тянете проводок к своему серверу или компу(Сделаю ещё версию на бэкграунде), вписываете в таблицу ITEMS предметы,с которыми к Вам не должны заходить, в переменную CHEST_SIDE вводите сторону света,с которой стоит сундук относительно PIM(Узнать её можно нажав F3[Переменная f{Находится под координатой z}])И всё!Все,кто принёс к вам в дом запрещённый предмет сразу его потеряет!+ вам на экран напечатается, что за вещи у него в инвентаре,и что за запрещённый предмет он пытался пронести в дом!

На этом всё=)

Вот сам код:

 

CHEST_SIDE="south"
ITEMS={"Nano Saber"}

pim=require("component").pim
event=require("event")

function start2()
	for i=minNum, 40 do
		if pim.getStackInSlot(i) then
			for g=1, #ITEMS do
				if pim.getStackInSlot(i).display_name==ITEMS[g] then 
					pim.pushItemIntoSlot(CHEST_SIDE, i); 
					print("ЗАСЕЧЁН ЗАПРЕЩЁННЫЙ ПРЕДМЕТ:"..ITEMS[g].."!!!"); minNum=i; start2()
				end
				print("Слот: "..i.." ; Предмет : "..pim.getStackInSlot(i).display_name.."; Кол-во : "..pim.getStackInSlot(i).qty)
			end
		end
	end
	print("ПРОВЕРКА ЗАКОНЧЕНА!")
	start1()
end

function start1()
	minNum=1
	event.pull("player_on")
	start2()
end

start1() 

--Версия AlexCC(более стабильна)
local pim=require("component").pim
local event=require("event")
local term = require('term')

--сторона света, на которой находится сундук от устройства PIM (south, west, north, east). Сундук должен стоять вплотную к PIM.
local CHEST_SIDE = 'south'

--предметы, которые подлежат конфискации
ITEMS = {'Nano Saber', 'Diamond', 'GraviChestPlate', 'Iridium Ore'}
term.clear()
print('Сканер игроков включен!')

function scanPlayer()
  while true do
      e, nick, uuid, adr  = event.pull('player_on')
      term.clear()
      print('--------------  СКАНИРОВАНИЕ  -----------')
      print('>>> Игрок: '..nick)
      for i = 1, 40 do
        if pim.getStackInSlot(i) then
          local count = pim.getStackInSlot(i).qty
          print("Слот "..i..': '..pim.getStackInSlot(i).display_name..' - '..count..' шт.')
             for j = 1, #ITEMS do
               if pim.getStackInSlot(i).display_name == ITEMS[j] then 
                 pim.pushItemIntoSlot(CHEST_SIDE, i)
                 print('ЗАПРЕЩЁННЫЙ ПРЕДМЕТ ИЗЪЯТ: '..ITEMS[j]..' - '..count..' шт.')
                 break
              end
          end  
        end
      end
      print('---------  ПРОВЕРКА ЗАКОНЧЕНА  -----------')
  end
end

scanPlayer()
Изменено пользователем Asummonster
сделал отступы в коде и убрал шрифт 28 пт

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


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

Одна только проблемка с этим пимом. Он имеет дурацкую колижен модель, он типа полублока, но немного меньше, но над ним всегда может пролететь Стив, не нажимая кнопку ногами, если даже пролет ограничить высотой точно для Стива.  

 

Такую штуковину на 1.6.4 делали, когда хотели сделать контролера, чтобы из Компьютерной Академии не воровали железо :) , я там пытался сделать типа паблик тусовку для программистов сервера, где они могли входить туда и там программить, а не крафтить все с нуля.

 

П.С, И кстати, такие вызовы функций скорее всего вызовут переполнение памяти, если не будет сундука или он будет полный, прога зациклится на запрещенке и вылетит скорее всего.

 

Ну а так для ГРИФ-ЛОВУШЕК самое то, обчистить бедняг незадачливых, которые не знают, что это за кнопоСька черненькая, может встать на нее B-)

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


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

Велосипед велосипедов, очень хороший пример.

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


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

Ну реально. Зачем было делать эту конструкцию из двух функций вместо, например, обычного while(true):D

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


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

Ну реально. Зачем было делать эту конструкцию из двух функций вместо, например, обычного while(true):D

 

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

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


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

Когда я так сделал,она циклила сообщения по 20-30 раз за 1 слот

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


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

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

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

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


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

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

Ага, я уже испытал. Нужен ограничитель, начинающийся с высоты 4, например {0,4,0,16,16,16}

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


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

AlexCC прав, память закончится. И при том даже без заполненных сундуков. Как в обычныхЯп это выглядит. По идее переменная minNum в старт1 является локальной (логично,т.к. вне процедуры она не обьявлялась, а глобальной её в теле процедуры никто не называл) и при вызове старт2 она не очищается. Вызывается старт2, происходит по окончании вызов старт1. т.к. return нигде  нет, то и minNum все еще держиться в памяти,т.к. после start1() в процедуре start2 может еще быть использована (после вызова может быть еще код.У нас частный случай отсутствие кокда,но не думаю что lua такие вещи может оптимизировать). в итоге мы должны после 500 наступаний получить 500 minNum в различных областях вложенности. Поправьте если в луа сделано тупо и не как везде.

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


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

[ok=Монстрик, переоформи тему немного и дополни. ][/ok]

 

Вот скрины:

 

 

 

WSvuiJX.png

 

hnIM7Fx.png

 

PC8myVR.png

 

 

Вот я маленько подправил код:

 

 

local pim=require("component").pim
local event=require("event")
local term = require('term')

--сторона света, на которой находится сундук от устройства PIM (south, west, north, east). Сундук должен стоять вплотную к PIM.
local CHEST_SIDE = 'south'

--предметы, которые подлежат конфискации:)
ITEMS = {'Nano Saber', 'Diamond', 'GraviChestPlate', 'Iridium Ore'}
term.clear()
print('Сканер игроков включен!')

function scanPlayer()
  while true do
      e, nick, uuid, adr  = event.pull('player_on')
      term.clear()
      print('--------------  СКАНИРОВАНИЕ  -----------')
      print('>>> Игрок: '..nick)
      for i = 1, 40 do
        if pim.getStackInSlot(i) then
          local count = pim.getStackInSlot(i).qty
          print("Слот "..i..': '..pim.getStackInSlot(i).display_name..' - '..count..' шт.')
             for j = 1, #ITEMS do
               if pim.getStackInSlot(i).display_name == ITEMS[j] then 
                 pim.pushItemIntoSlot(CHEST_SIDE, i)
                 print('ЗАПРЕЩЁННЫЙ ПРЕДМЕТ ИЗЪЯТ: '..ITEMS[j]..' - '..count..' шт.')
                 break
              end
          end  
        end
      end
      print('---------  ПРОВЕРКА ЗАКОНЧЕНА  -----------')
  end
end

scanPlayer()

 

 

 

И напиши, что заберется столько предметов, сколько сможет влезть в сундук. Если операция дропа невозможна из-за полного сундука, программа напишет, что предмет изъят, но на самом деле он останется у игрока, или какое-то его количество, которое не влезло.

 

Также сделай вариант программы с полной отгрузкой инвентаря. Удобно, когда пришел с шахты и все автоматом вывалилось в сундук и улетело в АЕ (только 37,38,39,40 слоты не чисти, это броня)

 

П.С.  За программку получаешь заслуженную вторую медальку.

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


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

Хорошо,будет сделано=)Спасибо!=)

На сервере с вызовом функций покончил с помощью os.execute, но ведь программа не обязательно называется autorun.lua...Попробую с циклом while

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


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

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

В общем, мой простой скрипт превращает pim в нажимную плиту - если на нее наступает игрок из белого списка, она посылает сигнал редстоуна на поршневую дверь (обычные двери требуют механизма обновления блока), если на нее наступает любой другой игрок, она забирает его вещи. С другой стороны стоит обычная нажимная плита,, которая пропускает всех подряд.

Конфиг простой: первая строка - белый список, вторая - направление на контейнер, третья - направление на обычную нажимную плиту, которая находится с внутренней стороны для redstone I/O

 

У меня скрипт запускается в autorun.lua - os.execute('smart_pplate >> log')

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

 

 

 

9mfiejD.png

local wList = {'Player1', 'Player2'} -- белый список игроков
local chest = 'DOWN' -- направление на контейнер для лута
local pplate = 5 -- направление на нажимную плиту
local log = 1 -- вести запись лога
local event = require('event')
local component = require('component')
local redstone = component.redstone
local pim = component.pim
local item = nil

local function check(name)
  for i = 1, #wList do
    if wList[i] == name then
      return true
    end
  end
  return false
end

local function open()
  for side = 0, 5 do
    redstone.setOutput(side, 15)
  end
  os.sleep(2)
  for side = 0, 5 do
    redstone.setOutput(side, 0)
  end
  os.sleep(2)
end

print('Умная нажимная плита включена.')

while 1 do
  local e = {event.pull()}
  if e[1] == 'player_on' then
    if check(e[2]) then
      print(e[2] .. ' прошел через дверь.')
      open()
    else
      io.write('\n\n' .. os.date() .. '  ' .. e[2])
      for j = 1, pim.getInventorySize() do
        item = pim.getStackInSlot(j)
        if log == 1 and item ~= nil then
          io.write('\n  ' .. item.qty .. '  ' .. item.display_name)
        end
        pim.pushItem(chest, j)
      end
      io.write('\n----------------------')
      print('\n' .. e[2] .. ' был обезврежен.')
    end
  elseif e[1] == 'redstone_changed' and e[3] == pplate then
    open()
  end
  e = nil
end

 

 

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

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


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

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

В общем, мой простой скрипт превращает pim в нажимную плиту - если на нее наступает игрок из белого списка, она посылает сигнал редстоуна на поршневую дверь (обычные двери требуют механизма обновления блока), если на нее наступает любой другой игрок, она забирает его вещи. С другой стороны стоит обычная нажимная плита,, которая пропускает всех подряд.

Конфиг простой: первая строка - белый список, вторая - направление на контейнер, третья - направление на обычную нажимную плиту, которая находится с внутренней стороны для redstone I/O

 

У меня скрипт запускается в autorun.lua - os.execute('smart_pplate >> log')

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

 

 

 

9mfiejD.png

local wList = {'Player1', 'Player2'} -- белый список игроков
local chest = 'DOWN' -- направление на контейнер для лута
local pplate = 5 -- направление на нажимную плиту
local log = 1 -- вести запись лога
local event = require('event')
local component = require('component')
local redstone = component.redstone
local pim = component.pim
local item = nil

local function check(name)
  for i = 1, #wList do
    if wList[i] == name then
      return true
    end
  end
  return false
end

local function open()
  for side = 0, 5 do
    redstone.setOutput(side, 15)
  end
  os.sleep(2)
  for side = 0, 5 do
    redstone.setOutput(side, 0)
  end
  os.sleep(2)
end

print('Умная нажимная плита включена.')

while 1 do
  local e = {event.pull()}
  if e[1] == 'player_on' then
    if check(e[2]) then
      print(e[2] .. ' прошел через дверь.')
      open()
    else
      io.write('\n\n' .. os.date() .. '  ' .. e[2])
      for j = 1, pim.getInventorySize() do
        item = pim.getStackInSlot(j)
        if log == 1 and item ~= nil then
          io.write('\n  ' .. item.qty .. '  ' .. item.display_name)
        end
        pim.pushItem(chest, j)
      end
      io.write('----------------------')
      print('\n' .. e[2] .. ' был обезврежен.')
    end
  elseif e[1] == 'redstone_changed' and e[3] == pplate then
    open()
  end
  e = nil
end

 

 

Один вчера уже наступил. :giggle:  Спрашивал в чате : "Что это за кнопка такая ? " Я даже слетал, глянул - где она там у тебя стоит. Посоветовал товарищу к тебе обращаться.

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

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


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

Причем упорно лезут и лезут, некоторые регулярно приходят, раз в игровой час, постоят пару минут и уходят)))

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


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

Причем упорно лезут и лезут, некоторые регулярно приходят, раз в игровой час, постоят пару минут и уходят)))

Наверное ищут чего-то. :D

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


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

Наверное ищут чего-то. :D

Приключений на 5-й порт ввода-вывода=)

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


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

Приключений на 5-й порт ввода-вывода=)

Как по мне, так это односторонний порт вывода =)

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


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

Как по мне, так это односторонний порт вывода =)

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

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


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

Так ПИМка же забирает предметы, соответственно, использует функцию вывода =)

Хотя, погодите, я совсем забыл о её второй функции - закидывать плутоний в инвентарь настувшему :Р

 

ЗЫ: Только боюсь даже догадаться, почему именно в пятый порт.

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


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

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

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

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

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

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

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

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

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


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