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

Помогите Запрет атаки без DamageEventa

Тема в разделе "Разработка плагинов для новичков", создана пользователем pro100koder, 19 сен 2018.

Статус темы:
Закрыта.
  1. Автор темы
    pro100koder

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

    Баллы:
    76
    Нужно запретить игрокам наносить урон другим игрокам с помощью руки, инструментов, и т. д. Сразу говорю, что через EntityDamageEvent это сделать нельзя, т. к. у меня есть особая система наношения урона особыми способами, где урон идёт от игрока, которого ивент может заблочить. Через эффект зелья тоже не камильфо, когда у игроков в инвентаре от куда-то взялся эффект... Ну не камильфо это, хотя если других способов нет (а они по-любому есть), то можно наверное... Но не суть. Так как же мне запретить игрокам драться кулаками/инструментами/оружием, чтобы не блочить другие возможности игры? (тот самый особый урон.)
     
  2. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Думаю, надо этот код редактировать, чтобы ловить ненужные удары и блочить.
     
  3. Автор темы
    pro100koder

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

    Баллы:
    76
    Систему особого дамага? Ладно уж, так и быть, скину весь метод...
    Код:
    public static void damage(Player target, double d, Player damager, boolean noknockback, String customMessage, boolean resetDamage){
            if(damager==null){target.damage(d);}
            else{target.damage(d, damager);}
            if(noknockback==true){
                target.setVelocity(new org.bukkit.util.Vector());
            }
            EntityDamageEvent damevent = target.getLastDamageCause();
            if(target.getHealth()-damevent.getFinalDamage()<=0){
                target.setGameMode(GameMode.SPECTATOR);
                target.setHealth(20);
                events.stealres(target,damager);
                regDeath(target,false);
                deathMessage(target,damager,customMessage);
            }
            if(resetDamage==true){
                target.setNoDamageTicks(0);
            }
        }
    Окей. И как же в EntityDamageEvent определять, был ли дамаг вызван этим методом, если мне нужно сохранять damager-a для других скриптов?
     
  4. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Что значит без ивента? Он вообще то и создан для отмены. Странный ты чувак.
    Ты можешь заюзать некого нпс как дамагера, так ты сможешь определять игрок или пс.
     
  5. hyndorik

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

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    EntityDamageByEntityEvent?
     
  6. Автор темы
    pro100koder

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

    Баллы:
    76
    Через этот метод наносится урон от игрока (некая имитация удара), мне понравилась идея наносить урон от npc... Только я вообще нифига не шарю в npc :) Хотя, наверное, можно и без npc закостылить... Сделать дамаг от null, отдачу (если noknockback false) через setVelocity, юзать все параметры игрока, а если урон оказался смертельным - переловить это тут и назначить киллером damager-a. Только вот как киллером назначить damager-a - сейчас не совсем понятно... А хотя можно и не назначать, просто игроку все нужные очки присвоить, обходя убийство! PROFIT! А написал я это сюда, чтобы если я что-то не так продумал, вы мне об этом сказали... Я просто сейчас кое-чем другим занимаюсь, мою идею проверить пока не могу.
     
  7. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Если я правильно понял, то...

    Человек наносит кастомный урон при помощи LivingEntity.damage(double damage, Entity damager).
    Естественно, у него возникает EntityDamageByEntityEvent.
    Внутри этого эвента ему нужно определить - вызвано событие кастомным уроном (который создавал он), либо же эвент вызван банальным ударом рукой/топором и т.д.
    По DamageCause определять не вариант - в обоих случаях он одинаков.

    Теперь, собственно, ответ.
    Лично я лет сто назад делал систему смены типа урона - cause. Кажется, это был кастомный метод LivingEntity.damage(...), который менял причину урона на НМСовский DamageCause.MAGE или что-то в таком духе.
    Надеюсь, в бакките появился адекватный способ это провернуть. Смотри доки.
    Если другого метода нет - земля пухом, и добро пожаловать в майнкрафт.
     
  8. Автор темы
    pro100koder

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

    Баллы:
    76
    Спасибо за ответ! Но только вот я уже сделал множество фиксов, что делает рукопашный бой не таким уж имбалансным.
     
Статус темы:
Закрыта.

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