More work on networking.

This commit is contained in:
Relintai 2019-10-29 13:36:33 +01:00
parent c02fd1e9f3
commit d410497b71
4 changed files with 80 additions and 49 deletions

View File

@ -82,10 +82,18 @@ Entity *AuraData::get_caster() {
void AuraData::set_caster(Entity *value) { void AuraData::set_caster(Entity *value) {
_caster = value; _caster = value;
if (!value) {
_caster_path = NodePath();
return;
}
_caster_path = _caster->get_path();
} }
void AuraData::set_caster_bind(Node *value) { void AuraData::set_caster_bind(Node *value) {
if (!value) { if (!value) {
set_caster(NULL);
return; return;
} }
@ -95,15 +103,14 @@ void AuraData::set_caster_bind(Node *value) {
return; return;
} }
_caster = e; set_caster(e);
} }
int AuraData::get_caster_guid() { NodePath AuraData::get_caster_path() {
return _caster_guid; return _caster_path;
} }
void AuraData::set_caster_path(NodePath value) {
void AuraData::set_caster_guid(int value) { _caster_path = value;
_caster_guid = value;
} }
float AuraData::get_spell_scale() { float AuraData::get_spell_scale() {
@ -230,7 +237,7 @@ Dictionary AuraData::_to_dict() {
dict["aura_id"] = _aura_id; dict["aura_id"] = _aura_id;
dict["remaining_time"] = _remaining_time; dict["remaining_time"] = _remaining_time;
dict["caster_name"] = _caster->gets_entity_name(); dict["caster_path"] = _caster_path;
dict["spell_scale"] = _spell_scale; dict["spell_scale"] = _spell_scale;
dict["aura_group"] = _aura_group; dict["aura_group"] = _aura_group;
@ -253,7 +260,7 @@ void AuraData::_from_dict(const Dictionary &dict) {
_aura_id = dict.get("aura_id", 0); _aura_id = dict.get("aura_id", 0);
_remaining_time = dict.get("remaining_time", 0); _remaining_time = dict.get("remaining_time", 0);
String caster_name = dict.get("caster_name", ""); _caster_path = dict.get("caster_path", NodePath());
_spell_scale = dict.get("spell_scale", 0); _spell_scale = dict.get("spell_scale", 0);
@ -306,7 +313,6 @@ AuraData::AuraData() {
_aura_id = 0; _aura_id = 0;
_remaining_time = 0; _remaining_time = 0;
_caster = NULL; _caster = NULL;
_caster_guid = 0;
_spell_scale = 0; _spell_scale = 0;
_aura_group = 0; _aura_group = 0;
@ -342,9 +348,9 @@ void AuraData::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_caster", "value"), &AuraData::set_caster_bind); ClassDB::bind_method(D_METHOD("set_caster", "value"), &AuraData::set_caster_bind);
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "caster", PROPERTY_HINT_RESOURCE_TYPE, "Entity"), "set_caster", "get_caster"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "caster", PROPERTY_HINT_RESOURCE_TYPE, "Entity"), "set_caster", "get_caster");
ClassDB::bind_method(D_METHOD("get_caster_guid"), &AuraData::get_caster_guid); ClassDB::bind_method(D_METHOD("get_caster_path"), &AuraData::get_caster_path);
ClassDB::bind_method(D_METHOD("set_caster_guid", "value"), &AuraData::set_caster_guid); ClassDB::bind_method(D_METHOD("set_caster_path", "value"), &AuraData::set_caster_path);
ADD_PROPERTY(PropertyInfo(Variant::INT, "caster_guid"), "set_caster_guid", "get_caster_guid"); ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "caster_path"), "set_caster_path", "get_caster_path");
ClassDB::bind_method(D_METHOD("get_aura"), &AuraData::get_aura); ClassDB::bind_method(D_METHOD("get_aura"), &AuraData::get_aura);
ClassDB::bind_method(D_METHOD("set_aura", "value"), &AuraData::set_aura); ClassDB::bind_method(D_METHOD("set_aura", "value"), &AuraData::set_aura);

