Menü aufrufen
Toggle preferences menu
Persönliches Menü aufrufen
Nicht angemeldet
Ihre IP-Adresse wird öffentlich sichtbar sein, wenn Sie Änderungen vornehmen.

Version 0.5.0-SNAPSHOT Modding: Unterschied zwischen den Versionen

Aus Underground Simulator Wiki
Die Seite wurde neu angelegt: „Dies ist eine Seite über die Version 0.5.0-SNAPSHOT. Falls ihr keine Ahnung habt, wie das Modding beim US funktioniert, Modding des Underground Simulator ist DER Guide. ==Worum gehts?== die Version v0.5.0-SNAPSHOT ist ein riesen mega Update, und eine helle Stunde für das Modding des US. Hier wird erklärt, wie das zustande kommt. ==Was gibt es neues?== * ShopItems * ShopActionHandlers * #ShopItemRegistry|Sh…“
 
Keine Bearbeitungszusammenfassung
Zeile 6: Zeile 6:
* [[#ShopActionHandler|ShopActionHandlers]]
* [[#ShopActionHandler|ShopActionHandlers]]
* [[#ShopItemRegistry|ShopItemRegistry]]
* [[#ShopItemRegistry|ShopItemRegistry]]
* [[#ShopV3|Verkürzung d. Shops]]
==Theorie der Modularisierung hinter diesem Projekt==
Ich habe mir überlegt, dass es schlau wäre, den Shop zu modularisieren, d.h. in einzelne, veränderbare Teile zu zerlegen, um sowohl die Erweiterung deutlich einfacher zu gestalten, als auch um Modding für den Shop möglich zu machen. Ohne lange drum herum zu labern, habe ich hier die Doku/Guide für die neuen Shop Klassen:
=ShopItem=
==Konstruktor==
===Parameter:===
* String: ID d. Items
* String: Benutzeroberflächenname d. Items
* double: Preis d. Items
* String: Auszuführende Aktions-ID, z.B. addFahrer
* String: ??? (Value)
* int: Anzahl/Menge d. Items
==Werte & Felder==
S. Oben
==Getter & Setter==
*id: getId()
*name: getName()
*price: getPrice(), setPrice(double)
*action: getAction(), setAction(String)
*value: getValue(), setValue(String)
*amount: getAmount(), setAmount(int)
==Erklärung==
Klasse zum erstellen eines Items, zum registrieren beim ShopItemRegistry.
==andere Methoden==
---
=ShopActionHandler=
<h2><i>Interface!</i></h2>
==Methoden==
'''boolean supports(String action)''':
gibt einen String mit der jeweiligen Action, und gibt <i>true</i> zurück, wenn dieser ActionHandler die Action handlen kann, sonst <i>false</i>.
'''void execute(ShopItem si) throws Exception''': handlet für das jeweilige Item das hinzufügen zu Firma/Score/Etc. Das ist dem Entwickler überlassen. es kann auch einfach garnichts passieren.
=ShopItemRegistry=
Die ShopItemRegistry ist eine Klasse, um die Daten von ShopItems und ShopActionHandlers zu verwalten und -arbeiten. D.h.: Item- & Handlerdaten werden in dieser Klasse gespeichert. Käufe werden außderdem in dieser Klasse an ihre Handlers übermittelt.
==Getters & Setters==
*items: getItems()
*handlers: getHandlers()
*this: getInstance()
*buyed: getBuyed()
==Werte & Felder==
handlers: ArrayList<ShopActionHandler>
items: ArrayList<ShopItem>
buyed: HashMap<ShopItem, Integer>
this: ShopItemRegistry
==Methoden==
'''register(ShopItem)''': Shopitem registrieren
'''registerHandler(ShopActionHandler)''': Handler registrieren
'''unregister(ShopItem)''': ShopItem wieder löschen
'''unregisterHandler(ShopActionHandler)''': Handler wieder löschen
'''handleBuy(ShopItem)''': ShopItem dem nächst zur Verfügung stehenden, dieser Action unterstützenden Handler übergeben
=ShopV3=
dies ist nur noch ein ganz kurzer Text, mit dem ich hiermit offiziell die Modularisierung anbeten möchte. sie hat den Shop.java-Code von 102 Zeilen im originalen zum jetzigen ShopV3.java mit nur noch 38 Zeilen gemacht. Zwar mit 3 Extraklassen, aber dafür für das Hinzufügen von so vielen Features, dass man dafür einen Wikieintrag schreiben kann, ordentlich! Glaubt ihr's kaum: Doch!
<pre>package de.qstudios.underground.dev;
import java.io.IOException;
import java.util.Map;
import java.util.Scanner;
import java.util.UUID;
import de.qstudios.underground.Main;
import de.qstudios.underground.util.API;
public class ShopV3 {
    public static void shop(String wahl2, Scanner scan) {
        System.out.println("Produkte:");
        for (ShopItem si : ShopItemRegistry.getItems()) {
            System.out.println(si.getName() + " (" + si.getPrice() + "): H (wie hinzufügen) | Weiter: Enter");
            wahl2 = scan.nextLine().trim();
            int input = 0;
            try {
        input = System.in.read(); // liest ein Byte
            } catch (IOException e) {
                FehlerReporter.report(UUID.fromString(API.uuidStart), e.getMessage(), e.getClass().toString(), Main.getStackTraceAsString(e));
                }
        char c = (char) input;
            int wahl3;
            if (wahl2.equalsIgnoreCase("H")) {
                System.out.println(
                        "Wie viele wollen sie hinzufügen? WARNUNG! WENN SIE KEINE ZAHL EINGEBEN, GIBT ES EINEN FEHLER!");
                wahl3 = (int) c;
                System.out.println("OK, du hast jetzt " + wahl3 + " mal " + si.getName() + " hinzugefügt!");
                si.setAmount(wahl3);
                ShopItemRegistry.handleBuy(si);
            }
        }
        System.out.println("*BONG*");
        int endsumme = 0;
        // Wir gehen über das "entrySet()", das Paare aus Key und Value enthält
        for (Map.Entry<ShopItem, Integer> entry : ShopItemRegistry.getBuyed().entrySet()) {
            ShopItem item = entry.getKey();
            Integer amount = entry.getValue();
            if (amount > 0) {
                System.out.println(
                        item.getName() + " hinzugefügt " + amount + "x  |  " + item.getPrice() * amount + "€");
                endsumme += item.getPrice() * amount;
            }
        }
        System.out.println("*Transaktion Erfolgreich* - Endsumme: " + endsumme + " | Aktueller Kontostand: "
                + API.firma.getGeld());
    }
}
</pre>
Öhöhpm, falls ihr Denkfehler o.ä. seht in diesem Code, schreibt [mailto:info@deepslatesmp.de mir]. Danke.

Version vom 2. April 2026, 21:26 Uhr

Dies ist eine Seite über die Version 0.5.0-SNAPSHOT. Falls ihr keine Ahnung habt, wie das Modding beim US funktioniert, Modding des Underground Simulator ist DER Guide.

Worum gehts?

die Version v0.5.0-SNAPSHOT ist ein riesen mega Update, und eine helle Stunde für das Modding des US. Hier wird erklärt, wie das zustande kommt.

Was gibt es neues?

Theorie der Modularisierung hinter diesem Projekt

Ich habe mir überlegt, dass es schlau wäre, den Shop zu modularisieren, d.h. in einzelne, veränderbare Teile zu zerlegen, um sowohl die Erweiterung deutlich einfacher zu gestalten, als auch um Modding für den Shop möglich zu machen. Ohne lange drum herum zu labern, habe ich hier die Doku/Guide für die neuen Shop Klassen:

ShopItem

Konstruktor

Parameter:

  • String: ID d. Items
  • String: Benutzeroberflächenname d. Items
  • double: Preis d. Items
  • String: Auszuführende Aktions-ID, z.B. addFahrer
  • String: ??? (Value)
  • int: Anzahl/Menge d. Items

Werte & Felder

S. Oben

Getter & Setter

  • id: getId()
  • name: getName()
  • price: getPrice(), setPrice(double)
  • action: getAction(), setAction(String)
  • value: getValue(), setValue(String)
  • amount: getAmount(), setAmount(int)

Erklärung

Klasse zum erstellen eines Items, zum registrieren beim ShopItemRegistry.

andere Methoden

---

ShopActionHandler

Interface!

Methoden

boolean supports(String action): gibt einen String mit der jeweiligen Action, und gibt true zurück, wenn dieser ActionHandler die Action handlen kann, sonst false.

void execute(ShopItem si) throws Exception: handlet für das jeweilige Item das hinzufügen zu Firma/Score/Etc. Das ist dem Entwickler überlassen. es kann auch einfach garnichts passieren.

ShopItemRegistry

Die ShopItemRegistry ist eine Klasse, um die Daten von ShopItems und ShopActionHandlers zu verwalten und -arbeiten. D.h.: Item- & Handlerdaten werden in dieser Klasse gespeichert. Käufe werden außderdem in dieser Klasse an ihre Handlers übermittelt.

Getters & Setters

  • items: getItems()
  • handlers: getHandlers()
  • this: getInstance()
  • buyed: getBuyed()

Werte & Felder

handlers: ArrayList<ShopActionHandler> items: ArrayList<ShopItem> buyed: HashMap<ShopItem, Integer> this: ShopItemRegistry

Methoden

register(ShopItem): Shopitem registrieren registerHandler(ShopActionHandler): Handler registrieren unregister(ShopItem): ShopItem wieder löschen unregisterHandler(ShopActionHandler): Handler wieder löschen handleBuy(ShopItem): ShopItem dem nächst zur Verfügung stehenden, dieser Action unterstützenden Handler übergeben

ShopV3

dies ist nur noch ein ganz kurzer Text, mit dem ich hiermit offiziell die Modularisierung anbeten möchte. sie hat den Shop.java-Code von 102 Zeilen im originalen zum jetzigen ShopV3.java mit nur noch 38 Zeilen gemacht. Zwar mit 3 Extraklassen, aber dafür für das Hinzufügen von so vielen Features, dass man dafür einen Wikieintrag schreiben kann, ordentlich! Glaubt ihr's kaum: Doch!

package de.qstudios.underground.dev;

import java.io.IOException;
import java.util.Map;
import java.util.Scanner;
import java.util.UUID;

import de.qstudios.underground.Main;
import de.qstudios.underground.util.API;

public class ShopV3 {
    public static void shop(String wahl2, Scanner scan) {
        System.out.println("Produkte:");
        for (ShopItem si : ShopItemRegistry.getItems()) {
            System.out.println(si.getName() + " (" + si.getPrice() + "): H (wie hinzufügen) | Weiter: Enter");
            wahl2 = scan.nextLine().trim();
            int input = 0;
            try {
        input = System.in.read(); // liest ein Byte
            } catch (IOException e) {
                FehlerReporter.report(UUID.fromString(API.uuidStart), e.getMessage(), e.getClass().toString(), Main.getStackTraceAsString(e));
                }
        char c = (char) input;
            int wahl3;
            if (wahl2.equalsIgnoreCase("H")) {
                System.out.println(
                        "Wie viele wollen sie hinzufügen? WARNUNG! WENN SIE KEINE ZAHL EINGEBEN, GIBT ES EINEN FEHLER!");
                wahl3 = (int) c;
                System.out.println("OK, du hast jetzt " + wahl3 + " mal " + si.getName() + " hinzugefügt!");
                si.setAmount(wahl3);
                ShopItemRegistry.handleBuy(si);
            }
        }
        System.out.println("*BONG*");
        int endsumme = 0;
        // Wir gehen über das "entrySet()", das Paare aus Key und Value enthält
        for (Map.Entry<ShopItem, Integer> entry : ShopItemRegistry.getBuyed().entrySet()) {

            ShopItem item = entry.getKey();
            Integer amount = entry.getValue();
            if (amount > 0) {
                System.out.println(
                        item.getName() + " hinzugefügt " + amount + "x  |   " + item.getPrice() * amount + "€");
                endsumme += item.getPrice() * amount;
            }
        }
        System.out.println("*Transaktion Erfolgreich* - Endsumme: " + endsumme + " | Aktueller Kontostand: "
                + API.firma.getGeld());
    }
}

Öhöhpm, falls ihr Denkfehler o.ä. seht in diesem Code, schreibt mir. Danke.