Faction Test 100.9.0.0

This commit is contained in:
Markus Isberg
2022-12-05 19:55:31 +02:00
parent f7f1ebd979
commit 55e1d3560a
55 changed files with 347 additions and 3512 deletions
@@ -30,8 +30,7 @@ namespace Barotrauma.Abilities
NotSelf = 3,
Alive = 4,
Monster = 5,
InFriendlySubmarine = 6,
Large = 7,
InFriendlySubmarine = 6
};
protected List<TargetType> ParseTargetTypes(string[] targetTypeStrings)
@@ -80,9 +79,6 @@ namespace Barotrauma.Abilities
return !targetCharacter.IsHuman;
case TargetType.InFriendlySubmarine:
return targetCharacter.Submarine != null && targetCharacter.Submarine.TeamID == character.TeamID;
case TargetType.Large:
// mass of mudraptor is ~48
return targetCharacter.AnimController is { Mass: > 50.0f };
default:
return true;
}
@@ -1,21 +1,25 @@
using System;
using Barotrauma.Extensions;
using System;
using System.Collections.Immutable;
using System.Linq;
namespace Barotrauma.Abilities
{
class AbilityConditionItem : AbilityConditionData
{
private readonly string[] identifiers;
private readonly string[] tags;
private readonly ImmutableArray<Identifier> identifiers;
private readonly ImmutableArray<Identifier> tags;
private readonly MapEntityCategory category = MapEntityCategory.None;
public AbilityConditionItem(CharacterTalent characterTalent, ContentXElement conditionElement) : base(characterTalent, conditionElement)
{
identifiers = conditionElement.GetAttributeStringArray("identifiers", Array.Empty<string>(), convertToLowerInvariant: true);
tags = conditionElement.GetAttributeStringArray("tags", Array.Empty<string>(), convertToLowerInvariant: true);
identifiers = conditionElement.GetAttributeIdentifierArray("identifiers", Array.Empty<Identifier>()).ToImmutableArray();
tags = conditionElement.GetAttributeIdentifierArray("tags", Array.Empty<Identifier>()).ToImmutableArray();
category = conditionElement.GetAttributeEnum("category", MapEntityCategory.None);
if (!identifiers.Any() && !tags.Any())
if (identifiers.None() && tags.None() && category == MapEntityCategory.None)
{
DebugConsole.ThrowError($"Error in talent \"{characterTalent}\". No identifiers or tags defined.");
DebugConsole.ThrowError($"Error in talent \"{characterTalent}\". No identifiers, tags or category defined.");
}
}
@@ -33,6 +37,11 @@ namespace Barotrauma.Abilities
if (itemPrefab != null)
{
if (category != MapEntityCategory.None)
{
if (!itemPrefab.Category.HasFlag(category)) { return false; }
}
if (identifiers.Any())
{
if (!identifiers.Any(t => itemPrefab.Identifier == t))
@@ -40,7 +49,6 @@ namespace Barotrauma.Abilities
return false;
}
}
return !tags.Any() || tags.Any(t => itemPrefab.Tags.Any(p => t == p));
}
else
@@ -10,7 +10,7 @@ namespace Barotrauma.Abilities
{
foreach (Character c in GameSession.GetSessionCrewCharacters(CharacterType.Both))
{
if (c.IsUnconscious)
if (!c.IsDead && c.IsUnconscious)
{
return true;
}
@@ -34,7 +34,7 @@ namespace Barotrauma.Abilities
public bool IsViable()
{
if (!AllowClientSimulation && GameMain.NetworkMember != null && GameMain.NetworkMember.IsClient) { return false; }
if (!AllowClientSimulation && GameMain.NetworkMember is { IsClient: true }) { return false; }
if (RequiresAlive && Character.IsDead) { return false; }
return true;
}
@@ -9,6 +9,8 @@ namespace Barotrauma.Abilities
{
internal sealed class CharacterAbilityUnlockApprenticeshipTalentTree : CharacterAbility
{
public override bool AllowClientSimulation => false;
public CharacterAbilityUnlockApprenticeshipTalentTree(CharacterAbilityGroup characterAbilityGroup, ContentXElement abilityElement) : base(characterAbilityGroup, abilityElement) { }
public override void InitializeAbility(bool addingFirstTime)
@@ -426,16 +426,8 @@ namespace Barotrauma.Items.Components
item.body.FarseerBody.OnCollision += OnProjectileCollision;
item.body.FarseerBody.IsBullet = true;
if (item.body.CollisionCategories != Category.None)
{
item.body.CollisionCategories = Physics.CollisionProjectile;
item.body.CollidesWith = Physics.CollisionCharacter | Physics.CollisionWall | Physics.CollisionLevel | Physics.CollisionItemBlocking;
}
if (item.Prefab.DamagedByProjectiles && !IgnoreProjectilesWhileActive)
{
if (item.body.CollisionCategories == Category.None) { item.body.CollisionCategories = Physics.CollisionCharacter; }
item.body.CollidesWith |= Physics.CollisionProjectile;
}
EnableProjectileCollisions();
IsActive = true;
if (stickJoint == null) { return; }
@@ -560,12 +552,12 @@ namespace Barotrauma.Items.Components
}
else if (fixture?.Body == null || fixture.IsSensor)
{
//ignore sensors and items
//ignore sensors
return true;
}
if (fixture.Body.UserData is VineTile) { return true; }
if (fixture.CollidesWith == Category.None) { return true; }
if (fixture.Body.UserData is Item item && (item.GetComponent<Door>() == null && !item.Prefab.DamagedByProjectiles || item.Condition <= 0)) { return true; }
if (fixture.Body.UserData as string == "ruinroom" || fixture.Body.UserData is Hull || fixture.UserData is Hull) { return true; }
//if doing the raycast in a submarine's coordinate space, ignore anything that's not in that sub
@@ -575,13 +567,28 @@ namespace Barotrauma.Items.Components
if (fixture.Body.UserData is Entity entity && entity.Submarine != submarine) { return true; }
}
//ignore everything else than characters, sub walls and level walls
if (!fixture.CollisionCategories.HasFlag(Physics.CollisionCharacter) &&
!fixture.CollisionCategories.HasFlag(Physics.CollisionWall) &&
!fixture.CollisionCategories.HasFlag(Physics.CollisionLevel)) { return true; }
if (fixture.Body.UserData is VoronoiCell && (this.item.Submarine != null || submarine != null)) { return true; }
if (fixture.Body.UserData is Item item)
{
if (item == Item) { return true; }
if (item.Condition <= 0) { return true; }
if (!item.Prefab.DamagedByProjectiles && item.GetComponent<Door>() == null) { return true; }
}
else if (fixture.Body.UserData is Holdable { CanPush: false })
{
// Ignore holdables that can't push -> shouldn't block
return true;
}
else
{
// TODO: This might make us ignore something we don't want to ignore?
// Not item -> ignore everything else than characters, sub walls and level walls
if (!fixture.CollisionCategories.HasFlag(Physics.CollisionCharacter) &&
!fixture.CollisionCategories.HasFlag(Physics.CollisionWall) &&
!fixture.CollisionCategories.HasFlag(Physics.CollisionLevel)) { return true; }
}
fixture.Body.GetTransform(out FarseerPhysics.Common.Transform transform);
if (!fixture.Shape.TestPoint(ref transform, ref rayStart)) { return true; }
@@ -598,21 +605,17 @@ namespace Barotrauma.Items.Components
}
else if (fixture?.Body == null || fixture.IsSensor)
{
//ignore sensors and items
//ignore sensors
return -1;
}
if (fixture.Body.UserData is VineTile) { return -1; }
if (fixture.Body.UserData is Item item && (item.GetComponent<Door>() == null && !item.Prefab.DamagedByProjectiles || item.Condition <= 0)) { return -1; }
if (fixture.Body.UserData as string == "ruinroom" || fixture.Body?.UserData is Hull || fixture.UserData is Hull) { return -1; }
if (fixture.CollidesWith == Category.None) { return -1; }
if (!(fixture.Body.UserData is Holdable holdable && holdable.CanPush))
if (fixture.Body.UserData is Item item)
{
//ignore everything else than characters, sub walls and level walls
if (!fixture.CollisionCategories.HasFlag(Physics.CollisionCharacter) &&
!fixture.CollisionCategories.HasFlag(Physics.CollisionWall) &&
!fixture.CollisionCategories.HasFlag(Physics.CollisionLevel)) { return -1; }
if (item.Condition <= 0) { return -1; }
if (!item.Prefab.DamagedByProjectiles && item.GetComponent<Door>() == null) { return -1; }
}
if (fixture.Body.UserData as string == "ruinroom" || fixture.Body?.UserData is Hull || fixture.UserData is Hull) { return -1; }
//if doing the raycast in a submarine's coordinate space, ignore anything that's not in that sub
if (submarine != null)
@@ -622,6 +625,12 @@ namespace Barotrauma.Items.Components
if (fixture.Body.UserData is Limb limb && limb.character?.Submarine != submarine) { return -1; }
}
// Ignore holdables that can't push -> shouldn't block
if (fixture.Body.UserData is Holdable { CanPush: false })
{
return -1;
}
//ignore level cells if the item and the point of impact are inside a sub
if (fixture.Body.UserData is VoronoiCell)
{
@@ -652,7 +661,7 @@ namespace Barotrauma.Items.Components
hits.Add(new HitscanResult(fixture, point, normal, fraction));
return 1;
}, rayStart, rayEnd, Physics.CollisionCharacter | Physics.CollisionWall | Physics.CollisionLevel | Physics.CollisionItemBlocking);
}, rayStart, rayEnd, Physics.CollisionCharacter | Physics.CollisionWall | Physics.CollisionLevel | Physics.CollisionItemBlocking | Physics.CollisionProjectile);
return hits;
}
@@ -773,6 +782,12 @@ namespace Barotrauma.Items.Components
else if (target.Body.UserData is Item item)
{
if (item.Condition <= 0.0f) { return false; }
if (!item.Prefab.DamagedByProjectiles) { return false; }
}
else if (target.Body.UserData is Holdable { CanPush: false })
{
// Ignore holdables that can't push -> shouldn't block
return false;
}
//ignore character colliders (the projectile only hits limbs)
@@ -1068,6 +1083,20 @@ namespace Barotrauma.Items.Components
return true;
}
private void EnableProjectileCollisions()
{
if (item.body.CollisionCategories != Category.None)
{
item.body.CollisionCategories = Physics.CollisionProjectile;
item.body.CollidesWith = Physics.CollisionCharacter | Physics.CollisionWall | Physics.CollisionLevel | Physics.CollisionItemBlocking;
}
if (item.Prefab.DamagedByProjectiles && !IgnoreProjectilesWhileActive)
{
if (item.body.CollisionCategories == Category.None) { item.body.CollisionCategories = Physics.CollisionCharacter; }
item.body.CollidesWith |= Physics.CollisionProjectile;
}
}
private void DisableProjectileCollisions()
{
item.body.FarseerBody.OnCollision -= OnProjectileCollision;
@@ -10,6 +10,7 @@ namespace Barotrauma
[Flags]
enum MapEntityCategory
{
None = 0,
Structure = 1,
Decorative = 2,
Machine = 4,
@@ -35,6 +35,7 @@
{
GUI.DisableSavingIndicatorDelayed();
}
GameMain.ResetIMEWorkaround();
#endif
}