View File

@ -32,8 +32,8 @@ public:
void set_caster(Entity *value); void set_caster(Entity *value);
void set_caster_bind(Node *value); void set_caster_bind(Node *value);
int get_caster_guid(); NodePath get_caster_path();
void set_caster_guid(int value); void set_caster_path(NodePath value);
float get_spell_scale(); float get_spell_scale();
void set_spell_scale(float value); void set_spell_scale(float value);
@ -90,7 +90,7 @@ private:
int _aura_id; int _aura_id;
float _remaining_time; float _remaining_time;
Entity *_caster; Entity *_caster;
int _caster_guid; NodePath _caster_path;
float _spell_scale; float _spell_scale;
int _aura_group; int _aura_group;
Ref<Aura> _aura; Ref<Aura> _aura;

View File

@ -2238,6 +2238,8 @@ void Entity::cadd_aura_rpc(String data) {
Ref<AuraData> aura; Ref<AuraData> aura;
aura.instance(); aura.instance();
aura->from_dict(data_as_dict(data)); aura->from_dict(data_as_dict(data));
aura->set_owner(this);
//aura->set_caster_bind(get_node_or_null(aura->get_caster_path()));
cadd_aura(aura); cadd_aura(aura);
} }
@ -2246,6 +2248,8 @@ void Entity::cremove_aura_rpc(String data) {
Ref<AuraData> aura; Ref<AuraData> aura;
aura.instance(); aura.instance();
aura->from_dict(data_as_dict(data)); aura->from_dict(data_as_dict(data));
aura->set_owner(this);
//aura->set_caster_bind(get_node_or_null(aura->get_caster_path()));
cremove_aura(aura); cremove_aura(aura);
} }
@ -2254,6 +2258,8 @@ void Entity::cremove_aura_exact_rpc(String data) {
Ref<AuraData> aura; Ref<AuraData> aura;
aura.instance(); aura.instance();
aura->from_dict(data_as_dict(data)); aura->from_dict(data_as_dict(data));
aura->set_owner(this);
//aura->set_caster_bind(get_node_or_null(aura->get_caster_path()));
cremove_aura_exact(aura); cremove_aura_exact(aura);
} }
@ -2262,6 +2268,8 @@ void Entity::cremove_aura_expired_rpc(String data) {
Ref<AuraData> aura; Ref<AuraData> aura;
aura.instance(); aura.instance();
aura->from_dict(data_as_dict(data)); aura->from_dict(data_as_dict(data));
aura->set_owner(this);
//aura->set_caster_bind(get_node_or_null(aura->get_caster_path()));
cremove_aura_expired(aura); cremove_aura_expired(aura);
} }
@ -2270,6 +2278,8 @@ void Entity::cremove_aura_dispelled_rpc(String data) {
Ref<AuraData> aura; Ref<AuraData> aura;
aura.instance(); aura.instance();
aura->from_dict(data_as_dict(data)); aura->from_dict(data_as_dict(data));
aura->set_owner(this);
//aura->set_caster_bind(get_node_or_null(aura->get_caster_path()));
cremove_aura_dispelled(aura); cremove_aura_dispelled(aura);
} }
@ -2278,6 +2288,8 @@ void Entity::caura_refreshed_rpc(String data) {
Ref<AuraData> aura; Ref<AuraData> aura;
aura.instance(); aura.instance();
aura->from_dict(data_as_dict(data)); aura->from_dict(data_as_dict(data));
aura->set_owner(this);
//aura->set_caster_bind(get_node_or_null(aura->get_caster_path()));
caura_refreshed(aura); caura_refreshed(aura);
} }
@ -4020,22 +4032,12 @@ void Entity::update(float delta) {
Ref<Cooldown> cd = _c_cooldowns.get(i); Ref<Cooldown> cd = _c_cooldowns.get(i);
cd->update(delta); cd->update(delta);
// if (cd->update(delta)) {
// removec_cooldown(cd->get_spell_id());
// --i;
// }
} }
for (int i = 0; i < _c_category_cooldowns.size(); ++i) { for (int i = 0; i < _c_category_cooldowns.size(); ++i) {
Ref<CategoryCooldown> cd = _c_category_cooldowns.get(i); Ref<CategoryCooldown> cd = _c_category_cooldowns.get(i);
cd->update(delta); cd->update(delta);
// if (cd->update(delta)) {
// removec_category_cooldown(cd->get_category_id());
// --i;
// }
} }
for (int i = 0; i < _s_cooldowns.size(); ++i) { for (int i = 0; i < _s_cooldowns.size(); ++i) {
@ -4066,11 +4068,19 @@ void Entity::update(float delta) {
} }
} }
if (ISSERVER()) {
if (_s_spell_cast_info.is_valid() && _s_spell_cast_info->get_is_casting()) { if (_s_spell_cast_info.is_valid() && _s_spell_cast_info->get_is_casting()) {
if (_s_spell_cast_info->update_cast_time(delta)) { if (_s_spell_cast_info->update_cast_time(delta)) {
sfinish_cast(); sfinish_cast();
} }
} }
}
if (ISCLIENT()) {
if (_c_spell_cast_info.is_valid() && _c_spell_cast_info->get_is_casting()) {
_c_spell_cast_info->update_cast_time(delta);
}
}
if (ISSERVER()) { if (ISSERVER()) {
for (int i = 0; i < Stat::STAT_ID_TOTAL_STATS; ++i) { for (int i = 0; i < Stat::STAT_ID_TOTAL_STATS; ++i) {
@ -4099,35 +4109,49 @@ Entity *Entity::gets_sees(int index) {
return _s_sees.get(index); return _s_sees.get(index);
} }
void Entity::removes_sees_index(int index) { void Entity::removes_sees_index(int index) {
Entity *e = _s_sees.get(index);
if (unlikely(!ObjectDB::instance_validate(e))) {
_s_sees.remove(index); _s_sees.remove(index);
return;
} }
e->removes_seen_by(this);
_s_sees.remove(index);
}
void Entity::removes_sees(Entity *entity) { void Entity::removes_sees(Entity *entity) {
if (unlikely(!ObjectDB::instance_validate(entity))) {
_s_sees.erase(entity);
return;
}
entity->removes_seen_by(this);
_s_sees.erase(entity); _s_sees.erase(entity);
} }
void Entity::removes_sees_bind(Node *entity) { void Entity::removes_sees_bind(Node *entity) {
Entity *e = Object::cast_to<Entity>(entity); Entity *e = Object::cast_to<Entity>(entity);
if (!e) ERR_FAIL_COND(!e);
return;
removes_sees(e); removes_sees(e);
} }
void Entity::adds_sees(Entity *entity) { void Entity::adds_sees(Entity *entity) {
ERR_FAIL_COND(!ObjectDB::instance_validate(entity));
entity->adds_seen_by(this);
_s_sees.push_back(entity); _s_sees.push_back(entity);
} }
void Entity::adds_sees_bind(Node *entity) { void Entity::adds_sees_bind(Node *entity) {
Entity *e = Object::cast_to<Entity>(entity); Entity *e = Object::cast_to<Entity>(entity);
if (!e) ERR_FAIL_COND(!e);
return;
adds_sees(e); adds_sees(e);
} }
int Entity::gets_sees_count() { int Entity::gets_sees_count() {
return _s_sees.size(); return _s_sees.size();
} }
@ -4137,31 +4161,28 @@ Entity *Entity::gets_seen_by(int index) {
return _s_seen_by.get(index); return _s_seen_by.get(index);
} }
void Entity::removes_seen_by_index(int index) { void Entity::removes_seen_by_index(int index) {
_s_seen_by.remove(index); _s_seen_by.remove(index);
} }
void Entity::removes_seen_by(Entity *entity) { void Entity::removes_seen_by(Entity *entity) {
_s_seen_by.erase(entity); _s_seen_by.erase(entity);
} }
void Entity::removes_seen_by_bind(Node *entity) { void Entity::removes_seen_by_bind(Node *entity) {
Entity *e = Object::cast_to<Entity>(entity); Entity *e = Object::cast_to<Entity>(entity);
if (!e) ERR_FAIL_COND(!e);
return;
removes_seen_by(e); removes_seen_by(e);
} }
void Entity::adds_seen_by(Entity *entity) { void Entity::adds_seen_by(Entity *entity) {
ERR_FAIL_COND(!ObjectDB::instance_validate(entity));
_s_seen_by.push_back(entity); _s_seen_by.push_back(entity);
} }
void Entity::adds_seen_by_bind(Node *entity) { void Entity::adds_seen_by_bind(Node *entity) {
Entity *e = Object::cast_to<Entity>(entity); Entity *e = Object::cast_to<Entity>(entity);
if (!e) ERR_FAIL_COND(!e);
return;
adds_seen_by(e); adds_seen_by(e);
} }
@ -4192,9 +4213,7 @@ void Entity::vrpc(const StringName &p_method, VARIANT_ARG_DECLARE) {
int netm = e->get_network_master(); int netm = e->get_network_master();
print_error(String::num(netm)); if (netm != 1)
if (netm != 0)
rpcp(netm, false, p_method, argptr, argc); rpcp(netm, false, p_method, argptr, argc);
} }
@ -4230,7 +4249,7 @@ Variant Entity::_vrpc_bind(const Variant **p_args, int p_argcount, Variant::Call
int netm = e->get_network_master(); int netm = e->get_network_master();
if (netm != 0) if (netm != 1)
rpcp(netm, false, method, &p_args[1], p_argcount - 1); rpcp(netm, false, method, &p_args[1], p_argcount - 1);
} }
@ -4584,7 +4603,13 @@ void Entity::_notification(int p_what) {
son_physics_process(); son_physics_process();
} break; } break;
case NOTIFICATION_EXIT_TREE: { case NOTIFICATION_EXIT_TREE: {
for (int i = 0; i < _s_seen_by.size(); ++i) {
Entity *e = _s_seen_by.get(i);
if (ObjectDB::instance_validate(e)) {
e->removes_sees(this);
}
}
} break; } break;
} }
} }

