Add random heir fallback logic in EventsWorker: Implement a new SQL query to select a random NPC heir from the same region when no children are available. Enhance error handling to log cases where no heir is found, ensuring better user feedback and maintaining character associations. Update UserCharacterWorker to utilize this new logic for heir assignment.

This commit is contained in:
Torsten Schulz (local)
2026-01-07 10:14:24 +01:00
parent b7eafe28a1
commit f96e474f32
3 changed files with 76 additions and 8 deletions

View File

@@ -45,6 +45,7 @@ use crate::worker::sql::{
QUERY_DELETE_CHILD_RELATION,
QUERY_DELETE_CHARACTER,
QUERY_GET_HEIR,
QUERY_GET_RANDOM_HEIR_FROM_REGION,
QUERY_SET_CHARACTER_USER,
QUERY_CLEAR_CHARACTER_USER,
QUERY_GET_CURRENT_MONEY,
@@ -1589,18 +1590,28 @@ impl EventsWorker {
.and_then(|r| r.get("child_character_id"))
.and_then(|v| v.parse::<i32>().ok());
// Kein Kind als Erbe vorhanden? Dann fallback: zufälliger NPC-Character aus der Region,
// Alter 1014 Tage.
let heir_id = match heir_id {
Some(id) if id > 0 => id,
_ => {
// Kein Erbe gefunden - Vermögen geht verloren
eprintln!(
"[EventsWorker] Kein Erbe für Charakter {} gefunden, Vermögen geht verloren",
deceased_character_id
);
return Ok(());
conn.prepare("random_heir_region", QUERY_GET_RANDOM_HEIR_FROM_REGION)?;
let rows = conn.execute("random_heir_region", &[&deceased_character_id])?;
rows.first()
.and_then(|r| r.get("child_character_id"))
.and_then(|v| v.parse::<i32>().ok())
.unwrap_or(0)
}
};
if heir_id <= 0 {
eprintln!(
"[EventsWorker] Kein Erbe für Charakter {} gefunden (weder Kind noch Fallback in Region). User {} hat danach keinen Character.",
deceased_character_id, falukant_user_id
);
return Ok(());
}
// 2) Wichtig: erst die alte User-Zuordnung am verstorbenen Charakter lösen.
// Falls es einen Unique-Constraint auf `character.user_id` gibt, würde das
// direkte Setzen am Erben sonst fehlschlagen.