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

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

  • Автор темы Автор темы 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) - и тут я ставлю на кого он будет агриться;
но случается такое что он заагрился на игрока, бьёт его и бьёт, а появился какой то монстр, к примеру зомби, и голем переагрился, как сделать что бы он агрился только на игрока определённого и не случалось такого что он переагривается?
 
Пишу плагин для сервера, суть такова, он с помощи команды у определённого игрока спавнит голема(в случае моём он будет с другой текстурой и будет боссом роботов), и появился вопрос, я сделал так:

Код:
                    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) - и тут я ставлю на кого он будет агриться;
но случается такое что он заагрился на игрока, бьёт его и бьёт, а появился какой то монстр, к примеру зомби, и голем переагрился, как сделать что бы он агрился только на игрока определённого и не случалось такого что он переагривается?
Создать моба с кастомным PathfinderGoal или в таймере устанавливать ему таргет (лучше первое, но проще второе).
 
Создать моба с кастомным PathfinderGoal или в таймере устанавливать ему таргет (лучше первое, но проще второе).
а PathfinderGoal можешь накидать чуть с ним кода? Что б представлять, и каким образом он работает, тип что делает?
 
Или тип сравнивать с кастомным ентити, типо имя, количество жизней, силу удара через атрибуты?
 
Или тип сравнивать с кастомным ентити, типо имя, количество жизней, силу удара через атрибуты?
Вообще можно сравнивать так, вроди (проверь):


Код:
Creature custom = (Creature) event.getEntity();

if (custom == your_custom_entity) {

custom.setTarget(target);

}

Если нет, то использовать методы Metadatable
 
Вообще можно сравнивать так, вроди (проверь):


Код:
Creature custom = (Creature) event.getEntity();

if (custom == your_custom_entity) {

custom.setTarget(target);

}

Если нет, то использовать методы Metadatable
Если подумать, custom.setTarget(target); просто не получишь определённого игрока, потому что он получается из команды через аргумент второй, значит мне надо получить игрока с помощью получения класса?
 
Если подумать, custom.setTarget(target); просто не получишь определённого игрока, потому что он получается из команды через аргумент второй, значит мне надо получить игрока с помощью получения класса?
Ну храни где-нибудь в хашмапе, где ключ это твой босс, а значение это игрок :nerd:
 
Проще простого:cool:
Поучи, пригодится, да и в многих ситуациях спасает
Впервые посмотрел урок по мапе, что то узнал, даже интересно стало, я думал по названию типо что хешмапа это значения с картой, хранения данных, а оказывается нет, ну и слава богу, ток как на основе бакитта с ней работать теперь незнаю.
 
Ну храни где-нибудь в хашмапе, где ключ это твой босс, а значение это игрок :nerd:
Ну а что мне это даст? Типо ну допустим когда спавнится босс игрока и босса записывает в мапу, а дальше что? Что мне делать позже?
 
Ну а что мне это даст? Типо ну допустим когда спавнится босс игрока и босса записывает в мапу, а дальше что? Что мне делать позже?
Получать игрока по боссу, чтобы заагарить этого босса на этого игрока, логично же
 
Ты можешь просто отменять событие "забывания" игрока при его удалении от босса (event.getTarget() == null).
Но не забудь проверить причину потери цели, потому что игрок может, например, выйти с сервера, телепортироваться в другой мир или уйти на расстояние 10К блоков. Если моб продолжит быть нацеленным на игрока даже в такой ситуации - это может вызвать проблемы.

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

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

О том, как получить цель босса, написали выше - можно действительно использовать HashMap. Но я бы рекомендовал использовать PersistentDataHolder, поскольку данные из него останутся актуальными даже после перезагрузки сервера. Более того, не будет необходимости очищать неактуальную информацию при смерти моба
 
Босс это ключ, а игрок значение, но как помечать ключ "босса"? Я честно запутался, если будет к примеру несколько игроков драться с боссом, и эти несколько игроков будут в мапе с ключом к примеру "TheBoss" а значение ники игроков, то с каким именно работать игроком? Я запутался почему то.
 
Ты можешь просто отменять событие "забывания" игрока при его удалении от босса (event.getTarget() == null).
Но не забудь проверить причину потери цели, потому что игрок может, например, выйти с сервера, телепортироваться в другой мир или уйти на расстояние 10К блоков. Если моб продолжит быть нацеленным на игрока даже в такой ситуации - это может вызвать проблемы.

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

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

О том, как получить цель босса, написали выше - можно действительно использовать HashMap. Но я бы рекомендовал использовать PersistentDataHolder, поскольку данные из него останутся актуальными даже после перезагрузки сервера. Более того, не будет необходимости очищать неактуальную информацию при смерти моба
Интересно, я попробую. Ещё один вопрос, тоже связан с мапой, но уже с кастомными тнт, я через ItemStack добавляю в игру тнт допустим кастомный который с другим названием, имеет свой лор, и как через EntityExplodeEvent с делать так по мапе, что к примеру тнт тир 1 взрывается сильнее, тнт тир 2 взрывает обсидиан, в смысле того, как через мапу сравнивать с какими то требованиями тнт, и если требования подходят к определённым будет выполняться что надо, типо какие сравнения использовать(что сравнить)?
 
Босс это ключ, а игрок значение, но как помечать ключ "босса"? Я честно запутался, если будет к примеру несколько игроков драться с боссом, и эти несколько игроков будут в мапе с ключом к примеру "TheBoss" а значение ники игроков, то с каким именно работать игроком? Я запутался почему то.
Ну, тут уже тебе решать, кого должен атаковать босс. Можешь в качестве значения хранить не одного игрока, а сразу список игроков. И дальше уже выбирать рандомного. Или со временем переключаться с одного на другого. Решай сам )
 
Ты можешь просто отменять событие "забывания" игрока при его удалении от босса (event.getTarget() == null).
Но не забудь проверить причину потери цели, потому что игрок может, например, выйти с сервера, телепортироваться в другой мир или уйти на расстояние 10К блоков. Если моб продолжит быть нацеленным на игрока даже в такой ситуации - это может вызвать проблемы.

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

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

О том, как получить цель босса, написали выше - можно действительно использовать HashMap. Но я бы рекомендовал использовать PersistentDataHolder, поскольку данные из него останутся актуальными даже после перезагрузки сервера. Более того, не будет необходимости очищать неактуальную информацию при смерти моба
Стало интересно насчёт проверки в ивенте 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();
                 }
                    
             }
            
                
                        
            }
        }
    }
 
Назад
Верх