View File

@ -70,7 +70,7 @@ enum PlayerSendFlags {
}; };
#define ISSERVER() (is_inside_tree() && (!get_tree()->has_network_peer() || (get_tree()->has_network_peer() && get_tree()->is_network_server()))) #define ISSERVER() (is_inside_tree() && (!get_tree()->has_network_peer() || (get_tree()->has_network_peer() && get_tree()->is_network_server())))
#define ISCLIENT() (is_inside_tree() && get_tree()->has_network_peer() && !get_tree()->is_network_server() && get_tree()->get_network_peer()->get_connection_status() == NetworkedMultiplayerPeer::CONNECTION_CONNECTED) #define ISCLIENT() (is_inside_tree() && get_tree()->has_network_peer() && !get_tree()->is_network_server())
#define SET_RPC_OFF(p_method_name) rpc_config(p_method_name, MultiplayerAPI::RPC_MODE_DISABLED); #define SET_RPC_OFF(p_method_name) rpc_config(p_method_name, MultiplayerAPI::RPC_MODE_DISABLED);
#define SET_RPC_REMOTE(p_method_name) rpc_config(p_method_name, MultiplayerAPI::RPC_MODE_REMOTE); #define SET_RPC_REMOTE(p_method_name) rpc_config(p_method_name, MultiplayerAPI::RPC_MODE_REMOTE);