void Streamer::processAttachedTextLabels() { for (boost::unordered_set<Item::SharedTextLabel>::iterator t = attachedTextLabels.begin(); t != attachedTextLabels.end(); ++t) { bool adjust = false; if ((*t)->attach) { if ((*t)->attach->player != INVALID_GENERIC_ID) { adjust = GetPlayerPos((*t)->attach->player, &(*t)->attach->position[0], &(*t)->attach->position[1], &(*t)->attach->position[2]); } else if ((*t)->attach->vehicle != INVALID_GENERIC_ID) { adjust = GetVehiclePos((*t)->attach->vehicle, &(*t)->attach->position[0], &(*t)->attach->position[1], &(*t)->attach->position[2]); } if (adjust) { if ((*t)->cell) { core->getGrid()->removeTextLabel(*t, true); } } else { (*t)->attach->position.fill(std::numeric_limits<float>::infinity()); } } } }
void Streamer::processAttachedObjects() { for (boost::unordered_set<Item::SharedObject>::iterator o = attachedObjects.begin(); o != attachedObjects.end(); ++o) { if ((*o)->attach) { bool adjust = false; if ((*o)->attach->vehicle != INVALID_GENERIC_ID) { adjust = GetVehiclePos((*o)->attach->vehicle, &(*o)->attach->position[0], &(*o)->attach->position[1], &(*o)->attach->position[2]); } if (adjust) { if ((*o)->cell) { core->getGrid()->removeObject(*o, true); } } else { (*o)->attach->position.fill(std::numeric_limits<float>::infinity()); } } } }
void Streamer::processAttachedAreas() { for (boost::unordered_set<Item::SharedArea>::iterator a = attachedAreas.begin(); a != attachedAreas.end(); ++a) { if ((*a)->attach) { bool adjust = false; if ((*a)->attach->object.get<0>() != INVALID_GENERIC_ID) { switch ((*a)->attach->object.get<1>()) { case STREAMER_OBJECT_TYPE_GLOBAL: { adjust = GetObjectPos((*a)->attach->object.get<0>(), &(*a)->attach->position[0], &(*a)->attach->position[1], &(*a)->attach->position[2]); break; } case STREAMER_OBJECT_TYPE_PLAYER: { adjust = GetPlayerObjectPos((*a)->attach->object.get<2>(), (*a)->attach->object.get<0>(), &(*a)->attach->position[0], &(*a)->attach->position[1], &(*a)->attach->position[2]); break; } case STREAMER_OBJECT_TYPE_DYNAMIC: { boost::unordered_map<int, Item::SharedObject>::iterator o = core->getData()->objects.find((*a)->attach->object.get<0>()); if (o != core->getData()->objects.end()) { (*a)->attach->position = o->second->position; adjust = true; } break; } } } else if ((*a)->attach->player != INVALID_GENERIC_ID) { adjust = GetPlayerPos((*a)->attach->player, &(*a)->attach->position[0], &(*a)->attach->position[1], &(*a)->attach->position[2]); } else if ((*a)->attach->vehicle != INVALID_GENERIC_ID) { adjust = GetVehiclePos((*a)->attach->vehicle, &(*a)->attach->position[0], &(*a)->attach->position[1], &(*a)->attach->position[2]); } if (adjust) { if ((*a)->cell) { core->getGrid()->removeArea(*a, true); } } else { (*a)->attach->position.fill(std::numeric_limits<float>::infinity()); } } } }
cell AMX_NATIVE_CALL Natives::GetDynamicVehDistanceFromPoint(AMX *amx, cell *params) { CHECK_PARAMS(4, "GetDynamicVehDistanceFromPoint"); boost::unordered_map<int, Item::SharedVehicle>::iterator v = core->getData()->vehicles.find(static_cast<int>(params[1])); if (v != core->getData()->vehicles.end()) { Eigen::Vector3f position; boost::unordered_map<int, int>::iterator i = core->getData()->internalVehicles.find(v->first); if (i != core->getData()->internalVehicles.end()) { GetVehiclePos(i->second, &position[0], &position[1], &position[2]); } else { position = v->second->position; } float distance = static_cast<float>(boost::geometry::distance(Eigen::Vector3f(amx_ctof(params[2]), amx_ctof(params[3]), amx_ctof(params[4])), position)); return amx_ftoc(distance); } return 0; }
cell AMX_NATIVE_CALL Natives::Streamer_GetDistanceToItem(AMX *amx, cell *params) { CHECK_PARAMS(7, "Streamer_GetDistanceToItem"); int dimensions = static_cast<int>(params[7]); Eigen::Vector3f position = Eigen::Vector3f::Zero(); switch (static_cast<int>(params[4])) { case STREAMER_TYPE_OBJECT: { boost::unordered_map<int, Item::SharedObject>::iterator o = core->getData()->objects.find(static_cast<int>(params[5])); if (o != core->getData()->objects.end()) { position = o->second->position; break; } return 0; } case STREAMER_TYPE_PICKUP: { boost::unordered_map<int, Item::SharedPickup>::iterator p = core->getData()->pickups.find(static_cast<int>(params[5])); if (p != core->getData()->pickups.end()) { position = p->second->position; break; } return 0; } case STREAMER_TYPE_CP: { boost::unordered_map<int, Item::SharedCheckpoint>::iterator c = core->getData()->checkpoints.find(static_cast<int>(params[5])); if (c != core->getData()->checkpoints.end()) { position = c->second->position; break; } return 0; } case STREAMER_TYPE_RACE_CP: { boost::unordered_map<int, Item::SharedRaceCheckpoint>::iterator r = core->getData()->raceCheckpoints.find(static_cast<int>(params[5])); if (r != core->getData()->raceCheckpoints.end()) { position = r->second->position; break; } return 0; } case STREAMER_TYPE_MAP_ICON: { boost::unordered_map<int, Item::SharedMapIcon>::iterator m = core->getData()->mapIcons.find(static_cast<int>(params[5])); if (m != core->getData()->mapIcons.end()) { position = m->second->position; break; } return 0; } case STREAMER_TYPE_3D_TEXT_LABEL: { boost::unordered_map<int, Item::SharedTextLabel>::iterator t = core->getData()->textLabels.find(static_cast<int>(params[5])); if (t != core->getData()->textLabels.end()) { if (t->second->attach) { position = t->second->attach->position; } else { position = t->second->position; } break; } return 0; } case STREAMER_TYPE_AREA: { boost::unordered_map<int, Item::SharedArea>::iterator a = core->getData()->areas.find(static_cast<int>(params[5])); if (a != core->getData()->areas.end()) { switch (a->second->type) { case STREAMER_AREA_TYPE_CIRCLE: case STREAMER_AREA_TYPE_CYLINDER: { float distance = 0.0f; if (a->second->attach) { distance = static_cast<float>(boost::geometry::distance(Eigen::Vector2f(amx_ctof(params[1]), amx_ctof(params[2])), Eigen::Vector2f(a->second->attach->position[0], a->second->attach->position[1]))); } else { distance = static_cast<float>(boost::geometry::distance(Eigen::Vector2f(amx_ctof(params[1]), amx_ctof(params[2])), boost::get<Eigen::Vector2f>(a->second->position))); } Utility::storeFloatInNative(amx, params[6], distance); return 1; } case STREAMER_AREA_TYPE_SPHERE: { if (a->second->attach) { position = a->second->attach->position; } else { position = boost::get<Eigen::Vector3f>(a->second->position); } break; } case STREAMER_AREA_TYPE_RECTANGLE: { Eigen::Vector2f centroid = boost::geometry::return_centroid<Eigen::Vector2f>(boost::get<Box2D>(a->second->position)); float distance = static_cast<float>(boost::geometry::distance(Eigen::Vector2f(amx_ctof(params[1]), amx_ctof(params[2])), centroid)); Utility::storeFloatInNative(amx, params[6], distance); return 1; } case STREAMER_AREA_TYPE_CUBOID: { Eigen::Vector3f centroid = boost::geometry::return_centroid<Eigen::Vector3f>(boost::get<Box3D>(a->second->position)); float distance = static_cast<float>(boost::geometry::distance(Eigen::Vector3f(amx_ctof(params[1]), amx_ctof(params[2]), amx_ctof(params[3])), centroid)); Utility::storeFloatInNative(amx, params[6], distance); return 1; } case STREAMER_AREA_TYPE_POLYGON: { Eigen::Vector2f centroid = boost::geometry::return_centroid<Eigen::Vector2f>(boost::get<Polygon2D>(a->second->position)); float distance = static_cast<float>(boost::geometry::distance(Eigen::Vector2f(amx_ctof(params[1]), amx_ctof(params[2])), centroid)); Utility::storeFloatInNative(amx, params[6], distance); return 1; } } } return 0; } case STREAMER_TYPE_VEHICLE: { boost::unordered_map<int, Item::SharedVehicle>::iterator v = core->getData()->vehicles.find(static_cast<int>(params[5])); if (v != core->getData()->vehicles.end()) { boost::unordered_map<int, int>::iterator i = core->getData()->internalVehicles.find(v->first); if (i != core->getData()->internalVehicles.end()) { GetVehiclePos(i->second, &position[0], &position[1], &position[2]); } else { position = v->second->position; } break; } return 0; } default: { Utility::logError("Streamer_GetDistanceToItem: Invalid type specified"); return 0; } } switch (dimensions) { case 2: { float distance = static_cast<float>(boost::geometry::distance(Eigen::Vector2f(amx_ctof(params[1]), amx_ctof(params[2])), Eigen::Vector2f(position[0], position[1]))); Utility::storeFloatInNative(amx, params[6], distance); return 1; } case 3: { float distance = static_cast<float>(boost::geometry::distance(Eigen::Vector3f(amx_ctof(params[1]), amx_ctof(params[2]), amx_ctof(params[3])), position)); Utility::storeFloatInNative(amx, params[6], distance); return 1; } default: { Utility::logError("Streamer_GetDistanceToItem: Invalid number of dimensions specified (outside range of 2-3)"); return 0; } } return 0; }
bool GetPos(float &x, float &y, float &z) const { return GetVehiclePos(id_, &x, &y, &z); }
bool GetPos(float *x, float *y, float *z) const { return GetVehiclePos(id_, x, y, z); }