public static bool Dispara(CriatureBase meuCriatureBase, GameObject gameObject)
    {
        Atributos           A   = meuCriatureBase.CaracCriature.meusAtributos;
        GerenciadorDeGolpes ggg = meuCriatureBase.GerenteDeGolpes;
        IGolpeBase          gg  = ggg.meusGolpes[ggg.golpeEscolhido];

        if (gg.UltimoUso + gg.TempoDeReuso < Time.time && A.PE.Corrente >= gg.CustoPE)
        {
            AplicadorDeGolpe aplG = gameObject.AddComponent <AplicadorDeGolpe>();
            A.PE.Corrente -= gg.CustoPE;
            gg.UltimoUso   = Time.time;
            aplG.esseGolpe = gg;

            if (!GameController.g.estaEmLuta)
            {
                GameController.g.HudM.AtualizaHudHeroi(meuCriatureBase);
            }

            return(true);
        }
        else
        {
            return(false);
        }
    }
    public void ImpatoAtivo(GameObject G, IGolpeBase ativa, CaracteristicasDeImpacto caracteristica)
    {
        tempoDecorrido += Time.deltaTime;
        if (!procurouAlvo)
        {
            alvoProcurado = CriaturesPerto.procureUmBomAlvo(G);
            procurouAlvo  = true;
            Debug.Log(alvoProcurado + "  esse é o alvo");
            ajudaAtaque(alvoProcurado, G.transform);
        }

        if (!addView)
        {
            tempoDecorrido += ativa.TempoDeMoveMin;
            ColisorDeGolpe.AdicionaOColisor(G, ativa, caracteristica, tempoDecorrido);

            addView = true;
        }

        if (tempoDecorrido < ativa.TempoDeMoveMax)
        {
            if (((int)(tempoDecorrido * 10)) % 2 == 0 && alvoProcurado)
            {
                ajudaAtaque(alvoProcurado, G.transform);
            }

            ativa.DirDeREpulsao = G.transform.forward;

            if (!controle)
            {
                controle = G.GetComponent <CharacterController>();
            }
            controle.Move(ativa.VelocidadeDeGolpe * G.transform.forward * Time.deltaTime + Vector3.down * 9.8f);
        }
    }
    public static bool VaiColocarStatus(IGolpeBase ativa, Atributos bateu, Atributos levou, float contraTipoVeneno)
    {
        bool retorno = false;

        switch (ativa.Nome)
        {
        case nomesGolpes.agulhaVenenosa:
        case nomesGolpes.ondaVenenosa:
        case nomesGolpes.chuvaVenenosa:

            if (contraTipoVeneno > 0)
            {
                float ff = ativa.PotenciaCorrente *
                           Mathf.Max(1,
                                     Random.Range(0.75f, 1f) * bateu.Poder.Corrente -
                                     Random.Range(0, 0.75f) * levou.Defesa.Corrente);
                if (contraTipoVeneno * ff + Random.Range(0, 100) > 80)
                {
                    retorno = true;
                }
            }

            break;
        }

        return(retorno);
    }
