当前位置: 首页 > 知识库问答 >
问题:

替换块中的每个块会使服务器崩溃

姬英耀
2023-03-14

正如你在标题中所看到的,我将块替换为块。每次加载一个块时,我都会用另一个随机块替换生成块。这是我的代码

package de.belinked.chunkrandomizer;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.world.ChunkLoadEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class ChunkRandomizer extends JavaPlugin implements Listener {
    
    public List<Material> blocks = Arrays.asList(
            Material.ACACIA_LEAVES,
            Material.ACACIA_LOG,

            // I'll leave this out, just every full, solid block

            Material.YELLOW_STAINED_GLASS,
            Material.YELLOW_TERRACOTTA,
            Material.YELLOW_WOOL
    );
    
    @Override
    public void onEnable() {
        getServer().getPluginManager().registerEvents(this, this);
        Bukkit.broadcastMessage(this.prefix + "Der Chunk-Randomizer wurde erfolgreich geladen");
    }
    
    @Override
    public void onDisable() {
        
    }
    
    public Material getRandomMaterial(List l) {
        int rnd = ThreadLocalRandom.current().nextInt(l.size());
        Material m = (Material) l.get(rnd);
        return m;
    }
    
    @EventHandler
    public void onChunkLoad(ChunkLoadEvent e) {
        if(e.isNewChunk()) {
            Chunk chunk = e.getChunk();
            Block b;
            Material m = getRandomMaterial(this.blocks);
            for(int y = -64; y <= 320; y++) {
                for(int x = 0; x < 16; x++) {
                    for(int z = 0; z < 16; z++) {
                        b = chunk.getBlock(x, y, z);
                        if(!b.getType().isAir() 
                                && b.getType() != Material.BEDROCK 
                                && b.getType() != Material.WATER 
                                && b.getType() != Material.LAVA
                                && b.getType() != Material.END_PORTAL_FRAME
                                && b.getType() != Material.END_PORTAL) {
                            b.setType(m);
                        }
                    }
                }
            }
        }
    }
}

但当我加入服务器并加载一些块时,我会得到以下日志

https://pastebin.com/vA8qHSUr

有人能帮我解决这个吗?提前谢谢!

共有2个答案

仲孙阳
2023-03-14

你应该检查你的插件中是否有api版本:1.13。yml。

这是因为一些映射名称发生了变化,如果没有此选项,spiget无法很好地检测到它们。

邢卓
2023-03-14

在错误的第77行中,它说:

无法获取非块砖的数据

我认为问题来自您的列表。在它的某个地方,一定有材料。砖块,但事实上,我认为材料应该是材料。砖块,砖块是整个砖块,砖块是制作砖块的熟粘土。

 类似资料:
  • 由于使用了容器模式来组织各模块的实例,意味着你可以比较容易的替换掉已经有的服务,以公众号服务为例: <...> $app = Factory::officialAccount($config); $app->rebind('request', new MyCustomRequest(...)); 这里的 request 为 SDK 内部服务名称。

  • 问题内容: 我正在尝试在Google App Engine中使用多个模块。 我尝试使用此源代码: https://github.com/GoogleCloudPlatform/appengine-modules-helloworld- python 但是我似乎找不到从所有.yaml加载的pycharm运行的方法,因此似乎只有app.yaml加载了。 另外,当尝试将代码上传到Appengine(使用

  • 我是anylogic的新手,所以我不确定如何做这个简单的事情,但是有没有一种方法可以让服务块一次只做一个代理?我在做一个模拟,但似乎如果一个代理去服务块,即使还有另一个代理正在服务,它也会被服务?我不知道如何阻止新的代理时,仍有一个代理服务。请帮帮我.谢谢

  • 我是Java和Spiget-API的新手。我想做一个来检测一个块是否被玩家破坏了。如果是这样,它应该用一个块替换那个块。但是它不起作用,它没有替换块,而是丢弃了一个当然是鹅卵石的项目。 我的代码: :

  • 问题内容: 我正在将一些后端转换为模块,并在设置开发环境配置时感到困惑。我在Eclipse中使用Java,但未在Maven中使用Java。架构非常简单: 前端模块为默认模块。基本的GAE / GWT应用程序。将项目放入任务队列。 后端模块处理任务队列。 使用旧的后端体系结构,一个调试配置将启动开发服务器,该服务器将为GWT DevMode UI 和 后端任务处理提供服务。 问题的症结在于DevMo

  • 严重:初始化连接器[connector[HTTP/1.1-8080]]org.apache.catalina.LifecyCleException失败:尝试为组件[connector[HTTP/1.1-8080]]进行无效的生命周期转换([before_init]),该组件处于状态[INITIALIZED],位于org.apache.catalina.util.LifecyCleBase.inva