Implement character death handling and periodic checks: Add logic to process characters with health <= 0 in EventsWorker and UserCharacterWorker, including immediate death handling during health updates and a scheduled death check every 12 hours. Introduce a new SQL query to retrieve characters with zero health.

This commit is contained in:
Torsten Schulz (local)
2026-02-02 08:05:12 +01:00
parent 972ef2b714
commit 340c658ad1
3 changed files with 80 additions and 0 deletions

View File

@@ -548,6 +548,8 @@ impl EventsWorker {
*min_change,
*max_change,
rng,
pool,
broker,
)
{
effect_results.push(json!({
@@ -842,6 +844,8 @@ impl EventsWorker {
*min_change,
*max_change,
rng,
pool,
broker,
) {
effect_results.push(json!({
"type": "character_health_change",
@@ -1273,6 +1277,8 @@ impl EventsWorker {
min_change: i32,
max_change: i32,
rng: &mut impl Rng,
pool: &ConnectionPool,
broker: &MessageBroker,
) -> Result<(i32, i32), DbError> {
// Hole einen zufälligen Charakter des Spielers
conn.prepare("get_random_character", QUERY_GET_RANDOM_CHARACTER)?;
@@ -1304,6 +1310,13 @@ impl EventsWorker {
conn.prepare("update_health", QUERY_UPDATE_HEALTH)?;
conn.execute("update_health", &[&new_health, &character_id])?;
// Bei Health <= 0 sofort Tod prüfen und verarbeiten
if new_health <= 0 {
if let Err(e) = Self::handle_character_death(pool, broker, character_id) {
eprintln!("[EventsWorker] handle_character_death nach Health-Update: {e}");
}
}
Ok((character_id, health_change))
}
@@ -1343,12 +1356,15 @@ impl EventsWorker {
min_change: i32,
max_change: i32,
rng: &mut impl Rng,
pool: &ConnectionPool,
broker: &MessageBroker,
) -> Result<Vec<(i32, i32)>, DbError> {
// Hole alle lebenden Charaktere in der Region
conn.prepare("get_region_characters", QUERY_GET_REGION_CHARACTERS)?;
let rows = conn.execute("get_region_characters", &[&region_id])?;
let mut affected_characters = Vec::new();
let mut dead_character_ids = Vec::new();
for row in rows {
let character_id: Option<i32> = row
@@ -1373,6 +1389,16 @@ impl EventsWorker {
conn.execute("update_health_regional", &[&new_health, &character_id])?;
affected_characters.push((character_id, health_change));
if new_health <= 0 {
dead_character_ids.push(character_id);
}
}
// Bei Health <= 0 Tod verarbeiten
for character_id in dead_character_ids {
if let Err(e) = Self::handle_character_death(pool, broker, character_id) {
eprintln!("[EventsWorker] handle_character_death nach regionalem Health-Update: {e}");
}
}
Ok(affected_characters)