Weiter am Kampfsystem gearbeitet - hier: Schwert und Schild

This commit is contained in:
2026-09-20 22:17:29 +02:00
parent 836b5d3d99
commit ef061b2726
49 changed files with 1463 additions and 366 deletions

View File

@@ -3,10 +3,15 @@ package de.blight.common;
import java.util.UUID;
/** Ein Item-Pickup das auf der Spielwelt liegt (Kartendaten). */
public record PlacedItem(String uuid, String itemId, float x, float y, float z) {
public record PlacedItem(String uuid, String itemId, float x, float y, float z, float rotX, float rotY, float rotZ) {
/** Erzeugt ein neues PlacedItem mit automatisch generierter UUID. */
/** Erzeugt ein neues PlacedItem mit automatisch generierter UUID (alle Rotationen = 0). */
public static PlacedItem create(String itemId, float x, float y, float z) {
return new PlacedItem(UUID.randomUUID().toString(), itemId, x, y, z);
return new PlacedItem(UUID.randomUUID().toString(), itemId, x, y, z, 0f, 0f, 0f);
}
/** Gibt eine Kopie mit geänderter Position/Rotation zurück. */
public PlacedItem withTransform(float nx, float ny, float nz, float nRotX, float nRotY, float nRotZ) {
return new PlacedItem(uuid, itemId, nx, ny, nz, nRotX, nRotY, nRotZ);
}
}

View File

@@ -25,11 +25,11 @@ public final class PlacedItemIO {
Path p = getPath();
Files.createDirectories(p.getParent());
try (BufferedWriter w = Files.newBufferedWriter(p)) {
w.write("# uuid\titemId\tx\ty\tz");
w.write("# uuid\titemId\tx\ty\tz\trotX\trotY\trotZ");
w.newLine();
for (PlacedItem it : items) {
w.write(String.format(Locale.ROOT, "%s\t%s\t%.5f\t%.5f\t%.5f%n",
it.uuid(), it.itemId(), it.x(), it.y(), it.z()));
w.write(String.format(Locale.ROOT, "%s\t%s\t%.5f\t%.5f\t%.5f\t%.5f\t%.5f\t%.5f%n",
it.uuid(), it.itemId(), it.x(), it.y(), it.z(), it.rotX(), it.rotY(), it.rotZ()));
}
}
}
@@ -43,17 +43,29 @@ public final class PlacedItemIO {
if (line.isEmpty() || line.startsWith("#")) continue;
String[] f = line.split("\t", -1);
try {
if (f.length >= 5) {
// Aktuelles Format: uuid itemId x y z
if (f.length >= 8) {
// Aktuelles Format: uuid itemId x y z rotX rotY rotZ
list.add(new PlacedItem(f[0], f[1],
Float.parseFloat(f[2]), Float.parseFloat(f[3]), Float.parseFloat(f[4])));
Float.parseFloat(f[2]), Float.parseFloat(f[3]), Float.parseFloat(f[4]),
Float.parseFloat(f[5]), Float.parseFloat(f[6]), Float.parseFloat(f[7])));
} else if (f.length >= 6) {
// Vorherige Version: uuid itemId x y z rotY (kein rotX/rotZ)
list.add(new PlacedItem(f[0], f[1],
Float.parseFloat(f[2]), Float.parseFloat(f[3]), Float.parseFloat(f[4]),
0f, Float.parseFloat(f[5]), 0f));
} else if (f.length >= 5) {
// uuid itemId x y z (kein rot)
list.add(new PlacedItem(f[0], f[1],
Float.parseFloat(f[2]), Float.parseFloat(f[3]), Float.parseFloat(f[4]),
0f, 0f, 0f));
} else if (f.length == 4) {
// Altes Format: itemId x y z → UUID deterministisch aus Inhalt ableiten
String deterministicId = UUID.nameUUIDFromBytes(
("legacy:" + f[0] + ":" + f[1] + ":" + f[2] + ":" + f[3])
.getBytes(StandardCharsets.UTF_8)).toString();
list.add(new PlacedItem(deterministicId, f[0],
Float.parseFloat(f[1]), Float.parseFloat(f[2]), Float.parseFloat(f[3])));
Float.parseFloat(f[1]), Float.parseFloat(f[2]), Float.parseFloat(f[3]),
0f, 0f, 0f));
}
} catch (NumberFormatException ignored) {}
}

View File

@@ -39,7 +39,7 @@ public class ItemCategoryManager {
private static final Map<ItemCategory, List<ItemSubCategory>> mapping = new EnumMap<ItemCategory, List<ItemSubCategory>>(ItemCategory.class);
static {
mapping.put(WEAPON, List.of(SWORD, TWO_HANDED_SWORD, STAFF, HALBERD, AXE, BOW, CROSSBOW, MAGIC_CRYSTAL));
mapping.put(WEAPON, List.of(SWORD, TWO_HANDED_SWORD, STAFF, HALBERD, AXE, BOW, CROSSBOW, MAGIC_CRYSTAL, SHIELD));
mapping.put(GEAR, List.of(RING, NECKLACE, ARMOR, HELM, SHIELD));
mapping.put(CONSUMABLES, List.of(POTION, PERMANENT_POTION, FOOD, MAGICAL_ITEM));
mapping.put(QUEST_ITEMS, List.of(QUEST_ITEM));