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

Программа "Полицейский"

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

Программа "Полицейский"

 

 

 

sUPc3wY.png

 

 

 

Описание программы:

 

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

 

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

 

Согласно механике Майнкрафт, Вася при логине оказывается в той же точке, в которой был последний раз! Он начинает мешать Пете, выхватывает ресы, крутится, тыкается  в комп мордочкой, а при наличии лазера еще и Петю, чего, доброго, и прихлопнуть может. Лазер не отлавливается запреткой на ПвП в админ привате, например. Чтобы его не запрещать на использование и прочее, и нужна такая программа, ну а также, чтобы не было такого анал-карнавала в банке, да и не только в  банке, а везде, где предусмотрены торговля и обмен и уединение игрока в какой-то комнате.

 

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

 

Что должна делать программа:

 

1. Событие, которое отлавливает AMI блок  "player_login"

 

  • При логине в игру на определенные коры (запрет зона, например, х=100:150 z=3200:3300) данный игрок отТП-шивается на спавн (коры спавна), на игрока заводится отдельный одноименный файл(если его нет) в папочке "Нарушители", в который заноситься(добавляется) количество нарушений(общее число) Ругать за это сильно не будем, но для статистики нужно. :)
  • В файл же общего лога в корне программы добавляем это событие (, , )
  • на экранчик можно выводить ТОП-10 нарушителей например. То есть раз в 15 минут в фоне считывать все файлы и выводить 10 самых опасных преступников на экран :)
  • при нарушении вызвать функцию  typeОffense(user_name, type_offense), ее оставить пустой, это для штрафа, я в нее добавлю небольшой штраф за нарушение - снятие денег с банковского счета по гет-запросу к базе SQL
  • админам, если они есть, принтится в личку или на почту сообщение о нарушении по игроку
  • срабатывает сигналка в точке установки системы (спавн, банк, казино и прочее)
  • нарушителю в личку или почту отправляется уведомление о штрафе и причине.

2. Событие, которое отлавливает радар(или любой детектор инвентаря)   id=4150:(1-26) Лазер. Это параллельный поток, он не зависимо от события логина, постоянно сканирует игроков в радиусе на предмет запретки в инвентаре и просто их не пускает в зону, отфутболивая игроков-нарушителей с нее.

  • при наличии у игрока списка запрещенных предметов в инвентаре (оружие, наркотики, уран и.т.п. B-) ) игрок с запретной зоны(где нельзя иметь подобны вещи) отТП-шивается куда-нибудь, не важно, в какую-то нейтральную зону например, или вообще в тюрягу :D
  • цепочка дальнейших событий та же, лог, сообщения, аларм и предупреждение, штраф.

 

 

Состав установки:

 

Установочка размещается где нибудь в бункере под спавном или банком или казино, не важно. 

 

ПК (любой) АМИ (радар), ком. блок. экранчик(любой), система аларма (звуко-свето сигналка возле установки + сенд месседжа в личку Админам при их онлайне или на игровую почту)

 

Награда: орден "Помощник Администрации", квантовая панель 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

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


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

А почему бы просто не сделать зону запрещенную для логина? Иными словами, если Вася зашел в закрытую комнату, отлогинился и пытается снова залогиниться, его должно выкинуть из комнаты. При помощи AMI это будет программка в пять строчек:

1. Ждем событие player_login

2. Контролируем координаты залогинившегося игрока

3. Если игрок в комнате, переносим его за пределы комнаты

Таким образом, Петя, закрывшийся в комнате, будет в полной безопасности.

А на выходе из комнаты его уже будет поджидать Вася

  • Like 1

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


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

А почему бы просто не сделать зону запрещенную для логина? Иными словами, если Вася зашел в закрытую комнату, отлогинился и пытается снова залогиниться, его должно выкинуть из комнаты. При помощи AMI это будет программка в пять строчек:

1. Ждем событие player_login

2. Контролируем координаты залогинившегося игрока

3. Если игрок в комнате, переносим его за пределы комнаты

