void CallPet()
    {
        if (!foodEnabled && !ballInGround)
        {
            petCalled = true;

            targetMove = new Vector3(Camera.main.transform.position.x, 0.0f, Camera.main.transform.position.z);

            var  mapScript   = mapController.GetComponent <MapController>();
            int  tileX       = mapScript.tileX;
            int  tileY       = mapScript.tileY;
            bool readyToSend = mapScript.okToSentPetPos;

            if (readyToSend)
            {
                timeStartMove = DateTime.Now.Ticks.ToString();

                UpdatePetPos petPos = new UpdatePetPos();
                petPos.type          = "listplayer";
                petPos.username      = PlayerPrefs.GetString("username");
                petPos.timeStartMove = timeStartMove;
                petPos.petLastPosX   = transform.position.x;
                petPos.petLastPosY   = transform.position.z;
                petPos.petPosX       = targetMove.x;
                petPos.petPosY       = targetMove.z;
                petPos.tileX         = tileX;
                petPos.tileY         = tileY;
                petPos.petState      = "call";
                petPos.speed         = speed;

                string requestJson = JsonUtility.ToJson(petPos);
                AmqpClient.Publish(AmqpController.amqpControl.requestExchangeName, AmqpController.amqpControl.requestRoutingKey, requestJson);
            }
        }
    }
    void SimulateProjectile()
    {
        if (ball.transform.position.y <= 0.0f && !ballInGround)
        {
            ball.GetComponent <Rigidbody>().isKinematic = true;
            ball.transform.position = new Vector3(ball.transform.position.x, 0.0f, ball.transform.position.z);

            ballInGround = true;

            petCalled = false;

            var  mapScript   = mapController.GetComponent <MapController>();
            int  tileX       = mapScript.tileX;
            int  tileY       = mapScript.tileY;
            bool readyToSend = mapScript.okToSentPetPos;

            if (readyToSend)
            {
                // ball
                UpdateBallState updateBall = new UpdateBallState();
                updateBall.type      = "updateBall";
                updateBall.username  = PlayerPrefs.GetString("username");
                updateBall.tileX     = tileX;
                updateBall.tileY     = tileY;
                updateBall.ballPosX  = ball.transform.position.x;
                updateBall.ballPosY  = 0.0f;
                updateBall.ballPosZ  = ball.transform.position.z;
                updateBall.ballState = "inground";

                string requestJson = JsonUtility.ToJson(updateBall);
                AmqpClient.Publish(AmqpController.amqpControl.requestExchangeName, AmqpController.amqpControl.requestRoutingKey, requestJson);

                // movement
                timeStartMove = DateTime.Now.Ticks.ToString();

                UpdatePetPos petPos = new UpdatePetPos();
                petPos.type          = "listplayer";
                petPos.username      = PlayerPrefs.GetString("username");
                petPos.timeStartMove = timeStartMove;
                petPos.petLastPosX   = transform.position.x;
                petPos.petLastPosY   = transform.position.z;
                petPos.petPosX       = ball.transform.position.x;
                petPos.petPosY       = ball.transform.position.z;
                petPos.tileX         = tileX;
                petPos.tileY         = tileY;
                petPos.petState      = "walktoball";
                petPos.speed         = speed;

                string requestJson2 = JsonUtility.ToJson(petPos);
                AmqpClient.Publish(AmqpController.amqpControl.requestExchangeName, AmqpController.amqpControl.requestRoutingKey, requestJson2);
            }
        }
    }
    void GiveFood()
    {
        if (!foodEnabled && !ballInGround)
        {
            GameObject mainCam = GameObject.FindGameObjectWithTag("MainCamera");

            GameObject food = GameObject.CreatePrimitive(PrimitiveType.Cube);
            food.tag = "Food";
            food.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
            food.transform.position   = new Vector3(mainCam.transform.parent.position.x, 0, mainCam.transform.parent.position.z);
            Rigidbody foodRigibody = food.AddComponent <Rigidbody>();
            foodRigibody.mass        = 1;
            foodRigibody.isKinematic = true;

            foodEnabled = true;

            // update position in server
            var  mapScript   = mapController.GetComponent <MapController>();
            int  tileX       = mapScript.tileX;
            int  tileY       = mapScript.tileY;
            bool readyToSend = mapScript.okToSentPetPos;

            if (readyToSend)
            {
                timeStartMove = DateTime.Now.Ticks.ToString();

                UpdatePetPos petPos = new UpdatePetPos();
                petPos.type          = "listplayer";
                petPos.username      = PlayerPrefs.GetString("username");
                petPos.timeStartMove = timeStartMove;
                petPos.petLastPosX   = transform.position.x;
                petPos.petLastPosY   = transform.position.z;
                petPos.petPosX       = food.transform.position.x;
                petPos.petPosY       = food.transform.position.z;
                petPos.tileX         = tileX;
                petPos.tileY         = tileY;
                petPos.petState      = "walkFood";
                petPos.speed         = speed;

                string requestJson = JsonUtility.ToJson(petPos);
                AmqpClient.Publish(AmqpController.amqpControl.requestExchangeName, AmqpController.amqpControl.requestRoutingKey, requestJson);
            }

            petCalled = false;
        }
    }
    void MoveBehaviour()
    {
        if (!foodEnabled && !ballInGround && !petCalled)
        {
            var  mapScript   = mapController.GetComponent <MapController>();
            int  tileX       = mapScript.tileX;
            int  tileY       = mapScript.tileY;
            bool readyToSend = mapScript.okToSentPetPos;

            if (Vector3.Distance(targetMove, transform.position) < 0.1f && readyToSend)
            {
                RandomTargetPos();
                timeStartMove = DateTime.Now.Ticks.ToString();

                UpdatePetPos petPos = new UpdatePetPos();
                petPos.type          = "listplayer";
                petPos.username      = PlayerPrefs.GetString("username");
                petPos.timeStartMove = timeStartMove;
                petPos.petLastPosX   = 0f;
                petPos.petLastPosY   = 0f;
                petPos.petPosX       = targetMove.x;
                petPos.petPosY       = targetMove.z;
                petPos.tileX         = tileX;
                petPos.tileY         = tileY;
                petPos.petState      = "walk";
                petPos.speed         = speed;

                string requestJson = JsonUtility.ToJson(petPos);
                AmqpClient.Publish(AmqpController.amqpControl.requestExchangeName, AmqpController.amqpControl.requestRoutingKey, requestJson);
            }



            Vector3 lookpos = targetMove - transform.position;
            lookpos.y = 0;
            if (lookpos != Vector3.zero)
            {
                var rotation = Quaternion.LookRotation(lookpos);
                transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * 2.0f);
            }

            transform.position = Vector3.MoveTowards(transform.position, targetMove, Time.deltaTime * speed);
        }
    }
    void OnTriggerEnter(Collider col)
    {
        if (col.gameObject.tag == "Food")
        {
            anim = GameObject.Find("cu_puppy_shiba_a").GetComponent <Animator>();
            anim.runtimeAnimatorController = Resources.Load("AnimationController/PetEatController") as RuntimeAnimatorController;
            isEating = true;
            eatTime  = 160;

            var  mapScript   = mapController.GetComponent <MapController>();
            int  tileX       = mapScript.tileX;
            int  tileY       = mapScript.tileY;
            bool readyToSend = mapScript.okToSentPetPos;

            if (readyToSend)
            {
                timeStartMove = DateTime.Now.Ticks.ToString();

                UpdatePetPos petPos = new UpdatePetPos();
                petPos.type          = "listplayer";
                petPos.username      = PlayerPrefs.GetString("username");
                petPos.timeStartMove = timeStartMove;
                petPos.petLastPosX   = 0f;
                petPos.petLastPosY   = 0f;
                petPos.petPosX       = this.transform.position.x;
                petPos.petPosY       = this.transform.position.z;
                petPos.tileX         = tileX;
                petPos.tileY         = tileY;
                petPos.petState      = "eatFood";
                petPos.speed         = speed;

                string requestJson = JsonUtility.ToJson(petPos);
                AmqpClient.Publish(AmqpController.amqpControl.requestExchangeName, AmqpController.amqpControl.requestRoutingKey, requestJson);
            }
        }

        if (col.gameObject.tag == "Ball")
        {
            ball.transform.parent = this.transform;

            ballDeliver = true;

            var  mapScript   = mapController.GetComponent <MapController>();
            int  tileX       = mapScript.tileX;
            int  tileY       = mapScript.tileY;
            bool readyToSend = mapScript.okToSentPetPos;

            if (readyToSend)
            {
                // movement
                timeStartMove = DateTime.Now.Ticks.ToString();

                UpdatePetPos petPos = new UpdatePetPos();
                petPos.type          = "listplayer";
                petPos.username      = PlayerPrefs.GetString("username");
                petPos.timeStartMove = timeStartMove;
                petPos.petLastPosX   = 0f;
                petPos.petLastPosY   = 0f;
                petPos.petPosX       = Camera.main.transform.position.x;
                petPos.petPosY       = Camera.main.transform.position.z;
                petPos.tileX         = tileX;
                petPos.tileY         = tileY;
                petPos.petState      = "walkbringball";
                petPos.speed         = speed;

                string requestJson = JsonUtility.ToJson(petPos);
                AmqpClient.Publish(AmqpController.amqpControl.requestExchangeName, AmqpController.amqpControl.requestRoutingKey, requestJson);
            }
        }
    }