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
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt)
Zeile 1: Zeile 1:
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.
Dies ist eine Seite über die [[Version 0.5.0-SNAPSHOT]] und [[Version 0.5.0]]. Falls ihr euch mit dem Modding im Underground Simulator nicht auskennt, empfiehlt sich der Guide [[Modding des Underground Simulator]].
==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.
== Worum geht es? ==
==Was gibt es neues?==
Die Version '''v0.5.0-SNAPSHOT''' ist ein umfangreiches Update und stellt einen wichtigen Meilenstein für das Modding des Underground Simulator dar. Auf dieser Seite wird erklärt, welche Änderungen vorgenommen wurden und wie diese umgesetzt sind.
 
== Was gibt es Neues? ==
* [[#ShopItem|ShopItems]]
* [[#ShopItem|ShopItems]]
* [[#ShopActionHandler|ShopActionHandlers]]
* [[#ShopActionHandler|ShopActionHandler]]
* [[#ShopItemRegistry|ShopItemRegistry]]
* [[#ShopItemRegistry|ShopItemRegistry]]
* [[#ShopV3|Verkürzung d. Shops]]
* [[#ShopV3|Vereinfachung des 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:
== Theorie der Modularisierung ==
=ShopItem=
Die Idee hinter diesem Update ist die Modularisierung des Shopsystems. Das bedeutet, dass der Shop in einzelne, unabhängige Komponenten aufgeteilt wurde.
==Konstruktor==
 
===Parameter:===
Ziel dieser Umstrukturierung:
* String: ID d. Items  
* einfachere Erweiterbarkeit
* String: Benutzeroberflächenname d. Items
* bessere Wartbarkeit
* double: Preis d. Items
* Unterstützung für Modding
* String: Auszuführende Aktions-ID, z.B. addFahrer
 
* String: ??? (Value)
Durch diese Struktur können neue Funktionen deutlich einfacher hinzugefügt werden, ohne bestehenden Code stark verändern zu müssen.
* int: Anzahl/Menge d. Items
 
==Werte & Felder==
= ShopItem =
S. Oben
 
==Getter & Setter==
== Konstruktor ==
*id: getId()
 
*name: getName()
=== Parameter ===
*price: getPrice(), setPrice(double)
* String: ID des Items
*action: getAction(), setAction(String)
* String: Anzeigename des Items
*value: getValue(), setValue(String)
* double: Preis des Items
*amount: getAmount(), setAmount(int)
* String: Aktions-ID (z. B. addFahrer)
==Erklärung==
* String: Value (frei definierbarer Zusatzwert)
Klasse zum erstellen eines Items, zum registrieren beim ShopItemRegistry.
* int: Menge des Items
==andere Methoden==
 
== Werte & Felder ==
Siehe Konstruktorparameter.
 
== Getter & Setter ==
* id: getId()
* name: getName()
* price: getPrice(), setPrice(double)
* action: getAction(), setAction(String)
* value: getValue(), setValue(String)
* amount: getAmount(), setAmount(int)
 
== Erklärung ==
Diese Klasse dient zur Erstellung von ShopItems, die anschließend im ShopItemRegistry registriert werden.
 
== 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.  
= ShopActionHandler =
=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.  
''Interface''
==Getters & Setters==
 
*items: getItems()
== Methoden ==
*handlers: getHandlers()
 
*this: getInstance()
'''boolean supports(String action)''' 
*buyed: getBuyed()
Prüft, ob dieser Handler die angegebene Aktion verarbeiten kann. Gibt ''true'' zurück, wenn dies der Fall ist, ansonsten ''false''.
==Werte & Felder==
 
handlers: ArrayList<ShopActionHandler>
'''void execute(ShopItem si) throws Exception'''
items: ArrayList<ShopItem>
Führt die Aktion für das übergebene ShopItem aus. Die konkrete Implementierung liegt beim Entwickler (z. B. Hinzufügen zu Firma, Score etc.). Es ist auch möglich, dass keine Aktion erfolgt.
buyed: HashMap<ShopItem, Integer>
 
this: ShopItemRegistry
= ShopItemRegistry =
==Methoden==
 
'''register(ShopItem)''': Shopitem registrieren
Die '''ShopItemRegistry''' verwaltet alle ShopItems und ShopActionHandler.
'''registerHandler(ShopActionHandler)''': Handler registrieren
 
'''unregister(ShopItem)''': ShopItem wieder löschen
Sie ist verantwortlich für:
'''unregisterHandler(ShopActionHandler)''': Handler wieder löschen
* Speicherung der Items und Handler
'''handleBuy(ShopItem)''': ShopItem dem nächst zur Verfügung stehenden, dieser Action unterstützenden Handler übergeben
* Weiterleitung von Käufen an passende Handler
=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!
== Werte & Felder ==
<pre>package de.qstudios.underground.dev;
* handlers: ArrayList<ShopActionHandler>
* items: ArrayList<ShopItem>
* buyed: HashMap<ShopItem, Integer>
* this: ShopItemRegistry
 
== Getter & Setter ==
* items: getItems()
* handlers: getHandlers()
* this: getInstance()
* buyed: getBuyed()
 
== Methoden ==
'''register(ShopItem)''' – registriert ein ShopItem 
'''registerHandler(ShopActionHandler)''' – registriert einen Handler
'''unregister(ShopItem)''' – entfernt ein ShopItem
'''unregisterHandler(ShopActionHandler)''' – entfernt einen Handler
'''handleBuy(ShopItem)''' – übergibt das Item an einen passenden Handler
 
= ShopV3 =
 
Die neue Version des Shops wurde stark vereinfacht.


import java.io.IOException;
Der ursprüngliche Code (Shop.java) wurde von 102 Zeilen auf 38 Zeilen reduziert. Zwar wurden dafür zusätzliche Klassen eingeführt, jedoch ermöglicht dies eine deutlich bessere Erweiterbarkeit.
import java.util.Map;
import java.util.Scanner;
import java.util.UUID;


import de.qstudios.underground.Main;
Durch die Modularisierung können nun viele neue Features umgesetzt werden, ohne den Hauptcode unnötig zu verkomplizieren.
import de.qstudios.underground.util.API;


public class ShopV3 {
== Fazit ==
    public static void shop(String wahl2, Scanner scan) {
Die Modularisierung macht den Shop übersichtlicher, wartbarer und deutlich einfacher erweiterbar. Sie bildet die Grundlage für zukünftige Features und Modding-Erweiterungen.
        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();
Falls ihr Fehler oder Denkfehler im Code findet, meldet euch gerne:
            Integer amount = entry.getValue();
[mailto:info@deepslatesmp.de mir]
            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.

Aktuelle Version vom 4. April 2026, 18:30 Uhr

Dies ist eine Seite über die Version 0.5.0-SNAPSHOT und Version 0.5.0. Falls ihr euch mit dem Modding im Underground Simulator nicht auskennt, empfiehlt sich der Guide Modding des Underground Simulator.

Die Version v0.5.0-SNAPSHOT ist ein umfangreiches Update und stellt einen wichtigen Meilenstein für das Modding des Underground Simulator dar. Auf dieser Seite wird erklärt, welche Änderungen vorgenommen wurden und wie diese umgesetzt sind.

Theorie der Modularisierung

Bearbeiten Quelltext bearbeiten

Die Idee hinter diesem Update ist die Modularisierung des Shopsystems. Das bedeutet, dass der Shop in einzelne, unabhängige Komponenten aufgeteilt wurde.

Ziel dieser Umstrukturierung:

  • einfachere Erweiterbarkeit
  • bessere Wartbarkeit
  • Unterstützung für Modding

Durch diese Struktur können neue Funktionen deutlich einfacher hinzugefügt werden, ohne bestehenden Code stark verändern zu müssen.

  • String: ID des Items
  • String: Anzeigename des Items
  • double: Preis des Items
  • String: Aktions-ID (z. B. addFahrer)
  • String: Value (frei definierbarer Zusatzwert)
  • int: Menge des Items

Siehe Konstruktorparameter.

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

Diese Klasse dient zur Erstellung von ShopItems, die anschließend im ShopItemRegistry registriert werden.

---

Interface

boolean supports(String action) Prüft, ob dieser Handler die angegebene Aktion verarbeiten kann. Gibt true zurück, wenn dies der Fall ist, ansonsten false.

void execute(ShopItem si) throws Exception Führt die Aktion für das übergebene ShopItem aus. Die konkrete Implementierung liegt beim Entwickler (z. B. Hinzufügen zu Firma, Score etc.). Es ist auch möglich, dass keine Aktion erfolgt.

Die ShopItemRegistry verwaltet alle ShopItems und ShopActionHandler.

Sie ist verantwortlich für:

  • Speicherung der Items und Handler
  • Weiterleitung von Käufen an passende Handler
  • handlers: ArrayList<ShopActionHandler>
  • items: ArrayList<ShopItem>
  • buyed: HashMap<ShopItem, Integer>
  • this: ShopItemRegistry
  • items: getItems()
  • handlers: getHandlers()
  • this: getInstance()
  • buyed: getBuyed()

register(ShopItem) – registriert ein ShopItem registerHandler(ShopActionHandler) – registriert einen Handler unregister(ShopItem) – entfernt ein ShopItem unregisterHandler(ShopActionHandler) – entfernt einen Handler handleBuy(ShopItem) – übergibt das Item an einen passenden Handler

Die neue Version des Shops wurde stark vereinfacht.

Der ursprüngliche Code (Shop.java) wurde von 102 Zeilen auf 38 Zeilen reduziert. Zwar wurden dafür zusätzliche Klassen eingeführt, jedoch ermöglicht dies eine deutlich bessere Erweiterbarkeit.

Durch die Modularisierung können nun viele neue Features umgesetzt werden, ohne den Hauptcode unnötig zu verkomplizieren.

Die Modularisierung macht den Shop übersichtlicher, wartbarer und deutlich einfacher erweiterbar. Sie bildet die Grundlage für zukünftige Features und Modding-Erweiterungen.

Falls ihr Fehler oder Denkfehler im Code findet, meldet euch gerne: mir