void Object::unicast(Event& event, Object& observer) { event.subject = this; unicast_(event, observer, [&](Event& event, Object& observer, bool shouldSend) { if (shouldSend) { if (!REGISTRY.contains(&observer)) { CLOG(TRACE, "EventSystem") << "Attempted to unicast to destroyed Observer " << observer << ", skipping"; return; } auto finalEvent = event.heapClone(); auto dispatchBlock = [=, &observer]() mutable -> bool { bool result = true; if (observerIsObservingEvent(observer, finalEvent->getId())) { CLOG(TRACE, "EventSystem") << "Unicasting " << *finalEvent << " to " << observer; result = observer.onEvent_NV(*finalEvent); } delete finalEvent; m_eventQueue.pop(); if (!m_eventQueue.empty()) { m_eventQueue.front()(); } return result; }; m_eventQueue.push(dispatchBlock); if (m_eventQueue.size() == 1) { m_eventQueue.front()(); } } }); }
void sanguis::server::console::print_line( sanguis::server::player_id const _id, fcppt::string const &_line ) { unicast_( _id, sanguis::messages::server::create( alda::message::init_record< sanguis::messages::server::console_print >( sanguis::messages::roles::console_message{} = sge::charconv::fcppt_string_to_utf8( _line ) ) ) ); }