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

Статус
Закрыто для дальнейших ответов.

Lisenochek

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

JavaScript:
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.*********ventory.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]
 
Народ, пытался заспавнить над сундуком партиклы, с помощью таймера. Для этого я использовал название сундука, чтобы частицы не спавнились на всех сундуках, вроде бы все правильно сделал, но ничего не выходит, он спамит крашами. Помогите мне помочь с ошибкой.

JavaScript:
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.*********ventory.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]
Ты берёшь локацию игрока, берёшь на этой локации блок и наследуешь от него сундук. Но локация игрока всегда Material.AIR, потому что фактическая локация игрока - блок в районе его ног.

Возможные решения
1) location.subtract(0, 1, 0);
2) location.getRelativeBlock(BlockFace.DOWN);
 
Ты берёшь локацию игрока, берёшь на этой локации блок и наследуешь от него сундук. Но локация игрока всегда Material.AIR, потому что фактическая локация игрока - блок в районе его ног.
Добавил строчку loc.getBlock.setType(Material.CHEST) , но походу я втупил, ибо сундуки спавнятся под ногами игрока.
Не один из вариантов почему-то не подходит
У меня на другом таймере спавнится сундук в рандомных координатах в районе игрока.
Неужели никто не может мне помочь ?
 
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
 
Последнее редактирование:
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
Похоже, что я написал криво. Частицы не появляются, если не наступить на сундук.

JavaScript:
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.*********ventory.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);
                }
            }
        }
    }
}
 
World w = (World) b.getLocation().getWorld();
w.playEffect(b.getLocation() + (0, (float) 0.7, 0), Effect. .....);
Для частиц попробуй
И да, зачем
for (Player ps..... ??
И да зачем Listener если ты не обрабатываншь никаких ивентов
 
Последнее редактирование:
Ахах, а зачем, ты вроде нигде это не используещь, или МБ я слепой
 
Location loc = p.getLocation();
Все равно та же беда. Пока не встанешь на сундук - частицы не появятся
 
Интересно, как я найду блок без локации игрока?
 
ООО боже
Дошло
Ты получаешь блок на котором стоит игрок, Карл!
Естественно...
Я сейчас с телефона, через 10 мин напишу решение
 
ООО боже
Дошло
Ты получаешь блок на котором стоит игрок, Карл!
Естественно...
Я сейчас с телефона, через 10 мин напишу решение
Соответственно надо оставить цикл for с доставанием игрока, иначе как?
 
попробуй
Код:
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
                            }
                        }
                    }
                }
            }
        }
    }
}
 
попробуй
Код:
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
                            }
                        }
                    }
                }
            }
        }
    }
}
Из-за этого таймера все очень дико лагает. Хотя TPS 20.
Но частицы появляются.
 
Из-за этого таймера все очень дико лагает. Хотя TPS 20.
Но частицы появляются.
хм. Тогда сделай проверку есть ли в чанке с сундуком игрок.
Код:
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);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх