using UnityEngine; using System.Collections; public class WeaponRifle : WeaponBase { public override void OnOwner(PlayerCommand cmd, BoltEntity entity) { if (entity.isOwner) { IPlayerState state = entity.GetState(); PlayerController controller = entity.GetComponent(); Vector3 pos; Quaternion look; // this calculate the looking angle for this specific entity PlayerCamera.instance.CalculateCameraAimTransform(entity.transform, state.pitch, out pos, out look); // display debug Debug.DrawRay(pos, look * Vector3.forward); //NEW float impactDistance = 100.0f; Ray r = new Ray(pos, look * Vector3.forward); RaycastHit rh; if (Physics.Raycast(r, out rh)) { impactDistance = rh.distance; Debug.Log("Unity Raycast impactDistance: " + impactDistance); Debug.Log("pos: " + pos + " rh.point: " + rh.point + " V3.Distance: " + Vector3.Distance(pos, rh.point)); } using (var hits = BoltNetwork.RaycastAll(new Ray(pos, look * Vector3.forward), cmd.ServerFrame)) { for (int i = 0; i < hits.count; ++i) { var hit = hits.GetHit(i); //NEW: watch for impacts. If hit other collider firtst, don't hit player. if (hit.distance < impactDistance) { Debug.Log("Bolt hit.distance: " + hit.distance ); Debug.Log("pos: " + pos + " hit.body.transform.position: " + hit.body.transform.position +" V3.Distance: " + Vector3.Distance(pos, hit.body.transform.position)); var serializer = hit.body.GetComponent(); if ((serializer != null) && (serializer.state.team != state.team)) { serializer.ApplyDamage(controller.activeWeapon.damagePerBullet); } } } } } } //Unchanged public override void Fx(BoltEntity entity) { Vector3 pos; Quaternion rot; PlayerCamera.instance.CalculateCameraAimTransform(entity.transform, entity.GetState().pitch, out pos, out rot); Ray r = new Ray(pos, rot * Vector3.forward); RaycastHit rh; if (Physics.Raycast(r, out rh) && impactPrefab) { var en = rh.transform.GetComponent(); var hit = GameObject.Instantiate(impactPrefab, rh.point, Quaternion.LookRotation(rh.normal)) as GameObject; if (en) { hit.GetComponent().enabled = false; } if (trailPrefab) { var trailGo = GameObject.Instantiate(trailPrefab, muzzleFlash.position, Quaternion.identity) as GameObject; var trail = trailGo.GetComponent(); trail.SetPosition(0, muzzleFlash.position); trail.SetPosition(1, rh.point); } } GameObject go = (GameObject)GameObject.Instantiate(shellPrefab, shellEjector.position, shellEjector.rotation); go.GetComponent().AddRelativeForce(0, 0, 2, ForceMode.VelocityChange); go.GetComponent().AddTorque(new Vector3(Random.Range(-32f, +32f), Random.Range(-32f, +32f), Random.Range(-32f, +32f)), ForceMode.VelocityChange); // show flash muzzleFlash.gameObject.SetActive(true); } }