IEnumerator FireLaser()
{
while(true) {
RaycastHit rhInfo;
int layerMask = ~(1<<9);
if(Random.Range(0.0f,1.0f) < 0.05f) {
yield return new WaitForSeconds(4.0f); // randomly hold to reload or whatever
} else {
yield return new WaitForSeconds(ROF);
}
if(PlayerControl.instance.isDead) {
break;
}
if(holdFire) {
continue;
}
if(needsLOS) {
if(Physics.Raycast( transform.position,
PlayerControl.instance.transform.position-transform.position,
out rhInfo,
maxRange,
layerMask)) {
if(rhInfo.collider.tag != "Player") {
//Debug.Log ("LOOKING AT SOMETHING ELSE");
continue; // view is blocked
} /*else {
Debug.Log ("CAN SEE FIRE AT WILL");
}*/
} else { // player was out of range or otherwise nothing was found
//Debug.Log ("DID NOT FIND PLAYER");
continue;
}
}
float missBy = inaccuracyArcMax;
if(Camera.main == null) {
missBy = 4.0f;
}
Transform aimRel = (Camera.main ? Camera.main.transform : PlayerControl.instance.transform);
Quaternion missQuat = Quaternion.AngleAxis(Random.Range(-missBy,missBy),aimRel.up);
missQuat = missQuat * Quaternion.AngleAxis(Random.Range(-missBy,missBy),aimRel.right);
Quaternion aimToFire = fireFromPos.rotation;
aimToFire = missQuat * aimToFire;
Vector3 skipBarrel = transform.forward;
if(needsLOS && Physics.Raycast( fireFromPos.position,
Vector3.zero + missQuat * skipBarrel * 200.0f,
out rhInfo,
5000.0f,
layerMask) && rhInfo.collider.tag != "Player") {
// Debug.Log ("CANNON MUZZLE BLOCKED BY " + rhInfo.collider.name);
continue;
}
if(spawnLimited==false || SpawnTicketBooth.instance.requestSpawnTicket()) {
GameObject newGO = (GameObject)GameObject.Instantiate( laserPrefab,
fireFromPos.position + missQuat * skipBarrel * 30.0f,
aimToFire * Quaternion.AngleAxis(90.0f,Vector3.right));
if(newGO.GetComponent<LittleShipAI>() != null) {
newGO.transform.parent = shipKeeper;
} else {
newGO.transform.parent = laserKeeper;
}
if(spawnLimited) {
Shootable reportWhenDead = newGO.GetComponent<Shootable>();
reportWhenDead.reportDeath = true;
}
}
}
}