Unstable 0.16.3.0

This commit is contained in:
Markus Isberg
2022-02-10 02:52:08 +09:00
parent 6814a11520
commit 2190fe08ef
115 changed files with 993 additions and 453 deletions
@@ -118,6 +118,7 @@ namespace Barotrauma.Items.Components
if (character != null && !CharacterUsable) { return false; }
CurrPowerConsumption = powerConsumption;
Voltage = 0.0f;
charging = true;
timer = Duration;
IsActive = true;
@@ -141,7 +142,7 @@ namespace Barotrauma.Items.Components
timer -= deltaTime;
if (charging)
{
if (GetAvailableBatteryPower() >= powerConsumption)
if (GetAvailableInstantaneousBatteryPower() >= powerConsumption)
{
var batteries = item.GetConnectedComponents<PowerContainer>();
float neededPower = powerConsumption;
@@ -130,6 +130,11 @@ namespace Barotrauma.Items.Components
}
if (picker.Inventory.TryPutItemWithAutoEquipCheck(item, picker, allowedSlots))
{
if (item.CampaignInteractionType == CampaignMode.InteractionType.Cargo)
{
item.CampaignInteractionType = CampaignMode.InteractionType.None;
}
if (!picker.HeldItems.Contains(item) && item.body != null) { item.body.Enabled = false; }
this.picker = picker;
@@ -370,8 +370,22 @@ namespace Barotrauma.Items.Components
item.SendSignal(new Signal((ConvertUnits.ToDisplayUnits(sub.Velocity.X * Physics.DisplayToRealWorldRatio) * 3.6f).ToString("0.0000", CultureInfo.InvariantCulture), sender: user), "current_velocity_x");
item.SendSignal(new Signal((ConvertUnits.ToDisplayUnits(sub.Velocity.Y * Physics.DisplayToRealWorldRatio) * -3.6f).ToString("0.0000", CultureInfo.InvariantCulture), sender: user), "current_velocity_y");
item.SendSignal(new Signal((sub.WorldPosition.X * Physics.DisplayToRealWorldRatio).ToString("0.0000", CultureInfo.InvariantCulture), sender: user), "current_position_x");
item.SendSignal(new Signal(sub.RealWorldDepth.ToString("0.0000", CultureInfo.InvariantCulture), sender: user), "current_position_y");
Vector2 pos = new Vector2(sub.WorldPosition.X * Physics.DisplayToRealWorldRatio, sub.RealWorldDepth);
if (sonar != null && sonar.UseTransducers && sonar.CenterOnTransducers && sonar.ConnectedTransducers.Any())
{
pos = Vector2.Zero;
foreach (var connectedTransducer in sonar.ConnectedTransducers)
{
pos += connectedTransducer.Item.WorldPosition;
}
pos /= sonar.ConnectedTransducers.Count();
pos = new Vector2(
pos.X * Physics.DisplayToRealWorldRatio,
Level.Loaded?.GetRealWorldDepth(pos.Y) ?? (-pos.Y * Physics.DisplayToRealWorldRatio));
}
item.SendSignal(new Signal(pos.X.ToString("0.0000", CultureInfo.InvariantCulture), sender: user), "current_position_x");
item.SendSignal(new Signal(pos.Y.ToString("0.0000", CultureInfo.InvariantCulture), sender: user), "current_position_y");
}
// if our tactical AI pilot has left, revert back to maintaining position
@@ -302,17 +302,24 @@ namespace Barotrauma.Items.Components
/// <summary>
/// Returns the amount of power that can be supplied by batteries directly connected to the item
/// </summary>
protected float GetAvailableBatteryPower()
protected float GetAvailableInstantaneousBatteryPower()
{
var batteries = item.GetConnectedComponents<PowerContainer>();
if (item.Connections == null) { return 0.0f; }
float availablePower = 0.0f;
foreach (PowerContainer battery in batteries)
foreach (Connection c in item.Connections)
{
float batteryPower = Math.Min(battery.Charge * 3600.0f, battery.MaxOutPut);
availablePower += batteryPower;
}
var recipients = c.Recipients;
foreach (Connection recipient in recipients)
{
if (!recipient.IsPower || !recipient.IsOutput) { continue; }
var battery = recipient.Item?.GetComponent<PowerContainer>();
if (battery == null) { continue; }
float maxOutputPerFrame = battery.MaxOutPut / 60.0f;
float framesPerMinute = 3600.0f;
availablePower += Math.Min(battery.Charge * framesPerMinute, maxOutputPerFrame);
}
}
return availablePower;
}
@@ -196,6 +196,15 @@ namespace Barotrauma.Items.Components
set;
}
private float deactivationTimer;
[Serialize(0f, false)]
public float DeactivationTime
{
get;
set;
}
public Body StickTarget
{
get;
@@ -207,6 +216,9 @@ namespace Barotrauma.Items.Components
get { return StickTarget != null; }
}
private Category originalCollisionCategories;
private Category originalCollisionTargets;
public Projectile(Item item, XElement element)
: base (item, element)
{
@@ -223,21 +235,26 @@ namespace Barotrauma.Items.Components
public override void OnItemLoaded()
{
if (Attack != null && Attack.DamageRange <= 0.0f && item.body != null)
if (item.body != null)
{
switch (item.body.BodyShape)
if (Attack != null && Attack.DamageRange <= 0.0f)
{
case PhysicsBody.Shape.Circle:
Attack.DamageRange = item.body.radius;
break;
case PhysicsBody.Shape.Capsule:
Attack.DamageRange = item.body.height / 2 + item.body.radius;
break;
case PhysicsBody.Shape.Rectangle:
Attack.DamageRange = new Vector2(item.body.width / 2.0f, item.body.height / 2.0f).Length();
break;
switch (item.body.BodyShape)
{
case PhysicsBody.Shape.Circle:
Attack.DamageRange = item.body.radius;
break;
case PhysicsBody.Shape.Capsule:
Attack.DamageRange = item.body.height / 2 + item.body.radius;
break;
case PhysicsBody.Shape.Rectangle:
Attack.DamageRange = new Vector2(item.body.width / 2.0f, item.body.height / 2.0f).Length();
break;
}
Attack.DamageRange = ConvertUnits.ToDisplayUnits(Attack.DamageRange);
}
Attack.DamageRange = ConvertUnits.ToDisplayUnits(Attack.DamageRange);
originalCollisionCategories = item.body.CollisionCategories;
originalCollisionTargets = item.body.CollidesWith;
}
}
@@ -259,6 +276,10 @@ namespace Barotrauma.Items.Components
launchPos = simPosition;
//set the rotation of the projectile again because dropping the projectile resets the rotation
Item.SetTransform(simPosition, rotation + (Item.body.Dir * LaunchRotationRadians));
if (DeactivationTime > 0)
{
deactivationTimer = DeactivationTime;
}
}
public void Shoot(Character user, Vector2 weaponPos, Vector2 spawnPos, float rotation, List<Body> ignoredBodies, bool createNetworkEvent, float damageMultiplier = 1f)
@@ -585,7 +606,7 @@ namespace Barotrauma.Items.Components
{
if (dropper != null)
{
Deactivate();
DisableProjectileCollisions();
Unstick();
}
base.Drop(dropper);
@@ -593,6 +614,14 @@ namespace Barotrauma.Items.Components
public override void Update(float deltaTime, Camera cam)
{
if (DeactivationTime > 0)
{
deactivationTimer -= deltaTime;
if (deactivationTimer < 0)
{
DisableProjectileCollisions();
}
}
while (impactQueue.Count > 0)
{
var impact = impactQueue.Dequeue();
@@ -614,8 +643,12 @@ namespace Barotrauma.Items.Components
}
//projectiles with a stickjoint don't become inactive until the stickjoint is detached
if (stickJoint == null && !item.body.FarseerBody.IsBullet)
{
IsActive = false;
{
IsActive = false;
if (DeactivationTime > 0 && deactivationTimer > 0)
{
DisableProjectileCollisions();
}
}
if (stickJoint == null) { return; }
@@ -715,7 +748,7 @@ namespace Barotrauma.Items.Components
}
if (hits.Count() >= MaxTargetsToHit || target.Body.UserData is VoronoiCell)
{
Deactivate();
DisableProjectileCollisions();
return true;
}
else
@@ -864,7 +897,7 @@ namespace Barotrauma.Items.Components
if (hits.Count() >= MaxTargetsToHit || hits.LastOrDefault()?.UserData is VoronoiCell)
{
Deactivate();
DisableProjectileCollisions();
}
if (attackResult.AppliedDamageModifiers != null &&
@@ -934,18 +967,26 @@ namespace Barotrauma.Items.Components
return true;
}
private void Deactivate()
private void DisableProjectileCollisions()
{
item.body.FarseerBody.OnCollision -= OnProjectileCollision;
if ((item.Prefab.DamagedByProjectiles || item.Prefab.DamagedByMeleeWeapons) && item.Condition > 0)
if (originalCollisionCategories != Category.None && originalCollisionTargets != Category.None)
{
item.body.CollisionCategories = Physics.CollisionCharacter;
item.body.CollidesWith = Physics.CollisionWall | Physics.CollisionLevel | Physics.CollisionPlatform | Physics.CollisionProjectile;
item.body.CollisionCategories = originalCollisionCategories;
item.body.CollidesWith = originalCollisionTargets;
}
else
{
item.body.CollisionCategories = Physics.CollisionItem;
item.body.CollidesWith = Physics.CollisionWall | Physics.CollisionLevel;
if ((item.Prefab.DamagedByProjectiles || item.Prefab.DamagedByMeleeWeapons) && item.Condition > 0)
{
item.body.CollisionCategories = Physics.CollisionCharacter;
item.body.CollidesWith = Physics.CollisionWall | Physics.CollisionLevel | Physics.CollisionPlatform | Physics.CollisionProjectile;
}
else
{
item.body.CollisionCategories = Physics.CollisionItem;
item.body.CollidesWith = Physics.CollisionWall | Physics.CollisionLevel;
}
}
IgnoredBodies.Clear();
}
@@ -996,7 +1037,14 @@ namespace Barotrauma.Items.Components
}
stickJoint = null;
}
if (!item.body.FarseerBody.IsBullet) { IsActive = false; }
if (!item.body.FarseerBody.IsBullet)
{
IsActive = false;
if (DeactivationTime > 0 && deactivationTimer > 0)
{
DisableProjectileCollisions();
}
}
item.GetComponent<Rope>()?.Snap();
if (stickTargetCharacter != null)
{
@@ -236,6 +236,13 @@ namespace Barotrauma.Items.Components
{
ciElement.Connection = item.Connections?.FirstOrDefault(c => c.Name == ciElement.ConnectionName);
}
#if SERVER
//make sure the clients know about the states of the checkboxes and text fields
if (item.Submarine == null || !item.Submarine.Loading)
{
item.CreateServerEvent(this);
}
#endif
}
partial void UpdateLabelsProjSpecific();
@@ -542,7 +542,7 @@ namespace Barotrauma.Items.Components
public bool HasPowerToShoot()
{
return GetAvailableBatteryPower() >= GetPowerRequiredToShoot();
return GetAvailableInstantaneousBatteryPower() >= GetPowerRequiredToShoot();
}
private bool TryLaunch(float deltaTime, Character character = null, bool ignorePower = false)
@@ -365,7 +365,16 @@ namespace Barotrauma.Items.Components
{
foreach (var allowedSlot in allowedSlots)
{
if (allowedSlot != InvSlotType.Any && !character.Inventory.IsInLimbSlot(item, allowedSlot)) { return; }
if (allowedSlot == InvSlotType.Any) { continue; }
foreach (Enum value in Enum.GetValues(typeof(InvSlotType)))
{
var slotType = (InvSlotType)value;
if (slotType == InvSlotType.Any || slotType == InvSlotType.None) { continue; }
if (allowedSlot.HasFlag(slotType) && !character.Inventory.IsInLimbSlot(item, slotType))
{
return;
}
}
}
picker = character;