mirror of
https://github.com/godotengine/godot.git
synced 2025-10-20 00:13:30 +00:00
Merge pull request #62805 from raulsntos/csharp-rpc
This commit is contained in:
commit
31974aaae2
7 changed files with 76 additions and 41 deletions
|
@ -3069,16 +3069,11 @@ void CSharpScript::update_script_class_info(Ref<CSharpScript> p_script) {
|
|||
Vector<GDMonoMethod *> methods = top->get_all_methods();
|
||||
for (int i = 0; i < methods.size(); i++) {
|
||||
if (!methods[i]->is_static()) {
|
||||
Multiplayer::RPCMode mode = p_script->_member_get_rpc_mode(methods[i]);
|
||||
if (Multiplayer::RPC_MODE_DISABLED != mode) {
|
||||
Multiplayer::RPCConfig nd;
|
||||
nd.name = methods[i]->get_name();
|
||||
nd.rpc_mode = mode;
|
||||
// TODO Transfer mode, channel
|
||||
nd.transfer_mode = Multiplayer::TRANSFER_MODE_RELIABLE;
|
||||
nd.channel = 0;
|
||||
if (-1 == p_script->rpc_functions.find(nd)) {
|
||||
p_script->rpc_functions.push_back(nd);
|
||||
Multiplayer::RPCConfig rpc_config = p_script->_member_get_rpc_config(methods[i]);
|
||||
if (rpc_config.rpc_mode != Multiplayer::RPC_MODE_DISABLED) {
|
||||
// RPC annotations can only be used once per method
|
||||
if (p_script->rpc_functions.find(rpc_config) == -1) {
|
||||
p_script->rpc_functions.push_back(rpc_config);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3513,15 +3508,19 @@ int CSharpScript::get_member_line(const StringName &p_member) const {
|
|||
return -1;
|
||||
}
|
||||
|
||||
Multiplayer::RPCMode CSharpScript::_member_get_rpc_mode(IMonoClassMember *p_member) const {
|
||||
if (p_member->has_attribute(CACHED_CLASS(AnyPeerAttribute))) {
|
||||
return Multiplayer::RPC_MODE_ANY_PEER;
|
||||
}
|
||||
if (p_member->has_attribute(CACHED_CLASS(AuthorityAttribute))) {
|
||||
return Multiplayer::RPC_MODE_AUTHORITY;
|
||||
Multiplayer::RPCConfig CSharpScript::_member_get_rpc_config(IMonoClassMember *p_member) const {
|
||||
Multiplayer::RPCConfig rpc_config;
|
||||
|
||||
MonoObject *rpc_attribute = p_member->get_attribute(CACHED_CLASS(RPCAttribute));
|
||||
if (rpc_attribute != nullptr) {
|
||||
rpc_config.name = p_member->get_name();
|
||||
rpc_config.rpc_mode = (Multiplayer::RPCMode)CACHED_PROPERTY(RPCAttribute, Mode)->get_int_value(rpc_attribute);
|
||||
rpc_config.call_local = CACHED_PROPERTY(RPCAttribute, CallLocal)->get_bool_value(rpc_attribute);
|
||||
rpc_config.transfer_mode = (Multiplayer::TransferMode)CACHED_PROPERTY(RPCAttribute, TransferMode)->get_int_value(rpc_attribute);
|
||||
rpc_config.channel = CACHED_PROPERTY(RPCAttribute, TransferChannel)->get_int_value(rpc_attribute);
|
||||
}
|
||||
|
||||
return Multiplayer::RPC_MODE_DISABLED;
|
||||
return rpc_config;
|
||||
}
|
||||
|
||||
const Vector<Multiplayer::RPCConfig> CSharpScript::get_rpc_methods() const {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue