public var NumeroArma : int = 0;
private var PuntoDisparo : Vector3;
public var Armas : GameObject[];
public var Balas : GameObject[];
public var Sonidos : AudioClip[];
public var ManejadorDeDibujoDeArmas : GameObject;
public var GUIArmas : GUITexture;
public var GUITexturasArmas : Texture2D[];
public var GUICargadores : GUIText;
public var GUIBalas : GUIText;
public var DrawRay : boolean = false;

private var TiempoDeDisparo : float = 0;

private var GunStatusScript :  GunStatus;
private var ArmasEstadoScript :  ArmasEstado;

private var FireSound : AudioSource;

	function Start(){
		FireSound = this.GetComponent(typeof(AudioSource)) as AudioSource;
		
		GunStatusScript = Armas[NumeroArma].GetComponent(GunStatus);
		ArmasEstadoScript = Balas[NumeroArma].GetComponent(ArmasEstado);
		ActualizarValoresBalas();
		
		//PuntoDisparo = Armas[NumeroArma].GetComponentInChildren(DisableRender).gameObject.transform.position;
		GUIArmas.texture = GUITexturasArmas[NumeroArma];
		/*for(var i : int = 0; i < Armas.Length; i++){
			var ArmasScript : ArmasEstado = Armas[i].GetComponent(ArmasEstado);
			ArmasScript.MunicionActual = ArmasScript.MunicionTotal * ArmasScript.PorcentajeRecargaMunicion / 100;
			}*/
		GUICargadores.text = GunStatusScript.CargadoresActuales.ToString();
		GUIBalas.text = GunStatusScript.BalasActualesEnCargador.ToString();
	}
	
	function ActualizarValoresBalas(){
		ArmasEstadoScript.TiempoDestruccion = GunStatusScript.TiempoDestruccion;
		ArmasEstadoScript.Aceleracion = GunStatusScript.Aceleracion;
		ArmasEstadoScript.UseRotation = GunStatusScript.UseRotation;
		ArmasEstadoScript.ProyectilAutoRotacion = GunStatusScript.ProyectilAutoRotacion;
		ArmasEstadoScript.VelocidadRotacion = GunStatusScript.VelocidadRotacion;
		ArmasEstadoScript.Damage = GunStatusScript.Damage;
		ArmasEstadoScript.RatioDeDisparo = GunStatusScript.RatioDeDisparo;
		ArmasEstadoScript.SplashObject = GunStatusScript.SplashObject;
		ArmasEstadoScript.Decall = GunStatusScript.Decall;
	}
	
	function Update () {
		if(!FPCStatus.IsFire2Pressed) {
			if(Input.GetKey ("1")){
				NumeroArma = 0;
				GunStatusScript = Armas[NumeroArma].GetComponent(GunStatus);
				ArmasEstadoScript = Balas[NumeroArma].GetComponent(ArmasEstado);
				//PuntoDisparo = Armas[NumeroArma].GetComponentInChildren(DisableRender).gameObject.transform.position;
				GUIArmas.texture = GUITexturasArmas[NumeroArma];
				GUICargadores.text = GunStatusScript.CargadoresActuales.ToString();
				ManejadorDeDibujoDeArmas.SendMessage ("ActivarArma",  NumeroArma);
				this.gameObject.SendMessage ("ActivarArma");
				GUIBalas.text = GunStatusScript.BalasActualesEnCargador.ToString();
				if(GunStatusScript.isInicialized){
					Armas[NumeroArma].SendMessage("ReasignOriginalValues", GunStatusScript.OrigPosGunNormal);
					Armas[NumeroArma].SendMessage("ReasignOriginalRotValues", GunStatusScript.OrigRotGunNormal);
				}
			}
			else
			if(Input.GetKey ("2")){
				NumeroArma = 1;
				GunStatusScript = Armas[NumeroArma].GetComponent(GunStatus);
				ArmasEstadoScript = Balas[NumeroArma].GetComponent(ArmasEstado);
				//PuntoDisparo = Armas[NumeroArma].GetComponentInChildren(DisableRender).gameObject.transform.position;
				GUIArmas.texture = GUITexturasArmas[NumeroArma];
				GUICargadores.text = GunStatusScript.CargadoresActuales.ToString();
				GUIBalas.text = GunStatusScript.BalasActualesEnCargador.ToString();
				ManejadorDeDibujoDeArmas.SendMessage ("ActivarArma",  NumeroArma);
				this.gameObject.SendMessage ("ActivarArma");
				// Intento que no haya errores al cambiar de arma, asignando siempre un valor de posicion inicial predefinido.
				if(GunStatusScript.isInicialized){
					Armas[NumeroArma].SendMessage("ReasignOriginalValues", GunStatusScript.OrigPosGunNormal);
					Armas[NumeroArma].SendMessage("ReasignOriginalRotValues", GunStatusScript.OrigRotGunNormal);
				}
			}
			else
			if(Input.GetKey ("3")){
				NumeroArma = 2;
				GunStatusScript = Armas[NumeroArma].GetComponent(GunStatus);
				ArmasEstadoScript = Balas[NumeroArma].GetComponent(ArmasEstado);
				//PuntoDisparo = Armas[NumeroArma].GetComponentInChildren(DisableRender).gameObject.transform.position;
				GUIArmas.texture = GUITexturasArmas[NumeroArma];
				GUICargadores.text = GunStatusScript.CargadoresActuales.ToString();
				GUIBalas.text = GunStatusScript.BalasActualesEnCargador.ToString();
				ManejadorDeDibujoDeArmas.SendMessage ("ActivarArma",  NumeroArma);
				this.gameObject.SendMessage ("ActivarArma");
				if(GunStatusScript.isInicialized){
					Armas[NumeroArma].SendMessage("ReasignOriginalValues", GunStatusScript.OrigPosGunNormal);
					Armas[NumeroArma].SendMessage("ReasignOriginalRotValues", GunStatusScript.OrigRotGunNormal);
				}
			}
		}
		
		if(DrawRay){
			var direction : Vector3 = Camera.main.transform.TransformDirection(Vector3.forward);
			// Precision de la bala normal o apuntando).
			if(!FPCStatus.IsAiming && GunStatusScript.Precision != 0)
				Bulletdirection = SprayDirection(direction);
			else
			if(FPCStatus.IsAiming && GunStatusScript.aimPrecision != 0)
				Bulletdirection = AimSprayDirection(direction);
			else
				Bulletdirection = direction;
	
			direction.z += 0.1;
			Debug.DrawRay (Camera.main.transform.position/*+direction*/, Bulletdirection * 10, Color.green);
		}
		
		if(FPCStatus.IsFire1Pressed && (Time.time > TiempoDeDisparo) ){
			// Si NO queremos que dispare miestras salta SIN apuntar.
			if(FPCStatus.IsJumping && !FPCStatus.IsAiming)
			return;
			
			if(FPCStatus.isReloading)
				return;
			
			if(GunStatusScript.BalasActualesEnCargador > 0)
				FPCStatus.isShooting = true;
			else
				FPCStatus.isShooting = false;
			
			// Crear el disparo.
			if(GunStatusScript.Tipo ==  TiposDisparo.Proyectil){
				if(GunStatusScript.BalasActualesEnCargador > 0){
					// Esta forma de encontrar el punto de disparo es cara. Hay que encontrar otra forma que no implique
					// tener que buscar el punto de disparo cada vez que se dispara (actualizandolo cuando cambio de estado
					// en el FPC, sería lo suyo???)
					PuntoDisparo = Armas[NumeroArma].GetComponentInChildren(DisableRender).gameObject.transform.position;
					var CloneFire : GameObject = Instantiate (Balas[NumeroArma], PuntoDisparo, Camera.main.transform.rotation);
					Instantiate(GunStatusScript.Destello, PuntoDisparo, Camera.main.transform.rotation);
					FireSound.PlayOneShot(Sonidos[NumeroArma]);
					
					direction = Camera.main.transform.TransformDirection(Vector3.forward);
					// Precision de la bala normal o apuntando).
					if(!FPCStatus.IsAiming && GunStatusScript.Precision != 0)
						Bulletdirection = SprayDirection(direction);
					else
					if(FPCStatus.IsAiming && GunStatusScript.aimPrecision != 0)
						Bulletdirection = AimSprayDirection(direction);
					else
						Bulletdirection = direction;
						
					var hit : RaycastHit;
					if(Physics.Raycast(Camera.main.transform.position, Bulletdirection, hit, 1000)){
						direction = transform.position - hit.point;
						Bulletdirection.z += GunStatusScript.Aceleracion;
						CloneFire.transform.LookAt(hit.point);
						CloneFire.rigidbody.AddRelativeForce(Bulletdirection, ForceMode.VelocityChange);
					}
					else{
						direction = transform.TransformDirection(Vector3.forward);
						Bulletdirection = SprayDirection(direction);
						Bulletdirection.z += GunStatusScript.Aceleracion;
						CloneFire.rigidbody.AddRelativeForce(Bulletdirection, ForceMode.VelocityChange);
					}
					//Camera.main.gameObject.SendMessage("SetOffsetY", GunStatusScript.KickBack);
				}
			}
			else
			if(GunStatusScript.Tipo ==  TiposDisparo.Inmediato){
				if(GunStatusScript.BalasActualesEnCargador > 0){
					PuntoDisparo = Armas[NumeroArma].GetComponentInChildren(DisableRender).gameObject.transform.position;
					Instantiate(GunStatusScript.Destello, PuntoDisparo, Camera.main.transform.rotation);
					FireSound.PlayOneShot(Sonidos[NumeroArma]);
					direction = Camera.main.transform.TransformDirection(Vector3.forward);
					
					// Precision de la bala normal o apuntando).
					if(!FPCStatus.IsAiming && GunStatusScript.Precision != 0)
						Bulletdirection = SprayDirection(direction);
					else
					if(FPCStatus.IsAiming && GunStatusScript.aimPrecision != 0)
						Bulletdirection = AimSprayDirection(direction);
					else
						Bulletdirection = direction;
						
					//var hit : RaycastHit;
					direction.z += 0.1;
					if(Physics.Raycast(Camera.main.transform.position+direction, Bulletdirection, hit, 1000)){
						//Debug.Log("Nombre  "+hit.transform.name);
						if( (hit.collider.gameObject.tag != "Enemy") && 
							(hit.collider.gameObject.tag != "Player") &&
							(hit.collider.gameObject.tag != "Armas") &&
							(hit.collider.gameObject.tag != "EndGame") ){
							var pos : Vector3 = hit.point;
							var rot : Quaternion = Quaternion.identity;
							if(GunStatusScript.UseRotation == true)
								rot = Quaternion.FromToRotation(Vector3.forward, hit.normal);
							var MySplashObj : GameObject = Instantiate(GunStatusScript.SplashObject, pos, rot);
							if(hit.transform.renderer != null){
								var MyColor : Color = hit.transform.renderer.material.color;
								var MyParticleColor : ParticleChangeColor = MySplashObj.GetComponent(typeof(ParticleChangeColor));
								MyParticleColor.MyColor = MyColor;
							}
							
							var rotDecall : Quaternion= Quaternion.FromToRotation(Vector3.up, hit.normal);
							var DecallObj : GameObject = Instantiate(GunStatusScript.Decall, pos, rotDecall);
							DecallObj.transform.position.y += 0.1;
							DecallObj.transform.parent = hit.transform;
						}
						
						if(hit.collider.gameObject.tag == "Blanco")
						hit.collider.gameObject.SendMessage ("DecrementaSalud",  GunStatusScript.Damage);
						else
						if(hit.collider.gameObject.tag == "Enemy")
						hit.collider.gameObject.SendMessage ("DecrementaSalud",  GunStatusScript.Damage);
					}
					//Camera.main.gameObject.SendMessage("SetOffsetY", GunStatusScript.KickBack);
				}
			}
			TiempoDeDisparo = Time.time + GunStatusScript.RatioDeDisparo;
			
			// Decremento la municion y la escribo
			if(GunStatusScript.BalasActualesEnCargador > 0){
				//PropArmas.MunicionActual--;
				GunStatusScript.BalasActualesEnCargador--;
				GUIBalas.text = GunStatusScript.BalasActualesEnCargador.ToString();
			}
		}
		else{
			FPCStatus.isShooting = false;
		}
		
	}
	
	function SprayDirection(direction : Vector3) : Vector3 {
		direction.x += (1 - 2 * Random.value) * GunStatusScript.Precision;
		direction.y += (1 - 2 * Random.value) * GunStatusScript.Precision;
		direction.z += (1 - 2 * Random.value) * GunStatusScript.Precision;
		//var direction = 1.0;
		//return transform.TransformDirection(Vector3(vx,vy,vz));
		return direction;
	}
	
	function AimSprayDirection(direction : Vector3) : Vector3 {
		direction.x += (1 - 2 * Random.value) * GunStatusScript.aimPrecision;
		direction.y += (1 - 2 * Random.value) * GunStatusScript.aimPrecision;
		direction.z += (1 - 2 * Random.value) * GunStatusScript.aimPrecision;
		//var direction = 1.0;
		//return transform.TransformDirection(Vector3(vx,vy,vz));
		return direction;
	}