193 lines
5.1 KiB
GDScript
193 lines
5.1 KiB
GDScript
extends Node
|
|
|
|
var is_gui = false
|
|
|
|
var rot_cam = Vector3()
|
|
var mouse_sens = 0.3
|
|
var camera_anglev = 0
|
|
|
|
var fps_mode = false
|
|
var tmp_fps_mode = false
|
|
var focus_cam: Camera
|
|
var cam_focused: bool = false
|
|
|
|
var menu: Node
|
|
func display_menu():
|
|
menu.popup()
|
|
|
|
|
|
func _ready():
|
|
focus_cam = Camera.new()
|
|
add_child(focus_cam)
|
|
focus_cam.set_as_toplevel(true)
|
|
# var escape_menu = preload("res://ui/save_game.tscn")
|
|
# menu = escape_menu.instance()
|
|
# add_child(menu)
|
|
|
|
func is_fps_mode():
|
|
return fps_mode || tmp_fps_mode
|
|
|
|
func _input(event):
|
|
if !is_gui:
|
|
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
|
if event is InputEventMouseMotion && !is_gui:
|
|
rot_cam.y = deg2rad(-event.relative.x * mouse_sens)
|
|
var changev = -event.relative.y * mouse_sens
|
|
var player
|
|
if get_viewport().get_camera().has_meta("player"):
|
|
player = get_viewport().get_camera().get_meta("player")
|
|
if !player:
|
|
return
|
|
var cam = player.get_meta("cam")
|
|
var fps_cam = player.get_meta("fps_cam")
|
|
if cam.current:
|
|
if camera_anglev + changev > -30 and camera_anglev + changev < 40:
|
|
camera_anglev += changev
|
|
rot_cam.x = deg2rad(changev)
|
|
elif fps_cam.current:
|
|
if camera_anglev + changev > -60 and camera_anglev + changev < 60:
|
|
camera_anglev += changev
|
|
rot_cam.x = deg2rad(changev)
|
|
func focus_camera(obj):
|
|
if !obj:
|
|
print("NOTHING TO FOCUS")
|
|
return
|
|
if cam_focused:
|
|
return
|
|
print("FOCUS")
|
|
var cur_cam = get_viewport().get_camera()
|
|
var player = cur_cam.get_meta("player")
|
|
var cam = player.get_meta("cam")
|
|
focus_cam.global_transform = cam.global_transform
|
|
var do = obj.global_transform.origin
|
|
focus_cam.look_at(do, Vector3.UP)
|
|
cam_focused = true
|
|
focus_cam.set_meta("camera", cur_cam)
|
|
focus_cam.set_current(true)
|
|
focus_cam.set_meta("player", player)
|
|
func unfocus_camera():
|
|
cam_focused = false
|
|
var ncam = focus_cam.get_meta("camera")
|
|
ncam.set_current(true)
|
|
|
|
func fix_cam(state, _delta):
|
|
var player = get_viewport().get_camera().get_meta("player")
|
|
if !is_fps_mode():
|
|
var cam = player.get_meta("cam")
|
|
var cam_rot_y = cam.get_meta("cam_rot_y")
|
|
var cam_rot_x = cam.get_meta("cam_rot_x")
|
|
cam_rot_y.rotate_y(rot_cam.y)
|
|
cam_rot_x.rotate_x(rot_cam.x)
|
|
else:
|
|
if !player.has_meta("vehicle") && !player.has_meta("cmdqueue"):
|
|
var fps_cam = player.get_meta("fps_cam")
|
|
var fps_cam_rot_x = fps_cam.get_meta("fps_cam_rot_x")
|
|
var o: Transform = player.get_meta("orientation")
|
|
o.basis = o.basis.rotated(Vector3(0, 1, 0), rot_cam.y)
|
|
fps_cam_rot_x.rotate_x(rot_cam.x)
|
|
player.set_meta("orientation", o)
|
|
|
|
rot_cam.y = 0
|
|
rot_cam.x = 0
|
|
func get_player():
|
|
var c = get_viewport().get_camera()
|
|
assert(c)
|
|
if !c:
|
|
return null
|
|
assert(c.has_meta("player"))
|
|
if !c.has_meta("player"):
|
|
return null
|
|
var player = c.get_meta("player")
|
|
assert(player)
|
|
if !player:
|
|
return null
|
|
assert(player)
|
|
return player
|
|
|
|
func switch_fps_mode(value):
|
|
var player = get_player()
|
|
print(player)
|
|
if !player:
|
|
return
|
|
assert(player != null)
|
|
var cam = player.get_meta("cam")
|
|
var fps_cam = player.get_meta("fps_cam")
|
|
var cam_rot_y = cam.get_meta("cam_rot_y")
|
|
if !value:
|
|
cam.current = true
|
|
player.show_face()
|
|
#need to convert to globals
|
|
cam_rot_y.rotation.y = player.rotation.y
|
|
else:
|
|
fps_cam.current = true
|
|
player.hide_face()
|
|
|
|
var tmp_fps_cooldown = 0.0
|
|
|
|
|
|
func _process(delta):
|
|
var c = get_viewport().get_camera()
|
|
if !c:
|
|
return
|
|
|
|
if !c.has_meta("player"):
|
|
return
|
|
|
|
var player = get_player()
|
|
if !player:
|
|
return
|
|
if !is_gui && Input.is_action_just_pressed("ui_cancel"):
|
|
is_gui = true
|
|
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
|
|
display_menu()
|
|
if !is_gui && Input.get_mouse_mode() != Input.MOUSE_MODE_CAPTURED:
|
|
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
|
elif is_gui && Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
|
|
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
|
|
var cam = player.get_meta("cam")
|
|
var fps_cam = player.get_meta("fps_cam")
|
|
var cam_pos = cam.get_meta("cam_pos")
|
|
var cam_arm = cam.get_meta("cam_arm")
|
|
cam_pos.global_transform.origin = player.global_transform.origin
|
|
cam.look_at(player.global_transform.origin + Vector3(0, 1.9, 0), Vector3.UP)
|
|
|
|
if Input.is_action_just_pressed("fps_mode") && !tmp_fps_mode:
|
|
fps_mode = !fps_mode
|
|
switch_fps_mode(fps_mode)
|
|
if !fps_mode && !tmp_fps_mode && !player.has_meta("vehicle"):
|
|
var s = cam_arm.global_transform.origin
|
|
var t = cam.global_transform.origin
|
|
if tmp_fps_cooldown <= 0.0:
|
|
if s.distance_to(t) < 0.3:
|
|
tmp_fps_mode = true
|
|
switch_fps_mode(tmp_fps_mode)
|
|
tmp_fps_cooldown = 1.0
|
|
if !fps_mode && tmp_fps_mode:
|
|
var s = cam_arm.global_transform.origin
|
|
var t = cam.global_transform.origin
|
|
if tmp_fps_cooldown <= 0.0:
|
|
if s.distance_to(t) > 0.4:
|
|
tmp_fps_mode = false
|
|
switch_fps_mode(tmp_fps_mode)
|
|
tmp_fps_cooldown = 3.0
|
|
if tmp_fps_cooldown > 0.0:
|
|
tmp_fps_cooldown -= delta
|
|
|
|
var spawn_delay = 0.5
|
|
func _physics_process(delta):
|
|
if spawn_delay > 0.5:
|
|
spawn_delay -= delta
|
|
return
|
|
var c = get_viewport().get_camera()
|
|
if !c:
|
|
return
|
|
if !c.has_meta("player"):
|
|
return
|
|
var player = c.get_meta("player")
|
|
if !player:
|
|
return
|
|
var space = player.get_world().space
|
|
var state = PhysicsServer.space_get_direct_state(space)
|
|
fix_cam(state, delta)
|
|
|