125 lines
3.3 KiB
GDScript3
125 lines
3.3 KiB
GDScript3
|
extends Node
|
||
|
@export var port := 8313
|
||
|
@export var ip_address_to_connect := "localhost"
|
||
|
var singleplayer := false
|
||
|
@export var PlayerCharacter = preload("res://PlayerB/Player/Player.tscn")
|
||
|
var is_the_server_a_player := true #if it is peer to peer the server will also have a playable character
|
||
|
# Called when the node enters the scene tree for the first time.
|
||
|
func _enter_tree():
|
||
|
# Start the server if Godot passed the "--server" argument,
|
||
|
# and start the client if Godot passed the "--client" argument.
|
||
|
if "--listen_server" in OS.get_cmdline_args():
|
||
|
_on_server_pressed()
|
||
|
elif "--client" in OS.get_cmdline_args():
|
||
|
_on_client_pressed()
|
||
|
elif "--server" in OS.get_cmdline_args():
|
||
|
_on_d_server_pressed()
|
||
|
func single_player():
|
||
|
singleplayer = true
|
||
|
$ListenServer.visible = false
|
||
|
$DServer.visible = false
|
||
|
$Client.visible = false
|
||
|
$Singleplayer.visible = false
|
||
|
var p = PlayerCharacter.instantiate()
|
||
|
$PlayerSpawnLocation.add_child(p)
|
||
|
|
||
|
func start_network(server:bool) -> void:
|
||
|
singleplayer = false
|
||
|
$ListenServer.visible = false
|
||
|
$DServer.visible = false
|
||
|
$Client.visible = false
|
||
|
$Singleplayer.visible = false
|
||
|
var peer = ENetMultiplayerPeer.new()
|
||
|
#on server disconnected
|
||
|
multiplayer.server_disconnected.connect(self.server_disconnected)
|
||
|
#on connection failed
|
||
|
multiplayer.connection_failed.connect(self.connection_failed)
|
||
|
if server:
|
||
|
|
||
|
#listen to peer connections, and create new player for them
|
||
|
multiplayer.peer_connected.connect(self.player_joined)
|
||
|
#listen to peer disconnections, and destroy their players
|
||
|
multiplayer.peer_disconnected.connect(self.player_disconnected)
|
||
|
|
||
|
peer.create_server(port)
|
||
|
multiplayer.set_multiplayer_peer(peer)
|
||
|
if is_the_server_a_player:
|
||
|
create_player(1)
|
||
|
print("server listening on %s" %IP.get_local_addresses()[0])
|
||
|
else:
|
||
|
peer.create_client(ip_address_to_connect,port)
|
||
|
multiplayer.set_multiplayer_peer(peer)
|
||
|
|
||
|
|
||
|
func player_joined(id:int):
|
||
|
create_player(id)
|
||
|
func player_disconnected(id:int):
|
||
|
destroy_player(id)
|
||
|
func server_disconnected():
|
||
|
_on_main_menu_pressed()
|
||
|
func connection_failed():
|
||
|
print("connection failed")
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
func create_player(id: int) -> void:
|
||
|
var p = PlayerCharacter.instantiate()
|
||
|
p.set_name(str(id))
|
||
|
$PlayerSpawnLocation.add_child(p)
|
||
|
# p.top_level = true
|
||
|
|
||
|
func destroy_player(id: int) -> void:
|
||
|
$PlayerSpawnLocation.get_node(str(id)).queue_free()
|
||
|
|
||
|
|
||
|
|
||
|
func _on_server_pressed():
|
||
|
is_the_server_a_player = true
|
||
|
start_network(true)
|
||
|
|
||
|
func _on_d_server_pressed():
|
||
|
is_the_server_a_player = false
|
||
|
start_network(true)
|
||
|
|
||
|
func _on_client_pressed():
|
||
|
start_network(false)
|
||
|
|
||
|
|
||
|
func _on_singleplayer_pressed():
|
||
|
single_player()
|
||
|
|
||
|
|
||
|
|
||
|
func _on_main_menu_pressed():
|
||
|
$ListenServer.visible = true
|
||
|
$DServer.visible = true
|
||
|
$Client.visible = true
|
||
|
$Singleplayer.visible = true
|
||
|
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
|
||
|
if singleplayer:
|
||
|
for i in $PlayerSpawnLocation.get_child_count():
|
||
|
$PlayerSpawnLocation.get_child(i).queue_free()
|
||
|
else:
|
||
|
if multiplayer.is_server():
|
||
|
for p in multiplayer.get_peers():
|
||
|
destroy_player(p)
|
||
|
if is_the_server_a_player:
|
||
|
destroy_player(1)
|
||
|
multiplayer.set_multiplayer_peer(null)
|
||
|
|
||
|
|
||
|
func _input(event):
|
||
|
if Input.is_action_just_pressed("ui_menu"):
|
||
|
_on_main_menu_pressed()
|
||
|
|
||
|
|
||
|
func _on_ip_address_text_changed():
|
||
|
if $Client/IP_address.text == "":
|
||
|
ip_address_to_connect = "localhost"
|
||
|
else:
|
||
|
ip_address_to_connect = $Client/IP_address.text
|
||
|
|
||
|
|
||
|
|