Version 0.5.0-SNAPSHOT Modding: Unterschied zwischen den Versionen
Weitere Optionen
FeGmbH (Diskussion | Beiträge) 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…“ |
FeGmbH (Diskussion | Beiträge) 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.