public override bool OnMessage(FieldPlayer player, Telegram_CH4 telegram)
    {
        switch (telegram.GetMessageIndex())
        {
            case SoccerMessages.Msg_ReceiveBall:
                {
                    // set the target for this player
                    player.Steering().SetTarget(telegram.infos.position);
                    // change the state.
                    player.GetFSM().ChangeState(ReceiveBall.instance);

                    return true;
                }
            case SoccerMessages.Msg_SupportAttacker:
                {
                    if (player.GetFSM().IsInstate(SupportAttacker.instance))
                    {
                        return true;
                    }
                    player.Steering().SetTarget(SupportSpotCalculator.instance.DetermineBestSupportingPosition(player.transform.parent.GetComponent<SoccerTeam>().teamColor));

                    player.GetFSM().ChangeState(SupportAttacker.instance);
                    return true;
                }
            case SoccerMessages.Msg_GoHome:
                {
                    player.SetHomeRegion(player.transform.parent.GetComponent<SoccerTeam>().initialRegion[int.Parse(player.transform.name) - 1]);
                    player.GetFSM().ChangeState(ReturnToHomeRegion.instance);
                    return true;
                }
            case SoccerMessages.Msg_Wait:
                {
                    player.GetFSM().ChangeState(Wait.instance);
                    return true;
                }
            case SoccerMessages.Msg_PassToMe:
                {
                    FieldPlayer receiver = telegram.infos.gameObject.GetComponent<FieldPlayer>();

                    if (player.Team().Receiver() != null && !player.BallWithKickingRange())
                    {
                        return true;
                    }

                    player.Ball().SetOwner(receiver.gameObject);

                    player.Ball().Kick((receiver.transform.position - player.Ball().transform.position).normalized, Prm.instance.MaxPassingForce);
                    MessageDispatcher_CH4.instance.DispatchMessage(0f, player.Id(), receiver.Id(), SoccerMessages.Msg_ReceiveBall, receiver.transform);

                    player.GetFSM().ChangeState(Wait.instance);

                    player.FindSupport();
                    return true;
                }
        }

        return false;

    }
    public override bool OnMessage(GoalKeeper keeper, Telegram_CH4 telegram)
    {
        switch (telegram.GetMessageIndex())
        {
        case SoccerMessages.Msg_GoHome:
        {
            // set the target for this player(original location of keeper)
            keeper.Steering().SetTarget(keeper.Team().initialRegion[0]);
            // change the state.
            keeper.GetFSM().ChangeState(ReturnHome.instance);

            return(true);
        }

        case SoccerMessages.Msg_ReceiveBall:
        {
            keeper.GetFSM().ChangeState(InterceptBall.instance);
            return(true);
        }
        }
        return(false);
    }