feat: unit now guarantees it stays on the navmesh
This commit is contained in:
parent
d7441eade9
commit
cd94bb164e
13
src/unit.cpp
13
src/unit.cpp
|
@ -5,6 +5,8 @@
|
||||||
#include "rts_states.hpp"
|
#include "rts_states.hpp"
|
||||||
#include "utils/godot_macros.hpp"
|
#include "utils/godot_macros.hpp"
|
||||||
#include <godot_cpp/classes/navigation_agent3d.hpp>
|
#include <godot_cpp/classes/navigation_agent3d.hpp>
|
||||||
|
#include <godot_cpp/classes/navigation_server3d.hpp>
|
||||||
|
#include <godot_cpp/classes/world3d.hpp>
|
||||||
#include <godot_cpp/variant/callable_method_pointer.hpp>
|
#include <godot_cpp/variant/callable_method_pointer.hpp>
|
||||||
#include <godot_cpp/variant/utility_functions.hpp>
|
#include <godot_cpp/variant/utility_functions.hpp>
|
||||||
|
|
||||||
|
@ -29,8 +31,15 @@ void Unit::_enter_tree() { GDGAMEONLY();
|
||||||
this->health->connect("death", callable_mp(this, &Unit::on_death));
|
this->health->connect("death", callable_mp(this, &Unit::on_death));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Unit::_physics_process(double) {
|
void Unit::_physics_process(double) { GDGAMEONLY();
|
||||||
this->move_and_slide();
|
this->move_and_slide();
|
||||||
|
if(!this->get_velocity().is_zero_approx()) {
|
||||||
|
gd::RID const map_id{this->get_world_3d()->get_navigation_map()};
|
||||||
|
gd::Vector3 const offset{0.f, -float(this->agent->get_path_height_offset()), 0.f};
|
||||||
|
gd::Vector3 const adjusted_pos{this->get_global_position() + offset};
|
||||||
|
this->set_global_position(gd::NavigationServer3D::get_singleton()->map_get_closest_point(map_id, adjusted_pos) + offset);
|
||||||
|
}
|
||||||
|
this->set_velocity({0.f, 0.f, 0.f});
|
||||||
}
|
}
|
||||||
|
|
||||||
void Unit::stop_plan() {
|
void Unit::stop_plan() {
|
||||||
|
@ -104,8 +113,6 @@ void Unit::on_velocity_computed(gd::Vector3 vel) {
|
||||||
gd::Vector3 const pos{this->get_global_position()};
|
gd::Vector3 const pos{this->get_global_position()};
|
||||||
if(vel.x == 0 && vel.z == 0)
|
if(vel.x == 0 && vel.z == 0)
|
||||||
return;
|
return;
|
||||||
if(gd::Object::cast_to<MoveTo>(this->state) == nullptr)
|
|
||||||
return;
|
|
||||||
this->set_velocity(vel.normalized() * this->movement_speed);
|
this->set_velocity(vel.normalized() * this->movement_speed);
|
||||||
this->look_at(pos - gd::Vector3{vel.x, 0.f, vel.z});
|
this->look_at(pos - gd::Vector3{vel.x, 0.f, vel.z});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue