Initial commit

This commit is contained in:
2026-01-21 23:51:53 +01:00
commit 60b208fee0
1703 changed files with 100223 additions and 0 deletions

View File

@@ -0,0 +1 @@
<svg height="16" viewBox="0 0 512 512" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m257 8.7c7.4.2 17.8.8 23 1.4 5.2.5 13.8 1.8 19 2.9s14.2 3.3 20 4.9c5.8 1.7 15.2 4.9 21 7.1 5.8 2.3 15.7 6.7 22 9.9s15.3 8.2 20 11.1 11.6 7.7 15.5 10.6c3.9 2.8 10.8 8.5 15.5 12.6 4.6 4 12 11.3 16.3 16.3s11 13.7 14.9 19.5 9 14.5 11.4 19.5c2.4 4.9 5.8 13.3 7.5 18.5 2.3 6.7 3.3 12 3.7 18 .3 6.1-.1 10.3-1.3 15-1 3.6-2.8 8.8-4.1 11.5-1.2 2.8-4.2 7.7-6.7 11-2.4 3.3-7.1 8-16.4 15l6.1 10.5c3.4 5.8 8 15.2 10.2 21 2.3 5.8 5.3 15.2 6.8 21 1.4 5.8 3.3 16.1 4.2 23 1.1 8.5 1.4 16 1 23.5-.3 6.1-1.4 16.2-2.5 22.5s-3.1 15.3-4.5 20-4.7 13.9-7.5 20.5-7.9 16.7-11.4 22.5c-3.4 5.8-8.9 14.1-12.2 18.5s-11.1 13.3-17.5 19.9c-6.3 6.5-15.1 14.7-19.5 18.3-4.4 3.5-12.5 9.4-18 13.1-5.5 3.6-15.6 9.4-22.5 12.8s-16.8 7.8-22 9.7c-5.2 2-13.8 4.7-19 6-5.2 1.4-13.8 3.3-19 4.2s-17.4 2-27 2.5c-14.3.6-20 .4-31.5-1.1-7.7-1-18.5-2.7-24-4-5.5-1.2-14.7-3.6-20.5-5.5-5.8-1.8-15.4-5.4-21.5-7.9s-15.7-7.1-21.5-10.2c-5.8-3-14.8-8.4-20-11.8-5.2-3.5-13.1-9.2-17.5-12.8-4.4-3.5-13-11.6-19-17.9-6-6.2-14-15.6-17.8-20.8-3.7-5.2-9.4-14.9-12.7-21.5s-7.1-15.6-8.6-20c-1.5-4.6-2.8-11.4-3.1-16-.3-5.4 0-10.4 1.1-15.5.9-4.1 3.1-10.4 4.9-14 1.8-3.7 6-9.4 9.7-13.3 3.6-3.8 8-7.8 13-10.7l-2.2-3.7c-1.2-2.1-4.1-7.2-6.5-11.3s-6.1-12-8.2-17.5c-2.2-5.5-5.1-14.3-6.5-19.5-1.5-5.2-3.3-14.6-4.1-20.7-.8-6.2-1.5-16.2-1.5-22.3s.7-16.1 1.5-22.2c.8-6.2 2.6-15.4 3.9-20.3s4.1-13.5 6.1-19 6-14.5 8.9-20 8-14 11.3-19c3.3-4.9 9.4-13 13.5-18 4.1-4.9 11.3-12.6 15.9-17s12.7-11.4 17.9-15.4 13.6-9.8 18.5-12.9c4.9-3 14.8-8.4 22-11.8s17.7-7.8 23.5-9.7 15.9-4.7 22.5-6.1c6.6-1.5 16.5-3.2 22-3.9s16.1-1.1 23.5-1z"/><path d="m255.3 55.2c5.9-.1 15.8.5 21.9 1.3 6.2.8 16.7 2.8 23.3 4.5s17.2 5.1 23.5 7.6 15.8 6.9 21 9.6c5.2 2.8 14.2 8.2 19.9 12.2 5.8 3.9 15 11.4 20.4 16.6 5.5 5.2 12.9 13.3 16.4 18s9 13.7 12.1 20c4.3 8.7 5.7 12.8 6 17 .4 4.8.1 5.9-2.2 8.7-1.6 2-4.1 3.7-6.4 4.3-2 .5-5.1.6-6.7.2-1.6-.3-4-1.8-5.3-3.2s-3.9-6.3-5.8-11c-1.8-4.7-5.3-11.4-7.7-15s-6.6-9-9.3-12.1-8-8.5-11.9-11.9-11.3-9-16.5-12.5-14-8.6-19.5-11.3c-5.5-2.8-14.5-6.6-20-8.5s-14.1-4.4-19-5.5c-4.9-1.2-13.9-2.6-20-3.3-6.3-.6-15-.8-20.5-.5-5.2.4-13.8 1.6-19 2.6-5.2 1.1-13.6 3.3-18.5 5.1-4.9 1.7-12.6 4.8-17 6.9s-11.6 6.2-16 9c-4.4 2.9-11.8 8.5-16.5 12.4-4.6 3.9-11.8 11.2-16 16.2-4.1 5.1-9.6 12.7-12.2 17-2.5 4.4-6.1 11.5-7.8 15.9-1.8 4.4-4.1 11.4-5.2 15.5-1 4.1-2.2 12.2-2.5 18-.4 6.4-.1 13.8.7 19 .6 4.7 2.1 11.4 3.2 15s3.8 10.1 6 14.5 6 10.9 8.6 14.5c2.5 3.6 8.2 10.1 12.7 14.5 4.4 4.4 12.3 10.9 17.5 14.4s13.1 8.1 17.5 10.3 13.2 5.8 19.5 7.9 15.1 4.5 19.5 5.4 10.8 1.9 20.5 3v-148.5h11.5c6.3 0 15.9.5 21.2 1.1 5.4.6 14.1 2 19.3 3.1s14.2 3.5 20 5.4 16.8 6.6 24.5 10.4 18.3 10 23.5 13.7c5.2 3.8 13.5 10.9 18.5 15.9 4.9 4.9 11.5 12.6 14.7 17 3.1 4.3 7.6 12 10.1 16.9s5.7 12.7 7.1 17.2c1.4 4.6 3.3 12.2 4.1 17 .8 4.9 1.5 14 1.5 20.3s-.7 15.8-1.5 21c-.9 5.2-3.1 14-4.9 19.5-1.9 5.5-5.2 13.6-7.4 18s-6.8 12.3-10.3 17.5-10.9 14.2-16.4 19.9-14.1 13.5-19 17.4c-4.9 3.8-13.1 9.3-18 12.2-4.9 3-12.6 7-17 9s-12.5 5.2-18 7-14.9 4.3-21 5.4c-6.1 1.2-16.4 2.4-23 2.8-6.9.3-16.7.1-23-.6-6.1-.7-15.3-2.1-20.5-3.3-5.2-1.1-14-3.5-19.5-5.3s-14.9-5.4-21-8.1-15.1-7.4-20-10.3c-4.9-3-13.1-8.4-18-12.1s-13.5-11.4-19-17.2c-5.5-5.7-12.1-13.5-14.7-17.3-2.5-3.9-6.8-11.5-9.4-17s-5-12.1-5.3-14.6c-.6-4.5-.4-4.9 3.5-8.8 3.6-3.5 4.8-4.1 8.5-4.1 2.5 0 5.7.8 7.4 1.8 2.3 1.4 3.9 4 6.7 10.8 2.1 4.9 6.1 12.3 8.9 16.4s7.2 9.9 9.8 12.8c2.5 2.9 8 8.1 12.1 11.6s10.9 8.5 15 11.3 12.7 7.6 19 10.8 16.7 7.5 23 9.6 15 4.5 19.2 5.3c4.3.9 12.4 2.1 18 2.7 5.7.6 14.4.8 19.3.4s12.8-1.3 17.5-2.1 13.2-3.1 19-5 15-5.8 20.5-8.6c5.5-2.7 13.1-7.2 17-9.8 3.9-2.7 10.6-8 14.9-11.7 4.4-3.7 11.1-10.7 15-15.4 3.9-4.8 9.2-12.2 11.8-16.5 2.5-4.4 6.1-11.5 7.8-15.9 1.8-4.4 4.2-11.4 5.3-15.5 1.7-6.1 2-10.5 2-23.5s-.3-17.4-2-23.5c-1.1-4.1-3.5-10.9-5.3-15-1.7-4.1-5.7-11.3-8.8-16s-9.4-12.3-14.2-17c-4.7-4.7-12.8-11.4-18-15-5.2-3.5-14-8.5-19.5-11.1s-13.6-6-18-7.4c-4.4-1.5-11.9-3.6-16.8-4.6-4.8-1-11.9-2.2-22.7-3.4v148.5h-12c-6.6 0-17.3-.7-23.8-1.5-6.4-.9-16.4-2.7-22.2-4.1s-14.8-4.2-20-6.1-14.7-6.2-21-9.4c-6.3-3.3-15.7-9-20.9-12.7s-13.1-10.3-17.6-14.7-10.8-11.6-14.1-16-8.2-12.5-11.1-18c-2.8-5.5-6.3-13.7-7.7-18.3-1.4-4.5-3.3-12.1-4.1-17-.8-4.8-1.5-13.9-1.5-20.2s.7-15.8 1.5-21c.9-5.2 3.1-14 4.9-19.5 1.9-5.5 5.3-13.8 7.6-18.5s6.9-12.3 10.1-17 8.6-11.7 12.1-15.6c3.5-4 9-9.6 12.3-12.5 3.3-3 8.7-7.5 12-10 3.3-2.6 9.8-7 14.5-10 4.7-2.9 12.6-7.2 17.5-9.5s13.7-5.8 19.5-7.7 15.4-4.5 21.5-5.6 12.6-2.2 14.5-2.4 8.3-.5 14.2-.5z" fill="#6ccdf4"/></svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -0,0 +1,101 @@
@tool class_name FmodEventEditorProperty extends FmodPathEditorProperty
static var EVENT_PARAMETER_PREFIX_FOR_PROPERTIES = "fmod_parameters"
var former_event_description: FmodEventDescription
func _update_property():
super()
if get_edited_object().event_name == "":
return
_update_parameters()
var event_description: FmodEventDescription = FmodServer.get_event_from_guid(get_edited_object().event_guid)
if event_description == null:
event_description = FmodServer.get_event(get_edited_object().event_name)
former_event_description = event_description
func _set_path_and_guid(path: String, guid: String):
super(path, guid)
if get_edited_object().event_name == "":
return
_update_parameters()
former_event_description = FmodServer.get_event_from_guid(get_edited_object().event_guid)
func _update_parameters():
var event_description: FmodEventDescription = FmodServer.get_event_from_guid(get_edited_object().event_guid)
if event_description == null:
return
if former_event_description != null and event_description != former_event_description:
get_edited_object().tool_remove_all_parameters()
var map_to_property_name = func map_to_property_name(dict: Dictionary):
return dict["name"]
var filter_fmod_parameter_property = func filter_fmod_parameter_property(parameter_name: String):
return parameter_name.begins_with(EVENT_PARAMETER_PREFIX_FOR_PROPERTIES)
var filter_property_id = func filter_property_id(property: String):
return property.ends_with("/id")
var existing_property_ids = get_edited_object().get_property_list().map(map_to_property_name).filter(filter_fmod_parameter_property).filter(filter_property_id)
var map_property_name_to_parameter_name = func map_property_name_to_parameter_name(parameter: String):
return parameter.split("/")[1]
var existing_parameter_names = existing_property_ids.map(map_property_name_to_parameter_name)
var map_property_id_to_parameter_id_value = func map_property_id_to_parameter_id_value(property: String):
return get_edited_object()[property]
var existing_parameter_ids = existing_property_ids.map(map_property_id_to_parameter_id_value)
var property_matching = existing_parameter_ids.map(func(id): return false)
for param: FmodParameterDescription in event_description.get_parameters():
if param.is_global() or param.is_automatic() or param.is_read_only():
continue
var parameter_name = param.get_name()
var parameter_id_param = "%s/%s/id" % [EVENT_PARAMETER_PREFIX_FOR_PROPERTIES, parameter_name]
var parameter_value_param = "%s/%s" % [EVENT_PARAMETER_PREFIX_FOR_PROPERTIES, parameter_name]
var parameter_variant_type = "%s/%s/variant_type" % [EVENT_PARAMETER_PREFIX_FOR_PROPERTIES, parameter_name]
var parameter_labels = "%s/%s/labels" % [EVENT_PARAMETER_PREFIX_FOR_PROPERTIES, parameter_name]
var existing_property_name_index = existing_property_ids.find(parameter_id_param)
var are_properties_already_in_node = existing_property_name_index != -1
var parameter_id = param.get_id()
var variant_type: Variant.Type = TYPE_FLOAT
var default_value = param.get_default_value()
var minimum_value = param.get_minimum()
var maximum_value = param.get_maximum()
if param.is_labeled():
variant_type = TYPE_STRING
default_value = event_description.get_parameter_label_by_id(parameter_id, default_value)
minimum_value = event_description.get_parameter_label_by_id(parameter_id, minimum_value)
maximum_value = event_description.get_parameter_label_by_id(parameter_id, maximum_value)
elif param.is_discrete():
variant_type = TYPE_INT
default_value = int(default_value)
minimum_value = int(minimum_value)
maximum_value = int(maximum_value)
if are_properties_already_in_node:
property_matching[existing_property_name_index] = existing_parameter_ids[existing_property_name_index] == parameter_id
if not are_properties_already_in_node or get_edited_object()[parameter_id_param] == null:
get_edited_object()[parameter_id_param] = parameter_id
if not are_properties_already_in_node or get_edited_object()[parameter_value_param] == null:
get_edited_object()[parameter_value_param] = default_value
if not are_properties_already_in_node or get_edited_object()[parameter_variant_type] == null:
get_edited_object()[parameter_variant_type] = variant_type
if param.is_labeled() and (not are_properties_already_in_node or get_edited_object()[parameter_labels] == null):
get_edited_object()[parameter_labels] = event_description.get_parameter_labels_by_id(parameter_id)
for i in property_matching.size():
if not property_matching[i]:
get_edited_object().tool_remove_parameter(existing_parameter_ids[i])
get_edited_object().notify_property_list_changed()

