Zum Inhalt

👨‍💻 MineBank API

MineBank stellt eine öffentliche Java-API bereit, über die andere Minecraft-Mods auf Konten, Firmenkonten, Bargeld, Kredite und die Staatskasse zugreifen können.

Der öffentliche Einstiegspunkt lautet:

de.codex.bankmod.BankApi

⚙️ Grundregeln

Bei der Verwendung der API gibt es einige wichtige Regeln.

💶 Cent oder Euro?

Methoden ohne Euros im Namen verwenden Beträge in Cent.

Beispiel:

BankApi.deposit(playerId, 1999);

entspricht:

19,99 €

Methoden mit:

Euros

im Namen nehmen dagegen einen String entgegen.

Beispiel:

BankApi.depositEuros(playerId, "19,99");

🆔 UUIDs richtig verwenden

Spieler- und Firmenkonten verwenden unterschiedliche IDs.

👤 Spielerkonto
→ Spieler-UUID

🏢 Firmenkonto
→ Firmenkonto-UUID

Nicht verwechseln

Funktionen für Spielerkonten erwarten die Spieler-UUID.

Funktionen für Firmenkonten erwarten die UUID des Firmenkontos.


🧵 Serverthread

API-Aufrufe, die Inventare oder Konten verändern, sollten auf dem Serverthread ausgeführt werden.

Die API ist für vertrauenswürdige Servermods vorgesehen.

Aufrufende Mods müssen ihre eigenen Berechtigungen und fachlichen Voraussetzungen prüfen.


👤 Privatkonten

Konto vorhanden?

boolean exists = BankApi.accountExists(playerId);

Kontostand abrufen

long balance = BankApi.getBalance(playerId);

Der Rückgabewert ist ein Centbetrag.


Guthaben prüfen

boolean enough = BankApi.hasBalance(
    playerId,
    5000
);

Euro-Variante:

boolean enough = BankApi.hasBalanceEuros(
    playerId,
    "50,00"
);

📥 Geld gutschreiben

boolean success = BankApi.deposit(
    playerId,
    5000
);

Mit Quelle:

boolean success = BankApi.deposit(
    playerId,
    5000,
    source
);

Euro-Variante:

boolean success = BankApi.depositEuros(
    playerId,
    "50,00",
    source
);

📤 Geld abbuchen

boolean success = BankApi.withdraw(
    playerId,
    5000
);

Euro-Variante:

boolean success = BankApi.withdrawEuros(
    playerId,
    "50,00",
    source
);

💸 Spielerüberweisungen

Für Überweisungen zwischen Spielerkonten stehen gekoppelte Transfermethoden zur Verfügung.

boolean success = BankApi.transfer(
    fromPlayerId,
    toPlayerId,
    1999,
    source
);

Euro-Variante:

boolean success = BankApi.transferEuros(
    fromPlayerId,
    toPlayerId,
    "19,99",
    source
);

Transfermethoden verwenden

Für zusammengehörende Überweisungen sollten die vorgesehenen Transfermethoden verwendet werden, statt selbst zuerst withdraw und anschließend deposit aufzurufen.


💰 Kredite

Die API kann persönliche Kredite abrufen, aufnehmen und zurückzahlen.

Kredite abrufen

List<PersonalLoan> loans =
    BankApi.getPersonalLoans(playerId);

Offene Kredite zählen

int count =
    BankApi.getOpenPersonalLoanCount(playerId);

Kredit aufnehmen

boolean success =
    BankApi.takePersonalLoan(
        playerId,
        amountCents
    );

Euro-Variante:

boolean success =
    BankApi.takePersonalLoanEuros(
        playerId,
        "5000"
    );

Abweichung zum NPC

Die API-Kreditaufnahme verwendet aktuell einen Überladungsweg mit Starttag 0.

Entwickler sollten deshalb nicht automatisch davon ausgehen, dass die relative Erstfälligkeit exakt dem normalen NPC-Kreditablauf entspricht.


Kredit zurückzahlen

long paid =
    BankApi.repayPersonalLoan(
        playerId,
        amountCents
    );

Euro-Variante:

long paid =
    BankApi.repayPersonalLoanEuros(
        playerId,
        "500"
    );

Der Rückgabewert beschreibt den tatsächlich gezahlten Betrag.


🏢 Firmenkonten