Exemplo n.º 4
0
    void AvanceEPareAbaixo(GameObject G, IGolpeBase ativa)
    {
        float distanciaDeParada = 5.75f;
        float velocidadeAvante  = ativa.VelocidadeDeGolpe;

        Vector3 V = posInicial + 10 * ativa.DirDeREpulsao;
        Vector3 project;

        if (alvoProcurado)
        {
            V = alvoProcurado.position;
            // project = (Vector3.ProjectOnPlane(G.transform.position - V, Vector3.up));
            //  if (Vector3.Dot(project,G.transform.forward)>0)
            //    AtualizadorDeImpactos.ajudaAtaque(alvo, G.transform);
        }

        project = (Vector3.ProjectOnPlane(G.transform.position - V, Vector3.up));

        if (Vector3.Dot(project, G.transform.forward) > 0)
        {
            G.transform.rotation = Quaternion.LookRotation(-project);
        }
        else
        {
            G.transform.rotation = Quaternion.LookRotation(ativa.DirDeREpulsao);
        }


        if ((project.magnitude > distanciaDeParada
             &&
             G.transform.position.y - posInicial.y < 4
             &&
             !alcancouOApceDaAltura)
            &&
            tempoDecorrido < ativa.TempoDeMoveMax / 2)
        {
            dirDeslocamento = (velocidadeAvante * G.transform.forward + Vector3.up * 15);
        }
        else if (project.magnitude <= distanciaDeParada)
        {
            Vector3 foco = velocidadeAvante * G.transform.forward + Vector3.down * 9.8f;
            if (alvoProcurado && Vector3.Dot(-project, G.transform.forward) > 0)
            {
                foco = velocidadeAvante * (alvoProcurado.position - G.transform.position).normalized + 18.8f * Vector3.down;
            }

            dirDeslocamento       = Vector3.Lerp(dirDeslocamento, foco, 20 * Time.deltaTime);
            alcancouOApceDaAltura = true;
        }
        else if (G.transform.position.y - posInicial.y > 4)
        {
            alcancouOApceDaAltura = true;
        }
        else
        {
            dirDeslocamento = Vector3.Lerp(dirDeslocamento, velocidadeAvante * G.transform.forward + Vector3.down * 18.8f, 20 * Time.deltaTime);
        }

        controle.Move(dirDeslocamento * Time.deltaTime);
    }
Exemplo n.º 5
0
    void AplicaGolpe()
    {
        Atributos  A  = MeuCriatureBase.CaracCriature.meusAtributos;
        IGolpeBase gg = meuCriatureBase.GerenteDeGolpes.meusGolpes[meuCriatureBase.GerenteDeGolpes.golpeEscolhido];

        Debug.Log("no chão: " + (mov.NoChao(meuCriatureBase.CaracCriature.distanciaFundamentadora)));
        if ((mov.NoChao(meuCriatureBase.CaracCriature.distanciaFundamentadora) || gg.PodeNoAr))
        {
            if (!DisparadorDoGolpe.Dispara(meuCriatureBase, gameObject))
            {
                string[] textos = BancoDeTextos.RetornaListaDeTextoDoIdioma(ChaveDeTexto.usoDeGolpe).ToArray();

                if (gg.UltimoUso + gg.TempoDeReuso >= Time.time)
                {
                    GameController.g.HudM.Painel.AtivarNovaMens(
                        string.Format(textos[0], MostradorDeTempo(gg.UltimoUso - (Time.time - gg.TempoDeReuso)))
                        , 25, 2);
                }
                else if (A.PE.Corrente < gg.CustoPE)
                {
                    GameController.g.HudM.Painel.AtivarNovaMens(textos[1], 25, 2);
                }
            }
        }
    }
Exemplo n.º 6
0
    static void CalculaDano(CreatureManager doAtacado, GameObject atacante, IGolpeBase golpe)
    {
        float multiplicador = 1;

        for (int i = 0; i < doAtacado.MeuCriatureBase.CaracCriature.contraTipos.Length; i++)
        {
            if (golpe.Tipo.ToString() == doAtacado.MeuCriatureBase.CaracCriature.contraTipos[i].Nome)
            {
                multiplicador *= doAtacado.MeuCriatureBase.CaracCriature.contraTipos[i].Mod;
            }
        }

        CriatureBase cDoAtacante = atacante.GetComponent <CreatureManager>().MeuCriatureBase;
        Atributos    A           = cDoAtacante.CaracCriature.meusAtributos;

        int potenciaDoAtacante = (golpe.Caracteristica == caracGolpe.colisao)
            ?
                                 Mathf.RoundToInt(A.Ataque.Minimo + (A.Ataque.Corrente - A.Ataque.Minimo) * Random.Range(0.85f, 1))
            :
                                 Mathf.RoundToInt(A.Poder.Minimo + (A.Poder.Corrente - A.Poder.Minimo) * Random.Range(0.85f, 1));

        GolpePersonagem golpePersonagem = cDoAtacante.GerenteDeGolpes.ProcuraGolpeNaLista(cDoAtacante.NomeID, golpe.Nome);

        CalculoC(multiplicador, golpe, golpePersonagem, potenciaDoAtacante, doAtacado, cDoAtacante);
    }
