Removed the EntityGender enum. Now everything uses plain int model indexes.

This commit is contained in:
Relintai 2020-05-20 20:38:10 +02:00
parent 577a3b108b
commit 18f3095832
14 changed files with 77 additions and 93 deletions

View File

@ -73,7 +73,7 @@ ModelVisualEntry::ModelVisualEntry() {
}
ModelVisualEntry::~ModelVisualEntry() {
for (int i = 0; i < EntityEnums::GENDER_COUNT; ++i) {
for (int i = 0; i < 1; ++i) {
#ifdef MESH_DATA_RESOURCE_PRESENT
_mesh[i].unref();
#endif
@ -92,14 +92,12 @@ void ModelVisualEntry::_bind_methods() {
#ifdef MESH_DATA_RESOURCE_PRESENT
ClassDB::bind_method(D_METHOD("get_mesh", "index"), &ModelVisualEntry::get_mesh);
ClassDB::bind_method(D_METHOD("set_mesh", "index", "value"), &ModelVisualEntry::set_mesh);
ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "mesh_male", PROPERTY_HINT_RESOURCE_TYPE, "MeshDataResource"), "set_mesh", "get_mesh", EntityEnums::GENDER_MALE);
ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "mesh_female", PROPERTY_HINT_RESOURCE_TYPE, "MeshDataResource"), "set_mesh", "get_mesh", EntityEnums::GENDER_FEMALE);
ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "mesh", PROPERTY_HINT_RESOURCE_TYPE, "MeshDataResource"), "set_mesh", "get_mesh", 0);
#endif
ClassDB::bind_method(D_METHOD("get_texture", "index"), &ModelVisualEntry::get_texture);
ClassDB::bind_method(D_METHOD("set_texture", "index", "value"), &ModelVisualEntry::set_texture);
ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "texture_male", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture", EntityEnums::GENDER_MALE);
ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "texture_female", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture", EntityEnums::GENDER_FEMALE);
ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture", 0);
ClassDB::bind_method(D_METHOD("get_color"), &ModelVisualEntry::get_color);
ClassDB::bind_method(D_METHOD("set_color", "value"), &ModelVisualEntry::set_color);
@ -107,10 +105,9 @@ void ModelVisualEntry::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_effect"), &ModelVisualEntry::get_effect);
ClassDB::bind_method(D_METHOD("set_effect", "value"), &ModelVisualEntry::set_effect);
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "effect_male", PROPERTY_HINT_RESOURCE_TYPE, "PackedScene"), "set_effect", "get_effect");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "effect", PROPERTY_HINT_RESOURCE_TYPE, "PackedScene"), "set_effect", "get_effect");
ClassDB::bind_method(D_METHOD("get_effect_offset", "index"), &ModelVisualEntry::get_effect_offset);
ClassDB::bind_method(D_METHOD("set_effect_offset", "index", "value"), &ModelVisualEntry::set_effect_offset);
ADD_PROPERTYI(PropertyInfo(Variant::VECTOR3, "effect_offset_male"), "set_effect_offset", "get_effect_offset", EntityEnums::GENDER_MALE);
ADD_PROPERTYI(PropertyInfo(Variant::VECTOR3, "effect_offset_female"), "set_effect_offset", "get_effect_offset", EntityEnums::GENDER_FEMALE);
ADD_PROPERTYI(PropertyInfo(Variant::VECTOR3, "effect_offset"), "set_effect_offset", "get_effect_offset", 0);
}

View File

@ -72,14 +72,14 @@ private:
ItemEnums::EntityTextureLayers _override_layer;
#ifdef MESH_DATA_RESOURCE_PRESENT
Ref<MeshDataResource> _mesh[EntityEnums::GENDER_COUNT];
Ref<MeshDataResource> _mesh[1];
#endif
Ref<Texture> _texture[EntityEnums::GENDER_COUNT];
Ref<Texture> _texture[1];
Color _color;
Ref<PackedScene> _effect;
Vector3 _effect_offset[EntityEnums::GENDER_COUNT];
Vector3 _effect_offset[1];
};
#endif

View File

