MaxHealth

  • Автор темы Автор темы AxmeD
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

AxmeD

Старожил
Пользователь
Баллы
103
Меняю максимальное кол-во здоровья, но каждый раз, когда я перезахожу на сервер, у меня становится все равно 20/***. Пытался сохранять HP в какой-нибудь файл, а потом при заходе выдавать, но сохраняется при выходе с сервера тоже почему-то 20хп.

Java:
   @EventHandler
   public void onQuit(PlayerQuitEvent e)
   {
     Player p = e.getPlayer();
     this.getHealthList().set(p.getName(), p.getHealth());
     saveHealthList();
   }
 
Проверил. Не работает именно сохранение хп при выходе, если хп больше 20-ти. Если меньше, то работает. Если больше, то сохраняет 20.0
 
Еще инвентарь пустой. Это вроде как баги...
 
Может можно какой-то костыль сделать? Кроме ежесекундного запоминания хп всех игроков, естественно.
 
Может можно какой-то костыль сделать? Кроме ежесекундного запоминания хп всех игроков, естественно.
На чистом сервере тестил?
Просто во-первых, AuthMe, вроде как, при залогинивании, выставляет 20 очков здоровья по стандарту.
Во-вторых, когда ты выставляешь здоровье, количество сердец увеличивается?
 
Надо при PlayerJoinEvent, player.setMaxHealth прописывать. А то по умолчанию 20. Вот и не получается больше сделать.

я так реализовал
Java:
package me.derik;

import java.io.File;
import java.io.IOException;
import java.util.logging.Logger;

import org.bukkit.Bukkit;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin;



public class Main extends JavaPlugin implements Listener{
  
    Logger log = getLogger();
    File playerheal;
    YamlConfiguration users;
  
    @Override
    public void onEnable() {
        Bukkit.getPluginManager().registerEvents(this, this);
          playerheal = new File(getDataFolder() + File.separator + "playerheal.yml");
          users = YamlConfiguration.loadConfiguration(playerheal);
          if(!playerheal.exists()){
              users.options().copyDefaults(true);
            saveDefaultConfig();
            log.info("Creating config file...");
          }
        
    }
  
    
  
  
    @EventHandler
    public void onJoin(PlayerJoinEvent e){
        Player player = e.getPlayer();
        String plname = player.getName();
        int heal = users.getInt(plname);

         if(users.getString(plname) == null){
            // log.info("В первые");
            player.setMaxHealth(50);
            player.setHealth(50);
             users.set(plname, 50);
             try {
                users.save(playerheal);
            } catch (IOException e1) {
                e1.printStackTrace();
            }
         }
         else
         {
            player.setMaxHealth(50);
            player.setHealth(heal);
           // log.info("Уже был");
         }
        
    }
  
  
      @EventHandler
      public void onQuit(PlayerQuitEvent e)
      {
           Player player = e.getPlayer();
           String name = player.getName();
           double heal = player.getHealth();
           users.set(name, heal);
           try {
            users.save(playerheal);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
      }
  

  
    @Override
    public void onDisable() {

    }

}
 
На чистом сервере тестил?
Просто во-первых, AuthMe, вроде как, при залогинивании, выставляет 20 очков здоровья по стандарту.
Во-вторых, когда ты выставляешь здоровье, количество сердец увеличивается?
1)Да, на чистом.
2) Увеличивается, но я поставил мод рпг-интерфейс, поэтому у меня там просто полоска с цифрами :)
Надо при PlayerJoinEvent, player.setMaxHealth прописывать. А то по умолчанию 20. Вот и не получается больше сделать.

я так реализовал
Java:
package me.derik;

import java.io.File;
import java.io.IOException;
import java.util.logging.Logger;

import org.bukkit.Bukkit;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin;



public class Main extends JavaPlugin implements Listener{

    Logger log = getLogger();
    File playerheal;
    YamlConfiguration users;

    @Override
    public void onEnable() {
        Bukkit.getPluginManager().registerEvents(this, this);
          playerheal = new File(getDataFolder() + File.separator + "playerheal.yml");
          users = YamlConfiguration.loadConfiguration(playerheal);
          if(!playerheal.exists()){
              users.options().copyDefaults(true);
            saveDefaultConfig();
            log.info("Creating config file...");
          }
     
    }

 


    @EventHandler
    public void onJoin(PlayerJoinEvent e){
        Player player = e.getPlayer();
        String plname = player.getName();
        int heal = users.getInt(plname);

         if(users.getString(plname) == null){
            // log.info("В первые");
            player.setMaxHealth(50);
            player.setHealth(50);
             users.set(plname, 50);
             try {
                users.save(playerheal);
            } catch (IOException e1) {
                e1.printStackTrace();
            }
         }
         else
         {
            player.setMaxHealth(50);
            player.setHealth(heal);
           // log.info("Уже был");
         }
     
    }


      @EventHandler
      public void onQuit(PlayerQuitEvent e)
      {
           Player player = e.getPlayer();
           String name = player.getName();
           double heal = player.getHealth();
           users.set(name, heal);
           try {
            users.save(playerheal);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
      }



    @Override
    public void onDisable() {

    }

}
Спасибо, сейчас попробую.

UPD: Нифига не изменилось. По сути, у меня всё то же самое, просто при входе выдаю по-другому maxHealth.
Мне сейчас нужно решить как запомнить кол-во hp игрока, когда он выходит с сервера.
 
Последнее редактирование:
Мне сейчас нужно решить как запомнить кол-во hp игрока, когда он выходит с сервера.
Можно твой код полностью посмотреть? Не в сохранение тут дело, мне кажется. Меньше 20 сохраняет... Значит работает сохранение. Тут что то другое.
 
Последнее редактирование:
Можно твой код полностью посмотреть? Не в сохранение тут дело, мне кажется. Меньше 20 сохраняет... Значит работает сохранение. Тут что то другое.
Код:
@EventHandler
   public void setHpOnJoin(PlayerJoinEvent e)
   {
     Player p = e.getPlayer();
      double health = Stats.getPlayerStatsOfArmor(p, "Выносливость:");
      p.setMaxHealth((20 + health*3)* 1.0D);
      if(getHealthList().contains(p.getName()))
         p.setHealth(getHealthList().getDouble(p.getName()));
       else
         p.setHealth(p.getMaxHealth());
   }
  
   @SuppressWarnings("static-access")
   @EventHandler
   public void onQuit(PlayerQuitEvent e)//ne rabotaet
   {
     Player p = e.getPlayer();
     double health = p.getHealth();
     this.getHealthList().set(p.getName(), health);
     saveHealthList();
   }
Да нет, дело в сохранении. Попробовал вручную выставить там 56HP(максимальное 100), и когда зашёл, 56 и дало.
У меня будет много проблем, если я буду запоминать в какой-нибудь hashmap/конфиг кол-во здоровья каждого игрока при получении урона или регене на сервере при онлайне в 60-100 человек?
 
Код:
@EventHandler
   public void setHpOnJoin(PlayerJoinEvent e)
   {
     Player p = e.getPlayer();
      double health = Stats.getPlayerStatsOfArmor(p, "Выносливость:");
      p.setMaxHealth((20 + health*3)* 1.0D);
      if(getHealthList().contains(p.getName()))
         p.setHealth(getHealthList().getDouble(p.getName()));
       else
         p.setHealth(p.getMaxHealth());
   }
 
   @SuppressWarnings("static-access")
   @EventHandler
   public void onQuit(PlayerQuitEvent e)//ne rabotaet
   {
     Player p = e.getPlayer();
     double health = p.getHealth();
     this.getHealthList().set(p.getName(), health);
     saveHealthList();
   }
Да нет, дело в сохранении. Попробовал вручную выставить там 56HP(максимальное 100), и когда зашёл, 56 и дало.
У меня будет много проблем, если я буду запоминать в какой-нибудь hashmap/конфиг кол-во здоровья каждого игрока при получении урона или регене на сервере при онлайне в 60-100 человек?
С hashmap ничего не будет, а вот в конфиг сразу писать - плохая идея.
 
double health = Stats.getPlayerStatsOfArmor(p, "Выносливость:");

Поиздевался я над твоим кодом и вот что понял...
Этой строкой ты при входе присваеваеш игроку 20 хп. максимум при входе. Записывай и сохроняй куда хочеш потм хп игрока...)) При входе она тебе не даст больше 20 хп.
Вобщем у тебя Health получаеться больше чем MaxHealth.
 
Последнее редактирование:
Поиздевался я над твоим кодом и вот что понял...
Этой строкой ты при входе присваеваеш игроку 20 хп. максимум при входе. Записывай и сохроняй куда хочеш потм хп игрока...)) При входе она тебе не даст больше 20 хп.
Вобщем у тебя Health получаеться больше чем MaxHealth.
Я же говорю, всё работает, кроме "запоминалки". Если я вручную в конфиге напишу 50, а максимум будет 76, то выдаст 50, всё там правильно)
С hashmap ничего не будет, а вот в конфиг сразу писать - плохая идея.
Хорошо, спасибо)
Сделал) Запоминаю каждое изменение хп игроков в HashMap и при отсоединении их от сервера записываю из HashMap'а в файл.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх