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

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

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

  1. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    Мне надо, перед тем как телепортировать игрока, проверить координаты world,x,y+1,z на наличие там блока(твердого) и если там блока нет, то телепортирую, а если есть, делаю ТП по дефолтным кордам (спавн).
    if(//какой то код == block){
    //....
    p.teleport(new Location(w1, x1, y1, z1));
    }
     
  2. Хостинг MineCraft
    <
  3. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    if(world.getBlockAt(loc.add(0, 1, 0)).isEmpty()) player.teleport(loc) else player.teleport(spawn);
     
  4. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    Спасибо. Меня смущает то, что у меня известны мир, и корды, и мне не надо их спрашивать.
    getBlockAt(x,y + 1, z).isSolid() - может тогда так?
     
  5. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
     
  6. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    курил инет, так и не понял - как присвоить значению loc значение int x,int y,int z
    как из double в int перевести - знаю.[DOUBLEPOST=1404176855,1404176737][/DOUBLEPOST]причина перевода из double в int - World.getBlockAt не хавает double значения[DOUBLEPOST=1404182254][/DOUBLEPOST]Если делаю вот так:
    Код:
                    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[DOUBLEPOST=1404185891][/DOUBLEPOST]опять моя не внимательность привела к левому посту...
    нашел решение:
    if(w.getBlockAt(a, b + 1, c).isEmpty()) {[DOUBLEPOST=1404187489][/DOUBLEPOST]При тестах показало, что +1 к координатам y(b) не надо прибавлять.
    if(w.getBlockAt(a, b, c).isEmpty() == true) {
    Еще проблема
    Если голова находиться в одном блоке допустим с факелом, то isEmpty возвращает false. Как мне пропустить проверку факела, воды, лавы и т.п.? и прочих блоков, которые не наносят урона, когда голова в нем. Только методом исключения id ? Должен быть другой способ, т.к. bukkit же решает, наносить демаг, или нет.[DOUBLEPOST=1404188120][/DOUBLEPOST]то есть нужна проверка не на воздух, а на твердость. Чтоб проверка возвращала false только тогда, когда через блок фактически нельзя пройти[DOUBLEPOST=1404188655][/DOUBLEPOST]public boolean isSolid() - True if this material is a block and solid
    Нашел. осталось привинтить как-то проверку.
     
  7. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Приятно смотреть как человек сам задает вопросы и успешно их решает. Удачи )
     
  8. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    Спасибо за поддержку =)
    Вопрос про material.isSolid() пока актуален =)[DOUBLEPOST=1404199358,1404195569][/DOUBLEPOST]Зашел в полный ступор. Как только не делал. Если делаю так:
    Код:
    if(w.getBlockAt(a,b,c).getTypeId().isSolid() == true) {
    То получаю ошибку
    Cannot invoke isSolid() on the primitive type int

    Это самый верный вариант, который мне удалось придумать. Курение интернета ничего толкового не дало.
     
  9. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Я же вам написал ответ.
    if(!world.getBlockAt(loc).isEmpty())
     
  10. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    isEmpty сравнивает - если воздух, то возвращает true, если что-то либо еще false. а isSolid проверяет есть ли там Твердый блок.
    isEmpty мне плохо подходит из-за воды, факелов и т.п.. Т.к. на них он возвращает false =(((
     
  11. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Мне кажется, тут вам больше подойдет isEmpty. Но вы можете заменить на isSolid()
     
  12. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    Вот и проблема то в том, что с моими кривыми руками, у меня не получается сделать проверку по isSolid()
     
  13. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    if(world.getBlockAt(loc).isSolid())
     
  14. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    if(world.getBlockAt(loc).isSolid()) - The method isSolid() is undefined for the type Block
    как-то так.
     
  15. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Эм... Какой у вас Bukkit?
     
  16. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
  17. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Хм, действительно нет. Странно, было же.
     
  18. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    Печально....
     
  19. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Делайте getType().isSolid()
     
  20. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    блин. а я делал getTypeId() :oops:[DOUBLEPOST=1404205410,1404205378][/DOUBLEPOST]Я даже не представляю, чем Вас отблагодарить...[DOUBLEPOST=1404207402][/DOUBLEPOST]Результаты тестирования:
    - При появлении в воздухе, воде, лаве, факеле, зыбучем песке ExtraBiomes XL, мягком блоке chisel - появляешься в том же месте, что и был.
    - При появлении в твердом блоке: земля, камень, лед и т.п. - появляюсь на спавне.
    Вывод: Плагин выполняет требуемую задачу.
    Надо еще протестировать работу с онлайн 2+

    Развитие продолжу - надо привязать команду для назначения спавна в этом плагине, вынести в конфиг время счетчика, чтоб значение "30сек(600L)" можно было быстро поменять.[DOUBLEPOST=1404304359][/DOUBLEPOST]Еще вопросец образовался. Как запросить/записать/перезагрузить конфиг из другого класса?
    Код:
    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(); не работает....[DOUBLEPOST=1407589641][/DOUBLEPOST]Апдейт плагина:
    Код:
    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());              
              
                }
            }
        }
    }


    Добавлена проверка на наличие твердого блока в координатах ТП. Если есть, тп на спавн. Так же т.п. на спавн при первом входе в игру.
     
    Последнее редактирование: 9 авг 2014
  21. Space Flux

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

    Баллы:
    46
    Кидай в "Неподтвержденные плагины"
     

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