Exemplo n.º 7
0
    static void CalculoB(float multiplicador, IGolpeBase golpe, GolpePersonagem golpePersonagem, int potenciaDoAtacante, CreatureManager doAtacado)
    {
        Atributos aDoAtacado = doAtacado.MeuCriatureBase.CaracCriature.meusAtributos;

        int defesa = Mathf.RoundToInt(aDoAtacado.Defesa.Corrente * Random.Range(0.85f, 1));
        int dano   = (int)(multiplicador * (golpe.PotenciaCorrente + golpePersonagem.ModPersonagem + potenciaDoAtacante / defesa));

        AplicaCalculoComVIsaoDeDano(doAtacado, golpe, aDoAtacado, multiplicador, dano, defesa, potenciaDoAtacante);
    }
Exemplo n.º 8
0
    public static void AplicaDano(CreatureManager doAtacado, GameObject atacante, IGolpeBase golpe)
    {
        Animator animatorDoAtacado = doAtacado.GetComponent <Animator>();

        EmEstadoDeDano(animatorDoAtacado, doAtacado);

        CalculaDano(doAtacado, atacante, golpe);

        InsereEstouEmDano(doAtacado, animatorDoAtacado, golpe);

        VerificaVida(atacante, doAtacado, animatorDoAtacado);
    }
Exemplo n.º 9
0
    public static void AdicionaOColisor(GameObject G,
                                        IGolpeBase golpeAtivo,
                                        CaracteristicasDeImpacto caracteristica,
                                        float tempoDecorrido)
    {
        GameObject view = elementosDoJogo.el.retornaColisor(caracteristica.nomeTrail);
        //		print(nomeColisor);
        colisor C = pegueOColisor(G, golpeAtivo.Nome);// = new colisor();

        GameObject view2 = (GameObject)MonoBehaviour.Instantiate(view, C.deslColisor, view.transform.rotation);


        if (caracteristica.parentearNoOsso)
        {
            view2.transform.parent = G.transform.Find(C.osso).transform;
        }
        else
        {
            view2.transform.parent = G.transform;
        }

        view2.transform.localPosition             = C.deslTrail;
        view2.transform.localRotation             = view.transform.rotation;
        view2.GetComponent <BoxCollider>().center = C.deslColisor;
        view2.name = "colisor" + golpeAtivo.Nome.ToString();
        view2.transform.localScale *= (golpeAtivo.ColisorScale * C.ColisorScale);


        /*
         *                      PARA DESTUIR O COLISOR .
         *                      QUANDO O GOLPE ERA INTERROMPIDO
         *                      O COLISOR PERMANECIA NO PERSONAGEM
         */
        MonoBehaviour.Destroy(view2, golpeAtivo.TempoDeDestroy - tempoDecorrido);


        /*************************************************************/


        ColisorDeDano proj = view2.AddComponent <ColisorDeDano>();

        proj.velocidadeProjetil = 0f;
        proj.noImpacto          = caracteristica.noImpacto;
        proj.dono      = G;
        proj.esseGolpe = golpeAtivo;
        //			proj.forcaDoDano = 25f;
        //addView = true;
    }