Firma erstellen

UUID accountId =
    BankApi.createBusinessAccount(
        owner,
        companyName
    );

Alternativ kann eine Konto-ID mitgegeben werden:

UUID accountId =
    BankApi.createBusinessAccount(
        accountId,
        owner,
        companyName
    );

20.000-€-Gründungsgebühr

createBusinessAccount ist ein technischer Kontoerzeuger.

Die 20.000-€-Gründungsgebühr des normalen Spielerablaufs wird nicht automatisch durch jeden direkten API-Aufruf von createBusinessAccount erhoben.

Integrationen müssen ihren gewünschten Gründungsablauf selbst entsprechend abstimmen.


Firmenkonto vorhanden?

boolean exists =
    BankApi.businessAccountExists(accountId);

Firmenguthaben

long balance =
    BankApi.getBusinessBalance(accountId);

🔎 Firma eines Spielers finden

UUID businessAccountId =
    BankApi.getBusinessAccountForPlayer(
        playerId
    );

Die Methode liefert die Firmenkonto-UUID eines Besitzers oder Mitglieds.

Wird keine Firma gefunden, lautet das Ergebnis:

null

Besitzer haben bei der Zuordnung Vorrang.


Firmeninformationen

Firmenname:

String name =
    BankApi.getBusinessAccountName(
        businessAccountId
    );

Besitzer:

UUID owner =
    BankApi.getBusinessAccountOwner(
        businessAccountId
    );

Mitgliedschaft prüfen:

boolean member =
    BankApi.isBusinessMember(
        businessAccountId,
        playerId
    );

👥 Firmenmitglieder verwalten

Mitglied hinzufügen:

boolean success =
    BankApi.addBusinessMember(
        accountId,
        playerId
    );

Mitglied entfernen:

boolean success =
    BankApi.removeBusinessMember(
        accountId,
        playerId
    );

Besitzer ändern:

boolean success =
    BankApi.changeBusinessOwner(
        accountId,
        newOwner
    );

🏢 Firmenguthaben verändern

Einzahlung:

boolean success =
    BankApi.depositBusiness(
        accountId,
        amountCents,
        source
    );

Euro-Variante:

boolean success =
    BankApi.depositBusinessEuros(
        accountId,
        "19,99",
        source
    );

Auszahlung:

boolean success =
    BankApi.withdrawBusiness(
        accountId,
        amountCents,
        source
    );

💸 Zahlungen an Firmen

Ein Spieler kann über die API Geld an ein Firmenkonto übertragen.

boolean paid =
    BankApi.transferToBusinessEuros(
        player.getUUID(),
        businessAccountId,
        "19,99",
        TransactionSource.CITYSHOP
    );

Damit eignet sich MineBank beispielsweise für Shopsysteme.


🏢 → 👤 Firmenzahlung an Spieler

boolean success =
    BankApi.transferFromBusiness(
        businessAccountId,
        playerId,
        amountCents,
        source
    );

Euro-Variante:

boolean success =
    BankApi.transferFromBusinessEuros(
        businessAccountId,
        playerId,
        "19,99",
        source
    );

🏢 → 🏢 Firmenüberweisung

Auch Überweisungen zwischen zwei Firmenkonten werden unterstützt.

boolean success =
    BankApi.transferBusinessToBusiness(
        fromAccountId,
        toAccountId,
        amountCents,
        source
    );

Euro-Variante:

boolean success =
    BankApi.transferBusinessToBusinessEuros(
        fromAccountId,
        toAccountId,
        "19,99",
        source
    );

💶 Bargeld-API

Bargeldwert ermitteln

long cash =
    BankApi.getCashValue(player);

getCashValue zählt loses Bargeld im Spielerinventar.

Auch ein vom Menücursor gehaltener Bargeldstapel wird berücksichtigt.

Keine rekursive Suche

Bargeld innerhalb von Portemonnaies oder anderen Behältern wird nicht rekursiv mitgezählt.


Bargeld nehmen

boolean success =
    BankApi.takeCash(
        player,
        amountCents
    );

Euro-Variante:

boolean success =
    BankApi.takeCashEuros(
        player,
        "19,99"
    );

Bargeld geben

boolean success =
    BankApi.giveCash(
        player,
        amountCents
    );

Euro-Variante:

boolean success =
    BankApi.giveCashEuros(
        player,
        "19,99"
    );

