Плагин сохранения и загрузки локации

  • Автор темы Автор темы MOR_IV
  • Дата начала Дата начала

MOR_IV

Активный участник
Пользователь
Баллы
88
Имя в Minecraft
MOR_IV
Доброго времени суток.
Мне нужен простенький плагин, который выполнял бы 4 вещи.
1 - при выходе игрока с сервера: Записывал в конфиг: Ник:мир:координаты(x,y,z,)
2 - при входе игрока на сервер: загружал из конфига: Ник:мир:координаты(x,y,z,) и делал по этим кордам ТП
3 - каждые 30 секунд записывал всех пользователей в конфиг: Ник:мир:координаты(x,y,z,)
4 - при выключении сервера повторял пункт 3

Наработки:
Код:
package savep;
import java.util.ArrayList;
import java.util.List;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.configuration.file.FileConfiguration;
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;
import org.bukkit.scheduler.BukkitRunnable;



public class savePlayer extends JavaPlugin implements Listener {

    protected FileConfiguration config;
    protected Player pl;
  
    @Override
      public void onEnable() {
        config = getConfig();
        Bukkit.getPluginManager().registerEvents(this, this);
        config.options().copyDefaults(true);
        saveConfig();
      
        BukkitRunnable runnable = new BukkitRunnable(){
            @Override
            public void run (){
                Bukkit.broadcastMessage("Автоматическое сохранение локации");
                // тут бы код, чтоб вызвать список игроков и каждого сохранить.
              
              
            }
        };
        runnable.runTaskTimer(this, 1L, 600L);
      
      
  
    }
      
      
      
          @EventHandler
          public void onJoin(PlayerJoinEvent event){
            Player p = event.getPlayer();
            configToLoc(p);
          
          }
      

        @EventHandler
        public void onQuit(PlayerQuitEvent event){
            Player p = event.getPlayer();
            locToConfig(p);
          }
                  


public void locToConfig(Player p){
  
    config.set(p + "world", p.getLocation().getWorld().getName());
    config.set(p + "x", p.getLocation().getX());
    config.set(p + "y", p.getLocation().getY());
    config.set(p + "z", p.getLocation().getZ());
    saveConfig();
}

public void configToLoc(Player p){
    if(getConfig().getConfigurationSection("hd") == null) {
        p.sendMessage(ChatColor.RED + "Вы впервые зашли на сервер");
        World w = Bukkit.getServer().getWorld(getConfig().getString(p + "world"));
        double x = getConfig().getDouble(p + "x");
        double y = getConfig().getDouble(p + "y");
        double z = getConfig().getDouble(p + "z");
        p.teleport(new Location(w, x, y, z));
}
}
}


У меня получилось сохраняет так:
CraftPlayer{name=Admin}world: world
CraftPlayer{name=Admin}x: 262.9074449360731
CraftPlayer{name=Admin}y: 96.63702518367731
CraftPlayer{name=Admin}z: 295.9765944369526

и не грузит
 
В чем смысл этого плагина? Разве игроки не появляются на своих местах после захода в игру?
 
Смысл в том, что я связываю сервера через BungeeCord, и на каждом сервере папка пользователей одна. И получается что координаты меняются, когда человек на другом сервере. И при возврате обратно, ты уже в другом месте.
 
А где написано, что это должно между серверами работать?
 
Ни где, потому как эвент выхода и входа между серверами у меня по другому работает.
Там проблем нет. Мне просто в рамках одного сервера. Просто установлю на каждый релиз плагина. На каждом серве свой config.yml с координатами.
 
В вашем случае не работает, потому что вы сохраняете Player, а не Player.getName().
 
Вах, точно.
А как быть со списком пользователей, чтоб каждого сохранить?
 
каждые 30 секунд, чтоб плагин брал список онлайн пользователей и каждого сохранял.
С таймером разобрался, а с кодом взятия списка, и сохранения каждого пользователя - нет
 
А отправить в конфиг? В java дуб.
 
Я имею в виду в счетчике.
Код:
@Override
            public void run (){
                Bukkit.broadcastMessage("Автоматическое сохранение локации");
                // тут бы код, чтоб вызвать список игроков и каждого сохранить.
                for(Player player : Bukkit.getOnlinePlayers()); // вызываем список
                locToConfig(player); // пытаемся сохранить и Ошибку дает - player cannot be resolved to a variable
              }
 
for(Player player : Bukkit.getOnlinePlayers());
Вы на конце ; поставили.
 
Почему-то мне кажется, что он не сохранит в таком коде, или я не прав?
 
Спасибо, что уделили время.. попробую завести плагин
Каждые 30 сек сохраняет, при выходе - сохраняет. А вот при входе - то ли не грузит, то ли ТП не делает.


