Entity* View::createEntity(const RootEntity& gent) { TypeInfo* type = getConnection()->getTypeService()->getTypeForAtlas(gent); assert(type->isBound()); FactoryStore::const_iterator F = m_factories.begin(); for (; F != m_factories.end(); ++F) { if ((*F)->accept(gent, type)) { return (*F)->instantiate(gent, type, this); } } return new ViewEntity(gent->getId(), type, this); }
Router::RouterResult EntityRouter::handleOperation(const RootOperation& op) { assert(op->getFrom() == m_entity->getId()); const std::vector<Root>& args = op->getArgs(); // note it's important we match exactly on sight here, and not deried ops // like appearance and disappearance if (op->getClassNo() == SIGHT_NO) { assert(!args.empty()); RootOperation sop = smart_dynamic_cast<RootOperation>(args.front()); if (sop.isValid()) return handleSightOp(sop); } if (op->getClassNo() == SOUND_NO) { assert(!args.empty()); if (args.front()->getClassNo() == TALK_NO) { RootOperation talk = smart_dynamic_cast<RootOperation>(args.front()); m_entity->onTalk(talk); return HANDLED; } TypeInfo* ty = typeService()->getTypeForAtlas(args.front()); if (!ty->isBound()) { new TypeBoundRedispatch(m_entity->getView()->getAvatar()->getConnection(), op, ty); return WILL_REDISPATCH; } if (ty->isA(typeService()->getTypeByName("action"))) { // sound of action RootOperation act = smart_dynamic_cast<RootOperation>(args.front()); m_entity->onSoundAction(act); return HANDLED; } warning() << "entity " << m_entity->getId() << " emitted sound with strange argument: " << op; // other sounds ! } return IGNORED; }