Перейти к содержимому
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. Если игрок в комнате, переносим его за пределы комнаты

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

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

  • Нравится 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 стабильно работает?

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


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

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

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

  • Нравится 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"?

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


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

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