mdswamp

  • Jan 29, 2021
  • Joined Aug 28, 2018
  • 0 best answers
  • hi Megalomaniak i thought maybe someone with experience is succeeded to run and test it, because it is a great method/ability for game creators. beside i'v asked him and still there is no answer from him.. thanks anyways :)

  • still no luck, is this method for real or we should wait till godot 5? :D

  • hi godot users i try to compile godot to use webrtc. i dl this one https://github.com/BrandonMakin/godot/tree/webrtc_static_final and when i try to compile it, i get this error:

    c:\godot-webrtc_static_final\modules\webrtc\webrtc_peer.h(12): fatal error C1083 : Cannot open include file: 'api/peerconnectioninterface.h': No such file or dir ectory scons: *** [modules\webrtc\gd_create_session_description_observer.windows.tools. obj] Error 2 scons: building terminated because of errors.

    i used "scons platform=windows module_websockets_enabled=no" and "scons -j6 platform=windows" with no luck

    P.S: i compiled this one without a problem: https://github.com/godotengine/godot beside i installed MinGW and it does not help, just decreased my drive storage

  • Hi Christoffer... first of all, thank you for replying. actually what you said about master, fixed the problem. i just put position codes in master condition not rotation. but still there is a minor problem ;) when game starts in multiplayer mode, if one player does not move at all (no matter which one, master or client) and other player push the one that does not move, the standing player does not still stand and it moves. but when it is moved with input keys, this problem ends. can you help me with this one? thank you :)

  • No idea? :) when one player move and push other player, everything is ok, but when two players move and push each other they go through each other and the opponent on each screen vibrates when it reach the other player.

  • hi guys.. i have two characters that look each other. i use look_at(enemy.global_position) or self.rotate((enemy.global_position - self.global_position()).angle()) in fixed_process function and they work just fine in offline mode, but in multiplayer, rotation property does not seem to be sent right (because in offline mode there is no weird movements). i use this code for sending the data: rpc_unreliable("position_motion_rotation", position, motion, rotation) and this function:

    slave func position_motion_rotation(p_pos, p_mot, p_rot):
    position = p_pos
    motion = p_mot
     rotation = p_rot

    what am i doing wrong? thank you for your time

  • hi guys.. this is my autoload code for save/load of some settings for characters. as you can see it is a simple one, the problem is when i set the name or color, i see changes in game, but nothing changes in config file. so when i restart the game, it return to its default value, how can i change values/name in config file that when i restart the game i see the effects in the game not just the default values? thank you :)

    extends Node
    
    const SAVE_PATH = "res://settings.cfg"
    var config_file = ConfigFile.new()
    var stored_info = {"color": {"body_color1": Color(1,1,1,1), "body_color2": Color(0,0,0,1)}
                       ,"player_info":{"player_name": "Some Dude"}}
    
    func _ready():
         save_settings()
         load_settings()
    
    func save_settings():
         for section in stored_info.keys():
             for key in stored_info[section].keys():
                 config_file.set_value(section, key, stored_info[section][key])
         config_file.save(SAVE_PATH)
    
    func load_settings():
         var error = config_file.load(SAVE_PATH)
         if error != OK:
            print("Failed Loading Settings File. error code %s" % error)
            return[]
         for section in stored_info.keys():
             for key in stored_info[section].keys():
                 stored_info[section][key] = config_file.get_value(section, key, null)
                 print("%s: %s" % [key, section])
         return[]
    
    func get_setting(category, key):
    	return stored_info[category][key]
    
    func set_setting(category, key, value):
    	stored_info[category][key] = value

    for ex. i use

    get_node("/root/global").set_setting("color", "body_color1", Color(0,1,0,1))

    for changing character's skin to green and it works in game, but nothing changes in config file

  • hi @TwistedTwigleg , thank you for your answer. i thought i used "sync and remote" too much in client script :D so even kids could cheat. i thought maybe this is the way to secure my work a little. thank you

  • hi guys.. in fighting games, if we instance characters to the main scene which control with server and then add area2D to those characters for detecting impacts and then counting score on server with signals we get from those area2Ds, does it mean that we prevent cheating? what i want to know is that does it make a difference that we add area2d outside of the player scene on the main scene?

    thank you for your time :)

  • hi @"Ace Dragon" they're two separated scenes, but what you said about changing the scene was great. i was loading the scene on main menu scene, i changed it to get_tree().change_scene() and changed some other things and it fixed my problem. thank you for your guidance :)

  • hi godot users :) when i use the main menu for loading the game, after changing the scene, i still can click the main menu buttons with my mouse!! i use texture rect for main menu, how can i fix this problem, thanks

  • thanks, really thanks @TwistedTwigleg ... actually i had a problem in animation player which this bloody loop was the cause. it didn't let animation play completely and forced it to freeze on first frame. now it works perfectly :) so i put my final script, might someone want to do something like this:

    thanks again Twisted... :)

    extends Panel ### scene_tree has paused, this is the pause menu which in process mode...
    
    onready var first_panel = get_node("FisrtPanel")
    onready var waiting = get_node("FisrtPanel/Waiting")
    onready var second_panel = get_node("SecondPanel")
    onready var counter = get_node("SecondPanel/Counter")
    onready var counter_animation = get_node("SecondPanel/CAnimation")
    onready var counter_timer = get_node("SecondPanel/CTimer")
    
    var p1_pressed
    var p2_pressed
    
    func _on_Paused_pressed():
    	waiting.show()
    	if get_tree().is_network_server():
    		post_pressed1(p1_pressed)
    	else:
    		post_pressed2(p2_pressed)
    
    remote func post_pressed1(pressed1):
    	if (p1_pressed == true):
    		return
    	pressed1 = true
    	p1_pressed = pressed1
    	rpc("post_pressed1", pressed1)
    	start_timer()
    remote func post_pressed2(pressed2):
    	if (p2_pressed == true):
    		return
    	pressed2 = true
    	p2_pressed = pressed2
    	rpc("post_pressed2", pressed2)
    	start_timer()
    
    remote func start_timer():
    	if p1_pressed == true && p2_pressed == true:
    		first_panel.hide()       ### pause panel
    		second_panel.show()         ### counter panel
    		counter_animation.play("CountDown")        ### countdown animation (3,2,1)
    		counter_timer.start()
    
    func _on_CTimer_timeout():
    	second_panel.hide()
    	self.hide()
    	get_tree().set_pause(false)
  • after changing the script zillion times, finally it works,... this is what it become: :)

    extends Panel
    
    onready var waiting = get_node("Waiting")
    onready var count_down = get_tree().get_root().get_node("PvP/CountDown")
    onready var counter = get_tree().get_root().get_node("PvP/CountDown/Counter")
    onready var counter_animation = get_tree().get_root().get_node("PvP/CountDown/CounterAnimation")
    onready var counter_timer = get_tree().get_root().get_node("PvP/CountDown/CounterTimer")
    
    var p1_pressed
    var p2_pressed
    
    func _on_Paused_pressed():
    	waiting.show()
    	if get_tree().is_network_server():
    		if p1_pressed:
    			return
    		p1_pressed = true
    		post_pressed1(p1_pressed)
    	else:
    		if p2_pressed:
    			return
    		p2_pressed = true
    		post_pressed2(p2_pressed)
    
    remote func post_pressed1(pressed1):
    	pressed1 = true
    	p1_pressed = pressed1
    	rpc("post_pressed1", pressed1)
    	start_timer()
    remote func post_pressed2(pressed2):
    	pressed2 = true
    	p2_pressed = pressed2
    	rpc("post_pressed2", pressed2)
    	start_timer()
    
    remote func start_timer():
    	print(p1_pressed)
    	print(p2_pressed)
    	if p1_pressed == true && p2_pressed == true:
    		self.hide()
    		count_down.show()
    		counter_animation.play("CountDown")
    		counter_timer.start()
    
    func _on_CounterTimer_timeout():
    	count_down.hide()
    	get_tree().set_pause(false)

    just i have a question @TwistedTwigleg , in remote func start_timer() i put two print commands, when i follow debugger of both server and client, theyre printing output continuously. does it hurt the performance, can i write something in script to avoid these computations after i reached my result?

  • hi @TwistedTwigleg

    extends Panel
    
    onready var waiting = get_node("Waiting")
    onready var count_down = get_tree().get_root().get_node("PvP/CountDown")
    onready var counter = get_tree().get_root().get_node("PvP/CountDown/Counter")
    onready var counter_animation = get_tree().get_root().get_node("PvP/CountDown/CounterAnimation")
    onready var counter_timer = get_tree().get_root().get_node("PvP/CountDown/CounterTimer")
    
    var p1_pressed
    var p2_pressed
    
    func _on_Paused_pressed():
    	waiting.show()
    	post_pressed()
    
    func post_pressed():
    	if p1_pressed == false && p2_pressed == false:
    		if get_tree().is_network_server():
    			p1_pressed = true
    			rset("p1_pressed", true)
    		else:
    			p2_pressed = true
    			rset("p2_pressed", true)
    	elif p1_pressed == true && p2_pressed == true:
    		start_timer()
    		rpc("start_timer")
    	print(p1_pressed)
    	print(p2_pressed)
    
    remote func start_timer():
    
    	self.hide()
    	count_down.show()
    	counter_animation.play("CountDown")
    	counter_timer.start()
    
    func _on_CounterTimer_timeout():
    	count_down.hide()
    	get_tree().set_pause(false)

    (i removed tween codes for now and changed p1, p2 to p1_pressed and p2_pressed as you mentioned before)

    i put two print command in post_pressed function, their outputs are null, i dont know why, so post_pressed sends nothing to start_timer function, its weird

  • hi @TwistedTwigleg

    if i change post_pressed function like this:

    remote func post_pressed(p1, p2):
        if get_tree().is_network_server():
            p1 = true
        else:
            p2 = true
        rpc("post_pressed",p1, p2)
        if p1 == true && p2 == true:
            self.hide()
            count_down.show()
            t3.start()

    everything works, just there is a little problem, no matter which player press the pause button first, countdown begins to start and then game starts. can these changes answer your questions about functions calling and variables conflicts?

  • hi guys... i want to pause the game before scenes of 2 players load completely. but thats not a problem, problem begins when i want to unpause the game. i created a pause menu for this, changed its mode to "process" (mode of countdown node is process too) and wrote this code in pause menu:

    extends Panel
    
    onready var waiting = get_node("Waiting")
    
    # labels and tween for showing countdown (3,2,1)
    onready var count_down = get_tree().get_root().get_node("PvP/CountDown")
    onready var three = get_tree().get_root().get_node("PvP/CountDown/3")
    onready var two = get_tree().get_root().get_node("PvP/CountDown/2")
    onready var one = get_tree().get_root().get_node("PvP/CountDown/1")
    onready var t3 = get_tree().get_root().get_node("PvP/CountDown/T3")
    onready var t2 = get_tree().get_root().get_node("PvP/CountDown/T2")
    onready var t1 = get_tree().get_root().get_node("PvP/CountDown/T1")
    
    var p1 #(set this one to "false" in lobby)
    var p2 #(set this one to "false" in lobby)
    
    func _ready():
    	t3.interpolate_property(three, "transform/scale", three.rect_scale, Vector2(2, 2), 1,
                                                                     Tween.TRANS_QUAD, Tween.EASE_OUT)
    	t2.interpolate_property(two, "transform/scale", two.rect_scale, Vector2(2, 2), 1,
                                                                     Tween.TRANS_QUAD, Tween.EASE_OUT)
    	t1.interpolate_property(one, "transform/scale", one.rect_scale, Vector2(2, 2), 1,
                                                                     Tween.TRANS_QUAD, Tween.EASE_OUT)
    func _on_Paused_pressed():
    	waiting.show() # show some label
    	post_pressed(p1,p2)
    
    # i think problem is in this function, because variables are not being sent
    func post_pressed(p1, p2):
    	if get_tree().is_network_server():
    		p1 = true
    		rset("p1", true)
    	else:
    		p2 = true
    		rset("p2", true)
    	if p1 == true && p2 == true:
    		self.hide()  # hiding the pause menu
    		count_down.show() # just made a visual countdown like ("3, 2, 1")
    		three.show() # show label
    		t3.start() # start tween for showing the countdown
    
    func _on_T3_tween_completed(object, key):
    	three.queue_free()
    	three.hide()
    	two.show()
    	t2.start()
    
    func _on_T2_tween_completed(object, key):
    	two.queue_free()
    	two.hide()
    	one.show()
    	t1.start()
    
    func _on_T1_tween_completed(object, key):
    	one.queue_free()
    	one.hide()
    	count_down.hide()
    	get_tree().set_pause(false) # this code does not work (actually countdown does not begin)

    it seems variables (p1,p2) are not being sent, so game doesnt resume, what should i do now?

    Any help would be greatly appreciated :)

  • it is the simple one. still have those problems, i removed "get_tree().set_pause(false)" from lobby codes, because it freeze everything (idk how to use it in networking for synchronising) and player2 does not move, even in its screen, i think when lobby codes rename its name (i mean when it become client), scene does not recognize it (but there is no error in debugger)...

    LOBBY CODES:

    extends Control
    
    func _ready():
    	get_tree().connect("network_peer_connected", self, "_player_connected")
    	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():
    	print("Hosting network")
    	global.client = false
    	var host = NetworkedMultiplayerENet.new()
    	var res = host.create_server(4242, 2)
    	if res != OK:
    		print("Error creating server")
    		global.client = true
    		host.create_client("127.0.0.1",4242)
    		get_tree().set_network_peer(host)
    	else:
    		global.client = false
    		get_tree().set_network_peer(host)
    
    func _player_connected(id):
    	print("Player connected to server!")
    	global.connected_player = id
    	pre_start_game()
    
    func pre_start_game():
    	var ring = load("res://scenes/Modes/Default/PvP-Default.tscn").instance()
    	var player1 = ring.get_node("Player01")
    	var player2 = ring.get_node("Player02")
    	if global.client == false:
    		player1.set_name(str(get_tree().get_network_unique_id()))
    		player1.set_network_master(get_tree().get_network_unique_id())
    		player2.set_name(str(global.connected_player))
    		player2.set_network_master(global.connected_player)
    	else:
    		player2.set_name(str(get_tree().get_network_unique_id()))
    		player2.set_network_master(get_tree().get_network_unique_id())
    		player1.set_name(str(global.connected_player))
    		player1.set_network_master(global.connected_player)
    	post_start_game()
    
    remote func post_start_game():
    	get_tree().change_scene("res://scenes/Modes/Default/PvP-Default.tscn")

    codes which 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
  • 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
  • it seems client does not work properly for now (i dont understand exactly the documentation about networking and something is wrong with the code about client part, server work properly...), but how can we send an input key from event function with rpc method? i use something like rpc(input, event) and rpc(input, Input) but the didnt do anything

  • Hi Godot people :) i'm trying to put multiplayer feature in my project. so far i can send positions of two playersand move two characters. i use enemy variables in my player script and vice versa. so when i run the game and connect to the server, everything is ok and i can move two players, but there is an error in debugger which says something like this: Failed to get path from RPC: /root/PvP/1207631343 actually " /root/PvP/1207631343" is the enemy character which i use its variables in player script and i call it like: onready var enemy = get_tree().get_root().get_node("/root/PvP/Player02") now, how can i use the enemy id instead of "Player02" to fix this error? thank you :)

    (godot v3.0.6 - high level networking)