Keine automatische Gesamttransaktion

takeCash und giveCash sind einzelne Operationen.

Mehrere beliebig kombinierte API-Aufrufe bilden nicht automatisch eine gemeinsame atomare Gesamttransaktion.


🛒 Barzahlung an eine Firma

MineBank besitzt eine speziell dafür vorgesehene Barzahlungsfunktion.

CashPaymentResult result =
    BankApi.payBusinessWithCashEuros(
        player,
        businessAccountId,
        "19,99",
        TransactionSource.CITYSHOP,
        "Einkauf"
    );

Die Barzahlung plant unter anderem:

  • Bargeldentnahme
  • Wechselgeld
  • notwendigen Inventarplatz

Außerdem besitzt die Bank-/Bargeldoperation einen Rückrollpfad, falls die Gutschrift fehlschlägt.

Warenübergabe gehört nicht dazu

Die MineBank-Operation umfasst nicht automatisch die Warenübergabe oder die Speicherung der aufrufenden Shop-Mod.

Diese Logik bleibt Aufgabe der integrierenden Mod.


📝 Parameter note

Der Parameter:

note

von payBusinessWithCash wird in der aktuellen Implementierung nicht als eigener Firmen-Buchungstext gespeichert.

Aus dieser Signatur sollte deshalb keine vollständige Firmen-Buchhaltung mit Verwendungszweckhistorie abgeleitet werden.


🏛️ Staatskassen-API

Besitzer-ID

UUID treasuryId =
    BankApi.getStateTreasuryOwnerId();

IBAN

String iban =
    BankApi.getStateTreasuryIban();

Kontostand

long balance =
    BankApi.getStateTreasuryBalance();

Buchungen

List<StateTreasuryBooking> bookings =
    BankApi.getStateTreasuryBookings();

🚓 Bußgelder

Für CityPolice-artige Integrationen existieren spezielle Methoden.

boolean success =
    BankApi.collectCityPoliceFine(
        playerId,
        amountCents
    );

Mit Notiz:

boolean success =
    BankApi.collectCityPoliceFine(
        playerId,
        amountCents,
        note
    );

Euro-Variante:

boolean success =
    BankApi.collectCityPoliceFineEuros(
        playerId,
        "250",
        note
    );

🏛️ Allgemeine Gebühren

Für allgemeine Gebühren kann Geld vom Spielerkonto an die Staatskasse übertragen werden.

boolean success =
    BankApi.collectToStateTreasury(
        playerId,
        amountCents,
        source,
        note
    );

Euro-Variante:

boolean success =
    BankApi.collectToStateTreasuryEuros(
        playerId,
        "250",
        source,
        note
    );

📥 Administrative Staatskassen-Gutschrift

boolean success =
    BankApi.depositToStateTreasury(
        actorId,
        amountCents
    );

Auch Varianten mit Notiz und Euro-String stehen zur Verfügung.


👨‍💼 Staatskassen-Verwalter

Verwalter prüfen:

boolean manager =
    BankApi.isStateTreasuryManager(
        managerId
    );

Verwalterstatus setzen:

BankApi.setStateTreasuryManager(
    managerId,
    true
);

📤 Staatskasse → Spieler

Über den Verwalterweg:

boolean success =
    BankApi.transferStateTreasuryToPlayer(
        managerId,
        receiverId,
        amountCents
    );

Hierbei existieren ebenfalls Varianten mit Notiz und Euro-Betrag.


⚠️ Allgemeine Staatskassenauszahlung

Zusätzlich existiert:

boolean success =
    BankApi.payFromStateTreasury(
        receiverId,
        amountCents,
        source,
        note
    );

sowie:

boolean success =
    BankApi.payFromStateTreasuryEuros(
        receiverId,
        "250",
        source,
        note
    );

Eigene Berechtigungsprüfung erforderlich

payFromStateTreasury besitzt keinen Verwalterparameter.

Die aufrufende Mod muss deshalb ihre eigene Berechtigungsprüfung durchführen.


📡 Events

MineBank unterstützt BankEventListener.

Listener registrieren:

BankApi.registerListener(listener);

Listener entfernen:

BankApi.unregisterListener(listener);

