cell AMX_NATIVE_CALL Natives::AttachDynamicObjectToVehicle(AMX *amx, cell *params) { CHECK_PARAMS(8, "AttachDynamicObjectToVehicle"); boost::unordered_map<int, Item::SharedObject>::iterator o = core->getData()->objects.find(static_cast<int>(params[1])); if (o != core->getData()->objects.end()) { if (o->second->move) { Utility::logError("AttachDynamicObjectToVehicle: Object is currently moving and must be stopped first"); return 0; } o->second->attach = boost::intrusive_ptr<Item::Object::Attach>(new Item::Object::Attach); o->second->attach->object = INVALID_STREAMER_ID; o->second->attach->player = INVALID_GENERIC_ID; o->second->attach->vehicle = static_cast<int>(params[2]); o->second->attach->offset = Eigen::Vector3f(amx_ctof(params[3]), amx_ctof(params[4]), amx_ctof(params[5])); o->second->attach->rotation = Eigen::Vector3f(amx_ctof(params[6]), amx_ctof(params[7]), amx_ctof(params[8])); for (boost::unordered_map<int, Player>::iterator p = core->getData()->players.begin(); p != core->getData()->players.end(); ++p) { boost::unordered_map<int, int>::iterator i = p->second.internalObjects.find(o->first); if (i != p->second.internalObjects.end()) { AttachPlayerObjectToVehicle(p->first, i->second, o->second->attach->vehicle, o->second->attach->offset[0], o->second->attach->offset[1], o->second->attach->offset[2], o->second->attach->rotation[0], o->second->attach->rotation[1], o->second->attach->rotation[2]); for (boost::unordered_map<int, Item::Object::Material>::iterator m = o->second->materials.begin(); m != o->second->materials.end(); ++m) { if (m->second.main) { SetPlayerObjectMaterial(p->first, i->second, m->first, m->second.main->modelID, m->second.main->txdFileName.c_str(), m->second.main->textureName.c_str(), m->second.main->materialColor); } else if (m->second.text) { SetPlayerObjectMaterialText(p->first, i->second, m->second.text->materialText.c_str(), m->first, m->second.text->materialSize, m->second.text->fontFace.c_str(), m->second.text->fontSize, m->second.text->bold, m->second.text->fontColor, m->second.text->backColor, m->second.text->textAlignment); } } } } if (static_cast<int>(params[2]) != INVALID_GENERIC_ID) { core->getStreamer()->attachedObjects.insert(o->second); } else { o->second->attach.reset(); core->getStreamer()->attachedObjects.erase(o->second); core->getGrid()->removeObject(o->second, true); } return 1; } return 0; }
void Streamer::processObjects(Player &player, const std::vector<SharedCell> &cells) { std::multimap<float, Item::SharedObject> discoveredObjects, existingObjects; for (std::vector<SharedCell>::const_iterator c = cells.begin(); c != cells.end(); ++c) { for (boost::unordered_map<int, Item::SharedObject>::const_iterator o = (*c)->objects.begin(); o != (*c)->objects.end(); ++o) { float distance = std::numeric_limits<float>::infinity(); if (checkPlayer(o->second->players, player.playerID, o->second->interiors, player.interiorID, o->second->worlds, player.worldID)) { if (o->second->attach) { distance = static_cast<float>(boost::geometry::comparable_distance(player.position, o->second->attach->position)); } else { distance = static_cast<float>(boost::geometry::comparable_distance(player.position, o->second->position)); } } boost::unordered_map<int, int>::iterator i = player.internalObjects.find(o->first); if (distance <= o->second->streamDistance) { if (i == player.internalObjects.end()) { discoveredObjects.insert(std::make_pair(distance, o->second)); } else { if (o->second->cell) { player.visibleCell->objects.insert(*o); } existingObjects.insert(std::make_pair(distance, o->second)); } } else { if (i != player.internalObjects.end()) { DestroyPlayerObject(player.playerID, i->second); player.internalObjects.quick_erase(i); } } } } for (std::multimap<float, Item::SharedObject>::iterator d = discoveredObjects.begin(); d != discoveredObjects.end(); ++d) { if (player.internalObjects.size() == player.visibleObjects) { std::multimap<float, Item::SharedObject>::reverse_iterator e = existingObjects.rbegin(); if (e != existingObjects.rend()) { if (d->first < e->first) { boost::unordered_map<int, int>::iterator i = player.internalObjects.find(e->second->objectID); if (i != player.internalObjects.end()) { DestroyPlayerObject(player.playerID, i->second); player.internalObjects.quick_erase(i); } if (e->second->cell) { player.visibleCell->objects.erase(e->second->objectID); } existingObjects.erase(--e.base()); } } } if (player.internalObjects.size() == visibleObjects) { player.visibleObjects = player.internalObjects.size(); break; } int internalID = CreatePlayerObject(player.playerID, d->second->modelID, d->second->position[0], d->second->position[1], d->second->position[2], d->second->rotation[0], d->second->rotation[1], d->second->rotation[2], d->second->drawDistance); if (internalID == INVALID_GENERIC_ID) { player.visibleObjects = player.internalObjects.size(); break; } if (d->second->attach) { AttachPlayerObjectToVehicle(player.playerID, internalID, d->second->attach->vehicle, d->second->attach->offset[0], d->second->attach->offset[1], d->second->attach->offset[2], d->second->attach->rotation[0], d->second->attach->rotation[1], d->second->attach->rotation[2]); } else if (d->second->move) { MovePlayerObject(player.playerID, internalID, d->second->move->position.get<0>()[0], d->second->move->position.get<0>()[1], d->second->move->position.get<0>()[2], d->second->move->speed, d->second->move->rotation.get<0>()[0], d->second->move->rotation.get<0>()[1], d->second->move->rotation.get<0>()[2]); } for (boost::unordered_map<int, Item::Object::Material>::iterator m = d->second->materials.begin(); m != d->second->materials.end(); ++m) { if (m->second.main) { SetPlayerObjectMaterial(player.playerID, internalID, m->first, m->second.main->modelID, m->second.main->txdFileName.c_str(), m->second.main->textureName.c_str(), m->second.main->materialColor); } else if (m->second.text) { SetPlayerObjectMaterialText(player.playerID, internalID, m->second.text->materialText.c_str(), m->first, m->second.text->materialSize, m->second.text->fontFace.c_str(), m->second.text->fontSize, m->second.text->bold, m->second.text->fontColor, m->second.text->backColor, m->second.text->textAlignment); } } player.internalObjects.insert(std::make_pair(d->second->objectID, internalID)); if (d->second->cell) { player.visibleCell->objects.insert(std::make_pair(d->second->objectID, d->second)); } } }