これが本当に意味を成すかどうかはわかりませんが(私は自分自身を少し混乱させました)、私がやろうとしているのはミニゲームプラグインを作成することであり、それをマップ間で循環させようとしています。 BaseGame を拡張する新しいクラス プラグイン インスタンス、ワールド名、および xml ファイル名をスーパー クラス BaseGame に渡します。basegame クラスは、xml ファイルからの情報を解析し、変数を設定します。ほとんどのマップにはさまざまなゲーム タイプがあるため、BaseGame を拡張するクラスの側にいくつかのメソッドがあります。たとえば、TDM では、さまざまなイベントに対してさまざまなことを行う必要があります。プレーヤーがこれを壊すのを止める必要があるため、リスナーでこれを行いたい
@EventHandler
public void blockDestroy(BlockBreakEvent event) {
plugin.mapCycler.getCurrentWorld().onBreakEvent(event);
}
私が直面している問題は、MapCycler クラスから現在のワールドを返すことです。すべてのマップ クラスには異なるメソッドがあるためです。BaseGame を拡張するすべてのマップ クラスを返すことができるジェネリック メソッドでマップ クラスを返す方法が必要ですが、それでもできる必要があります。 BaseGame を拡張するクラス内のメソッドにアクセスします。
さらに明確にする必要がある場合は教えてください。
ありがとう
編集1:
BaseGame クラスでは、BaseGame を拡張するすべてのワールド クラスで使用される共通のメソッドです。たとえば、これらのメソッドは、BaseGame を拡張するすべてのクラスで使用されます。
public String getMapName() {
return xmlFileReader.getMapName();
}
public String getMapObjective() {
return xmlFileReader.getMapObjective();
}
public void resetInventory(Player player) {
player.getInventory().clear();
player.getInventory().setArmorContents(null);
player.setHealth(20);
player.setFlying(false);
player.setGameMode(GameMode.SURVIVAL);
player.setFoodLevel(20);
}
BaseGame クラスを拡張するクラスには、たとえば世界に関連する独自のメソッドがあります。
public void blueWin() {
Bukkit.getServer().broadcastMessage(Messages.colorize("Blue win - nice message in update"));
for(String player : blueTeamList) {
Player blue = Bukkit.getServer().getPlayer(player);
resetInventory(blue);
Packet206SetScoreboardObjective packet = new Packet206SetScoreboardObjective(plugin.relicWorld.sb.getObjective(plugin.relicWorld.name), 1);//Create Scoreboard create packet
sendPacket(blue, packet);
String loc = DatabaseManager.getLastLoc("SELECT * FROM ag_users WHERE user = \'" + blue.getName() + "\'");
blue.teleport(LocationManager.stringToLoc(loc));
Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "eco give " + blue.getName() + " 250");
}
for(String player : redTeamList) {
Player red = Bukkit.getServer().getPlayer(player);
resetInventory(red);
Packet206SetScoreboardObjective packet = new Packet206SetScoreboardObjective(plugin.relicWorld.sb.getObjective(plugin.relicWorld.name), 1);//Create Scoreboard create packet
sendPacket(red, packet);
String loc = DatabaseManager.getLastLoc("SELECT * FROM ag_users WHERE user = \'" + red.getName() + "\'");
red.teleport(LocationManager.stringToLoc(loc));
Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "eco give " + red.getName() + " 50");
}
Bukkit.unloadWorld(getWorld(), false);
resetAll();
}
世界に一つしかないからです。