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

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

Способ 1: Каждый тик пробегаться по InventoryPlayer , сравнивая его содержимое с предварительно сохраненным:

  • Довольно просто реализовать: создаем IEEP/Капу для хранения содержимого в предыдущий тик, и подписываемся на PlayerTickEvent , в котором производим сравнение
  • Меня откровенно не радует идея делать цикл в тике каждого игрока, потому как считаю, что это негативно скажется на производительности. Я пока не могу подтвердить или опровергнуть это, но думаю что много ненужных действий всегда ведут к понижению перфоманса. У игрока в инвентаре 40 слотов и при онлайне в 100 игроков в один тик нужно будет делать 4000 итераций. Т.е. 80000 итераций в секунду, даже в инвентаре нет изменений. Не нравится мне эта цифра. Кроме того — такой цикл в игре уже есть (см Container#detectAndSendChanges() ).
  • Если во время одного тика в слоте поменяется несколько предметов (т.е., сначала в слот положили :mc_20-0:, потом :mc_63-0:, а потом :mc_37-0, евент будет содержать информацию только о последнем из изменений. Все аки
  • Еще проще реализовать, чем способ 1. Даже предыдущий инвентарь хранить не нужно, т.к. аргументы метода ICrafting#sendSlotContents(Container, int, ItemStack) уже содержат всю нужную инфу
  • В отличии от способа 1 мы будем использовать уже существующий в игре цикл, детектирующий изменения инвентаря
  • Все еще остается проблема многократного изменения слота за один тик, описанная в способе 1
  • На момент вызова ICrafting#sendSlotContents(Container, int, ItemStack) изменения инвентаря уже вступили в силу. А ведь может возникнуть потребность выполнять операции ДО фактического изменения инвентаря. Решением это проблемы может быть хук всего метода Container#detectAndSendChanges() , но хуковать весь метод — плохой тон, т.к. кто-то другой может сделать так же и сломать все к чертям.
  • Срабатывает точно в момент изменения инвентаря
  • Размер билда возрастет из-за необходимости тянуть хуклибу. Ну или придется разбирать ASM.
  • Методы из InventoryPlayer не будут вызываться на сервере при установке блоков, кормление животных, сборе жидкостей и при других юзаниях предметов. Так как при этих операциях ItemStack модифицируется без использования методов InventoryPlayer . Методы инвентаря вызовутся лишь на клиенте, после того как туда придет S2FPacketSetSlot .
  • При подключении клиента к игре, тот примет S30PacketWindowItems , из-за которого клиент будет вызывать InventoryPlayer#setInventorySlotContents() для каждого слота, превращая использование евента изменения инвентаря на клиенте в ад.
Читайте также:  Как сделать мини особняк в Майнкрафте

Способ 5: Хук в Container#slotClick() :

Как сэтать и смотреть в инвентарь в майнкрафте?

как смотреть чужой инвентарь игроков или донатеров


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

Помогите ж, форумчане.
Я уже почти на грани.
Кучу времени потратил
Но задачу — не решил.

Все мозги разбил на части.
Все извилины заплел.
А наилучшего решения
Я, покамесь, не нашел.

Последнее редактирование: 22 Май 2019

Мой проект: SawageWorldRP — ролки в Minecraft’е
Всех фатанов настольных рпг приглашаю присоединиться!
Человек — он как меч. Либо делает свое дело читает книги по java, либо тупой.

tox1cozZ

aka Agravaine

8,429 597 2,870
Решением это проблемы может быть хук всего метода Container#detectAndSendChanges()

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

ロロロ

3,005 192 592
Если хочешь в паблик, то все варианты с хук’ами, асм’ом — не подходят. Нужно будет подписывать мод.

😭

Использую ахеренные квадратики и горжусь этим! А ты дальше страдай с буквами

RareScrap написал(а):
чувак, смени уже ник с этих ущербных квадратиков​

RareScrap

1,158 38 541
подписывать мод
Можно подробнее. Что это за подписывание такое и зачем оно надо?

Мой проект: SawageWorldRP — ролки в Minecraft’е
Всех фатанов настольных рпг приглашаю присоединиться!
Человек — он как меч. Либо делает свое дело читает книги по java, либо тупой.

ロロロ

3,005 192 592
Поиск..
Мной же задавался тот же вопрос.

Читайте также:  Какая версия Майнкрафта на ps3

😭

Использую ахеренные квадратики и горжусь этим! А ты дальше страдай с буквами

RareScrap написал(а):
чувак, смени уже ник с этих ущербных квадратиков​

ロロロ

3,005 192 592

😭

Использую ахеренные квадратики и горжусь этим! А ты дальше страдай с буквами

RareScrap написал(а):
чувак, смени уже ник с этих ущербных квадратиков​

RareScrap

1,158 38 541

Новый вопрос в копилку вопросов: как поместить в контейнер свой ICrafting ? Нужно сделать это в момент открытия контейнера. Т.е. когда обновляется поле EntityPlayer#openContainer . На 1.12.2 уже все как у людей — есть подходящий эвент PlayerContainerEvent , который выбрасывается момент открытия/закрытия контейнера. На 1.7.10 есть лишь ущербный PlayerOpenContainerEvent , название которого не соответствует его назначению. Его вообще стоило переименовать в «CanInteractWithContainerEvent» или как-то так. Более того, этот эвент даже не содержит объект контейнера и вызывается КАЖДЫЙ тик игрока.

Мне что, пробегать по всему листу Container#crafters каждый тик проверяя не добавил ли я один ICrafting дважды?

Мой проект: SawageWorldRP — ролки в Minecraft’е
Всех фатанов настольных рпг приглашаю присоединиться!
Человек — он как меч. Либо делает свое дело читает книги по java, либо тупой.

tox1cozZ

aka Agravaine

8,429 597 2,870
Хукнись куда нужно да и все) В чем вообще проблемы, когда есть хуки? k_hand:

RareScrap

1,158 38 541
В чем вообще проблемы, когда есть хуки?

Да вот чот хз. Хочется мне найти способ без хука. Спортивный интерес, понимаш.

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

Мой проект: SawageWorldRP — ролки в Minecraft’е
Всех фатанов настольных рпг приглашаю присоединиться!
Человек — он как меч. Либо делает свое дело читает книги по java, либо тупой.

tox1cozZ

aka Agravaine

8,429 597 2,870

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

RareScrap

1,158 38 541

Таки получилось у меня сделать это без хуков. Хоть это не совсем применимо к общему использованию, для моей задачи этого вполне хватило.

Создаем вот такой вот трекер. Для удобство он одновременно реализует IEEP и ICrafting :

Трекер инвентаря игрока:

А потом вот так добавляем его игрокам и открытым контейнерам:
Последнее редактирование: 19 Сен 2019

Читайте также:  Ролики как пройти Майнкрафт

Мой проект: SawageWorldRP — ролки в Minecraft’е
Всех фатанов настольных рпг приглашаю присоединиться!
Человек — он как меч. Либо делает свое дело читает книги по java, либо тупой.

Источник: forum.mcmodding.ru

JustInvSee (шпионим за чужим инвентарем!)

Всем доброго времени суток, уважаемые пользователи сайта. Мы рады сообщить вам, что у нас на сайте появился такой интересный плагин, который позволит администрации своего сервера следить за читерами. А именно, вы сможете попасть в чужой инвентарь! И смотреть, сколько и чего он имеет. Вам нужно только прописать команду, ник игрока и всё.

Перед вами, будто сундук, откроется чужой инвентарь (игрока, чей ник вы вписали). На счёт того, можно ли брать у него вещи, или наоборот так подкидывать ему их, вам предстоит узнать самостоятельно. Не всё же вам рассказывать. Если у вас возникнут вопросы, то в ваших же интересах написать нам в комментарии. Всем удачи и приятной игры.

Не злоупотребляйте способностями плагина!

Команды :
/inv [Ник игрока] — Открыть инвентарь игрока
/enderinv [Ник игрока] — Просмотреть содержимое эндер-сундука игрока

  • Ultimate SkyBlock! (крутой Skyblock)
  • EchoPet (питомцы на сервере)
  • Armor Stand (стэнды-статуи)

Популярное

  • Java (Джава) 32 и 64 bit
  • Зомби апокалипсис (Zombie Apocalypse)
  • Майнкрафт с модами: сборки модов
  • Pixelmon (Покемоны в Майнкрафт)
  • Aether II (портал в Рай)

Случайный файл

yo-yo (GTA skin | ГТА)

Скин, который добавит внешность из игры

Источник: azminecraft.ru

Inventory HUD+ мод 1.17 / 1.16.5 / 1.12.2 (Просмотр инвентаря не открывая)

Inventory HUD+ мод 1.17 / 1.16.5 / 1.12.2 (Просмотр инвентаря не открывая)

Мод, который позволит видеть инвентарь, прочность брони и время активности зелий не нажимая E. Таким образом, это может помочь вам в ПВП и сэкономит время.

Inventory HUD+ мод 1.17 / 1.16.5 / 1.12.2

Данный мод часто включается в чит-клиенты, и это не забавы ради. Всё потому, что это может дать вам преимущество в PVP, так как вы всегда видите сколько прочности брони осталось, какие вещи есть в инвентаре и сколько ещё будут действовать эффекты.
Вся эта информация предоставит вам возможность придумывать тактику боя, опираясь на эти данные.

Демонстрация:

Inventory HUD+ мод 1.17 / 1.16.5 / 1.12.2 (Просмотр инвентаря не открывая)

Выше – настройки этого мода. В них вы сможете включить и отключить детали, а так же обозначить их расположение. Inventory HUD+ мод 1.17 / 1.16.5 / 1.12.2 (Просмотр инвентаря не открывая)Inventory HUD+ мод 1.17 / 1.16.5 / 1.12.2 (Просмотр инвентаря не открывая)

Установка:

Данный мод является fabric, именно поэтому вам нужно следовать этой инструкции при установке.

Источник: xn--80aa0aehirftcs.xn--p1ai