Multiplayer is actually easier then it appears, one quickly can get lost on who is telling who what to do ..... (I did lots of times )
Signalling (not signal server) is actually just a small part, its the same as sending a message to all peers and have them set a state as the host sets it himself.
Lots of times when I made a bug, it was because I was having actions performed twice due to sending info around too much.
keep in mind:
peer sent message to host to be broadcasted to all: perform action on peer, sent message to host
host receives message from peer to relay to all: host performs action (same as peer just did) and sents a broadcast with information to all peers
all peers (NOT! the original sender) : should receive the message and perform needed actions the original sender and host just did.
Effectively, 1 action is performed 3 times. You, host and all other peers (not host and not you, because those 2 already did it)
This process is about the same for every other aspect in a multiplayer game where you want a peers action/setting to be synched with all outside of the sync var functionality.
Now with a bit of smart approaching, you can stuff near all general actions in 1 big for each peers loop in the common sheet, and have every body tell one another what their states are. Based on these states the loop performs needed actions for all the players (host and peers).
big tip:
when making sent and broadcast messages, becarefull with textuall content, also with their naming tags.
just imagine
Tag names:
"ThisIsABigTextActingAsTheTagTitleToSentInfoToPeers"
v.s.
"tp"
The tags are sent along too, the bigger/longer the names, the more data needs to be submitted, more overhead.
Or
message content:
tag: "PlayerDied"
message: "The player has died in a horrible way"
v.s.
tag: "pd"
message: "1"
event:
on peer message received "pd"
action
set text "player has died in a horrible way"
In the second example, the text is taken from the event sheet, in contrast to sending it along.
its like a couple K bytes vs several bytes.