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 | |||||