2017-06-26 14 views
1

Bukkit.getServer().createMap(Bukkit.getWorld("world"));で地図を作成することは可能ですが、最初に利用可能なIDを持つ地図が作成されます。 idを10000にしてマップを作成したいとします。Bukkit.getServer().getMap(10000);を使用しようとすると、このマップが存在しないためnullが返されます。特定のIDを持つMapViewを作成するにはどうすればよいですか?

特定のIDを使用してMapViewを作成するにはどうすればよいですか?

+0

なぜこの機能が必要ですか? NMSを使うことはお勧めできません。 – Kerooker

+0

@Kerooker私は1分ごとに最新の画像を表示しています。私は他のマップを上書きする危険を冒したくありません。私は10000を選択しました。なぜなら、ユーザーが生成したマップはおそらくそのIDに到達しないからです。また、NMSをお勧めしませんか?バージョン間で破損する可能性があるのでしょうか、それとも何か他の理由がありますか? – nelson2tm

+0

バージョン間で問題が発生する可能性があり、パフォーマンスを正しく実装するのが難しい – Kerooker

答えて

0

それは醜いですが、それは動作します:

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; 
} 

のみスピゴット1.11.2でテストされますが、この方法は、いくつかの他のバージョンで動作するはずです。私は、カスタムIDを使用するようにNMSの既存のコードを変更しました。

これはかなり低いレベルのNMSですので、この方法では今からいくつかの更新が機能しなくなっても驚かないでしょう。

+0

これは、 'Bukkit.getServer()。CreateMap(world);'を使用した場合のように、次の利用可能なIDでマップを作成します。 – nelson2tm

+0

@ nelson2tmこの。私は1.11.2で動作しますが、アップデートするたびにテストする必要があります。 – kmecpp

関連する問題