/// <summary> /// Fires hitscan entities and then displays their effects /// </summary> private void FireHitscan(IEntity shooter, HitscanComponent hitscan, Angle angle) { var ray = new CollisionRay(Owner.Transform.Coordinates.ToMapPos(Owner.EntityManager), angle.ToVec(), (int)hitscan.CollisionMask); var physicsManager = EntitySystem.Get <SharedBroadPhaseSystem>(); var rayCastResults = physicsManager.IntersectRay(Owner.Transform.MapID, ray, hitscan.MaxLength, shooter, false).ToList(); if (rayCastResults.Count >= 1) { var result = rayCastResults[0]; var distance = result.Distance; hitscan.FireEffects(shooter, distance, angle, result.HitEntity); if (!result.HitEntity.TryGetComponent(out IDamageableComponent? damageable)) { return; } damageable.ChangeDamage(hitscan.DamageType, (int)Math.Round(hitscan.Damage, MidpointRounding.AwayFromZero), false, Owner); //I used Math.Round over Convert.toInt32, as toInt32 always rounds to //even numbers if halfway between two numbers, rather than rounding to nearest } else { hitscan.FireEffects(shooter, hitscan.MaxLength, angle); } }
/// <summary> /// Fires hitscan entities and then displays their effects /// </summary> private void FireHitscan(IEntity shooter, HitscanComponent hitscan, Angle angle) { var ray = new CollisionRay(Owner.Transform.Coordinates.ToMapPos(Owner.EntityManager), angle.ToVec(), (int)hitscan.CollisionMask); var physicsManager = EntitySystem.Get <SharedPhysicsSystem>(); var rayCastResults = physicsManager.IntersectRay(Owner.Transform.MapID, ray, hitscan.MaxLength, shooter, false).ToList(); if (rayCastResults.Count >= 1) { var result = rayCastResults[0]; var distance = result.Distance; hitscan.FireEffects(shooter, distance, angle, result.HitEntity); EntitySystem.Get <DamageableSystem>().TryChangeDamage(result.HitEntity.Uid, hitscan.Damage); } else { hitscan.FireEffects(shooter, hitscan.MaxLength, angle); } }
/// <summary> /// Fires hitscan entities and then displays their effects /// </summary> private void FireHitscan(EntityUid shooter, HitscanComponent hitscan, ServerRangedBarrelComponent component, Angle angle) { var ray = new CollisionRay(Transform(component.Owner).WorldPosition, angle.ToVec(), (int)hitscan.CollisionMask); var rayCastResults = _physics.IntersectRay(Transform(component.Owner).MapID, ray, hitscan.MaxLength, shooter, false).ToList(); if (rayCastResults.Count >= 1) { var result = rayCastResults[0]; var distance = result.Distance; hitscan.FireEffects(shooter, distance, angle, result.HitEntity); var dmg = _damageable.TryChangeDamage(result.HitEntity, hitscan.Damage); if (dmg != null) { _logs.Add(LogType.HitScanHit, $"{EntityManager.ToPrettyString(shooter):user} hit {EntityManager.ToPrettyString(result.HitEntity):target} using {EntityManager.ToPrettyString(hitscan.Owner):used} and dealt {dmg.Total:damage} damage"); } } else { hitscan.FireEffects(shooter, hitscan.MaxLength, angle); } }
/// <summary> /// Fires hitscan entities and then displays their effects /// </summary> private void FireHitscan(EntityUid shooter, HitscanComponent hitscan, Angle angle) { var ray = new CollisionRay(_entities.GetComponent <TransformComponent>(Owner).Coordinates.ToMapPos(_entities), angle.ToVec(), (int)hitscan.CollisionMask); var physicsManager = EntitySystem.Get <SharedPhysicsSystem>(); var rayCastResults = physicsManager.IntersectRay(_entities.GetComponent <TransformComponent>(Owner).MapID, ray, hitscan.MaxLength, shooter, false).ToList(); if (rayCastResults.Count >= 1) { var result = rayCastResults[0]; var distance = result.Distance; hitscan.FireEffects(shooter, distance, angle, result.HitEntity); var dmg = EntitySystem.Get <DamageableSystem>().TryChangeDamage(result.HitEntity, hitscan.Damage); if (dmg != null) { EntitySystem.Get <AdminLogSystem>().Add(LogType.HitScanHit, $"{shooter} hit {result.HitEntity} using {hitscan.Owner} and dealt {dmg.Total} damage"); } } else { hitscan.FireEffects(shooter, hitscan.MaxLength, angle); } }