Exemplo n.º 10
0
    static void CalculoA(float multiplicador, IGolpeBase golpe, GolpePersonagem golpePersonagem, int potenciaDoAtacante, CreatureManager doAtacado)
    {
        int dano = Mathf.Abs(
            Mathf.RoundToInt(
                multiplicador * (golpe.PotenciaCorrente
                                 + golpePersonagem.ModPersonagem
                                 + potenciaDoAtacante)
                ));

        potenciaDoAtacante = dano;//apenas para exibir no print a potencia original do golpe sem a defesa

        Atributos aDoAtacado = doAtacado.MeuCriatureBase.CaracCriature.meusAtributos;

        int defesa = Mathf.RoundToInt(aDoAtacado.Defesa.Corrente * Random.Range(0.85f, 1));

        if (defesa < 0.75f * dano)
        {
            dano = (dano - defesa >= 1)?dano - defesa:1;
        }
        else
        {
            dano = (int)(0.25f * dano) >= 1  ? Mathf.Max((int)(0.25f * dano * Random.Range(0.9f, 1.15f)), 1) : 1;
        }

        /*
         * if (dano > golpe.DanoMaximo && multiplicador <= 1)
         *  dano = golpe.DanoMaximo;
         * else if (dano > multiplicador * golpe.DanoMaximo)
         * {
         *  int mudaUmPoco = Random.Range(-1, 2);
         *  Debug.Log(mudaUmPoco);
         *  dano = Mathf.Max((int)(multiplicador * golpe.DanoMaximo) + mudaUmPoco, 1);
         * }*/

        /*
         * if (elementos == null)
         *  elementos = GameObject.Find("elementosDoJogo").GetComponent<elementosDoJogo>();
         *
         * mostraDano(elementos, T, dano);*/

        AplicaCalculoComVIsaoDeDano(doAtacado, golpe, aDoAtacado, multiplicador, dano, defesa, potenciaDoAtacante);

        /*
         * if (X.cAtributos[0].Corrente > 0)
         *  aplicaStatus(T, X, ativa, Y);
         */
    }
Exemplo n.º 11
0
    static void AplicaCalculoComVIsaoDeDano(CreatureManager doAtacado,
                                            IGolpeBase golpe,
                                            Atributos aDoAtacado,
                                            float multiplicador,
                                            int dano,
                                            int defesa,
                                            int potenciaDoAtacante)
    {
        AplicaCalculoDoDano(aDoAtacado, dano);

        Debug.Log("O dano do Golpe e " + dano + " O nome do golpe e " + golpe.Nome + " o multiplicador e" + multiplicador
                  + " A defesa do inimigo é " + defesa
                  + " A potencia original é " + potenciaDoAtacante
                  + " A potencia do Golpe é " + golpe.PotenciaCorrente);

        AplicaVisaoDeDano(doAtacado, dano);
    }
Exemplo n.º 12
0
    public void ImpactoAtivo(GameObject G, IGolpeBase ativa, CaracteristicasDeImpactoComSalto caracteristica, float colocarColisor = 0)
    {
        tempoDecorrido += Time.deltaTime;

        if (!procurouAlvo)
        {
            alvoProcurado = CriaturesPerto.procureUmBomAlvo(G);
            procurouAlvo  = true;
            // Debug.Log(alvoProcurado + "  esse é o alvo");
            AtualizadorDeImpactos.ajudaAtaque(alvoProcurado, G.transform);
            if (alvoProcurado != null)
            {
                ativa.DirDeREpulsao = (Vector3.ProjectOnPlane(alvoProcurado.position - G.transform.position, Vector3.up)).normalized;
            }

            AnimadorCriature.AnimaAtaque(G, ativa.Nome.ToString());

            /* aproveitado da geração 1 de scripts*/
            ao        = G.AddComponent <impactoAoChao>();
            ao.aoChao = caracteristica.toque.ToString();
            /* ******************* */
        }

        if (!adview && tempoDecorrido > colocarColisor)
        {
            ColisorDeGolpe.AdicionaOColisor(G, ativa, caracteristica.deImpacto, tempoDecorrido + ativa.TempoDeMoveMin);

            adview = true;
        }

        if (caracteristica.final == ImpactoAereoFinal.MaisAltoQueOAlvo)
        {
            MaisAltoQueOAlvo(G, ativa);
        }
        else
        {
            AvanceEPareAbaixo(G, ativa);
        }


        if (tempoDecorrido > ativa.TempoDeMoveMax)
        {
            nav.enabled = estavaParada;
        }
    }
