diff --git a/scene/animation/tween.cpp b/scene/animation/tween.cpp index a6be7d52e6a..55ca97cd954 100644 --- a/scene/animation/tween.cpp +++ b/scene/animation/tween.cpp @@ -303,6 +303,8 @@ Ref Tween::chain() { } bool Tween::custom_step(double p_delta) { + ERR_FAIL_COND_V_MSG(in_step, true, "Can't call custom_step() during another Tween step."); + bool r = running; running = true; bool ret = step(p_delta); @@ -329,6 +331,7 @@ bool Tween::step(double p_delta) { if (!running) { return true; } + in_step = true; if (!started) { if (tweeners.is_empty()) { @@ -339,6 +342,7 @@ bool Tween::step(double p_delta) { } else { tween_id = to_string(); } + in_step = false; ERR_FAIL_V_MSG(false, tween_id + ": started with no Tweeners."); } current_step = 0; @@ -357,7 +361,7 @@ bool Tween::step(double p_delta) { bool potential_infinite = false; #endif - while (rem_delta > 0 && running) { + while (running && rem_delta > 0) { double step_delta = rem_delta; step_active = false; @@ -392,6 +396,7 @@ bool Tween::step(double p_delta) { potential_infinite = true; } else { // Looped twice without using any time, this is 100% certain infinite loop. + in_step = false; ERR_FAIL_V_MSG(false, "Infinite loop detected. Check set_loops() description for more info."); } } @@ -402,7 +407,7 @@ bool Tween::step(double p_delta) { } } } - + in_step = false; return true; } diff --git a/scene/animation/tween.h b/scene/animation/tween.h index d31f491cecf..8238cd8633d 100644 --- a/scene/animation/tween.h +++ b/scene/animation/tween.h @@ -122,6 +122,7 @@ private: bool is_bound = false; bool started = false; bool running = true; + bool in_step = false; bool dead = false; bool valid = false; bool default_parallel = false;