copy from thegates-jam repo

This commit is contained in:
Nordup 2024-03-31 09:25:42 +04:00
parent c1a7ad74e1
commit 1a335de566
523 changed files with 22408 additions and 0 deletions

25
voip/microphone.gd Normal file
View file

@ -0,0 +1,25 @@
extends AudioStreamPlayer
class_name Microphone
static var is_speaking: bool
var speak_action: StringName = "speak"
func _process(_delta: float) -> void:
if not Input.is_action_pressed(speak_action) or EditMode.is_enabled:
is_speaking = false
func _unhandled_input(event: InputEvent) -> void:
if EditMode.is_enabled: return
if event.is_action_pressed(speak_action):
is_speaking = true
if event.is_action_released(speak_action):
is_speaking = false
func _exit_tree() -> void:
is_speaking = false

65
voip/voip_manager.gd Normal file
View file

@ -0,0 +1,65 @@
extends Node
@export var user_scn: PackedScene
@export var player_spawner: PlayerSpawner
var mic_capture: VOIPInputCapture
var users = {} # {Peer ID: VoipUser}
func _ready() -> void:
if Connection.is_server(): return
multiplayer.peer_connected.connect(peer_connected)
multiplayer.peer_disconnected.connect(peer_disconnected)
player_spawner.player_spawned.connect(player_spawned)
var mic_bus = AudioServer.get_bus_index("Record")
mic_capture = AudioServer.get_bus_effect(mic_bus, 0)
mic_capture.packet_ready.connect(voice_packet_ready)
func peer_connected(id: int) -> void:
if id == 1: return
var user = user_scn.instantiate() as VoipUser
user.set_user_id(id)
users[id] = user
add_child(user, true)
print("Voip user added ", id)
var player = player_spawner.get_player_or_null(id)
if is_instance_valid(player): user.set_anchor(player)
func peer_disconnected(id: int) -> void:
if id == 1: return
users[id].queue_free()
users.erase(id)
print("Voip user removed ", id)
func player_spawned(id: int, player: Player) -> void:
if users.has(id): users[id].set_anchor(player)
func voice_packet_ready(packet: PackedByteArray) -> void:
if not Microphone.is_speaking: return
if Connection.is_peer_connected:
rpc("voice_packet_received", packet)
@rpc("any_peer", "call_remote", "unreliable_ordered", 1)
func voice_packet_received(packet: PackedByteArray) -> void:
if multiplayer.is_server(): return
var sender_id = multiplayer.get_remote_sender_id()
users[sender_id].stream.push_packet(packet)
func _process(_delta: float) -> void:
if not Connection.is_peer_connected: return
if multiplayer.is_server(): return
mic_capture.send_test_packets()

31
voip/voip_user.gd Normal file
View file

@ -0,0 +1,31 @@
extends AudioStreamPlayer3D
class_name VoipUser
@export var offset: Vector3
@export var volume_curve: Curve
@export var user_data_events: UserDataEvents
var user_id: int
var anchor: Node3D
func _ready() -> void:
user_data_events.user_volume_changed.connect(change_volume)
func _physics_process(_delta: float) -> void:
if not is_instance_valid(anchor): return
global_position = anchor.global_position + offset
func set_user_id(id: int) -> void:
user_id = id
func set_anchor(_anchor: Node3D) -> void:
anchor = _anchor
func change_volume(id: int, volume: float) -> void:
if id != user_id: return
volume_db = linear_to_db(volume_curve.sample(volume))

27
voip/voip_user.tscn Normal file
View file

@ -0,0 +1,27 @@
[gd_scene load_steps=5 format=3 uid="uid://bjywb13vy4hl4"]
[ext_resource type="Script" path="res://voip/voip_user.gd" id="1_wo4b3"]
[ext_resource type="Resource" uid="uid://rclnl7v8k722" path="res://user_data/user_data_events.res" id="2_mt25f"]
[sub_resource type="AudioStreamVOIP" id="AudioStreamVOIP_mku04"]
resource_local_to_scene = true
[sub_resource type="Curve" id="Curve_q0foc"]
bake_resolution = 1000
_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.142241, 0.010989), 0.0, 0.0, 0, 0, Vector2(0.37069, 0.0219779), 0.0, 0.0, 0, 0, Vector2(0.857759, 0.241758), 1.31335, 1.31335, 0, 0, Vector2(1, 1), 11.7496, 0.0, 0, 0]
point_count = 5
[node name="VoipUser" type="AudioStreamPlayer3D"]
stream = SubResource("AudioStreamVOIP_mku04")
attenuation_model = 1
volume_db = -12.0
unit_size = 15.0
max_db = 6.0
autoplay = true
max_distance = 30.0
bus = &"Speak"
doppler_tracking = 2
script = ExtResource("1_wo4b3")
offset = Vector3(0, 2, 0)
volume_curve = SubResource("Curve_q0foc")
user_data_events = ExtResource("2_mt25f")