|
|
|
 |
Attention |
Topic was automatically imported from the old Question2Answer platform. |
 |
Asked By |
DavidPeterWorks |
I wanted to create instance nodes (like players) only on the master and share that node through rpc as parameter. Finally I called addChild in a sync function on every game instance. It does not work.
What is the reason behind that? I am just interested in that.
It seems like it is mandatory to create new instances on every game instances.
My twisted concept:
OnPlayer connection event:
func connected(id):
if (!is_network_master()):
return
instPlayer(netId)
instPlayer(id)
func instPlayer(id):
player = player_scene.instance()
player.set_network_master(id)
player.setLabel("player "+String(id))
if (id == 1):
player.position = Vector2(300,200)
else:
player.position = Vector2(100,200)
rpc("addPlayer", player)
sync func addPlayer(p):
add_child(p)
|
|
|
 |
Reply From: |
hilfazer |
You’ll probably be very disappointed to hear that…
nodes can not be passes through RPC 
First you will need to send data necessary to create a new node. In my code it’s this:
remote func insertUnit(unitFilename, path, unitName):
var unit = load(unitFilename).instance()
unit.set_name(unitName)
get_node(path).add_child( unit )
unitFilename is a path to .tscn file, path is a path in scene tree, name is a name of a node.
After a unit is created on client’s game server calls this function of my Unit.gd script:
func sendToClient(clientId):
var unitData = {
position = get_position(),
nameLabelText = get_node(UnitNameLabel).get_text()
}
rpc_id(clientId, "copyUnit", unitData)
This is a function (also in Unit.gd) that will be called at client’s side
remote func copyUnit(unitData):
set_position(unitData.position)
get_node(UnitNameLabel).text = unitData.nameLabelText
it initializes a unit that was created via insertUnit
before.
And here is a function that sends all units from server to a client:
func sendToClient(clientId):
var units = self.get_children()
for unit in units:
var unitFilename = unit.get_filename()
var path = get_path()
rpc_id(clientId, "insertUnit", unitFilename, path, unit.get_name())
unit.sendToClient(clientId)