const Vec3* ActorManager::GetActorPosition(ActorId id) { ActorsMap::iterator i = m_ActorMap.find(id); if (i != m_ActorMap.end()) { StrongActorPtr actor = ((*i).second); return &(actor->GetPosition());// Warning here return local or temp address } return NULL; }
void RemoteNetworkView::GetActor(IEventDataPtr pEventData) { char response[4]; std::string httpinmsg; IEventDataPtr pResponseHttpEvent(CREATE_EVENT(EventData_ResponseHTTP::sk_EventType)); std::shared_ptr<EventData_GetActor> pCastEventData = std::static_pointer_cast<EventData_GetActor>(pEventData); std::string name = pCastEventData->VGetActorName(); unsigned int ip = pCastEventData->VGetIp(); pResponseHttpEvent->VSetSocketId(pEventData->VGetSocketId()); pResponseHttpEvent->VSetIp(ip); //look for actor data in actor manager by ip / actor name StrongActorPtr pActor = m_ActorManager->GetActorByName(ip, name); if (pActor == NULL) { _itoa_s(http_response_code_t::NOTFOUND, response,10); httpinmsg.append(response); std::istrstream in(httpinmsg.c_str(),httpinmsg.size()); pResponseHttpEvent->VDeserialize(in); IEventManager::Get()->VTriggerEvent(pResponseHttpEvent); } else { // Better (de-)serialize Actor with streams std::string buffer; _itoa_s(http_response_code_t::OK, response, 10); buffer.append(response); buffer.append(" "); char* id = new char[10]; sprintf_s(id, 10, "%d", pActor->GetId()); buffer.append(id); buffer.append("#"); buffer.append(pActor->GetName()); buffer.append("#"); Vec3 position = pActor->GetPosition(); char *xpos = new char[10]; sprintf_s(xpos, 10, "%.3f", position.x); buffer.append(xpos); buffer.append("#"); char *ypos = new char[10]; sprintf_s(ypos, 10, "%.3f", position.y); buffer.append(ypos); buffer.append("#"); char *zpos = new char[10]; sprintf_s(zpos, 10, "%.3f", position.z); buffer.append(zpos); buffer.push_back('\0'); // when found, send answer std::istrstream in(buffer.c_str(), buffer.size()); pResponseHttpEvent->VDeserialize(in); IEventManager::Get()->VTriggerEvent(pResponseHttpEvent); } }