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上对我有效,但每次更新时都必须对其进行测试。