Exemplo n.º 13
0
    public static void VerificaDano(GameObject atacado, GameObject atacante, IGolpeBase golpe)
    {
        if (atacado.tag == "eventoComGolpe" && !GameController.g.estaEmLuta)
        {
            atacado.GetComponent <EventoComGolpe>().DisparaEvento(golpe.Nome);
        }

        CreatureManager GdC = atacado.GetComponent <CreatureManager>();

        if (GdC && !GameController.g.UsandoItemOuTrocandoCriature)
        {
            if (GdC.MeuCriatureBase.CaracCriature.meusAtributos.PV.Corrente > 0)
            {
                AplicaDano(GdC, atacante, golpe);
                VerificaComportamentoDeIA(GdC, atacante);
            }
        }
    }
Exemplo n.º 14
0
    public static void AplicaProjetil(GameObject G, IGolpeBase ativa, CaracteristicasDeProjetil carac)
    {
        GolpePersonagem golpeP = GolpePersonagem.RetornaGolpePersonagem(G, ativa.Nome);

        if (golpeP.TempoDeInstancia > 0)
        {
            carac.posInicial = Emissor.UseOEmissor(G, ativa.Nome);
        }

        GameObject KY = AuxiliarDeInstancia.InstancieEDestrua(ativa.Nome, carac.posInicial, ativa.DirDeREpulsao, ativa.TempoDeDestroy);

        ColisorDeDanoBase proj = null;

        switch (carac.tipo)
        {
        case TipoDoProjetil.rigido:
            proj = KY.AddComponent <ColisorDeDanoRigido>();
            break;

        case TipoDoProjetil.basico:
            proj = KY.AddComponent <ColisorDeDano>();
            break;

        case TipoDoProjetil.statusExpansivel:
            proj = KY.AddComponent <ColisorDeStatusExpansivel>();
            break;

        case TipoDoProjetil.direcional:
            ColisorDeDanoDirecional projD = KY.AddComponent <ColisorDeDanoDirecional>();
            projD.alvo = (G.name == "CriatureAtivo")
                    ? ((GameController.g.InimigoAtivo != null)? GameController.g.InimigoAtivo.gameObject: null)
                    : GameController.g.Manager.CriatureAtivo.gameObject;
            proj = projD;
            break;
        }

        proj.velocidadeProjetil = ativa.VelocidadeDeGolpe;
        proj.noImpacto          = carac.noImpacto.ToString();
        proj.dono      = G;
        proj.esseGolpe = ativa;
    }
Exemplo n.º 15
0
    public static void AplicaDano(CreatureManager doAtacado, GameObject atacante, IGolpeBase golpe)
    {
        doAtacado.MudaParaEstouEmDano();
        //Transform T = doAtacado.transform;
        Animator animatorDoAtacado = doAtacado.GetComponent <Animator>();

        //  doAtacado.MudaEmDano();

        animatorDoAtacado.Play("dano2");
        animatorDoAtacado.SetBool("dano1", true);
        animatorDoAtacado.Play("dano1");

        CalculaDano(doAtacado, atacante, golpe);

        EstouEmDano eED = doAtacado.gameObject.AddComponent <EstouEmDano>();

        eED.esseGolpe = golpe;
        eED.animator  = animatorDoAtacado;
        eED.gerente   = doAtacado;

        VerificaVida(atacante, doAtacado, animatorDoAtacado);
    }
