0

これが本当に意味を成すかどうかはわかりませんが(私は自分自身を少し混乱させました)、私がやろうとしているのはミニゲームプラグインを作成することであり、それをマップ間で循環させようとしています。 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();
}

世界に一つしかないからです。

4

2 に答える 2

1

重要なのは、ワールド オブジェクトに対して統一されたインターフェイスを定義する必要があるということです。次に、同じメソッド (基本クラス/インターフェースで定義) を呼び出すことができ、ポリモーフィズムを通じて各サブクラスが異なる反応を示すことができます。

interface World{
    public void onBreakEvent(BlockBreakEvent e);
}

class World1 extends BaseGame implements World{
    public void onBreakEvent(BlockBreakEvent e) {
        System.out.println("Breaking from world 1")
    }
}

class World2 extends BaseGame implements World{
    public void onBreakEvent(BlockBreakEvent  e) {
        System.out.println("Breaking from world 2")
    }
}

これを呼び出すplugin.mapCycler.getCurrentWorld()と、オブジェクトが返されます。つまり、インターフェイスWorldが実装されます。World各オブジェクトは異なる反応を示す可能性がありますが、それらはすべてインターフェイスを共有しているため、同じであるかのように扱うことができます。

plugin.mapCycler.getCurrentWorld().onBreakEvent(event);
于 2013-04-04T16:21:11.047 に答える