Skip to content

Commit

Permalink
Merge pull request #9 from Rubonnek/pass-callmethod-delta
Browse files Browse the repository at this point in the history
Allow BTCallMethod to include its delta as an argument
  • Loading branch information
limbonaut authored Dec 28, 2023
2 parents 586cdb2 + ab311c5 commit 8af747c
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 7 deletions.
32 changes: 26 additions & 6 deletions bt/tasks/utility/bt_call_method.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@ void BTCallMethod::set_node_param(Ref<BBNode> p_object) {
}
}

void BTCallMethod::set_include_delta(bool p_include_delta) {
include_delta = p_include_delta;
emit_changed();
}

void BTCallMethod::set_args(Array p_args) {
args = p_args;
emit_changed();
Expand All @@ -49,9 +54,15 @@ PackedStringArray BTCallMethod::get_configuration_warnings() const {
}

String BTCallMethod::_generate_name() const {
int argument_count = include_delta ? args.size() + 1 : args.size();
Array final_args;
if (include_delta) {
final_args.push_back("delta");
}
final_args.append_array(args);
return vformat("CallMethod %s(%s) node: %s",
(method != StringName() ? method : "???"),
(args.size() > 0 ? Variant(args).get_construct_string().trim_prefix("[").trim_suffix("]") : ""),
(argument_count > 0 ? Variant(final_args).get_construct_string().trim_prefix("[").trim_suffix("]") : ""),
(node_param.is_valid() && !node_param->to_string().is_empty() ? node_param->to_string() : "???"));
}

Expand All @@ -61,19 +72,24 @@ BT::Status BTCallMethod::_tick(double p_delta) {
Object *obj = node_param->get_value(get_agent(), get_blackboard());
ERR_FAIL_COND_V_MSG(obj == nullptr, FAILURE, "BTCallMethod: Failed to get object: " + node_param->to_string());

const Variant delta = include_delta ? Variant(p_delta) : Variant();
const Variant **argptrs = nullptr;

if (args.size() > 0) {
argptrs = (const Variant **)alloca(sizeof(Variant *) * args.size());
int argument_count = include_delta ? args.size() + 1 : args.size();
if (argument_count > 0) {
argptrs = (const Variant **)alloca(sizeof(Variant *) * argument_count);
if (include_delta) {
argptrs[0] = &delta;
}
for (int i = 0; i < args.size(); i++) {
argptrs[i] = &args[i];
argptrs[i + int(include_delta)] = &args[i];
}
}

Callable::CallError ce;
obj->callp(method, argptrs, args.size(), ce);
obj->callp(method, argptrs, argument_count, ce);
if (ce.error != Callable::CallError::CALL_OK) {
ERR_FAIL_V_MSG(FAILURE, "BTCallMethod: Error calling method: " + Variant::get_call_error_text(obj, method, argptrs, args.size(), ce) + ".");
ERR_FAIL_V_MSG(FAILURE, "BTCallMethod: Error calling method: " + Variant::get_call_error_text(obj, method, argptrs, argument_count, ce) + ".");
}

return SUCCESS;
Expand All @@ -88,8 +104,12 @@ void BTCallMethod::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_node_param"), &BTCallMethod::get_node_param);
ClassDB::bind_method(D_METHOD("set_args", "p_args"), &BTCallMethod::set_args);
ClassDB::bind_method(D_METHOD("get_args"), &BTCallMethod::get_args);
ClassDB::bind_method(D_METHOD("set_include_delta", "p_include_delta"), &BTCallMethod::set_include_delta);
ClassDB::bind_method(D_METHOD("is_delta_included"), &BTCallMethod::is_delta_included);

ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "method"), "set_method", "get_method");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_RESOURCE_TYPE, "BBNode"), "set_node_param", "get_node_param");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "include_delta"), "set_include_delta", "is_delta_included");
ADD_PROPERTY_DEFAULT("include_delta", false);
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "args"), "set_args", "get_args");
}
6 changes: 5 additions & 1 deletion bt/tasks/utility/bt_call_method.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class BTCallMethod : public BTAction {
StringName method;
Ref<BBNode> node_param;
Array args;
bool include_delta = false;

protected:
static void _bind_methods();
Expand All @@ -41,7 +42,10 @@ class BTCallMethod : public BTAction {
void set_args(Array p_args);
Array get_args() const { return args; }

void set_include_delta(bool p_include_delta);
bool is_delta_included() const { return include_delta; }

virtual PackedStringArray get_configuration_warnings() const override;
};

#endif // BT_CALL_METHOD
#endif // BT_CALL_METHOD
3 changes: 3 additions & 0 deletions doc_classes/BTCallMethod.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
<member name="args" type="Array" setter="set_args" getter="get_args" default="[]">
The arguments to be passed when calling the method.
</member>
<member name="include_delta" type="bool" setter="set_include_delta" getter="is_delta_included" default="false">
Include delta as a first parameter and shift the position of the rest of the arguments if any.
</member>
<member name="method" type="StringName" setter="set_method" getter="get_method" default="&amp;&quot;&quot;">
The name of the method to be called.
</member>
Expand Down

0 comments on commit 8af747c

Please sign in to comment.