Melee weapons can only hit one character per swing (makes stun batons & medical syringes less OP). Closes #814, closes #865

This commit is contained in:
Joonas Rikkonen
2018-11-15 20:45:04 +02:00
parent 98e05e8483
commit df202d5a18

View File

@@ -41,6 +41,13 @@ namespace Barotrauma.Items.Components
set { reload = Math.Max(0.0f, value); }
}
[Serialize(false, false)]
public bool AllowHitMultiple
{
get;
set;
}
public MeleeWeapon(Item item, XElement element)
: base(item, element)
{
@@ -218,21 +225,43 @@ namespace Barotrauma.Items.Components
targetLimb = (Limb)f2.Body.UserData;
if (targetLimb.IsSevered || targetLimb.character == null) return false;
targetCharacter = targetLimb.character;
if (hitTargets.Contains(targetCharacter)) return false;
if (targetCharacter == picker) return false;
if (AllowHitMultiple)
{
if (hitTargets.Contains(targetCharacter)) return false;
}
else
{
if (hitTargets.Any(t => t is Character)) return false;
}
hitTargets.Add(targetCharacter);
}
else if (f2.Body.UserData is Character)
{
targetCharacter = (Character)f2.Body.UserData;
if (targetCharacter == picker) return false;
targetLimb = targetCharacter.AnimController.GetLimb(LimbType.Torso); //Otherwise armor can be bypassed in strange ways
if (hitTargets.Contains(targetCharacter)) return false;
if (AllowHitMultiple)
{
if (hitTargets.Contains(targetCharacter)) return false;
}
else
{
if (hitTargets.Any(t => t is Character)) return false;
}
hitTargets.Add(targetCharacter);
}
else if (f2.Body.UserData is Structure)
{
targetStructure = (Structure)f2.Body.UserData;
if (hitTargets.Contains(targetStructure)) return false;
if (AllowHitMultiple)
{
if (hitTargets.Contains(targetStructure)) return true;
}
else
{
if (hitTargets.Any(t => t is Structure)) return true;
}
hitTargets.Add(targetStructure);
}
else
@@ -240,8 +269,6 @@ namespace Barotrauma.Items.Components
return false;
}
if (targetCharacter == picker) return false;
if (attack != null)
{
if (targetLimb != null)
@@ -278,7 +305,7 @@ namespace Barotrauma.Items.Components
}
if (targetCharacter != null) //TODO: Allow OnUse to happen on structures too maybe??
ApplyStatusEffects(ActionType.OnUse, 1.0f, targetCharacter != null ? targetCharacter : null);
ApplyStatusEffects(ActionType.OnUse, 1.0f, targetCharacter);
if (DeleteOnUse)
{