Exemplo n.º 16
0
    static void CalculaDano(CreatureManager doAtacado, GameObject atacante, IGolpeBase golpe)
    {
        float multiplicador = 1;

        for (int i = 0; i < doAtacado.MeuCriatureBase.CaracCriature.contraTipos.Length; i++)
        {
            if (golpe.Tipo.ToString() == doAtacado.MeuCriatureBase.CaracCriature.contraTipos[i].Nome)
            {
                multiplicador *= doAtacado.MeuCriatureBase.CaracCriature.contraTipos[i].Mod;
            }
        }

        CriatureBase cDoAtacante = atacante.GetComponent <CreatureManager>().MeuCriatureBase;
        Atributos    A           = cDoAtacante.CaracCriature.meusAtributos;

        int potenciaDoAtacante = (golpe.Caracteristica == caracGolpe.colisao)
            ?
                                 Mathf.RoundToInt(A.Ataque.Minimo + (A.Ataque.Corrente - A.Ataque.Minimo) * Random.Range(0.85f, 1))
            :
                                 Mathf.RoundToInt(A.Poder.Minimo + (A.Poder.Corrente - A.Poder.Minimo) * Random.Range(0.85f, 1));

        int numStatus = StatusTemporarioBase.ContemStatus(TipoStatus.fraco, cDoAtacante);

        if (numStatus > -1)
        {
            potenciaDoAtacante = (int)Mathf.Max(1 / cDoAtacante.StatusTemporarios[numStatus].Quantificador * potenciaDoAtacante, (A.Ataque.Minimo + A.Poder.Minimo) / 2);
            golpe.ModCorrente  = -(int)cDoAtacante.StatusTemporarios[numStatus].Quantificador;
        }
        else
        {
            golpe.ModCorrente = 0;
        }

        GolpePersonagem golpePersonagem = cDoAtacante.GerenteDeGolpes.ProcuraGolpeNaLista(cDoAtacante.NomeID, golpe.Nome);

        CalculoC(multiplicador, golpe, golpePersonagem, potenciaDoAtacante, doAtacado, cDoAtacante);

        golpe.VerificaAplicaStatus(cDoAtacante, doAtacado);
    }
Exemplo n.º 17
0
    static void AplicaCalculoComVIsaoDeDano(CreatureManager doAtacado,
                                            IGolpeBase golpe,
                                            Atributos aDoAtacado,
                                            float multiplicador,
                                            int dano,
                                            int defesa,
                                            int potenciaDoAtacante)
    {
        AplicaCalculoDoDano(aDoAtacado, dano);
        Debug.Log("O dano do GOlpe e " + dano + " O nome do golpe e " + golpe.Nome + " o multiplicador e" + multiplicador
                  + " A defesa do inimigo é " + defesa
                  + " A potencia original é " + potenciaDoAtacante
                  + " A potencia do Golpe é " + golpe.PotenciaCorrente);

        GameObject visaoDeDano = elementosDoJogo.el.retorna("visaoDeDano");

        visaoDeDano = (GameObject)MonoBehaviour.Instantiate(visaoDeDano, doAtacado.transform.position, Quaternion.identity);
        danoAparecendo danoAp = visaoDeDano.GetComponent <danoAparecendo>();

        danoAp.dano    = dano;
        danoAp.atacado = doAtacado.transform;
    }
Exemplo n.º 18
0
    static void CalculoC(
        float multiplicador,
        IGolpeBase golpe,
        GolpePersonagem golpePersonagem,
        int potenciaDoAtacante,
        CreatureManager doAtacado,
        CriatureBase cDoAtacado)
    {
        Atributos aDoAtacado = doAtacado.MeuCriatureBase.CaracCriature.meusAtributos;
        float     rd         = Random.Range(0.85f, 1);
        int       level      = cDoAtacado.CaracCriature.mNivel.Nivel;
        float     STAB       = 1;

        if (cDoAtacado.CaracCriature.TemOTipo(golpe.Tipo))
        {
            STAB = 1.5f;
        }
        Debug.Log("modificador de potencia para esse golpe é " + golpePersonagem.ModPersonagem);
        //int  dano = (int)((((((((2 * level / 5) + 2) * potenciaDoAtacante* 20*(golpe.PotenciaCorrente+golpePersonagem.ModPersonagem) )/ aDoAtacado.Defesa.Corrente)/ 50) +2) *STAB * multiplicador) *rd / 100);
        int dano = (int)(((2 * level + 10) * potenciaDoAtacante * (golpe.PotenciaCorrente + golpePersonagem.ModPersonagem) / (aDoAtacado.Defesa.Corrente + 250) + 2) * STAB * multiplicador * rd);

        AplicaCalculoComVIsaoDeDano(doAtacado, golpe, aDoAtacado, multiplicador, dano, aDoAtacado.Defesa.Corrente, potenciaDoAtacante);
    }
    public static void VerificaAplicaStatus(CriatureBase atacante, CreatureManager cDoAtacado, IGolpeBase golpe, int dano)
    {
        CriatureBase atacado = cDoAtacado.MeuCriatureBase;

        if (VerificaAplicaStatusEnvenenado.VaiColocarStatus(
                golpe,
                atacante.CaracCriature.meusAtributos,
                atacado.CaracCriature.meusAtributos,
                atacado.CaracCriature.contraTipos[(int)NomeTipos.Veneno].Mod
                ))
        {
            Debug.Log("Aplicou Envenenamento");

            VerificaAplicaStatusEnvenenado.InsereStatus(cDoAtacado,
                                                        new DatesForTemporaryStatus()
            {
                Quantificador      = dano,
                TempoSignificativo = 50,
                Tipo = TipoStatus.envenenado
            }
                                                        );
        }
    }
