Plan: Fix syncing derived plan sometimes fails on var rename

This commit is contained in:
Serhii Snitsaruk 2024-03-25 01:04:07 +01:00
parent 1de6256401
commit a5aea72a17
No known key found for this signature in database
GPG Key ID: A965EF8799FFEC2D
1 changed files with 8 additions and 1 deletions

View File

@ -140,6 +140,7 @@ bool BlackboardPlan::is_prefetching_nodepath_vars() const {
} }
void BlackboardPlan::add_var(const StringName &p_name, const BBVariable &p_var) { void BlackboardPlan::add_var(const StringName &p_name, const BBVariable &p_var) {
ERR_FAIL_COND(p_name == StringName());
ERR_FAIL_COND(var_map.has(p_name)); ERR_FAIL_COND(var_map.has(p_name));
var_map.insert(p_name, p_var); var_map.insert(p_name, p_var);
var_list.push_back(Pair<StringName, BBVariable>(p_name, p_var)); var_list.push_back(Pair<StringName, BBVariable>(p_name, p_var));
@ -198,6 +199,7 @@ void BlackboardPlan::rename_var(const StringName &p_name, const StringName &p_ne
ERR_FAIL_COND(!is_valid_var_name(p_new_name)); ERR_FAIL_COND(!is_valid_var_name(p_new_name));
ERR_FAIL_COND(!var_map.has(p_name)); ERR_FAIL_COND(!var_map.has(p_name));
ERR_FAIL_COND(var_map.has(p_new_name));
BBVariable var = var_map[p_name]; BBVariable var = var_map[p_name];
Pair<StringName, BBVariable> new_entry(p_new_name, var); Pair<StringName, BBVariable> new_entry(p_new_name, var);
@ -270,12 +272,17 @@ void BlackboardPlan::sync_with_base_plan() {
} }
// Erase variables that do not exist in the base plan. // Erase variables that do not exist in the base plan.
List<StringName> erase_list;
for (const Pair<StringName, BBVariable> &p : var_list) { for (const Pair<StringName, BBVariable> &p : var_list) {
if (!base->has_var(p.first)) { if (!base->has_var(p.first)) {
remove_var(p.first); erase_list.push_back(p.first);
changed = true; changed = true;
} }
} }
while (erase_list.size()) {
remove_var(erase_list.front()->get());
erase_list.pop_front();
}
// Sync order of variables. // Sync order of variables.
// Glossary: E - element of current plan, B - element of base plan, F - element of current plan (used for forward search). // Glossary: E - element of current plan, B - element of base plan, F - element of current plan (used for forward search).