v0.19.8.0

This commit is contained in:
Juan Pablo Arce
2022-09-28 21:30:52 -03:00
parent fec8131243
commit 3ca584f2fc
152 changed files with 1931 additions and 1071 deletions
@@ -46,7 +46,7 @@ namespace Barotrauma.Items.Components
private float forceLockTimer;
//if the submarine isn't in the correct position to lock within this time after docking has been activated,
//force the sub to the correct position
const float ForceLockDelay = 1.0f;
const float ForceLockDelay = 1.0f;
public int DockingDir { get; set; }
@@ -81,12 +81,18 @@ namespace Barotrauma.Items.Components
set;
}
[Editable, Serialize(DirectionType.None, IsPropertySaveable.No, description: "Which direction the port is allowed to dock in. For example, \"Top\" would mean the port can dock to another port above it.\n"+
[Editable, Serialize(DirectionType.None, IsPropertySaveable.No, description: "Which direction the port is allowed to dock in. For example, \"Top\" would mean the port can dock to another port above it.\n" +
"Normally there's no need to touch this setting, but if you notice the docking position is incorrect (for example due to some unusual docking port configuration without hulls or doors), you can use this to enforce the direction.")]
public DirectionType ForceDockingDirection { get; set; }
public DockingPort DockingTarget { get; private set; }
/// <summary>
/// Can be used by status effects
/// </summary>
public bool AtStartExit => Item.Submarine is { AtStartExit: true};
public bool AtEndExit => Item.Submarine is { AtEndExit: true };
public Door Door { get; private set; }
public bool Docked
@@ -116,6 +122,8 @@ namespace Barotrauma.Items.Components
get { return joint is WeldJoint || DockingTarget?.joint is WeldJoint; }
}
public bool AnotherPortInProximity => FindAdjacentPort() != null;
/// <summary>
/// Automatically cleared after docking -> no need to unregister
/// </summary>
@@ -989,7 +997,7 @@ namespace Barotrauma.Items.Components
dockingState = MathHelper.Lerp(dockingState, 0.0f, deltaTime * 10.0f);
if (dockingState < 0.01f) { docked = false; }
item.SendSignal("0", "state_out");
item.SendSignal((FindAdjacentPort() != null) ? "1" : "0", "proximity_sensor");
item.SendSignal(AnotherPortInProximity ? "1" : "0", "proximity_sensor");
}
else
{
@@ -153,7 +153,7 @@ namespace Barotrauma.Items.Components
{
if (GetAvailableInstantaneousBatteryPower() >= PowerConsumption)
{
List<PowerContainer> batteries = GetConnectedBatteries();
List<PowerContainer> batteries = GetDirectlyConnectedBatteries();
float neededPower = PowerConsumption;
while (neededPower > 0.0001f && batteries.Count > 0)
{
@@ -111,6 +111,12 @@ namespace Barotrauma.Items.Components
}
ApplyStatusEffects(ActionType.OnActive, deltaTime, picker);
//return if the status effect got rid of the picker somehow
if (picker == null || picker.Removed || !picker.HeldItems.Contains(item))
{
IsActive = false;
return;
}
if (item.body.Dir != picker.AnimController.Dir) { item.FlipX(relativeToSub: false); }
@@ -53,7 +53,7 @@ namespace Barotrauma.Items.Components
private bool alwaysContainedItemsSpawned;
public ItemInventory Inventory;
public readonly ItemInventory Inventory;
private readonly List<ActiveContainedItem> activeContainedItems = new List<ActiveContainedItem>();
@@ -189,6 +189,16 @@ namespace Barotrauma.Items.Components
[Serialize(false, IsPropertySaveable.No)]
public bool RemoveContainedItemsOnDeconstruct { get; set; }
/// <summary>
/// Can be used by status effects to lock the inventory
/// </summary>
public bool Locked
{
get { return Inventory.Locked; }
set { Inventory.Locked = value; }
}
private readonly ImmutableArray<SlotRestrictions> slotRestrictions;
readonly List<ISerializableEntity> targets = new List<ISerializableEntity>();
@@ -136,6 +136,13 @@ namespace Barotrauma.Items.Components
public float Zoom
{
get { return zoom; }
set
{
zoom = MathHelper.Clamp(value, MinZoom, MaxZoom);
#if CLIENT
zoomSlider.BarScroll = MathUtils.InverseLerp(MinZoom, MaxZoom, zoom);
#endif
}
}
public Mode CurrentMode
@@ -278,7 +278,8 @@ namespace Barotrauma.Items.Components
public override float GetConnectionPowerOut(Connection conn, float power, PowerRange minMaxPower, float load)
{
return conn == powerOut ? PowerConsumption + ExtraLoad : 0;
//not used in the vanilla game (junction boxes or relays don't output power)
return conn == powerOut ? MathHelper.Max(-(PowerConsumption + ExtraLoad), 0) : 0;
}
public override bool Pick(Character picker)
@@ -690,43 +690,21 @@ namespace Barotrauma.Items.Components
}
/// <summary>
/// Efficient method to retrieve the batteries connected to the device
/// Returns a list of batteries directly connected to the item
/// </summary>
/// <returns>All connected PowerContainers</returns>
protected List<PowerContainer> GetConnectedBatteries(bool outputOnly = true)
protected List<PowerContainer> GetDirectlyConnectedBatteries()
{
List<PowerContainer> batteries = new List<PowerContainer>();
GridInfo supplyingGrid = null;
//Determine supplying grid, prefer PowerIn connection
if (powerIn != null)
if (item.Connections == null || powerIn == null) { return batteries; }
foreach (Connection recipient in powerIn.Recipients)
{
if (powerIn.Grid != null)
if (!recipient.IsPower || !recipient.IsOutput) { continue; }
var battery = recipient.Item?.GetComponent<PowerContainer>();
if (battery != null)
{
supplyingGrid = powerIn.Grid;
batteries.Add(battery);
}
}
else if (powerOut != null)
{
if (powerOut.Grid != null)
{
supplyingGrid = powerOut.Grid;
}
}
if (supplyingGrid != null)
{
//Iterate through all connections to fine powerContainers
foreach (Connection c in supplyingGrid.Connections)
{
PowerContainer pc = c.Item.GetComponent<PowerContainer>();
if (pc != null && (!outputOnly || pc.powerOut == c))
{
batteries.Add(pc);
}
}
}
return batteries;
}
@@ -29,18 +29,7 @@ namespace Barotrauma.Items.Components
FirepowerMultiplier,
StrikingPowerMultiplier,
StrikingSpeedMultiplier,
FiringRateMultiplier,
// unused as of now
AttackMultiplier,
// unused as of now
AttackSpeedMultiplier,
ForceDoorsOpenSpeedMultiplier,
RangedSpreadReduction,
ChargeSpeedMultiplier,
MovementSpeedMultiplier,
EffectivenessMultiplier,
PowerOutputMultiplier,
ConsumptionReductionMultiplier,
FiringRateMultiplier
}
private readonly Dictionary<StatType, float> statValues = new Dictionary<StatType, float>();
@@ -603,6 +603,9 @@ namespace Barotrauma.Items.Components
private bool ShouldDeteriorate()
{
if (Level.IsLoadedFriendlyOutpost) { return false; }
#if CLIENT
if (GameMain.GameSession?.GameMode is TutorialMode) { return false; }
#endif
if (LastActiveTime > Timing.TotalTime) { return true; }
foreach (ItemComponent ic in item.Components)
@@ -48,6 +48,8 @@ namespace Barotrauma.Items.Components
{
if (value == null) { return; }
output = value;
//reactivate (we may not have been previously sending a signal, but might now)
IsActive = true;
if (output.Length > MaxOutputLength && (item.Submarine == null || !item.Submarine.Loading))
{
output = output.Substring(0, MaxOutputLength);
@@ -63,6 +65,8 @@ namespace Barotrauma.Items.Components
{
if (value == null) { return; }
falseOutput = value;
//reactivate (we may not have been previously sending a signal, but might now)
IsActive = true;
if (falseOutput.Length > MaxOutputLength && (item.Submarine == null || !item.Submarine.Loading))
{
falseOutput = falseOutput.Substring(0, MaxOutputLength);
@@ -19,7 +19,8 @@ namespace Barotrauma.Items.Components
Human = 1,
Monster = 2,
Wall = 4,
Any = Human | Monster | Wall,
Pet = 8,
Any = Human | Monster | Wall | Pet,
}
[Serialize(false, IsPropertySaveable.No, description: "Has the item currently detected movement. Intended to be used by StatusEffect conditionals (setting this value in XML has no effect).")]
@@ -253,7 +254,7 @@ namespace Barotrauma.Items.Components
}
}
if (Target.HasFlag(TargetType.Human) || Target.HasFlag(TargetType.Monster))
if (Target.HasFlag(TargetType.Human) || Target.HasFlag(TargetType.Pet) || Target.HasFlag(TargetType.Monster))
{
foreach (Character c in Character.CharacterList)
{
@@ -267,7 +268,11 @@ namespace Barotrauma.Items.Components
{
if (!Target.HasFlag(TargetType.Human)) { continue; }
}
else if (!c.IsPet)
else if (c.IsPet)
{
if (!Target.HasFlag(TargetType.Pet)) { continue; }
}
else
{
if (!Target.HasFlag(TargetType.Monster)) { continue; }
}
@@ -702,7 +702,7 @@ namespace Barotrauma.Items.Components
if (!ignorePower)
{
List<PowerContainer> batteries = GetConnectedBatteries();
List<PowerContainer> batteries = GetDirectlyConnectedBatteries();
float neededPower = GetPowerRequiredToShoot();
// tinkering is currently not factored into the common method as it is checked only when shooting
@@ -1066,7 +1066,7 @@ namespace Barotrauma.Items.Components
bool canShoot = true;
if (!HasPowerToShoot())
{
List<PowerContainer> batteries = GetConnectedBatteries();
List<PowerContainer> batteries = GetDirectlyConnectedBatteries();
float lowestCharge = 0.0f;
PowerContainer batteryToLoad = null;
foreach (PowerContainer battery in batteries)
@@ -1308,9 +1308,13 @@ namespace Barotrauma.Items.Components
}
}
float dist = Vector2.Distance(closestPoint, item.WorldPosition);
//add one px to make sure the visibility raycast doesn't miss the cell due to the end position being right at the edge of the cell
closestPoint += (closestPoint - item.WorldPosition) / Math.Max(dist, 1);
if (dist > AIRange + 1000) { continue; }
float dot = 0;
if (item.Submarine.Velocity != Vector2.Zero)
if (!MathUtils.NearlyEqual(item.Submarine.Velocity, Vector2.Zero))
{
dot = Vector2.Dot(Vector2.Normalize(item.Submarine.Velocity), Vector2.Normalize(closestPoint - item.Submarine.WorldPosition));
}