1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Как сделать режим что бы если моб не мог переагриться?

Тема в разделе "Разработка плагинов для новичков", создана пользователем ItsWay, 23 июн 2022.

  1. Автор темы
    ItsWay

    ItsWay Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    Пишу плагин для сервера, суть такова, он с помощи команды у определённого игрока спавнит голема(в случае моём он будет с другой текстурой и будет боссом роботов), и появился вопрос, я сделал так:

    Код:
                        Player plr = Bukkit.getPlayer(args[2].toString()); - получение игрока из команды
                        Location loc = plr.getLocation(); - получение кордионатов где игрок находиться
                        Creature spawnmob = (Creature) loc.getWorld().spawnEntity(loc, EntityType.IRON_GOLEM); - метод для спавна голема
                        spawnmob.setMaxHealth(600); - установка максимальной жизни у босса
                        spawnmob.setHealth(600); - установка жизней у босса
                        spawnmob.setTarget(plr) - и тут я ставлю на кого он будет агриться;
    но случается такое что он заагрился на игрока, бьёт его и бьёт, а появился какой то монстр, к примеру зомби, и голем переагрился, как сделать что бы он агрился только на игрока определённого и не случалось такого что он переагривается?
     
  2. mirrerror

    mirrerror Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    mirrerror
    Создать моба с кастомным PathfinderGoal или в таймере устанавливать ему таргет (лучше первое, но проще второе).
     
  3. Автор темы
    ItsWay

    ItsWay Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    а PathfinderGoal можешь накидать чуть с ним кода? Что б представлять, и каким образом он работает, тип что делает?
     
  4. OJIEKCAHDP

    OJIEKCAHDP Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
  5. Автор темы
    ItsWay

    ItsWay Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    Так у меня entity босс, кастомный моб, как я сделаю это у ентити кастомного?
     
  6. Автор темы
    ItsWay

    ItsWay Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    Или тип сравнивать с кастомным ентити, типо имя, количество жизней, силу удара через атрибуты?
     
  7. OJIEKCAHDP

    OJIEKCAHDP Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Вообще можно сравнивать так, вроди (проверь):


    Код:
    Creature custom = (Creature) event.getEntity();
    
    if (custom == your_custom_entity) {
    
    custom.setTarget(target);
    
    }
    Если нет, то использовать методы Metadatable
     
  8. Автор темы
    ItsWay

    ItsWay Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    Если подумать, custom.setTarget(target); просто не получишь определённого игрока, потому что он получается из команды через аргумент второй, значит мне надо получить игрока с помощью получения класса?
     
  9. OJIEKCAHDP

    OJIEKCAHDP Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Ну храни где-нибудь в хашмапе, где ключ это твой босс, а значение это игрок :nerd:
     
  10. Автор темы
    ItsWay

    ItsWay Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    Ненавижу хашмапу, трудная, как физика умноженная на алгебру..
     
  11. OJIEKCAHDP

    OJIEKCAHDP Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Проще простого:cool:
    Поучи, пригодится, да и в многих ситуациях спасает
     
  12. Автор темы
    ItsWay

    ItsWay Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    Впервые посмотрел урок по мапе, что то узнал, даже интересно стало, я думал по названию типо что хешмапа это значения с картой, хранения данных, а оказывается нет, ну и слава богу, ток как на основе бакитта с ней работать теперь незнаю.
     
  13. Автор темы
    ItsWay

    ItsWay Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    Ну а что мне это даст? Типо ну допустим когда спавнится босс игрока и босса записывает в мапу, а дальше что? Что мне делать позже?
     
  14. OJIEKCAHDP

    OJIEKCAHDP Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Получать игрока по боссу, чтобы заагарить этого босса на этого игрока, логично же
     
  15. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Ты можешь просто отменять событие "забывания" игрока при его удалении от босса (event.getTarget() == null).
    Но не забудь проверить причину потери цели, потому что игрок может, например, выйти с сервера, телепортироваться в другой мир или уйти на расстояние 10К блоков. Если моб продолжит быть нацеленным на игрока даже в такой ситуации - это может вызвать проблемы.

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

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

    О том, как получить цель босса, написали выше - можно действительно использовать HashMap. Но я бы рекомендовал использовать PersistentDataHolder, поскольку данные из него останутся актуальными даже после перезагрузки сервера. Более того, не будет необходимости очищать неактуальную информацию при смерти моба
     
  16. Автор темы
    ItsWay

    ItsWay Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    Босс это ключ, а игрок значение, но как помечать ключ "босса"? Я честно запутался, если будет к примеру несколько игроков драться с боссом, и эти несколько игроков будут в мапе с ключом к примеру "TheBoss" а значение ники игроков, то с каким именно работать игроком? Я запутался почему то.
     
  17. Автор темы
    ItsWay

    ItsWay Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    Интересно, я попробую. Ещё один вопрос, тоже связан с мапой, но уже с кастомными тнт, я через ItemStack добавляю в игру тнт допустим кастомный который с другим названием, имеет свой лор, и как через EntityExplodeEvent с делать так по мапе, что к примеру тнт тир 1 взрывается сильнее, тнт тир 2 взрывает обсидиан, в смысле того, как через мапу сравнивать с какими то требованиями тнт, и если требования подходят к определённым будет выполняться что надо, типо какие сравнения использовать(что сравнить)?
     
  18. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Ну, тут уже тебе решать, кого должен атаковать босс. Можешь в качестве значения хранить не одного игрока, а сразу список игроков. И дальше уже выбирать рандомного. Или со временем переключаться с одного на другого. Решай сам )
     
  19. Автор темы
    ItsWay

    ItsWay Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    Стало интересно насчёт проверки в ивенте EntityTargetEvent, вот сделал, как считаешь, правильно сделал?
    Код:
        @EventHandler
        public void onBossTarget(EntityTargetEvent event) {
            if(event.getEntityType() == EntityType.IRON_GOLEM) {
                if(event.getEntity().getCustomName() == "Босс Роботов") {
                    
                 if(event.getTarget() == null) {
                     if(event.getReason() == EntityTargetEvent.TargetReason.CLOSEST_PLAYER) {
                     event.setCancelled(true);
                     } else if(event.getReason() == EntityTargetEvent.TargetReason.CLOSEST_ENTITY) {
                        
                         event.setCancelled(true);
                     }else if(event.getReason() == EntityTargetEvent.TargetReason.TARGET_DIED) {
                         event.getEntity().remove();
                     } else if(event.getReason() == EntityTargetEvent.TargetReason.FORGOT_TARGET) {
                         if(event.getTarget().isDead()) {
                             event.getEntity().remove();
                         } else if(!(event.getReason() == EntityTargetEvent.TargetReason.UNKNOWN)) {
                             event.getEntity().remove();
                         }
                    
                     } else if(event.getReason() == EntityTargetEvent.TargetReason.RANDOM_TARGET) {
                         event.getEntity().remove();
                     } else if(event.getReason() == EntityTargetEvent.TargetReason.TARGET_ATTACKED_NEARBY_ENTITY) {
                         event.getEntity().remove();
                     }
                        
                 }
                
                    
                            
                }
            }
        }
     
  20. mirrerror

    mirrerror Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    mirrerror
    Пиши лучше !=
     

Поделиться этой страницей