本文整理汇总了C++中RootEntity类的典型用法代码示例。如果您正苦于以下问题:C++ RootEntity类的具体用法?C++ RootEntity怎么用?C++ RootEntity使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了RootEntity类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: create
void View::create(const RootEntity& gent)
{
std::string eid(gent->getId());
if (m_contents.count(eid))
{
// already known locally, just emit the signal
EntityCreated.emit( m_contents[eid] );
return;
}
bool alreadyAppeared = false;
PendingSightMap::iterator pending = m_pending.find(eid);
if (pending != m_pending.end())
{
// already being retrieved, but we have the data now
alreadyAppeared = (pending->second == SACTION_QUEUED) ||
(pending->second == SACTION_APPEAR);
pending->second = SACTION_DISCARD; // when the SIGHT turns up
}
Entity* ent = createEntity(gent);
m_contents[eid] = ent;
ent->init(gent, true);
if (gent->isDefaultLoc()) setTopLevelEntity(ent);
InitialSightEntity.emit(ent);
// depends on relative order that sight(create) and appear are received in
if (alreadyAppeared)
{
ent->setVisible(true);
EntityCreated.emit(ent);
}
}
示例2: addToEntity
/// \brief Copy attributes into an Atlas entity
///
/// @param ent Atlas entity this entity should be copied into
void Entity::addToEntity(const RootEntity & ent) const
{
// We need to have a list of keys to pull from attributes.
PropertyDict::const_iterator J;
PropertyDict::const_iterator Jend;
if (m_type != 0) {
J = m_type->defaults().begin();
Jend = m_type->defaults().end();
for (; J != Jend; ++J) {
J->second->add(J->first, ent);
}
}
J = m_properties.begin();
Jend = m_properties.end();
for (; J != Jend; ++J) {
J->second->add(J->first, ent);
}
ent->setStamp(m_seq);
if (m_type != 0) {
ent->setParents(std::list<std::string>(1, m_type->name()));
}
m_location.addToEntity(ent);
ent->setObjtype("obj");
}
示例3: createCharacter
void ClientConnection::createCharacter(const RootOperation& op)
{
static unsigned int charCounter = 0;
char charId[64];
::snprintf(charId, 64, "_customChar_%d", ++charCounter);
RootEntity ent = smart_dynamic_cast<RootEntity>(op->getArgs().front());
ent->setId(charId);
ent->setLoc("_world");
m_server->m_world[charId] = ent;
StringList children(m_server->m_world["_world"]->getContains());
children.push_back(charId);
m_server->m_world["_world"]->setContains(children);
Agent* ag = new Agent(this, charId);
ag->setEntityVisible(charId, true);
m_agents[charId] = ag;
Info info;
info->setArgs1(m_server->m_world[charId]);
info->setFrom(charId);
info->setTo(m_account); // I *think* this is right
info->setRefno(op->getSerialno());
send(info);
}
示例4: handleServerInfo
void Connection::handleServerInfo(const RootOperation& op)
{
RootEntity svr = smart_dynamic_cast<RootEntity>(op->getArgs().front());
if (!svr.isValid()) {
error() << "server INFO argument object is broken";
return;
}
m_info.processServer(svr);
GotServerInfo.emit();
}
示例5: sight
void View::sight(const RootEntity& gent)
{
bool visible = true;
std::string eid = gent->getId();
PendingSightMap::iterator pending = m_pending.find(eid);
// examine the pending map, to see what we should do with this entity
if (pending != m_pending.end()) {
switch (pending->second)
{
case SACTION_APPEAR:
visible = true;
break;
case SACTION_DISCARD:
m_pending.erase(pending);
issueQueuedLook();
return;
case SACTION_HIDE:
visible = false;
break;
case SACTION_QUEUED:
error() << "got sight of queued entity " << eid << " somehow";
eraseFromLookQueue(eid);
break;
default:
throw InvalidOperation("got bad pending action for entity");
}
m_pending.erase(pending);
}
// if we got this far, go ahead and build / update it
Entity *ent = getEntity(eid);
if (ent) {
// existing entity, update in place
ent->sight(gent);
} else {
ent = initialSight(gent);
EntitySeen.emit(ent);
}
if (gent->isDefaultLoc()) { // new top level entity
setTopLevelEntity(ent);
}
ent->setVisible(visible);
issueQueuedLook();
}
示例6: processOOGLook
void ClientConnection::processOOGLook(const Look& lk)
{
const std::vector<Root>& args = lk->getArgs();
std::string lookTarget;
if (args.empty()) {
lookTarget = "_lobby";
} else {
lookTarget = args.front()->getId();
}
RootEntity thing;
if (m_server->m_accounts.count(lookTarget))
{
thing = m_server->m_accounts[lookTarget];
if (lookTarget != lk->getFrom())
{
// prune
thing->removeAttr("characters");
thing->removeAttr("password");
}
}
else if (m_server->m_world.count(lookTarget))
{
// ensure it's owned by the account, i.e in characters
if (!entityIsCharacter(lookTarget))
{
sendError("not allowed to look at that entity", lk);
return;
}
thing = m_server->m_world[lookTarget];
}
else if (m_server->m_rooms.count(lookTarget))
{
// should check room view permissions?
thing = m_server->m_rooms[lookTarget];
} else {
// didn't find any entity with the id
sendError("processed OOG look for unknown entity " + lookTarget, lk);
return;
}
Sight st;
st->setArgs1(thing);
st->setFrom(lookTarget);
st->setTo(lk->getFrom());
st->setRefno(lk->getSerialno());
send(st);
}
示例7: idListasObject
void Property<IdList>::add(const std::string & s, const RootEntity & ent) const
{
if (!m_data.empty()) {
ListType list;
idListasObject(m_data, list);
ent->setAttr(s, list);
}
}
示例8: processAnonymousGet
void ClientConnection::processAnonymousGet(const Get& get)
{
const std::vector<Root>& args = get->getArgs();
if (args.empty())
{
Info serverInfo;
RootEntity svObj;
Atlas::Message::ListType prs;
prs.push_back("server");
svObj->setParentsAsList(prs);
svObj->setName("Bob's StubServer");
svObj->setAttr("server", "stubserver");
svObj->setAttr("ruleset", "stub-world");
svObj->setAttr("uptime", 666.0);
svObj->setAttr("clients", 42);
serverInfo->setArgs1(svObj);
send(serverInfo);
} else {
std::string typeName = args.front()->getId();
if (m_server->m_types.count(typeName))
{
Info typeInfo;
typeInfo->setArgs1(m_server->m_types[typeName]);
typeInfo->setRefno(get->getSerialno());
send(typeInfo);
} else
sendError("unknown type " + typeName, get);
}
}
示例9: processServer
void ServerInfo::processServer(const RootEntity &svr)
{
Atlas::Message::Element element;
if (!svr->copyAttr("ruleset", element) && element.isString()) {
_ruleset = element.String();
} else {
return;
}
_name = svr->getName();
if (!svr->copyAttr("clients", element) && element.isInt()) {
_clients = (int)element.Int();
} else {
return;
}
if (!svr->copyAttr("server", element) && element.isString()) {
_server = element.String();
} else {
return;
}
if (!svr->copyAttr("uptime", element) && element.isFloat()) {
_uptime = element.Float();
} else {
return;
}
m_status = VALID;
if (!svr->copyAttr("entities", element) && element.isInt()) {
_entities = element.Int();
}
if (!svr->copyAttr("version", element) && element.isString()) {
m_version = element.String();
}
if (!svr->copyAttr("builddate", element) && element.isString()) {
m_buildDate = element.String();
}
if (!svr->copyAttr("assets", element) && element.isList()) {
for (auto& url : element.List()) {
if (url.isString()) {
m_assets.emplace_back(url.String());
}
}
}
}
示例10: error
void ServerAccount::createObject(const std::string & type_str,
const Root & arg,
const Operation & op,
OpVector & res)
{
// Format of the Create ops that are received by this function should
// have the entity to be created as the first argument. If the entity
// being created is a character associated with an account, an additional
// argument should specify the possess key that will be used by the client
// to claim ownership of the entity being created.
if (arg->getObjtype() != "obj") {
// Return error to peer
error(op, "Only creation of entities by peer server is permitted",
res, getId());
return;
}
RootEntity ent = smart_dynamic_cast<RootEntity>(arg);
if(!ent.isValid()) {
log(ERROR, "Character creation arg is malformed");
return;
}
// If we have a possess key (entity has a mind)
TeleportAuthenticator * tele_auth = 0;
std::string possess_key;
const std::vector<Root> & args = op->getArgs();
if (args.size() == 2) {
const Root & arg2 = args.back();
Element key;
if(arg2->copyAttr("possess_key", key) == 0 && key.isString()) {
possess_key = key.String();
tele_auth = TeleportAuthenticator::instance();
} else {
log(ERROR, "Entity has mind but no possess key found");
return;
}
}
debug( std::cout << "ServerAccount creating a " << type_str << " object"
<< std::endl << std::flush; );
示例11: assert
void EntityImporterBase::createEntity(const RootEntity & obj, OpVector & res)
{
++mStats.entitiesProcessedCount;
++mStats.entitiesCreateCount;
EventProgress.emit();
m_state = ENTITY_CREATING;
assert(mTreeStack.size() > 1);
std::deque<StackEntry>::reverse_iterator I = mTreeStack.rbegin();
++I;
assert(I != mTreeStack.rend());
const std::string & loc = I->restored_id;
RootEntity create_arg = obj.copy();
create_arg->removeAttrFlag(Atlas::Objects::Entity::CONTAINS_FLAG);
create_arg->removeAttrFlag(Atlas::Objects::Entity::VELOCITY_FLAG);
create_arg->removeAttrFlag(Atlas::Objects::ID_FLAG);
create_arg->setLoc(loc);
//Remove any attribute which references another entity from the Create op.
//This is because the attribute will at this time with certainty refer to the wrong or a non-existing entity.
//The attribute will later on be set through a Set op in sendResolvedEntityReferences().
auto referenceMapEntryI = mEntitiesWithReferenceAttributes.find(obj->getId());
if (referenceMapEntryI != mEntitiesWithReferenceAttributes.end()) {
for (const auto& attributeName : referenceMapEntryI->second) {
create_arg->removeAttr(attributeName);
}
}
Create create;
create->setArgs1(create_arg);
create->setFrom(mAvatarId);
create->setSerialno(newSerialNumber());
mCreateEntityMapping.insert(std::make_pair(create->getSerialno(), obj->getId()));
res.push_back(create);
}
示例12:
LocatedEntity * CreatorClient::handleMakeResponse(const RootOperation & op,
double create_time)
{
if (op->getArgs().empty()) {
std::cerr << "Arg of reply to make has no args"
<< std::endl << std::flush;
return NULL;
}
RootEntity created = smart_dynamic_cast<RootEntity>(op->getArgs().front());
if (!created.isValid()) {
std::cerr << "Created argument is not an entity"
<< std::endl << std::flush;
return NULL;
}
if (!created->hasAttrFlag(Atlas::Objects::ID_FLAG)) {
std::cerr << "Created entity has no id"
<< std::endl << std::flush;
return NULL;
}
const std::string & created_id = created->getId();
if (created->getParents().empty()) {
std::cerr << "Created entity " << created_id << " has no type"
<< std::endl << std::flush;
return NULL;
}
const std::string & created_type = created->getParents().front();
std::cout << "Created: " << created_type << "(" << created_id << ")"
<< std::endl << std::flush;
LocatedEntity * obj = m_map.updateAdd(created, create_time);
return obj;
}
示例13: disappearanceArrived
void Interactive::disappearanceArrived(const Operation & op)
{
if (m_accountId.empty()) {
return;
}
if (m_accountId != op->getTo()) {
// This is an IG op we are monitoring
return;
}
if (op->getArgs().empty()) {
return;
}
RootEntity ent = smart_dynamic_cast<RootEntity>(op->getArgs().front());
if (!ent.isValid()) {
std::cerr << "Got Disappearance of non-entity" << std::endl << std::flush;
return;
}
if (!ent->hasAttrFlag(Atlas::Objects::ID_FLAG)) {
std::cerr << "Got Disappearance of non-string ID" << std::endl << std::flush;
return;
}
const std::string & id = ent->getId();
std::cout << "Disappearance(id: " << id << ")";
if (!ent->hasAttrFlag(Atlas::Objects::Entity::LOC_FLAG)) {
std::cout << std::endl << std::flush;
return;
}
const std::string & loc = ent->getLoc();
std::cout << " in " << loc << std::endl;
if (loc == "lobby") {
std::cout << id << " has logged out." << std::endl;
}
std::cout << std::flush;
}
示例14: S_LOG_WARNING
void EntityImporterBase::sendResolvedEntityReferences()
{
if (!mEntitiesWithReferenceAttributes.empty()) {
for (auto entryI : mEntitiesWithReferenceAttributes) {
const auto& persistedEntityId = entryI.first;
const auto& referenceEntries = entryI.second;
auto createdEntityI = mEntityIdMap.find(persistedEntityId);
if (createdEntityI == mEntityIdMap.end()) {
S_LOG_WARNING("Could not find final server side entity id for persisted entity " << persistedEntityId << " when doing entity ref resolving.");
continue;
}
const auto& createdEntityId = createdEntityI->second;
//This should not fail at this phase, so we're not doing any checks.
auto& persistedEntity = mPersistedEntities.find(persistedEntityId)->second;
RootEntity entity;
for (const auto& referenceEntry : referenceEntries) {
Element element = persistedEntity->getAttr(referenceEntry.propertyName);
resolveEntityReferences(element);
entity->setAttr(referenceEntry.propertyName, element);
}
Set set;
set->setFrom(mAvatarId);
set->setSerialno(newSerialNumber());
set->setTo(createdEntityId);
set->setArgs1(entity);
mSetOpsInTransit++;
sigc::slot<void, const Operation&> slot = sigc::mem_fun(*this, &EntityImporterBase::operationSetResult);
sendAndAwaitResponse(set, slot);
}
} else {
sendMinds();
}
}
示例15: move_handler
HandlerResult TerrainModProperty::move_handler(LocatedEntity * e,
const Operation & op,
OpVector & res)
{
// FIXME Force instantiation of a class property?
// Check the validity of the operation.
const std::vector<Root> & args = op->getArgs();
if (args.empty()) {
return OPERATION_IGNORED;
}
RootEntity ent = Atlas::Objects::smart_dynamic_cast<RootEntity>(args.front());
if (!ent.isValid()) {
return OPERATION_IGNORED;
}
if (e->getId() != ent->getId()) {
return OPERATION_IGNORED;
}
// Update the modifier
move(e);
return OPERATION_IGNORED;
}