bool Garage::isObjectInsideGarage(GameObject* object) const { auto p = object->getPosition(); // Do basic check first if (p.x < min.x) return false; if (p.y < min.y) return false; if (p.z < min.z) return false; if (p.x > max.x) return false; if (p.y > max.y) return false; if (p.z > max.z) return false; // Now check if all collision spheres are inside // garage's bounding box auto objectModel = object->getModelInfo<BaseModelInfo>(); auto collision = objectModel->getCollision(); // Peds don't have collisions currently? if (collision) { for (auto& sphere : collision->spheres) { auto c = p + sphere.center; auto r = sphere.radius; if (c.x + r < min.x) return false; if (c.y + r < min.y) return false; if (c.z + r < min.z) return false; if (c.x - r > max.x) return false; if (c.y - r > max.y) return false; if (c.z - r > max.z) return false; } } return true; }
ofxMSAPhysics* ofxMSAPhysics::removeFromCollision(ofxMSAParticle* p) { for(int i=0; i<numberOfCollisions(); i++) { ofxMSAConstraint *c = getCollision(i); if(c->_a == p || c->_b == p) c->kill(); } return this; }
void iPhysics::destroyCollision(uint64 collisionID) { iPhysicsCollision* collision = getCollision(collisionID); if (collision != nullptr) { destroyCollision(collision); } }
void CWorldManager::runPeople() { for(unsigned int i = 0; i < person_manager.size(); i++) { person_manager[i]->run(); for(unsigned int n = 0; n < person_manager.size(); n++) { if(person_manager[n] != person_manager[i]) { //battle it out automatically if(getCollision(person_manager[n], person_manager[i])) { createBattle(player,person_manager[i]); } } } } }
Garage::Garage(GameWorld* engine_, size_t id_, const glm::vec3& coord0, const glm::vec3& coord1, Type type_) : engine(engine_), id(id_), type(type_) { min.x = std::min(coord0.x, coord1.x); min.y = std::min(coord0.y, coord1.y); min.z = std::min(coord0.z, coord1.z); max.x = std::max(coord0.x, coord1.x); max.y = std::max(coord0.y, coord1.y); max.z = std::max(coord0.z, coord1.z); glm::vec2 midpoint; midpoint.x = (min.x + max.x) / 2; midpoint.y = (min.y + max.y) / 2; // Find door objects for this garage for (const auto& p : engine->instancePool.objects) { const auto inst = static_cast<InstanceObject*>(p.second.get()); if (!inst->getModel()) { continue; } if (!SimpleModelInfo::isDoorModel( inst->getModelInfo<BaseModelInfo>()->name)) { continue; } const auto instPos = inst->getPosition(); const auto xDist = std::abs(instPos.x - midpoint.x); const auto yDist = std::abs(instPos.y - midpoint.y); if (xDist < 20.f && yDist < 20.f) { if (!doorObject) { doorObject = inst; continue; } else { secondDoorObject = inst; } } } if (doorObject) { startPosition = doorObject->getPosition(); // Setup door height based on model's bounding box auto doorModel = doorObject->getModelInfo<BaseModelInfo>(); auto collision = doorModel->getCollision(); // Original behavior - game actually subtracts 0.1f doorHeight = collision->boundingBox.max.z - collision->boundingBox.min.z - 0.1f; } if (secondDoorObject) { startPositionSecondDoor = secondDoorObject->getPosition(); } step /= doorHeight; switch (type) { case Garage::Type::Mission: case Garage::Type::CollectCars1: case Garage::Type::CollectCars2: case Garage::Type::MissionForCarToComeOut: case Garage::Type::MissionKeepCar: case Garage::Type::Hideout1: case Garage::Type::Hideout2: case Garage::Type::Hideout3: case Garage::Type::MissionToOpenAndClose: case Garage::Type::MissionForSpecificCar: case Garage::Type::MissionKeepCarAndRemainClosed: { state = State::Closed; break; } case Garage::Type::BombShop1: case Garage::Type::BombShop2: case Garage::Type::BombShop3: case Garage::Type::Respray: case Garage::Type::Crusher: { state = State::Opened; break; } } if (state == State::Closed) { fraction = 0.f; } else { fraction = 1.f; } if (doorObject) { updateDoor(); } }
WeaponItem* WeaponManager::getItem(std::string name) { return new WeaponItem(getWeapon(name), getCollision(name)); }