@ -53,7 +53,7 @@
</method>
</methods>
<members>
<member name="gender" type="int" setter="set_gender" getter="get_gender" enum="EntityEnums.EntityGender" default="0">
<member name="model_index" type="int" setter="set_model_index" getter="get_model_index" enum="EntityEnums.EntityGender" default="0">
</member>
</members>
<constants>

View File

@ -186,7 +186,7 @@
</member>
<member name="bone_path_root" type="NodePath" setter="set_bone_path" getter="get_bone_path" default="NodePath(&quot;&quot;)">
</member>
<member name="gender" type="int" setter="set_gender" getter="get_gender" enum="EntityEnums.EntityGender" default="0">
<member name="model_index" type="int" setter="set_model_index" getter="get_model_index" enum="EntityEnums.EntityGender" default="0">
</member>
<member name="model_dirty" type="bool" setter="set_model_dirty" getter="get_model_dirty" default="false">
</member>

View File

@ -3712,7 +3712,7 @@
</member>
<member name="cfree_talent_points" type="int" setter="setc_free_talent_points" getter="getc_free_talent_points" default="0">
</member>
<member name="cgender" type="int" setter="setc_gender" getter="getc_gender" enum="EntityEnums.EntityGender" default="0">
<member name="cmodel_index" type="int" setter="setc_model_index" getter="getc_model_index" enum="EntityEnums.EntityGender" default="0">
</member>
<member name="cguid" type="int" setter="setc_guid" getter="getc_guid" default="0">
</member>
@ -3766,7 +3766,7 @@
</member>
<member name="sfree_talent_points" type="int" setter="sets_free_talent_points" getter="gets_free_talent_points" default="0">
</member>
<member name="sgender" type="int" setter="sets_gender" getter="gets_gender" enum="EntityEnums.EntityGender" default="0">
<member name="smodel_index" type="int" setter="sets_model_index" getter="gets_model_index" enum="EntityEnums.EntityGender" default="0">
</member>
<member name="sguid" type="int" setter="sets_guid" getter="gets_guid" default="0">
</member>

View File

@ -74,13 +74,13 @@
</member>
<member name="mesh_female" type="MeshDataResource" setter="set_mesh" getter="get_mesh">
</member>
<member name="mesh_male" type="MeshDataResource" setter="set_mesh" getter="get_mesh">
<member name="mesh" type="MeshDataResource" setter="set_mesh" getter="get_mesh">
</member>
<member name="override_layer" type="int" setter="set_override_layer" getter="get_override_layer" enum="ItemEnums.EntityTextureLayers" default="0">
</member>
<member name="texture_female" type="Texture" setter="set_texture" getter="get_texture">
</member>
<member name="texture_male" type="Texture" setter="set_texture" getter="get_texture">
<member name="texture" type="Texture" setter="set_texture" getter="get_texture">
</member>
</members>
<constants>

View File

