Asummonster 592 Опубликовано: 21 мая, 2015 (изменено) Всем привет! В этой теме я расскажу о своей простой программе-сканере инвентаря на 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() Изменено 22 июня, 2015 пользователем Asummonster сделал отступы в коде и убрал шрифт 28 пт 3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 21 мая, 2015 Одна только проблемка с этим пимом. Он имеет дурацкую колижен модель, он типа полублока, но немного меньше, но над ним всегда может пролететь Стив, не нажимая кнопку ногами, если даже пролет ограничить высотой точно для Стива. Такую штуковину на 1.6.4 делали, когда хотели сделать контролера, чтобы из Компьютерной Академии не воровали железо , я там пытался сделать типа паблик тусовку для программистов сервера, где они могли входить туда и там программить, а не крафтить все с нуля. П.С, И кстати, такие вызовы функций скорее всего вызовут переполнение памяти, если не будет сундука или он будет полный, прога зациклится на запрещенке и вылетит скорее всего. Ну а так для ГРИФ-ЛОВУШЕК самое то, обчистить бедняг незадачливых, которые не знают, что это за кнопоСька черненькая, может встать на нее Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 541 Опубликовано: 21 мая, 2015 Велосипед велосипедов, очень хороший пример. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 21 мая, 2015 Ну реально. Зачем было делать эту конструкцию из двух функций вместо, например, обычного while(true) ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 21 мая, 2015 Ну реально. Зачем было делать эту конструкцию из двух функций вместо, например, обычного while(true) ? Дим, мы просто не знаем всей глубины глубин замысла Асумонстрика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Asummonster Автор темы 592 Опубликовано: 21 мая, 2015 Когда я так сделал,она циклила сообщения по 20-30 раз за 1 слот Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
KelLiN 49 Опубликовано: 21 мая, 2015 (изменено) Могу подсобить и распечатать ограничительную доску в нужный размер . Если сделать размер ровно в высоту, то пролететь физически будет возможно только со скоростью света, иначе гравитация за пол блока все равно притянет на пару вокселей. Плюс порожики принтануть можно чтобы удобнее ходить было. Изменено 21 мая, 2015 пользователем KelLiN Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Krutoy 1 169 Опубликовано: 21 мая, 2015 Могу подсобить и распечатать ограничительную доску в нужный размер . Если сделать размер ровно в высоту, то пролететь физически будет возможно только со скоростью света, иначе гравитация за пол блока все равно притянет на пару вокселей. Плюс порожики принтануть можно чтобы удобнее ходить было. Ага, я уже испытал. Нужен ограничитель, начинающийся с высоты 4, например {0,4,0,16,16,16} Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
KelLiN 49 Опубликовано: 21 мая, 2015 AlexCC прав, память закончится. И при том даже без заполненных сундуков. Как в обычныхЯп это выглядит. По идее переменная minNum в старт1 является локальной (логично,т.к. вне процедуры она не обьявлялась, а глобальной её в теле процедуры никто не называл) и при вызове старт2 она не очищается. Вызывается старт2, происходит по окончании вызов старт1. т.к. return нигде нет, то и minNum все еще держиться в памяти,т.к. после start1() в процедуре start2 может еще быть использована (после вызова может быть еще код.У нас частный случай отсутствие кокда,но не думаю что lua такие вещи может оптимизировать). в итоге мы должны после 500 наступаний получить 500 minNum в различных областях вложенности. Поправьте если в луа сделано тупо и не как везде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 22 мая, 2015 [ok=Монстрик, переоформи тему немного и дополни. ][/ok] Вот скрины: Вот я маленько подправил код: 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 слоты не чисти, это броня) П.С. За программку получаешь заслуженную вторую медальку. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Asummonster Автор темы 592 Опубликовано: 22 мая, 2015 Хорошо,будет сделано=)Спасибо!=) На сервере с вызовом функций покончил с помощью os.execute, но ведь программа не обязательно называется autorun.lua...Попробую с циклом while Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob 2 749 Опубликовано: 29 ноября, 2015 (изменено) Кто-то поставил это на входную дверь, постоянно вырубается, глючит, я посмотрел, не стал разбираться где ошибки - написал свою. В общем, мой простой скрипт превращает pim в нажимную плиту - если на нее наступает игрок из белого списка, она посылает сигнал редстоуна на поршневую дверь (обычные двери требуют механизма обновления блока), если на нее наступает любой другой игрок, она забирает его вещи. С другой стороны стоит обычная нажимная плита,, которая пропускает всех подряд. Конфиг простой: первая строка - белый список, вторая - направление на контейнер, третья - направление на обычную нажимную плиту, которая находится с внутренней стороны для redstone I/O У меня скрипт запускается в autorun.lua - os.execute('smart_pplate >> log') В одиночке это не так заметно, но на сервере, если ведется лог, то перенос лута идет дольше. Вообще, логгирование можно выкинуть, потому-что я его прикрутил просто, чтобы собирать статистику у кого какой лут. 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 Изменено 5 декабря, 2015 пользователем Doob 6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
davial 1 972 Опубликовано: 30 ноября, 2015 (изменено) Кто-то поставил это на входную дверь, постоянно вырубается, глючит, я посмотрел, не стал разбираться где ошибки - написал свою. В общем, мой простой скрипт превращает pim в нажимную плиту - если на нее наступает игрок из белого списка, она посылает сигнал редстоуна на поршневую дверь (обычные двери требуют механизма обновления блока), если на нее наступает любой другой игрок, она забирает его вещи. С другой стороны стоит обычная нажимная плита,, которая пропускает всех подряд. Конфиг простой: первая строка - белый список, вторая - направление на контейнер, третья - направление на обычную нажимную плиту, которая находится с внутренней стороны для redstone I/O У меня скрипт запускается в autorun.lua - os.execute('smart_pplate >> log') В одиночке это не так заметно, но на сервере, если ведется лог, то перенос лута идет дольше. Вообще, логгирование можно выкинуть, потому-что я его прикрутил просто, чтобы собирать статистику у кого какой лут. 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 Один вчера уже наступил. Спрашивал в чате : "Что это за кнопка такая ? " Я даже слетал, глянул - где она там у тебя стоит. Посоветовал товарищу к тебе обращаться. Изменено 30 ноября, 2015 пользователем davial Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Krutoy 1 169 Опубликовано: 30 ноября, 2015 Я на прошлом сервере на PIMe около 7 квантов собрал. 4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob 2 749 Опубликовано: 1 декабря, 2015 Причем упорно лезут и лезут, некоторые регулярно приходят, раз в игровой час, постоят пару минут и уходят))) 4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
davial 1 972 Опубликовано: 1 декабря, 2015 Причем упорно лезут и лезут, некоторые регулярно приходят, раз в игровой час, постоят пару минут и уходят))) Наверное ищут чего-то. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 2 декабря, 2015 Наверное ищут чего-то. Приключений на 5-й порт ввода-вывода=) 4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Mecopy6ka 366 Опубликовано: 2 декабря, 2015 Приключений на 5-й порт ввода-вывода=)Как по мне, так это односторонний порт вывода =) 4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 2 декабря, 2015 Как по мне, так это односторонний порт вывода =) Это то дааа..... у нормальных людей с ориентацией. Но у тех, кто любит бегать и топтаться по чужим пимкам, инпут, видимо, тоже работает и покоя им не дает. 5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Mecopy6ka 366 Опубликовано: 2 декабря, 2015 Так ПИМка же забирает предметы, соответственно, использует функцию вывода =) Хотя, погодите, я совсем забыл о её второй функции - закидывать плутоний в инвентарь настувшему :Р ЗЫ: Только боюсь даже догадаться, почему именно в пятый порт. 3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах