diff --git a/README.md b/README.md index f750b14..205d66f 100644 --- a/README.md +++ b/README.md @@ -10,4 +10,4 @@ Feel free to donate [Kenney ยท Racing Kit](https://kenney.nl/assets/racing-kit). ## contribution Feel free to contribute enhancements via pull request or ideas via issues ## donations -If you want to donate my work, feel free to do via [PayPal](https://www.paypal.me/Lurkars) +If you want to donate my work, feel free to do via [PayPal](https://www.paypal.me/Lurkars) or become a [Patreon](https://www.patreon.com/champonthis) diff --git a/project.godot b/project.godot index 8211b47..c13283a 100644 --- a/project.godot +++ b/project.godot @@ -10,16 +10,16 @@ config_version=4 _global_script_classes=[ { "base": "Spatial", -"class": "Inventory", +"class": "BaseInventory", "language": "GDScript", -"path": "res://scripts/player/inventory.gd" +"path": "res://scripts/player/BaseInventory.gd" }, { -"base": "Player", -"class": "PathPlayerBase", +"base": "Node", +"class": "BasePlayer", "language": "GDScript", -"path": "res://scripts/player/PathPlayerBase.gd" +"path": "res://scripts/player/BasePlayer.gd" }, { -"base": "Node", +"base": "BasePlayer", "class": "Player", "language": "GDScript", "path": "res://scripts/player/Player.gd" @@ -27,7 +27,7 @@ _global_script_classes=[ { "base": "Spatial", "class": "Preview", "language": "GDScript", -"path": "res://scripts/game/preview.gd" +"path": "res://scripts/player/InventoryPreview.gd" }, { "base": "MeshInstance", "class": "Road", @@ -50,8 +50,8 @@ _global_script_classes=[ { "path": "res://scripts/Util.gd" } ] _global_script_class_icons={ -"Inventory": "", -"PathPlayerBase": "", +"BaseInventory": "", +"BasePlayer": "", "Player": "", "Preview": "", "Road": "", diff --git a/scenes/debug/PathFollow.tscn b/scenes/debug/PathFollow.tscn deleted file mode 100644 index 3a943ce..0000000 --- a/scenes/debug/PathFollow.tscn +++ /dev/null @@ -1,14 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[ext_resource path="res://assets/raceCar/body.obj" type="ArrayMesh" id=1] - -[node name="PathFollow" type="PathFollow"] -rotation_mode = 4 -loop = false - -[node name="body" type="MeshInstance" parent="."] -transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 0.999999, 0, 0, -0.125 ) -mesh = ExtResource( 1 ) -material/0 = null -material/1 = null -material/2 = null diff --git a/scenes/game/world.tscn b/scenes/game/world.tscn index 093087b..b99d0cf 100644 --- a/scenes/game/world.tscn +++ b/scenes/game/world.tscn @@ -1,10 +1,7 @@ -[gd_scene load_steps=6 format=2] +[gd_scene load_steps=3 format=2] [ext_resource path="res://scripts/game/world.gd" type="Script" id=1] [ext_resource path="res://scripts/game/route.gd" type="Script" id=2] -[ext_resource path="res://scripts/game/preview.gd" type="Script" id=3] -[ext_resource path="res://scenes/player/inventory.tscn" type="PackedScene" id=4] -[ext_resource path="res://scripts/player/inventory.gd" type="Script" id=5] [node name="world" type="Spatial"] script = ExtResource( 1 ) @@ -12,12 +9,6 @@ script = ExtResource( 1 ) [node name="route" type="Spatial" parent="."] script = ExtResource( 2 ) -[node name="preview" type="Spatial" parent="."] -script = ExtResource( 3 ) - -[node name="inventory" parent="." instance=ExtResource( 4 )] -script = ExtResource( 5 ) - [node name="players" type="Spatial" parent="."] [node name="sun" type="DirectionalLight" parent="."] @@ -26,5 +17,3 @@ visible = false light_energy = 5.0 directional_shadow_mode = 1 directional_shadow_max_distance = 25.0 -[connection signal="road_added" from="route" to="preview" method="_on_route_road_added"] -[connection signal="item_changed" from="inventory" to="preview" method="_on_inventory_item_changed"] diff --git a/scenes/lobby/lobby.tscn b/scenes/lobby/lobby.tscn index 580bc20..fa6d14f 100644 --- a/scenes/lobby/lobby.tscn +++ b/scenes/lobby/lobby.tscn @@ -128,14 +128,6 @@ size_flags_horizontal = 2 size_flags_vertical = 2 text = "Join" -[node name="full" type="CheckBox" parent="connect"] -visible = false -margin_left = 18.0 -margin_top = 182.0 -margin_right = 69.0 -margin_bottom = 206.0 -text = "Full" - [node name="quick" type="Button" parent="connect"] margin_left = 103.0 margin_top = 214.0 diff --git a/scenes/player/BotPlayer.tscn b/scenes/player/BotPlayer.tscn new file mode 100644 index 0000000..b0ea556 --- /dev/null +++ b/scenes/player/BotPlayer.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://scripts/player/BotControls.gd" type="Script" id=1] +[ext_resource path="res://scripts/player/BotInventory.gd" type="Script" id=2] + +[node name="BotPlayer" type="Spatial"] +script = ExtResource( 1 ) + +[node name="inventory" type="Spatial" parent="."] +script = ExtResource( 2 ) diff --git a/scenes/player/FullPlayer.tscn b/scenes/player/FullPlayer.tscn deleted file mode 100644 index 9ca32fc..0000000 --- a/scenes/player/FullPlayer.tscn +++ /dev/null @@ -1,100 +0,0 @@ -[gd_scene load_steps=7 format=2] - -[ext_resource path="res://scripts/player/FullPlayer.gd" type="Script" id=1] -[ext_resource path="res://scripts/player/raceCar.gd" type="Script" id=2] -[ext_resource path="res://assets/raceCar/body.obj" type="ArrayMesh" id=3] -[ext_resource path="res://assets/raceCar/wheel.obj" type="ArrayMesh" id=4] - -[sub_resource type="SpatialMaterial" id=1] -albedo_color = Color( 0.14902, 0.14902, 0.14902, 1 ) - -[sub_resource type="BoxShape" id=2] -extents = Vector3( 0.05, 0.03, 0.13 ) - -[node name="FullPlayer" type="Spatial"] -script = ExtResource( 1 ) - -[node name="raceCar" type="VehicleBody" parent="."] -script = ExtResource( 2 ) - -[node name="body" type="MeshInstance" parent="raceCar"] -transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.125 ) -mesh = ExtResource( 3 ) -material/0 = null -material/1 = null -material/2 = null - -[node name="wheelBackLeft" type="VehicleWheel" parent="raceCar"] -editor/display_folded = true -transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.061, 0.024, -0.082 ) -use_as_traction = true -wheel_radius = 0.028 -wheel_rest_length = 0.04 -wheel_friction_slip = 1000.0 -suspension_travel = 0.04 -suspension_stiffness = 100.0 - -[node name="MeshInstance" type="MeshInstance" parent="raceCar/wheelBackLeft"] -mesh = ExtResource( 4 ) -material/0 = SubResource( 1 ) -material/1 = null - -[node name="wheelBackRight" type="VehicleWheel" parent="raceCar"] -editor/display_folded = true -transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.061, 0.024, -0.082 ) -use_as_traction = true -wheel_radius = 0.028 -wheel_rest_length = 0.04 -wheel_friction_slip = 1000.0 -suspension_travel = 0.04 -suspension_stiffness = 100.0 - -[node name="MeshInstance" type="MeshInstance" parent="raceCar/wheelBackRight"] -transform = Transform( -1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0 ) -mesh = ExtResource( 4 ) -material/0 = SubResource( 1 ) -material/1 = null - -[node name="wheelFrontLeft" type="VehicleWheel" parent="raceCar"] -editor/display_folded = true -transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.061, 0.024, 0.078 ) -use_as_steering = true -wheel_radius = 0.028 -wheel_rest_length = 0.04 -wheel_friction_slip = 1000.0 -suspension_travel = 0.04 -suspension_stiffness = 100.0 - -[node name="MeshInstance" type="MeshInstance" parent="raceCar/wheelFrontLeft"] -mesh = ExtResource( 4 ) -material/0 = SubResource( 1 ) -material/1 = null - -[node name="wheelFrontRight" type="VehicleWheel" parent="raceCar"] -editor/display_folded = true -transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.061, 0.024, 0.078 ) -use_as_steering = true -wheel_radius = 0.028 -wheel_rest_length = 0.04 -wheel_friction_slip = 1000.0 -suspension_travel = 0.04 -suspension_stiffness = 100.0 - -[node name="MeshInstance" type="MeshInstance" parent="raceCar/wheelFrontRight"] -transform = Transform( -1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0 ) -mesh = ExtResource( 4 ) -material/0 = SubResource( 1 ) -material/1 = null - -[node name="collision" type="CollisionShape" parent="raceCar"] -transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.04, 0.01 ) -shape = SubResource( 2 ) - -[node name="CameraTarget" type="Spatial" parent="raceCar"] -transform = Transform( -1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0.3, -0.6 ) - -[node name="ray" type="RayCast" parent="raceCar"] -transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.075, 0 ) -enabled = true -cast_to = Vector3( 0, -0.2, 0 ) -[connection signal="road_entered" from="raceCar" to="." method="_on_raceCar_road_entered"] diff --git a/scenes/player/HumanPlayer.tscn b/scenes/player/HumanPlayer.tscn new file mode 100644 index 0000000..33ef1bf --- /dev/null +++ b/scenes/player/HumanPlayer.tscn @@ -0,0 +1,97 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://scripts/player/HumanControls.gd" type="Script" id=1] +[ext_resource path="res://scripts/player/HumanInventory.gd" type="Script" id=2] +[ext_resource path="res://scenes/road/roadStraightLong.tscn" type="PackedScene" id=3] +[ext_resource path="res://scripts/player/InventoryPreview.gd" type="Script" id=4] + +[sub_resource type="ViewportTexture" id=1] +viewport_path = NodePath("inventory/viewport") + +[node name="HumanPlayer" type="Spatial"] +script = ExtResource( 1 ) + +[node name="hud" type="CanvasLayer" parent="."] + +[node name="speed" type="Label" parent="hud"] +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +margin_left = -77.0 +margin_top = -39.0 +margin_right = 77.0 +grow_horizontal = 2 +grow_vertical = 2 +align = 1 +valign = 1 + +[node name="reset" type="Label" parent="hud"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -20.0 +margin_top = -7.0 +margin_right = 20.0 +margin_bottom = 7.0 +align = 1 +valign = 1 +uppercase = true + +[node name="inventory" type="Control" parent="hud"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 + +[node name="background" type="ColorRect" parent="hud/inventory"] +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = -75.0 +margin_right = 75.0 +margin_bottom = 150.0 + +[node name="track" type="TextureRect" parent="hud/inventory"] +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = -75.0 +margin_right = 75.0 +margin_bottom = 150.0 +texture = SubResource( 1 ) + +[node name="type" type="Label" parent="hud/inventory"] +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = -74.0 +margin_right = 75.0 +margin_bottom = 58.0 +grow_horizontal = 2 +grow_vertical = 2 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +align = 1 +valign = 1 + +[node name="inventory" type="Spatial" parent="."] +script = ExtResource( 2 ) + +[node name="viewport" type="Viewport" parent="inventory"] +size = Vector2( 150, 150 ) +transparent_bg = true +hdr = false +render_target_v_flip = true + +[node name="camera" type="Camera" parent="inventory/viewport"] +transform = Transform( -4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -50.616, -999.296, 0 ) +current = true +fov = 100.0 +near = 0.5 +far = 20.0 + +[node name="view" type="Spatial" parent="inventory"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -50, -1000, 0 ) + +[node name="roadStraightLong" parent="inventory/view" instance=ExtResource( 3 )] +transform = Transform( -4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0 ) + +[node name="preview" type="Spatial" parent="inventory"] +script = ExtResource( 4 ) diff --git a/scenes/player/PathPlayerBot.tscn b/scenes/player/PathPlayerBot.tscn deleted file mode 100644 index 8a884b7..0000000 --- a/scenes/player/PathPlayerBot.tscn +++ /dev/null @@ -1,6 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[ext_resource path="res://scripts/player/PathPlayerBot.gd" type="Script" id=1] - -[node name="PlayerControls" type="Spatial"] -script = ExtResource( 1 ) diff --git a/scenes/player/PathPlayerControls.tscn b/scenes/player/PathPlayerControls.tscn deleted file mode 100644 index 859ad3e..0000000 --- a/scenes/player/PathPlayerControls.tscn +++ /dev/null @@ -1,34 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[ext_resource path="res://scripts/player/PathPlayerControls.gd" type="Script" id=1] - -[node name="PlayerControls" type="Spatial"] -script = ExtResource( 1 ) - -[node name="hud" type="CanvasLayer" parent="."] - -[node name="speed" type="Label" parent="hud"] -anchor_left = 0.5 -anchor_top = 1.0 -anchor_right = 0.5 -anchor_bottom = 1.0 -margin_left = -77.0 -margin_top = -39.0 -margin_right = 77.0 -grow_horizontal = 2 -grow_vertical = 2 -align = 1 -valign = 1 - -[node name="reset" type="Label" parent="hud"] -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -margin_left = -20.0 -margin_top = -7.0 -margin_right = 20.0 -margin_bottom = 7.0 -align = 1 -valign = 1 -uppercase = true diff --git a/scenes/player/PathPlayerBase.tscn b/scenes/player/Player.tscn similarity index 87% rename from scenes/player/PathPlayerBase.tscn rename to scenes/player/Player.tscn index 2d3b6b9..e1809bb 100644 --- a/scenes/player/PathPlayerBase.tscn +++ b/scenes/player/Player.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=8 format=2] -[ext_resource path="res://scripts/player/PathPlayerBase.gd" type="Script" id=1] +[ext_resource path="res://scripts/player/Player.gd" type="Script" id=1] [ext_resource path="res://scripts/player/raceCar.gd" type="Script" id=2] [ext_resource path="res://assets/raceCar/body.obj" type="ArrayMesh" id=3] [ext_resource path="res://assets/raceCar/wheel.obj" type="ArrayMesh" id=4] @@ -18,7 +18,7 @@ albedo_color = Color( 0.14902, 0.14902, 0.14902, 1 ) [sub_resource type="BoxShape" id=3] extents = Vector3( 0.075079, 0.03, 0.13 ) -[node name="BasePathPlayer" type="Spatial"] +[node name="Player" type="Spatial"] script = ExtResource( 1 ) [node name="Path" type="Path" parent="."] @@ -83,17 +83,5 @@ cast_to = Vector3( 0, -0.2, 0 ) [node name="ResetTimer" type="Timer" parent="."] wait_time = 3.0 one_shot = true - -[node name="debug_path" type="CSGPolygon" parent="."] -visible = false -invert_faces = true -polygon = PoolVector2Array( -0.05, 0.05, -0.05, 0.1, 0.05, 0.1, 0.05, 0.05 ) -mode = 2 -path_node = NodePath("../Path") -path_interval = 0.1 -path_rotation = 2 -path_local = false -path_continuous_u = false -path_joined = false [connection signal="road_entered" from="Path/PathFollow/raceCar" to="." method="_on_raceCar_road_entered"] [connection signal="timeout" from="ResetTimer" to="." method="_on_ResetTimer_timeout"] diff --git a/scenes/player/inventory.tscn b/scenes/player/inventory.tscn deleted file mode 100644 index 7070117..0000000 --- a/scenes/player/inventory.tscn +++ /dev/null @@ -1,56 +0,0 @@ -[gd_scene load_steps=3 format=2] - -[ext_resource path="res://scenes/road/roadStraightLong.tscn" type="PackedScene" id=1] - -[sub_resource type="ViewportTexture" id=1] -viewport_path = NodePath("viewport") - -[node name="inventory" type="Spatial"] -transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -50, 0, 0 ) - -[node name="viewport" type="Viewport" parent="."] -size = Vector2( 150, 150 ) -transparent_bg = true -hdr = false -render_target_v_flip = true - -[node name="camera" type="Camera" parent="viewport"] -transform = Transform( -4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -50.6157, 0.703695, 0 ) -current = true -fov = 100.0 -near = 0.5 -far = 20.0 - -[node name="HUD" type="CanvasLayer" parent="."] - -[node name="background" type="ColorRect" parent="HUD"] -anchor_left = 0.5 -anchor_right = 0.5 -margin_left = -75.0 -margin_right = 75.0 -margin_bottom = 150.0 - -[node name="track" type="TextureRect" parent="HUD"] -anchor_left = 0.5 -anchor_right = 0.5 -margin_left = -75.0 -margin_right = 75.0 -margin_bottom = 150.0 -texture = SubResource( 1 ) - -[node name="type" type="Label" parent="HUD"] -anchor_left = 0.5 -anchor_right = 0.5 -margin_left = -74.0 -margin_right = 75.0 -margin_bottom = 58.0 -grow_horizontal = 2 -grow_vertical = 2 -custom_colors/font_color = Color( 0, 0, 0, 1 ) -align = 1 -valign = 1 - -[node name="view" type="Spatial" parent="."] - -[node name="roadStraightLong" parent="view" instance=ExtResource( 1 )] -transform = Transform( -4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0 ) diff --git a/scripts/game/game_state.gd b/scripts/game/game_state.gd index 2c4e093..70e711a 100644 --- a/scripts/game/game_state.gd +++ b/scripts/game/game_state.gd @@ -9,17 +9,13 @@ const MAX_PEERS = MAX_PLAYERS - 1 var world_scene = preload("res://scenes/game/world.tscn") -var path_player_scene = preload("res://scenes/player/PathPlayerBase.tscn") -var path_player_controls_scene = preload("res://scenes/player/PathPlayerControls.tscn") -var path_player_bot_scene = preload("res://scenes/player/PathPlayerBot.tscn") -var full_player_scene = preload("res://scenes/player/FullPlayer.tscn") +var player_scene = preload("res://scenes/player/Player.tscn") +var human_player_scene = preload("res://scenes/player/HumanPlayer.tscn") +var bot_player_scene = preload("res://scenes/player/BotPlayer.tscn") # Name for my player var player_name = "Undefined" var player_color = Color("#000000") -var full = false - -puppet var slave_full = false # Names for remote players in id:name format var players = {} @@ -69,7 +65,6 @@ remote func register_player(id, new_player_name, new_player_color): if (get_tree().is_network_server()): # If we are the server, let everyone know about the new player rpc_id(id, "register_player", 1, player_name, player_color) # Send myself to new dude - rset_id(id, "slave_full", full) for p_id in players: # Then, for each remote player rpc_id(id, "register_player", p_id, players[p_id].name, players[p_id].color) # Send player to new dude rpc_id(p_id, "register_player", id, new_player_name, new_player_color) # Send new dude to player @@ -87,16 +82,10 @@ remote func pre_start_game(spawn_points): get_tree().get_root().add_child(world) get_tree().get_root().get_node("lobby").hide() - - full = slave_full - + for p_id in spawn_points: - var player var controls - if full: - player = full_player_scene.instance() - else: - player = path_player_scene.instance() + var player = player_scene.instance() player.set_network_master(p_id) player.set_name(str(p_id)) @@ -107,7 +96,8 @@ remote func pre_start_game(spawn_points): # If node for this peer id, set name player.set_player_name(player_name) player.set_player_color(player_color) - controls = path_player_controls_scene.instance() + controls = human_player_scene.instance() + controls.set_name("HumanControl_" + str(p_id)) world.add_child(controls) controls.set_player(player.get_path()) controls.set_network_master(p_id) @@ -122,11 +112,12 @@ remote func pre_start_game(spawn_points): if bots: for index in range(4-spawn_points.size()): var bot_index = spawn_points.size() + index - var player = path_player_scene.instance() + var player = player_scene.instance() player.set_name("bot_player" + str(bot_index)) world.get_node("players").add_child(player) + player.add_to_group("bots") if get_tree().is_network_server(): - var bot = path_player_bot_scene.instance() + var bot = bot_player_scene.instance() bot.set_name("bot" + str(bot_index)) world.add_child(bot) bot.set_player(player.get_path()) @@ -156,11 +147,9 @@ remote func ready_to_start(id): rpc_id(p, "post_start_game") post_start_game() -func host_game(new_player_name, new_player_color, new_full): +func host_game(new_player_name, new_player_color): player_name = new_player_name player_color = new_player_color - full = new_full - slave_full = full var host = NetworkedMultiplayerENet.new() host.create_server(DEFAULT_PORT, MAX_PEERS) get_tree().set_network_peer(host) diff --git a/scripts/game/world.gd b/scripts/game/world.gd index 598daf1..91c3b94 100644 --- a/scripts/game/world.gd +++ b/scripts/game/world.gd @@ -2,8 +2,6 @@ extends Spatial var players:Array var route:Route -var inventory -var preview:Preview var first:Player var last:Player @@ -11,8 +9,6 @@ const remove_last = 1 func _ready(): route = get_node("route") - inventory = get_node("inventory") - preview = get_node("preview") if is_network_master(): route.rpc("add_road","Start", -1) @@ -31,11 +27,12 @@ func set_player_order(): last = players[players.size()-1] func new_first(player): + if first != null: + first.rpc("set_first",false) first = player + first.rpc("set_first",true) var p_id = first.get_network_master() route.rpc("set_network_master",p_id) - preview.rpc("set_network_master",p_id) - inventory.rpc("set_network_master",p_id) func destroy_after_last(): if (last != null): @@ -47,10 +44,6 @@ func destroy_after_last(): func check_autotrack(): if (first != null): - if first.is_out: - inventory.rpc("set_network_master",-1) - else: - inventory.rpc("set_network_master",first.get_network_master()) if first.position.x != -1 && route.get_last_road() != null: if first.position.x == route.get_last_road().get_index(): route.rpc("add_road", roads_factory.STRAIGHT, -1) diff --git a/scripts/lobby/lobby.gd b/scripts/lobby/lobby.gd index 2bb6cb2..b68a098 100644 --- a/scripts/lobby/lobby.gd +++ b/scripts/lobby/lobby.gd @@ -19,8 +19,7 @@ func _on_host_pressed(): var player_name = get_node("connect/name").text var player_color = get_node("connect/color").color - var full = get_node("connect/full").is_pressed() - game_state.host_game(player_name, player_color, full) + game_state.host_game(player_name, player_color) refresh_lobby() func _on_join_pressed(): @@ -80,6 +79,5 @@ func _on_start_pressed(): func _on_quick_pressed(): var player_name = get_node("connect/name").text var player_color = get_node("connect/color").color - var full = get_node("connect/full").is_pressed() - game_state.host_game(player_name, player_color, full) + game_state.host_game(player_name, player_color) game_state.begin_game() diff --git a/scripts/player/BaseInventory.gd b/scripts/player/BaseInventory.gd new file mode 100644 index 0000000..1c60853 --- /dev/null +++ b/scripts/player/BaseInventory.gd @@ -0,0 +1,71 @@ +extends Spatial + +class_name BaseInventory + +var road_straights = [ + roads_factory.STRAIGHT, + roads_factory.STRAIGHT_SMALL, + roads_factory.BUMP, + roads_factory.BUMP_SMALL, +] + +var roads_left = [ + roads_factory.CURVE_LEFT, + roads_factory.CURVE_LARGE_LEFT, + roads_factory.CURVE_SMALL_LEFT, + roads_factory.SKEW_LEFT, + roads_factory.CURVED_LEFT, +] + +var roads_right = [ + roads_factory.CURVE_RIGHT, + roads_factory.CURVE_LARGE_RIGHT, + roads_factory.CURVE_SMALL_RIGHT, + roads_factory.SKEW_RIGHT, + roads_factory.CURVED_RIGHT, +] + +var roads_up = [ + roads_factory.RAMP_UP, + roads_factory.RAMP_CURVED_UP, + roads_factory.RAMP_SMALL_UP, +] + +var roads_down = [ + roads_factory.RAMP_DOWN, + roads_factory.RAMP_CURVED_DOWN, + roads_factory.RAMP_SMALL_DOWN, +] + +var roads_special = [ + roads_factory.LOOP, +] + +var roads = [ road_straights, roads_left, roads_right, roads_up, roads_down, roads_special ] + +var player:Player +var route:Route +var item:Road +var type:int = 0 +var index:int = 0 + +signal item_changed(index) + +func _ready(): + route = get_node("/root/world/route") + +func set_player(new_player:Player): + player = new_player + +func set_item(): + if is_network_master(): + if item: + item.free() + item = roads_factory.get_road_instance(roads[type][index]) + + if player != null: + item.set_color(player.get_player_color()) + + item.rotate_y(PI/2) + + emit_signal("item_changed", roads[type][index]) \ No newline at end of file diff --git a/scripts/player/BasePlayer.gd b/scripts/player/BasePlayer.gd new file mode 100644 index 0000000..a08ca08 --- /dev/null +++ b/scripts/player/BasePlayer.gd @@ -0,0 +1,42 @@ +extends Node + +class_name BasePlayer + +# player vars +export var player_color:Color +var player_name:String + +# positions +var is_out:bool = false +var position:Vector2 +var road_index:int = -1 + +# puppets +puppet var slave_position:Vector2 + +func get_race_car(): + pass + +func get_player_name(): + return player_name + +func set_player_name(new_name): + player_name = new_name + +func get_player_color(): + return player_color + +func set_player_color(new_color): + player_color = new_color + var material = SpatialMaterial.new() + material.set_albedo(player_color) + get_race_car().get_node("body").set_surface_material(1,material) + +func set_start(position:int): + pass + +remotesync func set_first(is_first:bool): + if is_first: + add_to_group("first") + else: + remove_from_group("first") \ No newline at end of file diff --git a/scripts/player/PathPlayerBot.gd b/scripts/player/BotControls.gd similarity index 96% rename from scripts/player/PathPlayerBot.gd rename to scripts/player/BotControls.gd index d866806..7c43508 100644 --- a/scripts/player/PathPlayerBot.gd +++ b/scripts/player/BotControls.gd @@ -1,6 +1,6 @@ extends Spatial -var player:PathPlayerBase +var player:Player var overspeed_rate:float = 0.8 var underspeed_rate:float = 0.8 @@ -38,6 +38,7 @@ func _physics_process(delta): func set_player(path:String): player = get_node(path) + get_node("inventory").set_player(player) func set_overspeed_rate(new_overspeed_rate:float): overspeed_rate = new_overspeed_rate diff --git a/scripts/player/BotInventory.gd b/scripts/player/BotInventory.gd new file mode 100644 index 0000000..62d4aa3 --- /dev/null +++ b/scripts/player/BotInventory.gd @@ -0,0 +1,19 @@ +extends BaseInventory + +var rand:RandomNumberGenerator = RandomNumberGenerator.new() + +func _ready(): + rand.randomize() + +func _on_raceCar_road_entered(road): + if is_network_master(): + if player != null: + if player.is_in_group("first"): + if route.get_last_road().get_index() <= (road.get_index() +2): + type = rand.randi_range(0,roads.size() -1) + index = rand.randi_range(0, roads[type].size() -1) + route.rpc("add_road", roads[type][index], -1) + +func set_player(new_player:Player): + player = new_player + player.get_race_car().connect("road_entered",self,"_on_raceCar_road_entered") \ No newline at end of file diff --git a/scripts/player/FullPlayer.gd b/scripts/player/FullPlayer.gd deleted file mode 100644 index 7249ac9..0000000 --- a/scripts/player/FullPlayer.gd +++ /dev/null @@ -1,105 +0,0 @@ -extends Player - -export var MAX_SPEED = 40.0 -export var MAX_ENGINE_FORCE = 40.0 -export var MAX_BRAKE_FORCE = 7.0 -export var MAX_STEER_ANGLE = 0.7 - -export var steer_speed = 1.0 -export var brake_factor = 0.1 - -puppet var slave_steering = 0.0 - -var steer_target = 0.0 -var steer_angle = 0.0 - -var had_throttle_or_brake_input = false -var is_reverse = false -var race_car - -const start_offset_x = [-0.17257, 0.17257, -0.17257, 0.17257 ] -const start_offset_z = [1.70223, 1.20223, 0.702227, 0.202227 ] - -func _ready(): - race_car = get_race_car() - if is_network_master(): - var camera = InterpolatedCamera.new() - camera.set_target_path("../raceCar/CameraTarget") - camera.set_interpolation_enabled(true) - camera.set_speed(10) - add_child(camera) - -func _physics_process(delta): - if (is_network_master()): - var current_speed_mps = race_car.get_linear_velocity().length() - var current_speed_kph = floor(current_speed_mps * 3.6) - - var steer_val = 0.0 - var throttle_val = 0.0 - var brake_val = 0.0 - - if (throttle_val < 0.0): - throttle_val = 0.0 - - if (brake_val < 0.0): - brake_val = 0.0 - - # overrules for keyboard - if Input.is_action_pressed("ui_up") && current_speed_kph <= MAX_SPEED: - throttle_val = 1.0 - if Input.is_action_pressed("ui_down"): - brake_val = 1.0 - if Input.is_action_pressed("ui_left"): - steer_val = 1.0 - elif Input.is_action_pressed("ui_right"): - steer_val = -1.0 - - # check if we need to be in reverse - if (had_throttle_or_brake_input == false and brake_val > 0.0 and current_speed_mps < 1.0): - had_throttle_or_brake_input = true - is_reverse = true - elif (throttle_val > 0.0 or brake_val > 0.0): - had_throttle_or_brake_input = true - else: - is_reverse = false - had_throttle_or_brake_input = false - - if (is_reverse): - var swap = throttle_val - throttle_val = -brake_val - brake_val = -swap - elif (throttle_val == 0.0 and brake_val == 0.0 and current_speed_mps < 3.0): - brake_val = brake_factor - - race_car.engine_force = throttle_val * MAX_ENGINE_FORCE - race_car.brake = brake_val * MAX_BRAKE_FORCE - - steer_target = steer_val * MAX_STEER_ANGLE - if (steer_target < steer_angle): - steer_angle -= steer_speed * delta - if (steer_target > steer_angle): - steer_angle = steer_target - elif (steer_target > steer_angle): - steer_angle += steer_speed * delta - if (steer_target < steer_angle): - steer_angle = steer_target - - race_car.steering = steer_angle - - rset_unreliable("slave_steering", steer_angle) - else: - race_car.steering = slave_steering - -func get_race_car(): - return get_node("raceCar") - -func get_road(): - return get_race_car().road - -func _on_raceCar_road_entered(road): - road_index = road.get_index() - position = Vector2(road_index, 0) - rset("slave_position", position) - -func set_start(position:int): - get_race_car().translate(Vector3(start_offset_x[position], 0, start_offset_z[position])) \ No newline at end of file diff --git a/scripts/player/PathPlayerControls.gd b/scripts/player/HumanControls.gd similarity index 88% rename from scripts/player/PathPlayerControls.gd rename to scripts/player/HumanControls.gd index bf73679..01384cf 100644 --- a/scripts/player/PathPlayerControls.gd +++ b/scripts/player/HumanControls.gd @@ -1,17 +1,17 @@ extends Spatial -var player:PathPlayerBase +var player:Player var camera:InterpolatedCamera func _physics_process(delta): if is_network_master() && player != null: if player.is_out: - camera.set_speed(1) + camera.set_speed(0.1) if player.timer.get_time_left() > 0: get_node("hud/reset").set_text(str(int(player.timer.get_time_left()))) else: get_node("hud/reset").set_text("reset") - if Input.is_action_pressed("ui_select"): + if Input.is_action_pressed("ui_down"): camera.set_speed(10) player.reset() get_node("hud/reset").set_text("") @@ -24,9 +24,10 @@ func _physics_process(delta): player.current_speed = 0 get_node("hud/speed").set_text(str(player.current_speed)) - + func set_player(path:String): player = get_node(path) + get_node("inventory").set_player(player) camera = InterpolatedCamera.new() camera.set_target_path(path + "/Path/PathFollow/raceCar/CameraTarget") camera.set_interpolation_enabled(true) diff --git a/scripts/player/HumanInventory.gd b/scripts/player/HumanInventory.gd new file mode 100644 index 0000000..6b3962e --- /dev/null +++ b/scripts/player/HumanInventory.gd @@ -0,0 +1,58 @@ +extends BaseInventory + +var view:Spatial +var preview:Spatial + +func _ready(): + view = get_node("view") + preview = get_node("preview") + var hud_track = get_node("../hud/inventory/track") + hud_track.get_texture().set_viewport_path_in_scene(str(get_path()) + "/viewport") + connect("item_changed",self,"_on_item_changed") + +func _physics_process(delta): + if is_network_master(): + if player != null: + if not player.is_out && player.is_in_group("first"): + get_node("../hud/inventory").show() + if item == null: + set_item() + if preview.item: + preview.item.show() + if Input.is_action_just_pressed("ui_select"): + route.rpc("add_road", roads[type][index], get_tree().get_network_unique_id()) + if Input.is_action_just_pressed("ui_navigate_left"): + type -= 1 + if type < 0: + type = roads.size() -1 + index = 0 + set_item() + if Input.is_action_just_pressed("ui_navigate_right"): + type += 1 + if type > roads.size() - 1: + type = 0 + index = 0 + set_item() + if Input.is_action_just_pressed("ui_navigate_down"): + index -= 1 + if index < 0: + index = roads[type].size() -1 + set_item() + if Input.is_action_just_pressed("ui_navigate_up"): + index += 1 + if index > roads[type].size() - 1: + index = 0 + set_item() + else: + get_node("../hud/inventory").hide() + if preview.item: + preview.item.hide() + +func _on_item_changed(road_identifier): + if is_network_master(): + if view.get_child_count() > 0: + view.remove_child(view.get_child(0)) + + view.add_child(item) + + get_node("../hud/inventory/type").set_text(road_identifier) \ No newline at end of file diff --git a/scripts/game/preview.gd b/scripts/player/InventoryPreview.gd similarity index 69% rename from scripts/game/preview.gd rename to scripts/player/InventoryPreview.gd index f8c3fac..ac0e5b2 100644 --- a/scripts/game/preview.gd +++ b/scripts/player/InventoryPreview.gd @@ -2,20 +2,17 @@ extends Spatial class_name Preview +var player:Player var route:Route var item:Road -func _ready(): - route = get_node("../route") - -remotesync func set_network_master(id:int, recursive:bool = true): - if is_network_master(): - if get_child_count() > 0: - remove_child(get_child(0)) - .set_network_master(id) +func _ready(): + route = get_node("/root/world/route") + route.connect("road_added",self,"_on_route_road_added") + get_parent().connect("item_changed",self,"_on_inventory_item_changed") func _on_route_road_added(road): - if (is_network_master() && item): + if is_network_master() && item: var transform = road.get_global_transform(); var curve = road.get_curve() transform = transform.translated(curve.get_point_position(curve.get_point_count() -1)) @@ -24,14 +21,13 @@ func _on_route_road_added(road): item.set_global_transform(transform) func _on_inventory_item_changed(road_identifier): - if (is_network_master()): + if is_network_master(): if item: item.free() item = roads_factory.get_road_instance(road_identifier) item.set_preview(true) - var player = get_parent().get_node("players/" + str(get_tree().get_network_unique_id())) + var player = get_parent().player if player != null: item.set_color(player.get_player_color()) add_child(item) _on_route_road_added(route.get_last_road()) - diff --git a/scripts/player/PathPlayerBase.gd b/scripts/player/PathPlayerBase.gd deleted file mode 100644 index 3803ce1..0000000 --- a/scripts/player/PathPlayerBase.gd +++ /dev/null @@ -1,161 +0,0 @@ -extends Player - -class_name PathPlayerBase - -var MAX_SPEED:float = 0.2 - -var current_speed:float = 0.0 - -export var speed_factor:float = 0.001 -export var brake_factor:float = 0.8 - - -# nodes -var timer:Timer -var path:Path -var follow:PathFollow - -var lane:int - -var has_next:bool = false -var is_resetable:bool = false -var buffered_curve:Curve3D -var buffered_translate:Vector3 = Vector3(0,0,0) -var buffered_rotation:Vector3 = Vector3(0,0,0) -var last_rotation:Vector3 = Vector3(0,0,0) -var torque_penalty:Vector3 -var force_penalty:Vector3 - -const lane_offset = [-0.085, 0.085, -0.255, 0.255 ] - -func _ready(): - timer = get_node("ResetTimer") - path = get_node("Path") - path.curve = path.curve.duplicate() - path.curve.set_bake_interval(0.05) - follow = get_node("Path/PathFollow") - -func _physics_process(delta): - if is_network_master(): - if not is_out: - - follow.set_offset(follow.get_offset() + current_speed) - - # curve - if has_next && (path.curve.get_point_count() == 0 || follow.get_unit_offset() >= 1.0): - has_next = false - if path.curve.get_point_count() > 0: - path.curve.clear_points() - - path.curve.set_bake_interval(0.05) - for i in range(buffered_curve.get_point_count()): - var _pos = buffered_curve.get_point_position(i) - var _in = buffered_curve.get_point_in(i) - var _out = buffered_curve.get_point_out(i) - if buffered_rotation.length() != 0: - _pos = _pos.rotated(buffered_rotation.normalized(), buffered_rotation.length()) - _in = _in.rotated(buffered_rotation.normalized(), buffered_rotation.length()) - _out = _out.rotated(buffered_rotation.normalized(), buffered_rotation.length()) - path.curve.add_point(buffered_translate + _pos, _in, _out) - path.curve.set_point_tilt(i, buffered_curve.get_point_tilt(i)) - follow.set_offset(0.001) - if get_road() != null: - road_index = get_road().get_index() - if get_road() != null: - var road = get_road() - var penalty_index = road.penalty_index(follow.get_offset(), current_speed) - - if penalty_index >= 0: - torque_penalty = road.get_torque_penalty(penalty_index) - force_penalty = road.get_force_penalty(penalty_index) - is_out = true - is_resetable = false - timer.start() - - # position - check_position() - else: - var race_car = get_race_car() - race_car.get_node("ray").set_enabled(false) - if force_penalty.length() != 0: - race_car.apply_central_impulse(force_penalty * current_speed) - if torque_penalty.length() != 0: - race_car.axis_lock_angular_x = false - race_car.axis_lock_angular_y = false - race_car.axis_lock_angular_z = false - race_car.apply_torque_impulse(torque_penalty * current_speed) - else: - position = slave_position - -func get_race_car(): - return get_node("Path/PathFollow/raceCar") - -func get_road(): - return get_race_car().road - -func _on_raceCar_road_entered(road): - buffered_curve = road.get_lane_curve(lane) - - buffered_rotation = last_rotation - - if path.curve.get_point_count() > 0: - buffered_translate = Util.Curve_get_last_point(path.curve) - - if road.get_end_rotation().length() != 0: - last_rotation += road.get_end_rotation() - - has_next = true - -master func check_position(): - position = Vector2(road_index, follow.get_offset()) - rset("slave_position", position) - -master func reset(): - if is_resetable: - is_out = false - is_resetable = false - has_next = false - current_speed = 0 - - var race_car = get_race_car() - # todo PATH - - var route = get_node("/root/world/route") - var road = race_car.road - - while road.reset_index != 0: - road = route.get_road(road.get_index() - road.reset_index) - - path.curve.clear_points() - - force_penalty = Vector3(0,0,0) - torque_penalty = Vector3(0,0,0) - - var road_before = route.get_road(road.get_index() - 1) - if road_before == null: - road_before = road - - last_rotation = road_before.get_rotation() - var point = Util.Curve_get_last_point(road_before.get_lane_curve(lane)) - if last_rotation.length() != 0: - point = point.rotated(last_rotation.normalized(), last_rotation.length()) - buffered_translate = road_before.get_translation() + point - - follow.set_transform(road.get_transform()) - - race_car.road = null - race_car.collider = null - race_car.linear_velocity = Vector3(0,0,0) - race_car.angular_velocity = Vector3(0,0,0) - race_car.axis_lock_angular_x = true - race_car.axis_lock_angular_y = true - race_car.axis_lock_angular_z = true - race_car.transform = Transform() - race_car.get_node("ray").set_enabled(true) - -func set_start(new_lane:int): - lane = new_lane - follow.set_h_offset(lane_offset[lane]) - -func _on_ResetTimer_timeout(): - is_resetable = true diff --git a/scripts/player/Player.gd b/scripts/player/Player.gd index 8ba450c..807de2c 100644 --- a/scripts/player/Player.gd +++ b/scripts/player/Player.gd @@ -1,36 +1,161 @@ -extends Node +extends BasePlayer class_name Player -# player vars -export var player_color:Color -var player_name:String +var MAX_SPEED:float = 0.2 -# positions -var is_out:bool = false -var position:Vector2 -var road_index:int = -1 +var current_speed:float = 0.0 -# puppets -puppet var slave_position:Vector2 +export var speed_factor:float = 0.001 +export var brake_factor:float = 0.8 + +# nodes +var timer:Timer +var path:Path +var follow:PathFollow + +var lane:int + +var has_next:bool = false +var is_resetable:bool = false +var buffered_curve:Curve3D +var buffered_translate:Vector3 = Vector3(0,0,0) +var buffered_rotation:Vector3 = Vector3(0,0,0) +var last_rotation:Vector3 = Vector3(0,0,0) +var torque_penalty:Vector3 +var force_penalty:Vector3 + +const lane_offset = [-0.085, 0.085, -0.255, 0.255 ] + +func _ready(): + timer = get_node("ResetTimer") + path = get_node("Path") + path.curve = path.curve.duplicate() + path.curve.set_bake_interval(0.05) + follow = get_node("Path/PathFollow") + +func _physics_process(delta): + if is_network_master(): + if not is_out: + + follow.set_offset(follow.get_offset() + current_speed) + + # curve + if has_next && (path.curve.get_point_count() == 0 || follow.get_unit_offset() >= 1.0): + has_next = false + if path.curve.get_point_count() > 0: + path.curve.clear_points() + + path.curve.set_bake_interval(0.05) + for i in range(buffered_curve.get_point_count()): + var _pos = buffered_curve.get_point_position(i) + var _in = buffered_curve.get_point_in(i) + var _out = buffered_curve.get_point_out(i) + if buffered_rotation.length() != 0: + _pos = _pos.rotated(buffered_rotation.normalized(), buffered_rotation.length()) + _in = _in.rotated(buffered_rotation.normalized(), buffered_rotation.length()) + _out = _out.rotated(buffered_rotation.normalized(), buffered_rotation.length()) + path.curve.add_point(buffered_translate + _pos, _in, _out) + path.curve.set_point_tilt(i, buffered_curve.get_point_tilt(i)) + follow.set_offset(0.001) + if get_road() != null: + road_index = get_road().get_index() + if get_road() != null: + var road = get_road() + var penalty_index = road.penalty_index(follow.get_offset(), current_speed) + + if penalty_index >= 0: + torque_penalty = road.get_torque_penalty(penalty_index) + force_penalty = road.get_force_penalty(penalty_index) + is_out = true + is_resetable = false + timer.start() + + # position + check_position() + else: + var race_car = get_race_car() + race_car.get_node("ray").set_enabled(false) + if force_penalty.length() != 0: + race_car.apply_central_impulse(force_penalty * current_speed) + if torque_penalty.length() != 0: + race_car.axis_lock_angular_x = false + race_car.axis_lock_angular_y = false + race_car.axis_lock_angular_z = false + race_car.apply_torque_impulse(torque_penalty * current_speed) + else: + position = slave_position func get_race_car(): - pass + return get_node("Path/PathFollow/raceCar") + +func get_road(): + return get_race_car().road + +func _on_raceCar_road_entered(road): + buffered_curve = road.get_lane_curve(lane) -func get_player_name(): - return player_name + buffered_rotation = last_rotation + + if path.curve.get_point_count() > 0: + buffered_translate = Util.Curve_get_last_point(path.curve) -func set_player_name(new_name): - player_name = new_name - -func get_player_color(): - return player_color - -func set_player_color(new_color): - player_color = new_color - var material = SpatialMaterial.new() - material.set_albedo(player_color) - get_race_car().get_node("body").set_surface_material(1,material) + if road.get_end_rotation().length() != 0: + last_rotation += road.get_end_rotation() + + has_next = true + +master func check_position(): + position = Vector2(road_index, follow.get_offset()) + rset("slave_position", position) -func set_start(position:int): - pass \ No newline at end of file +master func reset(): + if is_resetable: + has_next = false + current_speed = 0 + + var race_car = get_race_car() + # todo PATH + + var route = get_node("/root/world/route") + var road = race_car.road + + while road.reset_index != 0: + road = route.get_road(road.get_index() - road.reset_index) + + path.curve.clear_points() + + force_penalty = Vector3(0,0,0) + torque_penalty = Vector3(0,0,0) + + var road_before = route.get_road(road.get_index() - 1) + if road_before == null: + road_before = road + + last_rotation = road_before.get_rotation() + var point = Util.Curve_get_last_point(road_before.get_lane_curve(lane)) + if last_rotation.length() != 0: + point = point.rotated(last_rotation.normalized(), last_rotation.length()) + buffered_translate = road_before.get_translation() + point + + follow.set_transform(road.get_transform()) + + race_car.road = null + race_car.collider = null + race_car.linear_velocity = Vector3(0,0,0) + race_car.angular_velocity = Vector3(0,0,0) + race_car.axis_lock_angular_x = true + race_car.axis_lock_angular_y = true + race_car.axis_lock_angular_z = true + race_car.transform = Transform() + race_car.get_node("ray").set_enabled(true) + + is_out = false + is_resetable = false + +func set_start(new_lane:int): + lane = new_lane + follow.set_h_offset(lane_offset[lane]) + +func _on_ResetTimer_timeout(): + is_resetable = true diff --git a/scripts/player/inventory.gd b/scripts/player/inventory.gd deleted file mode 100644 index f359d56..0000000 --- a/scripts/player/inventory.gd +++ /dev/null @@ -1,114 +0,0 @@ -extends Spatial - -class_name Inventory - -var view:Spatial -var item:Road -var type:int = 0 -var index:int = 0 -var route:Route - -var road_straights = [ - roads_factory.STRAIGHT, - roads_factory.STRAIGHT_SMALL, - roads_factory.BUMP, - roads_factory.BUMP_SMALL, -] - -var roads_left = [ - roads_factory.CURVE_LEFT, - roads_factory.CURVE_LARGE_LEFT, - roads_factory.CURVE_SMALL_LEFT, - roads_factory.SKEW_LEFT, - roads_factory.CURVED_LEFT, -] - -var roads_right = [ - roads_factory.CURVE_RIGHT, - roads_factory.CURVE_LARGE_RIGHT, - roads_factory.CURVE_SMALL_RIGHT, - roads_factory.SKEW_RIGHT, - roads_factory.CURVED_RIGHT, -] - -var roads_up = [ - roads_factory.RAMP_UP, - roads_factory.RAMP_CURVED_UP, - roads_factory.RAMP_SMALL_UP, -] - -var roads_down = [ - roads_factory.RAMP_DOWN, - roads_factory.RAMP_CURVED_DOWN, - roads_factory.RAMP_SMALL_DOWN, -] - -var roads_special = [ - roads_factory.LOOP, -] - -var roads = [ road_straights, roads_left, roads_right, roads_up, roads_down, roads_special ] - -signal item_changed(index) - -func _ready(): - view = get_node("view") - route = get_node("../route") - -remotesync func set_network_master(id:int, recursive:bool = true): - if is_network_master(): - get_node("HUD/background").hide() - get_node("HUD/track").hide() - get_node("HUD/type").hide() - .set_network_master(id) - if is_network_master(): - get_node("HUD/background").show() - get_node("HUD/track").show() - get_node("HUD/type").show() - set_item() - -func _process(delta): - if (is_network_master()): - if Input.is_action_just_pressed("ui_select"): - route.rpc("add_road", roads[type][index], get_tree().get_network_unique_id()) - if Input.is_action_just_pressed("ui_navigate_left"): - type -= 1 - if type < 0: - type = roads.size() -1 - index = 0 - set_item() - if Input.is_action_just_pressed("ui_navigate_right"): - type += 1 - if type > roads.size() - 1: - type = 0 - index = 0 - set_item() - if Input.is_action_just_pressed("ui_navigate_down"): - index -= 1 - if index < 0: - index = roads[type].size() -1 - set_item() - if Input.is_action_just_pressed("ui_navigate_up"): - index += 1 - if index > roads[type].size() - 1: - index = 0 - set_item() - -func set_item(): - if (is_network_master()): - if item: - item.free() - if view.get_child_count() > 0: - view.remove_child(view.get_child(0)) - item = roads_factory.get_road_instance(roads[type][index]) - - var player = get_parent().get_node("players/" + str(get_tree().get_network_unique_id())) - if player != null: - item.set_color(player.get_player_color()) - - view.add_child(item) - item.rotate_y(PI/2) - - get_node("HUD/type").set_text(roads[type][index]) - - emit_signal("item_changed", roads[type][index]) \ No newline at end of file diff --git a/scripts/player/player_controls.gd b/scripts/player/player_controls.gd deleted file mode 100644 index 393901a..0000000 --- a/scripts/player/player_controls.gd +++ /dev/null @@ -1,94 +0,0 @@ -extends VehicleBody - -export var MAX_SPEED = 200.0 -export var MAX_ENGINE_FORCE = 100.0 -export var MAX_BRAKE_FORCE = 15.0 -export var MAX_STEER_ANGLE = 0.5 - -export var steer_speed = 0.5 -export var brake_factor = 0.1 - -puppet var slave_transform = Transform() -puppet var slave_velocity = Vector3() -puppet var slave_steering = 0.0 - -var steer_target = 0.0 -var steer_angle = 0.0 - -var had_throttle_or_brake_input = false -var is_reverse = false - -func _physics_process(delta): - - if (is_network_master()): - var current_speed_mps = get_linear_velocity().length() - var current_speed_kph = floor(current_speed_mps * 3.6) - - get_node("HUD/speed").text = String(current_speed_kph) + " kph" - - var steer_val = 0.0 - var throttle_val = 0.0 - var brake_val = 0.0 - - if (throttle_val < 0.0): - throttle_val = 0.0 - - if (brake_val < 0.0): - brake_val = 0.0 - - # overrules for keyboard - if Input.is_action_pressed("ui_up") && current_speed_kph <= MAX_SPEED: - throttle_val = 1.0 - if Input.is_action_pressed("ui_down"): - brake_val = 1.0 - if Input.is_action_pressed("ui_left"): - steer_val = 1.0 - elif Input.is_action_pressed("ui_right"): - steer_val = -1.0 - - # check if we need to be in reverse - if (had_throttle_or_brake_input == false and brake_val > 0.0 and current_speed_mps < 1.0): - had_throttle_or_brake_input = true - is_reverse = true - elif (throttle_val > 0.0 or brake_val > 0.0): - had_throttle_or_brake_input = true - else: - is_reverse = false - had_throttle_or_brake_input = false - - if (is_reverse): - var swap = throttle_val - throttle_val = -brake_val - brake_val = -swap - elif (throttle_val == 0.0 and brake_val == 0.0 and current_speed_mps < 3.0): - brake_val = brake_factor - - engine_force = throttle_val * MAX_ENGINE_FORCE - brake = brake_val * MAX_BRAKE_FORCE - - steer_target = steer_val * MAX_STEER_ANGLE - if (steer_target < steer_angle): - steer_angle -= steer_speed * delta - if (steer_target > steer_angle): - steer_angle = steer_target - elif (steer_target > steer_angle): - steer_angle += steer_speed * delta - if (steer_target < steer_angle): - steer_angle = steer_target - - steering = steer_angle - - rset_unreliable("slave_transform", get_global_transform()) - rset_unreliable("slave_velocity", get_linear_velocity()) - rset_unreliable("slave_steering", steer_angle) - else: - set_global_transform(slave_transform) - set_linear_velocity(slave_velocity) - steering = slave_steering - -func set_color(new_color): - for i in range(get_node("body").get_surface_count()): - var material = get_node("body").surface_get_material(i) - var albedo = material.get_shader_param("albedo") - albedo.color = new_color - \ No newline at end of file