public CombatFlow spawnPlayer(int teamNum, bool isAI = false)
    {
        CombatFlow newSpawn = null;

        if (!isAI)
        {
            localTeam = CombatFlow.convertNumToTeam((short)teamNum);
            spawnUIPanel.SetActive(false);
        }

        Debug.Log("Spawning player on team: " + teamNum + ", isAI: " + isAI);

        // call almost all of this at runtime after player selects team
        if (playerPrefab == null)
        {
            Debug.LogError("<Color=Red><a>Missing</a></Color> playerPrefab Reference. Please set it up in GameObject 'Game Manager'", this);
        }
        else
        {
            Debug.LogFormat("We are Instantiating LocalPlayer from {0}", Application.loadedLevelName);
            // we're in a room. spawn a character for the local player. it gets synced by using PhotonNetwork.Instantiate

            Debug.Log("LocalPlayerInstance: " + TeamSpawner.localPlayerInstance);

            if (TeamSpawner.localPlayerInstance == null || isAI)
            {
                //PhotonNetwork.Instantiate(this.playerPrefab.name, spawnPoint.position, Quaternion.identity, 0);
                TeamSpawner spawner = getSpawnerByNum(teamNum);
                GameObject  playerObj;

                if (isAI)
                {
                    playerObj = spawner.spawnPlayer(playerPrefab, "Jeff", false);
                    Debug.Log("Spawning AI");
                    spawner.setPlayerAsAI(playerObj);
                    //playerObj.name = "Jeff";
                }
                else
                {
                    playerObj = spawner.spawnPlayer(playerPrefab, PhotonNetwork.NickName);
                    spawner.setPlayerAsControllable(playerObj);
                    localPlayer    = playerObj;
                    playerObj.name = PhotonNetwork.NickName;
                    playerSpawnEvent.Invoke();
                }

                newSpawn = playerObj.GetComponent <CombatFlow>();
                //spawner.setPlayerAsControllable(playerObj);
                //localPlayer = playerObj;
            }
        }

        return(newSpawn);
    }
    public void rpcCreateExplosionAt(Vector3 position, float setRadius, float setCoreDamage,
                                     bool doCollide, float dissipationTime, Color glowColor, bool doEmitLight, Color newSmokeColor,
                                     float newExpandTime, short newTeamNum, bool newDamageProjectiles, bool newFriendlyFire,
                                     float newExplosiveForce)
    {
        GameObject newExplosion = GameObject.Instantiate(explodePrefab);

        newExplosion.transform.position = position;

        Explosion newExplosionScript = newExplosion.GetComponent <Explosion>();

        //newExplosionScript.localOwned = localOwned;
        CombatFlow.Team newTeam = CombatFlow.convertNumToTeam(newTeamNum);


        // smoke settings
        newExplosionScript.emissionColor = glowColor;
        newExplosionScript.smokeColor    = newSmokeColor;

        //mat.SetColor("_EmissionColor", Color.yellow);
        newExplosionScript.radius      = setRadius;
        newExplosionScript.coreDamage  = setCoreDamage;
        newExplosionScript.doExplode   = true;
        newExplosionScript.fadeOutTime = dissipationTime;
        newExplosionScript.GetComponent <Collider>().enabled = doCollide;

        newExplosionScript.expandTime        = newExpandTime;
        newExplosionScript.team              = newTeam;
        newExplosionScript.damageProjectiles = newDamageProjectiles;
        newExplosionScript.friendlyFire      = newFriendlyFire;
        newExplosionScript.explosiveForce    = newExplosiveForce;

        // light settings
        Light light = newExplosionScript.GetComponent <Light>();

        light.enabled = doEmitLight;

        if (doEmitLight)
        {
            light.color = glowColor;
            light.range = newExplosionScript.radius * newExplosionScript.lightRangeScaleFactor;
        }
    }
    public void rpcInit(int parentLaneID, Vector3 offset, float range, int teamNum)
    {
        //Debug.LogError(" CREEP INIT RPC CALLED");

        parentLane     = PhotonNetwork.GetPhotonView(parentLaneID).GetComponent <LaneManager>();
        this.myOffset  = offset;
        effectiveRange = range;
        myFlow.team    = CombatFlow.convertNumToTeam((short)teamNum);
        //parentLane.waypoints.CopyTo(waypoints);
        parentLane.myLaneUnits.Add(myFlow);

        if (turret != null)
        {
            turret.setShellTeam(myFlow.team);
        }


        // copy list from parent
        waypoints = new List <Vector3>(parentLane.waypoints);

        lookAtWaypoint();

        //transform.rotation = Quaternion.LookRotation(waypoints[0].position - transform.position, Vector3.up);
    }
 private TeamSpawner getSpawnerByNum(int teamNum)
 {
     return(getSpawnerByTeam(CombatFlow.convertNumToTeam((short)teamNum)));
 }
 public List <LaneManager> getTeamLanes(int teamNum)
 {
     return(getTeamLanes(CombatFlow.convertNumToTeam((short)teamNum)));
 }