Код:
package savep;
import java.util.ArrayList;
import java.util.List;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.configuration.file.FileConfiguration;
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;
import org.bukkit.scheduler.BukkitRunnable;



public class savePlayer extends JavaPlugin implements Listener {

    protected FileConfiguration config;
    protected Player pl;
   
    @Override
      public void onEnable() {
        config = getConfig();
        Bukkit.getPluginManager().registerEvents(this, this);
        config.options().copyDefaults(true);
        saveConfig();
       
        BukkitRunnable runnable = new BukkitRunnable(){
            @Override
            public void run (){
                Bukkit.broadcastMessage("Автоматическое сохранение локации");
                // тут бы код, чтоб вызвать список игроков и каждого сохранить.
                for(Player player : Bukkit.getOnlinePlayers())
                locToConfig(player);               
            }
        };
        runnable.runTaskTimer(this, 1L, 600L);    
    }
       
       
       
          @EventHandler
          public void onJoin(PlayerJoinEvent event){
            Player p = event.getPlayer();
            configToLoc(p);           
          }       

        @EventHandler
        public void onQuit(PlayerQuitEvent event){
            Player p = event.getPlayer();
            locToConfig(p);
          }
                   


public void locToConfig(Player p){
   
    config.set(p.getName() + "." + "world", p.getLocation().getWorld().getName());
    config.set(p.getName() + "." + "x", p.getLocation().getX());
    config.set(p.getName() + "." + "y", p.getLocation().getY());
    config.set(p.getName() + "." + "z", p.getLocation().getZ());
    saveConfig();
}

public void configToLoc(Player p){
    if(getConfig().getConfigurationSection("hd") == null) {
        p.sendMessage(ChatColor.RED + "Вы впервые зашли на сервер");
        World w = Bukkit.getServer().getWorld(getConfig().getString(p.getName() + "." + "world"));
        double x = getConfig().getDouble(p.getName() + "." + "x");
        double y = getConfig().getDouble(p.getName() + "." + "y");
        double z = getConfig().getDouble(p.getName() + "." + "z");
        p.teleport(new Location(w, x, y, z));
}
}

}
 
Подсказка:
Код:
if(getConfig().getConfigurationSection("hd") == null) {
        //...
        p.teleport(new Location(w, x, y, z));
}
 
Код:
if(getConfig().getConfigurationSection(p.getName()) == null) {
        p.sendMessage(ChatColor.RED + "Вы впервые зашли на сервер");
    }
        else {
        //.....
        p.teleport(new Location(w, x, y, z));
        }

Заметил странную особенность - если остановил сервер, поменял ручками конфиг, запустил - появляешься в тех кордах, которые записал.
Сделал дисконт, изменил корды, опять заходишь, появляешься там-же где и вышел. Странно как-то.....
Код:
Admin:
  world: world
  x: 0.6912824051651
  y: 250.0
  z: 0.51977950155975

Проблемка. Я хочу, чтоб игрок - зашедший первый раз на сервер, появлялся в координатах установленных в конфиге плагина.
Сделал вот что:
Код:
public void configToLoc(Player p){
    if(getConfig().getConfigurationSection(p.getName()) == null) {
        p.sendMessage(ChatColor.RED + "Вы впервые зашли на сервер");
        World w = Bukkit.getServer().getWorld(getConfig().getString("default" + "." + "world"));
        double x = getConfig().getDouble("default" + "." + "x");
        double y = getConfig().getDouble("default" + "." + "y");
        double z = getConfig().getDouble("default" + "." + "z");
        p.teleport(new Location(w, x, y, z));
           
    }
        else {
        World w = Bukkit.getServer().getWorld(getConfig().getString(p.getName() + "." + "world"));
        double x = getConfig().getDouble(p.getName() + "." + "x");
        double y = getConfig().getDouble(p.getName() + "." + "y");
        double z = getConfig().getDouble(p.getName() + "." + "z");
        p.teleport(new Location(w, x, y, z));
        }
}

private void saveCfg(){
    if(getConfig().getConfigurationSection("default" + ".") == null) {
    config.set("default" + "." + "world", "world");
    config.set("default" + "." + "x", "0");
    config.set("default" + "." + "y", "90");
    config.set("default" + "." + "z", "0");
    saveConfig();
    }else{
        Bukkit.broadcastMessage("Спавн загружен");
    }
}

