Initial commit
This commit is contained in:
@@ -0,0 +1,255 @@
|
||||
extends Control
|
||||
class_name Main
|
||||
|
||||
@onready var start_btn : Button = $Mainmenu/Menu/MarginContainer/VBoxContainer/HBoxContainer4/VBoxContainer3/Start
|
||||
@onready var disconnect_btn : Button = $Pausemenu/Menu/MarginContainer/VBoxCurrentLobby/Disconnect
|
||||
@onready var name_edit : = $Mainmenu/Menu/MarginContainer/VBoxContainer/HBoxContainer4/VBoxContainer2/NameEdit
|
||||
@onready var disconnectDialog = $Dialogs/DisconnectDialog
|
||||
@onready var pausemenu = $Pausemenu
|
||||
@onready var mainmenu = $Mainmenu
|
||||
@onready var hud = $Hud
|
||||
@onready var mapsParent: Node3D = $Maps
|
||||
@onready var playersParent: Node3D = $Players
|
||||
|
||||
var peer = WebSocketMultiplayerPeer.new()
|
||||
var lobby: PackedScene = preload("res://Maps/Lobby/Lobby.tscn")
|
||||
|
||||
var player: PackedScene = preload("res://actors/Player/player_character.tscn")
|
||||
|
||||
var mic_capture : AudioEffectOpusChunked
|
||||
var audio_stats : Dictionary[int, Array] # id->[last_number, packetsreceived, packetslost]
|
||||
var packets_sent: int = 0
|
||||
|
||||
var packet_queue: Array[PackedByteArray] = []
|
||||
var last_playback_time := 0.0
|
||||
var packet_interval := 0.02 # 20 ms @ 48kHz
|
||||
func _init():
|
||||
peer.supported_protocols = ["ludus"]
|
||||
Steamworks.initialize()
|
||||
|
||||
func _ready():
|
||||
playstuff()
|
||||
var mic_bus = AudioServer.get_bus_index("Mic")
|
||||
mic_capture = AudioServer.get_bus_effect(mic_bus, 0)
|
||||
|
||||
await Multiplayer.noray_connected
|
||||
multiplayer.peer_connected.connect(peer_connected)
|
||||
multiplayer.peer_disconnected.connect(peer_disconnected)
|
||||
multiplayer.server_disconnected.connect(close_network)
|
||||
multiplayer.connection_failed.connect(close_network)
|
||||
multiplayer.connected_to_server.connect(connected)
|
||||
# Set the player name according to the system username. Fallback to the path.
|
||||
if Steamworks.is_initiallized:
|
||||
get_tree().auto_accept_quit = false
|
||||
Steamworks.create_lobby()
|
||||
name_edit.text = Steam.getPersonaName()
|
||||
elif false: #TODO: Set text to saved value
|
||||
name_edit.text = ""
|
||||
disableMultiplayer()
|
||||
else:
|
||||
name_edit.text = "Spacebots Player"
|
||||
disableMultiplayer()
|
||||
|
||||
func _process(delta: float):
|
||||
if Input.is_action_just_pressed("noise"):
|
||||
play_note(69)
|
||||
if Input.is_action_just_pressed("pause") and playersParent.get_child_count() > 0 and %Settingsmenu.visible == false:
|
||||
if not pausemenu.visible:
|
||||
pausemenu.show()
|
||||
pausemenu.grab_focus() #TODO: fix
|
||||
hud.hide()
|
||||
Input.mouse_mode = Input.MOUSE_MODE_CONFINED
|
||||
else:
|
||||
hud.show()
|
||||
pausemenu.hide()
|
||||
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
||||
last_playback_time += delta
|
||||
while last_playback_time >= packet_interval and packet_queue.size() > 0:
|
||||
var pkt: PackedByteArray = packet_queue.pop_front()
|
||||
var VoiceChatPlayerOutputNode: AudioStreamPlayer3D = Multiplayer.playerDict.get(multiplayer.get_unique_id()).VoiceChat
|
||||
var OpusStream : AudioStreamOpusChunked = VoiceChatPlayerOutputNode.stream
|
||||
OpusStream.push_opus_packet(pkt, 8, 0)
|
||||
last_playback_time -= packet_interval
|
||||
if !mic_capture or Multiplayer.playerDict.is_empty(): return
|
||||
while mic_capture.chunk_available():
|
||||
var seq_num : PackedByteArray = PackedByteArray()
|
||||
seq_num.resize(8)
|
||||
seq_num.encode_u64(0,packets_sent+1)
|
||||
var packet = mic_capture.read_opus_packet(seq_num)
|
||||
mic_capture.drop_chunk()
|
||||
if multiplayer.multiplayer_peer.get_connection_status() == MultiplayerPeer.CONNECTION_CONNECTED:
|
||||
_voice_packet_received.rpc(packet)
|
||||
packets_sent += 1
|
||||
if (packets_sent % 500) == 0:
|
||||
print("Packets sent: ", packets_sent, " from id ", multiplayer.get_unique_id(), " ", hash(packet))
|
||||
print("Size before: ", packet.size())
|
||||
print("Hash send: ", hash(packet))
|
||||
|
||||
|
||||
func disableMultiplayer() -> void:
|
||||
$/root/Main/Mainmenu/Menu/MarginContainer/VBoxContainer/HBoxContainer/VBoxMultiplayerDisabled.show()
|
||||
$/root/Main/Mainmenu/Menu/MarginContainer/VBoxContainer/HBoxContainer/VBoxLobbylist.hide()
|
||||
|
||||
func start_game():
|
||||
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
||||
mainmenu.hide()
|
||||
start_btn.disabled = true
|
||||
disconnect_btn.disabled = false
|
||||
hud.show()
|
||||
|
||||
@rpc("authority","call_local","reliable")
|
||||
func changeMap(newMap: PackedScene) -> void:
|
||||
var map = newMap.instantiate()
|
||||
if mapsParent.get_child_count() > 0:
|
||||
if Multiplayer.getCurrentMapLogic().is_connected(StringName("missionLost"),missionLost):
|
||||
Multiplayer.getCurrentMapLogic().disconnect(StringName("missionLost"),missionLost)
|
||||
mapsParent.get_child(0).queue_free()
|
||||
|
||||
mapsParent.add_child(map)
|
||||
initiatePlayerPosition(map.playerStartPos)
|
||||
|
||||
Multiplayer.setCurrentMapLogic(map)
|
||||
map.missionLost.connect(missionLost)
|
||||
|
||||
func initiatePlayerPosition(pos: Vector3) -> void:
|
||||
for p in Multiplayer.playerDict.values():
|
||||
if p.is_multiplayer_authority():
|
||||
p.global_position = pos
|
||||
print(p)
|
||||
|
||||
func missionLost() -> void:
|
||||
changeMap(lobby)
|
||||
|
||||
func stop_game():
|
||||
disconnect_btn.disabled = true
|
||||
mainmenu.show()
|
||||
pausemenu.hide()
|
||||
hud.hide()
|
||||
Input.mouse_mode = Input.MOUSE_MODE_CONFINED
|
||||
#Steamworks.stop()
|
||||
|
||||
var currentMaps = mapsParent.get_children()
|
||||
for child in currentMaps:
|
||||
child.queue_free()
|
||||
|
||||
var players = playersParent.get_children()
|
||||
for child in players:
|
||||
child.set_process(false)
|
||||
child.queue_free()
|
||||
await get_tree().process_frame
|
||||
start_btn.disabled = false
|
||||
|
||||
|
||||
func close_network():
|
||||
peer.close()
|
||||
stop_game()
|
||||
disconnectDialog.popup_centered()
|
||||
disconnectDialog.get_ok_button().grab_focus()
|
||||
multiplayer.multiplayer_peer = null
|
||||
Multiplayer.currentMapLogic = null
|
||||
Multiplayer.playerDict = {}
|
||||
Multiplayer.alivePlayerDict = {}
|
||||
Multiplayer.is_host = false
|
||||
Steamworks.lobby_id = 0
|
||||
Steamworks.lobby_members = []
|
||||
Steamworks.lobby_members_max = 5
|
||||
Steamworks.steam_id = 0
|
||||
Steamworks.steam_username = ""
|
||||
|
||||
|
||||
func connected():
|
||||
if Multiplayer.is_host == false:
|
||||
add_player.rpc_id(1, multiplayer.get_unique_id())
|
||||
|
||||
|
||||
func peer_connected(_id):
|
||||
pass
|
||||
#Steamworks.on_peer_add(id)
|
||||
|
||||
|
||||
func peer_disconnected(id):
|
||||
if Multiplayer.is_host:
|
||||
remove_player(id)
|
||||
|
||||
func on_server_disconnected():
|
||||
on_Disconnect_pressed()
|
||||
|
||||
func on_Start_pressed():
|
||||
Multiplayer.host()
|
||||
start_game()
|
||||
changeMap(lobby)
|
||||
add_player(multiplayer.get_unique_id())
|
||||
|
||||
func on_Disconnect_pressed():
|
||||
if Steamworks.lobby_members.size() > 1:
|
||||
Steam.leaveLobby(Steamworks.lobby_id)
|
||||
close_network()
|
||||
|
||||
func on_Connect(norayid: String):
|
||||
start_btn.disabled = true
|
||||
disconnect_btn.disabled = false
|
||||
start_game()
|
||||
Multiplayer.join(norayid)
|
||||
|
||||
@rpc("any_peer")
|
||||
func add_player(id):
|
||||
var player_instance: CharacterBody3D = player.instantiate()
|
||||
player_instance.name = str(id)
|
||||
playersParent.add_child(player_instance)
|
||||
|
||||
@rpc("any_peer")
|
||||
func remove_player(id):
|
||||
if playersParent.get_node(str(id)):
|
||||
playersParent.get_node(str(id)).queue_free()
|
||||
|
||||
|
||||
|
||||
@rpc("any_peer", "unreliable_ordered")#, "call_local")
|
||||
func _voice_packet_received(packet: PackedByteArray):
|
||||
var sender_id = multiplayer.get_remote_sender_id()
|
||||
|
||||
#Stats for printing
|
||||
var sender_stats = audio_stats.get(sender_id, [0,0,0])
|
||||
if (sender_stats[0]+1 != packet.decode_u32(0)):
|
||||
sender_stats[2]+=1
|
||||
sender_stats[0]=packet.decode_u64(0)
|
||||
sender_stats[1]+=1
|
||||
audio_stats.set(sender_id, sender_stats)
|
||||
if (sender_stats[1] % 500) == 0:
|
||||
print("Packets received: ", sender_stats[1], " from id ", sender_id, " Lossrate: ", sender_stats[2], "/", sender_stats[1], "(" , str(100*(sender_stats[2]/sender_stats[1])), "%)")
|
||||
print("Size after: ", packet.size())
|
||||
print("Hash received: ", hash(packet))
|
||||
var VoiceChatPlayerOutputNode: AudioStreamPlayer3D = Multiplayer.playerDict.get(sender_id).VoiceChat
|
||||
var OpusStream : AudioStreamOpusChunked = VoiceChatPlayerOutputNode.stream
|
||||
#OpusStream.push_opus_packet(packet, 8, 0)
|
||||
packet_queue.append(packet)
|
||||
var playback: AudioStreamGeneratorPlayback
|
||||
var player_ : AudioStreamPlayer
|
||||
|
||||
func playstuff():
|
||||
var generator = AudioStreamGenerator.new()
|
||||
generator.mix_rate = 44100
|
||||
generator.buffer_length = 2
|
||||
player_ = AudioStreamPlayer.new()
|
||||
player_.bus = "Mic"
|
||||
player_.stream = generator
|
||||
add_child(player_)
|
||||
player_.play()
|
||||
playback = player_.get_stream_playback()
|
||||
|
||||
func play_note(midi_note: int):
|
||||
var freq = 440.0 * pow(2.0, (midi_note - 69) / 12.0) # MIDI ? Hz
|
||||
generate_sine_wave(freq)
|
||||
|
||||
func generate_sine_wave(frequency: float):
|
||||
var sample_rate = 44100.0
|
||||
var increment = TAU * frequency / sample_rate
|
||||
var phase = 0.0
|
||||
var num_samples = int(sample_rate * 2) # 0.5 seconds
|
||||
var buffer = PackedVector2Array()
|
||||
|
||||
for i in num_samples:
|
||||
var sample = sin(phase)
|
||||
buffer.append(Vector2(sample, sample)) # stereo
|
||||
phase += increment
|
||||
playback.push_buffer(buffer)
|
||||
@@ -0,0 +1,42 @@
|
||||
[remap]
|
||||
|
||||
importer="scene"
|
||||
importer_version=1
|
||||
type="PackedScene"
|
||||
uid="uid://c4l13kdqg707d"
|
||||
path="res://.godot/imported/MainHangarExport.glb-ffd5971678b047352f89af4c67418643.scn"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/3D/MainHangarExport.glb"
|
||||
dest_files=["res://.godot/imported/MainHangarExport.glb-ffd5971678b047352f89af4c67418643.scn"]
|
||||
|
||||
[params]
|
||||
|
||||
nodes/root_type=""
|
||||
nodes/root_name=""
|
||||
nodes/root_script=null
|
||||
nodes/apply_root_scale=true
|
||||
nodes/root_scale=1.0
|
||||
nodes/import_as_skeleton_bones=false
|
||||
nodes/use_name_suffixes=true
|
||||
nodes/use_node_type_suffixes=true
|
||||
meshes/ensure_tangents=true
|
||||
meshes/generate_lods=true
|
||||
meshes/create_shadow_meshes=true
|
||||
meshes/light_baking=1
|
||||
meshes/lightmap_texel_size=0.2
|
||||
meshes/force_disable_compression=false
|
||||
skins/use_named_skins=true
|
||||
animation/import=true
|
||||
animation/fps=30
|
||||
animation/trimming=false
|
||||
animation/remove_immutable_tracks=true
|
||||
animation/import_rest_as_RESET=false
|
||||
import_script/path=""
|
||||
materials/extract=0
|
||||
materials/extract_format=0
|
||||
materials/extract_path=""
|
||||
_subresources={}
|
||||
gltf/naming_version=1
|
||||
gltf/embedded_image_handling=1
|
||||
@@ -0,0 +1,50 @@
|
||||
[gd_scene load_steps=9 format=3 uid="uid://cftfv7v8syhig"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://c7ea7hd1t6ucj" path="res://script/ShipLogic.gd" id="1_iuibe"]
|
||||
[ext_resource type="PackedScene" uid="uid://d3ny31fbtn7eb" path="res://test/debugCube.tscn" id="3_6dd4g"]
|
||||
[ext_resource type="Texture2D" uid="uid://cimsjl61nhh5s" path="res://assets/2D/HDR_blue_nebulae-1.hdr" id="4_fd4og"]
|
||||
[ext_resource type="Script" uid="uid://cq0sxwn7k47n6" path="res://Maps/MapGenerator/levelGenerator.gd" id="4_yoeks"]
|
||||
|
||||
[sub_resource type="PanoramaSkyMaterial" id="PanoramaSkyMaterial_yoeks"]
|
||||
panorama = ExtResource("4_fd4og")
|
||||
|
||||
[sub_resource type="Sky" id="Sky_ly181"]
|
||||
sky_material = SubResource("PanoramaSkyMaterial_yoeks")
|
||||
|
||||
[sub_resource type="Environment" id="Environment_7qc4s"]
|
||||
background_mode = 2
|
||||
sky = SubResource("Sky_ly181")
|
||||
ambient_light_source = 2
|
||||
ambient_light_color = Color(0.241156, 0.241156, 0.241156, 1)
|
||||
ssr_enabled = true
|
||||
glow_enabled = true
|
||||
glow_intensity = 1.1
|
||||
|
||||
[sub_resource type="WorldBoundaryShape3D" id="WorldBoundaryShape3D_iuibe"]
|
||||
|
||||
[node name="SpaceshipTest" type="Node3D"]
|
||||
script = ExtResource("1_iuibe")
|
||||
metadata/_custom_type_script = "uid://c7ea7hd1t6ucj"
|
||||
|
||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
|
||||
environment = SubResource("Environment_7qc4s")
|
||||
|
||||
[node name="StaticBody3D" type="StaticBody3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0445775, 0)
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D"]
|
||||
shape = SubResource("WorldBoundaryShape3D_iuibe")
|
||||
|
||||
[node name="DebugCube" parent="." instance=ExtResource("3_6dd4g")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.733945, 0.261625)
|
||||
|
||||
[node name="DebugCube2" parent="." instance=ExtResource("3_6dd4g")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.552344, -0.0315728)
|
||||
|
||||
[node name="DebugCube3" parent="." instance=ExtResource("3_6dd4g")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.306636, -0.391098, -0.0315728)
|
||||
|
||||
[node name="LevelGenerator" type="Node3D" parent="."]
|
||||
script = ExtResource("4_yoeks")
|
||||
gridSize = 150
|
||||
metadata/_custom_type_script = "uid://cq0sxwn7k47n6"
|
||||
Reference in New Issue
Block a user