Example #1
0
    public bool UseAbility(Vector3 pos, Vector3 direction)
    {
        if (
            !ability_ready ||
            player.MP >= player.stats.MP
            )
        {
            return(false);
        }

        //DEV.DEBUG!
        //ProStats = ability_prefab.GetComponent<ProjectileStats>();;
        //sfx = ability_prefab.GetComponent<StoreSounds>();
        //DEV.END


        //set stats
        ProjectileStatsContainer mod_stats = new ProjectileStatsContainer();

        mod_stats.EnergyCost = ProStats.EnergyCost * (1 - GetUpgradeStat(UpgradeStat.EnergyCost, ProStats.EnergyCost_multi));
        mod_stats.Cooldown   = ProStats.Cooldown * (1 - GetUpgradeStat(UpgradeStat.Cooldown, ProStats.Cooldown_multi));

        mod_stats.Life_time = ProStats.Life_time * (1 + GetUpgradeStat(UpgradeStat.Lifetime, ProStats.Life_time_multi));
        mod_stats.Speed     = ProStats.Speed * (1 + GetUpgradeStat(UpgradeStat.Speed, ProStats.Speed_multi));
        mod_stats.Power     = ProStats.Power * (1 + GetUpgradeStat(UpgradeStat.Power, ProStats.Power_multi));
        mod_stats.Knockback = ProStats.Knockback * (1 + GetUpgradeStat(UpgradeStat.Knockback, ProStats.Knockback_multi));
        mod_stats.HP        = ProStats.HP * (1 + GetUpgradeStat(UpgradeStat.HP, ProStats.HP_multi));
        mod_stats.Radius    = ProStats.Radius * (1 + GetUpgradeStat(UpgradeStat.Radius, ProStats.Radius_multi));

        mod_stats.Accuracy_multi = GetUpgradeStat(UpgradeStat.Accuracy, ProStats.Accuracy_multi);
        mod_stats.Spread         = ProStats.Spread * mod_stats.Accuracy_multi;


        //is projectile
        if (projectile_prefab != null)
        {
            PlayerMain inside_player = null;

            var dis       = Mathf.Max(ProStats.Size, 0.2f);       //+player.rigidbody.velocity.magnitude/10
            var spawn_pos = pos + direction * dis;
            if (ProStats.Start_in_player_pos)
            {
                spawn_pos = player.transform.position;
            }
            //check if pos free
            if (ProStats.Check_start_collisions)
            {
                var ray_hits = Physics.RaycastAll(pos - direction * 1, direction, dis + 1);

                foreach (var hit in ray_hits)
                {
                    var go = hit.collider.gameObject;
                    if (go.tag == "Ground")
                    {
                        return(false);
                        //don't spawn a projectile at all.
                    }
                    if (go.tag == "Player")
                    {
                        inside_player = go.GetComponent <PlayerMain>();
                        break;
                        //automatically destroy projectile after spawning.
                    }
                }
            }
            for (int i = 0; i < ProStats.AmountOfShots; i++)
            {
                var obj = MonoBehaviour.Instantiate(projectile_prefab, spawn_pos + (direction * dis * i), Quaternion.identity) as Transform;

                //copy projectile modifiers.
                foreach (ProjectileModifier scr in ability_prefab.GetComponents(typeof(ProjectileModifier)))
                {
                    var comp = obj.gameObject.AddComponent(scr.GetType());
                    foreach (var f in scr.GetType().GetFields())
                    {
                        f.SetValue(comp, f.GetValue(scr));
                    }
                }

                //add rigid body as the last component
                obj.gameObject.AddComponent <Rigidbody> ();
                obj.rigidbody.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;
                obj.rigidbody.useGravity             = ProStats.Gravity_on;

                //set stats
                var pro = obj.GetComponent <ProjectileMain> ();

                pro.Creator        = player;
                pro.original_stats = ProStats;
                pro.mod_stats      = mod_stats;
                pro.sfx            = sfx;

                if (ProStats.Life_time < 0)
                {
                    pro.life_time.Active = false;
                }
                else
                {
                    pro.life_time.Delay = mod_stats.Life_time;
                    pro.life_time.Reset();
                }

                float spread_start = 0;

                /*if (ProStats.AmountOfShots>1){
                 *      float angle_per=180f/ProStats.AmountOfShots;
                 *      spread_start=-90+angle_per*i+angle_per*0.5f;
                 * }*/

                mod_stats.Spread = (ProStats.Spread - ProStats.Spread * (mod_stats.Accuracy_multi)) * 0.5f;
                var q = Quaternion.Euler(new Vector3(0, spread_start + Random.Range(-mod_stats.Spread, mod_stats.Spread), 0));

                var dir = direction;
                if (ProStats.AimDistance > 0)
                {
                    dir   = (player.transform.position + direction * ProStats.AimDistance) - pos;
                    dir.y = 0;
                }

                pro.setDirection(q * dir.normalized, mod_stats.Speed);
                pro.changeMaterialColor(ProStats.Colour);

                obj.localScale            = Vector3.one * ProStats.Size;
                obj.rigidbody.mass        = ProStats.Size * 10;
                obj.rigidbody.drag        = ProStats.Drag;
                obj.rigidbody.angularDrag = ProStats.Drag;
                obj.rigidbody.mass        = ProStats.Mass;

                if (inside_player != null)               //DEV.HAX! NOT COOL!
                {
                    GameObject.Destroy(obj.gameObject);
                    inside_player.HP -= pro.mod_stats.Power;
                }
            }
        }
        else
        {
            //use skill
            foreach (SkillScript scr in ability_prefab.GetComponents(typeof(SkillScript)))
            {
                scr.UseSkill(mod_stats, player);
            }
        }

        setOnCooldown(mod_stats.Cooldown);

        player.MP += mod_stats.EnergyCost;
        return(true);
    }
    public void UseSkill(ProjectileStatsContainer mod_stats,PlayerMain player)
    {
        float
            dis=mod_stats.Radius,dis_extra=dis+2f;
        Vector3
            dir=player.transform.TransformDirection(player.AimDir),
            start_pos=player.transform.position
            ;//end_pos=start_pos+dir*dis;

        Ray ray=new Ray(start_pos,dir);
        var hits=Physics.RaycastAll(ray,dis_extra).OrderByDescending(r=>r.distance).ToArray();

        float current_warp_dis=dis;

        bool jump=true;

        for (int i=0;i<hits.Length;i++){
            var hit=hits[i];
            float
                hit_dis=(new Vector2(start_pos.x,start_pos.z)-new Vector2(hit.collider.transform.position.x,hit.collider.transform.position.z)).magnitude,
                hit_rad=hit.collider.bounds.size.x/2f,
                min_dif=0.5f+hit_rad,
                dis_dif=Mathf.Abs(current_warp_dis-hit_dis),
                min_legal=0.1f,
                next_to_hit=hit_dis-min_dif;

            if (current_warp_dis<=min_legal){
                //Too close. No jump.
                jump=false;
                break;
            }
            if (dis_dif<min_dif){
                //too close to this collider->Change current to min legal distance from collider and continue;
                current_warp_dis=next_to_hit;
            }else{

                if (next_to_hit>dis){
                    //this object is not on the way. Continue iterating
                    continue;
                }
                //totally legit position. Go for it!
                break;
            }

            /*
            if (next_valid_jump_dis>distance){
                continue;//over legal distance.
            }else
            if (){
                continue;//under legal distance
            {
                */

            /*
            if (Mathf.Abs(dis_dif)>min_dif){
                //good pos jump
                current_warp_dis=dis_dif;
                break;
            }
            else{
                //too close change pos
                current_warp_dis=Mathf.Max (dis,hit_dis-min_dif);
                if (current_warp_dis<=0.5f){//too close no jump!
                    jump=false;
                    break;
                }
            }
            */
        }
        if (jump){
            var start=Resources.Load("TeleStart") as GameObject;
            var end=Resources.Load("TeleEnd") as GameObject;

            Instantiate(start,player.transform.position,Quaternion.identity);

            player.transform.position=ray.GetPoint(current_warp_dis);

            Instantiate(end,player.transform.position,Quaternion.identity);
        }
    }
    public bool UseAbility(Vector3 pos,Vector3 direction)
    {
        if (
            !ability_ready||
            player.MP >= player.stats.MP
        )return false;

        //DEV.DEBUG!
        //ProStats = ability_prefab.GetComponent<ProjectileStats>();;
        //sfx = ability_prefab.GetComponent<StoreSounds>();
        //DEV.END

        //set stats
        ProjectileStatsContainer mod_stats=new ProjectileStatsContainer();

        mod_stats.EnergyCost=ProStats.EnergyCost*(1-GetUpgradeStat(UpgradeStat.EnergyCost,ProStats.EnergyCost_multi));
        mod_stats.Cooldown=ProStats.Cooldown*(1-GetUpgradeStat(UpgradeStat.Cooldown,ProStats.Cooldown_multi));

        mod_stats.Life_time=ProStats.Life_time*(1+GetUpgradeStat(UpgradeStat.Lifetime,ProStats.Life_time_multi));
        mod_stats.Speed=ProStats.Speed*(1+GetUpgradeStat(UpgradeStat.Speed,ProStats.Speed_multi));
        mod_stats.Power=ProStats.Power*(1+GetUpgradeStat(UpgradeStat.Power,ProStats.Power_multi));
        mod_stats.Knockback=ProStats.Knockback*(1+GetUpgradeStat(UpgradeStat.Knockback,ProStats.Knockback_multi));
        mod_stats.HP=ProStats.HP*(1+GetUpgradeStat(UpgradeStat.HP,ProStats.HP_multi));
        mod_stats.Radius=ProStats.Radius*(1+GetUpgradeStat(UpgradeStat.Radius,ProStats.Radius_multi));

        mod_stats.Accuracy_multi=GetUpgradeStat(UpgradeStat.Accuracy,ProStats.Accuracy_multi);
        mod_stats.Spread=ProStats.Spread*mod_stats.Accuracy_multi;

        //is projectile
        if (projectile_prefab!=null){
            PlayerMain inside_player=null;

            var dis = Mathf.Max (ProStats.Size, 0.2f);//+player.rigidbody.velocity.magnitude/10
            var spawn_pos = pos + direction * dis;
            if (ProStats.Start_in_player_pos)
                spawn_pos=player.transform.position;
            //check if pos free
            if (ProStats.Check_start_collisions){
                var ray_hits = Physics.RaycastAll (pos-direction*1,direction, dis+1);

                foreach (var hit in ray_hits) {
                    var go=hit.collider.gameObject;
                    if (go.tag == "Ground"){
                        return false;
                        //don't spawn a projectile at all.
                    }
                    if (go.tag == "Player"){
                        inside_player=go.GetComponent<PlayerMain>();
                        break;
                        //automatically destroy projectile after spawning.
                    }
                }
            }
            for (int i=0;i<ProStats.AmountOfShots;i++){
                var obj=MonoBehaviour.Instantiate(projectile_prefab,spawn_pos+(direction*dis*i),Quaternion.identity) as Transform;

                //copy projectile modifiers.
                foreach (ProjectileModifier scr in ability_prefab.GetComponents(typeof(ProjectileModifier))){
                    var comp=obj.gameObject.AddComponent(scr.GetType());
                    foreach (var f in scr.GetType().GetFields()){
                        f.SetValue(comp,f.GetValue(scr));
                    }
                }

                //add rigid body as the last component
                obj.gameObject.AddComponent<Rigidbody> ();
                obj.rigidbody.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;
                obj.rigidbody.useGravity=ProStats.Gravity_on;

                //set stats
                var pro = obj.GetComponent<ProjectileMain> ();

                pro.Creator = player;
                pro.original_stats = ProStats;
                pro.mod_stats = mod_stats;
                pro.sfx=sfx;

                if (ProStats.Life_time < 0)
                    pro.life_time.Active = false;
                else {
                    pro.life_time.Delay=mod_stats.Life_time;
                    pro.life_time.Reset();
                }

                float spread_start=0;
                /*if (ProStats.AmountOfShots>1){
                    float angle_per=180f/ProStats.AmountOfShots;
                    spread_start=-90+angle_per*i+angle_per*0.5f;
                }*/

                mod_stats.Spread=(ProStats.Spread-ProStats.Spread*(mod_stats.Accuracy_multi))*0.5f;
                var q=Quaternion.Euler(new Vector3(0,spread_start+Random.Range(-mod_stats.Spread,mod_stats.Spread),0));

                var dir=direction;
                if (ProStats.AimDistance>0){
                    dir=(player.transform.position+direction*ProStats.AimDistance)-pos;
                    dir.y=0;
                }

                pro.setDirection(q*dir.normalized,mod_stats.Speed);
                pro.changeMaterialColor(ProStats.Colour);

                obj.localScale=Vector3.one*ProStats.Size;
                obj.rigidbody.mass=ProStats.Size*10;
                obj.rigidbody.drag=ProStats.Drag;
                obj.rigidbody.angularDrag=ProStats.Drag;
                obj.rigidbody.mass=ProStats.Mass;

                if (inside_player!=null){//DEV.HAX! NOT COOL!
                    GameObject.Destroy(obj.gameObject);
                    inside_player.HP-=pro.mod_stats.Power;
                }
            }
        }
        else{
            //use skill
            foreach (SkillScript scr in ability_prefab.GetComponents(typeof(SkillScript))){
                scr.UseSkill(mod_stats,player);
            }
        }

        setOnCooldown (mod_stats.Cooldown);

        player.MP += mod_stats.EnergyCost;
        return true;
    }
    public void UseSkill(ProjectileStatsContainer mod_stats, PlayerMain player)
    {
        float
            dis = mod_stats.Radius, dis_extra = dis + 2f;
        Vector3
            dir       = player.transform.TransformDirection(player.AimDir),
            start_pos = player.transform.position
        ;                //end_pos=start_pos+dir*dis;

        Ray ray  = new Ray(start_pos, dir);
        var hits = Physics.RaycastAll(ray, dis_extra).OrderByDescending(r => r.distance).ToArray();

        float current_warp_dis = dis;

        bool jump = true;

        for (int i = 0; i < hits.Length; i++)
        {
            var hit = hits[i];
            float
                hit_dis     = (new Vector2(start_pos.x, start_pos.z) - new Vector2(hit.collider.transform.position.x, hit.collider.transform.position.z)).magnitude,
                hit_rad     = hit.collider.bounds.size.x / 2f,
                min_dif     = 0.5f + hit_rad,
                dis_dif     = Mathf.Abs(current_warp_dis - hit_dis),
                min_legal   = 0.1f,
                next_to_hit = hit_dis - min_dif;

            if (current_warp_dis <= min_legal)
            {
                //Too close. No jump.
                jump = false;
                break;
            }
            if (dis_dif < min_dif)
            {
                //too close to this collider->Change current to min legal distance from collider and continue;
                current_warp_dis = next_to_hit;
            }
            else
            {
                if (next_to_hit > dis)
                {
                    //this object is not on the way. Continue iterating
                    continue;
                }
                //totally legit position. Go for it!
                break;
            }

            /*
             * if (next_valid_jump_dis>distance){
             *      continue;//over legal distance.
             * }else
             * if (){
             *      continue;//under legal distance
             * {
             */



            /*
             * if (Mathf.Abs(dis_dif)>min_dif){
             *      //good pos jump
             *      current_warp_dis=dis_dif;
             *      break;
             * }
             * else{
             *      //too close change pos
             *      current_warp_dis=Mathf.Max (dis,hit_dis-min_dif);
             *      if (current_warp_dis<=0.5f){//too close no jump!
             *              jump=false;
             *              break;
             *      }
             * }
             */
        }
        if (jump)
        {
            var start = Resources.Load("TeleStart") as GameObject;
            var end   = Resources.Load("TeleEnd") as GameObject;

            Instantiate(start, player.transform.position, Quaternion.identity);

            player.transform.position = ray.GetPoint(current_warp_dis);

            Instantiate(end, player.transform.position, Quaternion.identity);
        }
    }
Example #5
0
 public void UseSkill(ProjectileStatsContainer mod_stats, PlayerMain player)
 {
     player.StartCoroutine(doJump(player));
 }
 public void UseSkill(ProjectileStatsContainer mod_stats,PlayerMain player)
 {
     player.StartCoroutine(doJump(player));
 }