Alex 4 683 Опубликовано: 14 января, 2015 Программа "Полицейский" Описание программы: В чем суть проблемы? Например Вася приходит в банк, закрывается в комнате торговли, при этом на нем квант и нано-сабелька. Далее он выходит из игры и ждет какое-то время. Приходит в банк Петя, в кожаной броне, трясущимися руками принес 15 кусочков золота, чтобы продать и купить стержень ифритика или алмазик. Он чувствует себя в безопасности, так как он в админ-привате, с терминала он закрыл бронированную дверь за собой и радостно торгует с банком, он сам в комнатке. По трубам летают кусочки золота, черепашка выплевывает Пете алмазик, и тут Вася заходит в игру. Согласно механике Майнкрафт, Вася при логине оказывается в той же точке, в которой был последний раз! Он начинает мешать Пете, выхватывает ресы, крутится, тыкается в комп мордочкой, а при наличии лазера еще и Петю, чего, доброго, и прихлопнуть может. Лазер не отлавливается запреткой на ПвП в админ привате, например. Чтобы его не запрещать на использование и прочее, и нужна такая программа, ну а также, чтобы не было такого анал-карнавала в банке, да и не только в банке, а везде, где предусмотрены торговля и обмен и уединение игрока в какой-то комнате. Если все улетели из комнаты, банк по истечению таймера сам опять открывает бронированные двери. Вы огляделись, да, никого рядом нет, закрылись и спокойно торгуете. Вот такие пирожки Что должна делать программа: 1. Событие, которое отлавливает AMI блок "player_login" При логине в игру на определенные коры (запрет зона, например, х=100:150 z=3200:3300) данный игрок отТП-шивается на спавн (коры спавна), на игрока заводится отдельный одноименный файл(если его нет) в папочке "Нарушители", в который заноситься(добавляется) количество нарушений(общее число) Ругать за это сильно не будем, но для статистики нужно. В файл же общего лога в корне программы добавляем это событие (, , ) на экранчик можно выводить ТОП-10 нарушителей например. То есть раз в 15 минут в фоне считывать все файлы и выводить 10 самых опасных преступников на экран при нарушении вызвать функцию typeОffense(user_name, type_offense), ее оставить пустой, это для штрафа, я в нее добавлю небольшой штраф за нарушение - снятие денег с банковского счета по гет-запросу к базе SQL админам, если они есть, принтится в личку или на почту сообщение о нарушении по игроку срабатывает сигналка в точке установки системы (спавн, банк, казино и прочее) нарушителю в личку или почту отправляется уведомление о штрафе и причине. 2. Событие, которое отлавливает радар(или любой детектор инвентаря) id=4150:(1-26) Лазер. Это параллельный поток, он не зависимо от события логина, постоянно сканирует игроков в радиусе на предмет запретки в инвентаре и просто их не пускает в зону, отфутболивая игроков-нарушителей с нее. при наличии у игрока списка запрещенных предметов в инвентаре (оружие, наркотики, уран и.т.п. ) игрок с запретной зоны(где нельзя иметь подобны вещи) отТП-шивается куда-нибудь, не важно, в какую-то нейтральную зону например, или вообще в тюрягу цепочка дальнейших событий та же, лог, сообщения, аларм и предупреждение, штраф. Состав установки: Установочка размещается где нибудь в бункере под спавном или банком или казино, не важно. ПК (любой) АМИ (радар), ком. блок. экранчик(любой), система аларма (звуко-свето сигналка возле установки + сенд месседжа в личку Админам при их онлайне или на игровую почту) Награда: орден "Помощник Администрации", квантовая панель ASP-3 шт. На месяц команда полета и скорости бега x10. Квантовый заряженный сет брони. Примечание: моды, АПИ, периферия сильно изменились или работают с косячками на 1.7.10 по сравнению с 1.6.4., если по какой-то причине что-то нельзя реализовать с той комплектацией модов и аддонов, которая у нас есть - немедленно сообщите в этот топик! local ami = peripheral.wrap('bottom') local commandBlock = peripheral.wrap('top') current_time = 'time unknown' Модуль для получения в фоне более менее точного времени current_time , время уточняется на сайте раз в 60 секунд, мгновенно время тяжело получить с сайта http://www.timeapi.org. local function GET(url) local l = http.get(url) if l then local retValue = l.readAll() l.close() return retValue, true else return nil, false end end local function timeFormat(t) return string.sub(t, 1, 10)..'-'..string.sub(t, 12, 19) end function getWorldTime() while true do repeat response, state = GET('http://www.timeapi.org/pdt/in+9+hours') until state current_time = timeFormat(response) sleep(60) end end Командный модуль: local function sayMsg(msg, user_name) commandBlock.setCommand('/say '..msg) commandBlock.runCommand() end Модуль штрафов(оставить пустым): local function typeОffense(user_name, type_offense) end Документация AMI Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 19 января, 2015 А почему бы просто не сделать зону запрещенную для логина? Иными словами, если Вася зашел в закрытую комнату, отлогинился и пытается снова залогиниться, его должно выкинуть из комнаты. При помощи AMI это будет программка в пять строчек: 1. Ждем событие player_login 2. Контролируем координаты залогинившегося игрока 3. Если игрок в комнате, переносим его за пределы комнаты Таким образом, Петя, закрывшийся в комнате, будет в полной безопасности. А на выходе из комнаты его уже будет поджидать Вася 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex Автор темы 4 683 Опубликовано: 20 января, 2015 А почему бы просто не сделать зону запрещенную для логина? Иными словами, если Вася зашел в закрытую комнату, отлогинился и пытается снова залогиниться, его должно выкинуть из комнаты. При помощи AMI это будет программка в пять строчек: 1. Ждем событие player_login 2. Контролируем координаты залогинившегося игрока 3. Если игрок в комнате, переносим его за пределы комнаты Таким образом, Петя, закрывшийся в комнате, будет в полной безопасности. А на выходе из комнаты его уже будет поджидать Вася Именно это я и написал. Разве нет?) Каждое событие логина отлавливается персонально и если игрок при логине находится на запретке, он мгновенно отфутболивается на спавн. И именно это сделать на АМИ. А Петя, закончив торговлю, из закрытой комнатки хомается или варпается, куда ему удобно, а может открыть комнатку и пешочком выйти из банка. По истечению таймера банк сам откроет комнатку для следующих посетителей, если она не было открыта принудительно изнутри. Но программа не просто футболит с запретки вновь залогинившихся, она это документирует и штрафует, алармит, оповещает, сканирует оружие в инвентаре и прочее. Это настоящий "Полицейский" Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kremnev8 12 Опубликовано: 26 января, 2015 Решил попробовать написать это . Пока реализован только первый пункт , за исключением монитора так как не знаю как делать много-задачность. если научюсь делать много-задачность - сделаю . ami с низу , кб сверху , редстоун сигнал ( сигнализация) выдается справа. приватное сообшение пишется нарушителю и админам . единственный недостаток - долго запрашивает время , изза этого игрока система может его отправить на спавн через ~10 - 30 сек. http://pastebin.com/PrEGry27 . Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 26 января, 2015 Подсказка: длину таблицы не обязательно хранить в самой таблице. Ее можно получить так for i=1,#Admins do sayMsg("Warning! " .. Admins[i].. ", in bank offenders!",Admins[i]) end Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kremnev8 12 Опубликовано: 26 января, 2015 Подсказка: длину таблицы не обязательно хранить в самой таблице. Ее можно получить так for i=1,#Admins do sayMsg("Warning! " .. Admins[i].. ", in bank offenders!",Admins[i]) end Почти ! Я когда писал помнил что так можно , но еше поставил шаг и была ошибка. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex Автор темы 4 683 Опубликовано: 27 января, 2015 Пока реализован только первый пункт , за исключением монитора так как не знаю как делать много-задачность. если научюсь делать много-задачность - сделаю . единственный недостаток - долго запрашивает время , изза этого игрока система может его отправить на спавн через ~10 - 30 сек. getWorldTime нужно запустить в параллели. .... parallel.waitForAny(f1, f2, getWorldTime) где f1, f2 - Ваши фунции. Тогда current_time будет доступен в любой момент времени, а уточнятся на сайте мирового времени эта переменная будет раз минуту в фоновом режиме. Точности большей не нужно. Другой вариант многопоточности ТУТ Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
1Ridav 1 049 Опубликовано: 27 января, 2015 getWorldTime нужно запустить в параллели. .... parallel.waitForAny(f1, f2, getWorldTime) где f1, f2 - Ваши фунции. Тогда current_time будет доступен в любой момент времени, а уточнятся на сайте мирового времени эта переменная будет раз минуту в фоновом режиме. Точности большей не нужно. Другой вариант многопоточности ТУТ Гораздо более эффективный способ иметь точное время при минимальной нагрузке - получить время мировое один раз, а затем к нему прибавлять время из игры. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex Автор темы 4 683 Опубликовано: 27 января, 2015 Гораздо более эффективный способ иметь точное время при минимальной нагрузке - получить время мировое один раз, а затем к нему прибавлять время из игры. У меня была когда-то такая мысль, но я ее отринул. Там и время и день недели есть, и любой часовой пояс, а самое главное ДАТА!!! Как ее пересчитывать в игре, просто прибавлять по секундочке. Откуда мы знаем високосный год это или нет, на какие даты перескакивать и сколько разница в секундах минутах часах и днях между датами и прочее. Один гетзапрос в минуту для логирования событий в игре это меньше операций имхо, чем молотить цикл ежесекундный и суммировать время. Для часиков Фингера я бы так и сделал, там не критично, что они там показывают. А если не выводить секунды, программка его бы была на 20 строчек и делала 2 операции в минуту - запрос и принтинг. И вообще не понимаю, когда уже разрабы наконец уже сделают в своих модах ОС и КК получения системного времени серверной машины, а не только Майнкрафт времени. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 27 января, 2015 Для часиков Фингера я бы так и сделал, там не критично, что они там показывают. А если не выводить секунды, программка его бы была на 20 строчек и делала 2 операции в минуту - запрос и принтинг. А я так и сделал =) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Syabro 81 Опубликовано: 23 февраля, 2015 Вопрос: на OC AMI стабильно работает? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 23 февраля, 2015 Вопрос: на OC AMI стабильно работает? Сказать точно не могу, но функция установки времени и блока работают безотказно 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Syabro 81 Опубликовано: 23 февраля, 2015 На OC смогу написать, не со 100% гарантией, но 70-80% что смогу А если напишу то скорее всего в виде API и пример кода по использованию приведу Один гетзапрос в минуту для логирования событий в игре это меньше операций имхо, чем молотить цикл ежесекундный и суммировать время. А не прще получать врема с сервера непосредственно при нарушении т.е. при потребности в этом? Если конечно логирование только для одного события... Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex Автор темы 4 683 Опубликовано: 23 февраля, 2015 А не прще получать врема с сервера непосредственно при нарушении т.е. при потребности в этом? Если конечно логирование только для одного события... Нет, не проще. Гет запрос выполняется от 2 до 20 сек на сайте time.org или где там, не помню уже. А нам надо мгновенно отправить нарушителя и записать время(которое всегда под рукой, более менее точное, до минуты). Не заморачивайся на этом. В мультиплеере, полном гриферов, нарушителей и построителей лагомашин и лагозаводов это не главное. Например, что делать, если игрок улетел на спавн, а потом через 3 минуты использовал /back ??? И вот он уже в Васю херячит в банке из лазера. Что делать, когда через заприваченый блок пробиваются буром на миллисекунду и отключают врапмодем в привате? Что делать, когда КК после рестарта не запустился в автостартапе (редко, но бывает) ОС корректно не работает со всей периферией immibis. Как обеспечить защиту ПК в привате нормально от стопинга? Как организовать безопасною передачу по вай-фай в КК. КК, кстати, умирают при атаке на их открытый радиоканал сообщений в бесконечном цикле без задержки (отправитель стопается с лонг елдингом при 256 отправленных сообщений без слипа, но и жертва, которая в пулливенте на прослушке, тоже вылетает из программы) Не приватятся некоторые блоки из модов. Как следить за опасными предметами в инвентаре у игроков. Как обеспечить работу Звездных врат между мирами, если нет привата в целевом мире? И т.д. и т.п. Вот где только 10% корня зла в баганутом майнкрафте! Так что получать время раз в минуту или раз в 30 сек., это не имеет никакого значения, не думай об этом. Думай масштабнее!!! Как говорил в романе М. Булгакова "Мастер и Маргарита" профессор Стравинский перепуганному Ивану Бездомному: "Постарайтесь описать все события на Патриарших, которые случились с Берлиозом и как он погиб, и поменьше думайте о Понтии Пилате" Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Syabro 81 Опубликовано: 23 февраля, 2015 А может использовать плагин MCLuaBukkit? Этот плагин выполняет скрипты на Lua со всем апи плагинов сервера Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Syabro 81 Опубликовано: 23 февраля, 2015 (изменено) Ну ладно... Это просто мысли в пост... А теперь по теме! Можно ведь пока только для банка сделаь! И то что запрос идет 2 - 20 сек. не мешает моментальной телепортации Васи на спавн... Можно отправить Васю и потом зпнятся записью в логи... Боюсь петя несколько раз пересрет и уронит все золото если в нем появится Вася а потом со звуком сирены исчезнет... Изменено 23 февраля, 2015 пользователем Syabro Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex Автор темы 4 683 Опубликовано: 23 февраля, 2015 Ну ладно... Это просто мысли в пост... А теперь по теме! Можно ведь пока только для банка сделаь! И то что запрос идет 2 - 20 сек. не мешает моментальной телепортации Васи на спавн... Можно отправить Васю и потом зпнятся записью в логи... Боюсь петя несколько раз пересрет и уронит все золото если в нем появится Вася а потом со звуком сирены исчезнет... Не выдумывай велосипед. Все равно же программа будет висеть, пока получит время, если не делать буферизацию и обработчик буфера. Не забывай, что за пару секунд может несколько игроков залогиниться. Тут буфер ивентов по-любому нужен, а ты предлагаешь время еще получать несколько секунд, а то и более с американского континента. Чем тебя не устраивает время, которое есть всегда Космической точности не нужно, тем более о какой точности до секунды может идти речь, если его нельзя получить мгновенно, а? Лучше код пиши. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Syabro 81 Опубликовано: 23 февраля, 2015 Ну тогда напишу ф-цию которая сохранит в файл нарушителя... Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kremnev8 12 Опубликовано: 23 февраля, 2015 Не выдумывай велосипед. Все равно же программа будет висеть, пока получит время, если не делать буферизацию и обработчик буфера. Не забывай, что за пару секунд может несколько игроков залогиниться. Тут буфер ивентов по-любому нужен, а ты предлагаешь время еще получать несколько секунд, а то и более с американского континента. Чем тебя не устраивает время, которое есть всегда Космической точности не нужно, тем более о какой точности до секунды может идти речь, если его нельзя получить мгновенно, а? Лучше код пиши. Вобше в принципе у меня процентов на 70% готовый код под СС , его только чуть надо переписать на "thread" от зеро и будет полный 1 пункт. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Syabro 81 Опубликовано: 23 февраля, 2015 Только это на OC Первый пункт это событие "player_login"? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах