use crate::event::EventBus;
use crate::modding::{DynamicEvent, ModLoaderState};
use crate::system::System;
use async_trait::async_trait;
use std::any::Any;
pub struct ModEventSystem;
impl Default for ModEventSystem {
fn default() -> Self {
Self::new()
}
}
impl ModEventSystem {
pub fn new() -> Self {
Self
}
pub async fn update_resources(&mut self, resources: &mut crate::context::ResourceContext) {
let events_to_publish = {
if let Some(mut loader_state) = resources.get_mut::<ModLoaderState>().await {
loader_state.loader.drain_events()
} else {
Vec::new()
}
};
if !events_to_publish.is_empty() {
if let Some(mut event_bus) = resources.get_mut::<EventBus>().await {
for (event_type, data) in events_to_publish {
event_bus.publish(DynamicEvent {
event_type: event_type.clone(),
data,
});
}
event_bus.dispatch();
}
}
let dynamic_events: Vec<DynamicEvent> = {
if let Some(mut event_bus) = resources.get_mut::<EventBus>().await {
event_bus.reader::<DynamicEvent>().iter().cloned().collect()
} else {
Vec::new()
}
};
if !dynamic_events.is_empty() {
if let Some(mut loader_state) = resources.get_mut::<ModLoaderState>().await {
for event in &dynamic_events {
let count = loader_state
.loader
.dispatch_event(&event.event_type, &event.data);
if count > 0 {
println!(
"[ModEventSystem] Dispatched event '{}' to {} subscriber(s)",
event.event_type, count
);
}
}
}
}
}
}
#[async_trait]
impl System for ModEventSystem {
fn name(&self) -> &'static str {
"mod_event_system"
}
fn as_any(&self) -> &dyn Any {
self
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
}