- Edited
Hi.. I have a 2D fighting game which i want players can fight each other from net (player vs player) i read some high level networking samples/tutorials for that. this is my lobby code. there are two main problems (for now) 1- the one which is server move properly, but the client one does not move at all. 2- game pause does not work for synchronising the two screen.
Lobby Code:
extends Control
const DEFAULT_PORT = 6007
const MAX_PEERS = 2
var player_name = global.Name
var players = {}
var players_ready = []
signal player_list_changed()
signal connection_failed()
signal connection_succeeded()
signal game_ended()
signal game_error(what)
func _ready():
get_tree().connect("network_peer_connected", self, "_player_connected")
get_tree().connect("network_peer_disconnected", self,"_player_disconnected")
get_tree().connect("connected_to_server", self, "_connected_ok")
get_tree().connect("connection_failed", self, "_connected_fail")
get_tree().connect("server_disconnected", self, "_server_disconnected")
name_holder.text = global.Name
func _on_PlayerName_text_changed(new_text):
name_holder.text = new_text
global.Name = name_holder.text
func _on_PvPButton_pressed():
var ip = "127.0.0.1"
var new_player_name = ""
host_join_game(ip, new_player_name)
func _player_connected(id):
print("Player connected to server!")
get_tree().change_scene("res://scenes/Modes/Default/PvP-Default.tscn")
func _player_disconnected(id):
if get_tree().is_network_server():
if has_node("res://scenes/Modes/Default/PvP-Default.tscn"):
emit_signal("game_error", "Player " + players[id] + " disconnected")
end_game()
else:
unregister_player(id)
for p_id in players:
rpc_id(p_id, "unregister_player", id)
func _server_disconnected():
emit_signal("game_error", "Server disconnected")
end_game()
func _connected_fail():
get_tree().set_network_peer(null)
emit_signal("connection_failed")
remote func register_player(id, new_player_name):
if get_tree().is_network_server():
rpc_id(id, "register_player", 1, player_name)
for p_id in players:
rpc_id(id, "register_player", p_id, players[p_id])
rpc_id(p_id, "register_player", id, new_player_name)
players[id] = new_player_name
emit_signal("player_list_changed")
remote func unregister_player(id):
players.erase(id)
emit_signal("player_list_changed")
remote func pre_start_game(spawn_points):
get_tree().set_pause(true)
assert(get_tree().is_network_server())
var ring = load("res://scenes/Modes/Default/PvP-Default.tscn").instance()
var player_scene_01 = load("res://scenes/Players/Default/P01_Default.tscn")
var player_scene_02 = load("res://scenes/Players/Default/P02_Default.tscn")
get_tree().get_root().add_child(ring)
if global.client == false:
for p_id in spawn_points:
var player01 = player_scene_01.instance()
player01.set_name(str(p_id))
player01.set_network_master(get_tree().get_network_unique_id())
player01.set_player_name(player_name)
var player02 = player_scene_02.instance()
player02.set_name(str(p_id))
player02.set_network_master(p_id)
player02.set_player_name(players[p_id])
ring.add_child(player01)
ring.add_child(player02)
else:
for p_id in spawn_points:
var player02 = player_scene_02.instance()
player02.set_name(str(p_id))
player02.set_network_master(get_tree().get_network_unique_id())
player02.set_player_name(player_name)
var player01 = player_scene_01.instance()
player01.set_name(str(p_id))
player01.set_network_master(p_id)
player01.set_player_name(players[p_id])
ring.add_child(player01)
ring.add_child(player02)
if global.client == false:
ring.count1.add_player(get_tree().get_network_unique_id(), player_name)
for pn in players:
ring.count2.add_player(pn, players[pn])
else:
ring.count2.add_player(get_tree().get_network_unique_id(), player_name)
for pn in players:
ring.count1.add_player(pn, players[pn])
if not get_tree().is_network_server():
rpc_id(1, "ready_to_start", get_tree().get_network_unique_id())
elif players.size() == 0:
post_start_game()
remote func post_start_game():
if has_node("res://scenes/Modes/Default/PvP-Default.tscn") && get_tree().is_network_server():
get_tree().set_pause(false)
remote func ready_to_start(id):
assert(get_tree().is_network_server())
if not id in players_ready:
players_ready.append(id)
if players_ready.size() == players.size():
for p in players:
rpc_id(p, "post_start_game")
post_start_game()
func host_join_game(ip, new_player_name):
print("Hosting network")
global.client = false
player_name = global.Name
var host = NetworkedMultiplayerENet.new()
var res = host.create_server(DEFAULT_PORT, MAX_PEERS)
if res != OK:
print("Error creating server")
global.client = true
host.create_client(ip, DEFAULT_PORT)
get_tree().set_network_peer(host)
else:
global.client = false
get_tree().set_network_peer(host)
func get_player_list():
return players.values()
func get_player_name():
return player_name
func end_game():
if has_node("res://scenes/Modes/Default/PvP-Default.tscn"):
get_node("res://scenes/Modes/Default/PvP-Default.tscn").queue_free()
emit_signal("game_ended")
players.clear()
get_tree().set_network_peer(null) # End networking
P.S01: i know that i can write it simpler and i dont need some of these functions, but this is my last effort, the simple one have these error too. P.S02: Im using one button for being host and join the server, so I mix host and join codes together, beside i use 2 charcters (player01 and player02), server is player01 and client is player02
and codes that i use in both player01 and player02 scripts:
func _physics_process(delta):
if is_network_master():
rpc_unreliable("setPosition",Vector2(position.x - velocity.x, position.y - velocity.y))
slave func setPosition(pos):
position = pos