- Home /
Problem with networking
Hello, I was doing a multiplayer menu script, which at same time saves player data(position, health, cash...) and serializes to a file. Everything works fine on server, but on client side nothing works(client doesn't receive any data because of RPC errors, no line numbers were specified, also these errors shew up on a client, not server).
Anyways, here's my code:
#pragma strict
import System;
import System.Runtime.Serialization.Formatters.Binary;
import System.IO;
var clientspawn : GameObject;
var playerPref : GameObject;
var nickname : String = "";
private var nickname1 : String = "";
var ip : String = "127.0.0.1";
var port : String = "25001";
public var gamename : String = "Game1";
var myChar : GameObject;
var playerGUID : String;
var gameName : String = "TDGTutorial";
var password : String;
var usePassword : boolean;
var useNAT : boolean;
var useMasterServer : boolean;
var chosenProfile : int;
//UI panels
var chooseProfilePanel : GameObject;
var createProfilePanel : GameObject;
var menuPanel : GameObject;
var createServerPanel : GameObject;
var connectToServerPanel : GameObject;
var loginPanel : GameObject;
var profileTextList : UI.Text[];
var createServerPort : int;
var connectPort : int;
var connectIP : String;
function Start(){
refreshProfiles();
}
function startServer(){ //starts the server
Debug.Log(gamename);
if(usePassword)
Network.incomingPassword = password;
Network.InitializeServer(16,System.Int32.Parse(port), useNAT);
if(useMasterServer)
MasterServer.RegisterHost(gameName, gamename, " this is a tutorial");
}
function OnServerInitialized(){ //This is used once server is started
Debug.Log("Server initialized!");
GetComponent(ToggleCreator).enabled=true;
createServerPanel.SetActive(false);
spawnPlayer();
Debug.Log("Player Spawned!");
if(Network.isServer)
RequestPlayerData(playerGUID, myChar.GetComponent.<NetworkView>().owner, true);
Debug.Log("Requested the data! "+playerGUID+" "+ myChar.GetComponent.<NetworkView>().owner);
while(true){
yield WaitForSeconds(60);
Debug.Log("Saving all players data!");
GetComponent.<NetworkView>().RPC("RequestPlayerStatsData", RPCMode.All);
SavePlayerData(playerGUID, myChar.transform.position, myChar.GetComponent(MoneySystem).money, myChar.GetComponent(LifeSystem).health, myChar.GetComponent(Shooting).bulletsCur, myChar.GetComponent(Shooting).bulletsClipCur, myChar.GetComponent(CarSystem).availableCars);
}
}
function OnConnectedToServer(){ //This is used when client successfully connects to server
loginPanel.SetActive(false);
connectToServerPanel.SetActive(false);
spawnPlayer();
if(Network.isClient)
GetComponent.<NetworkView>().RPC("RequestPlayerData", RPCMode.Server, playerGUID, myChar.GetComponent.<NetworkView>().owner, false);
}
function disconnect(){ //Disconnect from server
if(Network.isServer){
GetComponent.<NetworkView>().RPC("RequestPlayerStatsData", RPCMode.All);
SavePlayerData(playerGUID, myChar.transform.position, myChar.GetComponent(MoneySystem).money, myChar.GetComponent(LifeSystem).health, myChar.GetComponent(Shooting).bulletsCur, myChar.GetComponent(Shooting).bulletsClipCur, myChar.GetComponent(CarSystem).availableCars);
}
else if(Network.isClient)
GetComponent.<NetworkView>().RPC("SavePlayerData", RPCMode.Server, playerGUID, myChar.transform.position, myChar.GetComponent(MoneySystem).money, myChar.GetComponent(LifeSystem).health, myChar.GetComponent(Shooting).bulletsCur, myChar.GetComponent(Shooting).bulletsClipCur, myChar.GetComponent(CarSystem).availableCars);
Network.Destroy(myChar);
Network.Disconnect();
if(Network.isServer)
MasterServer.UnregisterHost();
Application.LoadLevel(Application.loadedLevel);
}
function quitApplication(){
if(Network.isServer){
GetComponent.<NetworkView>().RPC("RequestPlayerStatsData", RPCMode.All);
SavePlayerData(playerGUID, myChar.transform.position, myChar.GetComponent(MoneySystem).money, myChar.GetComponent(LifeSystem).health, myChar.GetComponent(Shooting).bulletsCur, myChar.GetComponent(Shooting).bulletsClipCur, myChar.GetComponent(CarSystem).availableCars);
}
else if(Network.isClient)
GetComponent.<NetworkView>().RPC("SavePlayerData", RPCMode.Server, playerGUID, myChar.transform.position, myChar.GetComponent(MoneySystem).money, myChar.GetComponent(LifeSystem).health, myChar.GetComponent(Shooting).bulletsCur, myChar.GetComponent(Shooting).bulletsClipCur, myChar.GetComponent(CarSystem).availableCars);
Network.Destroy(myChar);
Network.Disconnect();
if(Network.isServer)
MasterServer.UnregisterHost();
Application.Quit();
}
function spawnPlayer() { //spawns player in spawn gameobject position
myChar = Network.Instantiate(playerPref, clientspawn.transform.position, Quaternion.identity, 0);
}
function DisableCharacterMovement(state : boolean){
if(myChar != null){
myChar.GetComponent(CharacterMove).enabled = state;
myChar.GetComponent(EnterCar).minimapCam.SetActive(state);
myChar.GetComponent(EnterCar).enabled = state;
myChar.GetComponent(Shooting).enabled = state;
myChar.GetComponent(Shooting).aiming = false;
myChar.GetComponent(Shooting).shooting = false;
myChar.GetComponent(MouseLook).enabled = state;
myChar.GetComponentInChildren(SpineRot).enabled = state;
}
}
function chooseProfile(profileNum : int){
if(System.IO.File.Exists(Application.persistentDataPath + "/profile"+profileNum+".dat")){
var bf : BinaryFormatter = new BinaryFormatter();
var file : FileStream = File.Open(Application.persistentDataPath + "/profile"+profileNum+".dat", FileMode.Open);
var data : playerProfile = bf.Deserialize(file) as playerProfile;
file.Close();
playerGUID = data.GUID;
nickname = data.nickname;
Debug.Log("Read the file! Nickname: "+data.nickname+", and GUID is "+data.GUID);
chooseProfilePanel.SetActive(false);
menuPanel.SetActive(true);
}
else{
chosenProfile = profileNum;
chooseProfilePanel.SetActive(false);
createProfilePanel.SetActive(true);
}
}
function saveProfile(){
var bf : BinaryFormatter = new BinaryFormatter();
var file : FileStream = File.Create(Application.persistentDataPath + "/profile"+chosenProfile+".dat");
var data : playerProfile = new playerProfile();
data.GUID = System.Guid.NewGuid().ToString();
playerGUID = data.GUID;
data.nickname = nickname;
bf.Serialize(file, data);
file.Close();
createProfilePanel.SetActive(false);
menuPanel.SetActive(true);
}
function deleteProfile(profileNum : int){
File.Delete(Application.persistentDataPath + "/profile"+profileNum+".dat");
refreshProfiles();
}
function refreshProfiles(){
for(var i = 1; i <= profileTextList.length; i++){
profileTextList[i-1].text = getProfileNickname(i);
}
}
function getProfileNickname(profileNum : int) : String{
if(System.IO.File.Exists(Application.persistentDataPath + "/profile"+profileNum+".dat")){
var bf : BinaryFormatter = new BinaryFormatter();
var file : FileStream = File.Open(Application.persistentDataPath + "/profile"+profileNum+".dat", FileMode.Open);
var data : playerProfile = bf.Deserialize(file) as playerProfile;
file.Close();
return data.nickname;
}
else{
return "-Empty Profile-";
}
}
function updateNickname(name : UI.InputField){
nickname = name.text;
}
function updatePassword(i : UI.Toggle){
usePassword = i.isOn;
}
function updateNAT(i : UI.Toggle){
useNAT = i.isOn;
}
function updateServerPassword(i : UI.InputField){
password = i.text;
}
function updatePort(i : UI.InputField){
port = i.text;
}
function updateConnectIP(i : UI.InputField){
ip = i.text;
}
function updateMasterServer(i : Component){
useMasterServer = i;
}
function connectToServer(){
if(password == "")
Network.Connect(ip, parseInt(port));
else
Network.Connect(ip, parseInt(port), password);
}
function OnFailedToConnect(error : NetworkConnectionError) {
Debug.Log("Could not connect to server: " + error);
if(error == NetworkConnectionError.InvalidPassword){
Debug.Log("Invalid Password Entered");
loginPanel.SetActive(true);
connectToServerPanel.SetActive(false);
}
else
Debug.Log("Another error occured");
}
@RPC
function RequestPlayerData(GUID : String, NP : NetworkPlayer, isServer : boolean){
Debug.Log("Got request from: "+NP+" "+NP.ipAddress+" GUID: " + GUID);
if(System.IO.File.Exists(Application.persistentDataPath + "/player_"+GUID+".dat")){
Debug.Log("file exists!");
var bf : BinaryFormatter = new BinaryFormatter();
var file : FileStream = File.Open(Application.persistentDataPath + "/player_"+GUID+".dat", FileMode.Open);
var data : playerData = bf.Deserialize(file) as playerData;
file.Close();
Debug.Log("Sending data!..");
if(!isServer && Network.isServer)
GetComponent.<NetworkView>().RPC("SendPlayerData", NP, Vector3(data.positionX, data.positionY, data.positionZ), data.money, data.health, data.bulletsCur, data.bulletsClipCur, data.availableCars);
else
SendPlayerData(Vector3(data.positionX, data.positionY, data.positionZ), data.money, data.health, data.bulletsCur, data.bulletsClipCur, data.availableCars);
}
else{
Debug.Log("file doesn't exist!");
var bfN : BinaryFormatter = new BinaryFormatter();
var fileN : FileStream = File.Create(Application.persistentDataPath + "/player_"+GUID+".dat");
var dataN : playerData = new playerData();
dataN.positionX = clientspawn.transform.position.x;
dataN.positionY = clientspawn.transform.position.y;
dataN.positionZ = clientspawn.transform.position.z;
bfN.Serialize(fileN, dataN);
fileN.Close();
Debug.Log("Sending data!..");
if(!isServer && Network.isServer)
GetComponent.<NetworkView>().RPC("SendPlayerData", NP, Vector3(dataN.positionX, dataN.positionY, dataN.positionZ), dataN.money, dataN.health, dataN.bulletsCur, dataN.bulletsClipCur, dataN.availableCars);
else
SendPlayerData(Vector3(dataN.positionX, dataN.positionY, dataN.positionZ), dataN.money, dataN.health, dataN.bulletsCur, dataN.bulletsClipCur, dataN.availableCars);
}
}
@RPC
function SendPlayerData(positionS : Vector3, moneyS : int, healthS : int, bulletsCurS : int[], bulletsClipCurS : int[], availableCarsS : boolean[]){
Debug.Log("Received player data!");
myChar.transform.position = positionS;
myChar.GetComponent(MoneySystem).money = moneyS;
myChar.GetComponent(LifeSystem).health = healthS;
myChar.GetComponent(Shooting).bulletsCur = bulletsCurS;
myChar.GetComponent(Shooting).bulletsClipCur = bulletsClipCurS;
myChar.GetComponent(CarSystem).availableCars = availableCarsS;
}
@RPC
function SavePlayerData(GUID : String, positionS : Vector3, moneyS : int, healthS : int, bulletsCurS : int[], bulletsClipCurS : int[], availableCarsS : boolean[]){
Debug.Log("Saving data: "+GUID);
if(System.IO.File.Exists(Application.persistentDataPath + "/player_"+GUID+".dat")){
Debug.Log("file exists!");
var bf : BinaryFormatter = new BinaryFormatter();
var file : FileStream = File.Create(Application.persistentDataPath + "/player_"+GUID+".dat");
var data : playerData = new playerData();
data.positionX = positionS.x;
data.positionY = positionS.y;
data.positionZ = positionS.z;
data.money = moneyS;
data.health = healthS;
data.bulletsCur = bulletsCurS;
data.bulletsClipCur = bulletsClipCurS;
data.availableCars = availableCarsS;
bf.Serialize(file, data);
file.Close();
}
else{
Debug.Log("file doesn't exist!");
var bfN : BinaryFormatter = new BinaryFormatter();
var fileN : FileStream = File.Open(Application.persistentDataPath + "/player_"+GUID+".dat", FileMode.Open);
var dataN : playerData = new playerData();
dataN.positionX = positionS.x;
dataN.positionY = positionS.y;
dataN.positionZ = positionS.z;
dataN.money = moneyS;
dataN.health = healthS;
dataN.bulletsCur = bulletsCurS;
dataN.bulletsClipCur = bulletsClipCurS;
dataN.availableCars = availableCarsS;
bfN.Serialize(fileN, dataN);
fileN.Close();
}
}
@RPC
function RequestPlayerStatsData(){
Debug.Log("Got ze rykvest");
GetComponent.<NetworkView>().RPC("SavePlayerData", RPCMode.Server, playerGUID, myChar.transform.position, myChar.GetComponent(MoneySystem).money, myChar.GetComponent(LifeSystem).health, myChar.GetComponent(Shooting).bulletsCur, myChar.GetComponent(Shooting).bulletsClipCur, myChar.GetComponent(CarSystem).availableCars);
}
public class playerProfile{
public var GUID : String = "";
public var nickname : String = "";
}
public class playerData{
public var positionX : float = 0;
public var positionY : float = 0;
public var positionZ : float = 0;
public var money : int = 1000;
public var health : int = 100;
public var bulletsCur : int[] = [570, 90];
public var bulletsClipCur : int[] = [30, 9];
public var availableCars : boolean[] = new boolean[0];
}
public class serverData{
public var propertyOwners : String[] = new String[1];
}
Answer by AurimasBlazulionis · Mar 15, 2015 at 10:26 AM
Fixed the code, by sending an rpc to everyone, adding network player inside parameters and everyone checks if it's their network player
I've got the same problem with my code, can you send good code, I don't know what should be send to every one Request or Save and how to check network player
Answer by voncarp · Mar 15, 2015 at 10:25 AM
Your variables aren't matching up. Try debugging your data and dataN before you make the RPC call. Make sure your sending arrays for bulletsCurS, bulletsClipCurS, and availableCarsS.
Just fixed everything, variables were all right
Your answer
![](https://koobas.hobune.stream/wayback/20220613190206im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Send model/GameObject from Server to Client 0 Answers
RPC return value 1 Answer
Very Strange RPC error 1 Answer
Acess server stuff by the client 0 Answers