Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建具有特定ID的地图视图?_Java_Minecraft_Bukkit - Fatal编程技术网

Java 如何创建具有特定ID的地图视图?

Java 如何创建具有特定ID的地图视图?,java,minecraft,bukkit,Java,Minecraft,Bukkit,我知道可以使用Bukkit.getServer().createMap(Bukkit.getWorld(“world”))创建一个映射但是这将创建一个具有第一个可用id的映射。假设我要创建一个id为10000的映射。当我尝试使用Bukkit.getServer().getMap(10000)它返回null,因为此映射不存在 如何创建具有特定ID的地图视图?它很难看,但可以工作: import net.minecraft.server.v1_11_R1.WorldMap; import net.m

我知道可以使用
Bukkit.getServer().createMap(Bukkit.getWorld(“world”))创建一个映射但是这将创建一个具有第一个可用id的映射。假设我要创建一个id为10000的映射。当我尝试使用
Bukkit.getServer().getMap(10000)它返回null,因为此映射不存在


如何创建具有特定ID的地图视图?

它很难看,但可以工作:

import net.minecraft.server.v1_11_R1.WorldMap;
import net.minecraft.server.v1_11_R1.WorldServer;

public static MapView createMap(World world, int id) {
    WorldServer ws = ((CraftWorld) world).getHandle();
    String name = "map_" + id;
    WorldMap map = new WorldMap(name);
    map.scale = 3;
    map.a(ws.getWorldData().b(), ws.getWorldData().d(), map.scale);
    map.map = (byte) ws.dimension;
    map.c();
    ws.getServer().getServer().worlds.get(0).a(name, map);
    MapInitializeEvent event = new MapInitializeEvent(map.mapView);
    Bukkit.getServer().getPluginManager().callEvent(event);
    return map.mapView;
}
仅在Spigot 1.11.2上测试,但此方法应适用于其他版本。我刚刚修改了NMS现有代码以使用自定义ID


这是一个相当低级别的NMS,因此如果这种方法从现在起在一些更新中不再有效,我也不会感到惊讶。

这很难看,但它可以工作:

import net.minecraft.server.v1_11_R1.WorldMap;
import net.minecraft.server.v1_11_R1.WorldServer;

public static MapView createMap(World world, int id) {
    WorldServer ws = ((CraftWorld) world).getHandle();
    String name = "map_" + id;
    WorldMap map = new WorldMap(name);
    map.scale = 3;
    map.a(ws.getWorldData().b(), ws.getWorldData().d(), map.scale);
    map.map = (byte) ws.dimension;
    map.c();
    ws.getServer().getServer().worlds.get(0).a(name, map);
    MapInitializeEvent event = new MapInitializeEvent(map.mapView);
    Bukkit.getServer().getPluginManager().callEvent(event);
    return map.mapView;
}
仅在Spigot 1.11.2上测试,但此方法应适用于其他版本。我刚刚修改了NMS现有代码以使用自定义ID


这是一个相当低级别的NMS,因此,如果从现在起,这种方法在几次更新后不再有效,我也不会感到惊讶。

为什么您需要这个功能?去国家导弹防御系统永远不会成功recommended@Kerooker我正在创建一个每分钟刷新一次的显示画面。我不想冒覆盖其他地图的风险。我选择10000是因为用户生成的地图可能永远不会达到那个id。另外,你为什么不推荐NMS呢?这是因为它可以在不同版本之间中断,还是因为其他原因?可能在不同版本之间中断,并且很难正确实现性能。我建议您创建一个新的世界,一个空的、未加载的、无法访问的世界,然后从那里创建映射。生成的ID将为空,并且您不会覆盖mapsWhy您需要此函数?去国家导弹防御系统永远不会成功recommended@Kerooker我正在创建一个每分钟刷新一次的显示画面。我不想冒覆盖其他地图的风险。我选择10000是因为用户生成的地图可能永远不会达到那个id。另外,你为什么不推荐NMS呢?这是因为它可以在不同版本之间中断,还是因为其他原因?可能在不同版本之间中断,并且很难正确实现性能。我建议您创建一个新的世界,一个空的、未加载的、无法访问的世界,然后从那里创建映射。生成的ID将为空,并且您不会覆盖Maps。这将使用下一个可用ID生成一个映射,就像使用
Bukkit.getServer().CreateMap(world)时一样@nelson2tm尝试一下。它在1.11.2上对我有效,但每次更新时都必须对其进行测试。这只会生成一个带有下一个可用ID的映射,就像使用
Bukkit.getServer().CreateMap(world)一样@nelson2tm尝试一下。它在1.11.2上对我有效,但每次更新时都必须对其进行测试。