/** Initialises all track objects. */ void TrackObjectManager::init() { int moveable_objects = 0; bool warned = false; for (unsigned i = 0; i < m_all_objects.m_contents_vector.size(); i++) { TrackObject* curr = m_all_objects.m_contents_vector[i]; curr->onWorldReady(); if (moveable_objects > stk_config->m_max_moveable_objects) { if (!warned) { Log::warn("TrackObjectManager", "Too many moveable objects (>%d) in networking.", stk_config->m_max_moveable_objects); warned = true; } curr->setInitiallyVisible(false); curr->setEnabled(false); continue; } // onWorldReady will hide some track objects using scripting if (NetworkConfig::get()->isNetworking() && curr->isEnabled() && curr->getPhysicalObject() && curr->getPhysicalObject()->isDynamic()) { curr->getPhysicalObject()->getBody() ->setActivationState(DISABLE_DEACTIVATION); curr->getPhysicalObject()->addForRewind(); moveable_objects++; } } } // init
void TrackObjectManager::handleExplosion(const Vec3 &pos, const PhysicalObject *mp, bool secondary_hits) { TrackObject* curr; for_in (curr, m_all_objects) { if(secondary_hits || mp == curr->getPhysicalObject()) curr->handleExplosion(pos, mp == curr->getPhysicalObject()); } } // handleExplosion
/** Initialises all track objects. */ void TrackObjectManager::reset() { TrackObject* curr; for_in (curr, m_all_objects) { curr->reset(); if (!curr->isEnabled()) { //PhysicalObjects may need to be added if (curr->getType() == "mesh") { if (curr->getPhysicalObject() != NULL) curr->getPhysicalObject()->addBody(); } } curr->setEnable(true); }
/** Called when a battle is restarted. */ void SoccerWorld::reset() { WorldWithRank::reset(); if(race_manager->hasTimeTarget()) { WorldStatus::setClockMode(WorldStatus::CLOCK_COUNTDOWN, race_manager->getTimeTarget()); countDownReachedZero = false; } else WorldStatus::setClockMode(CLOCK_CHRONO); m_can_score_points = true; memset(m_team_goals, 0, sizeof(m_team_goals)); // Reset original positions for the soccer balls TrackObjectManager* tom = getTrack()->getTrackObjectManager(); assert(tom); m_redScorers.clear(); m_redScoreTimes.clear(); m_blueScorers.clear(); m_blueScoreTimes.clear(); m_lastKartToHitBall = -1; PtrVector<TrackObject>& objects = tom->getObjects(); for(unsigned int i=0; i<objects.size(); i++) { TrackObject* obj = objects.get(i); if(!obj->isSoccerBall()) continue; obj->reset(); obj->getPhysicalObject()->reset(); } if (m_goal_sound != NULL && m_goal_sound->getStatus() == SFXBase::SFX_PLAYING) { m_goal_sound->stop(); } initKartList(); } // reset
//----------------------------------------------------------------------------- void SoccerWorld::onCheckGoalTriggered(bool first_goal) { if (isRaceOver()) return; if (m_can_score_points) { m_team_goals[first_goal ? 0 : 1]++; World *world = World::getWorld(); world->setPhase(WorldStatus::GOAL_PHASE); m_goal_sound->play(); if(m_lastKartToHitBall != -1) { if(first_goal) { m_redScorers.push_back(m_lastKartToHitBall); if(race_manager->hasTimeTarget()) m_redScoreTimes.push_back(race_manager->getTimeTarget() - world->getTime()); else m_redScoreTimes.push_back(world->getTime()); } else { m_blueScorers.push_back(m_lastKartToHitBall); if(race_manager->hasTimeTarget()) m_blueScoreTimes.push_back(race_manager->getTimeTarget() - world->getTime()); else m_blueScoreTimes.push_back(world->getTime()); } } } // Reset original positions for the soccer balls TrackObjectManager* tom = getTrack()->getTrackObjectManager(); assert(tom); PtrVector<TrackObject>& objects = tom->getObjects(); for(unsigned int i=0; i<objects.size(); i++) { TrackObject* obj = objects.get(i); if(!obj->isSoccerBall()) continue; obj->reset(); obj->getPhysicalObject()->reset(); } //Resetting the ball triggers the goal check line one more time. //This ensures that only one goal is counted, and the second is ignored. m_can_score_points = !m_can_score_points; //for(int i=0 ; i < getNumKarts() ; i++ /*if(World::getWorld()->getTrack()->isAutoRescueEnabled() && !getKartAnimation() && fabs(getRoll())>60*DEGREE_TO_RAD && fabs(getSpeed())<3.0f ) { new RescueAnimation(this, true); }*/ // TODO: rescue the karts } // onCheckGoalTriggered