break;
case WeaponArcAnimation.None:
var xformQuery = GetEntityQuery<TransformComponent>();
- var (mapPos, mapRot) = _transform.GetWorldPositionRotation(userXform, xformQuery);
+ var (mapPos, mapRot) = TransformSystem.GetWorldPositionRotation(userXform, xformQuery);
var xform = xformQuery.GetComponent(animationUid);
xform.AttachToGridOrMap();
var worldPos = mapPos + (mapRot - userXform.LocalRotation).RotateVec(localPos);
- var newLocalPos = _transform.GetInvWorldMatrix(xform.ParentUid, xformQuery).Transform(worldPos);
- _transform.SetLocalPositionNoLerp(xform, newLocalPos);
+ var newLocalPos = TransformSystem.GetInvWorldMatrix(xform.ParentUid, xformQuery).Transform(worldPos);
+ TransformSystem.SetLocalPositionNoLerp(xform, newLocalPos);
if (arcComponent.Fadeout)
_animation.Play(animationUid, GetFadeAnimation(sprite, 0f, 0.15f), FadeAnimationKey);
break;
if (MapManager.TryFindGridAt(mousePos, out var grid))
{
- coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, _transform, EntityManager);
+ coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, TransformSystem, EntityManager);
}
else
{
- coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, _transform, EntityManager);
+ coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, TransformSystem, EntityManager);
}
if (_stateManager.CurrentState is GameplayStateBase screen)
// ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
if (MapManager.TryFindGridAt(mousePos, out var grid))
{
- coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, _transform, EntityManager);
+ coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, TransformSystem, EntityManager);
}
else
{
- coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, _transform, EntityManager);
+ coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, TransformSystem, EntityManager);
}
ClientHeavyAttack(entity, coordinates, weaponUid, weapon);
// ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
if (MapManager.TryFindGridAt(mousePos, out var grid))
{
- coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, _transform, EntityManager);
+ coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, TransformSystem, EntityManager);
}
else
{
- coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, _transform, EntityManager);
+ coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, TransformSystem, EntityManager);
}
EntityUid? target = null;
private void ClientHeavyAttack(EntityUid user, EntityCoordinates coordinates, EntityUid meleeUid, MeleeWeaponComponent component)
{
// Only run on first prediction to avoid the potential raycast entities changing.
- if (!TryComp<TransformComponent>(user, out var userXform) || !Timing.IsFirstTimePredicted)
+ if (!TryComp<TransformComponent>(user, out var userXform) ||
+ !Timing.IsFirstTimePredicted)
+ {
return;
+ }
- var targetMap = coordinates.ToMap(EntityManager, _transform);
+ var targetMap = coordinates.ToMap(EntityManager, TransformSystem);
if (targetMap.MapId != userXform.MapID)
return;
- var userPos = _transform.GetWorldPosition(userXform);
+ var userPos = TransformSystem.GetWorldPosition(userXform);
var direction = targetMap.Position - userPos;
var distance = Math.Min(component.Range, direction.Length);
// This should really be improved. GetEntitiesInArc uses pos instead of bounding boxes.
// Server will validate it with InRangeUnobstructed.
- var entities = ArcRayCast(userPos, direction.ToWorldAngle(), component.Angle, distance, userXform.MapID, user);
- RaisePredictiveEvent(new HeavyAttackEvent(meleeUid, entities.ToList(), coordinates));
+ var entities = ArcRayCast(userPos, direction.ToWorldAngle(), component.Angle, distance, userXform.MapID, user).ToList();
+ RaisePredictiveEvent(new HeavyAttackEvent(meleeUid, entities.GetRange(0, Math.Min(MaxTargets, entities.Count)), coordinates));
}
protected override void Popup(string message, EntityUid? uid, EntityUid? user)
using Content.Shared.Weapons.Melee.Components;
using Content.Shared.Weapons.Melee.Events;
using Robust.Shared.Audio;
+using Robust.Shared.Collections;
using Robust.Shared.GameStates;
using Robust.Shared.Map;
using Robust.Shared.Physics;
[Dependency] protected readonly SharedInteractionSystem Interaction = default!;
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
[Dependency] protected readonly SharedPopupSystem PopupSystem = default!;
- [Dependency] protected readonly SharedTransformSystem _transform = default!;
+ [Dependency] protected readonly SharedTransformSystem TransformSystem = default!;
[Dependency] private readonly StaminaSystem _stamina = default!;
protected ISawmill Sawmill = default!;
public const float DamagePitchVariation = 0.05f;
private const int AttackMask = (int) (CollisionGroup.MobMask | CollisionGroup.Opaque);
+ /// <summary>
+ /// Maximum amount of targets allowed for a wide-attack.
+ /// </summary>
+ public const int MaxTargets = 5;
+
/// <summary>
/// If an attack is released within this buffer it's assumed to be full damage.
/// </summary>
throw new NotImplementedException();
}
- DoLungeAnimation(user, weapon.Angle, attack.Coordinates.ToMap(EntityManager, _transform), weapon.Range, animation);
+ DoLungeAnimation(user, weapon.Angle, attack.Coordinates.ToMap(EntityManager, TransformSystem), weapon.Range, animation);
weapon.Attacking = true;
Dirty(weapon);
}
if (!TryComp<TransformComponent>(user, out var userXform))
return;
- var targetMap = ev.Coordinates.ToMap(EntityManager, _transform);
+ var targetMap = ev.Coordinates.ToMap(EntityManager, TransformSystem);
if (targetMap.MapId != userXform.MapID)
return;
- var userPos = _transform.GetWorldPosition(userXform);
+ var userPos = TransformSystem.GetWorldPosition(userXform);
var direction = targetMap.Position - userPos;
var distance = Math.Min(component.Range, direction.Length);
return;
}
+ // Naughty input
+ if (entities.Count > MaxTargets)
+ {
+ entities.RemoveRange(MaxTargets, entities.Count - MaxTargets);
+ }
+
// Validate client
for (var i = entities.Count - 1; i >= 0; i--)
{
if (!TryComp<TransformComponent>(user, out var userXform))
return;
- var invMatrix = _transform.GetInvWorldMatrix(userXform);
+ var invMatrix = TransformSystem.GetInvWorldMatrix(userXform);
var localPos = invMatrix.Transform(coordinates.Position);
if (localPos.LengthSquared <= 0f)