Beispiel: Solo Minigame

Aktualisiert: 14.11.2017
Beispiel Plugin: QuickSG


Was is ein Solo Minigame?
In einem Solo Minigame spielen alle Spieler gegen andere Spieler (keine Teams). Als Locations werden Spawns gesetzt!

Beispiele für SoloMinigames:
PvP, JumpDown, OITC, OneLine, QuickSG, SurvivalGames, usw.


Vorarbeit:

Schritt für Schritt:

  1. Erstelle ein neues Java Projekt
  2. Erstelle eine Plugin.yml (siehe Beispiel)
  3. Erstelle eine Main in einem bereits erstellten Packgage
  4. Erstelle die Instancen

Instancen:

  private static Main instance;
  private static Minigame minigame;

  @Override
  public void onEnable() {
      instance = this;
      this.getCommand("mg").setExecutor(this);
      this.getCommand("mg").setTabCompleter(this);
      loadMinigame();
  }

  @Override
  public void onDisable() {
    instance = null;
    getMinigame().endMinigame();
  }

  public static Main getInstance() {
    return instance;
  }

  public static Minigame getMinigame() {
    return minigame;
  }

1. Erstelle das Minigame:

In diesem Fall wird das Minigame in einer Methode erstellt (loadMinigame(); --> siehe "Vorarbeit" onEnable)

minigame = new Minigame(Name des Minigames, Prefix des Minigames, Plugin Instance);

// Minigame ####################################
minigame = new Minigame("QuickSG", "&6QuickSG &f[unicode->>] &7", getInstance());

2. Füge die Listener hinzu:

Mit den ArenaListenern kannst du die Listener in den Arenen aktivieren oder deaktivieren (z.B.: Block Break, Damage, Hunger, usw.)

minigame.addArenaListener(arena state, arenalistener);

// Listener ####################################
minigame.addArenaListener(ArenaState.Lobby, AListener.BLOCK_BREAK);
minigame.addArenaListener(ArenaState.Lobby, AListener.BLOCK_PLACE);
minigame.addArenaListener(ArenaState.Lobby, AListener.BLOCK_DAMAGE);
minigame.addArenaListener(ArenaState.Lobby, AListener.BLOCK_HUNGER);
minigame.addArenaListener(ArenaState.Lobby, AListener.BLOCK_INVENTORY_CLICK);
minigame.addArenaListener(ArenaState.Lobby, AListener.BLOCK_DROP_ITEM);
minigame.addArenaListener(ArenaState.InGame, AListener.BLOCK_BREAK);
minigame.addArenaListener(ArenaState.InGame, AListener.BLOCK_PLACE);
minigame.addArenaListener(ArenaState.Ending, AListener.BLOCK_BREAK);
minigame.addArenaListener(ArenaState.Ending, AListener.BLOCK_PLACE);
minigame.addArenaListener(ArenaState.Ending, AListener.BLOCK_DAMAGE);
minigame.addArenaListener(ArenaState.Ending, AListener.BLOCK_HUNGER);
minigame.addArenaListener(ArenaState.Ending, AListener.BLOCK_DROP_ITEM);

3. Die Commands:

Ohne Commands funktioniert keines der Minigames, weil man es sonst nicht benutzen könnte.
Du kannst alle Commands einzeln hinzufügen oder sie als Sammlung hinzufügen, dadurch ist es einfacher neue Commands hinzuzufügen!

Auf dieser Seite findest du mehr Informationen und eine Liste aller verfügbaren Commands: >> Link

// Commands ####################################
minigame.setCommandArea(CommandArea.ARENA_SPAWNS);
minigame.addCommand(MinigameCommands.ARENA_SETUP_HELP.getCommand());

4. Sie Settings:

Die Settings werden nicht zwangsweise benötigt. Mit ihnen können bestimmte Sachen aktiviert oder deaktiviert werden (z.B.: Teams, ItemSpawner, Schutzzeit, usw.)

Auf dieser Seite findest du mehr Informationen und eine Liste aller verfügbaren Settings: >> Link

// Settings ####################################
minigame.addSetting(MinigameSetting.ENABLE_SPECTATOR_ON_DEATH);
minigame.addSetting(MinigameSetting.ENABLE_INGAME_FREEZE);
minigame.addSetting(MinigameSetting.ENABLE_PROTECTIONTIME);

5. Minigamesetup:

