This is the real initial commit with all the code I have until now. Networking: A server and 2 clients connect and then control their players. This is still buggy. For example, every client controls the /same/ player. FPS controls: WSAD, Jump, and Look with mouse are all implemented (Taken from Caliou's demo). This includes collisions.master
| @ -0,0 +1,101 @@ | |||
| [gd_resource type="Environment" load_steps=2 format=2] | |||
| [sub_resource type="ProceduralSky" id=1] | |||
| radiance_size = 4 | |||
| sky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 ) | |||
| sky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 ) | |||
| sky_curve = 0.25 | |||
| sky_energy = 1.0 | |||
| ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 ) | |||
| ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 ) | |||
| ground_curve = 0.01 | |||
| ground_energy = 1.0 | |||
| sun_color = Color( 1, 1, 1, 1 ) | |||
| sun_latitude = 35.0 | |||
| sun_longitude = 0.0 | |||
| sun_angle_min = 1.0 | |||
| sun_angle_max = 100.0 | |||
| sun_curve = 0.05 | |||
| sun_energy = 16.0 | |||
| texture_size = 2 | |||
| [resource] | |||
| background_mode = 2 | |||
| background_sky = SubResource( 1 ) | |||
| background_sky_custom_fov = 0.0 | |||
| background_color = Color( 0, 0, 0, 1 ) | |||
| background_energy = 1.0 | |||
| background_canvas_max_layer = 0 | |||
| ambient_light_color = Color( 0, 0, 0, 1 ) | |||
| ambient_light_energy = 1.0 | |||
| ambient_light_sky_contribution = 1.0 | |||
| fog_enabled = false | |||
| fog_color = Color( 0.5, 0.6, 0.7, 1 ) | |||
| fog_sun_color = Color( 1, 0.9, 0.7, 1 ) | |||
| fog_sun_amount = 0.0 | |||
| fog_depth_enabled = true | |||
| fog_depth_begin = 10.0 | |||
| fog_depth_curve = 1.0 | |||
| fog_transmit_enabled = false | |||
| fog_transmit_curve = 1.0 | |||
| fog_height_enabled = false | |||
| fog_height_min = 0.0 | |||
| fog_height_max = 100.0 | |||
| fog_height_curve = 1.0 | |||
| tonemap_mode = 0 | |||
| tonemap_exposure = 1.0 | |||
| tonemap_white = 1.0 | |||
| auto_exposure_enabled = false | |||
| auto_exposure_scale = 0.4 | |||
| auto_exposure_min_luma = 0.05 | |||
| auto_exposure_max_luma = 8.0 | |||
| auto_exposure_speed = 0.5 | |||
| ss_reflections_enabled = false | |||
| ss_reflections_max_steps = 64 | |||
| ss_reflections_fade_in = 0.15 | |||
| ss_reflections_fade_out = 2.0 | |||
| ss_reflections_depth_tolerance = 0.2 | |||
| ss_reflections_roughness = true | |||
| ssao_enabled = false | |||
| ssao_radius = 1.0 | |||
| ssao_intensity = 1.0 | |||
| ssao_radius2 = 0.0 | |||
| ssao_intensity2 = 1.0 | |||
| ssao_bias = 0.01 | |||
| ssao_light_affect = 0.0 | |||
| ssao_color = Color( 0, 0, 0, 1 ) | |||
| ssao_quality = 0 | |||
| ssao_blur = 3 | |||
| ssao_edge_sharpness = 4.0 | |||
| dof_blur_far_enabled = false | |||
| dof_blur_far_distance = 10.0 | |||
| dof_blur_far_transition = 5.0 | |||
| dof_blur_far_amount = 0.1 | |||
| dof_blur_far_quality = 1 | |||
| dof_blur_near_enabled = false | |||
| dof_blur_near_distance = 2.0 | |||
| dof_blur_near_transition = 1.0 | |||
| dof_blur_near_amount = 0.1 | |||
| dof_blur_near_quality = 1 | |||
| glow_enabled = false | |||
| glow_levels/1 = false | |||
| glow_levels/2 = false | |||
| glow_levels/3 = true | |||
| glow_levels/4 = false | |||
| glow_levels/5 = true | |||
| glow_levels/6 = false | |||
| glow_levels/7 = false | |||
| glow_intensity = 0.8 | |||
| glow_strength = 1.0 | |||
| glow_bloom = 0.0 | |||
| glow_blend_mode = 2 | |||
| glow_hdr_threshold = 1.0 | |||
| glow_hdr_scale = 2.0 | |||
| glow_bicubic_upscale = false | |||
| adjustment_enabled = false | |||
| adjustment_brightness = 1.0 | |||
| adjustment_contrast = 1.0 | |||
| adjustment_saturation = 1.0 | |||
| @ -0,0 +1,28 @@ | |||
| [remap] | |||
| importer="texture" | |||
| type="StreamTexture" | |||
| path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" | |||
| [deps] | |||
| source_md5="ae7e641067601e2184afcade49abd283" | |||
| [params] | |||
| compress/mode=0 | |||
| compress/lossy_quality=0.7 | |||
| compress/hdr_mode=0 | |||
| compress/normal_map=0 | |||
| flags/repeat=0 | |||
| flags/filter=true | |||
| flags/mipmaps=false | |||
| flags/anisotropic=false | |||
| flags/srgb=2 | |||
| process/fix_alpha_border=true | |||
| process/premult_alpha=false | |||
| process/HDR_as_SRGB=false | |||
| stream=false | |||
| size_limit=0 | |||
| detect_3d=true | |||
| svg/scale=1.0 | |||
| @ -0,0 +1,89 @@ | |||
| extends Control | |||
| # class member variables go here, for example: | |||
| # var a = 2 | |||
| # var b = "textvar" | |||
| var SERVER_IP = "127.0.0.1" | |||
| var SERVER_PORT = 2467 | |||
| var MAX_PLAYERS = 2 | |||
| var player_info = {} | |||
| var my_info = {} | |||
| func _ready(): | |||
| # Called every time the node is added to the scene. | |||
| # Initialization here | |||
| get_node("Server").connect("pressed", self, "_server_init") | |||
| get_node("Client").connect("pressed", self, "_client_init") | |||
| get_node("Singleplayer").connect("pressed", self, "_singleplayer_init") | |||
| get_tree().connect("network_peer_connected", self, "_player_connected") | |||
| get_tree().connect("connected_to_server", self, "_connected_ok") | |||
| func _client_init(): | |||
| my_info.username = get_node("Username").get_text() | |||
| var peer = NetworkedMultiplayerENet.new() | |||
| peer.create_client(SERVER_IP, SERVER_PORT) | |||
| get_tree().set_network_peer(peer) | |||
| get_node("Client").set_text("Clienting!") | |||
| func _singleplayer_init(): | |||
| my_info.username = get_node("Username").get_text() | |||
| var peer = NetworkedMultiplayerENet.new() | |||
| peer.create_server(SERVER_PORT, 1) | |||
| get_tree().set_network_peer(peer) | |||
| pre_configure_game() | |||
| func _server_init(): | |||
| var peer = NetworkedMultiplayerENet.new() | |||
| peer.create_server(SERVER_PORT, MAX_PLAYERS) | |||
| get_tree().set_network_peer(peer) | |||
| get_node("Server").set_text("Serving!") | |||
| func _player_connected(id): | |||
| print("Connect, my friend: " + str(id)) | |||
| func _connected_ok(): | |||
| rpc("register_player", get_tree().get_network_unique_id(), my_info) | |||
| remote func register_player(id, info): | |||
| player_info[id] = info | |||
| if (get_tree().is_network_server()): | |||
| rpc_id(id, "register_player", 1, my_info) | |||
| # Send current players' info to new player | |||
| for peer_id in player_info: | |||
| rpc_id(id, "register_player", peer_id, player_info[peer_id]) | |||
| if (player_info.size() == MAX_PLAYERS): | |||
| rpc("pre_configure_game") | |||
| pre_configure_game() | |||
| var players_done = [] | |||
| remote func done_preconfiguring(who): | |||
| players_done.append(who) | |||
| if (players_done.size() == player_info.size()): | |||
| rpc("post_configure_game") | |||
| remote func pre_configure_game(): | |||
| var self_peer_id = get_tree().get_network_unique_id() | |||
| get_node("/root/Control").queue_free() | |||
| var world = load("res://world.tscn").instance() | |||
| get_node("/root").add_child(world) | |||
| var my_player = preload("res://player.tscn").instance() | |||
| my_player.set_name(str(self_peer_id)) | |||
| my_player.set_network_master(self_peer_id) | |||
| get_node("/root/world/players").add_child(my_player) | |||
| # Load other players | |||
| for p in player_info: | |||
| var player = preload("res://player.tscn").instance() | |||
| player.set_name(str(p)) | |||
| get_node("/root/world/players").add_child(player) | |||
| rpc_id(1, "done_preconfiguring", self_peer_id) | |||
| #func _process(delta): | |||
| # # Called every frame. Delta is time since last frame. | |||
| # # Update game logic here. | |||
| # pass | |||
| @ -0,0 +1,124 @@ | |||
| [gd_scene load_steps=2 format=2] | |||
| [ext_resource path="res://lobby.gd" type="Script" id=1] | |||
| [node name="Control" type="Control" index="0"] | |||
| anchor_left = 0.0 | |||
| anchor_top = 0.0 | |||
| anchor_right = 0.0 | |||
| anchor_bottom = 0.0 | |||
| margin_right = 40.0 | |||
| margin_bottom = 40.0 | |||
| rect_pivot_offset = Vector2( 0, 0 ) | |||
| mouse_filter = 0 | |||
| mouse_default_cursor_shape = 0 | |||
| size_flags_horizontal = 1 | |||
| size_flags_vertical = 1 | |||
| script = ExtResource( 1 ) | |||
| [node name="Server" type="Button" parent="." index="0"] | |||
| anchor_left = 0.0 | |||
| anchor_top = 0.0 | |||
| anchor_right = 0.0 | |||
| anchor_bottom = 0.0 | |||
| margin_top = 6.0 | |||
| margin_right = 52.0 | |||
| margin_bottom = 26.0 | |||
| rect_pivot_offset = Vector2( 0, 0 ) | |||
| focus_mode = 2 | |||
| mouse_filter = 0 | |||
| mouse_default_cursor_shape = 0 | |||
| size_flags_horizontal = 1 | |||
| size_flags_vertical = 1 | |||
| toggle_mode = false | |||
| enabled_focus_mode = 2 | |||
| shortcut = null | |||
| group = null | |||
| text = "Server" | |||
| flat = false | |||
| align = 1 | |||
| [node name="Client" type="Button" parent="." index="1"] | |||
| anchor_left = 0.0 | |||
| anchor_top = 0.0 | |||
| anchor_right = 0.0 | |||
| anchor_bottom = 0.0 | |||
| margin_left = 1.0 | |||
| margin_top = 44.0 | |||
| margin_right = 50.0 | |||
| margin_bottom = 64.0 | |||
| rect_pivot_offset = Vector2( 0, 0 ) | |||
| focus_mode = 2 | |||
| mouse_filter = 0 | |||
| mouse_default_cursor_shape = 0 | |||
| size_flags_horizontal = 1 | |||
| size_flags_vertical = 1 | |||
| toggle_mode = false | |||
| enabled_focus_mode = 2 | |||
| shortcut = null | |||
| group = null | |||
| text = "Client" | |||
| flat = false | |||
| align = 1 | |||
| [node name="Username" type="TextEdit" parent="." index="2"] | |||
| anchor_left = 0.0 | |||
| anchor_top = 0.0 | |||
| anchor_right = 0.0 | |||
| anchor_bottom = 0.0 | |||
| margin_left = 3.0 | |||
| margin_top = 88.0 | |||
| margin_right = 182.0 | |||
| margin_bottom = 108.0 | |||
| rect_pivot_offset = Vector2( 0, 0 ) | |||
| focus_mode = 2 | |||
| mouse_filter = 0 | |||
| mouse_default_cursor_shape = 0 | |||
| size_flags_horizontal = 1 | |||
| size_flags_vertical = 1 | |||
| text = "" | |||
| readonly = false | |||
| highlight_current_line = false | |||
| syntax_highlighting = false | |||
| show_line_numbers = false | |||
| highlight_all_occurrences = false | |||
| override_selected_font_color = false | |||
| context_menu_enabled = true | |||
| smooth_scrolling = false | |||
| v_scroll_speed = 80.0 | |||
| hiding_enabled = 0 | |||
| wrap_lines = false | |||
| caret_block_mode = false | |||
| caret_blink = false | |||
| caret_blink_speed = 0.65 | |||
| caret_moving_by_right_click = true | |||
| [node name="Singleplayer" type="Button" parent="." index="3"] | |||
| anchor_left = 0.0 | |||
| anchor_top = 0.0 | |||
| anchor_right = 0.0 | |||
| anchor_bottom = 0.0 | |||
| margin_left = 72.0 | |||
| margin_top = 8.0 | |||
| margin_right = 161.0 | |||
| margin_bottom = 28.0 | |||
| rect_pivot_offset = Vector2( 0, 0 ) | |||
| focus_mode = 2 | |||
| mouse_filter = 0 | |||
| mouse_default_cursor_shape = 0 | |||
| size_flags_horizontal = 1 | |||
| size_flags_vertical = 1 | |||
| toggle_mode = false | |||
| enabled_focus_mode = 2 | |||
| shortcut = null | |||
| group = null | |||
| text = "Singleplayer" | |||
| flat = false | |||
| align = 1 | |||
| @ -0,0 +1,170 @@ | |||
| # Copyright (c) 2015 Calinou | |||
| # This source code form is governed by the MIT license. | |||
| # Original: https://raw.githubusercontent.com/Calinou/fps-test/master/scripts/player.gd | |||
| extends RigidBody | |||
| var view_sensitivity = 0.25 | |||
| var yaw = 0 | |||
| var pitch = 0 | |||
| var is_moving = false | |||
| const max_accel = 0.005 | |||
| const air_accel = 0.02 | |||
| var timer = 0 | |||
| # Walking speed and jumping height are defined later. | |||
| var walk_speed | |||
| var jump_speed | |||
| var health = 100 | |||
| var stamina = 10000 | |||
| var ray_length = 10 | |||
| slave var slave_transform = Basis() | |||
| slave var slave_lin_v = Vector3() | |||
| slave var slave_ang_v = Vector3() | |||
| func _ready(): | |||
| set_process_input(true) | |||
| # Capture mouse once game is started: | |||
| Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) | |||
| #set_physics_process(true) | |||
| get_node("Crosshair").set_text("+") | |||
| if is_network_master(): | |||
| get_node("Yaw/Camera").make_current() | |||
| 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) | |||
| get_node("Yaw").set_rotation(Vector3(0, deg2rad(yaw), 0)) | |||
| get_node("Yaw/Camera").set_rotation(Vector3(deg2rad(pitch), 0, 0)) | |||
| # Toggle mouse capture: | |||
| if Input.is_action_pressed("toggle_mouse_capture"): | |||
| if (Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED): | |||
| Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) | |||
| view_sensitivity = 0 | |||
| else: | |||
| Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) | |||
| view_sensitivity = 0.25 | |||
| # Quit the game: | |||
| if Input.is_action_pressed("quit"): | |||
| quit() | |||
| func _physics_process(delta): | |||
| #get_node("FPS").set_text(str(OS.get_frames_per_second(), " FPS")) | |||
| #get_node("Stamina").set_value(stamina) | |||
| is_moving = false | |||
| func _integrate_forces(state): | |||
| if is_network_master(): | |||
| control_player(state) | |||
| rset_unreliable("slave_transform", get_transform()) | |||
| rset_unreliable("slave_lin_v", get_linear_velocity()) | |||
| rset_unreliable("slave_ang_v", get_angular_velocity()) | |||
| else: | |||
| set_transform(slave_transform) | |||
| set_linear_velocity(slave_lin_v) | |||
| set_angular_velocity(slave_ang_v) | |||
| func control_player(state): | |||
| # Default walk speed: | |||
| walk_speed = 5 | |||
| # Default jump height: | |||
| jump_speed = 3 | |||
| var aim = get_node("Yaw").get_global_transform().basis | |||
| var direction = Vector3() | |||
| if Input.is_action_pressed("move_forwards"): | |||
| direction -= aim[2] | |||
| is_moving = true | |||
| if Input.is_action_pressed("move_backwards"): | |||
| direction += aim[2] | |||
| is_moving = true | |||
| if Input.is_action_pressed("move_left"): | |||
| direction -= aim[0] | |||
| is_moving = true | |||
| if Input.is_action_pressed("move_right"): | |||
| direction += aim[0] | |||
| is_moving = true | |||
| direction = direction.normalized() | |||
| var ray = get_node("Ray") | |||
| # Increase walk speed and jump height while running and decrement stamina: | |||
| if Input.is_action_pressed("run") and is_moving and ray.is_colliding(): | |||
| walk_speed *= 1.4 | |||
| jump_speed *= 1.2 | |||
| print("---") | |||
| print(state.get_linear_velocity()) | |||
| if ray.is_colliding(): | |||
| var up = state.get_total_gravity().normalized() | |||
| var normal = ray.get_collision_normal() | |||
| var floor_velocity = Vector3() | |||
| var object = ray.get_collider() | |||
| if object is RigidBody or object is StaticBody: | |||
| var point = ray.get_collision_point() - object.get_translation() | |||
| var floor_angular_vel = Vector3() | |||
| if object is RigidBody: | |||
| floor_velocity = object.get_linear_velocity() | |||
| floor_angular_vel = object.get_angular_velocity() | |||
| elif object is StaticBody: | |||
| floor_velocity = object.get_constant_linear_velocity() | |||
| floor_angular_vel = object.get_constant_angular_velocity() | |||
| # Surely there should be a function to convert Euler angles to a 3x3 matrix | |||
| var tf = Basis(Vector3(1, 0, 0), floor_angular_vel.x) | |||
| tf = tf.rotated(Vector3(0, 1, 0), floor_angular_vel.y) | |||
| tf = tf.rotated(Vector3(0, 0, 1), floor_angular_vel.z) | |||
| floor_velocity += tf.xform_inv(point) - point | |||
| yaw = fmod(yaw + rad2deg(floor_angular_vel.y) * state.get_step(), 360) | |||
| get_node("Yaw").set_rotation(Vector3(0, deg2rad(yaw), 0)) | |||
| print("isRB||isSB") | |||
| var diff = floor_velocity + direction * walk_speed - state.get_linear_velocity() | |||
| var vertdiff = aim[1] * diff.dot(aim[1]) | |||
| print("VD: " + str(vertdiff)) | |||
| diff -= vertdiff | |||
| diff = diff.normalized() * clamp(diff.length(), 0, max_accel / state.get_step()) | |||
| diff += vertdiff | |||
| print("D: " + str(diff)) | |||
| apply_impulse(Vector3(), diff * get_mass()) | |||
| if Input.is_action_pressed("jump"): | |||
| apply_impulse(Vector3(), normal * jump_speed * get_mass()) | |||
| else: | |||
| apply_impulse(Vector3(), direction * air_accel * get_mass()) | |||
| print(get_translation()) | |||
| print(state.get_linear_velocity()) | |||
| state.integrate_forces() | |||
| func _exit_scene(): | |||
| Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) | |||
| # Functions | |||
| # ========= | |||
| # Quits the game: | |||
| func quit(): | |||
| get_tree().quit() | |||
| @ -0,0 +1,12 @@ | |||
| # Blender MTL File: 'player.blend' | |||
| # Material Count: 1 | |||
| newmtl Material | |||
| Ns 96.078431 | |||
| Ka 1.000000 1.000000 1.000000 | |||
| Kd 0.640000 0.640000 0.640000 | |||
| Ks 0.500000 0.500000 0.500000 | |||
| Ke 0.000000 0.000000 0.000000 | |||
| Ni 1.000000 | |||
| d 1.000000 | |||
| illum 2 | |||
| @ -0,0 +1,15 @@ | |||
| [remap] | |||
| importer="wavefront_obj" | |||
| type="Mesh" | |||
| path="res://.import/player.obj-6e2f17c0007f45d03dba8b8cecc6f696.mesh" | |||
| [deps] | |||
| files=[ "res://.import/player.obj-6e2f17c0007f45d03dba8b8cecc6f696.mesh" ] | |||
| source_md5="7074ae8221d3b083f4f95e70e1ee446f" | |||
| [params] | |||
| generate_tangents=true | |||
| @ -0,0 +1,133 @@ | |||
| [gd_scene load_steps=5 format=2] | |||
| [ext_resource path="res://player.gd" type="Script" id=1] | |||
| [sub_resource type="CapsuleShape" id=1] | |||
| radius = 0.4 | |||
| height = 0.5 | |||
| [sub_resource type="RayShape" id=2] | |||
| length = 0.3 | |||
| _sections_unfolded = [ "Resource" ] | |||
| [sub_resource type="CapsuleMesh" id=3] | |||
| radius = 0.4 | |||
| mid_height = 0.5 | |||
| radial_segments = 64 | |||
| rings = 8 | |||
| _sections_unfolded = [ "Resource" ] | |||
| [node name="RigidBody" type="RigidBody" index="0"] | |||
| input_ray_pickable = true | |||
| input_capture_on_drag = false | |||
| collision_layer = 1 | |||
| collision_mask = 1 | |||
| mode = 2 | |||
| mass = 1.0 | |||
| friction = 0.0 | |||
| bounce = 0.0 | |||
| gravity_scale = 1.0 | |||
| custom_integrator = true | |||
| continuous_cd = true | |||
| contacts_reported = 8 | |||
| contact_monitor = true | |||
| sleeping = false | |||
| can_sleep = false | |||
| axis_lock_linear_x = false | |||
| axis_lock_linear_y = false | |||
| axis_lock_linear_z = false | |||
| axis_lock_angular_x = false | |||
| axis_lock_angular_y = false | |||
| axis_lock_angular_z = false | |||
| linear_velocity = Vector3( 0, 0, 0 ) | |||
| linear_damp = -1.0 | |||
| angular_velocity = Vector3( 0, 0, 0 ) | |||
| angular_damp = -1.0 | |||
| script = ExtResource( 1 ) | |||
| _sections_unfolded = [ "Angular", "Collision", "Linear", "Transform", "Visibility" ] | |||
| [node name="Body" type="CollisionShape" parent="." index="0"] | |||
| transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0.95, 0 ) | |||
| shape = SubResource( 1 ) | |||
| disabled = false | |||
| _sections_unfolded = [ "Pause", "Transform", "Visibility" ] | |||
| [node name="Leg" type="CollisionShape" parent="." index="1"] | |||
| transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0.05, 0.35, 0 ) | |||
| shape = SubResource( 2 ) | |||
| disabled = false | |||
| _sections_unfolded = [ "Transform", "Visibility" ] | |||
| [node name="Ray" type="RayCast" parent="." index="2"] | |||
| transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.3, 0 ) | |||
| enabled = true | |||
| exclude_parent = true | |||
| cast_to = Vector3( 0, -0.3, 0 ) | |||
| collision_mask = 1 | |||
| _sections_unfolded = [ "Transform", "Visibility" ] | |||
| [node name="Yaw" type="Spatial" parent="." index="3"] | |||
| _sections_unfolded = [ "Transform", "Visibility" ] | |||
| [node name="Camera" type="Camera" parent="Yaw" index="0"] | |||
| transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.4, 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="Crosshair" type="Label" parent="." index="4"] | |||
| 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 | |||
| rect_pivot_offset = Vector2( 0, 0 ) | |||
| mouse_filter = 2 | |||
| mouse_default_cursor_shape = 0 | |||
| size_flags_horizontal = 1 | |||
| size_flags_vertical = 4 | |||
| percent_visible = 1.0 | |||
| lines_skipped = 0 | |||
| max_lines_visible = -1 | |||
| [node name="MeshInstance" type="MeshInstance" parent="." index="5"] | |||
| transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0.95, 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" ] | |||
| @ -0,0 +1,36 @@ | |||
| ; Engine configuration file. | |||
| ; It's best edited using the editor UI and not directly, | |||
| ; since the parameters that go here are not all obvious. | |||
| ; | |||
| ; Format: | |||
| ; [section] ; section goes between [] | |||
| ; param=value ; assign values to parameters | |||
| config_version=3 | |||
| [application] | |||
| config/name="mv-moba" | |||
| run/main_scene="res://lobby.tscn" | |||
| config/icon="res://icon.png" | |||
| [debug] | |||
| =false | |||
| [input] | |||
| move_forwards=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":44,"unicode":0,"echo":false,"script":null) | |||
| ] | |||
| move_backwards=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":79,"unicode":0,"echo":false,"script":null) | |||
| ] | |||
| move_left=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":65,"unicode":0,"echo":false,"script":null) | |||
| ] | |||
| move_right=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":69,"unicode":0,"echo":false,"script":null) | |||
| ] | |||
| jump=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null) | |||
| ] | |||
| [rendering] | |||
| environment/default_environment="res://default_env.tres" | |||
| @ -0,0 +1,127 @@ | |||
| [gd_scene load_steps=3 format=2] | |||
| [ext_resource path="res://player.obj" type="ArrayMesh" id=1] | |||
| [sub_resource type="BoxShape" id=1] | |||
| extents = Vector3( 50, 10, 50 ) | |||
| [node name="world" type="Spatial"] | |||
| [node name="DirectionalLight" type="DirectionalLight" parent="." index="0"] | |||
| transform = Transform( 0.784405, 0.193347, -0.589343, 0.315866, 0.693208, 0.647836, 0.533794, -0.694319, 0.482684, -7.6643, 1.97737, 0 ) | |||
| layers = 1 | |||
| light_color = Color( 1, 1, 1, 1 ) | |||
| light_energy = 1.0 | |||
| light_indirect_energy = 1.0 | |||
| light_negative = false | |||
| light_specular = 0.5 | |||
| light_bake_mode = 1 | |||
| light_cull_mask = -1 | |||
| shadow_enabled = false | |||
| shadow_color = Color( 0, 0, 0, 1 ) | |||
| shadow_bias = 0.1 | |||
| shadow_contact = 0.0 | |||
| shadow_reverse_cull_face = false | |||
| editor_only = false | |||
| directional_shadow_mode = 2 | |||
| directional_shadow_split_1 = 0.1 | |||
| directional_shadow_split_2 = 0.2 | |||
| directional_shadow_split_3 = 0.5 | |||
| directional_shadow_blend_splits = false | |||
| directional_shadow_normal_bias = 0.8 | |||
| directional_shadow_bias_split_scale = 0.25 | |||
| directional_shadow_depth_range = 0 | |||
| directional_shadow_max_distance = 200.0 | |||
| [node name="players" type="Spatial" parent="." index="1"] | |||
| transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 11.4634, 0 ) | |||
| [node name="MeshInstance" type="MeshInstance" parent="." index="2"] | |||
| transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 5.88045, 1.58404, 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 = ExtResource( 1 ) | |||
| skeleton = NodePath("..") | |||
| material/0 = null | |||
| [node name="MeshInstance2" type="MeshInstance" parent="." index="3"] | |||
| transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -7.15372, 1.58404, 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 = ExtResource( 1 ) | |||
| skeleton = NodePath("..") | |||
| material/0 = null | |||
| [node name="MeshInstance3" type="MeshInstance" parent="." index="4"] | |||
| transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 1.05031, 1.58404, -9.94615 ) | |||
| 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 = ExtResource( 1 ) | |||
| skeleton = NodePath("..") | |||
| material/0 = null | |||
| [node name="MeshInstance4" type="MeshInstance" parent="." index="5"] | |||
| transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 1.05031, 1.58404, 7.02516 ) | |||
| 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 = ExtResource( 1 ) | |||
| skeleton = NodePath("..") | |||
| material/0 = null | |||
| [node name="Spatial" type="Spatial" parent="." index="6"] | |||
| transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -10, 0 ) | |||
| _sections_unfolded = [ "Transform" ] | |||
| [node name="StaticBody" type="StaticBody" parent="Spatial" index="0"] | |||
| input_ray_pickable = true | |||
| input_capture_on_drag = false | |||
| collision_layer = 1 | |||
| collision_mask = 1 | |||
| friction = 1.0 | |||
| bounce = 0.0 | |||
| constant_linear_velocity = Vector3( 0, 0, 0 ) | |||
| constant_angular_velocity = Vector3( 0, 0, 0 ) | |||
| [node name="CollisionShape" type="CollisionShape" parent="Spatial/StaticBody" index="0"] | |||
| shape = SubResource( 1 ) | |||
| disabled = false | |||