Таким образом, Петя, закрывшийся в комнате, будет в полной безопасности.

А на выходе из комнаты его уже будет поджидать Вася

 

Именно это я и написал. Разве нет?) Каждое событие логина отлавливается персонально и если игрок при логине находится на запретке, он мгновенно отфутболивается на спавн. И именно это сделать на АМИ.  А Петя, закончив торговлю, из закрытой комнатки хомается или варпается, куда ему удобно, а может открыть комнатку и пешочком выйти из банка. По истечению  таймера банк сам откроет комнатку для следующих посетителей, если она не было открыта принудительно изнутри.

 

Но программа не просто футболит с запретки вновь залогинившихся, она это документирует и штрафует, алармит, оповещает, сканирует оружие в инвентаре и прочее. Это настоящий "Полицейский"

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


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

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

Пока реализован только первый пункт , за исключением монитора так как не знаю как делать много-задачность. если научюсь делать много-задачность - сделаю .

ami с низу , кб сверху , редстоун сигнал ( сигнализация) выдается справа.

приватное сообшение пишется нарушителю и админам .

единственный недостаток - долго запрашивает время , изза этого игрока система может его отправить на спавн через ~10 - 30 сек.

http://pastebin.com/PrEGry27 .

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


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

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

for i=1,#Admins do
sayMsg("Warning! " .. Admins[i].. ", in bank offenders!",Admins[i])
end

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


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

for i=1,#Admins do
sayMsg("Warning! " .. Admins[i].. ", in bank offenders!",Admins[i])
end

Почти ! Я когда писал помнил что так можно , но еше поставил шаг и была ошибка.

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


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

Пока реализован только первый пункт , за исключением монитора так как не знаю как делать много-задачность. если научюсь делать много-задачность - сделаю .

единственный недостаток - долго запрашивает время , изза этого игрока система может его отправить на спавн через ~10 - 30 сек.

 

getWorldTime  нужно запустить в параллели.

....
parallel.waitForAny(f1, f2, getWorldTime) 

где f1, f2 - Ваши фунции.

 

Тогда current_time  будет доступен в любой момент времени, а уточнятся на сайте мирового времени эта переменная будет раз минуту в фоновом режиме. Точности большей не нужно.

 

Другой вариант многопоточности ТУТ

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


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

getWorldTime  нужно запустить в параллели.

....
parallel.waitForAny(f1, f2, getWorldTime) 

где f1, f2 - Ваши фунции.

 

Тогда current_time  будет доступен в любой момент времени, а уточнятся на сайте мирового времени эта переменная будет раз минуту в фоновом режиме. Точности большей не нужно.

 

Другой вариант многопоточности ТУТ

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

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


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

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

 

У меня была когда-то такая мысль, но я ее отринул. Там и время и день недели есть, и любой часовой пояс, а самое главное ДАТА!!! Как ее пересчитывать в игре, просто прибавлять по секундочке. Откуда мы знаем високосный год это или нет, на какие даты перескакивать и сколько разница в секундах минутах часах и днях между датами и прочее.

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

 

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

А если не выводить секунды, программка его бы была на 20 строчек и делала 2 операции в минуту - запрос и принтинг.

 

И вообще не понимаю, когда уже разрабы наконец уже сделают в своих модах ОС и КК получения системного времени серверной машины, а не только Майнкрафт времени.

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


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

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

А если не выводить секунды, программка его бы была на 20 строчек и делала 2 операции в минуту - запрос и принтинг.

А я так и сделал =)

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


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

Вопрос: на OC AMI стабильно работает?

Сказать точно не могу, но функция установки времени и блока работают безотказно :)

  • Like 1

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


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

На OC смогу написать, не со 100% гарантией, но 70-80% что смогу :)

А если напишу то скорее всего в виде API и пример кода по использованию приведу

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

А не прще получать врема с сервера непосредственно при нарушении т.е. при потребности в этом? Если конечно логирование только для одного события...

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


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