Проблема в том, что при первом заходе игрока на сервер - не делает ТП даже по кордам world,0,90,0 - в место этого кидает под землю, и я ухожу за дно карты и умираю.
Странно. Но помогло присвоить значения
Код:
private void saveCfg(){
    if(getConfig().getConfigurationSection("default" + ".") == null) {
        int x = 0;
        int y = 90;
        int z = 0;
    config.set("default" + "." + "world", "world");
    config.set("default" + "." + "x", x);
    config.set("default" + "." + "y", y);
    config.set("default" + "." + "z", z);
    saveConfig();
    }else{
        Bukkit.broadcastMessage("Спавн загружен");
    }

Кому надо, вот целиком плагин. Вроде работает.
Код:
package mor.savePlayer;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.configuration.file.FileConfiguration;
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;
import org.bukkit.scheduler.BukkitRunnable;



public class savePlayer extends JavaPlugin implements Listener {

    protected FileConfiguration config;
  
  
    @Override
      public void onEnable() {
        config = getConfig();
        saveCfg();
        Bukkit.getPluginManager().registerEvents(this, this);
        config.options().copyDefaults(true);
        saveConfig();
      
        BukkitRunnable runnable = new BukkitRunnable(){
            @Override
            public void run (){
                //Bukkit.broadcastMessage("Автоматическое сохранение локации");
                for(Player player : Bukkit.getOnlinePlayers())
                locToConfig(player);              
            }
        };
        runnable.runTaskTimer(this, 1L, 600L);   
    }
      
    public void onDisable() {
        for(Player player : Bukkit.getOnlinePlayers())
            locToConfig(player);
            }
      
          @EventHandler
          public void onJoin(PlayerJoinEvent event){
            Player p = event.getPlayer();
            configToLoc(p);          
          }      

        @EventHandler
        public void onQuit(PlayerQuitEvent event){
            Player p = event.getPlayer();
            locToConfig(p);
          }
                  


public void locToConfig(Player p){
    config.set(p.getName() + "." + "world", p.getLocation().getWorld().getName());
    config.set(p.getName() + "." + "x", p.getLocation().getX());
    config.set(p.getName() + "." + "y", p.getLocation().getY());
    config.set(p.getName() + "." + "z", p.getLocation().getZ());
    saveConfig();
}

public void configToLoc(Player p){
    if(getConfig().getConfigurationSection(p.getName()) == null) {
        p.sendMessage(ChatColor.RED + "Вы впервые зашли на сервер");
        World w = Bukkit.getServer().getWorld(getConfig().getString("default" + "." + "world"));
        double x = getConfig().getDouble("default" + "." + "x");
        double y = getConfig().getDouble("default" + "." + "y");
        double z = getConfig().getDouble("default" + "." + "z");
        p.teleport(new Location(w, x, y, z));
              
    }
        else {
        World w = Bukkit.getServer().getWorld(getConfig().getString(p.getName() + "." + "world"));
        double x = getConfig().getDouble(p.getName() + "." + "x");
        double y = getConfig().getDouble(p.getName() + "." + "y");
        double z = getConfig().getDouble(p.getName() + "." + "z");
        p.teleport(new Location(w, x, y, z));
        }
}

private void saveCfg(){
    if(getConfig().getConfigurationSection("default" + ".") == null) {
        int x = 0;
        int y = 90;
        int z = 0;
    config.set("default" + "." + "world", "world");
    config.set("default" + "." + "x", x);
    config.set("default" + "." + "y", y);
    config.set("default" + "." + "z", z);
    saveConfig();
    }else{
        Bukkit.broadcastMessage("Спавн загружен");
    }
}

}


// - меня интересует, как в бакките проверить, равно ли типу блока по (w, x, y + 1, z) блоку, или воздуху? и если равно блоку, я присваиваю значения (w1, x1, y1, z1) из "default"
Код:
public void configToLoc(Player p){
    if(getConfig().getConfigurationSection(p.getName()) == null) {
        p.sendMessage(ChatColor.RED + "Вы впервые зашли на сервер");
        //.......            
    }else {
        World w = Bukkit.getServer().getWorld(getConfig().getString(p.getName() + "." + "world"));
        double x = getConfig().getDouble(p.getName() + "." + "x");
        double y = getConfig().getDouble(p.getName() + "." + "y");
        double z = getConfig().getDouble(p.getName() + "." + "z");
        if(Bukkit.Location(w, x, y + 1, z) == block) { // - меня интересует, как в бакките проверить, равно ли типу блока по (w, x, y + 1, z) блоку, или воздуху? и если равно блоку, я присваиваю значения (w1, x1, y1, z1) из "default"
           //.......
            p.teleport(new Location(w1, x1, y1, z1));              
        }else{
        p.teleport(new Location(w, x, y, z));
        }
        }
}
 
Последнее редактирование:
Из всего вашего сообщения ничего не понятно.
 
Назад
Верх