void World::sendRelayToEntity(const LocatedEntity& to, const Operation& op, sigc::slot<void, const Operation&, const std::string&> callback) { //Make the op appear to come from the destination entity. op->setFrom(to.getId()); long int serialNo = ++m_serialNumber; Atlas::Objects::Operation::Relay relayOp; relayOp->setTo(to.getId()); relayOp->setSerialno(serialNo); relayOp->setArgs1(op); Relay relay; relay.entityId = to.getId(); relay.callback = std::move(callback); m_relays.insert(std::make_pair(serialNo, relay)); sendWorld(relayOp); //Also send a future Relay op to ourselves to make sure that the registered relay in m_relays //is removed in the case that we don't get any response. Atlas::Objects::Operation::Relay pruneOp; pruneOp->setTo(getId()); pruneOp->setFrom(getId()); pruneOp->setRefno(serialNo); pruneOp->setFutureSeconds(5); sendWorld(pruneOp); }
/// \brief Add an operation to the ordered op queue. /// /// Any time adjustment required is made to the operation, and it /// is added to the apropriate place in the chronologically ordered /// queue. The From attribute of the operation is set to the id of /// the entity that is responsible for adding the operation to the /// queue. void OperationsDispatcher::addOperationToQueue(const Operation & op, LocatedEntity & ent) { assert(op.isValid()); assert(op->getFrom() != "cheat"); m_operation_queues_dirty = true; op->setFrom(ent.getId()); if (!op->hasAttrFlag(Atlas::Objects::Operation::FUTURE_SECONDS_FLAG)) { op->setSeconds(getTime()); m_immediateQueue.push(OpQueEntry(op, ent)); return; } double t = getTime() + (op->getFutureSeconds() * consts::time_multiplier); op->setSeconds(t); op->setFutureSeconds(0.); m_operationQueue.push(OpQueEntry(op, ent)); if (debug_flag) { std::cout << "WorldRouter::addOperationToQueue {" << std::endl; debug_dump(op, std::cout); std::cout << "}" << std::endl << std::flush; } }
/// \brief Send an operation to the server, and wait for a reply /// /// Reply is identified as it should have its refno attribute set to /// the serialno of the operation sent. /// @param op Operation to be sent /// @param res Result with correct refno is returned here int CharacterClient::sendAndWaitReply(const Operation & op, OpVector & res) { op->setFrom(getId()); return m_connection.sendAndWaitReply(op, res); }
/// \brief Send an operation to the server from this avatar /// /// @param op Operation to be sent void CharacterClient::send(const Operation & op) { op->setFrom(getId()); m_connection.send(op); }