Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

Тема в разделе "Запросы на разработку плагинов", создана пользователем MOR_IV, 29 июн 2014.

  1. Автор темы
    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

    и не грузит
     
  2. Хостинг MineCraft
    <
  3. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    В чем смысл этого плагина? Разве игроки не появляются на своих местах после захода в игру?
     
  4. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    Смысл в том, что я связываю сервера через BungeeCord, и на каждом сервере папка пользователей одна. И получается что координаты меняются, когда человек на другом сервере. И при возврате обратно, ты уже в другом месте.
     
  5. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    А где написано, что это должно между серверами работать?
     
  6. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    Ни где, потому как эвент выхода и входа между серверами у меня по другому работает.
    Там проблем нет. Мне просто в рамках одного сервера. Просто установлю на каждый релиз плагина. На каждом серве свой config.yml с координатами.
     
  7. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    В вашем случае не работает, потому что вы сохраняете Player, а не Player.getName().
     
  8. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    Вах, точно.[DOUBLEPOST=1404055701,1404055584][/DOUBLEPOST]А как быть со списком пользователей, чтоб каждого сохранить?
     
  9. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    Не понял, о чем вы.
     
  10. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    каждые 30 секунд, чтоб плагин брал список онлайн пользователей и каждого сохранял.[DOUBLEPOST=1404055937,1404055895][/DOUBLEPOST]С таймером разобрался, а с кодом взятия списка, и сохранения каждого пользователя - нет
     
  11. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    for(Player player : Bukkit.getOnlinePlayers())
     
  12. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    А отправить в конфиг? В java дуб.
     
  13. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    Ну так config.set(player.getName(), data)
     
  14. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    Я имею в виду в счетчике.
    Код:
    @Override
                public void run (){
                    Bukkit.broadcastMessage("Автоматическое сохранение локации");
                    // тут бы код, чтоб вызвать список игроков и каждого сохранить.
                    for(Player player : Bukkit.getOnlinePlayers()); // вызываем список
                    locToConfig(player); // пытаемся сохранить и Ошибку дает - player cannot be resolved to a variable
                  }
     
  15. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    for(Player player : Bukkit.getOnlinePlayers());
    Вы на конце ; поставили.
     
  16. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    Почему-то мне кажется, что он не сохранит в таком коде, или я не прав?
     
  17. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    Я уже указал вам на ошибку.
     
  18. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    Спасибо, что уделили время.. попробую завести плагин[DOUBLEPOST=1404059070,1404057299][/DOUBLEPOST]Каждые 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));
    }
    }
    
    }
     
  19. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    Подсказка:
    Код:
    if(getConfig().getConfigurationSection("hd") == null) {
            //...
            p.teleport(new Location(w, x, y, z));
    }
     
  20. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    Код:
    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
    [DOUBLEPOST=1404073146][/DOUBLEPOST]Проблемка. Я хочу, чтоб игрок - зашедший первый раз на сервер, появлялся в координатах установленных в конфиге плагина.
    Сделал вот что:
    Код:
    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 - в место этого кидает под землю, и я ухожу за дно карты и умираю.[DOUBLEPOST=1404074811,1404073146][/DOUBLEPOST]Странно. Но помогло присвоить значения
    Код:
    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("Спавн загружен");
        }
    [DOUBLEPOST=1404075057][/DOUBLEPOST]Кому надо, вот целиком плагин. Вроде работает.
    Код:
    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("Спавн загружен");
        }
    }
    
    }
    
    [DOUBLEPOST=1404117396][/DOUBLEPOST]
    // - меня интересует, как в бакките проверить, равно ли типу блока по (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));
            }
            }
    }
    
    
     
    Последнее редактирование: 30 июн 2014
  21. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    Из всего вашего сообщения ничего не понятно.
     

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