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

  • Автор темы Автор темы 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);
                    }
                }
Если где скобки не закрыл, неправильно скопировал =). Ребят помогите понять почему не убавляется кастомное здоровье после перезахода
 
Может потому что ты только мапу записываешь, а само здоровье игроку не меняешь?
 
Конечно, а ты как думал?
Код:
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 сразу же игроку присваивается
 
Код:
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 сразу же игроку присваивается
Я или в глаза долблюсь, либо не понимаю, что ты именно хочешь, но мапа никакого отношения к здоровью игрока не имеет, если ты вручную из неё не вставишь хп игроку player.setHealth(int);
 
Я или в глаза долблюсь, либо не понимаю, что ты именно хочешь, но мапа никакого отношения к здоровью игрока не имеет, если ты вручную из неё не вставишь хп игроку player.setHealth(int);
второй вариант. Мне нужно не стандартное здоровье а кастомное. Уже решил проблему. Она была связана с возвратом обычного здоровья при заходе на сервер. Удалил и всё ок
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх