From be83ff8ae130e7a7d44870dbc15185b70395849b Mon Sep 17 00:00:00 2001 From: Luna Date: Thu, 1 Feb 2018 17:47:24 -0500 Subject: [PATCH 1/9] Allow for clients quitting graceful --- scripts/lobby.gd | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/scripts/lobby.gd b/scripts/lobby.gd index fb5f61b..5cc285a 100644 --- a/scripts/lobby.gd +++ b/scripts/lobby.gd @@ -68,6 +68,7 @@ func _ready(): get_node("Singleplayer").connect("pressed", self, "_singleplayer_init") get_tree().connect("network_peer_connected", self, "_player_connected") + get_tree().connect("network_peer_disconnected", self, "_player_disconnected") get_tree().connect("connected_to_server", self, "_connected_ok") get_node("HeroSelect").connect("item_selected", self, "select_hero") @@ -101,6 +102,10 @@ func _server_init(): func _player_connected(id): print("Connect, my friend: " + str(id)) +func _player_disconnected(id): + if get_tree().is_network_server(): + rpc("unregister_player", id) + func _connected_ok(): rpc("register_player", get_tree().get_network_unique_id(), my_info) if "start_game" in my_info and my_info.start_game: @@ -140,6 +145,10 @@ remote func register_player(new_peer, info): if (player_info.size() == MAX_PLAYERS): start_game() +sync func unregister_player(peer): + player_info.erase(peer) + get_node("/root/Level/Players/%d" % peer).queue_free() + func select_hero(hero): rpc("set_hero", get_tree().get_network_unique_id(), hero) @@ -182,7 +191,11 @@ remote func done_preconfiguring(who): sync func pre_configure_game(level): var self_peer_id = get_tree().get_network_unique_id() - get_node("/root/Control").queue_free() + # Remove the interface so as to not fuck with things + # But we still need the lobby (Control) alive to deal with networking! + for element in get_node("/root/Control").get_children(): + element.queue_free() + var world = load("res://scenes/levels/%d.tscn" % level).instance() get_node("/root").add_child(world) From f41676c6725fb9b7ceb063df2abfc634624fb9f4 Mon Sep 17 00:00:00 2001 From: Luna Date: Thu, 1 Feb 2018 17:50:39 -0500 Subject: [PATCH 2/9] Remove ray and use Camera.project_position( And Camera.project_ray_normal. This is much better --- scenes/player.tscn | 10 +--------- scripts/heroes/1.gd | 6 +++--- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/scenes/player.tscn b/scenes/player.tscn index 0f36847..ba9aa93 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -20,7 +20,7 @@ radial_segments = 64 rings = 8 _sections_unfolded = [ "Resource" ] -[node name="RigidBody" type="RigidBody" index="0" groups=[ +[node name="RigidBody" type="RigidBody" groups=[ "player", ]] @@ -98,14 +98,6 @@ near = 0.05 far = 100.0 _sections_unfolded = [ "Transform", "Visibility" ] -[node name="Ray" type="RayCast" parent="Yaw/Pitch" index="1"] - -enabled = true -exclude_parent = true -cast_to = Vector3( 0, 0, -100 ) -collision_mask = 1 -_sections_unfolded = [ "Transform" ] - [node name="MeshInstance" type="MeshInstance" parent="." index="4"] transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0.95, 0 ) diff --git a/scripts/heroes/1.gd b/scripts/heroes/1.gd index daa8087..81be711 100644 --- a/scripts/heroes/1.gd +++ b/scripts/heroes/1.gd @@ -23,10 +23,10 @@ func _process(delta): if is_placing_wall: # Find the point we're looking at, and put the wall there var aim = get_node("Yaw/Pitch").get_global_transform().basis - var look_ray = get_node("Yaw/Pitch/Ray") - var pos = look_ray.get_collision_point() + var camera = get_node("Yaw/Pitch/Camera") + var pos = camera.project_position(Vector2()) placing_wall_node.set_translation(pos) - var towards = look_ray.get_collision_normal() + pos + var towards = camera.project_ray_normal(Vector2()) + pos var up = -aim[2] # Wall should be horizontal to my view placing_wall_node.look_at(towards, up) From 91c7f4161247e6a963f3536e9ce50fd5e2d95be0 Mon Sep 17 00:00:00 2001 From: Luna Date: Sat, 3 Feb 2018 13:13:30 -0500 Subject: [PATCH 3/9] [WIP] Add third person look, no hero support Hero 1 fails, probably 0 too haven't checked though. Hero 2 is fine. Haven't tested 3. --- scenes/player.tscn | 64 ++++++++++++++++----------- scripts/player.gd | 44 ++++++++----------- scripts/tp_camera.gd | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 176 insertions(+), 53 deletions(-) create mode 100644 scripts/tp_camera.gd diff --git a/scenes/player.tscn b/scenes/player.tscn index ba9aa93..2360b77 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=5 format=2] +[gd_scene load_steps=6 format=2] [ext_resource path="res://scripts/player.gd" type="Script" id=1] +[ext_resource path="res://scripts/tp_camera.gd" type="Script" id=2] [sub_resource type="CapsuleShape" id=1] @@ -20,7 +21,7 @@ radial_segments = 64 rings = 8 _sections_unfolded = [ "Resource" ] -[node name="RigidBody" type="RigidBody" groups=[ +[node name="RigidBody" type="RigidBody" index="0" groups=[ "player", ]] @@ -51,6 +52,8 @@ angular_velocity = Vector3( 0, 0, 0 ) angular_damp = -1.0 script = ExtResource( 1 ) _sections_unfolded = [ "Angular", "Axis Lock", "Collision", "Linear", "Transform", "Visibility", "collision" ] +tp_camera = NodePath("TPCamera") +master_only = NodePath("MasterOnly") [node name="Body" type="CollisionShape" parent="." index="0"] @@ -75,30 +78,7 @@ cast_to = Vector3( 0, -0.3, 0 ) collision_mask = 1 _sections_unfolded = [ "Transform", "Visibility" ] -[node name="Yaw" type="Spatial" parent="." index="3"] - -[node name="Pitch" type="Spatial" parent="Yaw" index="0"] - -transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.4, 0 ) -_sections_unfolded = [ "Transform" ] - -[node name="Camera" type="Camera" parent="Yaw/Pitch" index="0"] - -keep_aspect = 0 -cull_mask = 1048575 -environment = null -h_offset = 0.0 -v_offset = 0.0 -doppler_tracking = 0 -projection = 0 -current = false -fov = 70.0 -size = 1.0 -near = 0.05 -far = 100.0 -_sections_unfolded = [ "Transform", "Visibility" ] - -[node name="MeshInstance" type="MeshInstance" parent="." index="4"] +[node name="MeshInstance" type="MeshInstance" parent="." index="3"] transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0.95, 0 ) layers = 1 @@ -115,6 +95,13 @@ skeleton = NodePath("..") material/0 = null _sections_unfolded = [ "Transform" ] +[node name="Yaw" type="Spatial" parent="." index="4"] + +[node name="Pitch" type="Spatial" parent="Yaw" index="0"] + +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.4, 0 ) +_sections_unfolded = [ "Transform" ] + [node name="MasterOnly" type="Node" parent="." index="5"] [node name="Crosshair" type="Label" parent="MasterOnly" index="0"] @@ -159,4 +146,29 @@ percent_visible = 1.0 lines_skipped = 0 max_lines_visible = -1 +[node name="TPCamera" type="Spatial" parent="." index="6"] + +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.4, 0 ) +script = ExtResource( 2 ) +_sections_unfolded = [ "Transform" ] +cam = NodePath("Camera") +pivot = NodePath("Pivot") + +[node name="Pivot" type="Spatial" parent="TPCamera" index="0"] + +[node name="Camera" type="Camera" parent="TPCamera" index="1"] + +keep_aspect = 1 +cull_mask = 1048575 +environment = null +h_offset = 0.0 +v_offset = 0.0 +doppler_tracking = 0 +projection = 0 +current = false +fov = 70.0 +size = 1.0 +near = 0.05 +far = 100.0 + diff --git a/scripts/player.gd b/scripts/player.gd index c4e3ecd..570d75c 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -3,8 +3,6 @@ extends RigidBody var view_sensitivity = 0.25 -var yaw = 0 -var pitch = 0 # Walking speed and jumping height are defined later. var walk_speed = 0.8 # Actually acceleration; m/s/s @@ -29,19 +27,21 @@ slave var slave_transform = Basis() slave var slave_lin_v = Vector3() slave var slave_ang_v = Vector3() +export(NodePath) var tp_camera +export(NodePath) var master_only + func _ready(): + + tp_camera = get_node(tp_camera) + master_only = get_node(master_only) + set_process_input(true) - - # Capture mouse once game is started: - Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) - debug_node = get_node("/root/Level/Debug") - if is_network_master(): - get_node("Yaw/Pitch/Camera").make_current() + tp_camera.set_enabled(true) spawn() else: - remove_child(get_node("MasterOnly")) + remove_child(master_only) func spawn(): var placement = Vector3() @@ -60,17 +60,6 @@ func spawn(): set_linear_velocity(Vector3()) func _input(event): - if is_network_master(): - - if event is InputEventMouseMotion: - yaw = fmod(yaw - event.relative.x * view_sensitivity, 360) - pitch = max(min(pitch - event.relative.y * view_sensitivity, 85), -85) - set_rotation() - - # Toggle mouse capture: - if Input.is_action_pressed("toggle_mouse_capture"): - toggle_mouse_capture() - if Input.is_action_just_pressed("switch_hero"): switch_hero_interface() # Quit the game: @@ -85,30 +74,31 @@ func toggle_mouse_capture(): Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) view_sensitivity = 0.25 +# Update visual yaw + pitch components to match camera func set_rotation(): - get_node("Yaw").set_rotation(Vector3(0, deg2rad(yaw), 0)) - get_node("Yaw/Pitch").set_rotation(Vector3(deg2rad(pitch), 0, 0)) + get_node("Yaw").set_rotation(Vector3(0, deg2rad(tp_camera.cam_yaw), 0)) + get_node("Yaw/Pitch").set_rotation(Vector3(deg2rad(tp_camera.cam_pitch), 0, 0)) func _integrate_forces(state): if is_network_master(): control_player(state) rpc_unreliable("set_status", get_status()) + set_rotation() slave func set_status(s): set_transform(s[0]) set_linear_velocity(s[1]) set_angular_velocity(s[2]) - yaw = s[3] - pitch = s[4] - set_rotation() # Confirm yaw + pitch changes + tp_camera.cam_yaw = s[3] + tp_camera.cam_pitch = s[4] func get_status(): return [ get_transform(), get_linear_velocity(), get_angular_velocity(), - yaw, - pitch, + tp_camera.cam_yaw, + tp_camera.cam_pitch, ] func control_player(state): diff --git a/scripts/tp_camera.gd b/scripts/tp_camera.gd new file mode 100644 index 0000000..1212f2b --- /dev/null +++ b/scripts/tp_camera.gd @@ -0,0 +1,121 @@ +# From khairul169: https://github.com/khairul169/3rdperson-godot/blob/master/assets/scripts/tpscam.gd + +extends Spatial + +var cam_pitch = 0.0; +var cam_yaw = 0.0; +var cam_cpitch = 0.0; +var cam_cyaw = 0.0; +var cam_currentradius = 2.0; +var cam_radius = 2.0; +var cam_pos = Vector3(); +var cam_ray_result = {}; +var cam_smooth_movement = true; +var cam_fov = 60.0; +var cam_view_sensitivity = 0.3; +var cam_smooth_lerp = 10; +var cam_pitch_minmax = Vector2(90, -90); + +var is_enabled = false; +var collision_exception = []; + +export(NodePath) var cam; +export(NodePath) var pivot; + +func _ready(): + cam = get_node(cam); + pivot = get_node(pivot); + + cam_fov = cam.get_fov(); + +func set_enabled(enabled): + if enabled: + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED); + set_process(true); + cam.make_current() + is_enabled = true; + else: + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE); + set_process(false); + is_enabled = false; + +func clear_exception(): + collision_exception.clear(); + +func add_collision_exception(node): + collision_exception.push_back(node); + +func _input(ie): + if !is_enabled: + return; + + if ie is InputEventMouseMotion: + cam_pitch = max(min(cam_pitch+(ie.relative.y*cam_view_sensitivity),cam_pitch_minmax.x),cam_pitch_minmax.y); + if cam_smooth_movement: + cam_yaw = cam_yaw-(ie.relative.x*cam_view_sensitivity); + else: + cam_yaw = fmod(cam_yaw-(ie.relative.x*cam_view_sensitivity),360); + cam_currentradius = cam_radius; + cam_update(); + + if ie is InputEventMouseButton: + if ie.pressed: + if ie.button_index == BUTTON_WHEEL_UP: + cam_radius = max(min(cam_radius-0.2,4.0),1.0); + elif ie.button_index == BUTTON_WHEEL_DOWN: + cam_radius = max(min(cam_radius+0.2,4.0),1.0); + + # Toggle mouse capture: + if Input.is_action_just_pressed("toggle_mouse_capture"): + set_enabled(!is_enabled) + +func _process(delta): + if !is_enabled: + return; + + if !cam.is_current(): + cam.make_current(); + + if cam.get_projection() == Camera.PROJECTION_PERSPECTIVE: + cam.set_perspective(lerp(cam.get_fov(), cam_fov, cam_smooth_lerp*delta), cam.get_znear(), cam.get_zfar()); + + if cam_smooth_movement: + cam_cpitch = lerp(cam_cpitch, cam_pitch, 10*delta); + cam_cyaw = lerp(cam_cyaw, cam_yaw, 10*delta); + cam_currentradius = lerp(cam_currentradius, cam_radius, 5*delta); + + cam_update(); + +func cam_update(): + cam_pos = pivot.get_global_transform().origin; + + if cam_smooth_movement: + cam_pos.x += cam_currentradius * sin(deg2rad(cam_cyaw)) * cos(deg2rad(cam_cpitch)); + cam_pos.y += cam_currentradius * sin(deg2rad(cam_cpitch)); + cam_pos.z += cam_currentradius * cos(deg2rad(cam_cyaw)) * cos(deg2rad(cam_cpitch)); + else: + cam_pos.x += cam_currentradius * sin(deg2rad(cam_yaw)) * cos(deg2rad(cam_pitch)); + cam_pos.y += cam_currentradius * sin(deg2rad(cam_pitch)); + cam_pos.z += cam_currentradius * cos(deg2rad(cam_yaw)) * cos(deg2rad(cam_pitch)); + + var pos = Vector3(); + + if cam_ray_result.size() != 0: + print("re-pos, ray found") + var a = (cam_ray_result.position-pivot.get_global_transform().origin).normalized(); + var b = pivot.get_global_transform().origin.distance_to(cam_ray_result.position); + #pos = cam_ray_result.position; + pos = pivot.get_global_transform().origin+a*max(b-0.1, 0); + else: + pos = cam_pos; + + cam.look_at_from_position(pos, pivot.get_global_transform().origin, Vector3(0,1,0)); + +func _physics_process(delta): + if !is_enabled: + return; + + var ds = get_world().get_direct_space_state(); + if ds != null: + cam_ray_result = ds.intersect_ray(pivot.get_global_transform().origin, cam_pos, collision_exception); + #print(cam_ray_result) From 51b719d0e13ecbcce8f31b85ed0e7996dae9c49f Mon Sep 17 00:00:00 2001 From: Luna Date: Sat, 3 Feb 2018 13:23:22 -0500 Subject: [PATCH 4/9] Fix error on shuffling players in the tree --- scripts/player.gd | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/scripts/player.gd b/scripts/player.gd index 570d75c..1a9b24a 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -31,17 +31,14 @@ export(NodePath) var tp_camera export(NodePath) var master_only func _ready(): - - tp_camera = get_node(tp_camera) - master_only = get_node(master_only) - + set_process_input(true) debug_node = get_node("/root/Level/Debug") if is_network_master(): - tp_camera.set_enabled(true) + get_node(tp_camera).set_enabled(true) spawn() else: - remove_child(master_only) + remove_child(get_node(master_only)) func spawn(): var placement = Vector3() @@ -76,8 +73,8 @@ func toggle_mouse_capture(): # Update visual yaw + pitch components to match camera func set_rotation(): - get_node("Yaw").set_rotation(Vector3(0, deg2rad(tp_camera.cam_yaw), 0)) - get_node("Yaw/Pitch").set_rotation(Vector3(deg2rad(tp_camera.cam_pitch), 0, 0)) + get_node("Yaw").set_rotation(Vector3(0, deg2rad(get_node(tp_camera).cam_yaw), 0)) + get_node("Yaw/Pitch").set_rotation(Vector3(deg2rad(get_node(tp_camera).cam_pitch), 0, 0)) func _integrate_forces(state): if is_network_master(): @@ -89,16 +86,16 @@ slave func set_status(s): set_transform(s[0]) set_linear_velocity(s[1]) set_angular_velocity(s[2]) - tp_camera.cam_yaw = s[3] - tp_camera.cam_pitch = s[4] + get_node(tp_camera).cam_yaw = s[3] + get_node(tp_camera).cam_pitch = s[4] func get_status(): return [ get_transform(), get_linear_velocity(), get_angular_velocity(), - tp_camera.cam_yaw, - tp_camera.cam_pitch, + get_node(tp_camera).cam_yaw, + get_node(tp_camera).cam_pitch, ] func control_player(state): From ff12a789f22bd139ce2854e4ce52143bc509de96 Mon Sep 17 00:00:00 2001 From: Luna Date: Sat, 3 Feb 2018 16:25:07 -0500 Subject: [PATCH 5/9] Add head mesh to player scene, track camera --- scenes/player.tscn | 49 +++++++++++++++++++++++++++++++++++++------------ scripts/player.gd | 2 +- 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/scenes/player.tscn b/scenes/player.tscn index 2360b77..ff3f514 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=6 format=2] +[gd_scene load_steps=7 format=2] [ext_resource path="res://scripts/player.gd" type="Script" id=1] [ext_resource path="res://scripts/tp_camera.gd" type="Script" id=2] @@ -13,10 +13,18 @@ height = 0.5 length = 0.3 _sections_unfolded = [ "Resource" ] +[sub_resource type="PrismMesh" id=4] + +left_to_right = 0.5 +size = Vector3( 0.5, 0.5, 0.5 ) +subdivide_width = 0 +subdivide_height = 0 +subdivide_depth = 0 + [sub_resource type="CapsuleMesh" id=3] radius = 0.4 -mid_height = 0.5 +mid_height = 0.1 radial_segments = 64 rings = 8 _sections_unfolded = [ "Resource" ] @@ -78,9 +86,16 @@ cast_to = Vector3( 0, -0.3, 0 ) collision_mask = 1 _sections_unfolded = [ "Transform", "Visibility" ] -[node name="MeshInstance" type="MeshInstance" parent="." index="3"] +[node name="Yaw" type="Spatial" parent="." index="3"] -transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0.95, 0 ) +[node name="Pitch" type="Spatial" parent="Yaw" index="0"] + +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.4, 0 ) +_sections_unfolded = [ "Transform" ] + +[node name="MeshInstance" type="MeshInstance" parent="Yaw/Pitch" index="0"] + +transform = Transform( 2.65431e-14, -1.62921e-07, 1, -1, -1.62921e-07, 0, 1.62921e-07, -1, -1.62921e-07, 0, -0.0649133, -0.103671 ) layers = 1 material_override = null cast_shadow = 1 @@ -90,19 +105,29 @@ lod_min_distance = 0.0 lod_min_hysteresis = 0.0 lod_max_distance = 0.0 lod_max_hysteresis = 0.0 -mesh = SubResource( 3 ) +mesh = SubResource( 4 ) skeleton = NodePath("..") material/0 = null _sections_unfolded = [ "Transform" ] -[node name="Yaw" type="Spatial" parent="." index="4"] +[node name="MeshInstance" type="MeshInstance" parent="Yaw" index="1"] -[node name="Pitch" type="Spatial" parent="Yaw" index="0"] - -transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.4, 0 ) +transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0.787368, 0 ) +layers = 1 +material_override = null +cast_shadow = 1 +extra_cull_margin = 0.0 +use_in_baked_light = false +lod_min_distance = 0.0 +lod_min_hysteresis = 0.0 +lod_max_distance = 0.0 +lod_max_hysteresis = 0.0 +mesh = SubResource( 3 ) +skeleton = NodePath("..") +material/0 = null _sections_unfolded = [ "Transform" ] -[node name="MasterOnly" type="Node" parent="." index="5"] +[node name="MasterOnly" type="Node" parent="." index="4"] [node name="Crosshair" type="Label" parent="MasterOnly" index="0"] @@ -146,9 +171,9 @@ percent_visible = 1.0 lines_skipped = 0 max_lines_visible = -1 -[node name="TPCamera" type="Spatial" parent="." index="6"] +[node name="TPCamera" type="Spatial" parent="." index="5"] -transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.4, 0 ) +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.74343, 0 ) script = ExtResource( 2 ) _sections_unfolded = [ "Transform" ] cam = NodePath("Camera") diff --git a/scripts/player.gd b/scripts/player.gd index 1a9b24a..e8ff589 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -74,7 +74,7 @@ func toggle_mouse_capture(): # Update visual yaw + pitch components to match camera func set_rotation(): get_node("Yaw").set_rotation(Vector3(0, deg2rad(get_node(tp_camera).cam_yaw), 0)) - get_node("Yaw/Pitch").set_rotation(Vector3(deg2rad(get_node(tp_camera).cam_pitch), 0, 0)) + get_node("Yaw/Pitch").set_rotation(Vector3(deg2rad(-get_node(tp_camera).cam_pitch), 0, 0)) func _integrate_forces(state): if is_network_master(): From 2aac9d9a1a35eeae19465432162d37e06b5d91e9 Mon Sep 17 00:00:00 2001 From: Luna Date: Sat, 3 Feb 2018 16:32:27 -0500 Subject: [PATCH 6/9] Revert "Remove ray and use Camera.project_position(" This reverts commit f41676c6725fb9b7ceb063df2abfc634624fb9f4. I misunderstood the way the camera projections work, and I'm better off using the original raycasting strategy. --- scenes/player.tscn | 10 +++++++++- scripts/heroes/1.gd | 6 +++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/scenes/player.tscn b/scenes/player.tscn index ba9aa93..0f36847 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -20,7 +20,7 @@ radial_segments = 64 rings = 8 _sections_unfolded = [ "Resource" ] -[node name="RigidBody" type="RigidBody" groups=[ +[node name="RigidBody" type="RigidBody" index="0" groups=[ "player", ]] @@ -98,6 +98,14 @@ near = 0.05 far = 100.0 _sections_unfolded = [ "Transform", "Visibility" ] +[node name="Ray" type="RayCast" parent="Yaw/Pitch" index="1"] + +enabled = true +exclude_parent = true +cast_to = Vector3( 0, 0, -100 ) +collision_mask = 1 +_sections_unfolded = [ "Transform" ] + [node name="MeshInstance" type="MeshInstance" parent="." index="4"] transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0.95, 0 ) diff --git a/scripts/heroes/1.gd b/scripts/heroes/1.gd index 81be711..daa8087 100644 --- a/scripts/heroes/1.gd +++ b/scripts/heroes/1.gd @@ -23,10 +23,10 @@ func _process(delta): if is_placing_wall: # Find the point we're looking at, and put the wall there var aim = get_node("Yaw/Pitch").get_global_transform().basis - var camera = get_node("Yaw/Pitch/Camera") - var pos = camera.project_position(Vector2()) + var look_ray = get_node("Yaw/Pitch/Ray") + var pos = look_ray.get_collision_point() placing_wall_node.set_translation(pos) - var towards = camera.project_ray_normal(Vector2()) + pos + var towards = look_ray.get_collision_normal() + pos var up = -aim[2] # Wall should be horizontal to my view placing_wall_node.look_at(towards, up) From 76ff51d5faa6873565b187b3fc099675a194aa37 Mon Sep 17 00:00:00 2001 From: Luna Date: Sat, 3 Feb 2018 16:44:06 -0500 Subject: [PATCH 7/9] Fix Hero 1 wall placement / raycasting --- scenes/player.tscn | 16 ++++++++-------- scripts/heroes/1.gd | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/scenes/player.tscn b/scenes/player.tscn index 3dcc6e7..16bb59a 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -110,14 +110,6 @@ skeleton = NodePath("..") material/0 = null _sections_unfolded = [ "Transform" ] -[node name="Ray" type="RayCast" parent="Yaw/Pitch" index="1"] - -enabled = true -exclude_parent = true -cast_to = Vector3( 0, 0, -100 ) -collision_mask = 1 -_sections_unfolded = [ "Transform" ] - [node name="MasterOnly" type="Node" parent="." index="4"] [node name="Crosshair" type="Label" parent="MasterOnly" index="0"] @@ -187,6 +179,14 @@ size = 1.0 near = 0.05 far = 100.0 +[node name="Ray" type="RayCast" parent="TPCamera/Camera" index="0"] + +enabled = true +exclude_parent = true +cast_to = Vector3( 0, 0, -100 ) +collision_mask = 1 +_sections_unfolded = [ "Transform" ] + [node name="MeshInstance" type="MeshInstance" parent="." index="6"] transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0.787368, 0 ) diff --git a/scripts/heroes/1.gd b/scripts/heroes/1.gd index daa8087..d192ecf 100644 --- a/scripts/heroes/1.gd +++ b/scripts/heroes/1.gd @@ -23,7 +23,7 @@ func _process(delta): if is_placing_wall: # Find the point we're looking at, and put the wall there var aim = get_node("Yaw/Pitch").get_global_transform().basis - var look_ray = get_node("Yaw/Pitch/Ray") + var look_ray = get_node("TPCamera/Camera/Ray") var pos = look_ray.get_collision_point() placing_wall_node.set_translation(pos) var towards = look_ray.get_collision_normal() + pos From f8ac866f3d4059ff1aee0f27f248aca87094674d Mon Sep 17 00:00:00 2001 From: Luna Date: Sat, 3 Feb 2018 17:07:54 -0500 Subject: [PATCH 8/9] Allow head rotation to be visible in multiplayer --- scripts/player.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/player.gd b/scripts/player.gd index e8ff589..a5004a2 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -80,7 +80,7 @@ func _integrate_forces(state): if is_network_master(): control_player(state) rpc_unreliable("set_status", get_status()) - set_rotation() + set_rotation() slave func set_status(s): set_transform(s[0]) From d4bdd42be6d203d5cd8d86feec8823565490dd05 Mon Sep 17 00:00:00 2001 From: Luna Date: Sat, 3 Feb 2018 17:28:10 -0500 Subject: [PATCH 9/9] Fix hero switch switching the wrong clients I love git bisect! The problem was due to me accidentally deleting a crucial condition `is_network_master` when checking for hero_switch input. --- scripts/player.gd | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/player.gd b/scripts/player.gd index a5004a2..a4a0c9f 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -57,6 +57,7 @@ func spawn(): set_linear_velocity(Vector3()) func _input(event): + if is_network_master(): if Input.is_action_just_pressed("switch_hero"): switch_hero_interface() # Quit the game: