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

  • Автор темы Автор темы MOR_IV
  • Дата начала Дата начала
Мне надо, перед тем как телепортировать игрока, проверить координаты world,x,y+1,z на наличие там блока(твердого) и если там блока нет, то телепортирую, а если есть, делаю ТП по дефолтным кордам (спавн).
if(//какой то код == block){
//....
p.teleport(new Location(w1, x1, y1, z1));
}
 
if(world.getBlockAt(loc.add(0, 1, 0)).isEmpty()) player.teleport(loc) else player.teleport(spawn);
 
Спасибо. Меня смущает то, что у меня известны мир, и корды, и мне не надо их спрашивать.
getBlockAt(x,y + 1, z).isSolid() - может тогда так?
 
курил инет, так и не понял - как присвоить значению loc значение int x,int y,int z
как из double в int перевести - знаю.
причина перевода из double в int - World.getBlockAt не хавает double значения
Если делаю вот так:
Код:
                int a = (int) x; // перевод из double в int
        int b = (int) y; // перевод из double в int
        int c = (int) z; // перевод из double в int
       
        if(World.getBlockAt( a,  b,  c).isEmpty()) {
Получаю ошибку:
Cannot make a static reference to the non-static method getBlockAt(int, int, int) from the type World
А она для меня вообще темный лес.
А мне еще надо y +1
опять моя не внимательность привела к левому посту...
нашел решение:
if(w.getBlockAt(a, b + 1, c).isEmpty()) {
При тестах показало, что +1 к координатам y(b) не надо прибавлять.
if(w.getBlockAt(a, b, c).isEmpty() == true) {
Еще проблема
Если голова находиться в одном блоке допустим с факелом, то isEmpty возвращает false. Как мне пропустить проверку факела, воды, лавы и т.п.? и прочих блоков, которые не наносят урона, когда голова в нем. Только методом исключения id ? Должен быть другой способ, т.к. bukkit же решает, наносить демаг, или нет.
то есть нужна проверка не на воздух, а на твердость. Чтоб проверка возвращала false только тогда, когда через блок фактически нельзя пройти
public boolean isSolid() - True if this material is a block and solid
Нашел. осталось привинтить как-то проверку.
 
Приятно смотреть как человек сам задает вопросы и успешно их решает. Удачи )
 
Приятно смотреть как человек сам задает вопросы и успешно их решает. Удачи )
Спасибо за поддержку =)
Вопрос про material.isSolid() пока актуален =)
Зашел в полный ступор. Как только не делал. Если делаю так:
Код:
if(w.getBlockAt(a,b,c).getTypeId().isSolid() == true) {
То получаю ошибку
Cannot invoke isSolid() on the primitive type int

Это самый верный вариант, который мне удалось придумать. Курение интернета ничего толкового не дало.
 
Я же вам написал ответ.
if(!world.getBlockAt(loc).isEmpty())
 
isEmpty сравнивает - если воздух, то возвращает true, если что-то либо еще false. а isSolid проверяет есть ли там Твердый блок.
isEmpty мне плохо подходит из-за воды, факелов и т.п.. Т.к. на них он возвращает false =(((
 
Мне кажется, тут вам больше подойдет isEmpty. Но вы можете заменить на isSolid()
 
Вот и проблема то в том, что с моими кривыми руками, у меня не получается сделать проверку по isSolid()
 
if(world.getBlockAt(loc).isSolid()) - The method isSolid() is undefined for the type Block
как-то так.
 
Хм, действительно нет. Странно, было же.
 
блин. а я делал getTypeId() 🫢
Я даже не представляю, чем Вас отблагодарить...
Результаты тестирования:
- При появлении в воздухе, воде, лаве, факеле, зыбучем песке ExtraBiomes XL, мягком блоке chisel - появляешься в том же месте, что и был.
- При появлении в твердом блоке: земля, камень, лед и т.п. - появляюсь на спавне.
Вывод: Плагин выполняет требуемую задачу.
Надо еще протестировать работу с онлайн 2+

Развитие продолжу - надо привязать команду для назначения спавна в этом плагине, вынести в конфиг время счетчика, чтоб значение "30сек(600L)" можно было быстро поменять.
Еще вопросец образовался. Как запросить/записать/перезагрузить конфиг из другого класса?
Код:
public class SavePlayerLoc extends JavaPlugin implements Listener {

    protected FileConfiguration config;
        @Override
      public void onEnable() {
        config = getConfig();
                getCommand("spl").setExecutor(new spComand());


Код:
public class spComand implements CommandExecutor {
    private SavePlayerLoc plugin;
  
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (sender instanceof Player) {
switch (args.length) {
case 1:
            if ("reload".equalsIgnoreCase(args[0])) {
                plugin.reloadConfig();


В данном случае reloadConfig(); не работает....
Апдейт плагина:
Код:
package ru.morIV.BungeeSavePL;

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 Main extends JavaPlugin implements Listener{

    protected FileConfiguration config;


    @Override
    public void onEnable() {
        Bukkit.getLogger().info("Enabled!");
        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);
    }

    @Override
    public void onDisable() {
        Bukkit.getLogger().info("Disabled!");
        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 + "Вы впервые зашли на сервер");
            p.teleport(p.getPlayer().getWorld().getSpawnLocation());

        }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");
            int a = (int) x;
            int b = (int) y + 1;
            int c = (int) z;
            //if(w.getBlockAt(a,b,c).isEmpty() == true) {
            if(w.getBlockAt(a,b,c).getType().isSolid() == false) {
                p.teleport(new Location(w, x, b, z));
            }else{
                p.sendMessage(ChatColor.RED + "Вы телепортированы на спавн");
                p.teleport(p.getPlayer().getWorld().getSpawnLocation());              
          
            }
        }
    }
}



Добавлена проверка на наличие твердого блока в координатах ТП. Если есть, тп на спавн. Так же т.п. на спавн при первом входе в игру.
 
Последнее редактирование:
блин. а я делал getTypeId() 🫢
Я даже не представляю, чем Вас отблагодарить...
Результаты тестирования:
- При появлении в воздухе, воде, лаве, факеле, зыбучем песке ExtraBiomes XL, мягком блоке chisel - появляешься в том же месте, что и был.
- При появлении в твердом блоке: земля, камень, лед и т.п. - появляюсь на спавне.
Вывод: Плагин выполняет требуемую задачу.
Надо еще протестировать работу с онлайн 2+

Развитие продолжу - надо привязать команду для назначения спавна в этом плагине, вынести в конфиг время счетчика, чтоб значение "30сек(600L)" можно было быстро поменять.
Еще вопросец образовался. Как запросить/записать/перезагрузить конфиг из другого класса?
Код:
public class SavePlayerLoc extends JavaPlugin implements Listener {

    protected FileConfiguration config;
        @Override
      public void onEnable() {
        config = getConfig();
                getCommand("spl").setExecutor(new spComand());


Код:
public class spComand implements CommandExecutor {
    private SavePlayerLoc plugin;
 
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (sender instanceof Player) {
switch (args.length) {
case 1:
            if ("reload".equalsIgnoreCase(args[0])) {
                plugin.reloadConfig();


В данном случае reloadConfig(); не работает....
Апдейт плагина:
Код:
package ru.morIV.BungeeSavePL;

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 Main extends JavaPlugin implements Listener{

    protected FileConfiguration config;


    @Override
    public void onEnable() {
        Bukkit.getLogger().info("Enabled!");
        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);
    }

    @Override
    public void onDisable() {
        Bukkit.getLogger().info("Disabled!");
        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 + "Вы впервые зашли на сервер");
            p.teleport(p.getPlayer().getWorld().getSpawnLocation());

        }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");
            int a = (int) x;
            int b = (int) y + 1;
            int c = (int) z;
            //if(w.getBlockAt(a,b,c).isEmpty() == true) {
            if(w.getBlockAt(a,b,c).getType().isSolid() == false) {
                p.teleport(new Location(w, x, b, z));
            }else{
                p.sendMessage(ChatColor.RED + "Вы телепортированы на спавн");
                p.teleport(p.getPlayer().getWorld().getSpawnLocation());             
         
            }
        }
    }
}



Добавлена проверка на наличие твердого блока в координатах ТП. Если есть, тп на спавн. Так же т.п. на спавн при первом входе в игру.
Кидай в "Неподтвержденные плагины"
 
Назад
Верх