Choice of character
Options
Ruslan
✭
in Photon Bolt
Hello!
Sorry for the trouble, but could you tell me the right way.
I create a game on AdvancedTutorial and I want to organize a simple selection of characters,
and I did it simply, I added the if else construct to the InstantiateEntity(); method.
This all works for the one who creates the game,
but does not work for the one who joins!
Player who joined automatically get a creator character, but the creator can choose any character!
Why this method does not work for those who joined?
You could not tell me in which direction I need to work to fix this?
Sorry for the trouble, but could you tell me the right way.
I create a game on AdvancedTutorial and I want to organize a simple selection of characters,
and I did it simply, I added the if else construct to the InstantiateEntity(); method.
This all works for the one who creates the game,
but does not work for the one who joins!
Player who joined automatically get a creator character, but the creator can choose any character!
Why this method does not work for those who joined?
You could not tell me in which direction I need to work to fix this?
0
Comments
-
Can we see the script?0
-
stanchion said:
Can we see the script?
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using System.Linq;
using UE = UnityEngine;
namespace Bolt.AdvancedTutorial
{
public partial class Player : IDisposable
{
public const byte TEAM_RED = 1;
public const byte TEAM_BLUE = 2;
public string name;
public BoltEntity entity;
public BoltConnection connection;
public IPlayerState state {
get { return entity.GetState (); }
}
public bool isServer {
get { return connection == null; }
}
public Player ()
{
players.Add (this);
}
public void Kill ()
{
if (entity) {
state.Dead = true;
state.respawnFrame = BoltNetwork.serverFrame + (15 * BoltNetwork.framesPerSecond);
}
}
internal void Spawn ()
{
if (entity) {
state.Dead = false;
state.health = 100;
// teleport
entity.transform.position = RandomSpawn ();
}
}
public void Dispose ()
{
players.Remove (this);
// destroy
if (entity) {
BoltNetwork.Destroy (entity.gameObject);
}
// while we have a team difference of more then 1 player
while (Mathf.Abs (redPlayers.Count () - bluePlayers.Count ()) > 1) {
if (redPlayers.Count () < bluePlayers.Count ()) {
var player = bluePlayers.First ();
player.Kill ();
player.state.team = TEAM_RED;
} else {
var player = redPlayers.First ();
player.Kill ();
player.state.team = TEAM_BLUE;
}
}
}
public void InstantiateEntity ()
{
//Choose prefab depending on the number
if (Storage.PlayerChoose == 0) {
entity = BoltNetwork.Instantiate (BoltPrefabs.Player, new TestToken (), RandomSpawn (), Quaternion.identity);
}
else if(Storage.PlayerChoose == 1){
entity = BoltNetwork.Instantiate (BoltPrefabs.Player1, new TestToken (), RandomSpawn (), Quaternion.identity);
}
else if(Storage.PlayerChoose == 2){
entity = BoltNetwork.Instantiate (BoltPrefabs.Player2, new TestToken (), RandomSpawn (), Quaternion.identity);
}
else if(Storage.PlayerChoose == 3){
entity = BoltNetwork.Instantiate (BoltPrefabs.Player3, new TestToken (), RandomSpawn (), Quaternion.identity);
}
else if(Storage.PlayerChoose == 4){
entity = BoltNetwork.Instantiate (BoltPrefabs.Player4, new TestToken (), RandomSpawn (), Quaternion.identity);
}
else if(Storage.PlayerChoose == 5){
entity = BoltNetwork.Instantiate (BoltPrefabs.Player5, new TestToken (), RandomSpawn (), Quaternion.identity);
}
else if(Storage.PlayerChoose == 6){
entity = BoltNetwork.Instantiate (BoltPrefabs.Player6, new TestToken (), RandomSpawn (), Quaternion.identity);
}
else {
entity = BoltNetwork.Instantiate (BoltPrefabs.Player, new TestToken (), RandomSpawn (), Quaternion.identity);
}
//Choose prefab depending on the number
state.name = name;
state.team =
redPlayers.Count () >= bluePlayers.Count ()
? TEAM_BLUE
: TEAM_RED;
if (isServer) {
entity.TakeControl (new TestToken ());
} else {
entity.AssignControl (connection, new TestToken ());
}
Spawn ();
}
}
partial class Player
{
static List players = new List ();
public static IEnumerable redPlayers {
get { return players.Where (x => x.entity && x.state.team == TEAM_RED); }
}
public static IEnumerable bluePlayers {
get { return players.Where (x => x.entity && x.state.team == TEAM_BLUE); }
}
public static IEnumerable allPlayers {
get { return players; }
}
public static bool serverIsPlaying {
get { return serverPlayer != null; }
}
public static Player serverPlayer {
get;
private set;
}
public static void CreateServerPlayer ()
{
serverPlayer = new Player ();
}
static Vector3 RandomSpawn ()
{
float x = UE.Random.Range (-32f, +32f);
float z = UE.Random.Range (-32f, +32f);
return new Vector3 (x, 32f, z);
}
}
}0 -
What is "Storage.PlayerChoose" ? You probably aren't sending this from the client, it should be sent either in the connect token or an event.0
-
//No, this works, it is a variable with the value int.stanchion said:What is "Storage.PlayerChoose" ? You probably aren't sending this from the client, it should be sent either in the connect token or an event.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Storage : MonoBehaviour {
public static int PlayerChoose;
}
//With the help of a singleton I give players the ability to set a unique value that affects the choice
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Singltone : MonoBehaviour {
private static Singltone _instance;
public static Singltone Instance { get { return _instance; } }
// Use this for initialization
void Start()
{
_instance = this;
DontDestroyOnLoad(gameObject);
}
public void upPl(int pl){
Storage.PlayerChoose = pl;
}
}
//The selection button calls the value assignment function
//And passes a unique parameter that is bound to a button
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ButtonChoose : MonoBehaviour {
public int person;
public void Choose(){
Singltone.Instance.upPl(person);
}
}
//And in this script I do a check whether the value has changed or not
//And everything works, the values change, but there are no characters established by these values
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour {
void OnGUI()
{
GUI.Box(new Rect(Screen.width - 200, Screen.height - 33, 200, 33), "SinglNumber : " + Storage.PlayerChoose);
}
}
0 -
//I think the problem is in the ServerCallbacks script
//It seems to me, according to this logic, the one who creates, indicates all the others how to do it
//I do not know how to change this
using System.Linq;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace Bolt.AdvancedTutorial {
[BoltGlobalBehaviour(BoltNetworkModes.Host, "Level1")]
public class ServerCallbacks : Bolt.GlobalEventListener {
public static bool ListenServer = true;
void Awake() {
if (ListenServer) {
Player.CreateServerPlayer();
Player.serverPlayer.name = "SERVER";
}
}
void FixedUpdate() {
foreach (Player p in Player.allPlayers) {
// if we have an entity, it's dead but our spawn frame has passed
if (p.entity && p.state.Dead && p.state.respawnFrame <= BoltNetwork.serverFrame) {
p.Spawn();
}
}
}
public override void ConnectRequest(UdpKit.UdpEndPoint endpoint, Bolt.IProtocolToken token) {
BoltNetwork.Accept(endpoint);
}
public override void Connected(BoltConnection c) {
c.UserData = new Player();
c.GetPlayer().connection = c;
c.GetPlayer().name = "CLIENT:" + c.RemoteEndPoint.Port;
c.SetStreamBandwidth(1024 * 1024);
}
public override void SceneLoadRemoteDone(BoltConnection connection) {
connection.GetPlayer().InstantiateEntity();
}
public override void SceneLoadLocalDone(string map) {
if (Player.serverIsPlaying) {
Player.serverPlayer.InstantiateEntity ();
} else {
Player pl = new Player ();
pl.InstantiateEntity ();
}
}
public override void SceneLoadLocalBegin(string map) {
foreach (Player p in Player.allPlayers) {
p.entity = null;
}
}
}
}
0 -
The advanced tutorial is fully server authoritative, clients cannot do anything without asking the server.0
-
it should be sent either in the connect token or an event.0
-
I can not figure out how to make an event!!!stanchion said:it should be sent either in the connect token or an event.
I do as in this lesson https://doc.photonengine.com/en-us/bolt/current/getting-started/bolt-103-events
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Singltone : Bolt.EntityEventListener {
private static Singltone _instance;
public static Singltone Instance { get { return _instance; } }
void Start()
{
_instance = this;
DontDestroyOnLoad(gameObject);
}
// Auxiliary method that changes the value
public void upPl(int pl){
Storage.PlayerChoose = pl;
//Created the event and wrote the code as in the lesson
//Logically, there should be an event about changing the value
var player = ChoosePlayer.Create (entity);
player.ChoosePlayerInt = Storage.PlayerChoose;
player.Send ();
}
}
But this all does not work I get an error :
ArgumentNullException: Argument cannot be null.
Parameter name: entity
ChoosePlayer.Create (.BoltEntity entity, EntityTargets targets)
ChoosePlayer.Create (.BoltEntity entity)
Singltone.upPl (Int32 pl) (at Assets/samples/AdvancedTutorial/scripts/MyScripts/Singltone.cs:28)0 -
Did u fix your issue?0