Exemplo n.º 20
0
    private void MaisAltoQueOAlvo(GameObject G, IGolpeBase ativa)
    {
        Vector3 pontoAlvo = 3 * Vector3.up;

        if (alvoProcurado != null)
        {
            pontoAlvo += alvoProcurado.position + 3 * Vector3.up + (G.transform.position - alvoProcurado.position).normalized;
        }


        Vector3 direcaoDoSalto = alvoProcurado == null
            ? G.transform.forward + 0.6f * Vector3.up
            : Vector3.Dot(
            Vector3.ProjectOnPlane(alvoProcurado.position - G.transform.position, Vector3.up),
            ativa.DirDeREpulsao) > 0 ? pontoAlvo - G.transform.position:G.transform.forward;

        //Debug.Log(Vector3.ProjectOnPlane(pontoAlvo - G.transform.position, Vector3.up).magnitude);

        if ((Vector3.ProjectOnPlane(pontoAlvo - G.transform.position, Vector3.up).magnitude < 2f
             &&
             Vector3.ProjectOnPlane(posInicial - G.transform.position, Vector3.up).sqrMagnitude > 25f)
            ||
            Mathf.Abs(posInicial.y - G.transform.position.y) > 4
            )
        {
            alcancouOApceDaAltura = true;
            direcaoDoSalto        = Vector3.ProjectOnPlane(direcaoDoSalto, Vector3.up);
        }



        if (Vector3.ProjectOnPlane(posInicial - G.transform.position, Vector3.up).sqrMagnitude > 25f /* distancia ao quadrado*/ &&
            (alcancouOApceDaAltura || tempoDecorrido > 0.75f * ativa.TempoDeMoveMax))
        {
            Vector3 descendo = Vector3.down;
            if (alvoProcurado != null)
            {
                if (Vector3.Dot(
                        Vector3.ProjectOnPlane(alvoProcurado.position - G.transform.position, Vector3.up),
                        ativa.DirDeREpulsao) < 0)
                {
                    descendo = descendo + ativa.DirDeREpulsao;
                }
                else
                {
                    float vel = 0.75f;
                    if (G.name == "CriatureAtivo")
                    {
                        vel = 0.1f;
                    }

                    descendo = descendo + vel * (alvoProcurado.position - G.transform.position);
                }
                descendo.Normalize();

                G.transform.rotation = Quaternion.LookRotation(Vector3.ProjectOnPlane(descendo, Vector3.up));
            }
            //Debug.DrawRay(G.transform.position, descendo * ativa.VelocidadeDeGolpe, Color.green, 10);
            controle.Move(descendo * ativa.VelocidadeDeGolpe * Time.deltaTime);
        }
        else
        {
            //Debug.DrawRay(G.transform.position, direcaoDoSalto.normalized * ativa.VelocidadeDeGolpe, Color.yellow, 10);
            controle.Move(direcaoDoSalto.normalized * Time.deltaTime * ativa.VelocidadeDeGolpe);
        }
    }
Exemplo n.º 21
0
    public static void InsereEstouEmDano(CreatureManager doAtacado, Animator animatorDoAtacado, IGolpeBase golpe)
    {
        EstouEmDano eED = doAtacado.gameObject.AddComponent <EstouEmDano>();

        eED.esseGolpe = golpe;
        eED.animator  = animatorDoAtacado;
        eED.gerente   = doAtacado;
    }