// Send stats for all players in all parties protected void SendAllPlayerStats() { Entity topScorerAllTeams = GameServerParty.GetTopScorerAllTeams(); foreach (var pty in GameServerParty.partyList) { var topScorerOwnTeam = pty.topScorer; foreach (Player player in pty.members) { PlayerQueueStats queueStats = player.stats.total; queueStats.secondsPlayed = secondsPlayed; queueStats.wins = (player.party == winnerParty ? 1 : 0); queueStats.losses = (player.party != winnerParty ? 1 : 0); // Calculate top scorer when not in 1v1 if (QueueSettings.queueIndex != 0) { queueStats.topScorerOwnTeam = (player == topScorerOwnTeam ? 1 : 0); queueStats.topScorerAllTeams = (player == topScorerAllTeams ? 1 : 0); } if (player.accountId != "") { // Stats StartCoroutine(ServerGameDB.SendAccountStats(player)); // Artifact rewards StartCoroutine(ServerGameDB.SendArtifactRewards(player)); } } } }
// Send stats for all players in all parties public void SendPlayerFFAStats(Player player) { LogManager.General.Log("Sending FFA stats for player '" + player.name + "'"); player.stats.total.secondsPlayed = uLink.Network.time; if (player.accountId != "") { // Stats StartCoroutine(ServerGameDB.SendAccountStats(player)); } }
// InstantiatePlayer void InstantiatePlayer(uLink.NetworkPlayer networkPlayer, string accountId, string playerName, Vector3 respawnPosition, float cameraYRotation, int partyId) { LogManager.General.Log(string.Format("Instantiating player prefabs for '{0}' with account ID '{1}'", playerName, accountId)); var party = GameServerParty.partyList[partyId]; // Instantiates an avatar for the player connecting to the server // The player will be the "owner" of this object. Read the manual chapter 7 for more // info about object roles: Creator, Owner and Proxy. GameObject obj = uLink.Network.Instantiate( networkPlayer, // Owner proxyPrefab, ownerPrefab, creatorPrefab, respawnPosition, Cache.quaternionIdentity, 0, // Network group accountId // Initial data ); // Player component Player player = obj.GetComponent <Player>(); player.accountId = accountId; networkPlayer.localData = player; // Send name player.networkView.RPC("ReceivePlayerName", uLink.RPCMode.All, playerName); // Async: DB requests if (isTestServer) { // This section is for quick client tests on the test server // Send other players and myself information about stats player.skillBuild = SkillBuild.GetStarterBuild(); player.customization = new CharacterCustomization(); player.networkView.RPC("ReceiveSkillBuild", uLink.RPCMode.All, player.skillBuild); player.networkView.RPC("ReceiveCharacterCustomization", uLink.RPCMode.All, player.customization); player.networkView.RPC("ReceiveCharacterStats", uLink.RPCMode.All, new CharacterStats()); player.networkView.RPC("ReceiveArtifactTree", uLink.RPCMode.All, Jboy.Json.WriteObject(ArtifactTree.GetStarterArtifactTree())); // After the skill build has been sent, switch the attunement player.networkView.RPC("SwitchWeapon", uLink.RPCMode.All, (byte)0); player.networkView.RPC("SwitchAttunement", uLink.RPCMode.All, (byte)0); } else { // Experience / Level ExperienceDB.GetExperience( accountId, data => { uint exp = 0; if (data != null) { exp = data.experience; } player.networkView.RPC("SetExperience", uLink.RPCMode.All, exp); } ); // TODO: We need to wait until this is finished in ApplyCharacterStats // Skill build SkillBuildsDB.GetSkillBuild( accountId, data => { if (data == null) { player.skillBuild = SkillBuild.GetStarterBuild(); } else { player.skillBuild = data; } // Send build player.networkView.RPC("ReceiveSkillBuild", uLink.RPCMode.All, player.skillBuild); // After the build has been sent, switch the attunement player.networkView.RPC("SwitchWeapon", uLink.RPCMode.All, (byte)0); player.networkView.RPC("SwitchAttunement", uLink.RPCMode.All, (byte)0); } ); // Character customization CharacterCustomizationDB.GetCharacterCustomization( accountId, data => { if (data == null) { player.customization = new CharacterCustomization(); } else { player.customization = data; } // Send customization player.networkView.RPC("ReceiveCharacterCustomization", uLink.RPCMode.All, player.customization); } ); // Character stats StartCoroutine(ServerGameDB.GetCharacterStats(player)); // Guild GuildsDB.GetGuildList(accountId, data => { if (data != null) { GuildsDB.GetGuild(data.mainGuildId, guild => { if (guild != null) { player.networkView.RPC("ReceiveMainGuildInfo", uLink.RPCMode.All, guild.name, guild.tag); } }); } }); // Artifacts ArtifactsDB.GetArtifactTree( accountId, data => { if (data == null) { player.artifactTree = ArtifactTree.GetStarterArtifactTree(); } else { player.artifactTree = data; } player.networkView.RPC("ReceiveArtifactTree", uLink.RPCMode.All, Jboy.Json.WriteObject(player.artifactTree)); } ); // Retrieve arena stats var statsBucket = new Bucket("AccountToStats"); statsBucket.Get( accountId, Constants.Replication.Default, (request) => { var statsInDB = request.GetValue <PlayerStats>(); LogManager.General.Log("Queried stats of account '" + accountId + "' successfully (Ranking: " + statsInDB.bestRanking + ")"); // Send ranking player.networkView.RPC("ReceiveBestRanking", uLink.RPCMode.All, statsInDB.bestRanking); }, (request) => { var statsInDB = new PlayerStats(); LogManager.General.Log("Account '" + accountId + "' aka player '" + playerName + "' doesn't have any player stats yet"); // Send ranking player.networkView.RPC("ReceiveBestRanking", uLink.RPCMode.All, statsInDB.bestRanking); } ); } if (GameManager.isArena) { player.networkView.RPC("GameMaxScore", uLink.RPCMode.Owner, gameMode.scoreNeededToWin); } // Layer if (GameManager.isPvP) { player.networkView.RPC("ChangeParty", uLink.RPCMode.All, partyId); player.networkView.RPC("ChangeLayer", uLink.RPCMode.All, party.layer); } else { player.networkView.RPC("ChangeLayer", uLink.RPCMode.All, Config.instance.openWorldPvPLayer); } // Respawn player.networkView.RPC("Respawn", uLink.RPCMode.All, respawnPosition); player.networkView.RPC("SetCameraYRotation", uLink.RPCMode.Owner, cameraYRotation); // On non account restricted servers we start the game instantly if (!GameManager.isArena || isTestServer) { player.networkView.RPC("StartGame", uLink.RPCMode.Owner); GameManager.gameStarted = true; } // Disable encryption in non-ranked games //if(!GameManager.isRankedGame) // uLink.Network.UninitializeSecurity(networkPlayer); }