Truncate melee wide swings (#16242)
This commit is contained in:
@@ -154,12 +154,12 @@ public sealed partial class MeleeWeaponSystem
|
|||||||
break;
|
break;
|
||||||
case WeaponArcAnimation.None:
|
case WeaponArcAnimation.None:
|
||||||
var xformQuery = GetEntityQuery<TransformComponent>();
|
var xformQuery = GetEntityQuery<TransformComponent>();
|
||||||
var (mapPos, mapRot) = _transform.GetWorldPositionRotation(userXform, xformQuery);
|
var (mapPos, mapRot) = TransformSystem.GetWorldPositionRotation(userXform, xformQuery);
|
||||||
var xform = xformQuery.GetComponent(animationUid);
|
var xform = xformQuery.GetComponent(animationUid);
|
||||||
xform.AttachToGridOrMap();
|
xform.AttachToGridOrMap();
|
||||||
var worldPos = mapPos + (mapRot - userXform.LocalRotation).RotateVec(localPos);
|
var worldPos = mapPos + (mapRot - userXform.LocalRotation).RotateVec(localPos);
|
||||||
var newLocalPos = _transform.GetInvWorldMatrix(xform.ParentUid, xformQuery).Transform(worldPos);
|
var newLocalPos = TransformSystem.GetInvWorldMatrix(xform.ParentUid, xformQuery).Transform(worldPos);
|
||||||
_transform.SetLocalPositionNoLerp(xform, newLocalPos);
|
TransformSystem.SetLocalPositionNoLerp(xform, newLocalPos);
|
||||||
if (arcComponent.Fadeout)
|
if (arcComponent.Fadeout)
|
||||||
_animation.Play(animationUid, GetFadeAnimation(sprite, 0f, 0.15f), FadeAnimationKey);
|
_animation.Play(animationUid, GetFadeAnimation(sprite, 0f, 0.15f), FadeAnimationKey);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -101,11 +101,11 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
|
|||||||
|
|
||||||
if (MapManager.TryFindGridAt(mousePos, out var grid))
|
if (MapManager.TryFindGridAt(mousePos, out var grid))
|
||||||
{
|
{
|
||||||
coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, _transform, EntityManager);
|
coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, TransformSystem, EntityManager);
|
||||||
}
|
}
|
||||||
else
|
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)
|
if (_stateManager.CurrentState is GameplayStateBase screen)
|
||||||
@@ -136,11 +136,11 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
|
|||||||
// ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
|
// ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
|
||||||
if (MapManager.TryFindGridAt(mousePos, out var grid))
|
if (MapManager.TryFindGridAt(mousePos, out var grid))
|
||||||
{
|
{
|
||||||
coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, _transform, EntityManager);
|
coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, TransformSystem, EntityManager);
|
||||||
}
|
}
|
||||||
else
|
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);
|
ClientHeavyAttack(entity, coordinates, weaponUid, weapon);
|
||||||
@@ -177,11 +177,11 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
|
|||||||
// ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
|
// ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
|
||||||
if (MapManager.TryFindGridAt(mousePos, out var grid))
|
if (MapManager.TryFindGridAt(mousePos, out var grid))
|
||||||
{
|
{
|
||||||
coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, _transform, EntityManager);
|
coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, TransformSystem, EntityManager);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, _transform, EntityManager);
|
coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, TransformSystem, EntityManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
EntityUid? target = null;
|
EntityUid? target = null;
|
||||||
@@ -252,22 +252,25 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
|
|||||||
private void ClientHeavyAttack(EntityUid user, EntityCoordinates coordinates, EntityUid meleeUid, MeleeWeaponComponent component)
|
private void ClientHeavyAttack(EntityUid user, EntityCoordinates coordinates, EntityUid meleeUid, MeleeWeaponComponent component)
|
||||||
{
|
{
|
||||||
// Only run on first prediction to avoid the potential raycast entities changing.
|
// 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;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var targetMap = coordinates.ToMap(EntityManager, _transform);
|
var targetMap = coordinates.ToMap(EntityManager, TransformSystem);
|
||||||
|
|
||||||
if (targetMap.MapId != userXform.MapID)
|
if (targetMap.MapId != userXform.MapID)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var userPos = _transform.GetWorldPosition(userXform);
|
var userPos = TransformSystem.GetWorldPosition(userXform);
|
||||||
var direction = targetMap.Position - userPos;
|
var direction = targetMap.Position - userPos;
|
||||||
var distance = Math.Min(component.Range, direction.Length);
|
var distance = Math.Min(component.Range, direction.Length);
|
||||||
|
|
||||||
// This should really be improved. GetEntitiesInArc uses pos instead of bounding boxes.
|
// This should really be improved. GetEntitiesInArc uses pos instead of bounding boxes.
|
||||||
// Server will validate it with InRangeUnobstructed.
|
// Server will validate it with InRangeUnobstructed.
|
||||||
var entities = ArcRayCast(userPos, direction.ToWorldAngle(), component.Angle, distance, userXform.MapID, user);
|
var entities = ArcRayCast(userPos, direction.ToWorldAngle(), component.Angle, distance, userXform.MapID, user).ToList();
|
||||||
RaisePredictiveEvent(new HeavyAttackEvent(meleeUid, entities.ToList(), coordinates));
|
RaisePredictiveEvent(new HeavyAttackEvent(meleeUid, entities.GetRange(0, Math.Min(MaxTargets, entities.Count)), coordinates));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Popup(string message, EntityUid? uid, EntityUid? user)
|
protected override void Popup(string message, EntityUid? uid, EntityUid? user)
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ using Content.Shared.Popups;
|
|||||||
using Content.Shared.Weapons.Melee.Components;
|
using Content.Shared.Weapons.Melee.Components;
|
||||||
using Content.Shared.Weapons.Melee.Events;
|
using Content.Shared.Weapons.Melee.Events;
|
||||||
using Robust.Shared.Audio;
|
using Robust.Shared.Audio;
|
||||||
|
using Robust.Shared.Collections;
|
||||||
using Robust.Shared.GameStates;
|
using Robust.Shared.GameStates;
|
||||||
using Robust.Shared.Map;
|
using Robust.Shared.Map;
|
||||||
using Robust.Shared.Physics;
|
using Robust.Shared.Physics;
|
||||||
@@ -41,7 +42,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
|
|||||||
[Dependency] protected readonly SharedInteractionSystem Interaction = default!;
|
[Dependency] protected readonly SharedInteractionSystem Interaction = default!;
|
||||||
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
|
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
|
||||||
[Dependency] protected readonly SharedPopupSystem PopupSystem = 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!;
|
[Dependency] private readonly StaminaSystem _stamina = default!;
|
||||||
|
|
||||||
protected ISawmill Sawmill = default!;
|
protected ISawmill Sawmill = default!;
|
||||||
@@ -49,6 +50,11 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
|
|||||||
public const float DamagePitchVariation = 0.05f;
|
public const float DamagePitchVariation = 0.05f;
|
||||||
private const int AttackMask = (int) (CollisionGroup.MobMask | CollisionGroup.Opaque);
|
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>
|
/// <summary>
|
||||||
/// If an attack is released within this buffer it's assumed to be full damage.
|
/// If an attack is released within this buffer it's assumed to be full damage.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -379,7 +385,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
|
|||||||
throw new NotImplementedException();
|
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;
|
weapon.Attacking = true;
|
||||||
Dirty(weapon);
|
Dirty(weapon);
|
||||||
}
|
}
|
||||||
@@ -519,12 +525,12 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
|
|||||||
if (!TryComp<TransformComponent>(user, out var userXform))
|
if (!TryComp<TransformComponent>(user, out var userXform))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var targetMap = ev.Coordinates.ToMap(EntityManager, _transform);
|
var targetMap = ev.Coordinates.ToMap(EntityManager, TransformSystem);
|
||||||
|
|
||||||
if (targetMap.MapId != userXform.MapID)
|
if (targetMap.MapId != userXform.MapID)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var userPos = _transform.GetWorldPosition(userXform);
|
var userPos = TransformSystem.GetWorldPosition(userXform);
|
||||||
var direction = targetMap.Position - userPos;
|
var direction = targetMap.Position - userPos;
|
||||||
var distance = Math.Min(component.Range, direction.Length);
|
var distance = Math.Min(component.Range, direction.Length);
|
||||||
|
|
||||||
@@ -540,6 +546,12 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Naughty input
|
||||||
|
if (entities.Count > MaxTargets)
|
||||||
|
{
|
||||||
|
entities.RemoveRange(MaxTargets, entities.Count - MaxTargets);
|
||||||
|
}
|
||||||
|
|
||||||
// Validate client
|
// Validate client
|
||||||
for (var i = entities.Count - 1; i >= 0; i--)
|
for (var i = entities.Count - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
@@ -775,7 +787,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
|
|||||||
if (!TryComp<TransformComponent>(user, out var userXform))
|
if (!TryComp<TransformComponent>(user, out var userXform))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var invMatrix = _transform.GetInvWorldMatrix(userXform);
|
var invMatrix = TransformSystem.GetInvWorldMatrix(userXform);
|
||||||
var localPos = invMatrix.Transform(coordinates.Position);
|
var localPos = invMatrix.Transform(coordinates.Position);
|
||||||
|
|
||||||
if (localPos.LengthSquared <= 0f)
|
if (localPos.LengthSquared <= 0f)
|
||||||
|
|||||||
Reference in New Issue
Block a user