void Streamer::processRaceCheckpoints(Player &player, const std::vector<SharedCell> &cells) { std::multimap<float, Item::SharedRaceCheckpoint> discoveredRaceCheckpoints; for (std::vector<SharedCell>::const_iterator c = cells.begin(); c != cells.end(); ++c) { for (boost::unordered_map<int, Item::SharedRaceCheckpoint>::const_iterator r = (*c)->raceCheckpoints.begin(); r != (*c)->raceCheckpoints.end(); ++r) { float distance = std::numeric_limits<float>::infinity(); if (checkPlayer(r->second->players, player.playerID, r->second->interiors, player.interiorID, r->second->worlds, player.worldID)) { boost::unordered_set<int>::iterator d = player.disabledRaceCheckpoints.find(r->first); if (d == player.disabledRaceCheckpoints.end()) { distance = static_cast<float>(boost::geometry::comparable_distance(player.position, r->second->position)); } } if (distance <= r->second->streamDistance) { discoveredRaceCheckpoints.insert(std::make_pair(distance, r->second)); } else { if (r->first == player.visibleRaceCheckpoint) { DisablePlayerRaceCheckpoint(player.playerID); player.activeRaceCheckpoint = 0; player.visibleRaceCheckpoint = 0; } } } } if (!discoveredRaceCheckpoints.empty()) { std::multimap<float, Item::SharedRaceCheckpoint>::iterator d = discoveredRaceCheckpoints.begin(); if (d->second->raceCheckpointID != player.visibleRaceCheckpoint) { if (player.visibleRaceCheckpoint) { DisablePlayerRaceCheckpoint(player.playerID); player.activeRaceCheckpoint = 0; } SetPlayerRaceCheckpoint(player.playerID, d->second->type, d->second->position[0], d->second->position[1], d->second->position[2], d->second->next[0], d->second->next[1], d->second->next[2], d->second->size); player.visibleRaceCheckpoint = d->second->raceCheckpointID; } if (d->second->cell) { player.visibleCell->raceCheckpoints.insert(std::make_pair(d->second->raceCheckpointID, d->second)); } } }
cell AMX_NATIVE_CALL Natives::TogglePlayerDynamicRaceCP(AMX *amx, cell *params) { CHECK_PARAMS(3, "TogglePlayerDynamicRaceCP"); boost::unordered_map<int, Player>::iterator p = core->getData()->players.find(static_cast<int>(params[1])); if (p != core->getData()->players.end()) { boost::unordered_set<int>::iterator d = p->second.disabledRaceCheckpoints.find(static_cast<int>(params[2])); if (static_cast<int>(params[3])) { if (d != p->second.disabledRaceCheckpoints.end()) { p->second.disabledRaceCheckpoints.quick_erase(d); return 1; } } else { if (d == p->second.disabledRaceCheckpoints.end()) { if (p->second.visibleRaceCheckpoint == static_cast<int>(params[2])) { DisablePlayerRaceCheckpoint(p->first); p->second.activeRaceCheckpoint = 0; p->second.visibleRaceCheckpoint = 0; } p->second.disabledRaceCheckpoints.insert(static_cast<int>(params[2])); return 1; } } } return 0; }
cell AMX_NATIVE_CALL Natives::TogglePlayerAllDynamicRaceCPs(AMX *amx, cell *params) { CHECK_PARAMS(2, "TogglePlayerAllDynamicRaceCPs"); boost::unordered_map<int, Player>::iterator p = core->getData()->players.find(static_cast<int>(params[1])); if (p != core->getData()->players.end()) { p->second.disabledRaceCheckpoints.clear(); if (!static_cast<int>(params[2])) { if (p->second.visibleRaceCheckpoint != 0) { DisablePlayerRaceCheckpoint(p->first); p->second.activeRaceCheckpoint = 0; p->second.visibleRaceCheckpoint = 0; } for (boost::unordered_map<int, Item::SharedRaceCheckpoint>::iterator r = core->getData()->raceCheckpoints.begin(); r != core->getData()->raceCheckpoints.end(); ++r) { p->second.disabledRaceCheckpoints.insert(r->first); } } return 1; } return 0; }
cell AMX_NATIVE_CALL Natives::Streamer_DestroyAllVisibleItems(AMX *amx, cell *params) { CHECK_PARAMS(3, "Streamer_DestroyAllVisibleItems"); bool serverWide = static_cast<int>(params[3]) != 0; switch (static_cast<int>(params[2])) { case STREAMER_TYPE_PICKUP: { boost::unordered_map<int, int>::iterator p = core->getData()->internalPickups.begin(); while (p != core->getData()->internalPickups.end()) { boost::unordered_map<int, Item::SharedPickup>::iterator q = core->getData()->pickups.find(p->first); if (serverWide || (q != core->getData()->pickups.end() && q->second->amx == amx)) { DestroyPickup(p->second); p = core->getData()->internalPickups.erase(p); } else { ++p; } } return 1; } case STREAMER_TYPE_VEHICLE: { boost::unordered_map<int, int>::iterator p = core->getData()->internalVehicles.begin(); while (p != core->getData()->internalPickups.end()) { boost::unordered_map<int, Item::SharedVehicle>::iterator q = core->getData()->vehicles.find(p->first); if (serverWide || (q != core->getData()->vehicles.end() && q->second->amx == amx)) { DestroyVehicle(p->second); p = core->getData()->internalVehicles.erase(p); } else { ++p; } } return 1; } } boost::unordered_map<int, Player>::iterator p = core->getData()->players.find(static_cast<int>(params[1])); if (p != core->getData()->players.end()) { switch (static_cast<int>(params[2])) { case STREAMER_TYPE_OBJECT: { boost::unordered_map<int, int>::iterator o = p->second.internalObjects.begin(); while (o != p->second.internalObjects.end()) { boost::unordered_map<int, Item::SharedObject>::iterator q = core->getData()->objects.find(o->first); if (serverWide || (q != core->getData()->objects.end() && q->second->amx == amx)) { DestroyPlayerObject(p->first, o->second); o = p->second.internalObjects.erase(o); } else { ++o; } } return 1; } case STREAMER_TYPE_CP: { if (p->second.visibleCheckpoint) { boost::unordered_map<int, Item::SharedCheckpoint>::iterator c = core->getData()->checkpoints.find(p->second.visibleCheckpoint); if (serverWide || (c != core->getData()->checkpoints.end() && c->second->amx == amx)) { DisablePlayerCheckpoint(p->first); p->second.activeCheckpoint = 0; p->second.visibleCheckpoint = 0; return 1; } } return 0; } case STREAMER_TYPE_RACE_CP: { if (p->second.visibleRaceCheckpoint) { boost::unordered_map<int, Item::SharedRaceCheckpoint>::iterator r = core->getData()->raceCheckpoints.find(p->second.visibleRaceCheckpoint); if (serverWide || (r != core->getData()->raceCheckpoints.end() && r->second->amx == amx)) { DisablePlayerRaceCheckpoint(p->first); p->second.activeRaceCheckpoint = 0; p->second.visibleRaceCheckpoint = 0; return 1; } } return 0; } case STREAMER_TYPE_MAP_ICON: { boost::unordered_map<int, int>::iterator m = p->second.internalMapIcons.begin(); while (m != p->second.internalMapIcons.end()) { boost::unordered_map<int, Item::SharedMapIcon>::iterator n = core->getData()->mapIcons.find(m->first); if (serverWide || (n != core->getData()->mapIcons.end() && n->second->amx == amx)) { RemovePlayerMapIcon(p->first, m->second); m = p->second.internalMapIcons.erase(m); } else { ++m; } } return 1; } case STREAMER_TYPE_3D_TEXT_LABEL: { boost::unordered_map<int, int>::iterator t = p->second.internalTextLabels.begin(); while (t != p->second.internalMapIcons.end()) { boost::unordered_map<int, Item::SharedTextLabel>::iterator u = core->getData()->textLabels.find(t->first); if (serverWide || (u != core->getData()->textLabels.end() && u->second->amx == amx)) { DeletePlayer3DTextLabel(p->first, t->second); t = p->second.internalTextLabels.erase(t); } else { ++t; } } return 1; } case STREAMER_TYPE_AREA: { boost::unordered_set<int>::iterator a = p->second.internalAreas.begin(); while (a != p->second.internalAreas.end()) { boost::unordered_map<int, Item::SharedArea>::iterator b = core->getData()->areas.find(*a); if (serverWide || (b != core->getData()->areas.end() && b->second->amx == amx)) { a = p->second.internalAreas.erase(a); } else { ++a; } } return 1; } default: { Utility::logError("Streamer_DestroyAllVisibleItems: Invalid type specified"); return 0; } } } return 0; }