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