Войти или зарегистрироваться

Помогите Как можно задать характеристику тнт для опознования

  • Автор темы Автор темы JayRoon
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

JayRoon

Участник
Заблокирован
Пользователь
Баллы
31
Имя в Minecraft
Krongss_FUR
Извините за странное название в шапке, не знаю как по другому написать, суть такая:
Хочу сделать разные виды динамита, к примеру один дефолтный, второй посильнее который больше блоков просто взорвёт, а третий довольно сильный, как я собираюсь добавлять новые виды, я создаю новые предметы через ItemStack, и выдаю игроку их, но, есть один нюанс, как сделать что бы именно такой новый динамит выполнял код специальный, то-есть его можно было отличить от обычного тнт.
Я начало думал через BlockExplodeEvent проверять, если взорвался тнт специальный выполнять код, то-есть отличать его по признакам, но по-сути это взрыв блока, а не сущности, как мы знаешь, Динамит - сущность(Entity), и надо юзать EntityExplodeEvent, но по каким данным у сущности сравнивать с обычным кастомным предметом который создан через ItemStack и ItemMeta? Я начало думал по MetaData, искал в интернете как её указывать, но не понял нечего про неё.. Буду рад если поможете.
 
Так как не понимаешь как это работает, у тебя могут возникнуть сложности.
Ниже опишу своё виденье того, как это можно реализовать, но в чём-то могу ошибиться.

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

При поджигании, спаунится тнт тоже не связанный с блоком.
По этому нужно отслеживать все варианты поджигания тнт (не само поджигание, а только то, как должно поджигаться, типа клик игрока (PlayerInteractEvent) огнивом по блоку), проверять локацию блока, которую сохранял при BlockPlaceEvent, удалять блок, спаунить подожженный тнт и куда-то сохранять uuid этого энтити.

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

Сложно? Могу предложить избавиться от части с поджиганием и сразу спаунить подожжённый при установке, так как способов поджечь не мало. Только придётся отменить BlockPlaceEvent, проверить и удалить предмет из инвентаря, заспаунить и сохранить подожженный тнт и его параметры и проверить их при взрыве.
 
Так как не понимаешь как это работает, у тебя могут возникнуть сложности.
Ниже опишу своё виденье того, как это можно реализовать, но в чём-то могу ошибиться.

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

При поджигании, спаунится тнт тоже не связанный с блоком.
По этому нужно отслеживать все варианты поджигания тнт (не само поджигание, а только то, как должно поджигаться, типа клик игрока (PlayerInteractEvent) огнивом по блоку), проверять локацию блока, которую сохранял при BlockPlaceEvent, удалять блок, спаунить подожженный тнт и куда-то сохранять uuid этого энтити.

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

Сложно? Могу предложить избавиться от части с поджиганием и сразу спаунить подожжённый при установке, так как способов поджечь не мало. Только придётся отменить BlockPlaceEvent, проверить и удалить предмет из инвентаря, заспаунить и сохранить подожженный тнт и его параметры и проверить их при взрыве.
0_0......
 
По первому пути, если сохранять в мапу location данные? Если можно, не уверен в этом. Если туда скинуть в одну точку 2 тнт? Локации разные будут?
 
Так как не понимаешь как это работает, у тебя могут возникнуть сложности.
Ниже опишу своё виденье того, как это можно реализовать, но в чём-то могу ошибиться.

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

При поджигании, спаунится тнт тоже не связанный с блоком.
По этому нужно отслеживать все варианты поджигания тнт (не само поджигание, а только то, как должно поджигаться, типа клик игрока (PlayerInteractEvent) огнивом по блоку), проверять локацию блока, которую сохранял при BlockPlaceEvent, удалять блок, спаунить подожженный тнт и куда-то сохранять uuid этого энтити.

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

