Exemple #1
0
    //function that controls what to do when ball touches spikes, powerups, buttons, score zones
    void OnTriggerEnter2D(Collider2D zone)
    {
        //if ball hits powerup
        if (zone.gameObject.layer == LayerMask.NameToLayer("powerups"))
        {
            powerupScript gameobjectPowerScript = zone.gameObject.GetComponent <powerupScript>();

            //check to see if more than one ball on top of powerup
            CircleCollider2D theCircleCollider = zone.gameObject.GetComponent <CircleCollider2D>();
            Collider2D[]     allCollidersOnPowerup;

            allCollidersOnPowerup = Physics2D.OverlapCircleAll(new Vector2(theCircleCollider.transform.position.x + theCircleCollider.offset.x, theCircleCollider.transform.position.y + theCircleCollider.offset.y), theCircleCollider.radius, 1 << LayerMask.NameToLayer("blueBallLayer") | 1 << LayerMask.NameToLayer("redBallLayer"));


            Debug.Log(allCollidersOnPowerup.Length);
            if (allCollidersOnPowerup.Length == 1)
            {
                Debug.Log("Picked up a powerup!");
                if (gameobjectPowerScript.powerupNumber == 0)             //jukejuice
                {
                    hasJukeJuice = true;
                    transform.parent.FindChild("jukejuicepower").GetComponent <SpriteRenderer>().enabled = true;
                    //stop coroutine first if existing
                    StopCoroutine("disablePowerupJukeJuice");
                    StartCoroutine(disablePowerupJukeJuice(20f));
                }
                else if (gameobjectPowerScript.powerupNumber == 1)             //rollingbomb
                {
                    hasRollingBomb = true;

                    currentLerpTime = 0f;
                    flashBall       = true;
                    lerpFlashUp     = true;

                    //stop coroutine first if existing
                    StopCoroutine("disablePowerupRollingBomb");
                    StartCoroutine(disablePowerupRollingBomb(20f));
                }

                gameobjectPowerScript.GetComponent <powerupScript>().CancelInvoke("checkAndResetRadius");

                transform.parent.uLinkNetworkView().RPC("showPowerupOnPlayer", uLink.RPCMode.OthersBuffered, gameobjectPowerScript.powerupNumber, playerID);
                gameobjectPowerScript.gotPowerup(playerID);

                gameobjectPowerScript.GetComponent <CircleCollider2D>().radius = 0.163f;
                gameobjectPowerScript.GetComponent <CircleCollider2D>().offset = new Vector2(-0.004f, 0);
            }
            else if (allCollidersOnPowerup.Length > 1)
            {
                Debug.Log("shrunk powerupradius");
                //shrink radius
                gameobjectPowerScript.GetComponent <CircleCollider2D>().radius = 0.006f;
                gameobjectPowerScript.GetComponent <CircleCollider2D>().offset = new Vector2(0, 0);

                gameobjectPowerScript.GetComponent <powerupScript>().InvokeRepeating("checkAndResetRadius", 0, 0.1f);
            }
        }

        //if what we hit is on the button layer play button sound on client
        if (zone.gameObject.layer == LayerMask.NameToLayer("button"))
        {
            transform.parent.uLinkNetworkView().RPC("buttonSoundPlay", uLink.RPCMode.Owner);
        }

        // on this one we're checking if the ball has flag and is in its score zone

        if (zone.transform.parent != null && zone.transform.parent.tag == "redScoreZone" && hasBlueFlag == true)
        {
            Debug.Log("Score for Red! Resetting Game.");
            //add one to red score
            GameObject.FindGameObjectWithTag("redScoreText").GetComponent <UnityEngine.UI.Text>().text = (int.Parse(GameObject.FindGameObjectWithTag("redScoreText").GetComponent <UnityEngine.UI.Text>().text) + 1).ToString();
            restartGame(1);
        }

        if (zone.transform.parent != null && zone.transform.parent.tag == "blueScoreZone" && hasRedFlag == true)
        {
            Debug.Log("Score for Blue! Resetting Game.");
            //add one to blue score
            GameObject.FindGameObjectWithTag("blueScoreText").GetComponent <UnityEngine.UI.Text>().text = (int.Parse(GameObject.FindGameObjectWithTag("blueScoreText").GetComponent <UnityEngine.UI.Text>().text) + 1).ToString();

            restartGame(0);
        }

        //if red ball touches blue flag, pick it up!

        if (zone.transform.parent != null && zone.transform.parent.tag == "redFlag" && teamColor == 0 && zone.transform.parent.GetComponentInChildren <MeshRenderer>().enabled == true)
        {
            player.SetLocalData(4);
            hasRedFlag = true;
            hasFlag    = true;

            transform.parent.uLinkNetworkView().RPC("showFlagOnPlayer", uLink.RPCMode.Buffered, playerID, teamColor);
            //send rpc directly to player so even if scope is disabled, they will receive it.
            for (int i = 0; i < uLink.Network.connections.Length; i++)
            {
                transform.parent.uLinkNetworkView().RPC("showFlagOnPlayer", uLink.Network.connections[i], playerID, teamColor);
            }

            Debug.Log("Picked up Red flag");

            zone.transform.parent.GetComponentInChildren <MeshRenderer>().enabled         = false;
            transform.parent.FindChild("redFlag").GetComponent <SpriteRenderer>().enabled = true;
        }
        //if blue ball toches red flag, pick it up
        if (zone.transform.parent != null && zone.transform.parent.tag == "blueFlag" && teamColor == 1 && zone.transform.parent.GetComponentInChildren <MeshRenderer>().enabled == true)
        {
            player.SetLocalData(3);
            hasBlueFlag = true;
            hasFlag     = true;

            transform.parent.uLinkNetworkView().RPC("showFlagOnPlayer", uLink.RPCMode.Buffered, playerID, teamColor);
            //send rpc directly to player so even if scope is disabled, they will receive it
            for (int i = 0; i < uLink.Network.connections.Length; i++)
            {
                transform.parent.uLinkNetworkView().RPC("showFlagOnPlayer", uLink.Network.connections[i], playerID, teamColor);
            }
            Debug.Log("Picked up blue flag");

            zone.transform.parent.GetComponentInChildren <MeshRenderer>().enabled          = false;
            transform.parent.FindChild("blueFlag").GetComponent <SpriteRenderer>().enabled = true;
        }
        //if red ball not in jail hits blue jail button
        if (zone.transform.parent != null && zone.transform.parent.tag == "blueJail" && teamColor == 1)
        {
            transform.parent.uLinkNetworkView().RPC("buttonSoundPlay", uLink.RPCMode.Owner);
            serverBallScript[] allServerScripts = FindObjectsOfType(typeof(serverBallScript)) as serverBallScript[];
            int i;
            for (i = 0; i < allServerScripts.Length; i++)
            {
                //check all server scripts if a ball is in jail
                allServerScripts[i].respawnBallIfInJailRed();
            }
        }

        //if blue ball not in jail hits red jail button
        if (zone.transform.parent != null && zone.transform.parent.tag == "redJail" && teamColor == 0)
        {
            serverBallScript[] allServerScripts = FindObjectsOfType(typeof(serverBallScript)) as serverBallScript[];
            int i;
            for (i = 0; i < allServerScripts.Length; i++)
            {
                //check all server scripts if ball is in jail
                allServerScripts[i].respawnBallIfInJailBlue();
            }
        }

        //if ball hits a boost
        //logic to reload boost is on boostScript attached to the boosts
        if (zone.transform.parent != null && zone.transform.parent.tag == "boosts" && zone.transform.parent.GetComponentInChildren <MeshRenderer>().enabled == true)
        {
            //play sound on player that hit boost
            transform.parent.uLinkNetworkView().RPC("boostSoundPlay", uLink.RPCMode.Owner, transform.position);


            //qeue reset boost. can't be here cause if the player dissconnects, it won't run
            boostScript daBoost = zone.transform.parent.GetComponent <boostScript>();
            daBoost.resetBoost();



            //add force on normalized velocitys

            ballphysics.velocity = new Vector2(ballphysics.velocity.normalized.x * boostSpeed, ballphysics.velocity.normalized.y * boostSpeed);
        }


        //if ball hits a stars --- meant spike but realized this when I was already too far ahead in
        if (zone.transform.parent != null && zone.transform.parent.tag == "stars")
        {
            //uLink.NetworkView.Destroy(transform.parent.gameObject);

            //apply recoil to other balls
            applyBallPopRecoil((Vector2)transform.position);

            destroyBall();
            respawnBall();
        }
    }
        public void Instantiate(uLink.NetworkPlayer player, int teamColor = -1, bool jailSpawn = false, string name = "Some Ball")
        {
            if (teamColor == -1)
            {
                if (numberOfPlayersOnRed > numberOfPlayersOnBlue)
                {
                    teamColor = 0;                  //blue
                    numberOfPlayersOnBlue++;
                }
                else if (numberOfPlayersOnRed < numberOfPlayersOnBlue)
                {
                    teamColor = 1;                  //red
                    numberOfPlayersOnRed++;
                }
                else
                {
                    //randomly choose one teamColor
                    float randomValue = UnityEngine.Random.value;
                    if (randomValue < 0.5f)
                    {
                        Debug.Log(randomValue);
                        teamColor = 0;
                        numberOfPlayersOnBlue++;
                    }
                    else
                    {
                        teamColor = 1;
                        numberOfPlayersOnRed++;
                    }
                }
            }
            if (teamColor == 1)
            {
                //start position set to hardcoded value + random value right now. if custom tile system is built, the ball can be put into a tile and an object can be designiated as the start position
                //but since theres no tile system, we cant spawn inside tile sprites
                float randomValueX = UnityEngine.Random.Range(-3.3f, 1);
                float randomValueY = UnityEngine.Random.Range(-0.4f, 0.1f);
                startPosition = new Vector3(-5 + randomValueX, 7.2f + randomValueY, 0);
                if (jailSpawn == true)
                {
                    //ugly hardcoded values
                    randomValueX  = UnityEngine.Random.Range(0f, 1.1f);
                    randomValueY  = UnityEngine.Random.Range(-0.3f, 0f);
                    startPosition = new Vector3(6.606f + randomValueX, -2.418f + randomValueY, 0);
                }



                ownerPrefab  = (GameObject)Resources.Load("redBallOwner", typeof(GameObject));
                proxyPrefab  = (GameObject)Resources.Load("redBallProxy", typeof(GameObject));
                serverPrefab = (GameObject)Resources.Load("redBallServer", typeof(GameObject));
            }
            else
            {
                //ugly hardcoded values
                float randomValueX = UnityEngine.Random.Range(-1f, 3.3f);
                float randomValueY = UnityEngine.Random.Range(-0.1f, 0.4f);
                startPosition = new Vector3(5 + randomValueX, -7.2f + randomValueY, 0);
                if (jailSpawn == true)
                {
                    //ugly hardcoded values
                    randomValueX  = UnityEngine.Random.Range(-1.1f, 0f);
                    randomValueY  = UnityEngine.Random.Range(-0f, 0.3f);
                    startPosition = new Vector3(-6.606f + randomValueX, 2.418f + randomValueY, 0);
                }



                ownerPrefab  = (GameObject)Resources.Load("blueBallOwner", typeof(GameObject));
                proxyPrefab  = (GameObject)Resources.Load("blueBallProxy", typeof(GameObject));
                serverPrefab = (GameObject)Resources.Load("blueBallServer", typeof(GameObject));
            }
            //set team to local data
            player.SetLocalData(teamColor);



            if (ownerPrefab != null && proxyPrefab != null && serverPrefab != null)
            {
                Quaternion rotation = Quaternion.Euler(startRotation);

                string playerName;

                if (player.loginData == null || !player.loginData.TryRead(out playerName))
                {
                    playerName = name;
                }



                uLink.Network.Instantiate(player, proxyPrefab, ownerPrefab, serverPrefab, startPosition, rotation, 0, teamColor, jailSpawn, playerName);
            }
        }