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

Помогите Найти сундук с названием инвентаря

Тема в разделе "Разработка плагинов для новичков", создана пользователем Lisenochek, 26 июл 2016.

Статус темы:
Закрыта.
  1. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Народ, пытался заспавнить над сундуком партиклы, с помощью таймера. Для этого я использовал название сундука, чтобы частицы не спавнились на всех сундуках, вроде бы все правильно сделал, но ничего не выходит, он спамит крашами. Помогите мне помочь с ошибкой.

    Код:
    package com.realistic.timers;
    
    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.block.Block;
    import org.bukkit.block.Chest;
    import org.bukkit.entity.Player;
    import org.bukkit.event.Listener;
    import org.bukkit.inventory.Inventory;
    
    import com.realistic.api.API;
    import com.realistic.particle_api.ParticleEffect;
    
    import net.md_5.bungee.api.ChatColor;
    
    public class Spawn_Crate_Particles implements Listener, Runnable {
      
        private API plugin;
      
        public Spawn_Crate_Particles(API plugin) {
            this.plugin=plugin;
        }
    
        @Override
        public void run() {
          
            for(Player p : Bukkit.getOnlinePlayers()) {
              
                Location loc = p.getLocation();
                Block b = loc.getBlock();
                Chest chest = (Chest) b.getState();
                Inventory inv = chest.getBlockInventory();
              
                if (chest.getBlockInventory().getName()
                        .equalsIgnoreCase(ChatColor.DARK_GREEN + ChatColor.BOLD.toString() + "Realistic_crate")) {
                  
                    ParticleEffect.REDSTONE.display(1, 15, 0, 0, 0, chest.getLocation().add(0, 0.7, 0.3), 50);
                }
            }
        }
    }
    


    [14:56:23 WARN]: [Realistic] Task #4 for Realistic v1.1 alpha generated an exception
    java.lang.ClassCastException: org.bukkit.craftbukkit.v1_8_R3.block.CraftBlockState cannot be cast to org.bukkit.block.Chest
    at com.realistic.timers.Spawn_Crate_Particles.run(Spawn_Crate_Particles.java:31) ~[?:?]
    at org.bukkit.craftbukkit.v1_8_R3.scheduler.CraftTask.run(CraftTask.java:71) ~[server.jar:git-Spigot-db6de12-18fbb24]
    at org.bukkit.craftbukkit.v1_8_R3.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:350) [server.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:723) [server.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [server.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [server.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [server.jar:git-Spigot-db6de12-18fbb24]

    Я знаю, что он ругается на строчку 31, но я не знаю, что там не так.[/SPOILER]
     
  2. Хостинг MineCraft
    <
  3. CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Ты берёшь локацию игрока, берёшь на этой локации блок и наследуешь от него сундук. Но локация игрока всегда Material.AIR, потому что фактическая локация игрока - блок в районе его ног.

    Возможные решения
    1) location.subtract(0, 1, 0);
    2) location.getRelativeBlock(BlockFace.DOWN);
     
  4. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Добавил строчку loc.getBlock.setType(Material.CHEST) , но походу я втупил, ибо сундуки спавнятся под ногами игрока.[DOUBLEPOST=1469535952,1469535658][/DOUBLEPOST]Не один из вариантов почему-то не подходит[DOUBLEPOST=1469536128][/DOUBLEPOST]У меня на другом таймере спавнится сундук в рандомных координатах в районе игрока.[DOUBLEPOST=1469543405][/DOUBLEPOST]Неужели никто не может мне помочь ?
     
  5. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    if (b.getInventory().getName().equalsIgnoreCase("сундучок") {
    а может Bukkit.getServer().getWorld("мыр").playEffect(b.getLocation() + (0, (float) 0.7, 0), ......);
    Ещё можешь так попробовать,оба варианта не тестировал:
    World w = (World) b.getLocation().getWorld();
    w.playEffect(b.getLocation() + (0, (float) 0.7, 0), Effect. .....);

    И да, проверка что блок - это сундук не пробовал впихнуть...?
    Условие создай - что блок - это сундук:
    if (b.getType() == Material.CHEST) {
    Chest chest = (Chest) b.getState();
    Inventory inv = chest.getBlockInventory();

    .,,.
    Т.к. возможно, что это не сундук, а земля, а ты кастить считай будешь землю к сундуку
    Код:
    java.lang.ClassCastException: org.bukkit.craftbukkit.v1_8_R3.block.CraftBlockState cannot be cast to org.bukkit.block.Chest
     
    Последнее редактирование: 28 июл 2016
  6. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Похоже, что я написал криво. Частицы не появляются, если не наступить на сундук.

    Код:
    package com.realistic.timers;
    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.World;
    import org.bukkit.block.Block;
    import org.bukkit.block.Chest;
    import org.bukkit.entity.Player;
    import org.bukkit.event.Listener;
    import org.bukkit.inventory.Inventory;
    
    import com.realistic.api.API;
    import com.realistic.particle_api.ParticleEffect;
    
    import net.md_5.bungee.api.ChatColor;
    public class Spawn_Crate_Particles implements Listener, Runnable {
        private API plugin;
        public Spawn_Crate_Particles(API plugin) {
            this.plugin=plugin;
        }
        @Override
        public void run() {
        
            for(Player p : Bukkit.getOnlinePlayers()) {
            
                Location loc = p.getLocation();
                Block b = loc.getBlock();
            
                if (b.getType() == Material.CHEST) {
                    Chest chest = (Chest) b.getState();
                    Inventory inv = chest.getBlockInventory();
                   
                    if (chest.getBlockInventory().getName()
                            .equalsIgnoreCase(ChatColor.DARK_GREEN + ChatColor.BOLD.toString() + "Realistic_crate")) {
                    
                        ParticleEffect.REDSTONE.display(1, 15, 0, 0, 0, chest.getLocation().add(0, 0.7, 0.3), 50);
                    }
                }
            }
        }
    }
     
  7. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    World w = (World) b.getLocation().getWorld();
    w.playEffect(b.getLocation() + (0, (float) 0.7, 0), Effect. .....);
    Для частиц попробуй
    И да, зачем
    for (Player ps..... ??
    И да зачем Listener если ты не обрабатываншь никаких ивентов
     
    Последнее редактирование: 28 июл 2016
  8. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Достаю бакитского игрока.
    Listener - да прст поставил :)[DOUBLEPOST=1469687189,1469687106][/DOUBLEPOST]
    Почему то синтаксическая ошибка на +
     
  9. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    зачем ты их достаешь? И Location loc = p.getLocation()?
    А так, работает ли?
    Попробуй add
     
  10. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Что?
    Чтобы находить локацию игрока
     
  11. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    Ахах, а зачем, ты вроде нигде это не используещь, или МБ я слепой
     
  12. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Location loc = p.getLocation();[DOUBLEPOST=1469687735,1469687703][/DOUBLEPOST]Все равно та же беда. Пока не встанешь на сундук - частицы не появятся
     
  13. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    А где ты это используешь... омг, или я слепой?[DOUBLEPOST=1469687851,1469687751][/DOUBLEPOST]Убери for Player ps...
     
  14. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Block b = loc.getBlock();
     
  15. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    А p.getLoxation() Зачем?!
    Убери for player ps
    Не b а P
     
  16. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Интересно, как я найду блок без локации игрока?
     
  17. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    ООО боже
    Дошло
    Ты получаешь блок на котором стоит игрок, Карл!
    Естественно...
    Я сейчас с телефона, через 10 мин напишу решение
     
  18. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Соответственно надо оставить цикл for с доставанием игрока, иначе как?
     
  19. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    попробуй
    Код:
    public class TOP implements Runnable {
        @Override
        public void run() {
            // Получаем мир
            World w = Bukkit.getWorld("world");
            // получаем все загруженные чанки
            for (Chunk chunk : w.getLoadedChunks()) {
                int cx = chunk.getX() << 4;
                int cz = chunk.getZ() << 4;
                for (int x = cx; x < cx + 16; x++) {
                    for (int z = cz; z < cz + 16; z++) {
                        for (int y = 0; y < 128; y++) {
                            // получаем блок :o
                            Block b = (Block) chunk.getBlock(x, y, z);
                            // проверяем что это сундучок
                            if (w.getBlockAt(x, y, z).getType() == Material.CHEST) {
                                Chest chest = (Chest) b.getState();
                                // проверяем название
                                if (chest.getBlockInventory().getName().equalsIgnoreCase("Realistic Crate")) {
                                    // ЧАСТИЦЫ ;O
                                }
                            }
                        }
                    }
                }
            }
        }
    }
     
  20. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Из-за этого таймера все очень дико лагает. Хотя TPS 20.
    Но частицы появляются.
     
  21. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    хм. Тогда сделай проверку есть ли в чанке с сундуком игрок.[DOUBLEPOST=1469691826,1469691442][/DOUBLEPOST]
    Код:
    import org.bukkit.Bukkit;
    import org.bukkit.Chunk;
    import org.bukkit.Effect;
    import org.bukkit.Material;
    import org.bukkit.World;
    import org.bukkit.block.Block;
    import org.bukkit.block.Chest;
    import org.bukkit.entity.Entity;
    import org.bukkit.entity.Player;
    
    public class TOP implements Runnable {
        private Entity entity;
        @Override
        public void run() {
            // Получаем мир
            World w = Bukkit.getWorld("world");
            // получаем все загруженные чанки
            for (Chunk chunk : w.getLoadedChunks()) {
                int cx = chunk.getX() << 4;
                int cz = chunk.getZ() << 4;
                for (int x = cx; x < cx + 16; x++) {
                    for (int z = cz; z < cz + 16; z++) {
                        for (int y = 0; y < 128; y++) {
                            // получаем блок :o
                            Block b = (Block) chunk.getBlock(x, y, z);
                            // проверяем что это сундучок
                            if (w.getBlockAt(x, y, z).getType() == Material.CHEST) {
                                Chest chest = (Chest) b.getState();
                                // проверяем название
                                if (chest.getBlockInventory().getName().equalsIgnoreCase("Realistic Crate")) {
                                    // Получаем всех онлайн игроков
                                    for (Player ps : Bukkit.getOnlinePlayers()) {
                                        // Смотрим что в чанке с сундуком есть игрок
                                        if (chunk.getEntities().equals(ps)) {
                                            w.playEffect(chest.getLocation().add(0, 0.7, 0), Effect.ENDER_SIGNAL, 50);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
     
Статус темы:
Закрыта.

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