Ein BankTransactionEvent liefert Informationen wie:

  • Konto-ID
  • Betrag
  • alter Kontostand
  • neuer Kontostand
  • Typ
  • Quelle
  • Gegenkonto
  • Transaktions-ID
  • Zeitstempel

Event ≠ vollständige Buchhaltung

Das Beobachten von Events bedeutet nicht automatisch, dass eine dauerhaft gespeicherte vollständige Transaktionshistorie aller Konten vorhanden ist.


↩️ Rückgabewerte prüfen

Integrationen sollten die Rückgabewerte der API immer prüfen.

Beispielsweise:

boolean success =
    BankApi.depositEuros(
        playerId,
        "100",
        source
    );

if (!success) {
    // Zahlung / Gutschrift fehlgeschlagen
}

Besonders wichtig:

  • boolesche Rückgabewerte prüfen
  • createBusinessAccount kann null liefern
  • Kreditrückzahlung liefert den tatsächlich gezahlten Centbetrag
  • Barzahlungen liefern ein CashPaymentResult

🧩 Beispielintegration: Shop

Ein Shopsystem könnte MineBank beispielsweise so verwenden:

🛒 Spieler kauft Ware
        ↓
🏢 Firmenkonto des Shops ermitteln
        ↓
💶 Preis 19,99 €
        ↓
BankApi.transferToBusinessEuros(...)
        ↓
   ┌────┴────┐
   │         │
 true      false
   │         │
   ↓         ↓
Ware      Kauf
geben    abbrechen

Die Warenübergabe bleibt Aufgabe der Shop-Mod.


🧩 Typische Integrationen

Integration MineBank-Funktionen
CityShop Firmenzuordnung, Mitarbeiterabfrage, Kontozahlungen, atomare Barzahlung
CityRegion Spielerkonto-Zahlungen und Gebühren an die Staatskasse
CityPolice Bußgelder vom Spielerkonto an die Staatskasse

Diese Namen beschreiben die in der MineBank-Dokumentation vorgesehenen Integrationsbeispiele. Ob eine konkrete externe Mod die API tatsächlich verwendet, muss separat geprüft werden.


📚 Öffentliche API-Signaturen

Die folgenden Methoden entsprechen den dokumentierten öffentlichen statischen Methoden aus BankApi.java.

public static void bindServer(MinecraftServer server);
public static void clearServer(MinecraftServer server);

public static boolean accountExists(UUID playerId);
public static long getBalance(UUID playerId);
public static boolean hasBalance(UUID playerId, long amountCents);
public static boolean hasBalanceEuros(UUID playerId, String amountEuros);

public static boolean deposit(UUID playerId, long amountCents);
public static boolean deposit(UUID playerId, long amountCents, TransactionSource source);
public static boolean depositEuros(UUID playerId, String amountEuros);
public static boolean depositEuros(UUID playerId, String amountEuros, TransactionSource source);

public static boolean withdraw(UUID playerId, long amountCents);
public static boolean withdraw(UUID playerId, long amountCents, TransactionSource source);
public static boolean withdrawEuros(UUID playerId, String amountEuros);
public static boolean withdrawEuros(UUID playerId, String amountEuros, TransactionSource source);

public static boolean transfer(UUID fromPlayerId, UUID toPlayerId, long amountCents);
public static boolean transfer(UUID fromPlayerId, UUID toPlayerId, long amountCents, TransactionSource source);
public static boolean transferEuros(UUID fromPlayerId, UUID toPlayerId, String amountEuros);
public static boolean transferEuros(UUID fromPlayerId, UUID toPlayerId, String amountEuros, TransactionSource source);

public static List<PersonalLoan> getPersonalLoans(UUID playerId);
public static int getOpenPersonalLoanCount(UUID playerId);
public static boolean takePersonalLoan(UUID playerId, long amountCents);
public static boolean takePersonalLoanEuros(UUID playerId, String amountEuros);
public static long repayPersonalLoan(UUID playerId, long amountCents);
public static long repayPersonalLoanEuros(UUID playerId, String amountEuros);

public static UUID createBusinessAccount(UUID owner, String companyName);
public static UUID createBusinessAccount(UUID accountId, UUID owner, String companyName);
public static boolean businessAccountExists(UUID accountId);
public static long getBusinessBalance(UUID accountId);
public static UUID getBusinessAccountForPlayer(UUID playerId);
public static String getBusinessAccountName(UUID businessAccountId);
public static UUID getBusinessAccountOwner(UUID businessAccountId);
public static boolean isBusinessMember(UUID businessAccountId, UUID playerId);