Сложно? Могу предложить избавиться от части с поджиганием и сразу спаунить подожжённый при установке, так как способов поджечь не мало. Только придётся отменить BlockPlaceEvent, проверить и удалить предмет из инвентаря, заспаунить и сохранить подожженный тнт и его параметры и проверить их при взрыве.
Вообще не имею представления о uuid сущности что это такое, типо как у игроков ууид который имеет свой порядковый номер обозначения?
 
По первому пути, если сохранять в мапу location данные? Если можно, не уверен в этом. Если туда скинуть в одну точку 2 тнт? Локации разные будут?
У тебя технически не получится два одинаковых ключа (локации) хранить в хэшмапе, да и после поджигания, локацию нужно удалять и уже смотреть за энтити, а два блока в одну локацию не убрав другой не поставить.
Вообще не имею представления о uuid сущности что это такое, типо как у игроков ууид который имеет свой порядковый номер обозначения?
Получаешь тем же методом, что и у игрока (getUniqueId).
Уникальный id, то есть, не может быть двух одинаковых, нужны для опознавания кто есть кто. Конечно можешь в мапу пихать и сам энтити, но это не правильно, например после перезапуска, если будешь сохранять на диск данные, у обьектов твоих энтити будут доугие адреса в памяти, от чего их не опознает.
 
Последнее редактирование:
У тебя технически не получится два одинаковых ключа (локации) хранить в хэшмапе, да и после поджигания, локацию нужно удалять и уже смотреть за энтити, а два блока в одну локацию не убрав другой не поставить.

Получаешь тем же методом, что и у игрока (getUniqueId).
Уникальный id, то есть, не может быть двух одинаковых, нужны для опознавания кто есть кто. Конечно можешь в мапу пихать и сам энтити, но это не правильно, например после перезапуска, если будешь сохранять на диск данные, у обьектов твоих энтити будут доугие адреса в памяти, от чего их не опознает.
С uniqueId я разобрался вчера, на самом деле.. Спасибо большое! Я давно ломал голову как это волпатить, и первый ваш способ помог и всё сработало, на самом деле я очень рад :cool:
Но ещё один вопрос, каким образом я могу хотя бы какую то часть проверить, поджёг ли игрок его? Как я знаю, есть такие способы поджога:
- Поджёг от взрыва динамита соседнего
- Поджёг от редстоун сигнала
- Поджёг от лука или арбалета(арбалет не точнооо) с зачарованием "Воспламенение"
- Поджёг зажигалкой
- Поджёг от удара молнией по динамиту(не уверен что так может быть :nerd:)
- Поджёг от огня который распространился, к примеру от удара грозы зажглись деревья и пошло дальше до тнт
Пока это всё, больше не знаю, можно ли хотя бы что то из ник проверить, если да - то как?
 
Отслеживать ивенты, гугли, желательно на английском. Каждый случай за тебя гуглить не буду.
 
Отслеживать ивенты, гугли, желательно на английском. Каждый случай за тебя гуглить не буду.
Можно просто через ивент ExplosionPrimeEvent проверять, если сущность - взрывающийся динамит, то выполнять действие? или надо по другому проверять на поджиг?
 
Можно просто через ивент ExplosionPrimeEvent проверять, если сущность - взрывающийся динамит, то выполнять действие? или надо по другому проверять на поджиг?
Конечно, нужно проверять, что это зажженный динамит, но тебе же ещё и надо проверить твой ли это и его "тип" (ты же хочешь новые типы динамита), по этому ты и спаунишь и сохраняешь ююид и тип своего тнт , а при взрыве проверяешь.
 
Конечно, нужно проверять, что это зажженный динамит, но тебе же ещё и надо проверить твой ли это и его "тип" (ты же хочешь новые типы динамита), по этому ты и спаунишь и сохраняешь ююид и тип своего тнт , а при взрыве проверяешь.
Мм, я понял, надо начало найти ивенты которые соответствуют - активации от редстоуна, активации от выстрела с лука/арбалета, активации от молнии, активации от взрыва чего то, мда.. Долго и нудно, ладно, вопрос решили, спасибо большое.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх