multiplayer

This commit is contained in:
Rendo 2025-11-22 01:07:18 +05:00
commit 0dc6247f91
22 changed files with 298 additions and 14 deletions

View file

@ -0,0 +1,13 @@
extends Node
func _ready() -> void:
Lobby.lobby_joined.connect(on_lobby_joined)
func _on_leave_button_pressed() -> void:
Lobby.leave()
func _on_start_button_pressed() -> void:
Lobby.start_game.rpc()
func on_lobby_joined() -> void:
$StartButton.hide()

View file

@ -0,0 +1 @@
uid://2uyxkfmbbims

View file

@ -0,0 +1,28 @@
extends Node
func _ready() -> void:
multiplayer.peer_connected.connect(on_peer_connected)
multiplayer.peer_disconnected.connect(on_peer_disconnected)
Lobby.lobby_created.emit(add_self)
Lobby.lobby_joined.emit(add_self)
Lobby.lobby_closed.emit(clear)
func on_peer_connected(id: int) -> void:
var label = Label.new()
label.text = str(id)
label.name = str(id)
add_child(label,true)
func on_peer_disconnected(id: int) -> void:
get_node(str(id)).queue_free()
func add_self() -> void:
var label = Label.new()
label.text = str(multiplayer.get_unique_id())
label.name = str(multiplayer.get_unique_id())
add_child(label,true)
func clear() -> void:
for child in get_children():
child.queue_free()

View file

@ -0,0 +1 @@
uid://cl3hhmw5666sj

View file

@ -0,0 +1,14 @@
extends Node
func _on_host_button_pressed() -> void:
Lobby.host()
$MainMenu.hide()
$Lobby.show()
func _on_connect_button_pressed() -> void:
Lobby.join("localhost")
$MainMenu.hide()
$Lobby.show()

View file

@ -0,0 +1 @@
uid://bsyuos803g7qf

View file

@ -0,0 +1,7 @@
extends Node
func _ready() -> void:
if not multiplayer.is_server():
return
Lobby.add_loaded_player(multiplayer.get_unique_id())

View file

@ -0,0 +1 @@
uid://bdxy621fthtrv

View file

@ -0,0 +1,29 @@
extends Node
const MAX_PLAYERS: int = 10
const PORT: int = 7777
signal lobby_created
signal lobby_joined
signal lobby_closed
func host() -> void:
var peer: ENetMultiplayerPeer = ENetMultiplayerPeer.new()
peer.create_server(PORT,MAX_PLAYERS)
multiplayer.multiplayer_peer = peer
lobby_created.emit()
func join(ip: String) -> void:
var peer: ENetMultiplayerPeer = ENetMultiplayerPeer.new()
peer.create_client(ip,PORT)
multiplayer.multiplayer_peer = peer
lobby_joined.emit()
func leave() -> void:
multiplayer.multiplayer_peer = OfflineMultiplayerPeer.new()
lobby_closed.emit()
@rpc("authority","call_local","reliable")
func start_game() -> void:
get_tree().change_scene_to_file("res://levels/prototype_scene.tscn")

View file

@ -0,0 +1 @@
uid://c5sfxrl7hky6p

View file

@ -0,0 +1,15 @@
extends Node3D
func _ready() -> void:
if not multiplayer.is_server():
return
spawn_player(multiplayer.get_unique_id())
for i in multiplayer.get_peers():
spawn_player(i)
func spawn_player(id) -> void:
var player: PackedScene = load("res://scenes/player.tscn")
var inst = player.instantiate()
inst.name = str(id)
get_tree().current_scene.add_child.call_deferred(inst,true)

View file

@ -0,0 +1 @@
uid://ypgm3aplt78m

View file

@ -14,7 +14,7 @@ extends Control
@export var crosses_color: Color = Color.WHITE
func _draw() -> void:
draw_circle(Vector2(0,0),dot_radius,dot_color,true,outline_width)
draw_circle(Vector2(0,0),dot_radius,dot_color,false,outline_width)
for i in range(0,4):
var direction: Vector2 = Vector2.RIGHT.rotated(i*PI/2)
var offset_position: Vector2 = direction * crosses_offset

View file

@ -10,7 +10,7 @@ extends CharacterBody3D
@export var TOGGLE_CROUCH: bool = true
@export var WALK_MODIFIER: float = 0.5
var crouched: bool = false:
@export var crouched: bool = false:
set(value):
if value != crouched and stand_up_area.has_overlapping_bodies() == false:
crouched = value
@ -22,11 +22,18 @@ var crouched: bool = false:
var potential_crouched: bool = crouched
func _enter_tree() -> void:
set_multiplayer_authority(str(name).to_int())
func _process(_delta: float) -> void:
if not is_multiplayer_authority():
return
if potential_crouched != crouched:
crouched = potential_crouched
func _physics_process(delta: float) -> void:
if not is_multiplayer_authority():
return
# Add the gravity.
if not is_on_floor():
velocity += get_gravity() * delta
@ -55,6 +62,8 @@ func update_crouch():
animation_player.play("Crouch",-1,-1/CROUCH_TIME,true)
func _input(event: InputEvent) -> void:
if not is_multiplayer_authority():
return
if event.is_action_pressed("plr_crouch"):
if TOGGLE_CROUCH:
crouched = not crouched
@ -62,3 +71,7 @@ func _input(event: InputEvent) -> void:
crouched = true
elif event.is_action_released("plr_crouch") and TOGGLE_CROUCH == false:
crouched = false
if event.is_action_pressed("plr_drop"):
var grenade = preload("res://scenes/smoke.tscn").instantiate()
get_tree().current_scene.add_child(grenade)
grenade.global_position = global_position + Vector3.UP * 0.5

View file

@ -4,11 +4,19 @@ const COLLINEAR = 1.5707963267948966
@export var SENSITIVITY = 0.02
func _enter_tree() -> void:
set_multiplayer_authority(get_parent().name.to_int())
func _ready() -> void:
# Move to level controller when possible
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
#Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
if not is_multiplayer_authority():
return
current = true
func _input(event: InputEvent) -> void:
if not is_multiplayer_authority():
return
if event is InputEventMouseMotion:
get_parent().rotate_y(-event.relative.x * SENSITIVITY)
rotate_x(-event.relative.y * SENSITIVITY)

22
scripts/smoke_grenade.gd Normal file
View file

@ -0,0 +1,22 @@
extends RigidBody3D
@export var radius: float
@export var fog: FogVolume
var bounce_count: int = 0
func _on_body_entered(_body: Node) -> void:
if bounce_count > 2:
return
bounce_count += 1
if bounce_count == 2:
smoke()
func smoke():
var tween = create_tween().set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_EXPO)
tween.tween_property(fog,"size",Vector3(radius,radius,radius),1.0)
tween.tween_interval(10)
tween.tween_property(fog.material,"density",0,1.0)
tween.tween_callback(queue_free)

View file

@ -0,0 +1 @@
uid://t5jjqwnkxgvo