Allow BTCallMethod to include its delta as an argument
This commit is contained in:
parent
586cdb24bd
commit
ab311c5770
|
@ -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) {
|
void BTCallMethod::set_args(Array p_args) {
|
||||||
args = p_args;
|
args = p_args;
|
||||||
emit_changed();
|
emit_changed();
|
||||||
|
@ -49,9 +54,15 @@ PackedStringArray BTCallMethod::get_configuration_warnings() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
String BTCallMethod::_generate_name() 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",
|
return vformat("CallMethod %s(%s) node: %s",
|
||||||
(method != StringName() ? method : "???"),
|
(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() : "???"));
|
(node_param.is_valid() && !node_param->to_string().is_empty() ? node_param->to_string() : "???"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,19 +72,24 @@ BT::Status BTCallMethod::_tick(double p_delta) {
|
||||||
Object *obj = node_param->get_value(get_agent(), get_blackboard());
|
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());
|
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;
|
const Variant **argptrs = nullptr;
|
||||||
|
|
||||||
if (args.size() > 0) {
|
int argument_count = include_delta ? args.size() + 1 : args.size();
|
||||||
argptrs = (const Variant **)alloca(sizeof(Variant *) * args.size());
|
if (argument_count > 0) {
|
||||||
|
argptrs = (const Variant **)alloca(sizeof(Variant *) * argument_count);
|
||||||
|
if (include_delta) {
|
||||||
|
argptrs[0] = δ
|
||||||
|
}
|
||||||
for (int i = 0; i < args.size(); i++) {
|
for (int i = 0; i < args.size(); i++) {
|
||||||
argptrs[i] = &args[i];
|
argptrs[i + int(include_delta)] = &args[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Callable::CallError ce;
|
Callable::CallError ce;
|
||||||
obj->callp(method, argptrs, args.size(), ce);
|
obj->callp(method, argptrs, argument_count, ce);
|
||||||
if (ce.error != Callable::CallError::CALL_OK) {
|
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;
|
return SUCCESS;
|
||||||
|
@ -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("get_node_param"), &BTCallMethod::get_node_param);
|
||||||
ClassDB::bind_method(D_METHOD("set_args", "p_args"), &BTCallMethod::set_args);
|
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("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::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::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");
|
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "args"), "set_args", "get_args");
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ private:
|
||||||
StringName method;
|
StringName method;
|
||||||
Ref<BBNode> node_param;
|
Ref<BBNode> node_param;
|
||||||
Array args;
|
Array args;
|
||||||
|
bool include_delta = false;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
@ -41,6 +42,9 @@ public:
|
||||||
void set_args(Array p_args);
|
void set_args(Array p_args);
|
||||||
Array get_args() const { return 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;
|
virtual PackedStringArray get_configuration_warnings() const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,9 @@
|
||||||
<member name="args" type="Array" setter="set_args" getter="get_args" default="[]">
|
<member name="args" type="Array" setter="set_args" getter="get_args" default="[]">
|
||||||
The arguments to be passed when calling the method.
|
The arguments to be passed when calling the method.
|
||||||
</member>
|
</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="&""">
|
<member name="method" type="StringName" setter="set_method" getter="get_method" default="&""">
|
||||||
The name of the method to be called.
|
The name of the method to be called.
|
||||||
</member>
|
</member>
|
||||||
|
|
Loading…
Reference in New Issue