Skip to content
On this page

Koncepcja komponentów

Czym są komponenty?

Komponenty to samodzielne jednostki w projekcie realizujące jedną, konkretną funkcjonalność. Ich projektowanie powinno zapewniać maksymalną niezależność i możliwość ponownego użycia w różnych projektach.

Cykl życia komponentu

NOT_INITIALIZEDRUNNINGSHUTDOWN
Obecność w drzewie kontenera
Był już kiedyś aktywny
Posiada referencję do rodzica

Obecność w drzewie kontenera oznacza, że komponent:

  • jest aktywny i wpływa na kontener,
  • jest możliwy do wyszukania w strukturze,
  • może posiadać zadania (Bukkit),
  • może zarządzać zdarzeniami (Bukkit),
  • może nasłuchiwać zdarzeń (@SAPIEvent).
  • może posiadać podrzędne komponenty,

Dodatkowe informacje i powiązania

Typy komponentów

Container

Główny komponent projektu, pełni rolę korzenia w strukturze i zarządza graczami. Do niego dołączane są wszystkie pozostałe komponenty.

  • addPlayer(player) - dodaje gracza do kontenera
  • removePlayer(player) - usuwa gracza z kontenera
  • setGameMap(gameMap) - zmienia mapę rozgrywki na inną
java
public class MyContainer extends Container {
    public MyContainer(JavaPlugin plugin) {
        super(plugin);
    }

    @Override
    protected @NotNull GameMap defaultBoard() {
        return new MyGameMap(this);
    }

    // optional
    @Override
    public void onComponentInit(ComponentConstructor event) {
        new NoCreatureSpawn(this).start();
    }
}

GameMap

Komponent odpowiedzialny za reprezentację mapy w kontenerze. Przykłady użycia mapy znajdziesz w sekcji Generowanie mapy.

Controller

Komponent umożliwiający implementację dodatkowej logiki lub zadań.

java
public class NoCreatureNaturalSpawn extends Controller {
    public NoCreatureNaturalSpawn(Component component) {
        super(component);
    }

    @Override
    public Listeners defineListeners() {
        return super.defineListeners().add(MyListener.class);
    }

    private static final class MyListener implements AdaptedListener {
        @EventHandler(ignoreCancelled = true)
        public void onCreatureSpawn(CreatureSpawnEvent event) {
            if (event.getSpawnReason() != CreatureSpawnEvent.SpawnReason.NATURAL)
                return;
            var container = GameMap.getContainerForEntity(event.getEntity());
            first(container, getClass(), NoCreatureNaturalSpawn.class, noCreatureDrop -> {
                event.setCancelled(true);
            });
        }

    }
}

Uruchamianie

java
var container = new MyContainer(plugin);
container.start();
container.addPlayer(player);