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

Статус
Закрыто для дальнейших ответов.

pro100koder

Активный участник
Пользователь
Баллы
76
Нужно запретить игрокам наносить урон другим игрокам с помощью руки, инструментов, и т. д. Сразу говорю, что через EntityDamageEvent это сделать нельзя, т. к. у меня есть особая система наношения урона особыми способами, где урон идёт от игрока, которого ивент может заблочить. Через эффект зелья тоже не камильфо, когда у игроков в инвентаре от куда-то взялся эффект... Ну не камильфо это, хотя если других способов нет (а они по-любому есть), то можно наверное... Но не суть. Так как же мне запретить игрокам драться кулаками/инструментами/оружием, чтобы не блочить другие возможности игры? (тот самый особый урон.)
 
у меня есть особая система наношения урона особыми способами, где урон идёт от игрока, которого ивент может заблочить
Думаю, надо этот код редактировать, чтобы ловить ненужные удары и блочить.
 
Думаю, надо этот код редактировать, чтобы ловить ненужные удары и блочить.
Систему особого дамага? Ладно уж, так и быть, скину весь метод...
Код:
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 для других скриптов?
 
Что значит без ивента? Он вообще то и создан для отмены. Странный ты чувак.
Ты можешь заюзать некого нпс как дамагера, так ты сможешь определять игрок или пс.
 
Систему особого дамага? Ладно уж, так и быть, скину весь метод...
Код:
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 для других скриптов?
EntityDamageByEntityEvent?
 
Через этот метод наносится урон от игрока (некая имитация удара), мне понравилась идея наносить урон от npc... Только я вообще нифига не шарю в npc 🙂 Хотя, наверное, можно и без npc закостылить... Сделать дамаг от null, отдачу (если noknockback false) через setVelocity, юзать все параметры игрока, а если урон оказался смертельным - переловить это тут и назначить киллером damager-a. Только вот как киллером назначить damager-a - сейчас не совсем понятно... А хотя можно и не назначать, просто игроку все нужные очки присвоить, обходя убийство! PROFIT! А написал я это сюда, чтобы если я что-то не так продумал, вы мне об этом сказали... Я просто сейчас кое-чем другим занимаюсь, мою идею проверить пока не могу.
 
Если я правильно понял, то...

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

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

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

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