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

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

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

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

    slime_j Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    slime_j
    Привет. Делаю РПГ плагин и столкнулся с проблемой с кастомным здоровьем. Я его храню в конфиге и при рестарте всё сохраняется и работает четко. Но после обычного перезахода кастомное здоровье перестаёт убавляться. В чем может быть ошибка?
    Код в Main
    Код:
    public class Main extends JavaPlugin implements Listener{
        private static Main Main;
        public static World world;
        public Logger log = Bukkit.getLogger();
        public static HashMap<String, Integer> playermaxhealth = new HashMap<>();
        public static HashMap<String, Integer> playerhealth = new HashMap<>();
        
        @Override
        public void onEnable() {
            Main = this;
            CustomEnchants.register();
            Bukkit.getServer().getPluginManager().registerEvents(new Blocks(),  this);
            Bukkit.getServer().getPluginManager().registerEvents(new PlayerJoin(), this);
            Bukkit.getServer().getPluginManager().registerEvents(this, this);
            log.info("[RPG] Enabled!");
            getCommand("heal").setExecutor(new Commands(this));
            getCommand("sword").setExecutor(new Commands(this));
            getCommand("shovel").setExecutor(new Commands(this));
            /////// create config.yml
            this.saveDefaultConfig();
            restoreHealth();
            
            if(this.getConfig().contains("data")) {
                this.restoreHealth();
                this.getConfig().set("data", null);
                this.saveConfig();
            }
        }
        
        @EventHandler
        public void onJoin(PlayerJoinEvent event) {
            Player player = event.getPlayer();
             if(!player.hasPlayedBefore()) {
                    playermaxhealth.put(player.getName(), 20);
                    playerhealth.put(player.getName(), 20);
             }else {
                 playermaxhealth.put(player.getName(), 100);
    //             playerhealth.put(player.getName(), 100);
                
             }
        }
        @EventHandler
        public void onLeave(PlayerQuitEvent event) {
            saveHealth();
    //        playerhealth.remove(event.getPlayer().getName());
        }
        
        public void saveHealth() {
            for(Map.Entry<String, Integer> entry : playerhealth.entrySet()) {
                this.getConfig().set("data." + entry.getKey(), entry.getValue());
            }
            this.saveConfig();
        }
        
        public void restoreHealth() {
            this.getConfig().getConfigurationSection("data").getKeys(false).forEach(key ->{
                Integer content = (Integer) this.getConfig().get("data." + key);
                playerhealth.put(key, content);
            });
        }
        
        @EventHandler
        public void playerDamage(EntityDamageByEntityEvent event) {
            if((event.getDamager()) instanceof Monster) {
                if(event.getEntity() instanceof Player){
                    event.getEntity().sendMessage(event.getEntity().getName());
                    event.getEntity().sendMessage("" +playerhealth.get(event.getEntity().getName()));
                    int LastDamage = (int) event.getDamage();
                    ((Damageable) event.getEntity()).damage(0.001);
                    ((Damageable) event.getEntity()).setHealth(( 20* (playerhealth.get(event.getEntity().getName())) / (playermaxhealth.get(event.getEntity().
                    getName())) ));
    //                if(!(playerhealth.get(event.getEntity().getName())<=1)){
                        playerhealth.put(event.getEntity().getName(), playerhealth.get(event.getEntity().getName())-LastDamage);
                        if(playerhealth.get(event.getEntity().getName())<=0) {
                            ((Damageable) event.getEntity()).setHealth(0);
                        }
    //                }
                }
            }
        }
        
        @Override
        public void onDisable() {
            if(!playerhealth.isEmpty()) {
                saveHealth();
            }
        }
    
        public static Main getInstance() {
            return Main;
        }
    }
    Вот код в классе PlayerJoin
    Код:
    public class PlayerJoin implements Listener{
        public int alertId;
        private int health;
     @EventHandler
     public void onPlayerJoin(PlayerJoinEvent e) {
        
         Player player = e.getPlayer();
            health = (int) player.getHealth();
            Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getInstance(), () ->{
                if(!(player.getHealth()==health)) {
                    Main.playerhealth.put(player.getName(), (int) ( player.getHealth() * (Main.playermaxhealth.get(player.getName())) / 20));
                    health= (int) player.getHealth();
                }
            },0,1);
            alertId = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getInstance(), () ->{
                 player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent("§c❤" + Main.playerhealth.get(player.getName())
                 + "/" + Main.playermaxhealth.get(player.getName()) + "❤"));
             }, 0, 10);
     }
     
     @EventHandler
        public void onDamage(EntityDamageByEntityEvent e) throws Exception {
            if(e.getDamager() instanceof Player) {
                Player player = (Player) e.getDamager();
                if(player.getInventory().getItemInMainHand().getItemMeta()==null) {
                    return;
                }
                if(player.getInventory().getItemInMainHand().getItemMeta().getLore()==null) return;
    
                    double damage = (int) e.getDamage();
                    if(player.getInventory().getItemInMainHand().getItemMeta().getLore().contains(ChatColor.GRAY +
                            "Критический урон " + ChatColor.YELLOW+ "%35 "  + "§a✘")){
                        double a=Math.random()*(100-1)+1;
                        if(a<25) {
                            double krit = (damage*35)/100;
                            LivingEntity entity = (LivingEntity) e.getEntity();
                            entity.damage(krit);
                        }
                    }
    Если где скобки не закрыл, неправильно скопировал =). Ребят помогите понять почему не убавляется кастомное здоровье после перезахода
     
  2. OJIEKCAHDP

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Может потому что ты только мапу записываешь, а само здоровье игроку не меняешь?
     
  3. Автор темы
    slime_j

    slime_j Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    slime_j
    Меняю. Если бы не менял то после перезагрузки не менялось бы
     
  4. OJIEKCAHDP

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    ну так после перезагрузки restoreHealth(); стоит, а когда игрок входит только в мапу записываешь
     
  5. Автор темы
    slime_j

    slime_j Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    slime_j
    тоисть нужно при входе игрока просто брать кастомное здоровье из hashmap playerhealth?
     
  6. OJIEKCAHDP

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Конечно, а ты как думал?
     
  7. Автор темы
    slime_j

    slime_j Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    slime_j
    Код:
    alertId = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getInstance(), () ->{
                 player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent("§c❤" + Main.playerhealth.get(player.getName())
                 + "/" + Main.playermaxhealth.get(player.getName()) + "❤"));
             }, 0, 5);
    в PlayerJoin сразу же игроку присваивается
     
  8. OJIEKCAHDP

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Я или в глаза долблюсь, либо не понимаю, что ты именно хочешь, но мапа никакого отношения к здоровью игрока не имеет, если ты вручную из неё не вставишь хп игроку player.setHealth(int);
     
  9. Автор темы
    slime_j

    slime_j Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    slime_j
    второй вариант. Мне нужно не стандартное здоровье а кастомное. Уже решил проблему. Она была связана с возвратом обычного здоровья при заходе на сервер. Удалил и всё ок
     
Статус темы:
Закрыта.

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