А не прще получать врема с сервера непосредственно при нарушении т.е. при потребности в этом? Если конечно логирование только для одного события...

 

Нет, не проще. Гет запрос выполняется от 2 до 20 сек на сайте time.org или где там, не помню уже. А нам надо мгновенно отправить нарушителя и записать время(которое всегда под рукой, более менее точное, до минуты). Не заморачивайся на этом. В мультиплеере, полном гриферов, нарушителей и построителей лагомашин и лагозаводов это не главное. 

 

Например, что делать, если игрок улетел на спавн, а потом через 3 минуты использовал /back ;) ??? И вот он уже в Васю херячит в банке из лазера. Что делать, когда через заприваченый блок пробиваются буром на миллисекунду и отключают врапмодем в привате? Что делать, когда КК после рестарта не запустился в автостартапе (редко, но бывает) ОС корректно не работает со всей периферией immibis.

 

Как обеспечить защиту ПК в привате нормально от стопинга? Как организовать безопасною передачу по вай-фай в КК. КК, кстати, умирают при атаке на их открытый радиоканал сообщений в бесконечном цикле без задержки (отправитель стопается с лонг елдингом при 256 отправленных сообщений без слипа, но и жертва, которая в пулливенте на прослушке, тоже вылетает из программы)  Не приватятся некоторые блоки из модов.  Как следить за опасными предметами в инвентаре  у игроков.  Как обеспечить работу Звездных врат между мирами, если нет привата в целевом мире? И т.д. и т.п. Вот где только 10% корня зла в баганутом майнкрафте!  

 

Так что получать время раз в минуту или раз в 30 сек., это не имеет никакого значения, не думай об этом. Думай масштабнее!!!

 

Как говорил в романе М. Булгакова "Мастер и Маргарита" профессор Стравинский перепуганному Ивану Бездомному:  "Постарайтесь описать  все события на Патриарших, которые случились с Берлиозом и как он погиб, и поменьше думайте о Понтии Пилате" :)

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


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

А может использовать плагин MCLuaBukkit? Этот плагин выполняет скрипты на Lua со всем апи плагинов сервера

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


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

Ну ладно... Это просто мысли в пост... А теперь по теме! Можно ведь пока только для банка сделаь! И то что запрос идет 2 - 20 сек. не мешает моментальной телепортации Васи на спавн... Можно отправить Васю и потом зпнятся записью в логи...

Боюсь петя несколько раз пересрет и уронит все золото если в нем появится Вася а потом со звуком сирены исчезнет...

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

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


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

Ну ладно... Это просто мысли в пост... А теперь по теме! Можно ведь пока только для банка сделаь! И то что запрос идет 2 - 20 сек. не мешает моментальной телепортации Васи на спавн... Можно отправить Васю и потом зпнятся записью в логи...

Боюсь петя несколько раз пересрет и уронит все золото если в нем появится Вася а потом со звуком сирены исчезнет...

 

Не выдумывай велосипед.  Все равно же программа будет висеть, пока получит время, если не делать буферизацию и обработчик буфера. Не забывай, что за пару секунд может несколько игроков залогиниться. Тут буфер ивентов по-любому нужен, а ты предлагаешь время еще получать несколько секунд, а то и более с американского континента. Чем тебя не устраивает время, которое есть всегда :)  Космической точности не нужно, тем более о какой точности до секунды может идти речь, если его нельзя получить мгновенно, а?

 

Лучше код пиши.

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


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

Ну тогда напишу ф-цию которая сохранит в файл нарушителя...

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


Ссылка на сообщение
Поделиться на других сайтах
Не выдумывай велосипед.  Все равно же программа будет висеть, пока получит время, если не делать буферизацию и обработчик буфера. Не забывай, что за пару секунд может несколько игроков залогиниться. Тут буфер ивентов по-любому нужен, а ты предлагаешь время еще получать несколько секунд, а то и более с американского континента. Чем тебя не устраивает время, которое есть всегда :)  Космической точности не нужно, тем более о какой точности до секунды может идти речь, если его нельзя получить мгновенно, а?

 

