Ejemplo n.º 1
0
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()();
      }
    }
  });
}
Ejemplo n.º 2
0
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
					)
			)
		)
	);
}