use bevy::prelude::{Component, Events, World};
use crate::connection::events::{
IterComponentInsertEvent, IterComponentRemoveEvent, IterComponentUpdateEvent, IterMessageEvent,
};
use crate::packet::message::Message;
use crate::protocol::component::IntoKind;
use crate::protocol::{EventContext, Protocol};
use crate::shared::events::{
ComponentInsertEvent, ComponentRemoveEvent, ComponentUpdateEvent, MessageEvent,
};
pub fn push_message_events<
M: Message,
P: Protocol,
E: IterMessageEvent<P, Ctx>,
Ctx: EventContext,
>(
world: &mut World,
events: &mut E,
) where
P::Message: TryInto<M, Error = ()>,
{
if events.has_messages::<M>() {
let mut message_event_writer = world
.get_resource_mut::<Events<MessageEvent<M, Ctx>>>()
.unwrap();
for (message, ctx) in events.into_iter_messages::<M>() {
let message_event = MessageEvent::new(message, ctx);
message_event_writer.send(message_event);
}
}
}
pub fn push_component_insert_events<
C: Component,
P: Protocol,
E: IterComponentInsertEvent<P, Ctx>,
Ctx: EventContext,
>(
world: &mut World,
events: &mut E,
) where
C: IntoKind<P::ComponentKinds>,
{
if events.has_component_insert::<C>() {
let mut event_writer = world
.get_resource_mut::<Events<ComponentInsertEvent<C, Ctx>>>()
.unwrap();
for (entity, ctx) in events.into_iter_component_insert::<C>() {
let event = ComponentInsertEvent::new(entity, ctx);
event_writer.send(event);
}
}
}
pub fn push_component_remove_events<
C: Component,
P: Protocol,
E: IterComponentRemoveEvent<P, Ctx>,
Ctx: EventContext,
>(
world: &mut World,
events: &mut E,
) where
C: IntoKind<P::ComponentKinds>,
{
if events.has_component_remove::<C>() {
let mut event_writer = world
.get_resource_mut::<Events<ComponentRemoveEvent<C, Ctx>>>()
.unwrap();
for (entity, ctx) in events.into_iter_component_remove::<C>() {
let event = ComponentRemoveEvent::new(entity, ctx);
event_writer.send(event);
}
}
}
pub fn push_component_update_events<
C: Component,
P: Protocol,
E: IterComponentUpdateEvent<P, Ctx>,
Ctx: EventContext,
>(
world: &mut World,
events: &mut E,
) where
C: IntoKind<P::ComponentKinds>,
{
if events.has_component_update::<C>() {
let mut event_writer = world
.get_resource_mut::<Events<ComponentUpdateEvent<C, Ctx>>>()
.unwrap();
for (entity, ctx) in events.iter_component_update::<C>() {
let event = ComponentUpdateEvent::new(entity, ctx);
event_writer.send(event);
}
}
}