[1.7.10-1.12.2] Как правильно проверять, может ли игрок редактировать блок в мире

Версия Minecraft
1.7+
7,099
324
1,510
У мя есть блок, при пкм по которому открывается чисто клиентское гуи, в нем настраиваются параметры блока. И при закрытии гуи на сервер отправляется пакет о применении измененных настроек. Как на сервере правильно проверить, что игрок может редактировать эти настройки?
По идее, если игрок может сломать этот блок, то он может и изменять его настройки. А как проверить что игрок может сломать блок? Разные плагины и моды в мультиплеерных сборках могут ограничивать права игроков на редактирование мира.
Заранее спасибо.
 
Последнее редактирование:
7,099
324
1,510
Выяснил следующее: если выполнение Block#onBlockActivated прошло через проверку if(!world.isRemote), то это означает, что плагины привата разрешили пкм по блоку и можно запомнить этого игрока.
Вопрос теперь в том, какой идентификатор игрока лучше запоминать? Их на выбор 3
1578328089228.png
 
7,099
324
1,510
Очень не хочу делать явную интеграцию с защитными плагинами. Например, ванильная табличка обходится проверкой вроде той, что я сделал

Если ты не собираешь нигде сохранять этого игрока - entityId достаточно.
getPersistentID==getUniqueID, при этом меняется он только при чтении игрока из nbt, сомнительно, что игрок будет перепрочитан из нбт после того, как открыл гуи
entityId может быть установлен извне при помощи resetEntityId,setEntityId, что выглядит не очень надежно

Буду юзать getPersistentID
 
7,099
324
1,510
А uniqueID устанавливается только при первом заходе на сервер?
~~~
Посмотрел - nextEntityID только увеличивается, поэтому по идее нельзя хакнуть через использование одинакового entityId, если один игрок вышел, а другой сразу зашел
 
7,099
324
1,510
А чем GameProfile хорош для идентификации игрока?

В нбт не нужно записывать то, что не будет храниться больше одной игровой сессии и с большой вероятностью не будет храниться больше нескольких секунд
 
7,099
324
1,510
Посмотрел. Там рефлексией дергается bukkit. А если используется не bukkit, а sponge? А если вообще кастомный мод на приваты?
Поэтому не хочу делать явную интеграцию
Очень не хочу делать явную интеграцию с защитными плагинами

Табличка кст запоминает одного игрока, хм, может также сделать и проверять == вообще :unsure:
 
292
14
160
Я при пкм по блоку на сервере генерю UUID, который выполняет роль айди "сессии взаимодействия", кладу его в
HashMap<UUID, ImmutablePair<World, BlockPos>>, шлю UUID клиенту вместе с текущими настройками блока.
Затем сервер принимает от клиента пакет с изменёнными настройкам и UUID, по которому в мапе находится позиция изменяемого блока, и эти настройки применяются.
Это всё кажется мне очень костыльным и я уверен, что есть способ проще.
 
Последнее редактирование:
1,200
37
237
Возможно мне причудилось, но где-то в World был canModify или что-то в этом роде, может быть я в World Guard'е это нашел и забыл.

Из неправильных способов (на посмотреть) есть EventHelper.

Да и наконец, для модов был какой-то аддон для World Guard (если не он сам), который позволяет запрещать любой клик по определенным блокам, так что с этой стороны люди сами разберутся, думаю, достаточно и того, что ты нашел.

Как вариант, можно посмотреть столик для изготовления форм из тинкерса (если, конечно, дыру с дюпом залатали), но не совсем уверен в том, что это то, что тебе нужно.
 

Icosider

Kotliner
Администратор
3,603
99
664
Вы хотяб посмотрите что я кинул. Костыли какие то строите:cautious:
Дак фигня ж, баккит можно использовать напрямую без рефлексии. Только сами плагины так юзать не получится, а всякие Bukkit.getPlayer(uuid) и прочее, можно использовать. По поводу вопроса ТС. Лично я использовал несколько способов:
1. Проверка на расстояние от блока(не самый эффективный, скорей вообще бесполезный, но в некоторых случаях всё же спасает)
2. Записывать открывающего в тайл(не забываем, что игроков может быть несколько). Кстати, а ты табличку то не смотрел? Там вроде как тоже гуи без контейнера.
В случаи если есть контейнер, то там намного проще.
 
7,099
324
1,510
7,099
324
1,510
Должно работать, но я не тестил =/ Ну как бы по этой методике нечему там не работать. Эту штуку я для паблик-мода делал, и мой пр пока не приняли, поэтому решение не могу выложить
 
Сверху