More work on networking.

This commit is contained in:
Relintai 2019-10-29 00:15:52 +01:00
parent 2a6b080cf6
commit 1994e023b2
2 changed files with 85 additions and 12 deletions

View File

@ -3879,7 +3879,7 @@ void Entity::sets_bag(const Ref<Bag> bag) {
emit_signal("sbag_changed", this, _s_bag);
ORPC(setc_bag, bag);
ORPCOBJ(setc_bag_rpc, JSON::print(_s_bag->to_dict()), setc_bag, bag);
}
Ref<Bag> Entity::getc_bag() const {
@ -3894,21 +3894,34 @@ void Entity::setc_bag(const Ref<Bag> bag) {
Ref<Bag> Entity::gets_target_bag() const {
return _s_target_bag;
}
void Entity::sets_target_bag(const Ref<Bag> bag) {
_s_target_bag = bag;
ORPC(setc_target_bag, bag);
ORPCOBJ(setc_target_bag_rpc, JSON::print(_s_target_bag->to_dict()), setc_target_bag, bag);
}
Ref<Bag> Entity::getc_target_bag() const {
return _c_target_bag;
}
void Entity::setc_target_bag(const Ref<Bag> bag) {
_c_target_bag = bag;
}
void Entity::setc_bag_rpc(String data) {
Ref<Bag> bag;
bag.instance();
bag->from_dict(data_as_dict(data));
setc_bag(bag);
}
void Entity::setc_target_bag_rpc(String data) {
Ref<Bag> bag;
bag.instance();
bag->from_dict(data_as_dict(data));
setc_target_bag(bag);
}
void Entity::crequest_loot(int index) {
sloot(index);
}
@ -4119,6 +4132,44 @@ int Entity::gets_sees_count() {
return _s_sees.size();
}
Entity *Entity::gets_seen_by(int index) {
ERR_FAIL_INDEX_V(index, _s_seen_by.size(), NULL);
return _s_seen_by.get(index);
}
void Entity::removes_seen_by_index(int index) {
_s_seen_by.remove(index);
}
void Entity::removes_seen_by(Entity *entity) {
_s_seen_by.erase(entity);
}
void Entity::removes_seen_by_bind(Node *entity) {
Entity *e = Object::cast_to<Entity>(entity);
if (!e)
return;
removes_seen_by(e);
}
void Entity::adds_seen_by(Entity *entity) {
_s_seen_by.push_back(entity);
}
void Entity::adds_seen_by_bind(Node *entity) {
Entity *e = Object::cast_to<Entity>(entity);
if (!e)
return;
adds_seen_by(e);
}
int Entity::gets_seen_by_count() {
return _s_seen_by.size();
}
void Entity::vrpc(const StringName &p_method, VARIANT_ARG_DECLARE) {
VARIANT_ARGPTRS;
@ -4130,11 +4181,11 @@ void Entity::vrpc(const StringName &p_method, VARIANT_ARG_DECLARE) {
argc++;
}
for (int i = 0; i < _s_sees.size(); ++i) {
Entity *e = _s_sees.get(i);
for (int i = 0; i < _s_seen_by.size(); ++i) {
Entity *e = _s_seen_by.get(i);
if (unlikely(!ObjectDB::instance_validate(e))) {
_s_sees.remove(i);
_s_seen_by.remove(i);
--i;
continue;
}
@ -4168,11 +4219,11 @@ Variant Entity::_vrpc_bind(const Variant **p_args, int p_argcount, Variant::Call
StringName method = *p_args[0];
for (int i = 0; i < _s_sees.size(); ++i) {
Entity *e = _s_sees.get(i);
for (int i = 0; i < _s_seen_by.size(); ++i) {
Entity *e = _s_seen_by.get(i);
if (unlikely(!ObjectDB::instance_validate(e))) {
_s_sees.remove(i);
_s_seen_by.remove(i);
--i;
continue;
}
@ -4449,8 +4500,8 @@ Entity::Entity() {
//// Inventory ////
SET_RPC_REMOTE("setc_bag");
SET_RPC_REMOTE("setc_target_bag");
SET_RPC_REMOTE("setc_bag_rpc");
SET_RPC_REMOTE("setc_target_bag_rpc");
SET_RPC_REMOTE("sloot");
@ -4509,6 +4560,7 @@ Entity::~Entity() {
_action_bar_profile.unref();
_s_sees.clear();
_s_seen_by.clear();
}
void Entity::_notification(int p_what) {
@ -5297,6 +5349,9 @@ void Entity::_bind_methods() {
ClassDB::bind_method(D_METHOD("setc_target_bag", "bag"), &Entity::setc_target_bag);
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "ctarget_bag", PROPERTY_HINT_RESOURCE_TYPE, "Bag"), "setc_target_bag", "getc_target_bag");
ClassDB::bind_method(D_METHOD("setc_bag_rpc", "data"), &Entity::setc_bag_rpc);
ClassDB::bind_method(D_METHOD("setc_target_bag_rpc", "data"), &Entity::setc_target_bag_rpc);
ClassDB::bind_method(D_METHOD("crequest_loot"), &Entity::crequest_loot);
ClassDB::bind_method(D_METHOD("sloot"), &Entity::sloot);
@ -5327,6 +5382,12 @@ void Entity::_bind_methods() {
ClassDB::bind_method(D_METHOD("adds_sees", "entity"), &Entity::adds_sees_bind);
ClassDB::bind_method(D_METHOD("gets_sees_count"), &Entity::gets_sees_count);
ClassDB::bind_method(D_METHOD("gets_seen_by", "index"), &Entity::gets_seen_by);
ClassDB::bind_method(D_METHOD("removes_seen_by_index", "index"), &Entity::removes_seen_by_index);
ClassDB::bind_method(D_METHOD("removes_seen_by", "entity"), &Entity::removes_seen_by_bind);
ClassDB::bind_method(D_METHOD("adds_seen_by", "entity"), &Entity::adds_seen_by_bind);
ClassDB::bind_method(D_METHOD("gets_seen_by_count"), &Entity::gets_seen_by_count);
MethodInfo mi;
mi.arguments.push_back(PropertyInfo(Variant::STRING, "method"));

View File

@ -687,6 +687,9 @@ public:
Ref<Bag> getc_target_bag() const;
void setc_target_bag(const Ref<Bag> bag);
void setc_bag_rpc(String data);
void setc_target_bag_rpc(String data);
void crequest_loot(int index);
void sloot(int index);
@ -735,6 +738,14 @@ public:
void adds_sees_bind(Node *entity);
int gets_sees_count();
Entity *gets_seen_by(int index);
void removes_seen_by_index(int index);
void removes_seen_by(Entity *entity);
void removes_seen_by_bind(Node *entity);
void adds_seen_by(Entity *entity);
void adds_seen_by_bind(Node *entity);
int gets_seen_by_count();
void vrpc(const StringName &p_method, VARIANT_ARG_LIST);
Variant _vrpc_bind(const Variant **p_args, int p_argcount, Variant::CallError &r_error);
@ -917,6 +928,7 @@ private:
//Networking
Vector<Entity *> _s_sees;
Vector<Entity *> _s_seen_by;
};
#endif