224 lines
7.9 KiB
GDScript
224 lines
7.9 KiB
GDScript
extends Spatial
|
|
|
|
signal new_focused_object( p_name )
|
|
signal equip( p_slot, p_item )
|
|
signal unequip( p_slot )
|
|
|
|
|
|
var mouse_delta = Vector2.ZERO
|
|
var zoom_level = 0
|
|
var camera_position = Vector3( 0.0, 2.0, -2.0 )
|
|
|
|
onready var camera_tps = $character/spring_arm/camera_tps
|
|
onready var camera_fps = $character/spring_arm/camera_fps
|
|
|
|
var proximity_objects = []
|
|
var focused_object = null
|
|
var focus_index = 0
|
|
|
|
static func get_input_direction() -> Vector3:
|
|
return Vector3(
|
|
Input.get_action_strength("move_strafe_right") - Input.get_action_strength("move_strafe_left"),
|
|
0,
|
|
Input.get_action_strength("move_backward") - Input.get_action_strength("move_forward")
|
|
)
|
|
|
|
func _input( event ):
|
|
|
|
# Run.
|
|
if event.is_action_pressed( "move_toggle_run" ):
|
|
$character.is_running = not $character.is_running
|
|
|
|
# Camera.
|
|
if event.is_action( "camera_zoom_in" ):
|
|
self.zoom_level += 1
|
|
elif event.is_action( "camera_zoom_out" ):
|
|
self.zoom_level -= 1
|
|
|
|
if event.is_action_pressed( "camera_reset_view" ):
|
|
$character/spring_arm.rotation = Vector3.ZERO
|
|
self.zoom_level = 0
|
|
|
|
if event.is_action_pressed( "camera_switch" ):
|
|
if self.camera_tps.current:
|
|
self.camera_fps.make_current()
|
|
$character/spring_arm.rotation = Vector3.ZERO
|
|
# self.hide()
|
|
else:
|
|
self.camera_tps.make_current()
|
|
# self.show()
|
|
|
|
|
|
if event is InputEventMouseMotion:
|
|
self.mouse_delta = event.relative
|
|
|
|
# Jump.
|
|
if event.is_action_pressed( "move_jump" ) and not $character.is_falling:
|
|
$character.is_jump_started = true
|
|
|
|
|
|
if event.is_action_pressed( "interact" ):
|
|
self.interact()
|
|
|
|
|
|
if event.is_action_pressed( "focus_next" ):
|
|
self.focus_next()
|
|
|
|
# if not self.get_tree().get_root().get_node( "main/scene/game" ).is_on_ui:
|
|
# if event.is_action_pressed( "action_ready_weapon" ):
|
|
# $character.is_readying_weapon = true
|
|
# if event.is_action_released( "action_ready_weapon" ):
|
|
# $character.is_readying_weapon = false
|
|
# $character.is_weapon_ready = false
|
|
# if $character.is_weapon_ready:
|
|
# if event.is_action_pressed( "action_attack" ):
|
|
# $character.attack()
|
|
|
|
|
|
func _process( delta ):
|
|
|
|
$character.direction = self.get_input_direction()
|
|
|
|
# Rotation.
|
|
if not Input.is_key_pressed( KEY_SHIFT ) and not $character.is_jump_started:
|
|
$character.orientation = (Input.get_action_strength("move_turn_left") - Input.get_action_strength("move_turn_right"))
|
|
else:
|
|
$character.orientation = 0.0
|
|
|
|
# Camera.
|
|
if not self.mouse_delta == Vector2.ZERO and self.camera_tps.current:
|
|
if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
|
|
$character/spring_arm.rotate_y( -self.mouse_delta.x * 0.01 )
|
|
self.camera_tps.rotate_x( self.mouse_delta.y * 0.01 )
|
|
|
|
# if not $character.velocity.x == 0.0 or not $character.velocity.z == 0.0:
|
|
# var velocity_without_gravity = $character.velocity
|
|
# velocity_without_gravity.y = 0.0
|
|
## $crosshair.material.set_shader_param( "spread", velocity_without_gravity.length() )
|
|
# $character/target_spring_arm/crosshair.scale = Vector3( 1.0, 1.0, 1.0 ) * velocity_without_gravity.length()
|
|
# else:
|
|
## $crosshair.material.set_shader_param( "spread", 1 )
|
|
# $character/target_spring_arm/crosshair.scale = Vector3( 1.0, 1.0, 1.0 )
|
|
|
|
if $character.is_weapon_ready:
|
|
if $character.get_main_weapon_node():
|
|
$character/crosshair.show()
|
|
# $character/target_spring_arm.global_transform.origin = $character.get_main_weapon_node().get_node( "bullet_exit" ).global_transform.origin
|
|
# $character/target_spring_arm.look_at_from_position( $character.get_main_weapon_node().get_node( "bullet_exit" ).global_transform.origin, $character.get_main_weapon_node().get_node( "target" ).global_transform.origin, Vector3( 0.0, 0.0, -1.0 ) )
|
|
# $character/target_spring_arm.global_transform.basis.y = $character.get_main_weapon_node().get_node( "bullet_exit" ).global_transform.basis.y
|
|
$character/crosshair.global_transform.origin = $character.get_main_weapon_node().get_node( "bullet_exit/target_spring_arm/target" ).global_transform.origin
|
|
else:
|
|
$character/target_spring_arm.hide()
|
|
|
|
# Values reset.
|
|
self.mouse_delta = Vector2.ZERO
|
|
|
|
# Debug.
|
|
#var old_collider = null
|
|
|
|
func _physics_process(delta):
|
|
|
|
var space_state = get_world().direct_space_state
|
|
# Camera.
|
|
self.camera_position = Vector3( 0.0, 2 - 0.1*self.zoom_level, -2 + 0.1*self.zoom_level )
|
|
$character/spring_arm/camera_position.translation = self.camera_position
|
|
var global_camera_position = $character/spring_arm/camera_position.global_transform.origin
|
|
var result = space_state.intersect_ray($character/look_at.global_transform.origin, global_camera_position, [self])
|
|
|
|
|
|
if result:
|
|
self.camera_tps.global_transform.origin = result.position
|
|
# self.camera_tps.look_at( $character/look_at.global_transform.origin, Vector3( 0.0, 1.0, 0.0) )
|
|
|
|
|
|
else:
|
|
self.camera_tps.translation = self.camera_position
|
|
# self.camera_tps.look_at( $character/look_at.global_transform.origin, Vector3( 0.0, 1.0, 0.0) )
|
|
|
|
|
|
func interact( p_object = null ):
|
|
if p_object and p_object.has_method( "interact" ):
|
|
p_object.interact( $character/creature.creature )
|
|
else:
|
|
if self.focused_object and self.focused_object.has_method( "interact" ):
|
|
self.focused_object.interact( $character/creature.creature )
|
|
elif self.focused_object and self.focused_object.get_parent() and self.focused_object.get_parent().has_method( "interact" ):
|
|
self.focused_object.get_parent().interact( $character/creature.creature )
|
|
|
|
if not self.focused_object:
|
|
self.proximity_objects.erase( self.focused_object )
|
|
self.update_focused_object()
|
|
|
|
func focus_next():
|
|
self.focus_index += 1
|
|
if self.focus_index >= self.proximity_objects.size():
|
|
self.focus_index = 0
|
|
|
|
self.update_focused_object()
|
|
|
|
|
|
func set_focus_on( p_object, p_focus ):
|
|
if p_object and p_object.has_method( "set_focus" ):
|
|
p_object.set_focus( p_focus )
|
|
elif p_object and p_object.get_parent() and p_object.get_parent().has_method( "set_focus" ):
|
|
p_object.get_parent().set_focus( p_focus )
|
|
|
|
func update_focused_object():
|
|
|
|
if self.focus_index >= self.proximity_objects.size():
|
|
self.focus_index = 0
|
|
|
|
var old_focused_object = self.focused_object
|
|
if self.proximity_objects.size() > 0:
|
|
self.focused_object = self.proximity_objects[ self.focus_index ]
|
|
else:
|
|
self.focused_object = null
|
|
|
|
if old_focused_object:
|
|
self.set_focus_on( old_focused_object, false )
|
|
if self.focused_object:
|
|
self.set_focus_on( self.focused_object, true )
|
|
emit_signal( "new_focused_object", self.focused_object.name )
|
|
|
|
func _on_interact_area_body_entered(body):
|
|
if not body == $character:
|
|
self.proximity_objects.push_back( body )
|
|
self.update_focused_object()
|
|
|
|
func _on_interact_area_body_exited(body):
|
|
if not body == $character:
|
|
self.proximity_objects.erase( body )
|
|
self.update_focused_object()
|
|
|
|
func _on_character_equip(p_slot, p_item):
|
|
emit_signal( "equip", p_slot, p_item )
|
|
var weapons = $character.get_weapons()
|
|
if weapons.size() > 0:
|
|
|
|
var min_range = null
|
|
for weapon in weapons:
|
|
if not min_range:
|
|
min_range = weapon.get_data( "range" )
|
|
else:
|
|
min_range = min( min_range, weapon.get_data( "range" ) )
|
|
$character.get_main_weapon_node().get_node( "bullet_exit/target_spring_arm" ).spring_length = min_range
|
|
|
|
func _on_character_unequip(p_slot):
|
|
emit_signal( "unequip", p_slot )
|
|
|
|
|
|
|
|
|
|
func _on_crosshair_area_body_entered(body):
|
|
if not body == $character:
|
|
if body is preload( "res://scenes/characters/character.gd" ):
|
|
if body.player_relation == body.PLAYER_RELATION.ennemy:
|
|
$character/crosshair.get_surface_material( 0 ).albedo_color = Color.red
|
|
elif body.player_relation == body.PLAYER_RELATION.friend:
|
|
$character/crosshair.get_surface_material( 0 ).albedo_color = Color.green
|
|
else:
|
|
$character/crosshair.get_surface_material( 0 ).albedo_color = Color.white
|
|
|
|
func _on_crosshair_area_body_exited(body):
|
|
if not body == $character:
|
|
$character/target_spring_arm/crosshair.get_surface_material( 0 ).albedo_color = Color.white
|