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); } }
public void UseSkill(ProjectileStatsContainer mod_stats, PlayerMain player) { player.StartCoroutine(doJump(player)); }
public void UseSkill(ProjectileStatsContainer mod_stats,PlayerMain player) { player.StartCoroutine(doJump(player)); }