Now About Social Code
summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/bsp_level_generator.gd11
-rw-r--r--scripts/enemy.gd48
2 files changed, 54 insertions, 5 deletions
diff --git a/scripts/bsp_level_generator.gd b/scripts/bsp_level_generator.gd
index 5d70569..87806e2 100644
--- a/scripts/bsp_level_generator.gd
+++ b/scripts/bsp_level_generator.gd
@@ -123,7 +123,16 @@ func generate_geo(grid: Array[Tile]):
csg_root.add_child(box)
csg_root.use_collision = true
- add_child(csg_root)
+ $NavigationRegion3D.add_child(csg_root)
+
+ # We need to delay baking the nav mesh as
+ # the CSG won't be generated immediately
+ call_deferred("bake_nav")
+
+func bake_nav():
+ print("Baking mesh")
+ $NavigationRegion3D.bake_navigation_mesh(false)
+ print("done baking")
func _ready() -> void:
var starting_axis = randi_range(0, 1)
diff --git a/scripts/enemy.gd b/scripts/enemy.gd
index 569905f..6be60c7 100644
--- a/scripts/enemy.gd
+++ b/scripts/enemy.gd
@@ -6,7 +6,12 @@ extends CharacterBody3D
@export var target: Node3D
## Whether to use gravity on enemy
-@export var gravity_enabled: bool = false
+@export var gravity_enabled: bool = true
+
+## Use nav mesh or dumb path finding
+@export var use_nav_mesh: bool = true
+
+@onready var nav_agent: NavigationAgent3D = $NavigationAgent3D
var has_astar: bool = false
var astar: AStar3D
@@ -15,9 +20,17 @@ var gravity : float = ProjectSettings.get_setting("physics/3d/default_gravity")
var original_color: Color
+var mesh_ready = false
+
func _ready() -> void:
if gravity_enabled:
motion_mode = MotionMode.MOTION_MODE_GROUNDED
+
+ NavigationServer3D.connect("map_changed", map_changed)
+
+func map_changed(_rid):
+ print("Map changed")
+ mesh_ready = true
func chase_target(delta: float) -> void:
var target_pos = target.position
@@ -34,19 +47,46 @@ func chase_target(delta: float) -> void:
velocity.y -= gravity * delta
move_and_slide()
+
+func update_target_location(target_location: Vector3):
+ nav_agent.target_position = target_location
+
+func chase_nav_mesh(delta: float):
+ if not mesh_ready:
+ return
+
+ if target != null:
+ update_target_location(target.global_position)
+
+ var current_location = global_transform.origin
+ var next_location = nav_agent.get_next_path_position()
+ var new_velocity = (next_location - current_location).normalized() * speed
+
+ # We only want to navigate on XZ plane
+ new_velocity.y = 0
+
+ velocity = new_velocity
+
+ if not is_on_floor() and gravity_enabled:
+ velocity.y -= gravity * delta
+ move_and_slide()
func _physics_process(delta: float) -> void:
if target == null:
return
+ if Input.is_action_pressed("ui_right"):
+ return
+
+ if use_nav_mesh:
+ chase_nav_mesh(delta)
+ return
+
if not has_astar:
# Just try to chase player directly
chase_target(delta)
return
- if Input.is_action_pressed("ui_right"):
- return
-
var target_pos = target.position
var closest_me = astar.get_closest_point(position)
var closest_target = astar.get_closest_point(target_pos)