@ -316,20 +316,20 @@ void Entity::setc_entity_name(String value) {
emit_signal("cname_changed", this);
}
EntityEnums::EntityGender Entity::gets_gender() {
return _s_gender;
int Entity::gets_model_index() {
return _s_model_index;
}
void Entity::sets_gender(EntityEnums::EntityGender value) {
_s_gender = value;
void Entity::sets_model_index(int value) {
_s_model_index = value;
VRPC(setc_gender, value);
VRPC(setc_model_index, value);
}
EntityEnums::EntityGender Entity::getc_gender() {
return _c_gender;
int Entity::getc_model_index() {
return _c_model_index;
}
void Entity::setc_gender(EntityEnums::EntityGender value) {
_c_gender = value;
void Entity::setc_model_index(int value) {
_c_model_index = value;
#if VERSION_MAJOR < 4
if (ObjectDB::instance_validate(_character_skeleton)) {
@ -337,8 +337,8 @@ void Entity::setc_gender(EntityEnums::EntityGender value) {
if (_character_skeleton != NULL) {
#endif
if (_character_skeleton->has_method("set_gender"))
_character_skeleton->call("set_gender", _c_gender);
if (_character_skeleton->has_method("set_model_index"))
_character_skeleton->call("set_model_index", _c_model_index);
}
}
@ -474,10 +474,10 @@ void Entity::sets_entity_data(Ref<EntityData> value) {
//setup();
if (get_body() == NULL && value.is_valid() && value->get_entity_species_data().is_valid() &&
value->get_entity_species_data()->get_model_data_count() > _s_gender &&
value->get_entity_species_data()->get_model_data(_s_gender).is_valid() &&
value->get_entity_species_data()->get_model_data(_s_gender)->get_body().is_valid()) {
Node *node = value->get_entity_species_data()->get_model_data(_s_gender)->get_body()->instance();
value->get_entity_species_data()->get_model_data_count() > _s_model_index &&
value->get_entity_species_data()->get_model_data(_s_model_index).is_valid() &&
value->get_entity_species_data()->get_model_data(_s_model_index)->get_body().is_valid()) {
Node *node = value->get_entity_species_data()->get_model_data(_s_model_index)->get_body()->instance();
add_child(node);
set_body(node);
@ -496,10 +496,10 @@ void Entity::setc_entity_data(Ref<EntityData> value) {
_c_entity_data = value;
if (get_body() == NULL && value.is_valid() && value->get_entity_species_data().is_valid() &&
value->get_entity_species_data()->get_model_data_count() > _c_gender &&
value->get_entity_species_data()->get_model_data(_c_gender).is_valid() &&
value->get_entity_species_data()->get_model_data(_c_gender)->get_body().is_valid()) {
Node *node = value->get_entity_species_data()->get_model_data(_c_gender)->get_body()->instance();
value->get_entity_species_data()->get_model_data_count() > _c_model_index &&
value->get_entity_species_data()->get_model_data(_c_model_index).is_valid() &&
value->get_entity_species_data()->get_model_data(_c_model_index)->get_body().is_valid()) {
Node *node = value->get_entity_species_data()->get_model_data(_c_model_index)->get_body()->instance();
add_child(node);
set_body(node);
@ -1087,7 +1087,7 @@ Dictionary Entity::_to_dict() {
dict["guid"] = _s_guid;
//dict["entity_data_id"] = _s_class_id;
dict["type"] = _s_type;
dict["gender"] = _s_gender;
dict["model_index"] = _s_model_index;
dict["class_level"] = gets_class_level();
dict["class_xp"] = gets_class_xp();
@ -1271,7 +1271,7 @@ void Entity::_from_dict(const Dictionary &dict) {
sets_entity_type((int)((int)dict.get("type", 0)));
sets_gender(static_cast<EntityEnums::EntityGender>(static_cast<int>(dict.get("gender", 0))));
sets_model_index(static_cast<int>(static_cast<int>(dict.get("model_index", 0))));
if (ESS::get_instance()->get_use_global_class_level()) {
_s_class_level = (dict.get("class_level", 0));
@ -5763,8 +5763,8 @@ Entity::Entity() {
_s_entity_player_type = 0;
_c_entity_player_type = 0;
_s_gender = EntityEnums::GENDER_MALE;
_c_gender = EntityEnums::GENDER_MALE;
_s_model_index = 0;
_c_model_index = 0;
_s_class_level = 1;
_c_class_level = 1;
@ -5855,7 +5855,7 @@ Entity::Entity() {
SET_RPC_REMOTE("setc_entity_data_id");
SET_RPC_REMOTE("setc_entity_type");
SET_RPC_REMOTE("setc_entity_name");
SET_RPC_REMOTE("setc_gender");
SET_RPC_REMOTE("setc_model_index");
SET_RPC_REMOTE("setc_class_level");
SET_RPC_REMOTE("setc_character_level");
SET_RPC_REMOTE("setc_class_xp");
@ -6318,8 +6318,8 @@ void Entity::_notification(int p_what) {
_character_skeleton = get_node_or_null(_character_skeleton_path);
if (_character_skeleton != NULL) {
if (_character_skeleton->has_method("set_gender"))
_character_skeleton->call("set_gender", _c_gender);
if (_character_skeleton->has_method("set_model_index"))
_character_skeleton->call("set_model_index", _c_model_index);
}
} break;
case NOTIFICATION_ENTER_TREE: {
@ -6342,8 +6342,8 @@ void Entity::_notification(int p_what) {
_character_skeleton = get_node_or_null(_character_skeleton_path);
if (_character_skeleton != NULL) {
if (_character_skeleton->has_method("set_gender"))
_character_skeleton->call("set_gender", _c_gender);
if (_character_skeleton->has_method("set_model_index"))
_character_skeleton->call("set_model_index", _c_model_index);
}
}
} break;
@ -6405,7 +6405,7 @@ bool Entity::_set(const StringName &p_name, const Variant &p_value) {
/*
sets_entity_type((int)((int)dict.get("type", 0)));
sets_gender(static_cast<EntityEnums::EntityGender>(static_cast<int>(dict.get("gender", 0))));
sets_model_index(static_cast<int>(static_cast<int>(dict.get("model_index", 0))));
if (ESS::get_instance()->get_use_global_class_level()) {
_s_class_level = (dict.get("class_level", 0));
@ -7313,13 +7313,13 @@ void Entity::_bind_methods() {
ClassDB::bind_method(D_METHOD("setc_entity_name", "value"), &Entity::setc_entity_name);
ADD_PROPERTY(PropertyInfo(Variant::STRING, "centity_name", PROPERTY_HINT_NONE, "", 0), "setc_entity_name", "getc_entity_name");
ClassDB::bind_method(D_METHOD("gets_gender"), &Entity::gets_gender);
ClassDB::bind_method(D_METHOD("sets_gender", "value"), &Entity::sets_gender);
ADD_PROPERTY(PropertyInfo(Variant::INT, "sgender"), "sets_gender", "gets_gender");
ClassDB::bind_method(D_METHOD("gets_model_index"), &Entity::gets_model_index);
ClassDB::bind_method(D_METHOD("sets_model_index", "value"), &Entity::sets_model_index);
ADD_PROPERTY(PropertyInfo(Variant::INT, "smodel_index"), "sets_model_index", "gets_model_index");
ClassDB::bind_method(D_METHOD("getc_gender"), &Entity::getc_gender);
ClassDB::bind_method(D_METHOD("setc_gender", "value"), &Entity::setc_gender);
ADD_PROPERTY(PropertyInfo(Variant::INT, "cgender", PROPERTY_HINT_NONE, "", 0), "setc_gender", "getc_gender");
ClassDB::bind_method(D_METHOD("getc_model_index"), &Entity::getc_model_index);
ClassDB::bind_method(D_METHOD("setc_model_index", "value"), &Entity::setc_model_index);
ADD_PROPERTY(PropertyInfo(Variant::INT, "cmodel_index", PROPERTY_HINT_NONE, "", 0), "setc_model_index", "getc_model_index");
ClassDB::bind_method(D_METHOD("gets_class_level"), &Entity::gets_class_level);
ClassDB::bind_method(D_METHOD("sets_class_level", "value"), &Entity::sets_class_level);

View File

@ -307,11 +307,11 @@ public:
String getc_entity_name();
void setc_entity_name(String value);
EntityEnums::EntityGender gets_gender();
void sets_gender(EntityEnums::EntityGender value);
int gets_model_index();
void sets_model_index(int value);
EntityEnums::EntityGender getc_gender();
void setc_gender(EntityEnums::EntityGender value);
int getc_model_index();
void setc_model_index(int value);
int gets_class_level();
void sets_class_level(int value);
@ -1088,8 +1088,8 @@ private:
int _s_type;
int _c_type;
EntityEnums::EntityGender _s_gender;
EntityEnums::EntityGender _c_gender;
int _s_model_index;
int _c_model_index;
int _s_class_level;
int _c_class_level;

View File

@ -32,7 +32,6 @@ const String EntityEnums::BINDING_STRING_ENTITY_IMMUNITY_FLAGS = "Stun,Root,Free
const String EntityEnums::BINDING_STRING_ENTITY_RELATION_TYPE = "Neutral,Friendly,Hostile";
const String EntityEnums::BINDING_STRING_ENTITY_INTERACTION_TYPE = "Normal,Speak,Loot,Use,None";
const String EntityEnums::BINDING_STRING_ENTITY_PLAYSTYLE_TYPE = "Melee,Spell,Hybrid,None";
const String EntityEnums::BINDING_STRING_ENTITY_GENDER = "Male,Female";
const String EntityEnums::BINDING_STRING_ENTITY_WINDOWS = "Loot,Container,Vendor,Trainer";
const String EntityEnums::BINDING_STRING_ENTITY_ENTITY_RESOURCE_INDICES = "Health,Speed,Resources Begin";
@ -176,9 +175,6 @@ void EntityEnums::_bind_methods() {
BIND_ENUM_CONSTANT(ENTITY_CLASS_PLAYSTYLE_TYPE_HYBRID);
BIND_ENUM_CONSTANT(ENTITY_CLASS_PLAYSTYLE_TYPE_NONE);
BIND_ENUM_CONSTANT(GENDER_MALE);
BIND_ENUM_CONSTANT(GENDER_FEMALE);
BIND_ENUM_CONSTANT(ENTITY_WINDOW_LOOT);
BIND_ENUM_CONSTANT(ENTITY_WINDOW_CONTAINER);
BIND_ENUM_CONSTANT(ENTITY_WINDOW_VENDOR);
@ -188,6 +184,5 @@ void EntityEnums::_bind_methods() {
BIND_ENUM_CONSTANT(ENTITY_RESOURCE_INDEX_SPEED);
BIND_ENUM_CONSTANT(ENTITY_RESOURCE_INDEX_RESOURCES_BEGIN);
BIND_CONSTANT(GENDER_COUNT);
BIND_CONSTANT(BASE_XP);
}

View File

@ -41,7 +41,6 @@ public:
static const String BINDING_STRING_ENTITY_RELATION_TYPE;
static const String BINDING_STRING_ENTITY_INTERACTION_TYPE;
static const String BINDING_STRING_ENTITY_PLAYSTYLE_TYPE;
static const String BINDING_STRING_ENTITY_GENDER;
static const String BINDING_STRING_ENTITY_WINDOWS;
static const String BINDING_STRING_ENTITY_ENTITY_RESOURCE_INDICES;
@ -239,11 +238,6 @@ public:
ENTITY_CLASS_PLAYSTYLE_TYPE_NONE,
};
enum EntityGender {
GENDER_MALE = 0,
GENDER_FEMALE = 1,
};
enum EntityWindows {
ENTITY_WINDOW_LOOT = 0,
ENTITY_WINDOW_CONTAINER = 1,
@ -258,7 +252,6 @@ public:
};
enum {
GENDER_COUNT = 2,
BASE_XP = 50,
};
@ -279,7 +272,6 @@ VARIANT_ENUM_CAST(EntityEnums::EntityImmunityFlags);
VARIANT_ENUM_CAST(EntityEnums::EntityRelationType);
VARIANT_ENUM_CAST(EntityEnums::EntityInteractionType);
VARIANT_ENUM_CAST(EntityEnums::EntityClassPlaystyleType);
VARIANT_ENUM_CAST(EntityEnums::EntityGender);
VARIANT_ENUM_CAST(EntityEnums::EntityWindows);
VARIANT_ENUM_CAST(EntityEnums::EntityResourceIndices);

View File

@ -37,24 +37,24 @@ int CharacterSkeleton2D::get_model_visual_count() {
void CharacterSkeleton2D::clear_model_visuals() {
}
EntityEnums::EntityGender CharacterSkeleton2D::get_gender() {
return _gender;
int CharacterSkeleton2D::get_model_index() {
return _model_index;
}
void CharacterSkeleton2D::set_gender(EntityEnums::EntityGender value) {
_gender = value;
void CharacterSkeleton2D::set_model_index(int value) {
_model_index = value;
}
CharacterSkeleton2D::CharacterSkeleton2D() {
_gender = EntityEnums::GENDER_MALE;
_model_index = 0;
}
CharacterSkeleton2D::~CharacterSkeleton2D() {
}
void CharacterSkeleton2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_gender"), &CharacterSkeleton2D::get_gender);
ClassDB::bind_method(D_METHOD("set_gender", "value"), &CharacterSkeleton2D::set_gender);
ADD_PROPERTY(PropertyInfo(Variant::INT, "gender", PROPERTY_HINT_ENUM, EntityEnums::BINDING_STRING_ENTITY_GENDER), "set_gender", "get_gender");
ClassDB::bind_method(D_METHOD("get_model_index"), &CharacterSkeleton2D::get_model_index);
ClassDB::bind_method(D_METHOD("set_model_index", "value"), &CharacterSkeleton2D::set_model_index);
ADD_PROPERTY(PropertyInfo(Variant::INT, "model_index"), "set_model_index", "get_model_index");
ClassDB::bind_method(D_METHOD("add_model_visual", "vis"), &CharacterSkeleton2D::add_model_visual);
ClassDB::bind_method(D_METHOD("remove_model_visual", "vis"), &CharacterSkeleton2D::remove_model_visual);

View File

@ -44,8 +44,8 @@ public:
virtual int get_model_visual_count();
virtual void clear_model_visuals();
EntityEnums::EntityGender get_gender();
void set_gender(EntityEnums::EntityGender value);
int get_model_index();
void set_model_index(int value);
CharacterSkeleton2D();
~CharacterSkeleton2D();
@ -54,7 +54,7 @@ protected:
static void _bind_methods();
private:
EntityEnums::EntityGender _gender;
int _model_index;
};
#endif

View File

@ -39,11 +39,11 @@ typedef class RenderingServer VS;
#define PoolRealArray PackedFloat32Array
#endif
EntityEnums::EntityGender CharacterSkeleton3D::get_gender() {
return _gender;
int CharacterSkeleton3D::get_model_index() {
return _model_index;
}
void CharacterSkeleton3D::set_gender(EntityEnums::EntityGender value) {
_gender = value;
void CharacterSkeleton3D::set_model_index(int value) {
_model_index = value;
}
bool CharacterSkeleton3D::get_model_dirty() const {
@ -364,7 +364,7 @@ Array CharacterSkeleton3D::bake_mesh_array_uv(Array arr, Ref<Texture> tex, float
CharacterSkeleton3D::CharacterSkeleton3D() {
_model_dirty = false;
_gender = EntityEnums::GENDER_MALE;
_model_index = 0;
for (int i = 0; i < EntityEnums::SKELETON_POINTS_MAX; ++i) {
_bone_nodes[i] = NULL;
@ -397,9 +397,9 @@ void CharacterSkeleton3D::_notification(int p_what) {
}
void CharacterSkeleton3D::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_gender"), &CharacterSkeleton3D::get_gender);
ClassDB::bind_method(D_METHOD("set_gender", "value"), &CharacterSkeleton3D::set_gender);
ADD_PROPERTY(PropertyInfo(Variant::INT, "gender", PROPERTY_HINT_ENUM, EntityEnums::BINDING_STRING_ENTITY_GENDER), "set_gender", "get_gender");
ClassDB::bind_method(D_METHOD("get_model_index"), &CharacterSkeleton3D::get_model_index);
ClassDB::bind_method(D_METHOD("set_model_index", "value"), &CharacterSkeleton3D::set_model_index);
ADD_PROPERTY(PropertyInfo(Variant::INT, "model_index"), "set_model_index", "get_model_index");
ClassDB::bind_method(D_METHOD("add_model_visual", "vis"), &CharacterSkeleton3D::add_model_visual);
ClassDB::bind_method(D_METHOD("remove_model_visual", "vis"), &CharacterSkeleton3D::remove_model_visual);

View File

@ -54,8 +54,8 @@ class CharacterSkeleton3D : public Spatial {
GDCLASS(CharacterSkeleton3D, Spatial);
public:
EntityEnums::EntityGender get_gender();
void set_gender(EntityEnums::EntityGender value);
int get_model_index();
void set_model_index(int value);
bool get_model_dirty() const;
void set_model_dirty(bool value);
@ -117,7 +117,7 @@ protected:
};
private:
EntityEnums::EntityGender _gender;
int _model_index;
NodePath _animation_player_path;
NodePath _animation_tree_path;