diff --git a/src/karts/kart.cpp b/src/karts/kart.cpp index b4d250c22..796b65d66 100644 --- a/src/karts/kart.cpp +++ b/src/karts/kart.cpp @@ -427,6 +427,14 @@ void Kart::reset() } // reset +// ----------------------------------------------------------------------------- +void Kart::setXYZ(const Vec3& a) +{ + AbstractKart::setXYZ(a); + Vec3 front(0, 0, getKartLength()*0.5f); + m_xyz_front = getTrans()(front); +} // setXYZ + // ----------------------------------------------------------------------------- void Kart::increaseMaxSpeed(unsigned int category, float add_speed, float engine_force, float duration, diff --git a/src/karts/kart.hpp b/src/karts/kart.hpp index d5327225a..aa3a7a87f 100644 --- a/src/karts/kart.hpp +++ b/src/karts/kart.hpp @@ -286,6 +286,7 @@ public: virtual bool playCustomSFX (unsigned int type); virtual void setController(Controller *controller); + virtual void setXYZ(const Vec3& a); // ======================================================================== // Powerup related functions. diff --git a/src/karts/moveable.hpp b/src/karts/moveable.hpp index 8f6e4591c..4908be575 100644 --- a/src/karts/moveable.hpp +++ b/src/karts/moveable.hpp @@ -84,7 +84,7 @@ public: virtual void stopFlying(); /** Sets the XYZ coordinates of the moveable. */ - void setXYZ(const Vec3& a) + virtual void setXYZ(const Vec3& a) { m_transform.setOrigin(a); if(m_motion_state) diff --git a/src/modes/world.cpp b/src/modes/world.cpp index 1d2798cfe..a88282077 100644 --- a/src/modes/world.cpp +++ b/src/modes/world.cpp @@ -781,6 +781,7 @@ void World::moveKartTo(AbstractKart* kart, const btTransform &transform) // Project kart to surface of track // This will set the physics transform Track::getCurrentTrack()->findGround(kart); + CheckManager::get()->resetAfterKartMove(kart); } // moveKartTo diff --git a/src/tracks/check_line.cpp b/src/tracks/check_line.cpp index ec5252f70..f18ae1295 100644 --- a/src/tracks/check_line.cpp +++ b/src/tracks/check_line.cpp @@ -137,6 +137,13 @@ void CheckLine::reset(const Track &track) } } // reset +// ---------------------------------------------------------------------------- +void CheckLine::resetAfterKartMove(unsigned int kart_index) +{ + AbstractKart *kart = World::getWorld()->getKart(kart_index); + m_previous_position[kart_index] = kart->getXYZ(); +} // resetAfterKartMove + // ---------------------------------------------------------------------------- void CheckLine::changeDebugColor(bool is_active) { @@ -167,7 +174,7 @@ void CheckLine::changeDebugColor(bool is_active) * additional data. */ bool CheckLine::isTriggered(const Vec3 &old_pos, const Vec3 &new_pos, - unsigned int kart_index) + unsigned int kart_index) { World* w = World::getWorld(); core::vector2df p=new_pos.toIrrVector2d(); diff --git a/src/tracks/check_line.hpp b/src/tracks/check_line.hpp index 7d24f3a6f..1da3ec34c 100644 --- a/src/tracks/check_line.hpp +++ b/src/tracks/check_line.hpp @@ -77,6 +77,7 @@ public: virtual bool isTriggered(const Vec3 &old_pos, const Vec3 &new_pos, unsigned int indx); virtual void reset(const Track &track); + virtual void resetAfterKartMove(unsigned int kart_index); virtual void changeDebugColor(bool is_active); /** Returns the actual line data for this checkpoint. */ const core::line2df &getLine2D() const {return m_line;} diff --git a/src/tracks/check_manager.cpp b/src/tracks/check_manager.cpp index 8f4788162..502a84006 100644 --- a/src/tracks/check_manager.cpp +++ b/src/tracks/check_manager.cpp @@ -22,6 +22,7 @@ #include #include "io/xml_node.hpp" +#include "karts/abstract_kart.hpp" #include "tracks/ambient_light_sphere.hpp" #include "tracks/check_cannon.hpp" #include "tracks/check_goal.hpp" @@ -117,6 +118,19 @@ void CheckManager::reset(const Track &track) (*i)->reset(track); } // reset +// ---------------------------------------------------------------------------- +/** Called after a kart is moved (e.g. after a rescue) to reset any cached + * check information. Without this an incorrect crossing of a checkline + * could be triggered since a CheckLine stores the previous position). + * \param kart_index Index of the kart that was moved. + */ +void CheckManager::resetAfterKartMove(AbstractKart *kart) +{ + std::vector::iterator i; + for (i = m_all_checks.begin(); i != m_all_checks.end(); i++) + (*i)->resetAfterKartMove(kart->getWorldKartId()); +} // resetAfterKartMove + // ---------------------------------------------------------------------------- /** Updates all animations. Called one per time step. * \param dt Time since last call. diff --git a/src/tracks/check_manager.hpp b/src/tracks/check_manager.hpp index 44fb32ea1..93b97cdf8 100644 --- a/src/tracks/check_manager.hpp +++ b/src/tracks/check_manager.hpp @@ -25,6 +25,7 @@ #include #include +class AbstractKart; class CheckStructure; class Track; class XMLNode; @@ -48,6 +49,7 @@ public: void load(const XMLNode &node); void update(float dt); void reset(const Track &track); + void resetAfterKartMove(AbstractKart *kart); unsigned int getLapLineIndex() const; int getChecklineTriggering(const Vec3 &from, const Vec3 &to) const; // ------------------------------------------------------------------------ diff --git a/src/tracks/check_structure.hpp b/src/tracks/check_structure.hpp index e5e3a24c6..921c7b3bc 100644 --- a/src/tracks/check_structure.hpp +++ b/src/tracks/check_structure.hpp @@ -105,6 +105,7 @@ public: CheckStructure(const XMLNode &node, unsigned int index); virtual ~CheckStructure() {}; virtual void update(float dt); + virtual void resetAfterKartMove(unsigned int kart_index) {}; virtual void changeDebugColor(bool is_active) {} /** True if going from old_pos to new_pos crosses this checkline. This function * is called from update (of the checkline structure).