Лучше код пиши.

Вобше в принципе у меня процентов на 70% готовый код под СС , его только чуть надо переписать на "thread" от зеро и будет полный 1 пункт.

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


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

Только это на OC

Первый пункт это событие "player_login"?

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


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

Только это на OCПервый пункт это событие "player_login"?

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

Изменено пользователем kremnev8
  • Like 1

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


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

Ну тогда и заморачиваться не буду :-ъ

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


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

А почему не сделать 10 кабинок? Поставить сканер, который будет смотреть кто, когда, и куда вошёл или вышел. Например, Петя приходит в банк, занимает одну кабинку и разлогинивается. Потом приходит Вася и видит: "В кабинке №3 уснул Петя...". Исходя из этого он решает пойти в другую кабинку.
Если Петя будет часто спать в кабинке, то его больше в банк не пустят =) Пусть ходит к банкомату, на территории которого разрешён pvp. 

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

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


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

А почему не сделать 10 кабинок? ...

Это тема для программы Полицейский, а не сколько кабинок в банке :)  Хоть их там 100 штук будет, где гарантия что если Вася вчера вышел из игры, находясь в кабинке, сегодня опять заходит в игру, попадает в эту  же кабинку при логине, и в этой кабинке нет Пети, радостно торгующего с банком. 

Зачем вилять туда сюда, если стоит четкая задача отловить логин на координатах запретки и отфутболить  Васю на спавн.

 

А тикалку на комблоке я сам поставлю, которая в радиусе банка чистит оружие у всех игроков раз в 5 сек. Например: /ci @a[r=30]  4320  - данная команда у всех игроков в радиусе 30 блоков удалит из инвентаря или из рук предметы с id 4320:*, например это будет лазер. Вот и все. Пришел в банк с оружием-конфисковали сразу. Не выдумывайте велосипед.

 

Банк для каждого игрока персональный строить не буду. Там куча своих подводных камней (промежуточные сервера, кассиры и выдавальщики, общий главный сервер+ синхронизация с веб, а это большая и сложная система протоколов передачи данных, за которой нужен уход и контроль) 

 

Нужно сейчас 3 вещи:  конвертнуть банк на ОС, написать полицейского и придумать цены, чтобы потом не было вайна, почему так все дорого, когда поставлю на сонариум и иридий 10 лярдов цену. Я то долго думать не буду над ценами :D  Скупка по минимуму, продажа по максимуму, раз цен нет. B-)

 

Лично мне банк не нужен, что мне надо в игре, я могу и из креативки украсть=)

 

А вот /back в основном мире, точнее в основной мир из любых миров, придется запрещать скорее всего. Да и вообще это ВИП команда, по большому счету, на всех паблик серверах.

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


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

Это тема для программы Полицейский, а не сколько кабинок в банке :)  Хоть их там 100 штук будет, где гарантия что если Вася вчера вышел из игры, находясь в кабинке, сегодня опять заходит в игру, попадает в эту  же кабинку при логине, и в этой кабинке нет Пети, радостно торгующего с банком. 

Зачем вилять туда сюда, если стоит четкая задача отловить логин на координатах запретки и отфутболить  Васю на спавн.

 

А тикалку на комблоке я сам поставлю, которая в радиусе банка чистит оружие у всех игроков раз в 5 сек. Например: /ci @a[r=30]  4320  - данная команда у всех игроков в радиусе 30 блоков удалит из инвентаря или из рук предметы с id 4320:*, например это будет лазер. Вот и все. Пришел в банк с оружием-конфисковали сразу. Не выдумывайте велосипед.

 

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

 

Нужно сейчас 3 вещи:  конвертнуть банк на ОС, написать полицейского и придумать цены, чтобы потом не было вайна, почему так все дорого, когда поставлю на сонариум и иридий 10 лярдов цену. Я то долго думать не буду над ценами :D  Скупка по минимуму, продажа по максимуму, раз цен нет. B-)

 