View File

@@ -0,0 +1,96 @@
extends Node
var mic_capture : AudioEffectOpusChunked
var audio_stats : Dictionary[int, Array] # id->[last_number, packetsreceived, packetslost]
var packets_sent: int = 0
var packet_queue: Dictionary[int, Array] # sender_id -> Array of PackedByteArrays
func _ready():
playstuff()
var mic_bus = AudioServer.get_bus_index("Mic")
mic_capture = AudioServer.get_bus_effect(mic_bus, 0)
func _process(delta: float):
if !mic_capture or Multiplayer.playerDict.is_empty():
return
if Input.is_action_just_pressed("noise"):
play_note(69)
print("test")
for sender in packet_queue.keys():
var VoiceChatPlayerOutputNode: AudioStreamPlayer3D = Multiplayer.playerDict.get(sender).VoiceChat
var OpusStream : AudioStreamOpusChunked = VoiceChatPlayerOutputNode.stream
while OpusStream.chunk_space_available() and packet_queue.get(sender).size() > 0:
var pkt: PackedByteArray = packet_queue.get(sender).pop_front()
OpusStream.push_opus_packet(pkt, 8, 0)
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))
@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))
print("Packet no.: ", packet.decode_u64(0))
var VoiceChatPlayerOutputNode: AudioStreamPlayer3D = Multiplayer.playerDict.get(sender_id).VoiceChat
var OpusStream : AudioStreamOpusChunked = VoiceChatPlayerOutputNode.stream
#OpusStream.push_opus_packet(packet, 8, 0)
if not packet_queue.has(sender_id):
var x : Array[PackedByteArray] = []
packet_queue.set(sender_id, x)
packet_queue.get(sender_id).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)

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://npt2au0g2tku"
path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://icon.svg"
dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false