public static boolean depositBusiness(UUID accountId, long amountCents, TransactionSource source);
public static boolean depositBusinessEuros(UUID accountId, String amountEuros, TransactionSource source);
public static boolean withdrawBusiness(UUID accountId, long amountCents, TransactionSource source);
public static boolean withdrawBusinessEuros(UUID accountId, String amountEuros, TransactionSource source);

public static boolean transferToBusiness(UUID playerId, UUID accountId, long amountCents, TransactionSource source);
public static boolean transferToBusinessEuros(UUID playerId, UUID accountId, String amountEuros, TransactionSource source);
public static boolean transferFromBusiness(UUID accountId, UUID playerId, long amountCents, TransactionSource source);
public static boolean transferFromBusinessEuros(UUID accountId, UUID playerId, String amountEuros, TransactionSource source);
public static boolean transferBusinessToBusiness(UUID fromAccountId, UUID toAccountId, long amountCents, TransactionSource source);
public static boolean transferBusinessToBusinessEuros(UUID fromAccountId, UUID toAccountId, String amountEuros, TransactionSource source);

public static boolean addBusinessMember(UUID accountId, UUID playerId);
public static boolean removeBusinessMember(UUID accountId, UUID playerId);
public static boolean changeBusinessOwner(UUID accountId, UUID newOwner);

public static long getCashValue(Player player);
public static boolean takeCash(Player player, long amountCents);
public static boolean takeCashEuros(Player player, String amountEuros);
public static boolean giveCash(Player player, long amountCents);
public static boolean giveCashEuros(Player player, String amountEuros);

public static boolean depositCashToBusiness(UUID businessAccountId, Player player, long amountCents, TransactionSource source);
public static boolean depositCashToBusinessEuros(UUID businessAccountId, Player player, String amountEuros, TransactionSource source);

public static CashPaymentResult payBusinessWithCash(Player player, UUID businessAccountId, long amountCents, TransactionSource source, String note);
public static CashPaymentResult payBusinessWithCashEuros(Player player, UUID businessAccountId, String amountEuros, TransactionSource source, String note);

public static UUID getStateTreasuryOwnerId();
public static String getStateTreasuryIban();
public static long getStateTreasuryBalance();
public static java.util.List<StateTreasuryBooking> getStateTreasuryBookings();

public static boolean collectCityPoliceFine(UUID playerId, long amountCents);
public static boolean collectCityPoliceFine(UUID playerId, long amountCents, String note);
public static boolean collectCityPoliceFineEuros(UUID playerId, String amountEuros, String note);

public static boolean collectToStateTreasury(UUID playerId, long amountCents, TransactionSource source, String note);
public static boolean collectToStateTreasuryEuros(UUID playerId, String amountEuros, TransactionSource source, String note);

public static boolean depositToStateTreasury(UUID actorId, long amountCents);
public static boolean depositToStateTreasury(UUID actorId, long amountCents, String note);
public static boolean depositToStateTreasuryEuros(UUID actorId, String amountEuros, String note);

public static boolean isStateTreasuryManager(UUID managerId);
public static void setStateTreasuryManager(UUID managerId, boolean allowed);

public static boolean transferStateTreasuryToPlayer(UUID managerId, UUID receiverId, long amountCents);
public static boolean transferStateTreasuryToPlayer(UUID managerId, UUID receiverId, long amountCents, String note);
public static boolean transferStateTreasuryToPlayerEuros(UUID managerId, UUID receiverId, String amountEuros, String note);

public static boolean payFromStateTreasury(UUID receiverId, long amountCents, TransactionSource source, String note);
public static boolean payFromStateTreasuryEuros(UUID receiverId, String amountEuros, TransactionSource source, String note);

public static void registerListener(BankEventListener listener);
public static void unregisterListener(BankEventListener listener);

Technische Methoden

bindServer und clearServer sind technische Lebenszyklusmethoden.

Sie sind keine Spielerfunktionen oder Minecraft-Befehle.


➡️ Nächster Schritt

Für konkrete Beispiele zur Zusammenarbeit von MineBank mit anderen Mods gibt es eine eigene Seite:

Weiter: 🔌 Integrationen