Лично мне банк не нужен, что мне надо в игре, я могу и из креативки украсть=)

 

А вот /back в основном мире придется запрещать скорее всего. Да и вообще это ВИП команда, по большому счету, на всех паблик серверах.

им уже почти нечго писать , я уже давно все это сделал на СС . им осталось это портнуть это на ОС.

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


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

Ждать больше некогда. Накидал вчера за полчаса код Полицейского

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

 

Запретная зона для логина (прямоугольная область, охватывающая по площади все 10 закрывающихся кабинок при входе игрока в интерфейс терминалов банка, по высоте проверку не делал пока :D , можно и на крыше банка выйти из игры и зайти в игру и схлопотать штраф):

x1 = 1502
x2 = 1612
z1 = 1957
z2 = 1966


Так же программа накрывает невидимым куполом банк,  у всех игроков, которые носят при себе оружие (лазер и АЕ бластер), это оружие будет немедленно конфисковано из инвентаря. Пока в таблицу добавил только эти два предмета, которые мне известны, которые убивают в админпривате, в котором запрещен ПвП. Меч и топор можно носить с собой :D . А вот лазер и бластер настоятельно рекомендую выкладывать в эндер-сундучок перед банком.

OmmMwHm.png

 

o3HhvLB.png

jme32Ml.png

Внимание! Штраф снимается с вашего основного банковского счета и равен $ 1000, что ~ составляет 10 кусочков угля по цене.

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


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

А что делают злобные роботы, которые бегают по спауну?

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


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

А что делают злобные роботы, которые бегают по спауну?

 

Это я дурил))) Вообще они предназначены радовать и веселить, и как-то заинтересовать игроков, только что прибывших на сервер, ну и оживить спавн компьютерного ИТ сервера. Пока стражники Алекса бестолково носятся по спавну, мигают, как хамелеоны и стригут его от растущих сорняков на стенах.

 

Позже потом им ИИ какой-то простенький и более толковую логику движения прикручу, пусть даже иногда из пуза иридий кидают с вероятностью 0.001%, например, в каждом такте действия, чтобы игроки носились за ними по спавну и радовались, что робот метнул в них кусочком иридия (или какахой крипера и кактусом :D ) Вдруг новому игроку повезет и в тот момент, как только он зашел в игру первый раз, робот что-то кинет. Я бы очень радовался, например, такой случайности, если бы мне на башку выпала нанка))))) Редкий случай, но ничто так не радует, как редкая удача, особенно зная, какова мала ее вероятность.

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


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

 

 

При логине игрок попадет в кабину на одну миллионную долю секунды, но сразу же  будет отТПшен на спавн со снятием штрафа. 

А если я находился в кабине в момент рестарта сервера или меня по другим причинам из игры выкинуло, получается при заходе меня оштрафуют?

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


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

А если я находился в кабине в момент рестарта сервера или меня по другим причинам из игры выкинуло, получается при заходе меня оштрафуют?

 

Да, этого никак не избежать. Я думал над этим. Но нет никакого программного способа отследить, был ли это рестарт или игрока мама позвала кушать борщ, или свет отключили и комп вырубился у клиента, а потом он зашел :)  Для безопасности это необходимо.

 

Ну и в чате сервер предупреждает игрока о рестарте за 5 мин и за 1 мин. Всегда можно разлогинится и выйти в холл банка на момент рестарта. 

 

Но зато я всегда знаю, что если я залогинился в терминале и кабина захлопнулась, я в безопасности и никакая морда не прилетит ко мне и не будет мешать. На ПК она не нажмет ничего, так как комп переходит только на тач-ивенты залогиневшегося, но например кассиру кидать предметы будет не с руки, если возле Вас кто-то еще бегает, так ведь? А еще и лазером пуляет :D

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


Ссылка на сообщение
Поделиться на других сайтах
Гость
Эта тема закрыта для публикации сообщений.

×