Wichtig: Du darfst das Minigame nur am Ende (der Methode) erstellen bzw. laden, sonst könnte es zu schwerwiegenden Fehlern kommen!

minigame.setupMinigame();

6. Kommandos und der TabComplete:

Damit du die Kommandos auch benutzen kannst. musst dus sie registrieren:

@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
  if (!(sender instanceof Player)) {
    Bukkit.getConsoleSender().sendMessage("§cYou have to be a Player!");
    return false;
  }
  Player p = (Player) sender;
  if (cmd.getName().equalsIgnoreCase("mg")) {
    getMinigame().setupCommands(p, args);

  }
  return false;
}

@Override
public List onTabComplete(CommandSender sender, Command cmd, String arg2, String[] args) {
  if (!(sender instanceof Player)) {
    return null;
  }
  Player p = (Player) sender;
   if (cmd.getName().equalsIgnoreCase("mg")) {
     return getMinigame().setupTabComplete(p, args);
   }
   return null;
}

7. Eigene Kommandos benutzen bzw. erstellen:

In der "loading" Methode musst du erst einmal deinen neuen Command erstellen:

minigame.addCommand(new MinigameCommand(commandname, description, commandtype));

Als Nächstes erstellst du den Command wie gewohnt:

@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
   if (!(sender instanceof Player)) {
    Bukkit.getConsoleSender().sendMessage("§cYou have to be a Player!");
     return false;
   }
  Player p = (Player) sender;
   if (cmd.getName().equalsIgnoreCase("quicksg") || cmd.getName().equalsIgnoreCase("qsg")) {
    getMinigame().setupCommands(p, args);

    if (args.length == 1) {
       if (args[0].equalsIgnoreCase("setuphelp")) {
         if (minigame.hasSetupPermission(p)) {
          p.sendMessage("");
           p.sendMessage("   §f» §a§l" + minigame.getName() + "-Setup");
           p.sendMessage("");
           p.sendMessage("§f● §a1. §7Set the lobby location with §f/qsg setLobby [arena]§7.");
           p.sendMessage(
               "§f● §a2. §7Set the lobby bound locations with §f/qsg setlobbybounds [arena] [low/high]§7.");
           p.sendMessage("§f● §a3. §7Set the spawns with §f/qsg setSpawn [arena]§7.");
           p.sendMessage("§f● §a4. §7Set the spectator location with §f/qsg setSpectator [arena]§7.");
           p.sendMessage(
               "§f● §a5. §7Set the ingame bound locations with §f/qsg setingamebounds [arena] [low/high]§7.");
           p.sendMessage("§f● §a6. §7Save the arena with §f/qsg finish [arena]§7.");
           p.sendMessage("");
         }
      }
    }
  }
  return false;
}

In diesem Beispiel wird ein Setup-Help-Command erstellt, der auch per Liste hinzugefügt werden kann! (--> Siehe Punkt 3). Aber die Vorgehensweise bleibt immer gleich.


8. Kits/Kisten hinzufügen:

Kits kannst du ganz Einfach hinzufügen: Du musst einfach einen neuen Sourcefolder hinzufügen (z.B.: "files") und die Kits.yml in ihn hinein ziehen! Beim Starten des Servers wird die Datei in den Minigame Ordner kopiert und geladen.


9. Den Shop aktivieren:

Als Erstes musst du ihn per Setting aktivieren:
minigame.addSetting(MinigameSetting.ENABLE_SHOP);

Danach musst die die (fertige) Shop.yml in den Sourcefolder ziehen und den Server reloaden.

Als letztes kannst du noch den Shop (Entity) aktivieren, indem du den SPAWN_SHOP Command hinzufügst.


Der gesammte Code:

Plugin.yml:

name: QuickSG
author: MindoTV
version: 1.1
main: me.mindo.QuickSG.Main
commands:
  quicksg:
  qsg:


Chests.yml: Link

Kits.yml: Link

Main: Link


Extra: Wie kann ich ein Minigame kopieren?

Wenn du QuickSG kopieren möchtest, um beispielsweise eine andere Variante mit anderem Kisteninhalt benutzen zu können, musst du folgendes machen:

  1. Ändere den Path des Packgages: von me.mindo.QuickSG zu me.mindo.QuickSG2
  2. Ändere den Namen, den main (Path) und die Kommandonamen in der Plugin.yml
  3. Ändere die Kommandonamen in der Main
  4. Ändere den Name und den Prefix
  5. Ecportiere das Plugin